From b8d98c26d4f0002658c50c5f0989ddfaae5944ff Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Mon, 1 Nov 2021 16:28:13 +0100 Subject: [PATCH] Adds triggers for teleporting leashed entities --- .../stargate/portal/PlayerTeleporter.java | 3 + .../stargate/portal/VehicleTeleporter.java | 58 ++++++++----------- 2 files changed, 27 insertions(+), 34 deletions(-) diff --git a/src/main/java/net/knarcraft/stargate/portal/PlayerTeleporter.java b/src/main/java/net/knarcraft/stargate/portal/PlayerTeleporter.java index 8bf1191..611d6e4 100644 --- a/src/main/java/net/knarcraft/stargate/portal/PlayerTeleporter.java +++ b/src/main/java/net/knarcraft/stargate/portal/PlayerTeleporter.java @@ -48,6 +48,9 @@ public class PlayerTeleporter extends Teleporter { //Load chunks to make sure not to teleport to the void loadChunks(); + //Teleport any creatures leashed by the player in a 10-block range + teleportLeashedCreatures(player, origin); + //If no event is passed in, assume it's a teleport, and act as such if (event == null) { player.teleport(exit); diff --git a/src/main/java/net/knarcraft/stargate/portal/VehicleTeleporter.java b/src/main/java/net/knarcraft/stargate/portal/VehicleTeleporter.java index 34ee9d3..100926d 100644 --- a/src/main/java/net/knarcraft/stargate/portal/VehicleTeleporter.java +++ b/src/main/java/net/knarcraft/stargate/portal/VehicleTeleporter.java @@ -1,12 +1,12 @@ package net.knarcraft.stargate.portal; import net.knarcraft.stargate.Stargate; -import net.knarcraft.stargate.event.StargateEntityPortalEvent; import net.knarcraft.stargate.utility.DirectionHelper; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; import org.bukkit.entity.Vehicle; import org.bukkit.util.Vector; @@ -15,7 +15,7 @@ import java.util.List; /** * The portal teleporter takes care of the actual portal teleportation for any vehicles */ -public class VehicleTeleporter extends Teleporter { +public class VehicleTeleporter extends EntityTeleporter { private final Vehicle teleportingVehicle; @@ -26,7 +26,7 @@ public class VehicleTeleporter extends Teleporter { * @param teleportingVehicle

The teleporting vehicle

*/ public VehicleTeleporter(Portal portal, Vehicle teleportingVehicle) { - super(portal); + super(portal, teleportingVehicle); this.teleportingVehicle = teleportingVehicle; } @@ -36,8 +36,9 @@ public class VehicleTeleporter extends Teleporter { *

It is assumed that if a vehicle contains any players, their permissions have already been validated before * calling this method.

* - * @param origin

The portal the vehicle teleports from

+ * @param origin

The portal the vehicle is teleporting from

*/ + @Override public void teleport(Portal origin) { Location traveller = teleportingVehicle.getLocation(); Location exit = getExit(teleportingVehicle, traveller); @@ -63,7 +64,7 @@ public class VehicleTeleporter extends Teleporter { } //Teleport the vehicle - teleportVehicle(exit, newVelocity); + teleportVehicle(exit, newVelocity, origin); } /** @@ -71,8 +72,9 @@ public class VehicleTeleporter extends Teleporter { * * @param exit

The location the vehicle should be teleported to

* @param newVelocity

The velocity to give the vehicle right after teleportation

+ * @param origin

The portal the vehicle teleported from

*/ - private void teleportVehicle(Location exit, Vector newVelocity) { + private void teleportVehicle(Location exit, Vector newVelocity, Portal origin) { //Load chunks to make sure not to teleport to the void loadChunks(); @@ -80,10 +82,10 @@ public class VehicleTeleporter extends Teleporter { if (!passengers.isEmpty()) { if (!(teleportingVehicle instanceof LivingEntity)) { //Teleport a normal vehicle with passengers (minecart or boat) - putPassengersInNewVehicle(passengers, exit, newVelocity); + putPassengersInNewVehicle(passengers, exit, newVelocity, origin); } else { //Teleport a living vehicle with passengers (pig, horse, donkey, strider) - teleportLivingVehicle(exit, passengers); + teleportLivingVehicle(exit, passengers, origin); } } else { //Teleport an empty vehicle @@ -93,35 +95,17 @@ public class VehicleTeleporter extends Teleporter { } } - /** - * Triggers the entity portal event to allow plugins to change the exit location - * - * @param origin

The origin portal teleported from

- * @param exit

The exit location to teleport the vehicle to

- * @return

The location the vehicle should be teleported to, or null if the event was cancelled

- */ - private Location triggerEntityPortalEvent(Portal origin, Location exit) { - StargateEntityPortalEvent stargateEntityPortalEvent = new StargateEntityPortalEvent(teleportingVehicle, origin, - portal, exit); - Stargate.getInstance().getServer().getPluginManager().callEvent(stargateEntityPortalEvent); - //Teleport is cancelled. Teleport the entity back to where it came from just for sanity's sake - if (stargateEntityPortalEvent.isCancelled()) { - new VehicleTeleporter(origin, teleportingVehicle).teleport(origin); - return null; - } - return stargateEntityPortalEvent.getExit(); - } - /** * Teleport a vehicle which is not a minecart or a boat * * @param exit

The location the vehicle will exit

* @param passengers

The passengers of the vehicle

+ * @param origin

The portal the vehicle teleported from

*/ - private void teleportLivingVehicle(Location exit, List passengers) { + private void teleportLivingVehicle(Location exit, List passengers, Portal origin) { teleportingVehicle.eject(); teleportingVehicle.teleport(exit); - handleVehiclePassengers(passengers, teleportingVehicle, 2); + handleVehiclePassengers(passengers, teleportingVehicle, 2, origin); } /** @@ -134,9 +118,10 @@ public class VehicleTeleporter extends Teleporter { * @param passengers

A list of all passengers in the vehicle

* @param exit

The exit location to spawn the new vehicle on

* @param newVelocity

The new velocity of the new vehicle

+ * @param origin

The portal the vehicle teleported from

*/ private void putPassengersInNewVehicle(List passengers, Location exit, - Vector newVelocity) { + Vector newVelocity, Portal origin) { World vehicleWorld = exit.getWorld(); if (vehicleWorld == null) { Stargate.logWarning("Unable to get the world to teleport the vehicle to"); @@ -149,7 +134,7 @@ public class VehicleTeleporter extends Teleporter { teleportingVehicle.remove(); //Set rotation, add passengers and restore velocity newVehicle.setRotation(exit.getYaw(), exit.getPitch()); - handleVehiclePassengers(passengers, newVehicle, 1); + handleVehiclePassengers(passengers, newVehicle, 1, origin); scheduler.scheduleSyncDelayedTask(Stargate.getInstance(), () -> newVehicle.setVelocity(newVelocity), 1); } @@ -159,12 +144,17 @@ public class VehicleTeleporter extends Teleporter { * @param passengers

The passengers to handle

* @param vehicle

The vehicle the passengers should be put into

* @param delay

The amount of milliseconds to wait before adding the vehicle passengers

+ * @param origin

The portal the vehicle teleported from

*/ - private void handleVehiclePassengers(List passengers, Vehicle vehicle, long delay) { + private void handleVehiclePassengers(List passengers, Vehicle vehicle, long delay, Portal origin) { for (Entity passenger : passengers) { passenger.eject(); - scheduler.scheduleSyncDelayedTask(Stargate.getInstance(), () -> teleportAndAddPassenger(vehicle, passenger), - delay); + scheduler.scheduleSyncDelayedTask(Stargate.getInstance(), () -> { + if (passenger instanceof Player player) { + teleportLeashedCreatures(player, origin); + } + teleportAndAddPassenger(vehicle, passenger); + }, delay); } }