diff --git a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java index 80da9dc..5ec3ee9 100644 --- a/src/main/java/net/knarcraft/stargate/config/StargateConfig.java +++ b/src/main/java/net/knarcraft/stargate/config/StargateConfig.java @@ -1,10 +1,13 @@ package net.knarcraft.stargate.config; import net.knarcraft.stargate.Stargate; +import net.knarcraft.stargate.container.BlockChangeRequest; import net.knarcraft.stargate.listener.BungeeCordListener; import net.knarcraft.stargate.portal.GateHandler; import net.knarcraft.stargate.portal.Portal; +import net.knarcraft.stargate.portal.PortalHandler; import net.knarcraft.stargate.portal.PortalRegistry; +import net.knarcraft.stargate.thread.BlockChangeThread; import net.knarcraft.stargate.utility.FileHelper; import net.knarcraft.stargate.utility.PortalFileHelper; import org.bukkit.Bukkit; @@ -121,7 +124,15 @@ public final class StargateConfig { public void reload(CommandSender sender) { //Unload all saved data unload(); - + + //Perform all block change requests to prevent mismatch if a gate's open-material changes. Changing the + // closed-material still requires a restart. + BlockChangeRequest firstElement = Stargate.blockChangeRequestQueue.peek(); + while (firstElement != null) { + BlockChangeThread.pollQueue(); + firstElement = Stargate.blockChangeRequestQueue.peek(); + } + //Store the old enable bungee state in case it changes boolean oldEnableBungee = stargateGateConfig.enableBungee(); @@ -145,7 +156,9 @@ public final class StargateConfig { activePortal.getPortalActivator().deactivate(); } //Force all portals to close - closeAllPortals(); + closeAllOpenPortals(); + PortalHandler.closeAllPortals(); + //Clear queues and lists activePortalsQueue.clear(); openPortalsQueue.clear(); @@ -247,9 +260,9 @@ public final class StargateConfig { /** * Forces all open portals to close */ - public void closeAllPortals() { + public void closeAllOpenPortals() { for (Portal openPortal : openPortalsQueue) { - openPortal.getPortalOpener().closePortal(true); + openPortal.getPortalOpener().closePortal(false); } } diff --git a/src/main/java/net/knarcraft/stargate/listener/PortalEventListener.java b/src/main/java/net/knarcraft/stargate/listener/PortalEventListener.java index fd26668..d739e2c 100644 --- a/src/main/java/net/knarcraft/stargate/listener/PortalEventListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/PortalEventListener.java @@ -60,6 +60,9 @@ public class PortalEventListener implements Listener { if (entity instanceof Player player && location.getBlock().getType() == Material.END_PORTAL && world != null && world.getEnvironment() == World.Environment.THE_END) { Portal portal = PortalHandler.getByAdjacentEntrance(location); + if (portal == null) { + return; + } //Remove any old player teleportations in case weird things happen playersFromTheEnd.removeIf((teleportation -> teleportation.getPlayer() == player)); diff --git a/src/main/java/net/knarcraft/stargate/portal/PortalOpener.java b/src/main/java/net/knarcraft/stargate/portal/PortalOpener.java index 995479a..9dd3612 100644 --- a/src/main/java/net/knarcraft/stargate/portal/PortalOpener.java +++ b/src/main/java/net/knarcraft/stargate/portal/PortalOpener.java @@ -146,7 +146,7 @@ public class PortalOpener { */ public void closePortal(boolean force) { //No need to close a portal which is already closed - if (!isOpen) { + if (!isOpen()) { return; } diff --git a/src/main/java/net/knarcraft/stargate/thread/BlockChangeThread.java b/src/main/java/net/knarcraft/stargate/thread/BlockChangeThread.java index 985ba5a..27f75b4 100644 --- a/src/main/java/net/knarcraft/stargate/thread/BlockChangeThread.java +++ b/src/main/java/net/knarcraft/stargate/thread/BlockChangeThread.java @@ -21,24 +21,31 @@ public class BlockChangeThread implements Runnable { long sTime = System.nanoTime(); //Repeat for at most 0.025 seconds while (System.nanoTime() - sTime < 25000000) { - //Abort if there's no work to be done - BlockChangeRequest blockChangeRequest = Stargate.blockChangeRequestQueue.poll(); - if (blockChangeRequest == null) { - return; - } + pollQueue(); + } + } - //Change the material of the pulled block - Block block = blockChangeRequest.getBlockLocation().getBlock(); - block.setType(blockChangeRequest.getMaterial(), false); + /** + * Polls the block change request queue for any waiting requests + */ + public static void pollQueue() { + //Abort if there's no work to be done + BlockChangeRequest blockChangeRequest = Stargate.blockChangeRequestQueue.poll(); + if (blockChangeRequest == null) { + return; + } - if (blockChangeRequest.getMaterial() == Material.END_GATEWAY && - block.getWorld().getEnvironment() == World.Environment.THE_END) { - //Force a specific location to prevent exit gateway generation - fixEndGatewayGate(block); - } else if (blockChangeRequest.getAxis() != null) { - //If orientation is relevant, adjust the block's orientation - orientBlock(block, blockChangeRequest.getAxis()); - } + //Change the material of the pulled block + Block block = blockChangeRequest.getBlockLocation().getBlock(); + block.setType(blockChangeRequest.getMaterial(), false); + + if (blockChangeRequest.getMaterial() == Material.END_GATEWAY && + block.getWorld().getEnvironment() == World.Environment.THE_END) { + //Force a specific location to prevent exit gateway generation + fixEndGatewayGate(block); + } else if (blockChangeRequest.getAxis() != null) { + //If orientation is relevant, adjust the block's orientation + orientBlock(block, blockChangeRequest.getAxis()); } } @@ -47,7 +54,7 @@ public class BlockChangeThread implements Runnable { * * @param block

The block to fix

*/ - private void fixEndGatewayGate(Block block) { + private static void fixEndGatewayGate(Block block) { EndGateway gateway = (EndGateway) block.getState(); gateway.setExitLocation(block.getLocation()); gateway.setExactTeleport(true); @@ -60,7 +67,7 @@ public class BlockChangeThread implements Runnable { * @param block

The block to orient

* @param axis

The axis to use for orienting the block

*/ - private void orientBlock(Block block, Axis axis) { + private static void orientBlock(Block block, Axis axis) { Orientable orientable = (Orientable) block.getBlockData(); orientable.setAxis(axis); block.setBlockData(orientable); diff --git a/src/main/java/net/knarcraft/stargate/utility/PermissionHelper.java b/src/main/java/net/knarcraft/stargate/utility/PermissionHelper.java index 3592b56..64f4dee 100644 --- a/src/main/java/net/knarcraft/stargate/utility/PermissionHelper.java +++ b/src/main/java/net/knarcraft/stargate/utility/PermissionHelper.java @@ -26,12 +26,12 @@ public final class PermissionHelper { public static void openPortal(Player player, Portal portal) { Portal destination = portal.getPortalActivator().getDestination(); - //Always-open gate -- Do nothing + //Always-open portal -- Do nothing if (portal.getOptions().isAlwaysOn()) { return; } - //Random gate -- Do nothing + //Random portal -- Do nothing if (portal.getOptions().isRandom()) { return; } @@ -42,16 +42,16 @@ public final class PermissionHelper { return; } - //Gate is already open + //Portal is already open if (portal.isOpen()) { - // Close if this player opened the gate + //Close if this player opened the portal if (portal.getActivePlayer() == player) { portal.getPortalOpener().closePortal(false); } return; } - //Gate that someone else is using -- Deny access + //Portal is used by another player -- Deny access if ((!portal.getOptions().isFixed()) && portal.getPortalActivator().isActive() && (portal.getActivePlayer() != player)) { Stargate.getMessageSender().sendErrorMessage(player, Stargate.getString("denyMsg")); diff --git a/src/main/resources/lang/nn-no.txt b/src/main/resources/lang/nn-no.txt index ff0b01f..4d8c541 100644 --- a/src/main/resources/lang/nn-no.txt +++ b/src/main/resources/lang/nn-no.txt @@ -34,4 +34,4 @@ signDisconnected=Kopla frå bungeeDisabled=BungeeCord støtte er slått av. bungeeDeny=Du har ikkje løyve til å opprette BungeeCord portar. bungeeEmpty=BungeeCord portar treng bade ein destinasjon og eit nettverk. -bungeeSign=Teleportar til +bungeeSign=Teleporter til