From 4acea17ba3977724d305e45db9ae0fd8cd5d1ab1 Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Tue, 23 Feb 2021 19:43:49 +0100 Subject: [PATCH] Fixes boats sometimes not detecting the portal before the player detects the portal --- .../listener/EntityEventListener.java | 5 ++-- .../listener/VehicleEventListener.java | 9 ++++++- .../net/knarcraft/stargate/portal/Portal.java | 7 +++-- .../stargate/portal/PortalHandler.java | 1 - .../stargate/thread/StarGateThread.java | 1 + .../stargate/utility/EntityHelper.java | 27 +++++++++++++++++++ 6 files changed, 43 insertions(+), 7 deletions(-) create mode 100644 src/main/java/net/knarcraft/stargate/utility/EntityHelper.java diff --git a/src/main/java/net/knarcraft/stargate/listener/EntityEventListener.java b/src/main/java/net/knarcraft/stargate/listener/EntityEventListener.java index 22dfbe2..700b90a 100644 --- a/src/main/java/net/knarcraft/stargate/listener/EntityEventListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/EntityEventListener.java @@ -3,6 +3,7 @@ package net.knarcraft.stargate.listener; import net.knarcraft.stargate.portal.Portal; import net.knarcraft.stargate.portal.PortalHandler; import net.knarcraft.stargate.Stargate; +import net.knarcraft.stargate.utility.EntityHelper; import org.bukkit.block.Block; import org.bukkit.entity.Entity; import org.bukkit.event.EventHandler; @@ -29,9 +30,7 @@ public class EntityEventListener implements Listener { } Entity entity = event.getEntity(); - int entitySize = (int) Math.ceil((float) Math.max(entity.getBoundingBox().getWidthX(), - entity.getBoundingBox().getWidthZ())); - if (PortalHandler.getByAdjacentEntrance(event.getFrom(), entitySize) != null) { + if (PortalHandler.getByAdjacentEntrance(event.getFrom(), (int) EntityHelper.getEntityMaxSize(entity)) != null) { event.setCancelled(true); } } diff --git a/src/main/java/net/knarcraft/stargate/listener/VehicleEventListener.java b/src/main/java/net/knarcraft/stargate/listener/VehicleEventListener.java index 0ab7da2..db71f90 100644 --- a/src/main/java/net/knarcraft/stargate/listener/VehicleEventListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/VehicleEventListener.java @@ -4,6 +4,7 @@ import net.knarcraft.stargate.portal.Portal; import net.knarcraft.stargate.portal.PortalHandler; import net.knarcraft.stargate.Stargate; import net.knarcraft.stargate.utility.EconomyHelper; +import net.knarcraft.stargate.utility.EntityHelper; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.entity.Vehicle; @@ -44,7 +45,13 @@ public class VehicleEventListener implements Listener { List passengers = event.getVehicle().getPassengers(); Vehicle vehicle = event.getVehicle(); - Portal entrancePortal = PortalHandler.getByEntrance(event.getTo()); + Portal entrancePortal; + int entitySize = (int) EntityHelper.getEntityMaxSize(vehicle); + if (EntityHelper.getEntityMaxSize(vehicle) > 1) { + entrancePortal = PortalHandler.getByAdjacentEntrance(event.getTo(), entitySize - 1); + } else { + entrancePortal = PortalHandler.getByEntrance(event.getTo()); + } //Return if the portal cannot be teleported through if (entrancePortal == null || !entrancePortal.isOpen() || entrancePortal.isBungee()) { diff --git a/src/main/java/net/knarcraft/stargate/portal/Portal.java b/src/main/java/net/knarcraft/stargate/portal/Portal.java index f65517a..df96cb9 100644 --- a/src/main/java/net/knarcraft/stargate/portal/Portal.java +++ b/src/main/java/net/knarcraft/stargate/portal/Portal.java @@ -10,6 +10,7 @@ import net.knarcraft.stargate.event.StargateCloseEvent; import net.knarcraft.stargate.event.StargateDeactivateEvent; import net.knarcraft.stargate.event.StargateOpenEvent; import net.knarcraft.stargate.event.StargatePortalEvent; +import net.knarcraft.stargate.utility.EntityHelper; import org.bukkit.Axis; import org.bukkit.ChatColor; import org.bukkit.Location; @@ -595,8 +596,10 @@ public class Portal { if (gate.getLayout().getExit() != null) { BlockLocation exit = getBlockAt(gate.getLayout().getExit()); int back = (isBackwards()) ? -1 : 1; - double entitySize = Math.ceil((float) Math.max(entity.getBoundingBox().getWidthX(), entity.getBoundingBox().getWidthZ())); - exitLocation = exit.modRelativeLoc(0D, 0D, entitySize, traveller.getYaw(), traveller.getPitch(), modX * back, 1, modZ * back); + //TODO: Improve positioning to place the entity just far enough from the portal not to suffocate + double entitySize = EntityHelper.getEntityMaxSize(entity); + exitLocation = exit.modRelativeLoc(0D, 0D, entitySize, traveller.getYaw(), + traveller.getPitch(), modX * back, 1, modZ * back); } else { Stargate.log.log(Level.WARNING, Stargate.getString("prefix") + "Missing destination point in .gate file " + gate.getFilename()); } diff --git a/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java b/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java index ab8ad8d..d3b420e 100644 --- a/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java +++ b/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java @@ -588,7 +588,6 @@ public class PortalHandler { } for (BlockLocation adjacentPosition : adjacentPositions) { - Stargate.debug("getByAdjacentEntrance", "Testing" + adjacentPosition); Portal portal = lookupEntrances.get(adjacentPosition); if (portal != null) { return portal; diff --git a/src/main/java/net/knarcraft/stargate/thread/StarGateThread.java b/src/main/java/net/knarcraft/stargate/thread/StarGateThread.java index 98a826b..4b03cc0 100644 --- a/src/main/java/net/knarcraft/stargate/thread/StarGateThread.java +++ b/src/main/java/net/knarcraft/stargate/thread/StarGateThread.java @@ -10,6 +10,7 @@ import java.util.Iterator; */ public class StarGateThread implements Runnable { + @Override public void run() { long time = System.currentTimeMillis() / 1000; // Close open portals diff --git a/src/main/java/net/knarcraft/stargate/utility/EntityHelper.java b/src/main/java/net/knarcraft/stargate/utility/EntityHelper.java new file mode 100644 index 0000000..2fd3342 --- /dev/null +++ b/src/main/java/net/knarcraft/stargate/utility/EntityHelper.java @@ -0,0 +1,27 @@ +package net.knarcraft.stargate.utility; + +import org.bukkit.entity.Entity; + +/** + * This helper class helps with entity properties not immediately available + */ +public final class EntityHelper { + + private EntityHelper() { + + } + + /** + * Gets the max size of an entity along its x and z axis + * + *

This function gets the ceiling of the max size of an entity, thus calculating the smallest square needed to + * contain the entity.

+ * + * @param entity

The entity to get max size for

+ * @return

+ */ + public static double getEntityMaxSize(Entity entity) { + return Math.ceil((float) Math.max(entity.getBoundingBox().getWidthX(), entity.getBoundingBox().getWidthZ())); + } + +}