# v0.1.1 Cross-version compatibility, hijack mode, and a batch of playback fidelity fixes. --- ## Added ### Hijack Mode A real player can enter a playing scene and interact with it — fighting mobs, getting hit by NPCs, and creating a new recording layered on top. Enables solo players to create multi-player combat scenes without needing another person. - `/recap scene hijack <scene>` — starts hijack mode at the player's location, begins recording - `/recap scene hijack stop` — ends the session, saves the hijacker's recording, auto-adds it to the scene - **NPCs stay dumb** — they follow their recorded timeline and never react to the hijacker - **Mobs become real** — tracked entities spawn as real server-side entities (`setAI(false)`, teleported per-tick from recording data) so the hijacker can fight them - **NPC attacks become real** — ray-AABB intersection from the NPC's eye position along their look direction (yaw + pitch) checks if the hijacker's bounding box is hit within 3 blocks (vanilla melee reach) - **Hijacker can attack NPCs** — intercepted via PacketEvents (`INTERACT_ENTITY` packet on the fake entity ID). NPC health tracked per-actor, hurt animation + knockback on hit, death animation at 0 HP - **Shield blocking** — if the hijacker is blocking with a shield, NPC attacks play `ITEM_SHIELD_BLOCK` sound with reduced knockback instead of damage. Axes disable the shield for 5 seconds (vanilla behavior) - **Directional knockback** — both sides: hijacker gets pushed away from NPC on hit, NPC gets velocity packet pushing away from hijacker on attack - **Damage cooldown** — 10-tick invulnerability between NPC swing checks (vanilla timing) ### Mob Variant Support Entity-specific visual variants are now captured on spawn and replayed via entity metadata: - **Sheep** — wool color (all 16 dye colors) + sheared state - **Slime / Magma Cube** — size - **Creeper** — charged (powered) state - **Cat** — type variant - **Frog** — variant (temperate, warm, cold) - **Rabbit** — type variant - **Parrot** — variant (5 colors) - **Fox** — type (red, snow) - **Axolotl** — variant (5 colors) - **Horse** — color + style (markings) - **Llama** — color variant - **Mooshroom** — variant (red, brown) - **Wolf** — collar color (tamed wolves) ### Baby Mob Support Baby variants of all `Ageable` mobs and `Zombie` types are now detected during recording and replayed with the correct `isBaby` entity metadata. ### Mob Fire State Mobs on fire now render with flames during playback. `FLAG_ON_FIRE` tracked per-tick in `MobState.flags` and sent as entity metadata on change. --- ## Fixed ### Cross-Version Compatibility (1.21–1.21.11) - **Fix Player skin layers metadata index** — was hardcoded as 17 (absorption, Float), corrected to 16 (displayed skin parts, Byte). This was the root cause of `IllegalStateException: Invalid entity data item type` crashes on 1.21.9+ clients. All entity metadata indices are now correct across every 1.21.x version. ### Playback Fidelity - **Door open/close** — opening a door now syncs both halves. The other half's `open` state is set via `Door.getHalf()` detection. - **Bell ringing** — bells are now captured during recording and replayed using `Bell.ring()` via the tile state API (not block data, which doesn't change for bells). - **Chest open/close animation** — `BLOCK_ACTION` packets now sent on container open (lid up) and close (lid down) with correct sounds for chests, ender chests, shulker boxes, and barrels. - **Iron golem damage state** — health metadata (index 9, Float) now sent on mob damage ticks so clients render the cracked texture at the correct health thresholds. - **Mob hurt/death sounds** — sound lookup changed from `Sound.valueOf()` (broken in Paper 1.21.4+ registry system) to `Registry.SOUNDS.get(NamespacedKey)`. All mob hurt and death sounds now play correctly. - **Damage sound spam** — NPC and mob damage effects now respect a 10-tick invulnerability cooldown (vanilla `noDamageTicks`). Health metadata still updates every tick for visual states; hurt animation, sound, and particles only fire once per cooldown window. - **World reset for multi-block structures** — `resetWorldState()` now clears the other half of doors (vertical) and beds (horizontal, facing-aware) before restoring original blocks. ### Scene Management - **Scene remove suggestions** — `/recap scene remove <scene> <recording>` now suggests only recordings within that scene (via `previousArgs()` lookup), not all saved recordings. --- ## Changed - **Grunt obfuscation pipeline** — obfuscate before shading (slim jar → Grunt → shadow shade deps). Reduces obfuscation time from minutes to ~2 seconds. Lowercase-only custom dictionary prevents case collisions on macOS. - **Paperweight userdev** — project now uses `io.papermc.paperweight.userdev` for mojang-mapped development. - **Bookshelf-API** — changed from `compileOnly` to `implementation` (shaded + relocated) for always-available license verification.