From 41900531d22b3dcc485990ce14c8381d833127ea Mon Sep 17 00:00:00 2001 From: Jumper251 Date: Tue, 24 Sep 2024 18:34:58 +0200 Subject: [PATCH] fix plugin breaking when replaying invalid worlds --- build.gradle | 2 +- .../jumper251/replay/replaysystem/Replay.java | 3 +-- .../replaysystem/data/types/LocationData.java | 4 +++ .../replaying/ReplayPacketListener.java | 3 ++- .../replaysystem/replaying/Replayer.java | 26 ++++++++++++------- .../replaying/ReplayingUtils.java | 7 ++++- .../replaying/session/ReplaySession.java | 2 ++ 7 files changed, 33 insertions(+), 14 deletions(-) diff --git a/build.gradle b/build.gradle index faff7409..9ad2c113 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ dependencies { allprojects { group = 'me.jumper251.replay' - version = '1.8.9' + version = '1.8.10' apply plugin: 'java' apply plugin: 'maven-publish' diff --git a/src/main/java/me/jumper251/replay/replaysystem/Replay.java b/src/main/java/me/jumper251/replay/replaysystem/Replay.java index a80ec99b..ad06a6c3 100644 --- a/src/main/java/me/jumper251/replay/replaysystem/Replay.java +++ b/src/main/java/me/jumper251/replay/replaysystem/Replay.java @@ -66,8 +66,7 @@ public void play(Player watcher) { private void startReplay(Player watcher) { this.replayer = new Replayer(this, watcher); - this.replayer.start(); - this.isPlaying = true; + this.isPlaying = this.replayer.start(); } public String getId() { diff --git a/src/main/java/me/jumper251/replay/replaysystem/data/types/LocationData.java b/src/main/java/me/jumper251/replay/replaysystem/data/types/LocationData.java index df149500..5ee11021 100644 --- a/src/main/java/me/jumper251/replay/replaysystem/data/types/LocationData.java +++ b/src/main/java/me/jumper251/replay/replaysystem/data/types/LocationData.java @@ -66,6 +66,10 @@ public static Location toLocation(LocationData locationData) { return new Location(Bukkit.getWorld(locationData.getWorld()), locationData.getX(), locationData.getY(), locationData.getZ()); } + public boolean isValidWorld() { + return Bukkit.getWorld(this.world) != null; + } + @Override public String toString() { diff --git a/src/main/java/me/jumper251/replay/replaysystem/replaying/ReplayPacketListener.java b/src/main/java/me/jumper251/replay/replaysystem/replaying/ReplayPacketListener.java index 1223ca39..fe22140c 100644 --- a/src/main/java/me/jumper251/replay/replaysystem/replaying/ReplayPacketListener.java +++ b/src/main/java/me/jumper251/replay/replaysystem/replaying/ReplayPacketListener.java @@ -39,11 +39,12 @@ public ReplayPacketListener(Replayer replayer) { this.spectating = new HashMap(); this.previous = -1; - if (!isRegistered()) register(); } @Override public void register() { + if (isRegistered()) return; + this.packetAdapter = new PacketAdapter(ReplaySystem.getInstance(), ListenerPriority.NORMAL, PacketType.Play.Client.USE_ENTITY, PacketType.Play.Server.ENTITY_DESTROY) { @SuppressWarnings("deprecation") diff --git a/src/main/java/me/jumper251/replay/replaysystem/replaying/Replayer.java b/src/main/java/me/jumper251/replay/replaysystem/replaying/Replayer.java index 70fb4251..5c2d3dd3 100644 --- a/src/main/java/me/jumper251/replay/replaysystem/replaying/Replayer.java +++ b/src/main/java/me/jumper251/replay/replaysystem/replaying/Replayer.java @@ -71,29 +71,36 @@ public Replayer(Replay replay, Player watcher) { this.utils = new ReplayingUtils(this); this.session = new ReplaySession(this); this.paused = false; - - ReplayHelper.replaySessions.put(watcher.getName(), this); } - public void start() { + public boolean start() { ReplayData data = this.replay.getData(); int duration = data.getDuration(); this.session.setStart(watcher.getLocation()); + SpawnData spawnData = null; if (data.getActions().containsKey(0)) { for (ActionData startData : data.getActions().get(0)) { if (startData.getPacketData() instanceof SpawnData) { - SpawnData spawnData = (SpawnData) startData.getPacketData(); - watcher.teleport(LocationData.toLocation(spawnData.getLocation())); + spawnData = (SpawnData) startData.getPacketData(); break; } } } else { - Optional spawnData = findFirstSpawn(data); - if (spawnData.isPresent()) watcher.teleport(LocationData.toLocation(spawnData.get().getLocation())); + spawnData = findFirstSpawn(data).orElse(null); + } + + if (spawnData != null && !spawnData.getLocation().isValidWorld()) { + sendMessage("§cThe world for this Replay does not exist or is not loaded. (" + spawnData.getLocation().getWorld() + ")"); + return false; + } + + ReplayHelper.replaySessions.put(watcher.getName(), this); + + if (spawnData != null) { + watcher.teleport(LocationData.toLocation(spawnData.getLocation())); } - this.session.startSession(); this.speed = 1; @@ -128,7 +135,8 @@ public void run() { }; this.run.runTaskTimerAsynchronously(ReplaySystem.getInstance(), 1, 1); - + + return true; } public void executeTick(int tick, ReplayingMode mode) { diff --git a/src/main/java/me/jumper251/replay/replaysystem/replaying/ReplayingUtils.java b/src/main/java/me/jumper251/replay/replaysystem/replaying/ReplayingUtils.java index a20e073e..728e3e4d 100644 --- a/src/main/java/me/jumper251/replay/replaysystem/replaying/ReplayingUtils.java +++ b/src/main/java/me/jumper251/replay/replaysystem/replaying/ReplayingUtils.java @@ -18,6 +18,7 @@ import me.jumper251.replay.replaysystem.utils.MetadataBuilder; import me.jumper251.replay.replaysystem.utils.NPCManager; import me.jumper251.replay.replaysystem.utils.entities.*; +import me.jumper251.replay.utils.LogUtils; import me.jumper251.replay.utils.version.MaterialBridge; import me.jumper251.replay.utils.MathUtils; import me.jumper251.replay.utils.VersionUtil; @@ -312,6 +313,10 @@ public void handleAction(ActionData action, ReplayData data, ReplayingMode mode) if (action.getPacketData() instanceof WorldChangeData) { WorldChangeData worldChange = (WorldChangeData) action.getPacketData(); + if (!worldChange.getLocation().isValidWorld()) { + LogUtils.log("Skipping invalid world: " + worldChange.getLocation().getWorld()); + return; + } Location loc = LocationData.toLocation(worldChange.getLocation()); npc.despawn(); @@ -319,7 +324,7 @@ public void handleAction(ActionData action, ReplayData data, ReplayingMode mode) npc.setLocation(loc); npc.respawn(replayer.getWatchingPlayer()); - + } if (action.getPacketData() instanceof FishingData) { diff --git a/src/main/java/me/jumper251/replay/replaysystem/replaying/session/ReplaySession.java b/src/main/java/me/jumper251/replay/replaysystem/replaying/session/ReplaySession.java index 906b1447..f19791a2 100644 --- a/src/main/java/me/jumper251/replay/replaysystem/replaying/session/ReplaySession.java +++ b/src/main/java/me/jumper251/replay/replaysystem/replaying/session/ReplaySession.java @@ -46,6 +46,8 @@ public ReplaySession(Replayer replayer) { } public void startSession() { + this.packetListener.register(); + this.content = this.player.getInventory().getContents(); if (this.start == null) { this.start = this.player.getLocation();