# Recap - v0.1.2 ## Streaming Playback, Speed Control, Seeking, Possible 1000+ Player Support ### API UPDATES - **`setPlaybackSpeed(String, double)`** — Set playback speed for a running session. Speed 1.0 is normal, 0.5 is half speed, 2.0 is double. No upper limit. - **`seekPlayback(String, int)`** — Seek a running playback to a specific tick. Seeking backward re-opens the file and reads forward from the start. ### PLUGIN UPDATES - Minimum supported version is now `1.21.4`. - Added support for Minecraft versions: `26.1` & `26.1.1`. - **Streaming playback** — Frames are now read one at a time from disk via GZIP streaming instead of loading all frames into memory. - Memory per actor: ~8KB GZIP buffer + 1 ActionFrame, regardless of recording length. 1000+ player scenes are probably viable. \**i hope*\* - `StreamingFrameReader` reads directly from the `.recap` file's GZIP stream with incremental delta decoding. - Block state capture works on-the-fly during streaming — original materials extracted from frame data as blocks are modified. - Break animations use reactive tracking — mining stages computed dynamically from `blockDamageStart` events instead of pre-scanning all frames. - Loop mode closes and re-opens the file from disk. - **Playback speed control** — `/recap playback speed <sessionId> <speed>`. Uses a tick accumulator: at 2x, two frames consumed per tick; at 0.5x, one frame every two ticks. - **Seeking** — `/recap playback seek <sessionId> <seconds>`. Jump to any point in a recording. World state is reset on seek. - **Async scene initialization** — `/recap scene play` now initializes all actors on an async thread. Opening GZIP streams no longer freezes the main server thread. The command returns the session ID immediately; playback starts once initialization completes. ### PLUGIN FIXES - **Entity spawn data hardening** — Replaced the allowlist approach (`OWNER_DATA_ENTITIES`) with an inverted safelist (`SAFE_DATA_ZERO_ENTITIES`). All entity types now default to the NPC entity ID as spawn data. Only entity types explicitly known to be safe with `data=0` (living entities, items, boats, minecarts, displays) use zero. Unknown or new entity types added in future versions are safe by default. - **ViaVersion load order** — Added ViaVersion as a soft dependency in `paper-plugin.yml`. Fixes `NullPointerException` in PacketEvents' ViaVersion accessor when the shaded copy couldn't find ViaVersion's hook. ### INTERNAL UPDATES - Bumped **Recap-Paper** to `0.1.2`.