feat: personal run replays (ghost system)
- GhostData: worldName field, format v4; GhostManager stores last N runs per player (ghosts/<uuid>/<ts>.ghost)
- GhostService: per-player recording (start on run start, every tick, finalize on fall), gated by ghost-mode.enabled + per-player toggle
- PlayerGhost: packet-based fake-player NPC with viewer skin (NMS via remapNms gradle task, reflection send, graceful degradation)
- GhostReplay: teleport viewer to run start, replay frames via PlayerGhost, restore on finish
- /lp replay [index] command + tab completion; settings menu ghost_recording toggle (persisted disk/SQL)
- config: ghost-mode.{enabled,max-runs}, remove dead show-top/transparency + GHOST_* statics
- tests: GhostData v4 round-trip, GhostManager eviction/ordering, yawToFixed (79 total)
This commit is contained in:
parent
4c255111f0
commit
8c8046a4f5
30 changed files with 1027 additions and 227 deletions
|
|
@ -2,6 +2,7 @@ package dev.loki.loparkour;
|
|||
|
||||
import dev.loki.loparkour.bootstrap.PluginBootstrap;
|
||||
import dev.loki.loparkour.config.core.Config;
|
||||
import dev.loki.loparkour.ghost.service.GhostService;
|
||||
import dev.loki.loparkour.hook.papi.PAPIHook;
|
||||
import dev.loki.loparkour.mode.base.Modes;
|
||||
import dev.loki.loparkour.player.core.ParkourUser;
|
||||
|
|
@ -37,6 +38,7 @@ public final class LoParkour extends LoPlugin {
|
|||
|
||||
private static LoParkour instance;
|
||||
private static SchematicManager schematicManager;
|
||||
private static GhostService ghostService;
|
||||
|
||||
@Nullable
|
||||
private static PAPIHook placeholderHook;
|
||||
|
|
@ -68,10 +70,18 @@ public final class LoParkour extends LoPlugin {
|
|||
return schematicManager;
|
||||
}
|
||||
|
||||
public static GhostService getGhostService() {
|
||||
return ghostService;
|
||||
}
|
||||
|
||||
public void setSchematicManager(@NotNull SchematicManager manager) {
|
||||
schematicManager = manager;
|
||||
}
|
||||
|
||||
public void setGhostService(@NotNull GhostService service) {
|
||||
ghostService = service;
|
||||
}
|
||||
|
||||
public void setPlaceholderHook(@Nullable PAPIHook hook) {
|
||||
placeholderHook = hook;
|
||||
}
|
||||
|
|
@ -110,6 +120,9 @@ public final class LoParkour extends LoPlugin {
|
|||
|
||||
Rewards.clear();
|
||||
dev.loki.loparkour.adaptive.bootstrap.AdaptiveServices.shutdown();
|
||||
if (ghostService != null) {
|
||||
ghostService.shutdown();
|
||||
}
|
||||
Storage.close();
|
||||
World.delete();
|
||||
} catch (Throwable t) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue