Перейти к содержимому
Mineforgian

BetterReplay

Packet Based Player Recorder. BetterReplay is a server-side replay plugin for Paper and Folia-style scheduling. It records player and nearby entity activity on the server, saves the timeline, and replays it for viewers in-game.

Загрузки
812
Подписчики
9
Обновлён
24 июня 2026 г.
Лицензия
GPL-3.0-or-later

Опубликован 20 апреля 2026 г.

BetterReplay

BetterReplay is a server-side replay plugin for Paper and Folia-style scheduling. It records player and nearby entity activity on the server, saves the timeline, and replays it for viewers in-game.

What this project is

  • Server plugin written in Java
  • Targets modern Paper APIs
  • Uses PacketEvents and FoliaLib for packet handling and scheduling
  • Supports two storage backends:
    • local JSON files
    • MySQL

How this differs from client-side replay mods

BetterReplay is not a client recording mod.

Server-side approach (this project):

  • Runs entirely on the server
  • No replay mod required on player clients
  • Captures server-observed gameplay state and events
  • Plays back by spawning and updating replay entities for a viewer
  • Good for moderation, event review, and server-side tooling

Typical client-side replay mod approach:

  • Records from a specific client perspective
  • Usually requires modded client setup
  • Often includes advanced free-camera/cinematic editing features
  • Playback is usually local to the client recording

In short: BetterReplay focuses on server-managed replay workflows and API-driven integration.

Features

  • Start and stop recordings
  • Save recordings to file or MySQL
  • List and delete stored replays
  • Replay sessions for viewers
  • API-first integration support for other plugins
  • Optional Floodgate soft dependency support

Base command:

  • /replay

Subcommands:

  • start
  • stop
  • play
  • list
  • delete

Permissions:

  • replay.start
  • replay.stop
  • replay.play
  • replay.list
  • replay.delete
  • replay.*

Storage-Type options

Valid values for General.Storage-Type are:

  • file
    • Stores replay data as JSON files under the plugin data folder.
  • mysql
    • Stores replay data in a MySQL table (replays) using the configured General.MySQL.* values.

These values should be lowercase as shown above.

File storage example

General:
  Check-Update: true
  Storage-Type: file

MySQL storage example

General:
  Check-Update: true
  Storage-Type: mysql
  MySQL:
    host: 127.0.0.1
    port: 3306
    database: betterreplay
    user: replay_user
    password: change-me

Additional key used by command pagination:

list-page-size: 10

Notes:

  • If Storage-Type is invalid, plugin falls back to file storage.
  • MySQL replay names are stored in a VARCHAR(64) primary key column.

API

BetterReplay provides a public API for other plugins to start/stop recordings, manage replays, and listen for lifecycle events.

Quick example:

ReplayManager manager = ReplayAPI.get();
manager.startRecording("demo-session", List.of(player), 120);
manager.stopRecording("demo-session", true);
manager.startReplay("demo-session", viewerPlayer);

Ченджлог

1.5.0-alpha.15Альфа1.21.11, 26.1.1, 26.1.2 · 24 июня 2026 г.

[Unreleased]

Added

  • 2026-04-17: Frame-by-frame step controls during paused replay; step backward or forward one tick group at a time via and inventory buttons
  • 2026-04-19: Variable playback speed controls during active replay, current speed action-bar feedback, and config keys Playback.Speed-Step plus Playback.Max-Speed
  • 2026-04-27: Finalized binary .br replay storage for file and MySQL backends, including crash-safe append-log recording, lazy indexed loading, preserved recording start timestamps, startup recovery of orphaned temp logs, and temporary legacy JSON compatibility during migration
  • 2026-04-27: Hidden admin utilities: /replay export, /replay debug dump, /replay debug info, and /replay benchmark, with output written under the plugin data folder
  • 2026-04-29: Replay protection commands and metadata, protected replay highlighting in /replay list, config-driven retention cleanup with human-readable duration parsing, and deletion safeguards for protected replays
  • 2026-05-14: Optional chunk baseline capture and chunk-aware playback for binary replays, including block-entity support, replay chunk caching, Playback.Chunk-View-Radius, Playback.Chunk-Send-Limit-Per-Tick, Playback.Chunk-Clear-Limit-Per-Tick, Playback.Chunk-Timing-Diagnostics, and Playback.Chunk-Mode
  • 2026-05-30: Inventory recording split into dedicated equipment-state and storage-snapshot events backed by raw item bytes, plus regression coverage for the new binary payloads and legacy JSON upgrade path
  • 2026-05-31: Replay viewer safety controls: Playback.Viewer-Safety-Mode, Playback.Restore-Viewer-Location-On-Stop, Playback.Restore-Viewer-GameMode-On-Stop, Playback.Restore-Viewer-Flight-On-Stop, and Playback.Restore-Viewer-State-On-Rejoin
  • 2026-06-02: /replay reload command to re-read config.yml, restart retention scheduling, and report which changed settings apply immediately, only to new sessions, on future checks, or after restart
  • 2026-06-02: New config key Playback.Vanish-Viewer (default true) to hide replay viewers from live players during playback
  • 2026-06-04: Expanded bStats telemetry with SimplePie charts for storage type, recording chunk capture, playback viewer safety and chunk playback settings, vanish-viewer, and retention state plus retention age normalization to days when cleanup is disabled
  • 2026-06-12: Velocity replay handoff support via /replay play <name> server:<backend>, including remote replay launch and return-to-origin flow after playback stops
  • 2026-06-14: Config key Velocity.Default-Replay-Server to route /replay play <name> to a default Velocity replay backend when no server:<backend> argument is supplied

Changed

  • 2026-04-11: RecordingStopEvent now fires synchronously to fix async AntiCheatReplay compatibility
  • 2026-04-19: Update checks now treat -SNAPSHOT builds as their corresponding release version
  • 2026-04-20: Config settings ownership moved out of Replay into a dedicated typed, comment-preserving config manager with versioned migrations
  • 2026-04-22: Replay sessions now always start at 1.0x speed, and Playback.Max-Speed is enforced to a minimum of 1.0
  • 2026-04-27: Binary replay archives now use format version 2; new .br inventory payloads store split equipment and storage slot bytes directly, while legacy JSON replay loading remains supported and older alpha .br inventory archives are intentionally unsupported
  • 2026-04-29: ReplayManager now exposes listSavedReplaySummaries, protectSavedReplay, unprotectSavedReplay, and returns ReplayDeleteResult from deleteSavedReplay
  • 2026-04-30: Config keys for list settings were renamed from list-page-size and list-protected-highlight-color to List.Page-Size and List.Protected-Highlight-Color, with automatic startup migration
  • 2026-04-30: Modrinth publishing metadata now includes Purpur, Spigot, and Bukkit loaders
  • 2026-05-14: Modrinth uploads now publish the matching release changelog on main and the [Unreleased] section for dev alpha builds
  • 2026-06-04: README content was reorganized into overview sections with dedicated Architecture, Configuration, and Commands documents under docs/
  • 2026-06-23: New binary .br archives now compress timeline payloads and chunk payloads with Zstd level 1, declare payloadCompression: "zstd", bump the binary replay compatibility floor to 1.5.0-alpha.12, and keep LZ4 replay/chunk archives readable through metadata or frame-magic compatibility fallback

Removed

  • 2026-04-28: General.Enable-Benchmark-Command; /replay benchmark is now always permission-gated through replay.benchmark

Fixed

  • 2026-04-13: Replay controls no longer get stuck after replay ends (#27)
  • 2026-04-15: Held-item swaps and hotbar slot changes are now captured immediately for more accurate replay inventory playback
  • 2026-04-16: Nested replay inventory loss when starting a replay during an active replay (#31)
  • 2026-04-17: Backward step controls now move exactly one tick group per click instead of skipping two
  • 2026-04-19: activeSessions in RecorderManager changed to ConcurrentHashMap to prevent ConcurrentModificationException (#33)
  • 2026-04-22: Config migration now preserves wrapped pseudo-comments, keeps the managed header stable, and avoids accumulating blank lines between root sections
  • 2026-04-27: Replay export now writes under the plugin data folder
  • 2026-04-30: PacketEvents block-break recording is now rescheduled onto the server thread to avoid Netty-thread contention and unsafe shared-state mutation (#43)
  • 2026-05-14: Chunk playback restore flow now handles unload timing and viewer return cases more reliably, and replay chunk load probing no longer bottlenecks missing-chunk checks under higher send rates
  • 2026-05-30: Equipment polling and dirty inventory polling now reuse shared short-lived caches across concurrent recordings to reduce repeated ItemStack serialization work without losing fallback accuracy
  • 2026-05-31: Replay playback now returns viewers to their original location and gameplay state by default, including disconnect and rejoin recovery
  • 2026-06-02: Replay viewers can no longer pick up live world items during playback, preventing replay inventory lockups from stray pickups
  • 2026-06-03: Replay viewer startup teleports now use asynchronous teleports for safer Paper and Folia compatibility
  • 2026-06-04: Dev alpha publishing now derives the next -alpha.N version from existing Modrinth releases for the current base version instead of GITHUB_RUN_NUMBER, so prereleases track the next unreleased line (now 1.5.0-alpha.N) and workflow renames cannot reset alpha numbering
  • 2026-06-06: Recorded-player menu teleports now use FoliaLib asynchronous teleports instead of direct player teleports
  • 2026-06-08: Fixed all compiler warnings. Maven build and test runs no longer emit unused annotation-processing or Mockito self-attach agent warnings
  • 2026-06-12: Legacy JSON replays whose inventory snapshots upgrade into split equipment/storage events now recreate recorded players correctly after replay seek/skip state reconstruction
  • 2026-06-12: Legacy JSON replay loading now accepts null inventory content slots from older inventory_update snapshots
  • 2026-06-12: Saved replay listings and replay-name tab completion now share a 5-second cache that refreshes from storage when stale, and MySQL replay overwrites now update created_at so recent listings reflect replaced recordings
  • 2026-06-14: Velocity replay handoff failures now send a clear chat error when the transfer request cannot be sent, the proxy reports a failure, or the proxy does not respond
  • 2026-06-14: Replay stop cleanup now schedules live block and chunk restore reads on their owning Folia region to avoid asynchronous world access failures
  • 2026-06-16: Recording chunk baseline capture now schedules live chunk reads on the owning Folia region to avoid async chunk retrieval failures when chunk recording is enabled
  • 2026-06-16: Chunk recording and chunk replay now move tracked-player chunk discovery, replay chunk refresh, legacy live block comparisons, and viewer packet sends onto the proper Folia entity or region scheduler
  • 2026-06-16: Recording session entity/player tracking and dirty inventory cache state now use concurrent collections to avoid Folia tick ConcurrentModificationException crashes during live recordings
  • 2026-06-16: Replay compatibility checks now treat a stable release like 1.5.0 as newer than same-base dev builds such as 1.5.0-alpha.9, and replay debug info now surfaces incompatible replay metadata or the real storage failure instead of a misleading generic not-found message
  • 2026-06-17: Velocity replay handoff now dispatches proxy plugin messages back onto the appropriate scheduler before sending them, avoiding thread-context failures when launching or resuming replay viewing across servers
  • 2026-06-17: Replay and recording names are now validated to 1-64 non-control characters without path-reserved symbols, and player-facing replay errors now use component chat sends to avoid main-thread CraftChatMessage freezes when invalid or missing replay names are echoed (#76)
  • 2026-06-23: Binary replay manifests now keep recordedWithVersion as the exact writer build while stamping minimumViewerVersion from the maintained replay compatibility floor instead of the current plugin version, preventing alpha-created recordings from requiring an unrelated stable release
  • 2026-06-23: Replay chunk snapshots now wait until the viewer has received the matching real server chunk plus one refresh before sending, preventing distant replay teleports from being overwritten by late live-world chunk packets
  • 2026-06-23: Recovered recordings now infer chunk payload format from temp region contents so packet-friendly chunk baselines are not saved with legacy chunk metadata
  • 2026-06-23: Active recordings now preserve append logs and chunk temp files during plugin shutdown so startup recovery can finalize them instead of discarding the in-progress replay
1.5.0-alpha.15Альфа1.21.11, 26.1.1, 26.1.2 · 24 июня 2026 г.

[Unreleased]

Added

  • 2026-04-17: Frame-by-frame step controls during paused replay; step backward or forward one tick group at a time via and inventory buttons
  • 2026-04-19: Variable playback speed controls during active replay, current speed action-bar feedback, and config keys Playback.Speed-Step plus Playback.Max-Speed
  • 2026-04-27: Finalized binary .br replay storage for file and MySQL backends, including crash-safe append-log recording, lazy indexed loading, preserved recording start timestamps, startup recovery of orphaned temp logs, and temporary legacy JSON compatibility during migration
  • 2026-04-27: Hidden admin utilities: /replay export, /replay debug dump, /replay debug info, and /replay benchmark, with output written under the plugin data folder
  • 2026-04-29: Replay protection commands and metadata, protected replay highlighting in /replay list, config-driven retention cleanup with human-readable duration parsing, and deletion safeguards for protected replays
  • 2026-05-14: Optional chunk baseline capture and chunk-aware playback for binary replays, including block-entity support, replay chunk caching, Playback.Chunk-View-Radius, Playback.Chunk-Send-Limit-Per-Tick, Playback.Chunk-Clear-Limit-Per-Tick, Playback.Chunk-Timing-Diagnostics, and Playback.Chunk-Mode
  • 2026-05-30: Inventory recording split into dedicated equipment-state and storage-snapshot events backed by raw item bytes, plus regression coverage for the new binary payloads and legacy JSON upgrade path
  • 2026-05-31: Replay viewer safety controls: Playback.Viewer-Safety-Mode, Playback.Restore-Viewer-Location-On-Stop, Playback.Restore-Viewer-GameMode-On-Stop, Playback.Restore-Viewer-Flight-On-Stop, and Playback.Restore-Viewer-State-On-Rejoin
  • 2026-06-02: /replay reload command to re-read config.yml, restart retention scheduling, and report which changed settings apply immediately, only to new sessions, on future checks, or after restart
  • 2026-06-02: New config key Playback.Vanish-Viewer (default true) to hide replay viewers from live players during playback
  • 2026-06-04: Expanded bStats telemetry with SimplePie charts for storage type, recording chunk capture, playback viewer safety and chunk playback settings, vanish-viewer, and retention state plus retention age normalization to days when cleanup is disabled
  • 2026-06-12: Velocity replay handoff support via /replay play <name> server:<backend>, including remote replay launch and return-to-origin flow after playback stops
  • 2026-06-14: Config key Velocity.Default-Replay-Server to route /replay play <name> to a default Velocity replay backend when no server:<backend> argument is supplied

Changed

  • 2026-04-11: RecordingStopEvent now fires synchronously to fix async AntiCheatReplay compatibility
  • 2026-04-19: Update checks now treat -SNAPSHOT builds as their corresponding release version
  • 2026-04-20: Config settings ownership moved out of Replay into a dedicated typed, comment-preserving config manager with versioned migrations
  • 2026-04-22: Replay sessions now always start at 1.0x speed, and Playback.Max-Speed is enforced to a minimum of 1.0
  • 2026-04-27: Binary replay archives now use format version 2; new .br inventory payloads store split equipment and storage slot bytes directly, while legacy JSON replay loading remains supported and older alpha .br inventory archives are intentionally unsupported
  • 2026-04-29: ReplayManager now exposes listSavedReplaySummaries, protectSavedReplay, unprotectSavedReplay, and returns ReplayDeleteResult from deleteSavedReplay
  • 2026-04-30: Config keys for list settings were renamed from list-page-size and list-protected-highlight-color to List.Page-Size and List.Protected-Highlight-Color, with automatic startup migration
  • 2026-04-30: Modrinth publishing metadata now includes Purpur, Spigot, and Bukkit loaders
  • 2026-05-14: Modrinth uploads now publish the matching release changelog on main and the [Unreleased] section for dev alpha builds
  • 2026-06-04: README content was reorganized into overview sections with dedicated Architecture, Configuration, and Commands documents under docs/
  • 2026-06-23: New binary .br archives now compress timeline payloads and chunk payloads with Zstd level 1, declare payloadCompression: "zstd", bump the binary replay compatibility floor to 1.5.0-alpha.12, and keep LZ4 replay/chunk archives readable through metadata or frame-magic compatibility fallback

Removed

  • 2026-04-28: General.Enable-Benchmark-Command; /replay benchmark is now always permission-gated through replay.benchmark

Fixed

  • 2026-04-13: Replay controls no longer get stuck after replay ends (#27)
  • 2026-04-15: Held-item swaps and hotbar slot changes are now captured immediately for more accurate replay inventory playback
  • 2026-04-16: Nested replay inventory loss when starting a replay during an active replay (#31)
  • 2026-04-17: Backward step controls now move exactly one tick group per click instead of skipping two
  • 2026-04-19: activeSessions in RecorderManager changed to ConcurrentHashMap to prevent ConcurrentModificationException (#33)
  • 2026-04-22: Config migration now preserves wrapped pseudo-comments, keeps the managed header stable, and avoids accumulating blank lines between root sections
  • 2026-04-27: Replay export now writes under the plugin data folder
  • 2026-04-30: PacketEvents block-break recording is now rescheduled onto the server thread to avoid Netty-thread contention and unsafe shared-state mutation (#43)
  • 2026-05-14: Chunk playback restore flow now handles unload timing and viewer return cases more reliably, and replay chunk load probing no longer bottlenecks missing-chunk checks under higher send rates
  • 2026-05-30: Equipment polling and dirty inventory polling now reuse shared short-lived caches across concurrent recordings to reduce repeated ItemStack serialization work without losing fallback accuracy
  • 2026-05-31: Replay playback now returns viewers to their original location and gameplay state by default, including disconnect and rejoin recovery
  • 2026-06-02: Replay viewers can no longer pick up live world items during playback, preventing replay inventory lockups from stray pickups
  • 2026-06-03: Replay viewer startup teleports now use asynchronous teleports for safer Paper and Folia compatibility
  • 2026-06-04: Dev alpha publishing now derives the next -alpha.N version from existing Modrinth releases for the current base version instead of GITHUB_RUN_NUMBER, so prereleases track the next unreleased line (now 1.5.0-alpha.N) and workflow renames cannot reset alpha numbering
  • 2026-06-06: Recorded-player menu teleports now use FoliaLib asynchronous teleports instead of direct player teleports
  • 2026-06-08: Fixed all compiler warnings. Maven build and test runs no longer emit unused annotation-processing or Mockito self-attach agent warnings
  • 2026-06-12: Legacy JSON replays whose inventory snapshots upgrade into split equipment/storage events now recreate recorded players correctly after replay seek/skip state reconstruction
  • 2026-06-12: Legacy JSON replay loading now accepts null inventory content slots from older inventory_update snapshots
  • 2026-06-12: Saved replay listings and replay-name tab completion now share a 5-second cache that refreshes from storage when stale, and MySQL replay overwrites now update created_at so recent listings reflect replaced recordings
  • 2026-06-14: Velocity replay handoff failures now send a clear chat error when the transfer request cannot be sent, the proxy reports a failure, or the proxy does not respond
  • 2026-06-14: Replay stop cleanup now schedules live block and chunk restore reads on their owning Folia region to avoid asynchronous world access failures
  • 2026-06-16: Recording chunk baseline capture now schedules live chunk reads on the owning Folia region to avoid async chunk retrieval failures when chunk recording is enabled
  • 2026-06-16: Chunk recording and chunk replay now move tracked-player chunk discovery, replay chunk refresh, legacy live block comparisons, and viewer packet sends onto the proper Folia entity or region scheduler
  • 2026-06-16: Recording session entity/player tracking and dirty inventory cache state now use concurrent collections to avoid Folia tick ConcurrentModificationException crashes during live recordings
  • 2026-06-16: Replay compatibility checks now treat a stable release like 1.5.0 as newer than same-base dev builds such as 1.5.0-alpha.9, and replay debug info now surfaces incompatible replay metadata or the real storage failure instead of a misleading generic not-found message
  • 2026-06-17: Velocity replay handoff now dispatches proxy plugin messages back onto the appropriate scheduler before sending them, avoiding thread-context failures when launching or resuming replay viewing across servers
  • 2026-06-17: Replay and recording names are now validated to 1-64 non-control characters without path-reserved symbols, and player-facing replay errors now use component chat sends to avoid main-thread CraftChatMessage freezes when invalid or missing replay names are echoed (#76)
  • 2026-06-23: Binary replay manifests now keep recordedWithVersion as the exact writer build while stamping minimumViewerVersion from the maintained replay compatibility floor instead of the current plugin version, preventing alpha-created recordings from requiring an unrelated stable release
  • 2026-06-23: Replay chunk snapshots now wait until the viewer has received the matching real server chunk plus one refresh before sending, preventing distant replay teleports from being overwritten by late live-world chunk packets
  • 2026-06-23: Recovered recordings now infer chunk payload format from temp region contents so packet-friendly chunk baselines are not saved with legacy chunk metadata
  • 2026-06-23: Active recordings now preserve append logs and chunk temp files during plugin shutdown so startup recovery can finalize them instead of discarding the in-progress replay
1.5.0-alpha.14Альфа1.21.11, 26.1.1, 26.1.2 · 24 июня 2026 г.

[Unreleased]

Added

  • 2026-04-17: Frame-by-frame step controls during paused replay; step backward or forward one tick group at a time via and inventory buttons
  • 2026-04-19: Variable playback speed controls during active replay, current speed action-bar feedback, and config keys Playback.Speed-Step plus Playback.Max-Speed
  • 2026-04-27: Finalized binary .br replay storage for file and MySQL backends, including crash-safe append-log recording, lazy indexed loading, preserved recording start timestamps, startup recovery of orphaned temp logs, and temporary legacy JSON compatibility during migration
  • 2026-04-27: Hidden admin utilities: /replay export, /replay debug dump, /replay debug info, and /replay benchmark, with output written under the plugin data folder
  • 2026-04-29: Replay protection commands and metadata, protected replay highlighting in /replay list, config-driven retention cleanup with human-readable duration parsing, and deletion safeguards for protected replays
  • 2026-05-14: Optional chunk baseline capture and chunk-aware playback for binary replays, including block-entity support, replay chunk caching, Playback.Chunk-View-Radius, Playback.Chunk-Send-Limit-Per-Tick, Playback.Chunk-Clear-Limit-Per-Tick, Playback.Chunk-Timing-Diagnostics, and Playback.Chunk-Mode
  • 2026-05-30: Inventory recording split into dedicated equipment-state and storage-snapshot events backed by raw item bytes, plus regression coverage for the new binary payloads and legacy JSON upgrade path
  • 2026-05-31: Replay viewer safety controls: Playback.Viewer-Safety-Mode, Playback.Restore-Viewer-Location-On-Stop, Playback.Restore-Viewer-GameMode-On-Stop, Playback.Restore-Viewer-Flight-On-Stop, and Playback.Restore-Viewer-State-On-Rejoin
  • 2026-06-02: /replay reload command to re-read config.yml, restart retention scheduling, and report which changed settings apply immediately, only to new sessions, on future checks, or after restart
  • 2026-06-02: New config key Playback.Vanish-Viewer (default true) to hide replay viewers from live players during playback
  • 2026-06-04: Expanded bStats telemetry with SimplePie charts for storage type, recording chunk capture, playback viewer safety and chunk playback settings, vanish-viewer, and retention state plus retention age normalization to days when cleanup is disabled
  • 2026-06-12: Velocity replay handoff support via /replay play <name> server:<backend>, including remote replay launch and return-to-origin flow after playback stops
  • 2026-06-14: Config key Velocity.Default-Replay-Server to route /replay play <name> to a default Velocity replay backend when no server:<backend> argument is supplied

Changed

  • 2026-04-11: RecordingStopEvent now fires synchronously to fix async AntiCheatReplay compatibility
  • 2026-04-19: Update checks now treat -SNAPSHOT builds as their corresponding release version
  • 2026-04-20: Config settings ownership moved out of Replay into a dedicated typed, comment-preserving config manager with versioned migrations
  • 2026-04-22: Replay sessions now always start at 1.0x speed, and Playback.Max-Speed is enforced to a minimum of 1.0
  • 2026-04-27: Binary replay archives now use format version 2; new .br inventory payloads store split equipment and storage slot bytes directly, while legacy JSON replay loading remains supported and older alpha .br inventory archives are intentionally unsupported
  • 2026-04-29: ReplayManager now exposes listSavedReplaySummaries, protectSavedReplay, unprotectSavedReplay, and returns ReplayDeleteResult from deleteSavedReplay
  • 2026-04-30: Config keys for list settings were renamed from list-page-size and list-protected-highlight-color to List.Page-Size and List.Protected-Highlight-Color, with automatic startup migration
  • 2026-04-30: Modrinth publishing metadata now includes Purpur, Spigot, and Bukkit loaders
  • 2026-05-14: Modrinth uploads now publish the matching release changelog on main and the [Unreleased] section for dev alpha builds
  • 2026-06-04: README content was reorganized into overview sections with dedicated Architecture, Configuration, and Commands documents under docs/
  • 2026-06-23: New binary .br archives now compress timeline payloads and chunk payloads with Zstd level 1, declare payloadCompression: "zstd", bump the binary replay compatibility floor to 1.5.0-alpha.12, and keep LZ4 replay/chunk archives readable through metadata or frame-magic compatibility fallback

Removed

  • 2026-04-28: General.Enable-Benchmark-Command; /replay benchmark is now always permission-gated through replay.benchmark

Fixed

  • 2026-04-13: Replay controls no longer get stuck after replay ends (#27)
  • 2026-04-15: Held-item swaps and hotbar slot changes are now captured immediately for more accurate replay inventory playback
  • 2026-04-16: Nested replay inventory loss when starting a replay during an active replay (#31)
  • 2026-04-17: Backward step controls now move exactly one tick group per click instead of skipping two
  • 2026-04-19: activeSessions in RecorderManager changed to ConcurrentHashMap to prevent ConcurrentModificationException (#33)
  • 2026-04-22: Config migration now preserves wrapped pseudo-comments, keeps the managed header stable, and avoids accumulating blank lines between root sections
  • 2026-04-27: Replay export now writes under the plugin data folder
  • 2026-04-30: PacketEvents block-break recording is now rescheduled onto the server thread to avoid Netty-thread contention and unsafe shared-state mutation (#43)
  • 2026-05-14: Chunk playback restore flow now handles unload timing and viewer return cases more reliably, and replay chunk load probing no longer bottlenecks missing-chunk checks under higher send rates
  • 2026-05-30: Equipment polling and dirty inventory polling now reuse shared short-lived caches across concurrent recordings to reduce repeated ItemStack serialization work without losing fallback accuracy
  • 2026-05-31: Replay playback now returns viewers to their original location and gameplay state by default, including disconnect and rejoin recovery
  • 2026-06-02: Replay viewers can no longer pick up live world items during playback, preventing replay inventory lockups from stray pickups
  • 2026-06-03: Replay viewer startup teleports now use asynchronous teleports for safer Paper and Folia compatibility
  • 2026-06-04: Dev alpha publishing now derives the next -alpha.N version from existing Modrinth releases for the current base version instead of GITHUB_RUN_NUMBER, so prereleases track the next unreleased line (now 1.5.0-alpha.N) and workflow renames cannot reset alpha numbering
  • 2026-06-06: Recorded-player menu teleports now use FoliaLib asynchronous teleports instead of direct player teleports
  • 2026-06-08: Fixed all compiler warnings. Maven build and test runs no longer emit unused annotation-processing or Mockito self-attach agent warnings
  • 2026-06-12: Legacy JSON replays whose inventory snapshots upgrade into split equipment/storage events now recreate recorded players correctly after replay seek/skip state reconstruction
  • 2026-06-12: Legacy JSON replay loading now accepts null inventory content slots from older inventory_update snapshots
  • 2026-06-12: Saved replay listings and replay-name tab completion now share a 5-second cache that refreshes from storage when stale, and MySQL replay overwrites now update created_at so recent listings reflect replaced recordings
  • 2026-06-14: Velocity replay handoff failures now send a clear chat error when the transfer request cannot be sent, the proxy reports a failure, or the proxy does not respond
  • 2026-06-14: Replay stop cleanup now schedules live block and chunk restore reads on their owning Folia region to avoid asynchronous world access failures
  • 2026-06-16: Recording chunk baseline capture now schedules live chunk reads on the owning Folia region to avoid async chunk retrieval failures when chunk recording is enabled
  • 2026-06-16: Chunk recording and chunk replay now move tracked-player chunk discovery, replay chunk refresh, legacy live block comparisons, and viewer packet sends onto the proper Folia entity or region scheduler
  • 2026-06-16: Recording session entity/player tracking and dirty inventory cache state now use concurrent collections to avoid Folia tick ConcurrentModificationException crashes during live recordings
  • 2026-06-16: Replay compatibility checks now treat a stable release like 1.5.0 as newer than same-base dev builds such as 1.5.0-alpha.9, and replay debug info now surfaces incompatible replay metadata or the real storage failure instead of a misleading generic not-found message
  • 2026-06-17: Velocity replay handoff now dispatches proxy plugin messages back onto the appropriate scheduler before sending them, avoiding thread-context failures when launching or resuming replay viewing across servers
  • 2026-06-17: Replay and recording names are now validated to 1-64 non-control characters without path-reserved symbols, and player-facing replay errors now use component chat sends to avoid main-thread CraftChatMessage freezes when invalid or missing replay names are echoed (#76)
  • 2026-06-23: Binary replay manifests now keep recordedWithVersion as the exact writer build while stamping minimumViewerVersion from the maintained replay compatibility floor instead of the current plugin version, preventing alpha-created recordings from requiring an unrelated stable release
  • 2026-06-23: Replay chunk snapshots now wait until the viewer has received the matching real server chunk plus one refresh before sending, preventing distant replay teleports from being overwritten by late live-world chunk packets
  • 2026-06-23: Recovered recordings now infer chunk payload format from temp region contents so packet-friendly chunk baselines are not saved with legacy chunk metadata
1.5.0-alpha.13Альфа1.21.11, 26.1.1, 26.1.2 · 24 июня 2026 г.

[Unreleased]

Added

  • 2026-04-17: Frame-by-frame step controls during paused replay; step backward or forward one tick group at a time via and inventory buttons
  • 2026-04-19: Variable playback speed controls during active replay, current speed action-bar feedback, and config keys Playback.Speed-Step plus Playback.Max-Speed
  • 2026-04-27: Finalized binary .br replay storage for file and MySQL backends, including crash-safe append-log recording, lazy indexed loading, preserved recording start timestamps, startup recovery of orphaned temp logs, and temporary legacy JSON compatibility during migration
  • 2026-04-27: Hidden admin utilities: /replay export, /replay debug dump, /replay debug info, and /replay benchmark, with output written under the plugin data folder
  • 2026-04-29: Replay protection commands and metadata, protected replay highlighting in /replay list, config-driven retention cleanup with human-readable duration parsing, and deletion safeguards for protected replays
  • 2026-05-14: Optional chunk baseline capture and chunk-aware playback for binary replays, including block-entity support, replay chunk caching, Playback.Chunk-View-Radius, Playback.Chunk-Send-Limit-Per-Tick, Playback.Chunk-Clear-Limit-Per-Tick, Playback.Chunk-Timing-Diagnostics, and Playback.Chunk-Mode
  • 2026-05-30: Inventory recording split into dedicated equipment-state and storage-snapshot events backed by raw item bytes, plus regression coverage for the new binary payloads and legacy JSON upgrade path
  • 2026-05-31: Replay viewer safety controls: Playback.Viewer-Safety-Mode, Playback.Restore-Viewer-Location-On-Stop, Playback.Restore-Viewer-GameMode-On-Stop, Playback.Restore-Viewer-Flight-On-Stop, and Playback.Restore-Viewer-State-On-Rejoin
  • 2026-06-02: /replay reload command to re-read config.yml, restart retention scheduling, and report which changed settings apply immediately, only to new sessions, on future checks, or after restart
  • 2026-06-02: New config key Playback.Vanish-Viewer (default true) to hide replay viewers from live players during playback
  • 2026-06-04: Expanded bStats telemetry with SimplePie charts for storage type, recording chunk capture, playback viewer safety and chunk playback settings, vanish-viewer, and retention state plus retention age normalization to days when cleanup is disabled
  • 2026-06-12: Velocity replay handoff support via /replay play <name> server:<backend>, including remote replay launch and return-to-origin flow after playback stops
  • 2026-06-14: Config key Velocity.Default-Replay-Server to route /replay play <name> to a default Velocity replay backend when no server:<backend> argument is supplied

Changed

  • 2026-04-11: RecordingStopEvent now fires synchronously to fix async AntiCheatReplay compatibility
  • 2026-04-19: Update checks now treat -SNAPSHOT builds as their corresponding release version
  • 2026-04-20: Config settings ownership moved out of Replay into a dedicated typed, comment-preserving config manager with versioned migrations
  • 2026-04-22: Replay sessions now always start at 1.0x speed, and Playback.Max-Speed is enforced to a minimum of 1.0
  • 2026-04-27: Binary replay archives now use format version 2; new .br inventory payloads store split equipment and storage slot bytes directly, while legacy JSON replay loading remains supported and older alpha .br inventory archives are intentionally unsupported
  • 2026-04-29: ReplayManager now exposes listSavedReplaySummaries, protectSavedReplay, unprotectSavedReplay, and returns ReplayDeleteResult from deleteSavedReplay
  • 2026-04-30: Config keys for list settings were renamed from list-page-size and list-protected-highlight-color to List.Page-Size and List.Protected-Highlight-Color, with automatic startup migration
  • 2026-04-30: Modrinth publishing metadata now includes Purpur, Spigot, and Bukkit loaders
  • 2026-05-14: Modrinth uploads now publish the matching release changelog on main and the [Unreleased] section for dev alpha builds
  • 2026-06-04: README content was reorganized into overview sections with dedicated Architecture, Configuration, and Commands documents under docs/
  • 2026-06-23: New binary .br archives now compress timeline payloads and chunk payloads with Zstd level 1, declare payloadCompression: "zstd", bump the binary replay compatibility floor to 1.5.0-alpha.12, and keep LZ4 replay/chunk archives readable through metadata or frame-magic compatibility fallback

Removed

  • 2026-04-28: General.Enable-Benchmark-Command; /replay benchmark is now always permission-gated through replay.benchmark

Fixed

  • 2026-04-13: Replay controls no longer get stuck after replay ends (#27)
  • 2026-04-15: Held-item swaps and hotbar slot changes are now captured immediately for more accurate replay inventory playback
  • 2026-04-16: Nested replay inventory loss when starting a replay during an active replay (#31)
  • 2026-04-17: Backward step controls now move exactly one tick group per click instead of skipping two
  • 2026-04-19: activeSessions in RecorderManager changed to ConcurrentHashMap to prevent ConcurrentModificationException (#33)
  • 2026-04-22: Config migration now preserves wrapped pseudo-comments, keeps the managed header stable, and avoids accumulating blank lines between root sections
  • 2026-04-27: Replay export now writes under the plugin data folder
  • 2026-04-30: PacketEvents block-break recording is now rescheduled onto the server thread to avoid Netty-thread contention and unsafe shared-state mutation (#43)
  • 2026-05-14: Chunk playback restore flow now handles unload timing and viewer return cases more reliably, and replay chunk load probing no longer bottlenecks missing-chunk checks under higher send rates
  • 2026-05-30: Equipment polling and dirty inventory polling now reuse shared short-lived caches across concurrent recordings to reduce repeated ItemStack serialization work without losing fallback accuracy
  • 2026-05-31: Replay playback now returns viewers to their original location and gameplay state by default, including disconnect and rejoin recovery
  • 2026-06-02: Replay viewers can no longer pick up live world items during playback, preventing replay inventory lockups from stray pickups
  • 2026-06-03: Replay viewer startup teleports now use asynchronous teleports for safer Paper and Folia compatibility
  • 2026-06-04: Dev alpha publishing now derives the next -alpha.N version from existing Modrinth releases for the current base version instead of GITHUB_RUN_NUMBER, so prereleases track the next unreleased line (now 1.5.0-alpha.N) and workflow renames cannot reset alpha numbering
  • 2026-06-06: Recorded-player menu teleports now use FoliaLib asynchronous teleports instead of direct player teleports
  • 2026-06-08: Fixed all compiler warnings. Maven build and test runs no longer emit unused annotation-processing or Mockito self-attach agent warnings
  • 2026-06-12: Legacy JSON replays whose inventory snapshots upgrade into split equipment/storage events now recreate recorded players correctly after replay seek/skip state reconstruction
  • 2026-06-12: Legacy JSON replay loading now accepts null inventory content slots from older inventory_update snapshots
  • 2026-06-12: Saved replay listings and replay-name tab completion now share a 5-second cache that refreshes from storage when stale, and MySQL replay overwrites now update created_at so recent listings reflect replaced recordings
  • 2026-06-14: Velocity replay handoff failures now send a clear chat error when the transfer request cannot be sent, the proxy reports a failure, or the proxy does not respond
  • 2026-06-14: Replay stop cleanup now schedules live block and chunk restore reads on their owning Folia region to avoid asynchronous world access failures
  • 2026-06-16: Recording chunk baseline capture now schedules live chunk reads on the owning Folia region to avoid async chunk retrieval failures when chunk recording is enabled
  • 2026-06-16: Chunk recording and chunk replay now move tracked-player chunk discovery, replay chunk refresh, legacy live block comparisons, and viewer packet sends onto the proper Folia entity or region scheduler
  • 2026-06-16: Recording session entity/player tracking and dirty inventory cache state now use concurrent collections to avoid Folia tick ConcurrentModificationException crashes during live recordings
  • 2026-06-16: Replay compatibility checks now treat a stable release like 1.5.0 as newer than same-base dev builds such as 1.5.0-alpha.9, and replay debug info now surfaces incompatible replay metadata or the real storage failure instead of a misleading generic not-found message
  • 2026-06-17: Velocity replay handoff now dispatches proxy plugin messages back onto the appropriate scheduler before sending them, avoiding thread-context failures when launching or resuming replay viewing across servers
  • 2026-06-17: Replay and recording names are now validated to 1-64 non-control characters without path-reserved symbols, and player-facing replay errors now use component chat sends to avoid main-thread CraftChatMessage freezes when invalid or missing replay names are echoed (#76)
  • 2026-06-23: Binary replay manifests now keep recordedWithVersion as the exact writer build while stamping minimumViewerVersion from the maintained replay compatibility floor instead of the current plugin version, preventing alpha-created recordings from requiring an unrelated stable release
  • 2026-06-23: Replay chunk snapshots now wait until the viewer has received the matching real server chunk plus one refresh before sending, preventing distant replay teleports from being overwritten by late live-world chunk packets
1.5.0-alpha.12Альфа1.21.11, 26.1.1, 26.1.2 · 24 июня 2026 г.

[Unreleased]

Added

  • 2026-04-17: Frame-by-frame step controls during paused replay; step backward or forward one tick group at a time via and inventory buttons
  • 2026-04-19: Variable playback speed controls during active replay, current speed action-bar feedback, and config keys Playback.Speed-Step plus Playback.Max-Speed
  • 2026-04-27: Finalized binary .br replay storage for file and MySQL backends, including crash-safe append-log recording, lazy indexed loading, preserved recording start timestamps, startup recovery of orphaned temp logs, and temporary legacy JSON compatibility during migration
  • 2026-04-27: Hidden admin utilities: /replay export, /replay debug dump, /replay debug info, and /replay benchmark, with output written under the plugin data folder
  • 2026-04-29: Replay protection commands and metadata, protected replay highlighting in /replay list, config-driven retention cleanup with human-readable duration parsing, and deletion safeguards for protected replays
  • 2026-05-14: Optional chunk baseline capture and chunk-aware playback for binary replays, including block-entity support, replay chunk caching, Playback.Chunk-View-Radius, Playback.Chunk-Send-Limit-Per-Tick, Playback.Chunk-Clear-Limit-Per-Tick, Playback.Chunk-Timing-Diagnostics, and Playback.Chunk-Mode
  • 2026-05-30: Inventory recording split into dedicated equipment-state and storage-snapshot events backed by raw item bytes, plus regression coverage for the new binary payloads and legacy JSON upgrade path
  • 2026-05-31: Replay viewer safety controls: Playback.Viewer-Safety-Mode, Playback.Restore-Viewer-Location-On-Stop, Playback.Restore-Viewer-GameMode-On-Stop, Playback.Restore-Viewer-Flight-On-Stop, and Playback.Restore-Viewer-State-On-Rejoin
  • 2026-06-02: /replay reload command to re-read config.yml, restart retention scheduling, and report which changed settings apply immediately, only to new sessions, on future checks, or after restart
  • 2026-06-02: New config key Playback.Vanish-Viewer (default true) to hide replay viewers from live players during playback
  • 2026-06-04: Expanded bStats telemetry with SimplePie charts for storage type, recording chunk capture, playback viewer safety and chunk playback settings, vanish-viewer, and retention state plus retention age normalization to days when cleanup is disabled
  • 2026-06-12: Velocity replay handoff support via /replay play <name> server:<backend>, including remote replay launch and return-to-origin flow after playback stops
  • 2026-06-14: Config key Velocity.Default-Replay-Server to route /replay play <name> to a default Velocity replay backend when no server:<backend> argument is supplied

Changed

  • 2026-04-11: RecordingStopEvent now fires synchronously to fix async AntiCheatReplay compatibility
  • 2026-04-19: Update checks now treat -SNAPSHOT builds as their corresponding release version
  • 2026-04-20: Config settings ownership moved out of Replay into a dedicated typed, comment-preserving config manager with versioned migrations
  • 2026-04-22: Replay sessions now always start at 1.0x speed, and Playback.Max-Speed is enforced to a minimum of 1.0
  • 2026-04-27: Binary replay archives now use format version 2; new .br inventory payloads store split equipment and storage slot bytes directly, while legacy JSON replay loading remains supported and older alpha .br inventory archives are intentionally unsupported
  • 2026-04-29: ReplayManager now exposes listSavedReplaySummaries, protectSavedReplay, unprotectSavedReplay, and returns ReplayDeleteResult from deleteSavedReplay
  • 2026-04-30: Config keys for list settings were renamed from list-page-size and list-protected-highlight-color to List.Page-Size and List.Protected-Highlight-Color, with automatic startup migration
  • 2026-04-30: Modrinth publishing metadata now includes Purpur, Spigot, and Bukkit loaders
  • 2026-05-14: Modrinth uploads now publish the matching release changelog on main and the [Unreleased] section for dev alpha builds
  • 2026-06-04: README content was reorganized into overview sections with dedicated Architecture, Configuration, and Commands documents under docs/
  • 2026-06-23: New binary .br archives now compress timeline payloads and chunk payloads with Zstd level 1, declare payloadCompression: "zstd", bump the binary replay compatibility floor to 1.5.0-alpha.12, and keep LZ4 replay/chunk archives readable through metadata or frame-magic compatibility fallback

Removed

  • 2026-04-28: General.Enable-Benchmark-Command; /replay benchmark is now always permission-gated through replay.benchmark

Fixed

  • 2026-04-13: Replay controls no longer get stuck after replay ends (#27)
  • 2026-04-15: Held-item swaps and hotbar slot changes are now captured immediately for more accurate replay inventory playback
  • 2026-04-16: Nested replay inventory loss when starting a replay during an active replay (#31)
  • 2026-04-17: Backward step controls now move exactly one tick group per click instead of skipping two
  • 2026-04-19: activeSessions in RecorderManager changed to ConcurrentHashMap to prevent ConcurrentModificationException (#33)
  • 2026-04-22: Config migration now preserves wrapped pseudo-comments, keeps the managed header stable, and avoids accumulating blank lines between root sections
  • 2026-04-27: Replay export now writes under the plugin data folder
  • 2026-04-30: PacketEvents block-break recording is now rescheduled onto the server thread to avoid Netty-thread contention and unsafe shared-state mutation (#43)
  • 2026-05-14: Chunk playback restore flow now handles unload timing and viewer return cases more reliably, and replay chunk load probing no longer bottlenecks missing-chunk checks under higher send rates
  • 2026-05-30: Equipment polling and dirty inventory polling now reuse shared short-lived caches across concurrent recordings to reduce repeated ItemStack serialization work without losing fallback accuracy
  • 2026-05-31: Replay playback now returns viewers to their original location and gameplay state by default, including disconnect and rejoin recovery
  • 2026-06-02: Replay viewers can no longer pick up live world items during playback, preventing replay inventory lockups from stray pickups
  • 2026-06-03: Replay viewer startup teleports now use asynchronous teleports for safer Paper and Folia compatibility
  • 2026-06-04: Dev alpha publishing now derives the next -alpha.N version from existing Modrinth releases for the current base version instead of GITHUB_RUN_NUMBER, so prereleases track the next unreleased line (now 1.5.0-alpha.N) and workflow renames cannot reset alpha numbering
  • 2026-06-06: Recorded-player menu teleports now use FoliaLib asynchronous teleports instead of direct player teleports
  • 2026-06-08: Fixed all compiler warnings. Maven build and test runs no longer emit unused annotation-processing or Mockito self-attach agent warnings
  • 2026-06-12: Legacy JSON replays whose inventory snapshots upgrade into split equipment/storage events now recreate recorded players correctly after replay seek/skip state reconstruction
  • 2026-06-12: Legacy JSON replay loading now accepts null inventory content slots from older inventory_update snapshots
  • 2026-06-12: Saved replay listings and replay-name tab completion now share a 5-second cache that refreshes from storage when stale, and MySQL replay overwrites now update created_at so recent listings reflect replaced recordings
  • 2026-06-14: Velocity replay handoff failures now send a clear chat error when the transfer request cannot be sent, the proxy reports a failure, or the proxy does not respond
  • 2026-06-14: Replay stop cleanup now schedules live block and chunk restore reads on their owning Folia region to avoid asynchronous world access failures
  • 2026-06-16: Recording chunk baseline capture now schedules live chunk reads on the owning Folia region to avoid async chunk retrieval failures when chunk recording is enabled
  • 2026-06-16: Chunk recording and chunk replay now move tracked-player chunk discovery, replay chunk refresh, legacy live block comparisons, and viewer packet sends onto the proper Folia entity or region scheduler
  • 2026-06-16: Recording session entity/player tracking and dirty inventory cache state now use concurrent collections to avoid Folia tick ConcurrentModificationException crashes during live recordings
  • 2026-06-16: Replay compatibility checks now treat a stable release like 1.5.0 as newer than same-base dev builds such as 1.5.0-alpha.9, and replay debug info now surfaces incompatible replay metadata or the real storage failure instead of a misleading generic not-found message
  • 2026-06-17: Velocity replay handoff now dispatches proxy plugin messages back onto the appropriate scheduler before sending them, avoiding thread-context failures when launching or resuming replay viewing across servers
  • 2026-06-17: Replay and recording names are now validated to 1-64 non-control characters without path-reserved symbols, and player-facing replay errors now use component chat sends to avoid main-thread CraftChatMessage freezes when invalid or missing replay names are echoed (#76)
  • 2026-06-23: Binary replay manifests now keep recordedWithVersion as the exact writer build while stamping minimumViewerVersion from the maintained replay compatibility floor instead of the current plugin version, preventing alpha-created recordings from requiring an unrelated stable release
1.5.0-alpha.11Альфа1.21.11, 26.1.1, 26.1.2 · 23 июня 2026 г.

[Unreleased]

Added

  • 2026-04-17: Frame-by-frame step controls during paused replay; step backward or forward one tick group at a time via and inventory buttons
  • 2026-04-19: Variable playback speed controls during active replay, current speed action-bar feedback, and config keys Playback.Speed-Step plus Playback.Max-Speed
  • 2026-04-27: Finalized binary .br replay storage for file and MySQL backends, including crash-safe append-log recording, lazy indexed loading, preserved recording start timestamps, startup recovery of orphaned temp logs, and temporary legacy JSON compatibility during migration
  • 2026-04-27: Hidden admin utilities: /replay export, /replay debug dump, /replay debug info, and /replay benchmark, with output written under the plugin data folder
  • 2026-04-29: Replay protection commands and metadata, protected replay highlighting in /replay list, config-driven retention cleanup with human-readable duration parsing, and deletion safeguards for protected replays
  • 2026-05-14: Optional chunk baseline capture and chunk-aware playback for binary replays, including block-entity support, replay chunk caching, Playback.Chunk-View-Radius, Playback.Chunk-Send-Limit-Per-Tick, Playback.Chunk-Clear-Limit-Per-Tick, Playback.Chunk-Timing-Diagnostics, and Playback.Chunk-Mode
  • 2026-05-30: Inventory recording split into dedicated equipment-state and storage-snapshot events backed by raw item bytes, plus regression coverage for the new binary payloads and legacy JSON upgrade path
  • 2026-05-31: Replay viewer safety controls: Playback.Viewer-Safety-Mode, Playback.Restore-Viewer-Location-On-Stop, Playback.Restore-Viewer-GameMode-On-Stop, Playback.Restore-Viewer-Flight-On-Stop, and Playback.Restore-Viewer-State-On-Rejoin
  • 2026-06-02: /replay reload command to re-read config.yml, restart retention scheduling, and report which changed settings apply immediately, only to new sessions, on future checks, or after restart
  • 2026-06-02: New config key Playback.Vanish-Viewer (default true) to hide replay viewers from live players during playback
  • 2026-06-04: Expanded bStats telemetry with SimplePie charts for storage type, recording chunk capture, playback viewer safety and chunk playback settings, vanish-viewer, and retention state plus retention age normalization to days when cleanup is disabled
  • 2026-06-12: Velocity replay handoff support via /replay play <name> server:<backend>, including remote replay launch and return-to-origin flow after playback stops
  • 2026-06-14: Config key Velocity.Default-Replay-Server to route /replay play <name> to a default Velocity replay backend when no server:<backend> argument is supplied

Changed

  • 2026-04-11: RecordingStopEvent now fires synchronously to fix async AntiCheatReplay compatibility
  • 2026-04-19: Update checks now treat -SNAPSHOT builds as their corresponding release version
  • 2026-04-20: Config settings ownership moved out of Replay into a dedicated typed, comment-preserving config manager with versioned migrations
  • 2026-04-22: Replay sessions now always start at 1.0x speed, and Playback.Max-Speed is enforced to a minimum of 1.0
  • 2026-04-27: Binary replay archives now use format version 2; new .br inventory payloads store split equipment and storage slot bytes directly, while legacy JSON replay loading remains supported and older alpha .br inventory archives are intentionally unsupported
  • 2026-04-29: ReplayManager now exposes listSavedReplaySummaries, protectSavedReplay, unprotectSavedReplay, and returns ReplayDeleteResult from deleteSavedReplay
  • 2026-04-30: Config keys for list settings were renamed from list-page-size and list-protected-highlight-color to List.Page-Size and List.Protected-Highlight-Color, with automatic startup migration
  • 2026-04-30: Modrinth publishing metadata now includes Purpur, Spigot, and Bukkit loaders
  • 2026-05-14: Modrinth uploads now publish the matching release changelog on main and the [Unreleased] section for dev alpha builds
  • 2026-06-04: README content was reorganized into overview sections with dedicated Architecture, Configuration, and Commands documents under docs/

Removed

  • 2026-04-28: General.Enable-Benchmark-Command; /replay benchmark is now always permission-gated through replay.benchmark

Fixed

  • 2026-04-13: Replay controls no longer get stuck after replay ends (#27)
  • 2026-04-15: Held-item swaps and hotbar slot changes are now captured immediately for more accurate replay inventory playback
  • 2026-04-16: Nested replay inventory loss when starting a replay during an active replay (#31)
  • 2026-04-17: Backward step controls now move exactly one tick group per click instead of skipping two
  • 2026-04-19: activeSessions in RecorderManager changed to ConcurrentHashMap to prevent ConcurrentModificationException (#33)
  • 2026-04-22: Config migration now preserves wrapped pseudo-comments, keeps the managed header stable, and avoids accumulating blank lines between root sections
  • 2026-04-27: Replay export now writes under the plugin data folder
  • 2026-04-30: PacketEvents block-break recording is now rescheduled onto the server thread to avoid Netty-thread contention and unsafe shared-state mutation (#43)
  • 2026-05-14: Chunk playback restore flow now handles unload timing and viewer return cases more reliably, and replay chunk load probing no longer bottlenecks missing-chunk checks under higher send rates
  • 2026-05-30: Equipment polling and dirty inventory polling now reuse shared short-lived caches across concurrent recordings to reduce repeated ItemStack serialization work without losing fallback accuracy
  • 2026-05-31: Replay playback now returns viewers to their original location and gameplay state by default, including disconnect and rejoin recovery
  • 2026-06-02: Replay viewers can no longer pick up live world items during playback, preventing replay inventory lockups from stray pickups
  • 2026-06-03: Replay viewer startup teleports now use asynchronous teleports for safer Paper and Folia compatibility
  • 2026-06-04: Dev alpha publishing now derives the next -alpha.N version from existing Modrinth releases for the current base version instead of GITHUB_RUN_NUMBER, so prereleases track the next unreleased line (now 1.5.0-alpha.N) and workflow renames cannot reset alpha numbering
  • 2026-06-06: Recorded-player menu teleports now use FoliaLib asynchronous teleports instead of direct player teleports
  • 2026-06-08: Fixed all compiler warnings. Maven build and test runs no longer emit unused annotation-processing or Mockito self-attach agent warnings
  • 2026-06-12: Legacy JSON replays whose inventory snapshots upgrade into split equipment/storage events now recreate recorded players correctly after replay seek/skip state reconstruction
  • 2026-06-12: Legacy JSON replay loading now accepts null inventory content slots from older inventory_update snapshots
  • 2026-06-12: Saved replay listings and replay-name tab completion now share a 5-second cache that refreshes from storage when stale, and MySQL replay overwrites now update created_at so recent listings reflect replaced recordings
  • 2026-06-14: Velocity replay handoff failures now send a clear chat error when the transfer request cannot be sent, the proxy reports a failure, or the proxy does not respond
  • 2026-06-14: Replay stop cleanup now schedules live block and chunk restore reads on their owning Folia region to avoid asynchronous world access failures
  • 2026-06-16: Recording chunk baseline capture now schedules live chunk reads on the owning Folia region to avoid async chunk retrieval failures when chunk recording is enabled
  • 2026-06-16: Chunk recording and chunk replay now move tracked-player chunk discovery, replay chunk refresh, legacy live block comparisons, and viewer packet sends onto the proper Folia entity or region scheduler
  • 2026-06-16: Recording session entity/player tracking and dirty inventory cache state now use concurrent collections to avoid Folia tick ConcurrentModificationException crashes during live recordings
  • 2026-06-16: Replay compatibility checks now treat a stable release like 1.5.0 as newer than same-base dev builds such as 1.5.0-alpha.9, and replay debug info now surfaces incompatible replay metadata or the real storage failure instead of a misleading generic not-found message
  • 2026-06-17: Velocity replay handoff now dispatches proxy plugin messages back onto the appropriate scheduler before sending them, avoiding thread-context failures when launching or resuming replay viewing across servers
  • 2026-06-17: Replay and recording names are now validated to 1-64 non-control characters without path-reserved symbols, and player-facing replay errors now use component chat sends to avoid main-thread CraftChatMessage freezes when invalid or missing replay names are echoed (#76)
  • 2026-06-23: Binary replay manifests now keep recordedWithVersion as the exact writer build while stamping minimumViewerVersion from the maintained replay compatibility floor instead of the current plugin version, preventing alpha-created recordings from requiring an unrelated stable release
1.5.0-alpha.10Альфа1.21.11, 26.1.1, 26.1.2 · 17 июня 2026 г.

[Unreleased]

Added

  • 2026-04-17: Frame-by-frame step controls during paused replay; step backward or forward one tick group at a time via and inventory buttons
  • 2026-04-19: Variable playback speed controls during active replay, current speed action-bar feedback, and config keys Playback.Speed-Step plus Playback.Max-Speed
  • 2026-04-27: Finalized binary .br replay storage for file and MySQL backends, including crash-safe append-log recording, lazy indexed loading, preserved recording start timestamps, startup recovery of orphaned temp logs, and temporary legacy JSON compatibility during migration
  • 2026-04-27: Hidden admin utilities: /replay export, /replay debug dump, /replay debug info, and /replay benchmark, with output written under the plugin data folder
  • 2026-04-29: Replay protection commands and metadata, protected replay highlighting in /replay list, config-driven retention cleanup with human-readable duration parsing, and deletion safeguards for protected replays
  • 2026-05-14: Optional chunk baseline capture and chunk-aware playback for binary replays, including block-entity support, replay chunk caching, Playback.Chunk-View-Radius, Playback.Chunk-Send-Limit-Per-Tick, Playback.Chunk-Clear-Limit-Per-Tick, Playback.Chunk-Timing-Diagnostics, and Playback.Chunk-Mode
  • 2026-05-30: Inventory recording split into dedicated equipment-state and storage-snapshot events backed by raw item bytes, plus regression coverage for the new binary payloads and legacy JSON upgrade path
  • 2026-05-31: Replay viewer safety controls: Playback.Viewer-Safety-Mode, Playback.Restore-Viewer-Location-On-Stop, Playback.Restore-Viewer-GameMode-On-Stop, Playback.Restore-Viewer-Flight-On-Stop, and Playback.Restore-Viewer-State-On-Rejoin
  • 2026-06-02: /replay reload command to re-read config.yml, restart retention scheduling, and report which changed settings apply immediately, only to new sessions, on future checks, or after restart
  • 2026-06-02: New config key Playback.Vanish-Viewer (default true) to hide replay viewers from live players during playback
  • 2026-06-04: Expanded bStats telemetry with SimplePie charts for storage type, recording chunk capture, playback viewer safety and chunk playback settings, vanish-viewer, and retention state plus retention age normalization to days when cleanup is disabled
  • 2026-06-12: Velocity replay handoff support via /replay play <name> server:<backend>, including remote replay launch and return-to-origin flow after playback stops
  • 2026-06-14: Config key Velocity.Default-Replay-Server to route /replay play <name> to a default Velocity replay backend when no server:<backend> argument is supplied

Changed

  • 2026-04-11: RecordingStopEvent now fires synchronously to fix async AntiCheatReplay compatibility
  • 2026-04-19: Update checks now treat -SNAPSHOT builds as their corresponding release version
  • 2026-04-20: Config settings ownership moved out of Replay into a dedicated typed, comment-preserving config manager with versioned migrations
  • 2026-04-22: Replay sessions now always start at 1.0x speed, and Playback.Max-Speed is enforced to a minimum of 1.0
  • 2026-04-27: Binary replay archives now use format version 2; new .br inventory payloads store split equipment and storage slot bytes directly, while legacy JSON replay loading remains supported and older alpha .br inventory archives are intentionally unsupported
  • 2026-04-29: ReplayManager now exposes listSavedReplaySummaries, protectSavedReplay, unprotectSavedReplay, and returns ReplayDeleteResult from deleteSavedReplay
  • 2026-04-30: Config keys for list settings were renamed from list-page-size and list-protected-highlight-color to List.Page-Size and List.Protected-Highlight-Color, with automatic startup migration
  • 2026-04-30: Modrinth publishing metadata now includes Purpur, Spigot, and Bukkit loaders
  • 2026-05-14: Modrinth uploads now publish the matching release changelog on main and the [Unreleased] section for dev alpha builds
  • 2026-06-04: README content was reorganized into overview sections with dedicated Architecture, Configuration, and Commands documents under docs/

Removed

  • 2026-04-28: General.Enable-Benchmark-Command; /replay benchmark is now always permission-gated through replay.benchmark

Fixed

  • 2026-04-13: Replay controls no longer get stuck after replay ends (#27)
  • 2026-04-15: Held-item swaps and hotbar slot changes are now captured immediately for more accurate replay inventory playback
  • 2026-04-16: Nested replay inventory loss when starting a replay during an active replay (#31)
  • 2026-04-17: Backward step controls now move exactly one tick group per click instead of skipping two
  • 2026-04-19: activeSessions in RecorderManager changed to ConcurrentHashMap to prevent ConcurrentModificationException (#33)
  • 2026-04-22: Config migration now preserves wrapped pseudo-comments, keeps the managed header stable, and avoids accumulating blank lines between root sections
  • 2026-04-27: Replay export now writes under the plugin data folder
  • 2026-04-30: PacketEvents block-break recording is now rescheduled onto the server thread to avoid Netty-thread contention and unsafe shared-state mutation (#43)
  • 2026-05-14: Chunk playback restore flow now handles unload timing and viewer return cases more reliably, and replay chunk load probing no longer bottlenecks missing-chunk checks under higher send rates
  • 2026-05-30: Equipment polling and dirty inventory polling now reuse shared short-lived caches across concurrent recordings to reduce repeated ItemStack serialization work without losing fallback accuracy
  • 2026-05-31: Replay playback now returns viewers to their original location and gameplay state by default, including disconnect and rejoin recovery
  • 2026-06-02: Replay viewers can no longer pick up live world items during playback, preventing replay inventory lockups from stray pickups
  • 2026-06-03: Replay viewer startup teleports now use asynchronous teleports for safer Paper and Folia compatibility
  • 2026-06-04: Dev alpha publishing now derives the next -alpha.N version from existing Modrinth releases for the current base version instead of GITHUB_RUN_NUMBER, so prereleases track the next unreleased line (now 1.5.0-alpha.N) and workflow renames cannot reset alpha numbering
  • 2026-06-06: Recorded-player menu teleports now use FoliaLib asynchronous teleports instead of direct player teleports
  • 2026-06-08: Fixed all compiler warnings. Maven build and test runs no longer emit unused annotation-processing or Mockito self-attach agent warnings
  • 2026-06-12: Legacy JSON replays whose inventory snapshots upgrade into split equipment/storage events now recreate recorded players correctly after replay seek/skip state reconstruction
  • 2026-06-12: Legacy JSON replay loading now accepts null inventory content slots from older inventory_update snapshots
  • 2026-06-12: Saved replay listings and replay-name tab completion now share a 5-second cache that refreshes from storage when stale, and MySQL replay overwrites now update created_at so recent listings reflect replaced recordings
  • 2026-06-14: Velocity replay handoff failures now send a clear chat error when the transfer request cannot be sent, the proxy reports a failure, or the proxy does not respond
  • 2026-06-14: Replay stop cleanup now schedules live block and chunk restore reads on their owning Folia region to avoid asynchronous world access failures
  • 2026-06-16: Recording chunk baseline capture now schedules live chunk reads on the owning Folia region to avoid async chunk retrieval failures when chunk recording is enabled
  • 2026-06-16: Chunk recording and chunk replay now move tracked-player chunk discovery, replay chunk refresh, legacy live block comparisons, and viewer packet sends onto the proper Folia entity or region scheduler
  • 2026-06-16: Recording session entity/player tracking and dirty inventory cache state now use concurrent collections to avoid Folia tick ConcurrentModificationException crashes during live recordings
  • 2026-06-16: Replay compatibility checks now treat a stable release like 1.5.0 as newer than same-base dev builds such as 1.5.0-alpha.9, and replay debug info now surfaces incompatible replay metadata or the real storage failure instead of a misleading generic not-found message
  • 2026-06-17: Velocity replay handoff now dispatches proxy plugin messages back onto the appropriate scheduler before sending them, avoiding thread-context failures when launching or resuming replay viewing across servers
  • 2026-06-17: Replay and recording names are now validated to 1-64 non-control characters without path-reserved symbols, and player-facing replay errors now use component chat sends to avoid main-thread CraftChatMessage freezes when invalid or missing replay names are echoed (#76)
1.5.0-alpha.9Альфа1.21.11, 26.1.1, 26.1.2 · 16 июня 2026 г.

[Unreleased]

Added

  • 2026-04-17: Frame-by-frame step controls during paused replay; step backward or forward one tick group at a time via and inventory buttons
  • 2026-04-19: Variable playback speed controls during active replay, current speed action-bar feedback, and config keys Playback.Speed-Step plus Playback.Max-Speed
  • 2026-04-27: Finalized binary .br replay storage for file and MySQL backends, including crash-safe append-log recording, lazy indexed loading, preserved recording start timestamps, startup recovery of orphaned temp logs, and temporary legacy JSON compatibility during migration
  • 2026-04-27: Hidden admin utilities: /replay export, /replay debug dump, /replay debug info, and /replay benchmark, with output written under the plugin data folder
  • 2026-04-29: Replay protection commands and metadata, protected replay highlighting in /replay list, config-driven retention cleanup with human-readable duration parsing, and deletion safeguards for protected replays
  • 2026-05-14: Optional chunk baseline capture and chunk-aware playback for binary replays, including block-entity support, replay chunk caching, Playback.Chunk-View-Radius, Playback.Chunk-Send-Limit-Per-Tick, Playback.Chunk-Clear-Limit-Per-Tick, Playback.Chunk-Timing-Diagnostics, and Playback.Chunk-Mode
  • 2026-05-30: Inventory recording split into dedicated equipment-state and storage-snapshot events backed by raw item bytes, plus regression coverage for the new binary payloads and legacy JSON upgrade path
  • 2026-05-31: Replay viewer safety controls: Playback.Viewer-Safety-Mode, Playback.Restore-Viewer-Location-On-Stop, Playback.Restore-Viewer-GameMode-On-Stop, Playback.Restore-Viewer-Flight-On-Stop, and Playback.Restore-Viewer-State-On-Rejoin
  • 2026-06-02: /replay reload command to re-read config.yml, restart retention scheduling, and report which changed settings apply immediately, only to new sessions, on future checks, or after restart
  • 2026-06-02: New config key Playback.Vanish-Viewer (default true) to hide replay viewers from live players during playback
  • 2026-06-04: Expanded bStats telemetry with SimplePie charts for storage type, recording chunk capture, playback viewer safety and chunk playback settings, vanish-viewer, and retention state plus retention age normalization to days when cleanup is disabled
  • 2026-06-12: Velocity replay handoff support via /replay play <name> server:<backend>, including remote replay launch and return-to-origin flow after playback stops
  • 2026-06-14: Config key Velocity.Default-Replay-Server to route /replay play <name> to a default Velocity replay backend when no server:<backend> argument is supplied

Changed

  • 2026-04-11: RecordingStopEvent now fires synchronously to fix async AntiCheatReplay compatibility
  • 2026-04-19: Update checks now treat -SNAPSHOT builds as their corresponding release version
  • 2026-04-20: Config settings ownership moved out of Replay into a dedicated typed, comment-preserving config manager with versioned migrations
  • 2026-04-22: Replay sessions now always start at 1.0x speed, and Playback.Max-Speed is enforced to a minimum of 1.0
  • 2026-04-27: Binary replay archives now use format version 2; new .br inventory payloads store split equipment and storage slot bytes directly, while legacy JSON replay loading remains supported and older alpha .br inventory archives are intentionally unsupported
  • 2026-04-29: ReplayManager now exposes listSavedReplaySummaries, protectSavedReplay, unprotectSavedReplay, and returns ReplayDeleteResult from deleteSavedReplay
  • 2026-04-30: Config keys for list settings were renamed from list-page-size and list-protected-highlight-color to List.Page-Size and List.Protected-Highlight-Color, with automatic startup migration
  • 2026-04-30: Modrinth publishing metadata now includes Purpur, Spigot, and Bukkit loaders
  • 2026-05-14: Modrinth uploads now publish the matching release changelog on main and the [Unreleased] section for dev alpha builds
  • 2026-06-04: README content was reorganized into overview sections with dedicated Architecture, Configuration, and Commands documents under docs/

Removed

  • 2026-04-28: General.Enable-Benchmark-Command; /replay benchmark is now always permission-gated through replay.benchmark

Fixed

  • 2026-04-13: Replay controls no longer get stuck after replay ends (#27)
  • 2026-04-15: Held-item swaps and hotbar slot changes are now captured immediately for more accurate replay inventory playback
  • 2026-04-16: Nested replay inventory loss when starting a replay during an active replay (#31)
  • 2026-04-17: Backward step controls now move exactly one tick group per click instead of skipping two
  • 2026-04-19: activeSessions in RecorderManager changed to ConcurrentHashMap to prevent ConcurrentModificationException (#33)
  • 2026-04-22: Config migration now preserves wrapped pseudo-comments, keeps the managed header stable, and avoids accumulating blank lines between root sections
  • 2026-04-27: Replay export now writes under the plugin data folder
  • 2026-04-30: PacketEvents block-break recording is now rescheduled onto the server thread to avoid Netty-thread contention and unsafe shared-state mutation (#43)
  • 2026-05-14: Chunk playback restore flow now handles unload timing and viewer return cases more reliably, and replay chunk load probing no longer bottlenecks missing-chunk checks under higher send rates
  • 2026-05-30: Equipment polling and dirty inventory polling now reuse shared short-lived caches across concurrent recordings to reduce repeated ItemStack serialization work without losing fallback accuracy
  • 2026-05-31: Replay playback now returns viewers to their original location and gameplay state by default, including disconnect and rejoin recovery
  • 2026-06-02: Replay viewers can no longer pick up live world items during playback, preventing replay inventory lockups from stray pickups
  • 2026-06-03: Replay viewer startup teleports now use asynchronous teleports for safer Paper and Folia compatibility
  • 2026-06-04: Dev alpha publishing now derives the next -alpha.N version from existing Modrinth releases for the current base version instead of GITHUB_RUN_NUMBER, so prereleases track the next unreleased line (now 1.5.0-alpha.N) and workflow renames cannot reset alpha numbering
  • 2026-06-06: Recorded-player menu teleports now use FoliaLib asynchronous teleports instead of direct player teleports
  • 2026-06-08: Fixed all compiler warnings. Maven build and test runs no longer emit unused annotation-processing or Mockito self-attach agent warnings
  • 2026-06-12: Legacy JSON replays whose inventory snapshots upgrade into split equipment/storage events now recreate recorded players correctly after replay seek/skip state reconstruction
  • 2026-06-12: Legacy JSON replay loading now accepts null inventory content slots from older inventory_update snapshots
  • 2026-06-12: Saved replay listings and replay-name tab completion now share a 5-second cache that refreshes from storage when stale, and MySQL replay overwrites now update created_at so recent listings reflect replaced recordings
  • 2026-06-14: Velocity replay handoff failures now send a clear chat error when the transfer request cannot be sent, the proxy reports a failure, or the proxy does not respond
  • 2026-06-14: Replay stop cleanup now schedules live block and chunk restore reads on their owning Folia region to avoid asynchronous world access failures
  • 2026-06-16: Recording chunk baseline capture now schedules live chunk reads on the owning Folia region to avoid async chunk retrieval failures when chunk recording is enabled
  • 2026-06-16: Chunk recording and chunk replay now move tracked-player chunk discovery, replay chunk refresh, legacy live block comparisons, and viewer packet sends onto the proper Folia entity or region scheduler

Комментарии

Загружаем…