From 3b0ffe03a7f330f3ef909d4023e57f0ed435ec0d Mon Sep 17 00:00:00 2001 From: Jumper251 Date: Mon, 24 Jun 2024 12:16:38 +0200 Subject: [PATCH] Improve fishing hook replaying --- .../replaysystem/data/types/FishingData.java | 8 +++++- .../recording/PacketRecorder.java | 12 +++++++-- .../replaysystem/replaying/Replayer.java | 12 ++++----- .../replaysystem/replaying/ReplayingMode.java | 7 ++++++ .../replaying/ReplayingUtils.java | 25 +++++++++++++------ 5 files changed, 48 insertions(+), 16 deletions(-) create mode 100644 src/main/java/me/jumper251/replay/replaysystem/replaying/ReplayingMode.java diff --git a/src/main/java/me/jumper251/replay/replaysystem/data/types/FishingData.java b/src/main/java/me/jumper251/replay/replaysystem/data/types/FishingData.java index 05fc3027..0291e408 100644 --- a/src/main/java/me/jumper251/replay/replaysystem/data/types/FishingData.java +++ b/src/main/java/me/jumper251/replay/replaysystem/data/types/FishingData.java @@ -13,13 +13,16 @@ public class FishingData extends PacketData { private double x, y, z; private int id; + + private String owner; - public FishingData(int id, LocationData location, double x, double y, double z) { + public FishingData(int id, LocationData location, double x, double y, double z, String owner) { this.location = location; this.x = x; this.y = y; this.z = z; this.id = id; + this.owner = owner; } public LocationData getLocation() { @@ -42,4 +45,7 @@ public int getId() { return id; } + public String getOwner() { + return owner; + } } diff --git a/src/main/java/me/jumper251/replay/replaysystem/recording/PacketRecorder.java b/src/main/java/me/jumper251/replay/replaysystem/recording/PacketRecorder.java index dac50aa3..3ddd284c 100644 --- a/src/main/java/me/jumper251/replay/replaysystem/recording/PacketRecorder.java +++ b/src/main/java/me/jumper251/replay/replaysystem/recording/PacketRecorder.java @@ -195,10 +195,18 @@ public void onPacketSending(PacketEvent event) { } if ((type == 90 || (VersionUtil.isAbove(VersionEnum.V1_14) && event.getPacket().getEntityTypeModifier().read(0) == EntityType.FISHING_HOOK)) && !spawnedHooks.contains(packet.getEntityID())) { + int throwerId = VersionUtil.isCompatible(VersionEnum.V1_8) ? oldPacket.getObjectData() : packet.getObjectData(); + + String ownerName = Bukkit.getOnlinePlayers().stream() + .filter(player -> (player.getWorld().getName().equals(p.getWorld().getName()) && player.getEntityId() == throwerId)) + .findFirst() + .map(Player::getName) + .orElse(null); + if (VersionUtil.isCompatible(VersionEnum.V1_8)) { - addData(p.getName(), new FishingData(oldPacket.getEntityID(), location, oldPacket.getOptionalSpeedX(), oldPacket.getOptionalSpeedY(), oldPacket.getOptionalSpeedZ())); + addData(p.getName(), new FishingData(oldPacket.getEntityID(), location, oldPacket.getOptionalSpeedX(), oldPacket.getOptionalSpeedY(), oldPacket.getOptionalSpeedZ(), ownerName)); } else { - addData(p.getName(), new FishingData(packet.getEntityID(), location, packet.getOptionalSpeedX(), packet.getOptionalSpeedY(), packet.getOptionalSpeedZ())); + addData(p.getName(), new FishingData(packet.getEntityID(), location, packet.getOptionalSpeedX(), packet.getOptionalSpeedY(), packet.getOptionalSpeedZ(), ownerName)); } spawnedHooks.add(packet.getEntityID()); } 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 70046e63..60850ae7 100644 --- a/src/main/java/me/jumper251/replay/replaysystem/replaying/Replayer.java +++ b/src/main/java/me/jumper251/replay/replaysystem/replaying/Replayer.java @@ -98,7 +98,7 @@ public void start() { this.speed = 1; - executeTick(0, false); + executeTick(0, ReplayingMode.PLAYING); this.run = new BukkitRunnable() { @@ -112,10 +112,10 @@ public void run() { if (currentTicks < duration) { - executeTick(currentTicks++, false); + executeTick(currentTicks++, ReplayingMode.PLAYING); if ((currentTicks + 2) < duration && speed == 2) { - executeTick(currentTicks++, false); + executeTick(currentTicks++, ReplayingMode.PLAYING); } @@ -130,8 +130,8 @@ public void run() { this.run.runTaskTimerAsynchronously(ReplaySystem.getInstance(), 1, 1); } - - public void executeTick(int tick, boolean reversed) { + + public void executeTick(int tick, ReplayingMode mode) { ReplayData data = this.replay.getData(); if (!data.getActions().isEmpty() && data.getActions().containsKey(tick)) { @@ -141,7 +141,7 @@ public void executeTick(int tick, boolean reversed) { List list = data.getActions().get(tick); for (ActionData action : list) { - utils.handleAction(action, data, reversed); + utils.handleAction(action, data, mode); if (action.getType() == ActionType.CUSTOM) { if (ReplayAPI.getInstance().getHookManager().isRegistered()) { diff --git a/src/main/java/me/jumper251/replay/replaysystem/replaying/ReplayingMode.java b/src/main/java/me/jumper251/replay/replaysystem/replaying/ReplayingMode.java new file mode 100644 index 00000000..448fb59e --- /dev/null +++ b/src/main/java/me/jumper251/replay/replaysystem/replaying/ReplayingMode.java @@ -0,0 +1,7 @@ +package me.jumper251.replay.replaysystem.replaying; + +public enum ReplayingMode { + PLAYING, + FORWARD, + REVERSED +} 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 590660a9..89c806a7 100644 --- a/src/main/java/me/jumper251/replay/replaysystem/replaying/ReplayingUtils.java +++ b/src/main/java/me/jumper251/replay/replaysystem/replaying/ReplayingUtils.java @@ -79,7 +79,9 @@ public ReplayingUtils(Replayer replayer) { this.signatures = new HashMap<>(); } - public void handleAction(ActionData action, ReplayData data, boolean reversed) { + public void handleAction(ActionData action, ReplayData data, ReplayingMode mode) { + boolean reversed = mode == ReplayingMode.REVERSED; + if (action.getType() == ActionType.SPAWN) { if (!reversed) { spawnNPC(action); @@ -313,8 +315,17 @@ public void handleAction(ActionData action, ReplayData data, boolean reversed) { if (action.getPacketData() instanceof FishingData) { FishingData fishing = (FishingData) action.getPacketData(); - spawnProjectile(null, fishing, replayer.getWatchingPlayer().getWorld(), npc.getId()); - + int ownerId = replayer.getNPCList().getOrDefault(fishing.getOwner(), npc).getId(); + + if (mode == ReplayingMode.PLAYING) { + spawnProjectile(null, fishing, replayer.getWatchingPlayer().getWorld(), ownerId); + } + + if (reversed && hooks.containsKey(fishing.getId())) { + despawn(null, new int[] { hooks.get(fishing.getId()) }); + hooks.remove(fishing.getId()); + + } } if (action.getPacketData() instanceof VelocityData) { @@ -381,7 +392,7 @@ public void forward() { } for (int i = currentTick; i < forwardTicks; i++) { - this.replayer.executeTick(i, false); + this.replayer.executeTick(i, ReplayingMode.FORWARD); } this.replayer.setCurrentTicks(forwardTicks); this.replayer.setPaused(paused); @@ -399,7 +410,7 @@ public void backward() { } for (int i = currentTick; i > backwardTicks; i--) { - this.replayer.executeTick(i, true); + this.replayer.executeTick(i, ReplayingMode.REVERSED); } this.replayer.setCurrentTicks(backwardTicks); this.replayer.setPaused(paused); @@ -413,7 +424,7 @@ public void jumpTo(Integer seconds) { if ((targetTicks - 2) > 0) { for (int i = currentTick; i > targetTicks; i--) { - this.replayer.executeTick(i, true); + this.replayer.executeTick(i, ReplayingMode.REVERSED); } this.replayer.setCurrentTicks(targetTicks); @@ -425,7 +436,7 @@ public void jumpTo(Integer seconds) { if ((targetTicks + 2) < duration) { for (int i = currentTick; i < targetTicks; i++) { - this.replayer.executeTick(i, false); + this.replayer.executeTick(i, ReplayingMode.FORWARD); } this.replayer.setCurrentTicks(targetTicks); this.replayer.setPaused(false);