diff --git a/src/main/java/net/knarcraft/stargate/listener/EntityEventListener.java b/src/main/java/net/knarcraft/stargate/listener/EntityEventListener.java index 9d35ad2..22dfbe2 100644 --- a/src/main/java/net/knarcraft/stargate/listener/EntityEventListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/EntityEventListener.java @@ -4,6 +4,7 @@ import net.knarcraft.stargate.portal.Portal; import net.knarcraft.stargate.portal.PortalHandler; import net.knarcraft.stargate.Stargate; import org.bukkit.block.Block; +import org.bukkit.entity.Entity; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -27,8 +28,10 @@ public class EntityEventListener implements Listener { return; } - Portal portal = PortalHandler.getByAdjacentEntrance(event.getFrom()); - if (portal != null) { + 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) { event.setCancelled(true); } } diff --git a/src/main/java/net/knarcraft/stargate/listener/PlayerEventsListener.java b/src/main/java/net/knarcraft/stargate/listener/PlayerEventsListener.java index 7b36964..705ef5c 100644 --- a/src/main/java/net/knarcraft/stargate/listener/PlayerEventsListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/PlayerEventsListener.java @@ -11,7 +11,9 @@ import org.bukkit.GameMode; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.data.type.WallSign; +import org.bukkit.entity.Boat; import org.bukkit.entity.Entity; +import org.bukkit.entity.Minecart; import org.bukkit.entity.Player; import org.bukkit.entity.Vehicle; import org.bukkit.event.Event; @@ -84,11 +86,13 @@ public class PlayerEventsListener implements Listener { Entity playerVehicle = event.getPlayer().getVehicle(); Portal portal = PortalHandler.getByEntrance(event.getFrom()); - if (playerVehicle != null && PortalHandler.getByEntrance(event.getFrom()) != null) { + if (playerVehicle != null && PortalHandler.getByEntrance(event.getFrom()) != null && + !(playerVehicle instanceof Minecart) && + !(playerVehicle instanceof Boat)) { Portal destinationPortal = portal.getDestination(); if (destinationPortal != null) { VehicleEventListener.teleportVehicleAfterPlayer((Vehicle) playerVehicle, destinationPortal, event.getPlayer()); - Stargate.log.info("Player was driving " + playerVehicle.getName()); + Stargate.debug("playerTeleport", "Player was driving " + playerVehicle.getName()); } } } diff --git a/src/main/java/net/knarcraft/stargate/listener/VehicleEventListener.java b/src/main/java/net/knarcraft/stargate/listener/VehicleEventListener.java index 1888370..0ab7da2 100644 --- a/src/main/java/net/knarcraft/stargate/listener/VehicleEventListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/VehicleEventListener.java @@ -32,14 +32,26 @@ public class VehicleEventListener implements Listener { } /** - * Teleports a vehicle through a stargate + * Check for a vehicle moving through a portal * - * @param passengers

The passengers inside the vehicle

- * @param entrancePortal

The portal the vehicle is entering

- * @param vehicle

The vehicle passing through

+ * @param event

The triggered move event

*/ - public static void teleportVehicle(List passengers, Portal entrancePortal, Vehicle vehicle) { - teleportVehicle(passengers, entrancePortal, vehicle, false); + @EventHandler + public void onVehicleMove(VehicleMoveEvent event) { + if (!Stargate.handleVehicles) { + return; + } + List passengers = event.getVehicle().getPassengers(); + Vehicle vehicle = event.getVehicle(); + + Portal entrancePortal = PortalHandler.getByEntrance(event.getTo()); + + //Return if the portal cannot be teleported through + if (entrancePortal == null || !entrancePortal.isOpen() || entrancePortal.isBungee()) { + return; + } + + teleportVehicle(passengers, entrancePortal, vehicle); } /** @@ -48,12 +60,11 @@ public class VehicleEventListener implements Listener { * @param passengers

The passengers inside the vehicle

* @param entrancePortal

The portal the vehicle is entering

* @param vehicle

The vehicle passing through

- * @param skipOpenCheck

Skips the check for whether the portal is open for the player

*/ - public static void teleportVehicle(List passengers, Portal entrancePortal, Vehicle vehicle, boolean skipOpenCheck) { + private static void teleportVehicle(List passengers, Portal entrancePortal, Vehicle vehicle) { if (!passengers.isEmpty() && passengers.get(0) instanceof Player) { Stargate.log.info(Stargate.getString("prefox") + "Found passenger vehicle"); - teleportPlayerAndVehicle(entrancePortal, vehicle, passengers, skipOpenCheck); + teleportPlayerAndVehicle(entrancePortal, vehicle, passengers); } else { Stargate.log.info(Stargate.getString("prefox") + "Found empty vehicle"); Portal destinationPortal = entrancePortal.getDestination(); @@ -72,10 +83,9 @@ public class VehicleEventListener implements Listener { * @param vehicle

The vehicle to teleport

* @param passengers

Any entities sitting in the minecart

*/ - private static void teleportPlayerAndVehicle(Portal entrancePortal, Vehicle vehicle, List passengers, - boolean skipOpenCheck) { + private static void teleportPlayerAndVehicle(Portal entrancePortal, Vehicle vehicle, List passengers) { Player player = (Player) passengers.get(0); - if (!skipOpenCheck && !entrancePortal.isOpenFor(player)) { + if (!entrancePortal.isOpenFor(player)) { Stargate.sendMessage(player, Stargate.getString("denyMsg")); return; } @@ -105,29 +115,4 @@ public class VehicleEventListener implements Listener { entrancePortal.close(false); } - /** - * Check for a vehicle moving through a portal - * - * @param event

The triggered move event

- */ - @EventHandler - public void onVehicleMove(VehicleMoveEvent event) { - if (!Stargate.handleVehicles) { - return; - } - List passengers = event.getVehicle().getPassengers(); - Vehicle vehicle = event.getVehicle(); - - Portal entrancePortal = PortalHandler.getByEntrance(event.getTo()); - - //Return if the portal cannot be teleported through - if (entrancePortal == null || !entrancePortal.isOpen() || entrancePortal.isBungee()) { - return; - } - - //TODO: As there are a lot of vehicles in the game now, a lot needs to be accounted for to make this work as expected - - teleportVehicle(passengers, entrancePortal, vehicle); - } - } diff --git a/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java b/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java index 4c38422..ab8ad8d 100644 --- a/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java +++ b/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java @@ -555,33 +555,44 @@ public class PortalHandler { /** * Gets a portal given a location adjacent to its entrance * - * @param loc

A location adjacent to the portal's entrance

+ * @param location

A location adjacent to the portal's entrance

* @return

The portal adjacent to the given location

*/ - public static Portal getByAdjacentEntrance(Location loc) { - int centerX = loc.getBlockX(); - int centerY = loc.getBlockY(); - int centerZ = loc.getBlockZ(); - World world = loc.getWorld(); - Portal portal = lookupEntrances.get(new BlockLocation(world, centerX, centerY, centerZ)); - if (portal != null) { - return portal; + public static Portal getByAdjacentEntrance(Location location) { + return getByAdjacentEntrance(location, 1); + } + + /** + * Gets a portal given a location adjacent to its entrance + * + * @param location

A location adjacent to the portal's entrance

+ * @param range

The range to scan for portals

+ * @return

The portal adjacent to the given location

+ */ + public static Portal getByAdjacentEntrance(Location location, int range) { + List adjacentPositions = new ArrayList<>(); + BlockLocation centerLocation = new BlockLocation(location.getBlock()); + adjacentPositions.add(centerLocation); + + for (int index = 1; index <= range; index++) { + adjacentPositions.add(centerLocation.makeRelative(index, 0, 0)); + adjacentPositions.add(centerLocation.makeRelative(-index, 0, 0)); + adjacentPositions.add(centerLocation.makeRelative(0, 0, index)); + adjacentPositions.add(centerLocation.makeRelative(0, 0, -index)); + if (index < range) { + adjacentPositions.add(centerLocation.makeRelative(index, 0, index)); + adjacentPositions.add(centerLocation.makeRelative(-index, 0, -index)); + adjacentPositions.add(centerLocation.makeRelative(index, 0, -index)); + adjacentPositions.add(centerLocation.makeRelative(-index, 0, index)); + } } - portal = lookupEntrances.get(new BlockLocation(world, centerX + 1, centerY, centerZ)); - if (portal != null) { - return portal; - } - portal = lookupEntrances.get(new BlockLocation(world, centerX - 1, centerY, centerZ)); - if (portal != null) { - return portal; - } - portal = lookupEntrances.get(new BlockLocation(world, centerX, centerY, centerZ + 1)); - if (portal != null) { - return portal; - } - portal = lookupEntrances.get(new BlockLocation(world, centerX, centerY, centerZ - 1)); - if (portal != null) { - return portal; + + for (BlockLocation adjacentPosition : adjacentPositions) { + Stargate.debug("getByAdjacentEntrance", "Testing" + adjacentPosition); + Portal portal = lookupEntrances.get(adjacentPosition); + if (portal != null) { + return portal; + } } return null; }