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..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,37 +128,52 @@ public static void autoExecute(ScriptEntry scriptEntry, final float pitchRaw = pitch == null ? 0 : pitch.asFloat(); for (EntityTag entity : entities) { if (entity.isSpawned()) { + Entity bukkitEntity = entity.getBukkitEntity(); + Entity vehicle = bukkitEntity.getVehicle(); + + if (vehicle != null) { + bukkitEntity.leaveVehicle(); + } + if (loc != null) { - NMSHandler.entityHelper.faceLocation(entity.getBukkitEntity(), loc); + 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; - } - final float actualRelYaw = relYaw; - float relPitch = pitchRaw - playerTeleDest.getPitch(); - playerTeleDest.setYaw(yawRaw); - playerTeleDest.setPitch(pitchRaw); - Player player = entity.getPlayer(); + 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, actualRelYaw, relPitch); + 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 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); + NMSHandler.packetHelper.sendRelativeLookPacket(player, stepYaw, stepPitch); } } catch (Throwable ex) { @@ -164,9 +182,31 @@ public static void autoExecute(ScriptEntry scriptEntry, }); } } + } + else { + NMSHandler.entityHelper.rotate(bukkitEntity, yawRaw, pitchRaw); + } + + if (vehicle != null) { + Location vLoc = vehicle.getLocation().clone(); + if (loc != null) { + Vector dir = loc.toVector().subtract(vLoc.toVector()); + if (dir.lengthSquared() > 0) { + vLoc.setDirection(dir); + } + } else { - NMSHandler.entityHelper.rotate(entity.getBukkitEntity(), yawRaw, pitchRaw); + vLoc.setYaw(yawRaw); + vLoc.setPitch(pitchRaw); } + + vehicle.teleport(vLoc, PlayerTeleportEvent.TeleportCause.PLUGIN); + + Bukkit.getScheduler().runTask(Denizen.getInstance(), () -> { + if (vehicle.isValid() && bukkitEntity.isValid()) { + vehicle.addPassenger(bukkitEntity); + } + }); } } } @@ -174,6 +214,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 +223,20 @@ public void run() { return; } if (entity.isSpawned()) { + Entity target = entity.getBukkitEntity(); + Entity vehicle = target.getVehicle(); + if (loc != null) { - NMSHandler.entityHelper.faceLocation(entity.getBukkitEntity(), loc); + NMSHandler.entityHelper.faceLocation(target, loc); + if (vehicle != null) { + NMSHandler.entityHelper.faceLocation(vehicle, loc); + } } else { - NMSHandler.entityHelper.rotate(entity.getBukkitEntity(), yawRaw, pitchRaw); + 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..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,9 +156,23 @@ else if (entityList.identify().startsWith("l@")) { // Compensate for legacy enti Debug.echoError("Cannot interpret object '" + entityObj + "' as an EntityTag."); continue; } + Entity bukkitEntity = entity.getBukkitEntity(); + 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); + Bukkit.getScheduler().runTask(Denizen.getInstance(), () -> { + if (vehicle.isValid() && bukkitEntity.isValid()) { + vehicle.addPassenger(bukkitEntity); + } + }); + } return; } if (offthreadRepeats != null && relativeAxes != null && entity.isPlayer()) { @@ -187,6 +204,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); + Bukkit.getScheduler().runTask(Denizen.getInstance(), () -> { + if (vehicle.isValid() && bukkitEntity.isValid()) { + vehicle.addPassenger(bukkitEntity); + } + }); + } + DenizenCore.runAsync(() -> { try { for (int i = 0; i < times - 1; i++) { @@ -201,10 +228,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); + Bukkit.getScheduler().runTask(Denizen.getInstance(), () -> { + if (vehicle.isValid() && bukkitEntity.isValid()) { + vehicle.addPassenger(bukkitEntity); + } + }); } - entity.teleport(location, cause); } } }