From 8d63f62fae2bf86eecd9cb08c0d155199ead6946 Mon Sep 17 00:00:00 2001 From: JonDeschenes <39345951+JonDeschenes@users.noreply.github.com> Date: Tue, 9 Dec 2025 21:46:02 -0500 Subject: [PATCH 1/2] Teleport spectators to target world when starting spectating --- .../com/hpfxd/spectatorplus/paper/SpectatorWorkarounds.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/paper/src/main/java/com/hpfxd/spectatorplus/paper/SpectatorWorkarounds.java b/paper/src/main/java/com/hpfxd/spectatorplus/paper/SpectatorWorkarounds.java index fecb9d3..e0073a9 100644 --- a/paper/src/main/java/com/hpfxd/spectatorplus/paper/SpectatorWorkarounds.java +++ b/paper/src/main/java/com/hpfxd/spectatorplus/paper/SpectatorWorkarounds.java @@ -140,6 +140,10 @@ public void onStartSpectating(PlayerStartSpectatingEntityEvent event) { final Player spectator = event.getPlayer(); final Entity target = event.getNewSpectatorTarget(); + if (!spectator.getWorld().equals(target.getWorld())) { + spectator.teleport(target, PlayerTeleportEvent.TeleportCause.SPECTATE); + } + if (!target.getTrackedBy().contains(spectator)) { this.tempTargets.put(spectator.getUniqueId(), target.getUniqueId()); } From e514de88377d3bc0dcfd9fe1f8a4e4aade29f508 Mon Sep 17 00:00:00 2001 From: JonDeschenes <39345951+JonDeschenes@users.noreply.github.com> Date: Tue, 9 Dec 2025 21:50:07 -0500 Subject: [PATCH 2/2] Keep spectator rotation aligned with target --- .../spectatorplus/paper/SpectatorWorkarounds.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/paper/src/main/java/com/hpfxd/spectatorplus/paper/SpectatorWorkarounds.java b/paper/src/main/java/com/hpfxd/spectatorplus/paper/SpectatorWorkarounds.java index e0073a9..b81ce74 100644 --- a/paper/src/main/java/com/hpfxd/spectatorplus/paper/SpectatorWorkarounds.java +++ b/paper/src/main/java/com/hpfxd/spectatorplus/paper/SpectatorWorkarounds.java @@ -6,6 +6,7 @@ import io.papermc.paper.event.player.PlayerTrackEntityEvent; import io.papermc.paper.event.player.PlayerUntrackEntityEvent; import org.bukkit.Bukkit; +import org.bukkit.Location; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -41,9 +42,11 @@ private void updateSpectatorPositions() { if (target != null) { if (spectator.getWorld().equals(target.getWorld())) { + final Location targetLocation = target.getLocation(); + if (!this.directTeleportFailed) { try { - ReflectionUtil.directTeleport(spectator, target.getLocation()); + ReflectionUtil.directTeleport(spectator, targetLocation); } catch (Throwable e) { this.directTeleportFailed = true; this.plugin.getSLF4JLogger().warn("auto-update-position workaround: Failed to call directTeleport, will not try again", e); @@ -57,6 +60,8 @@ private void updateSpectatorPositions() { spectator.setSpectatorTarget(null); spectator.setSpectatorTarget(target); } + + spectator.setRotation(targetLocation.getYaw(), targetLocation.getPitch()); } } } @@ -140,10 +145,14 @@ public void onStartSpectating(PlayerStartSpectatingEntityEvent event) { final Player spectator = event.getPlayer(); final Entity target = event.getNewSpectatorTarget(); + final Location targetLocation = target.getLocation(); + if (!spectator.getWorld().equals(target.getWorld())) { - spectator.teleport(target, PlayerTeleportEvent.TeleportCause.SPECTATE); + spectator.teleport(targetLocation, PlayerTeleportEvent.TeleportCause.SPECTATE); } + spectator.setRotation(targetLocation.getYaw(), targetLocation.getPitch()); + if (!target.getTrackedBy().contains(spectator)) { this.tempTargets.put(spectator.getUniqueId(), target.getUniqueId()); }