From 5f4a90aabbc46850dad2b4de7722da587d506335 Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Wed, 9 Feb 2022 16:23:45 +0100 Subject: [PATCH] Gives all passengers the same exit velocity as the root vehicle --- .../portal/teleporter/PlayerTeleporter.java | 8 +++++--- .../stargate/portal/teleporter/Teleporter.java | 4 +++- .../portal/teleporter/VehicleTeleporter.java | 6 ++++-- .../knarcraft/stargate/utility/TeleportHelper.java | 14 ++++++++++---- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/main/java/net/knarcraft/stargate/portal/teleporter/PlayerTeleporter.java b/src/main/java/net/knarcraft/stargate/portal/teleporter/PlayerTeleporter.java index 12b7f55..4c936bc 100644 --- a/src/main/java/net/knarcraft/stargate/portal/teleporter/PlayerTeleporter.java +++ b/src/main/java/net/knarcraft/stargate/portal/teleporter/PlayerTeleporter.java @@ -49,6 +49,10 @@ public class PlayerTeleporter extends Teleporter { } } + //Calculate the exit velocity of the player + Vector newVelocityDirection = DirectionHelper.getDirectionVectorFromYaw(portal.getYaw()); + Vector newVelocity = newVelocityDirection.multiply(velocity * Stargate.getGateConfig().getExitVelocity()); + //Load chunks to make sure not to teleport to the void loadChunks(); @@ -56,7 +60,7 @@ public class PlayerTeleporter extends Teleporter { TeleportHelper.teleportLeashedCreatures(player, origin, portal); if (player.eject()) { - TeleportHelper.handleEntityPassengers(passengers, player, origin, portal, exit.getDirection()); + TeleportHelper.handleEntityPassengers(passengers, player, origin, portal, exit.getDirection(), newVelocity); } //If no event is passed in, assume it's a teleport, and act as such @@ -69,8 +73,6 @@ public class PlayerTeleporter extends Teleporter { //Set the velocity of the teleported player after the teleportation is finished Bukkit.getScheduler().scheduleSyncDelayedTask(Stargate.getInstance(), () -> { - Vector newVelocityDirection = DirectionHelper.getDirectionVectorFromYaw(portal.getYaw()); - Vector newVelocity = newVelocityDirection.multiply(velocity * Stargate.getGateConfig().getExitVelocity()); player.setVelocity(newVelocity); }, 1); } diff --git a/src/main/java/net/knarcraft/stargate/portal/teleporter/Teleporter.java b/src/main/java/net/knarcraft/stargate/portal/teleporter/Teleporter.java index edaef09..7e1f7ee 100644 --- a/src/main/java/net/knarcraft/stargate/portal/teleporter/Teleporter.java +++ b/src/main/java/net/knarcraft/stargate/portal/teleporter/Teleporter.java @@ -19,6 +19,7 @@ import org.bukkit.entity.AbstractHorse; import org.bukkit.entity.Entity; import org.bukkit.event.Event; import org.bukkit.scheduler.BukkitScheduler; +import org.bukkit.util.Vector; import java.util.ArrayList; import java.util.List; @@ -83,7 +84,8 @@ public abstract class Teleporter { loadChunks(); if (teleportedEntity.eject()) { - TeleportHelper.handleEntityPassengers(passengers, teleportedEntity, origin, portal, exit.getDirection()); + TeleportHelper.handleEntityPassengers(passengers, teleportedEntity, origin, portal, exit.getDirection(), + new Vector()); } teleportedEntity.teleport(exit); return true; diff --git a/src/main/java/net/knarcraft/stargate/portal/teleporter/VehicleTeleporter.java b/src/main/java/net/knarcraft/stargate/portal/teleporter/VehicleTeleporter.java index 6110764..20d4353 100644 --- a/src/main/java/net/knarcraft/stargate/portal/teleporter/VehicleTeleporter.java +++ b/src/main/java/net/knarcraft/stargate/portal/teleporter/VehicleTeleporter.java @@ -133,7 +133,8 @@ public class VehicleTeleporter extends EntityTeleporter { */ private void teleportVehicle(List passengers, Location exit, Vector newVelocity, Portal origin) { if (teleportingVehicle.eject()) { - TeleportHelper.handleEntityPassengers(passengers, teleportingVehicle, origin, portal, exit.getDirection()); + TeleportHelper.handleEntityPassengers(passengers, teleportingVehicle, origin, portal, exit.getDirection(), + newVelocity); } Stargate.debug("VehicleTeleporter::teleportVehicle", "Teleporting " + teleportingVehicle + " to final location " + exit + " with direction " + exit.getDirection()); @@ -172,7 +173,8 @@ public class VehicleTeleporter extends EntityTeleporter { } //Remove the old vehicle if (teleportingVehicle.eject()) { - TeleportHelper.handleEntityPassengers(passengers, newVehicle, origin, portal, exit.getDirection()); + TeleportHelper.handleEntityPassengers(passengers, newVehicle, origin, portal, exit.getDirection(), + newVelocity); } teleportingVehicle.remove(); scheduler.scheduleSyncDelayedTask(Stargate.getInstance(), () -> newVehicle.setVelocity(newVelocity), 1); diff --git a/src/main/java/net/knarcraft/stargate/utility/TeleportHelper.java b/src/main/java/net/knarcraft/stargate/utility/TeleportHelper.java index 989effd..97d7868 100644 --- a/src/main/java/net/knarcraft/stargate/utility/TeleportHelper.java +++ b/src/main/java/net/knarcraft/stargate/utility/TeleportHelper.java @@ -79,8 +79,10 @@ public final class TeleportHelper { * @param targetVehicle

The entity to add the passenger to

* @param passenger

The passenger to teleport and add

* @param exitDirection

The direction of any passengers exiting the stargate

+ * @param newVelocity

The new velocity of the teleported passenger

*/ - public static void teleportAndAddPassenger(Entity targetVehicle, Entity passenger, Vector exitDirection) { + public static void teleportAndAddPassenger(Entity targetVehicle, Entity passenger, Vector exitDirection, + Vector newVelocity) { Location passengerExit = targetVehicle.getLocation().clone().setDirection(exitDirection); if (!passenger.teleport(passengerExit)) { Stargate.debug("TeleportHelper::handleVehiclePassengers", "Failed to teleport passenger" + @@ -96,6 +98,9 @@ public final class TeleportHelper { Stargate.debug("TeleportHelper::handleVehiclePassengers", "Added passenger " + passenger + " to " + targetVehicle); } + Stargate.debug("VehicleTeleporter::teleportVehicle", "Setting velocity " + newVelocity + + " for passenger " + passenger); + passenger.setVelocity(newVelocity); } /** @@ -106,9 +111,10 @@ public final class TeleportHelper { * @param origin

The portal the entity teleported from

* @param target

The portal the entity is teleporting to

* @param exitRotation

The rotation of any passengers exiting the stargate

+ * @param newVelocity

The new velocity of the teleported passengers

*/ public static void handleEntityPassengers(List passengers, Entity entity, Portal origin, Portal target, - Vector exitRotation) { + Vector exitRotation, Vector newVelocity) { for (Entity passenger : passengers) { List passengerPassengers = passenger.getPassengers(); if (!passengerPassengers.isEmpty()) { @@ -117,14 +123,14 @@ public final class TeleportHelper { } if (passenger.eject()) { //Teleport any passengers of the passenger - handleEntityPassengers(passengerPassengers, passenger, origin, target, exitRotation); + handleEntityPassengers(passengerPassengers, passenger, origin, target, exitRotation, newVelocity); } Bukkit.getScheduler().scheduleSyncDelayedTask(Stargate.getInstance(), () -> { if (passenger instanceof Player player) { //Teleport any creatures leashed by the player in a 15-block range teleportLeashedCreatures(player, origin, target); } - teleportAndAddPassenger(entity, passenger, exitRotation); + teleportAndAddPassenger(entity, passenger, exitRotation, newVelocity); }, passenger instanceof Player ? Stargate.getGateConfig().waitForPlayerAfterTeleportDelay() : 0); } }