From 262ef0c0c408ffaab227ae4ce592e5db4f9ca563 Mon Sep 17 00:00:00 2001 From: BehrRiley Date: Wed, 22 Jul 2026 05:40:33 -0400 Subject: [PATCH 1/3] fix look command `offthread_repeat` math and mounted rotation --- .../scripts/commands/entity/LookCommand.java | 100 +++++++++++++----- .../commands/entity/TeleportCommand.java | 44 +++++++- 2 files changed, 110 insertions(+), 34 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/LookCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/LookCommand.java index 2515dc1d84..89ea5b147b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/LookCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/LookCommand.java @@ -125,10 +125,16 @@ public static void autoExecute(ScriptEntry scriptEntry, final float pitchRaw = pitch == null ? 0 : pitch.asFloat(); for (EntityTag entity : entities) { if (entity.isSpawned()) { - if (loc != null) { - NMSHandler.entityHelper.faceLocation(entity.getBukkitEntity(), loc); + org.bukkit.entity.Entity bukkitEntity = entity.getBukkitEntity(); + org.bukkit.entity.Entity vehicle = bukkitEntity.getVehicle(); + + if (vehicle != null) { + bukkitEntity.leaveVehicle(); } - else { + + if (loc != null) { + NMSHandler.entityHelper.faceLocation(bukkitEntity, loc); + } else { if (entity.isPlayer()) { Location playerTeleDest = entity.getLocation().clone(); float relYaw = (yawRaw - playerTeleDest.getYaw()) % 360; @@ -140,33 +146,60 @@ public static void autoExecute(ScriptEntry scriptEntry, playerTeleDest.setYaw(yawRaw); playerTeleDest.setPitch(pitchRaw); Player player = entity.getPlayer(); - if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { - NetworkInterceptHelper.enable(); - NMSHandler.packetHelper.sendRelativeLookPacket(player, actualRelYaw, relPitch); - } - else { + + if (vehicle != null) { PaperAPITools.instance.teleport(player, playerTeleDest, PlayerTeleportEvent.TeleportCause.PLUGIN, null, Arrays.asList(TeleportCommand.Relative.values())); - } - if (offthreadRepeats != null) { - NetworkInterceptHelper.enable(); - int times = offthreadRepeats.asInt(); - int ms = 50 / (times + 1); - DenizenCore.runAsync(() -> { - try { - for (int i = 0; i < times; i++) { - Thread.sleep(ms); - NMSHandler.packetHelper.sendRelativeLookPacket(player, actualRelYaw, relPitch); + } else { + final int times = offthreadRepeats != null ? offthreadRepeats.asInt() : 0; + final float stepYaw = times > 0 ? actualRelYaw / (times + 1) : actualRelYaw; + final float stepPitch = times > 0 ? relPitch / (times + 1) : relPitch; + + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { + NetworkInterceptHelper.enable(); + NMSHandler.packetHelper.sendRelativeLookPacket(player, stepYaw, stepPitch); + } else { + PaperAPITools.instance.teleport(player, playerTeleDest, PlayerTeleportEvent.TeleportCause.PLUGIN, null, Arrays.asList(TeleportCommand.Relative.values())); + } + + if (offthreadRepeats != null) { + NetworkInterceptHelper.enable(); + int ms = 50 / (times + 1); + DenizenCore.runAsync(() -> { + try { + for (int i = 0; i < times; i++) { + Thread.sleep(ms); + NMSHandler.packetHelper.sendRelativeLookPacket(player, stepYaw, stepPitch); + } + } catch (Throwable ex) { + Debug.echoError(ex); } - } - catch (Throwable ex) { - Debug.echoError(ex); - } - }); + }); + } } + } else { + NMSHandler.entityHelper.rotate(bukkitEntity, yawRaw, pitchRaw); } - else { - NMSHandler.entityHelper.rotate(entity.getBukkitEntity(), yawRaw, pitchRaw); + } + + if (vehicle != null) { + Location vLoc = vehicle.getLocation().clone(); + if (loc != null) { + org.bukkit.util.Vector dir = loc.toVector().subtract(vLoc.toVector()); + if (dir.lengthSquared() > 0) { + vLoc.setDirection(dir); + } + } else { + vLoc.setYaw(yawRaw); + vLoc.setPitch(pitchRaw); } + + vehicle.teleport(vLoc, PlayerTeleportEvent.TeleportCause.PLUGIN); + + org.bukkit.Bukkit.getScheduler().runTask(com.denizenscript.denizen.Denizen.getInstance(), () -> { + if (vehicle.isValid() && bukkitEntity.isValid()) { + vehicle.addPassenger(bukkitEntity); + } + }); } } } @@ -174,6 +207,7 @@ public static void autoExecute(ScriptEntry scriptEntry, for (EntityTag entity : entities) { BukkitRunnable task = new BukkitRunnable() { long bounces = 0; + public void run() { bounces++; if (bounces > duration.getTicks()) { @@ -182,11 +216,19 @@ public void run() { return; } if (entity.isSpawned()) { + org.bukkit.entity.Entity target = entity.getBukkitEntity(); + org.bukkit.entity.Entity vehicle = target.getVehicle(); + if (loc != null) { - NMSHandler.entityHelper.faceLocation(entity.getBukkitEntity(), loc); - } - else { - NMSHandler.entityHelper.rotate(entity.getBukkitEntity(), yawRaw, pitchRaw); + NMSHandler.entityHelper.faceLocation(target, loc); + if (vehicle != null) { + NMSHandler.entityHelper.faceLocation(vehicle, loc); + } + } else { + NMSHandler.entityHelper.rotate(target, yawRaw, pitchRaw); + if (vehicle != null) { + NMSHandler.entityHelper.rotate(vehicle, yawRaw, pitchRaw); + } } } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/TeleportCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/TeleportCommand.java index 616b2cc591..a3ae0b2b42 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/TeleportCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/TeleportCommand.java @@ -153,9 +153,23 @@ else if (entityList.identify().startsWith("l@")) { // Compensate for legacy enti Debug.echoError("Cannot interpret object '" + entityObj + "' as an EntityTag."); continue; } + org.bukkit.entity.Entity bukkitEntity = entity.getBukkitEntity(); + org.bukkit.entity.Entity vehicle = bukkitEntity.getVehicle(); + if (vehicle != null) { + bukkitEntity.leaveVehicle(); + } + if (entity.isFake && entity.getWorld().equals(location.getWorld())) { - NMSHandler.entityHelper.snapPositionTo(entity.getBukkitEntity(), location.toVector()); - NMSHandler.entityHelper.look(entity.getBukkitEntity(), location.getYaw(), location.getPitch()); + NMSHandler.entityHelper.snapPositionTo(bukkitEntity, location.toVector()); + NMSHandler.entityHelper.look(bukkitEntity, location.getYaw(), location.getPitch()); + if (vehicle != null) { + vehicle.teleport(location, cause); + org.bukkit.Bukkit.getScheduler().runTask(com.denizenscript.denizen.Denizen.getInstance(), () -> { + if (vehicle.isValid() && bukkitEntity.isValid()) { + vehicle.addPassenger(bukkitEntity); + } + }); + } return; } if (offthreadRepeats != null && relativeAxes != null && entity.isPlayer()) { @@ -187,6 +201,16 @@ else if (entityList.identify().startsWith("l@")) { // Compensate for legacy enti } List finalRelativeAxes = relativeAxes; NMSHandler.packetHelper.sendRelativePositionPacket(player, x, y, z, yaw, pitch, finalRelativeAxes); + + if (vehicle != null) { + vehicle.teleport(location, cause); + org.bukkit.Bukkit.getScheduler().runTask(com.denizenscript.denizen.Denizen.getInstance(), () -> { + if (vehicle.isValid() && bukkitEntity.isValid()) { + vehicle.addPassenger(bukkitEntity); + } + }); + } + DenizenCore.runAsync(() -> { try { for (int i = 0; i < times - 1; i++) { @@ -201,10 +225,20 @@ else if (entityList.identify().startsWith("l@")) { // Compensate for legacy enti continue; } if (entityOptions != null || relativeAxes != null) { - PaperAPITools.instance.teleport(entity.getBukkitEntity(), location, cause, entityOptions, relativeAxes); - continue; + PaperAPITools.instance.teleport(bukkitEntity, location, cause, entityOptions, relativeAxes); + } + else { + entity.teleport(location, cause); + } + + if (vehicle != null) { + vehicle.teleport(location, cause); + org.bukkit.Bukkit.getScheduler().runTask(com.denizenscript.denizen.Denizen.getInstance(), () -> { + if (vehicle.isValid() && bukkitEntity.isValid()) { + vehicle.addPassenger(bukkitEntity); + } + }); } - entity.teleport(location, cause); } } } From d0f839e11e5dd6fac2844667c30c46f7fb859545 Mon Sep 17 00:00:00 2001 From: BehrRiley Date: Wed, 22 Jul 2026 12:26:07 -0400 Subject: [PATCH 2/3] review revisions - refactor LookCommand `FQN`s and control flow - format brackets and remove `FQN`s in `LookCommand` --- .../scripts/commands/entity/LookCommand.java | 102 ++++++++++-------- 1 file changed, 55 insertions(+), 47 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/LookCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/LookCommand.java index 89ea5b147b..50de0d3a62 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/LookCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/LookCommand.java @@ -23,11 +23,14 @@ import com.denizenscript.denizencore.scripts.commands.generator.ArgPrefixed; import com.denizenscript.denizencore.utilities.Deprecations; import com.denizenscript.denizencore.utilities.debugging.Debug; +import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; +import org.bukkit.util.Vector; import java.util.Arrays; import java.util.HashMap; @@ -125,8 +128,8 @@ public static void autoExecute(ScriptEntry scriptEntry, final float pitchRaw = pitch == null ? 0 : pitch.asFloat(); for (EntityTag entity : entities) { if (entity.isSpawned()) { - org.bukkit.entity.Entity bukkitEntity = entity.getBukkitEntity(); - org.bukkit.entity.Entity vehicle = bukkitEntity.getVehicle(); + Entity bukkitEntity = entity.getBukkitEntity(); + Entity vehicle = bukkitEntity.getVehicle(); if (vehicle != null) { bukkitEntity.leaveVehicle(); @@ -134,68 +137,72 @@ public static void autoExecute(ScriptEntry scriptEntry, if (loc != null) { NMSHandler.entityHelper.faceLocation(bukkitEntity, loc); - } else { - if (entity.isPlayer()) { - Location playerTeleDest = entity.getLocation().clone(); - float relYaw = (yawRaw - playerTeleDest.getYaw()) % 360; - if (relYaw > 180) { - relYaw -= 360; + } + else if (entity.isPlayer()) { + Location playerTeleDest = entity.getLocation().clone(); + float relYaw = (yawRaw - playerTeleDest.getYaw()) % 360; + if (relYaw > 180) { + relYaw -= 360; + } + final float actualRelYaw = relYaw; + float relPitch = pitchRaw - playerTeleDest.getPitch(); + playerTeleDest.setYaw(yawRaw); + playerTeleDest.setPitch(pitchRaw); + Player player = entity.getPlayer(); + + if (vehicle != null) { + PaperAPITools.instance.teleport(player, playerTeleDest, PlayerTeleportEvent.TeleportCause.PLUGIN, null, Arrays.asList(TeleportCommand.Relative.values())); + } + else { + final int times = offthreadRepeats != null ? offthreadRepeats.asInt() : 0; + final float stepYaw = times > 0 ? actualRelYaw / (times + 1) : actualRelYaw; + final float stepPitch = times > 0 ? relPitch / (times + 1) : relPitch; + + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { + NetworkInterceptHelper.enable(); + NMSHandler.packetHelper.sendRelativeLookPacket(player, stepYaw, stepPitch); } - final float actualRelYaw = relYaw; - float relPitch = pitchRaw - playerTeleDest.getPitch(); - playerTeleDest.setYaw(yawRaw); - playerTeleDest.setPitch(pitchRaw); - Player player = entity.getPlayer(); - - if (vehicle != null) { + else { PaperAPITools.instance.teleport(player, playerTeleDest, PlayerTeleportEvent.TeleportCause.PLUGIN, null, Arrays.asList(TeleportCommand.Relative.values())); - } else { - final int times = offthreadRepeats != null ? offthreadRepeats.asInt() : 0; - final float stepYaw = times > 0 ? actualRelYaw / (times + 1) : actualRelYaw; - final float stepPitch = times > 0 ? relPitch / (times + 1) : relPitch; - - if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_19)) { - NetworkInterceptHelper.enable(); - NMSHandler.packetHelper.sendRelativeLookPacket(player, stepYaw, stepPitch); - } else { - PaperAPITools.instance.teleport(player, playerTeleDest, PlayerTeleportEvent.TeleportCause.PLUGIN, null, Arrays.asList(TeleportCommand.Relative.values())); - } + } - if (offthreadRepeats != null) { - NetworkInterceptHelper.enable(); - int ms = 50 / (times + 1); - DenizenCore.runAsync(() -> { - try { - for (int i = 0; i < times; i++) { - Thread.sleep(ms); - NMSHandler.packetHelper.sendRelativeLookPacket(player, stepYaw, stepPitch); - } - } catch (Throwable ex) { - Debug.echoError(ex); + if (offthreadRepeats != null) { + NetworkInterceptHelper.enable(); + int ms = 50 / (times + 1); + DenizenCore.runAsync(() -> { + try { + for (int i = 0; i < times; i++) { + Thread.sleep(ms); + NMSHandler.packetHelper.sendRelativeLookPacket(player, stepYaw, stepPitch); } - }); - } + } + catch (Throwable ex) { + Debug.echoError(ex); + } + }); } - } else { - NMSHandler.entityHelper.rotate(bukkitEntity, yawRaw, pitchRaw); } } + else { + NMSHandler.entityHelper.rotate(bukkitEntity, yawRaw, pitchRaw); + } if (vehicle != null) { Location vLoc = vehicle.getLocation().clone(); if (loc != null) { - org.bukkit.util.Vector dir = loc.toVector().subtract(vLoc.toVector()); + Vector dir = loc.toVector().subtract(vLoc.toVector()); if (dir.lengthSquared() > 0) { vLoc.setDirection(dir); } - } else { + } + else { vLoc.setYaw(yawRaw); vLoc.setPitch(pitchRaw); } vehicle.teleport(vLoc, PlayerTeleportEvent.TeleportCause.PLUGIN); - org.bukkit.Bukkit.getScheduler().runTask(com.denizenscript.denizen.Denizen.getInstance(), () -> { + Bukkit.getScheduler().runTask(Denizen.getInstance(), () -> { if (vehicle.isValid() && bukkitEntity.isValid()) { vehicle.addPassenger(bukkitEntity); } @@ -216,15 +223,16 @@ public void run() { return; } if (entity.isSpawned()) { - org.bukkit.entity.Entity target = entity.getBukkitEntity(); - org.bukkit.entity.Entity vehicle = target.getVehicle(); + Entity target = entity.getBukkitEntity(); + Entity vehicle = target.getVehicle(); if (loc != null) { NMSHandler.entityHelper.faceLocation(target, loc); if (vehicle != null) { NMSHandler.entityHelper.faceLocation(vehicle, loc); } - } else { + } + else { NMSHandler.entityHelper.rotate(target, yawRaw, pitchRaw); if (vehicle != null) { NMSHandler.entityHelper.rotate(vehicle, yawRaw, pitchRaw); From e04da2fca8941dab04d49215a18a924a210faba5 Mon Sep 17 00:00:00 2001 From: BehrRiley Date: Wed, 22 Jul 2026 12:37:17 -0400 Subject: [PATCH 3/3] clean up `FQN`s and formatting in `TeleportCommand` as well --- .../scripts/commands/entity/TeleportCommand.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/TeleportCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/TeleportCommand.java index a3ae0b2b42..3d8077f847 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/TeleportCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/TeleportCommand.java @@ -1,5 +1,6 @@ package com.denizenscript.denizen.scripts.commands.entity; +import com.denizenscript.denizen.Denizen; import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.LocationTag; @@ -19,6 +20,8 @@ import com.denizenscript.denizencore.utilities.Deprecations; import com.denizenscript.denizencore.utilities.debugging.Debug; import net.citizensnpcs.trait.CurrentLocation; +import org.bukkit.Bukkit; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.util.Vector; @@ -153,8 +156,8 @@ else if (entityList.identify().startsWith("l@")) { // Compensate for legacy enti Debug.echoError("Cannot interpret object '" + entityObj + "' as an EntityTag."); continue; } - org.bukkit.entity.Entity bukkitEntity = entity.getBukkitEntity(); - org.bukkit.entity.Entity vehicle = bukkitEntity.getVehicle(); + Entity bukkitEntity = entity.getBukkitEntity(); + Entity vehicle = bukkitEntity.getVehicle(); if (vehicle != null) { bukkitEntity.leaveVehicle(); } @@ -164,7 +167,7 @@ else if (entityList.identify().startsWith("l@")) { // Compensate for legacy enti NMSHandler.entityHelper.look(bukkitEntity, location.getYaw(), location.getPitch()); if (vehicle != null) { vehicle.teleport(location, cause); - org.bukkit.Bukkit.getScheduler().runTask(com.denizenscript.denizen.Denizen.getInstance(), () -> { + Bukkit.getScheduler().runTask(Denizen.getInstance(), () -> { if (vehicle.isValid() && bukkitEntity.isValid()) { vehicle.addPassenger(bukkitEntity); } @@ -204,7 +207,7 @@ else if (entityList.identify().startsWith("l@")) { // Compensate for legacy enti if (vehicle != null) { vehicle.teleport(location, cause); - org.bukkit.Bukkit.getScheduler().runTask(com.denizenscript.denizen.Denizen.getInstance(), () -> { + Bukkit.getScheduler().runTask(Denizen.getInstance(), () -> { if (vehicle.isValid() && bukkitEntity.isValid()) { vehicle.addPassenger(bukkitEntity); } @@ -233,7 +236,7 @@ else if (entityList.identify().startsWith("l@")) { // Compensate for legacy enti if (vehicle != null) { vehicle.teleport(location, cause); - org.bukkit.Bukkit.getScheduler().runTask(com.denizenscript.denizen.Denizen.getInstance(), () -> { + Bukkit.getScheduler().runTask(Denizen.getInstance(), () -> { if (vehicle.isValid() && bukkitEntity.isValid()) { vehicle.addPassenger(bukkitEntity); }