# 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.