diff --git a/src/main/java/net/knarcraft/stargate/Gate.java b/src/main/java/net/knarcraft/stargate/Gate.java index 30b4812..4a41ae5 100644 --- a/src/main/java/net/knarcraft/stargate/Gate.java +++ b/src/main/java/net/knarcraft/stargate/Gate.java @@ -7,7 +7,6 @@ import org.bukkit.block.Block; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; -import java.io.FilenameFilter; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -400,7 +399,7 @@ public class Gate { return null; } - if (!Tag.BUTTONS.isTagged(gate.button)) { + if (!Tag.BUTTONS.isTagged(gate.button) && !MaterialHelper.isWallCoral(gate.button)) { Stargate.log.log(Level.SEVERE, "Could not load Gate " + file.getName() + " - Gate button must be a type of button."); return null; } @@ -435,28 +434,39 @@ public class Gate { return def; } + /** + * Loads all gates inside the given folder + * @param gateFolder

The folder containing the gates

+ */ public static void loadGates(String gateFolder) { - File dir = new File(gateFolder); + File directory = new File(gateFolder); File[] files; - if (dir.exists()) { - files = dir.listFiles(new StargateFilenameFilter()); + if (directory.exists()) { + files = directory.listFiles((file) -> file.isFile() && file.getName().endsWith(".gate")); } else { files = new File[0]; } if (files == null || files.length == 0) { - if (dir.mkdir()) { + //The gates folder was not found. Assume this is the first run + if (directory.mkdir()) { populateDefaults(gateFolder); } } else { for (File file : files) { Gate gate = loadGate(file); - if (gate != null) registerGate(gate); + if (gate != null) { + registerGate(gate); + } } } } + /** + * Writes the default gate specification to the given folder + * @param gateFolder

The folder containing gate config files

+ */ public static void populateDefaults(String gateFolder) { Character[][] layout = new Character[][]{ {' ', 'X', 'X', ' '}, @@ -485,32 +495,46 @@ public class Gate { Gate[] result = new Gate[0]; ArrayList lookup = controlBlocks.get(type); - if (lookup != null) result = lookup.toArray(result); + if (lookup != null) { + result = lookup.toArray(result); + } return result; } + /** + * Gets a portal by its name (filename before .gate) + * @param name

The name of the gate to get

+ * @return

The gate with the given name

+ */ public static Gate getGateByName(String name) { return gates.get(name); } + /** + * Gets the number of loaded gate configurations + * @return

The number of loaded gate configurations

+ */ public static int getGateCount() { return gates.size(); } + /** + * Checks whether the given material is used for the frame of any portals + * @param type

The material type to check

+ * @return

True if the material is used for the frame of at least one portal

+ */ public static boolean isGateBlock(Material type) { return frameBlocks.contains(type); } - static class StargateFilenameFilter implements FilenameFilter { - public boolean accept(File dir, String name) { - return name.endsWith(".gate"); - } - } - + /** + * Clears all loaded gates + */ public static void clearGates() { gates.clear(); controlBlocks.clear(); frameBlocks.clear(); } + } diff --git a/src/main/java/net/knarcraft/stargate/PlayerEventsListener.java b/src/main/java/net/knarcraft/stargate/PlayerEventsListener.java new file mode 100644 index 0000000..8360047 --- /dev/null +++ b/src/main/java/net/knarcraft/stargate/PlayerEventsListener.java @@ -0,0 +1,303 @@ +package net.knarcraft.stargate; + +import org.bukkit.GameMode; +import org.bukkit.Tag; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.data.type.WallSign; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerTeleportEvent; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +public class PlayerEventsListener implements Listener { + + private static long eventTime; + private static PlayerInteractEvent previousEvent; + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + if (!Stargate.enableBungee) { + return; + } + + Player player = event.getPlayer(); + String destination = Stargate.bungeeQueue.remove(player.getName().toLowerCase()); + if (destination == null) { + return; + } + + Portal portal = Portal.getBungeeGate(destination); + if (portal == null) { + Stargate.debug("PlayerJoin", "Error fetching destination portal: " + destination); + return; + } + portal.teleport(player, portal, null); + } + + @EventHandler + public void onPlayerTeleport(PlayerTeleportEvent event) { + // cancel portal and endgateway teleportation if it's from a stargate entrance + PlayerTeleportEvent.TeleportCause cause = event.getCause(); + if (!event.isCancelled() + && (cause == PlayerTeleportEvent.TeleportCause.NETHER_PORTAL + || cause == PlayerTeleportEvent.TeleportCause.END_GATEWAY && World.Environment.THE_END == event.getFrom().getWorld().getEnvironment()) + && Portal.getByAdjacentEntrance(event.getFrom()) != null) { + event.setCancelled(true); + } + } + + @EventHandler + public void onPlayerMove(PlayerMoveEvent event) { + if (event.isCancelled()) return; + + // Check to see if the player actually moved + if (event.getFrom().getBlockX() == event.getTo().getBlockX() && event.getFrom().getBlockY() == event.getTo().getBlockY() && event.getFrom().getBlockZ() == event.getTo().getBlockZ()) { + return; + } + + Player player = event.getPlayer(); + Portal portal = Portal.getByEntrance(event.getTo()); + // No portal or not open + if (portal == null || !portal.isOpen()) return; + + // Not open for this player + if (!portal.isOpenFor(player)) { + Stargate.sendMessage(player, Stargate.getString("denyMsg")); + portal.teleport(player, portal, event); + return; + } + + Portal destination = portal.getDestination(player); + if (!portal.isBungee() && destination == null) return; + + boolean deny = false; + // Check if player has access to this server for Bungee gates + if (portal.isBungee()) { + if (!Stargate.canAccessServer(player, portal.getNetwork())) { + deny = true; + } + } else { + // Check if player has access to this network + if (!Stargate.canAccessNetwork(player, portal.getNetwork())) { + deny = true; + } + + // Check if player has access to destination world + if (!Stargate.canAccessWorld(player, destination.getWorld().getName())) { + deny = true; + } + } + + if (!Stargate.canAccessPortal(player, portal, deny)) { + Stargate.sendMessage(player, Stargate.getString("denyMsg")); + portal.teleport(player, portal, event); + portal.close(false); + return; + } + + int cost = Stargate.getUseCost(player, portal, destination); + if (cost > 0) { + boolean success; + if (portal.getGate().getToOwner()) { + success = portal.getOwnerUUID() != null && Stargate.chargePlayer(player, portal.getOwnerUUID(), cost); + } else { + success = Stargate.chargePlayer(player, cost); + } + if (!success) { + // Insufficient Funds + Stargate.sendMessage(player, Stargate.getString("inFunds")); + portal.close(false); + return; + } + String deductMsg = Stargate.getString("ecoDeduct"); + deductMsg = Stargate.replaceVars(deductMsg, new String[]{"%cost%", "%portal%"}, new String[]{EconomyHandler.format(cost), portal.getName()}); + Stargate.sendMessage(player, deductMsg, false); + if (portal.getGate().getToOwner() && portal.getOwnerUUID() != null) { + Player p; + if (portal.getOwnerUUID() != null) { + p = Stargate.server.getPlayer(portal.getOwnerUUID()); + } else { + p = Stargate.server.getPlayer(portal.getOwnerName()); + } + if (p != null) { + String obtainedMsg = Stargate.getString("ecoObtain"); + obtainedMsg = Stargate.replaceVars(obtainedMsg, new String[]{"%cost%", "%portal%"}, new String[]{EconomyHandler.format(cost), portal.getName()}); + Stargate.sendMessage(p, obtainedMsg, false); + } + } + } + + Stargate.sendMessage(player, Stargate.getString("teleportMsg"), false); + + // BungeeCord Support + if (portal.isBungee()) { + if (!Stargate.enableBungee) { + player.sendMessage(Stargate.getString("bungeeDisabled")); + portal.close(false); + return; + } + + // Teleport the player back to this gate, for sanity's sake + portal.teleport(player, portal, event); + + // Send the SGBungee packet first, it will be queued by BC if required + try { + // Build the message, format is #@# + String msg = event.getPlayer().getName() + "#@#" + portal.getDestinationName(); + // Build the message data, sent over the SGBungee bungeecord channel + ByteArrayOutputStream bao = new ByteArrayOutputStream(); + DataOutputStream msgData = new DataOutputStream(bao); + msgData.writeUTF("Forward"); + msgData.writeUTF(portal.getNetwork()); // Server + msgData.writeUTF("SGBungee"); // Channel + msgData.writeShort(msg.length()); // Data Length + msgData.writeBytes(msg); // Data + player.sendPluginMessage(Stargate.stargate, "BungeeCord", bao.toByteArray()); + } catch (IOException ex) { + Stargate.log.severe(Stargate.getString("prefix") + "Error sending BungeeCord teleport packet"); + ex.printStackTrace(); + return; + } + + // Connect player to new server + try { + ByteArrayOutputStream bao = new ByteArrayOutputStream(); + DataOutputStream msgData = new DataOutputStream(bao); + msgData.writeUTF("Connect"); + msgData.writeUTF(portal.getNetwork()); + + player.sendPluginMessage(Stargate.stargate, "BungeeCord", bao.toByteArray()); + bao.reset(); + } catch (IOException ex) { + Stargate.log.severe(Stargate.getString("prefix") + "Error sending BungeeCord connect packet"); + ex.printStackTrace(); + return; + } + + // Close portal if required (Should never be) + portal.close(false); + return; + } + + destination.teleport(player, portal, event); + portal.close(false); + } + + @EventHandler + public void onPlayerInteract(PlayerInteractEvent event) { + Player player = event.getPlayer(); + Block block = event.getClickedBlock(); + + if (block == null) { + return; + } + + // Right click + if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { + if (block.getBlockData() instanceof WallSign) { + Portal portal = Portal.getByBlock(block); + if (portal == null) { + return; + } + // Cancel item use + event.setUseItemInHand(Event.Result.DENY); + event.setUseInteractedBlock(Event.Result.DENY); + + boolean deny = false; + if (!Stargate.canAccessNetwork(player, portal.getNetwork())) { + deny = true; + } + + if (!Stargate.canAccessPortal(player, portal, deny)) { + Stargate.sendMessage(player, Stargate.getString("denyMsg")); + return; + } + + if ((!portal.isOpen()) && (!portal.isFixed())) { + portal.cycleDestination(player); + } + return; + } + + // Implement right-click to toggle a stargate, gets around spawn protection problem. + if (Tag.BUTTONS.isTagged(block.getType()) || MaterialHelper.isWallCoral(block.getType())) { + + if (MaterialHelper.isWallCoral(block.getType())) { + if (previousEvent != null && + event.getPlayer() == previousEvent.getPlayer() && eventTime + 10 > System.currentTimeMillis()) { + previousEvent = null; + eventTime = 0; + return; + } + previousEvent = event; + eventTime = System.currentTimeMillis(); + } + + Portal portal = Portal.getByBlock(block); + if (portal == null) { + return; + } + + // Cancel item use + event.setUseItemInHand(Event.Result.DENY); + event.setUseInteractedBlock(Event.Result.DENY); + + boolean deny = false; + if (!Stargate.canAccessNetwork(player, portal.getNetwork())) { + deny = true; + } + + if (!Stargate.canAccessPortal(player, portal, deny)) { + Stargate.sendMessage(player, Stargate.getString("denyMsg")); + return; + } + + Stargate.openPortal(player, portal); + if (portal.isOpenFor(player)) { + event.setUseInteractedBlock(Event.Result.ALLOW); + } + } + return; + } + + // Left click + if (event.getAction() == Action.LEFT_CLICK_BLOCK) { + // Check if we're scrolling a sign + if (block.getBlockData() instanceof WallSign) { + Portal portal = Portal.getByBlock(block); + if (portal == null) return; + + event.setUseInteractedBlock(Event.Result.DENY); + // Only cancel event in creative mode + if (player.getGameMode().equals(GameMode.CREATIVE)) { + event.setCancelled(true); + } + + boolean deny = false; + if (!Stargate.canAccessNetwork(player, portal.getNetwork())) { + deny = true; + } + + if (!Stargate.canAccessPortal(player, portal, deny)) { + Stargate.sendMessage(player, Stargate.getString("denyMsg")); + return; + } + + if ((!portal.isOpen()) && (!portal.isFixed())) { + portal.cycleDestination(player, -1); + } + } + } + } + +} diff --git a/src/main/java/net/knarcraft/stargate/Portal.java b/src/main/java/net/knarcraft/stargate/Portal.java index 52b996e..c6f665d 100644 --- a/src/main/java/net/knarcraft/stargate/Portal.java +++ b/src/main/java/net/knarcraft/stargate/Portal.java @@ -911,7 +911,9 @@ public class Portal { return null; } - if (Gate.getGatesByControlBlock(idParent).length == 0) return null; + if (Gate.getGatesByControlBlock(idParent).length == 0) { + return null; + } if (Portal.getByBlock(idParent) != null) { Stargate.debug("createPortal", "idParent belongs to existing gate"); @@ -924,6 +926,7 @@ public class Portal { String destName = filterName(event.getLine(1)); String network = filterName(event.getLine(2)); String options = filterName(event.getLine(3)).toLowerCase(); + boolean hidden = (options.indexOf('h') != -1); boolean alwaysOn = (options.indexOf('a') != -1); boolean priv = (options.indexOf('p') != -1); @@ -935,14 +938,30 @@ public class Portal { boolean bungee = (options.indexOf('u') != -1); // Check permissions for options. - if (hidden && !Stargate.canOption(player, "hidden")) hidden = false; - if (alwaysOn && !Stargate.canOption(player, "alwayson")) alwaysOn = false; - if (priv && !Stargate.canOption(player, "private")) priv = false; - if (free && !Stargate.canOption(player, "free")) free = false; - if (backwards && !Stargate.canOption(player, "backwards")) backwards = false; - if (show && !Stargate.canOption(player, "show")) show = false; - if (noNetwork && !Stargate.canOption(player, "nonetwork")) noNetwork = false; - if (random && !Stargate.canOption(player, "random")) random = false; + if (hidden && !Stargate.canOption(player, "hidden")) { + hidden = false; + } + if (alwaysOn && !Stargate.canOption(player, "alwayson")) { + alwaysOn = false; + } + if (priv && !Stargate.canOption(player, "private")) { + priv = false; + } + if (free && !Stargate.canOption(player, "free")) { + free = false; + } + if (backwards && !Stargate.canOption(player, "backwards")) { + backwards = false; + } + if (show && !Stargate.canOption(player, "show")) { + show = false; + } + if (noNetwork && !Stargate.canOption(player, "nonetwork")) { + noNetwork = false; + } + if (random && !Stargate.canOption(player, "random")) { + random = false; + } // Can not create a non-fixed always-on gate. if (alwaysOn && destName.length() == 0) { @@ -995,28 +1014,29 @@ public class Portal { RelativeBlockVector buttonVector = null; for (Gate possibility : possibleGates) { - if ((gate == null) && (buttonVector == null)) { - RelativeBlockVector[] vectors = possibility.getControls(); - RelativeBlockVector otherControl = null; + if (gate != null || buttonVector != null) { + break; + } + RelativeBlockVector[] vectors = possibility.getControls(); + RelativeBlockVector otherControl = null; - for (RelativeBlockVector vector : vectors) { - BlockLocation tl = parent.modRelative(-vector.getRight(), -vector.getDepth(), -vector.getDistance(), modX, 1, modZ); + for (RelativeBlockVector vector : vectors) { + BlockLocation tl = parent.modRelative(-vector.getRight(), -vector.getDepth(), -vector.getDistance(), modX, 1, modZ); - if (gate == null) { - if (possibility.matches(tl, modX, modZ, true)) { - gate = possibility; - topleft = tl; + if (gate == null) { + if (possibility.matches(tl, modX, modZ, true)) { + gate = possibility; + topleft = tl; - if (otherControl != null) { - buttonVector = otherControl; - } + if (otherControl != null) { + buttonVector = otherControl; } - } else if (otherControl != null) { - buttonVector = vector; } - - otherControl = vector; + } else if (otherControl != null) { + buttonVector = vector; } + + otherControl = vector; } } diff --git a/src/main/java/net/knarcraft/stargate/Stargate.java b/src/main/java/net/knarcraft/stargate/Stargate.java index 441c24d..68c98ca 100644 --- a/src/main/java/net/knarcraft/stargate/Stargate.java +++ b/src/main/java/net/knarcraft/stargate/Stargate.java @@ -4,7 +4,6 @@ import net.knarcraft.stargate.event.StargateAccessEvent; import net.knarcraft.stargate.event.StargateDestroyEvent; import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.Tag; @@ -20,11 +19,9 @@ import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.entity.Vehicle; -import org.bukkit.event.Event.Result; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockFromToEvent; import org.bukkit.event.block.BlockPhysicsEvent; @@ -32,10 +29,6 @@ import org.bukkit.event.block.BlockPistonExtendEvent; import org.bukkit.event.block.BlockPistonRetractEvent; import org.bukkit.event.block.SignChangeEvent; import org.bukkit.event.entity.EntityExplodeEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.server.PluginDisableEvent; import org.bukkit.event.server.PluginEnableEvent; import org.bukkit.event.vehicle.VehicleMoveEvent; @@ -47,10 +40,7 @@ import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPluginLoader; -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; import java.io.File; -import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; @@ -170,7 +160,7 @@ public class Stargate extends JavaPlugin { log.info(pdfFile.getName() + " v." + pdfFile.getVersion() + " is enabled."); // Register events before loading gates to stop weird things happening. - pm.registerEvents(new pListener(), this); + pm.registerEvents(new PlayerEventsListener(), this); pm.registerEvents(new bListener(), this); pm.registerEvents(new vListener(), this); @@ -759,273 +749,25 @@ public class Stargate extends JavaPlugin { } } - private class pListener implements Listener { - @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) { - if (!enableBungee) return; - Player player = event.getPlayer(); - String destination = bungeeQueue.remove(player.getName().toLowerCase()); - if (destination == null) return; - - Portal portal = Portal.getBungeeGate(destination); - if (portal == null) { - Stargate.debug("PlayerJoin", "Error fetching destination portal: " + destination); - return; - } - portal.teleport(player, portal, null); - } - - @EventHandler - public void onPlayerTeleport(PlayerTeleportEvent event) { - // cancel portal and endgateway teleportation if it's from a stargate entrance - PlayerTeleportEvent.TeleportCause cause = event.getCause(); - if (!event.isCancelled() - && (cause == PlayerTeleportEvent.TeleportCause.NETHER_PORTAL - || cause == PlayerTeleportEvent.TeleportCause.END_GATEWAY && World.Environment.THE_END == event.getFrom().getWorld().getEnvironment()) - && Portal.getByAdjacentEntrance(event.getFrom()) != null) { - event.setCancelled(true); - } - } - - @EventHandler - public void onPlayerMove(PlayerMoveEvent event) { - if (event.isCancelled()) return; - - // Check to see if the player actually moved - if (event.getFrom().getBlockX() == event.getTo().getBlockX() && event.getFrom().getBlockY() == event.getTo().getBlockY() && event.getFrom().getBlockZ() == event.getTo().getBlockZ()) { - return; - } - - Player player = event.getPlayer(); - Portal portal = Portal.getByEntrance(event.getTo()); - // No portal or not open - if (portal == null || !portal.isOpen()) return; - - // Not open for this player - if (!portal.isOpenFor(player)) { - Stargate.sendMessage(player, Stargate.getString("denyMsg")); - portal.teleport(player, portal, event); - return; - } - - Portal destination = portal.getDestination(player); - if (!portal.isBungee() && destination == null) return; - - boolean deny = false; - // Check if player has access to this server for Bungee gates - if (portal.isBungee()) { - if (!canAccessServer(player, portal.getNetwork())) { - deny = true; - } - } else { - // Check if player has access to this network - if (!canAccessNetwork(player, portal.getNetwork())) { - deny = true; - } - - // Check if player has access to destination world - if (!canAccessWorld(player, destination.getWorld().getName())) { - deny = true; - } - } - - if (!canAccessPortal(player, portal, deny)) { - Stargate.sendMessage(player, Stargate.getString("denyMsg")); - portal.teleport(player, portal, event); - portal.close(false); - return; - } - - int cost = Stargate.getUseCost(player, portal, destination); - if (cost > 0) { - boolean success; - if (portal.getGate().getToOwner()) { - success = portal.getOwnerUUID() != null && Stargate.chargePlayer(player, portal.getOwnerUUID(), cost); - } else { - success = Stargate.chargePlayer(player, cost); - } - if (!success) { - // Insufficient Funds - Stargate.sendMessage(player, Stargate.getString("inFunds")); - portal.close(false); - return; - } - String deductMsg = Stargate.getString("ecoDeduct"); - deductMsg = Stargate.replaceVars(deductMsg, new String[]{"%cost%", "%portal%"}, new String[]{EconomyHandler.format(cost), portal.getName()}); - sendMessage(player, deductMsg, false); - if (portal.getGate().getToOwner() && portal.getOwnerUUID() != null) { - Player p; - if (portal.getOwnerUUID() != null) { - p = server.getPlayer(portal.getOwnerUUID()); - } else { - p = server.getPlayer(portal.getOwnerName()); - } - if (p != null) { - String obtainedMsg = Stargate.getString("ecoObtain"); - obtainedMsg = Stargate.replaceVars(obtainedMsg, new String[]{"%cost%", "%portal%"}, new String[]{EconomyHandler.format(cost), portal.getName()}); - Stargate.sendMessage(p, obtainedMsg, false); - } - } - } - - Stargate.sendMessage(player, Stargate.getString("teleportMsg"), false); - - // BungeeCord Support - if (portal.isBungee()) { - if (!enableBungee) { - player.sendMessage(Stargate.getString("bungeeDisabled")); - portal.close(false); - return; - } - - // Teleport the player back to this gate, for sanity's sake - portal.teleport(player, portal, event); - - // Send the SGBungee packet first, it will be queued by BC if required - try { - // Build the message, format is #@# - String msg = event.getPlayer().getName() + "#@#" + portal.getDestinationName(); - // Build the message data, sent over the SGBungee bungeecord channel - ByteArrayOutputStream bao = new ByteArrayOutputStream(); - DataOutputStream msgData = new DataOutputStream(bao); - msgData.writeUTF("Forward"); - msgData.writeUTF(portal.getNetwork()); // Server - msgData.writeUTF("SGBungee"); // Channel - msgData.writeShort(msg.length()); // Data Length - msgData.writeBytes(msg); // Data - player.sendPluginMessage(stargate, "BungeeCord", bao.toByteArray()); - } catch (IOException ex) { - Stargate.log.severe(Stargate.getString("prefix") + "Error sending BungeeCord teleport packet"); - ex.printStackTrace(); - return; - } - - // Connect player to new server - try { - ByteArrayOutputStream bao = new ByteArrayOutputStream(); - DataOutputStream msgData = new DataOutputStream(bao); - msgData.writeUTF("Connect"); - msgData.writeUTF(portal.getNetwork()); - - player.sendPluginMessage(stargate, "BungeeCord", bao.toByteArray()); - bao.reset(); - } catch (IOException ex) { - Stargate.log.severe(Stargate.getString("prefix") + "Error sending BungeeCord connect packet"); - ex.printStackTrace(); - return; - } - - // Close portal if required (Should never be) - portal.close(false); - return; - } - - destination.teleport(player, portal, event); - portal.close(false); - } - - @EventHandler - public void onPlayerInteract(PlayerInteractEvent event) { - Player player = event.getPlayer(); - Block block = event.getClickedBlock(); - - if (block == null) return; - - // Right click - if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { - if (block.getBlockData() instanceof WallSign) { - Portal portal = Portal.getByBlock(block); - if (portal == null) return; - // Cancel item use - event.setUseItemInHand(Result.DENY); - event.setUseInteractedBlock(Result.DENY); - - boolean deny = false; - if (!Stargate.canAccessNetwork(player, portal.getNetwork())) { - deny = true; - } - - if (!Stargate.canAccessPortal(player, portal, deny)) { - Stargate.sendMessage(player, Stargate.getString("denyMsg")); - return; - } - - if ((!portal.isOpen()) && (!portal.isFixed())) { - portal.cycleDestination(player); - } - return; - } - - // Implement right-click to toggle a stargate, gets around spawn protection problem. - if (Tag.BUTTONS.isTagged(block.getType())) { - Portal portal = Portal.getByBlock(block); - if (portal == null) return; - - // Cancel item use - event.setUseItemInHand(Result.DENY); - event.setUseInteractedBlock(Result.DENY); - - boolean deny = false; - if (!Stargate.canAccessNetwork(player, portal.getNetwork())) { - deny = true; - } - - if (!Stargate.canAccessPortal(player, portal, deny)) { - Stargate.sendMessage(player, Stargate.getString("denyMsg")); - return; - } - - openPortal(player, portal); - if (portal.isOpenFor(player)) { - event.setUseInteractedBlock(Result.ALLOW); - } - } - return; - } - - // Left click - if (event.getAction() == Action.LEFT_CLICK_BLOCK) { - // Check if we're scrolling a sign - if (block.getBlockData() instanceof WallSign) { - Portal portal = Portal.getByBlock(block); - if (portal == null) return; - - event.setUseInteractedBlock(Result.DENY); - // Only cancel event in creative mode - if (player.getGameMode().equals(GameMode.CREATIVE)) { - event.setCancelled(true); - } - - boolean deny = false; - if (!Stargate.canAccessNetwork(player, portal.getNetwork())) { - deny = true; - } - - if (!Stargate.canAccessPortal(player, portal, deny)) { - Stargate.sendMessage(player, Stargate.getString("denyMsg")); - return; - } - - if ((!portal.isOpen()) && (!portal.isFixed())) { - portal.cycleDestination(player, -1); - } - } - } - } - } private class bListener implements Listener { @EventHandler public void onSignChange(SignChangeEvent event) { - if (event.isCancelled()) return; + if (event.isCancelled()) { + return; + } Player player = event.getPlayer(); Block block = event.getBlock(); - if (!(block.getBlockData() instanceof WallSign)) return; + if (!(block.getBlockData() instanceof WallSign)) { + return; + } final Portal portal = Portal.createPortal(event, player); // Not creating a gate, just placing a sign - if (portal == null) return; + if (portal == null) { + return; + } Stargate.sendMessage(player, Stargate.getString("createMsg"), false); Stargate.debug("onSignChange", "Initialized stargate: " + portal.getName()); @@ -1104,7 +846,7 @@ public class Stargate extends JavaPlugin { // Handle keeping portal material and buttons around if (block.getType() == Material.NETHER_PORTAL) { portal = Portal.getByEntrance(block); - } else if (Tag.BUTTONS.isTagged(block.getType())) { + } else if (Tag.BUTTONS.isTagged(block.getType()) || MaterialHelper.isWallCoral(block.getType())) { portal = Portal.getByControl(block); } if (portal != null) event.setCancelled(true);