Skip to content

Add production-ready Graveyard death recovery - #89

Merged
remdui merged 234 commits into
mainfrom
agent/graveyard-feature
Aug 4, 2026
Merged

Add production-ready Graveyard death recovery#89
remdui merged 234 commits into
mainfrom
agent/graveyard-feature

Conversation

@remdui

@remdui remdui commented Aug 2, 2026

Copy link
Copy Markdown
Member

Summary

Adds Graveyard, a durable packet-only death recovery feature that replaces physical death-chest plugins without placing blocks or Bukkit entities in the world.

Packet-only rendering and interaction

  • sends concrete PacketEvents PacketWrapper<?> instances, preventing the raw ByteBuf overload/cast failure;
  • builds block-display, text-display, and INTERACTION metadata from unspawned Paper entity templates so metadata indexes match the running protocol;
  • registers each virtual interaction hitbox in a generation-fenced server-side index;
  • intercepts INTERACT_ENTITY before vanilla attempts to resolve the packet-only entity;
  • accepts right-click INTERACT, right-click-at-position INTERACT_AT, and left-click ATTACK actions;
  • cancels packets targeting Graveyard hitboxes and schedules the authoritative claim attempt on the Bukkit main thread;
  • revalidates current viewer generation, visible state, claim status, owner, inventory scope, world, configured distance, line of sight, and database operation reservation;
  • serializes both owner and grave operations, so duplicate main-hand/off-hand or repeated click packets cannot duplicate delivery;
  • forgets viewer state on disconnect without writing destroy packets to a closing network channel.

Player-facing grave names

Graves use a stable command identifier:

<player>-<world>-yyyyMMdd-HHmmss-SSS

The identifier is lower-case, command-safe, bounded in length, and stable after relocation. The internal UUID remains the durable database and recovery identity.

Commands and lifecycle visibility

  • only active, partial, orphaned-world, and pending-delivery graves appear in normal player lists and suggestions;
  • completed, expired, corrupt, recovered, and purged graves are excluded from normal tracking, claiming, locating, and active admin completion;
  • expired graves remain available only through explicit restore, purge, and historical inspection paths;
  • purge immediately removes every runtime index, cache, tracker, and completion source;
  • command execution revalidates current state rather than trusting stale suggestions.

Persistence

All tables use the PlayerData namespace:

  • player_graveyard_graves
  • player_graveyard_payloads
  • player_graveyard_audit
  • player_graveyard_leases

No compatibility or automatic migration path exists for the earlier unreleased unprefixed development tables.

Reliability and safety

  • fsynced capture and claim journals before ownership-changing mutations;
  • persisted player receipts and playerdata at the transfer boundary;
  • checksummed, size-bounded, versioned item payloads with corruption quarantine;
  • optimistic revisions, operation tokens, owner-level serialization, and database writer leases;
  • plugin-active-time expiry so ordinary downtime does not consume grave lifetime;
  • safe loaded-location placement without chunk generation or forced loading;
  • partial claims retain overflow without dropping or overwriting items;
  • completed-record retention preserves audit history and excludes corrupt or in-flight operations.

Startup log clarification

Hibernate database-information output and HHH000489: No JTA platform available are normal INFO-level diagnostics for the configured local JDBC transaction model. The ORM initialization, command registration, feature load, and lease-acquisition messages indicate successful initialization.

Validation

Final head 80b951365636dade6e2a0dfa37b143319fc20261:

  • current with main (behind_by: 0);
  • CI Checkstyle and script lint: passed;
  • Java 25 Maven verify and JaCoCo gates: passed;
  • bundled Paper boot and clean-shutdown acceptance: passed;
  • virtual interaction action regression: passed for INTERACT, INTERACT_AT, and ATTACK;
  • operator documentation matches the enforced click contract;
  • no temporary workflow or .agent files;
  • no unresolved review threads;
  • pull request mergeable.

@remdui remdui closed this Aug 2, 2026
@remdui remdui reopened this Aug 2, 2026
@remdui remdui closed this Aug 2, 2026
@remdui remdui reopened this Aug 2, 2026
@remdui remdui closed this Aug 2, 2026
@remdui remdui reopened this Aug 2, 2026
@remdui remdui closed this Aug 2, 2026
@remdui remdui reopened this Aug 2, 2026
@remdui remdui closed this Aug 3, 2026
@remdui remdui reopened this Aug 3, 2026
@remdui remdui closed this Aug 3, 2026
@remdui remdui reopened this Aug 3, 2026
@remdui remdui closed this Aug 3, 2026
@remdui remdui reopened this Aug 3, 2026
@remdui
remdui marked this pull request as ready for review August 3, 2026 23:17
@remdui
remdui marked this pull request as draft August 4, 2026 06:06
@remdui remdui closed this Aug 4, 2026
@remdui remdui reopened this Aug 4, 2026
@remdui
remdui marked this pull request as ready for review August 4, 2026 06:29
@remdui
remdui merged commit d12c6a3 into main Aug 4, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant