diff --git a/src/main/java/net/knarcraft/stargate/BlockLocation.java b/src/main/java/net/knarcraft/stargate/BlockLocation.java index f033b10..639072e 100644 --- a/src/main/java/net/knarcraft/stargate/BlockLocation.java +++ b/src/main/java/net/knarcraft/stargate/BlockLocation.java @@ -202,9 +202,12 @@ public class BlockLocation extends Location { @Override public boolean equals(Object obj) { - if (this == obj) return true; - if (obj == null) return false; - if (getClass() != obj.getClass()) return false; + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } BlockLocation blockLocation = (BlockLocation) obj; diff --git a/src/main/java/net/knarcraft/stargate/RelativeBlockVector.java b/src/main/java/net/knarcraft/stargate/RelativeBlockVector.java index eab9f91..8bf2624 100644 --- a/src/main/java/net/knarcraft/stargate/RelativeBlockVector.java +++ b/src/main/java/net/knarcraft/stargate/RelativeBlockVector.java @@ -4,9 +4,9 @@ package net.knarcraft.stargate; * This stores a block location as a vector relative to a position * *

A relative block vector stores a vector relative to some origin. The origin in this plugin is usually the - * top-left block of a gate. The right is therefore the distance from the top-left corner towards the top-right corner. - * Depth is the distance from the top-left corner to the bottom-left corner. Distance is the distance outward from the - * gate.

+ * top-left block of a gate (top-left when looking at the side with the sign). The right is therefore the distance + * from the top-left corner towards the top-right corner. Depth is the distance from the top-left corner to the + * bottom-left corner. Distance is the distance outward from the gate.

*/ public class RelativeBlockVector { @@ -56,12 +56,15 @@ public class RelativeBlockVector { @Override public String toString() { - return String.format("right = %d, depth = %d, distance = %d", right, depth, distance); + return String.format("(right = %d, depth = %d, distance = %d)", right, depth, distance); } @Override public boolean equals(Object other) { - if (!(other instanceof RelativeBlockVector)) { + if (other == this) { + return true; + } + if (other == null || this.getClass() != other.getClass()) { return false; } RelativeBlockVector otherVector = (RelativeBlockVector) other; diff --git a/src/main/java/net/knarcraft/stargate/Stargate.java b/src/main/java/net/knarcraft/stargate/Stargate.java index 5bd8765..2ef10ed 100644 --- a/src/main/java/net/knarcraft/stargate/Stargate.java +++ b/src/main/java/net/knarcraft/stargate/Stargate.java @@ -10,6 +10,11 @@ import net.knarcraft.stargate.listener.PlayerEventsListener; import net.knarcraft.stargate.listener.PluginEventListener; import net.knarcraft.stargate.listener.VehicleEventListener; import net.knarcraft.stargate.listener.WorldEventListener; +import net.knarcraft.stargate.portal.Gate; +import net.knarcraft.stargate.portal.GateHandler; +import net.knarcraft.stargate.portal.Portal; +import net.knarcraft.stargate.portal.PortalHandler; +import net.knarcraft.stargate.portal.PortalOption; import net.knarcraft.stargate.thread.BlockPopulatorThread; import net.knarcraft.stargate.thread.StarGateThread; import org.bukkit.Bukkit; @@ -561,8 +566,8 @@ public class Stargate extends JavaPlugin { } } - getServer().getScheduler().scheduleSyncRepeatingTask(this, new StarGateThread(), 0L, 100L); - getServer().getScheduler().scheduleSyncRepeatingTask(this, new BlockPopulatorThread(), 0L, 1L); + getServer().getScheduler().runTaskTimer(this, new StarGateThread(), 0L, 100L); + getServer().getScheduler().runTaskTimer(this, new BlockPopulatorThread(), 0L, 100L); this.registerCommands(); } @@ -626,8 +631,8 @@ public class Stargate extends JavaPlugin { } public void loadGates() { - Gate.loadGates(gateFolder); - log.info(Stargate.getString("prefix") + "Loaded " + Gate.getGateCount() + " gate layouts"); + GateHandler.loadGates(gateFolder); + log.info(Stargate.getString("prefix") + "Loaded " + GateHandler.getGateCount() + " gate layouts"); } public void loadAllPortals() { @@ -688,7 +693,7 @@ public class Stargate extends JavaPlugin { openList.clear(); managedWorlds.clear(); PortalHandler.clearGates(); - Gate.clearGates(); + GateHandler.clearGates(); // Store the old Bungee enabled value boolean oldEnableBungee = enableBungee; diff --git a/src/main/java/net/knarcraft/stargate/event/StargateAccessEvent.java b/src/main/java/net/knarcraft/stargate/event/StargateAccessEvent.java index 8925d53..8370b0e 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargateAccessEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargateAccessEvent.java @@ -1,6 +1,6 @@ package net.knarcraft.stargate.event; -import net.knarcraft.stargate.Portal; +import net.knarcraft.stargate.portal.Portal; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/knarcraft/stargate/event/StargateActivateEvent.java b/src/main/java/net/knarcraft/stargate/event/StargateActivateEvent.java index ea73802..b169580 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargateActivateEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargateActivateEvent.java @@ -1,6 +1,6 @@ package net.knarcraft.stargate.event; -import net.knarcraft.stargate.Portal; +import net.knarcraft.stargate.portal.Portal; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/knarcraft/stargate/event/StargateCloseEvent.java b/src/main/java/net/knarcraft/stargate/event/StargateCloseEvent.java index aacb0d5..8306a92 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargateCloseEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargateCloseEvent.java @@ -1,6 +1,6 @@ package net.knarcraft.stargate.event; -import net.knarcraft.stargate.Portal; +import net.knarcraft.stargate.portal.Portal; import org.bukkit.event.HandlerList; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/knarcraft/stargate/event/StargateCreateEvent.java b/src/main/java/net/knarcraft/stargate/event/StargateCreateEvent.java index 6f901cd..a703a3b 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargateCreateEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargateCreateEvent.java @@ -1,6 +1,6 @@ package net.knarcraft.stargate.event; -import net.knarcraft.stargate.Portal; +import net.knarcraft.stargate.portal.Portal; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/knarcraft/stargate/event/StargateDeactivateEvent.java b/src/main/java/net/knarcraft/stargate/event/StargateDeactivateEvent.java index 4b3e68e..241b6ac 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargateDeactivateEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargateDeactivateEvent.java @@ -1,6 +1,6 @@ package net.knarcraft.stargate.event; -import net.knarcraft.stargate.Portal; +import net.knarcraft.stargate.portal.Portal; import org.bukkit.event.HandlerList; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/knarcraft/stargate/event/StargateDestroyEvent.java b/src/main/java/net/knarcraft/stargate/event/StargateDestroyEvent.java index 0b66b6d..5032036 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargateDestroyEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargateDestroyEvent.java @@ -1,6 +1,6 @@ package net.knarcraft.stargate.event; -import net.knarcraft.stargate.Portal; +import net.knarcraft.stargate.portal.Portal; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/knarcraft/stargate/event/StargateEvent.java b/src/main/java/net/knarcraft/stargate/event/StargateEvent.java index 97da60a..6584355 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargateEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargateEvent.java @@ -1,6 +1,6 @@ package net.knarcraft.stargate.event; -import net.knarcraft.stargate.Portal; +import net.knarcraft.stargate.portal.Portal; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; diff --git a/src/main/java/net/knarcraft/stargate/event/StargateOpenEvent.java b/src/main/java/net/knarcraft/stargate/event/StargateOpenEvent.java index d337b24..04bf752 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargateOpenEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargateOpenEvent.java @@ -1,6 +1,6 @@ package net.knarcraft.stargate.event; -import net.knarcraft.stargate.Portal; +import net.knarcraft.stargate.portal.Portal; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/knarcraft/stargate/event/StargatePlayerEvent.java b/src/main/java/net/knarcraft/stargate/event/StargatePlayerEvent.java index 2dcf77b..bc7074d 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargatePlayerEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargatePlayerEvent.java @@ -1,6 +1,6 @@ package net.knarcraft.stargate.event; -import net.knarcraft.stargate.Portal; +import net.knarcraft.stargate.portal.Portal; import org.bukkit.entity.Player; /** diff --git a/src/main/java/net/knarcraft/stargate/event/StargatePortalEvent.java b/src/main/java/net/knarcraft/stargate/event/StargatePortalEvent.java index 9f80447..ed13e26 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargatePortalEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargatePortalEvent.java @@ -1,6 +1,6 @@ package net.knarcraft.stargate.event; -import net.knarcraft.stargate.Portal; +import net.knarcraft.stargate.portal.Portal; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; diff --git a/src/main/java/net/knarcraft/stargate/listener/BlockEventListener.java b/src/main/java/net/knarcraft/stargate/listener/BlockEventListener.java index 2f8f41e..99ff498 100644 --- a/src/main/java/net/knarcraft/stargate/listener/BlockEventListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/BlockEventListener.java @@ -1,7 +1,7 @@ package net.knarcraft.stargate.listener; -import net.knarcraft.stargate.Portal; -import net.knarcraft.stargate.PortalHandler; +import net.knarcraft.stargate.portal.Portal; +import net.knarcraft.stargate.portal.PortalHandler; import net.knarcraft.stargate.Stargate; import net.knarcraft.stargate.event.StargateDestroyEvent; import net.knarcraft.stargate.utility.EconomyHelper; diff --git a/src/main/java/net/knarcraft/stargate/listener/EntityEventListener.java b/src/main/java/net/knarcraft/stargate/listener/EntityEventListener.java index dfbbde3..9d35ad2 100644 --- a/src/main/java/net/knarcraft/stargate/listener/EntityEventListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/EntityEventListener.java @@ -1,7 +1,7 @@ package net.knarcraft.stargate.listener; -import net.knarcraft.stargate.Portal; -import net.knarcraft.stargate.PortalHandler; +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.event.EventHandler; diff --git a/src/main/java/net/knarcraft/stargate/listener/PlayerEventsListener.java b/src/main/java/net/knarcraft/stargate/listener/PlayerEventsListener.java index 656dca4..15030f1 100644 --- a/src/main/java/net/knarcraft/stargate/listener/PlayerEventsListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/PlayerEventsListener.java @@ -1,8 +1,8 @@ package net.knarcraft.stargate.listener; import net.knarcraft.stargate.BlockLocation; -import net.knarcraft.stargate.Portal; -import net.knarcraft.stargate.PortalHandler; +import net.knarcraft.stargate.portal.Portal; +import net.knarcraft.stargate.portal.PortalHandler; import net.knarcraft.stargate.Stargate; import net.knarcraft.stargate.utility.BungeeHelper; import net.knarcraft.stargate.utility.EconomyHelper; diff --git a/src/main/java/net/knarcraft/stargate/listener/VehicleEventListener.java b/src/main/java/net/knarcraft/stargate/listener/VehicleEventListener.java index 955b859..1888370 100644 --- a/src/main/java/net/knarcraft/stargate/listener/VehicleEventListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/VehicleEventListener.java @@ -1,7 +1,7 @@ package net.knarcraft.stargate.listener; -import net.knarcraft.stargate.Portal; -import net.knarcraft.stargate.PortalHandler; +import net.knarcraft.stargate.portal.Portal; +import net.knarcraft.stargate.portal.PortalHandler; import net.knarcraft.stargate.Stargate; import net.knarcraft.stargate.utility.EconomyHelper; import org.bukkit.entity.Entity; diff --git a/src/main/java/net/knarcraft/stargate/listener/WorldEventListener.java b/src/main/java/net/knarcraft/stargate/listener/WorldEventListener.java index 5c0e056..08c248b 100644 --- a/src/main/java/net/knarcraft/stargate/listener/WorldEventListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/WorldEventListener.java @@ -1,6 +1,6 @@ package net.knarcraft.stargate.listener; -import net.knarcraft.stargate.PortalHandler; +import net.knarcraft.stargate.portal.PortalHandler; import net.knarcraft.stargate.Stargate; import org.bukkit.World; import org.bukkit.event.EventHandler; diff --git a/src/main/java/net/knarcraft/stargate/portal/Gate.java b/src/main/java/net/knarcraft/stargate/portal/Gate.java new file mode 100644 index 0000000..f2fce39 --- /dev/null +++ b/src/main/java/net/knarcraft/stargate/portal/Gate.java @@ -0,0 +1,300 @@ +package net.knarcraft.stargate.portal; + +import net.knarcraft.stargate.BlockLocation; +import net.knarcraft.stargate.EconomyHandler; +import net.knarcraft.stargate.Stargate; +import org.bukkit.Material; + +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Level; + +/** + * A gate describes the physical structure of a stargate + * + *

While the portal class represents a portal in space, the Gate class represents the physical gate/portal entrance.

+ */ +public class Gate { + + private final String filename; + private final GateLayout layout; + private final HashMap types; + + //Gate materials + private Material portalOpenBlock; + private Material portalClosedBlock; + private Material portalButton; + + // Economy information + private int useCost; + private int createCost; + private int destroyCost; + private boolean toOwner; + + /** + * Instantiates a new gate + * + * @param filename

The name of the gate which equal the name of the file

+ * @param layout

The character layout defined in the gate file

+ * @param types

The block types the different layout characters represent

+ * @param portalOpenBlock

The material to set the non-frame to when the portal is open

+ * @param portalClosedBlock

The material to set the non-frame to when the portal is closed

+ * @param portalButton

The material to use for the portal button

+ * @param useCost

The cost of using a portal with this gate layout (-1 to disable)

+ * @param createCost

The cost of creating a portal with this gate layout (-1 to disable)

+ * @param destroyCost

The cost of destroying a portal with this gate layout (-1 to disable)

+ * @param toOwner

Whether any payment should go to the owner of the gate, as opposed to just disappearing

+ */ + public Gate(String filename, GateLayout layout, HashMap types, Material portalOpenBlock, + Material portalClosedBlock, Material portalButton, int useCost, int createCost, int destroyCost, + boolean toOwner) { + this.filename = filename; + this.layout = layout; + this.types = types; + this.portalOpenBlock = portalOpenBlock; + this.portalClosedBlock = portalClosedBlock; + this.portalButton = portalButton; + this.useCost = useCost; + this.createCost = createCost; + this.destroyCost = destroyCost; + this.toOwner = toOwner; + } + + /** + * Gets the layout of this gate + * + * @return

The layout of this gate

+ */ + public GateLayout getLayout() { + return layout; + } + + /** + * Gets the material types each layout character represents + * + * @return

The material types each layout character represents

+ */ + public HashMap getTypes() { + return types; + } + + public Material getControlBlock() { + return types.get('-'); + } + + public String getFilename() { + return filename; + } + + public Material getPortalOpenBlock() { + return portalOpenBlock; + } + + public void setPortalOpenBlock(Material type) { + portalOpenBlock = type; + } + + public Material getPortalClosedBlock() { + return portalClosedBlock; + } + + public void setPortalClosedBlock(Material type) { + portalClosedBlock = type; + } + + public Material getPortalButton() { + return portalButton; + } + + public int getUseCost() { + if (useCost < 0) return EconomyHandler.useCost; + return useCost; + } + + public Integer getCreateCost() { + if (createCost < 0) return EconomyHandler.createCost; + return createCost; + } + + public Integer getDestroyCost() { + if (destroyCost < 0) return EconomyHandler.destroyCost; + return destroyCost; + } + + public Boolean getToOwner() { + return toOwner; + } + + public boolean matches(BlockLocation topLeft, int modX, int modZ) { + return matches(topLeft, modX, modZ, false); + } + + public boolean matches(BlockLocation topLeft, int modX, int modZ, boolean onCreate) { + HashMap portalTypes = new HashMap<>(types); + Character[][] layout = this.layout.getLayout(); + for (int y = 0; y < layout.length; y++) { + for (int x = 0; x < layout[y].length; x++) { + Character key = layout[y][x]; + + if (key.equals(GateHandler.getEntranceCharacter()) || key.equals(GateHandler.getExitCharacter())) { + if (Stargate.ignoreEntrance) { + continue; + } + + Material type = topLeft.modRelative(x, y, 0, modX, 1, modZ).getType(); + + // Ignore entrance if it's air and we're creating a new gate + if (onCreate && type == Material.AIR) { + continue; + } + + if (type != portalClosedBlock && type != portalOpenBlock) { + Stargate.debug("Gate::Matches", "Entrance/Exit Material Mismatch: " + type); + return false; + } + } else if (!key.equals(GateHandler.getAnythingCharacter())) { + Material id = portalTypes.get(key); + if (id == null) { + portalTypes.put(key, topLeft.modRelative(x, y, 0, modX, 1, modZ).getType()); + } else if (topLeft.modRelative(x, y, 0, modX, 1, modZ).getType() != id) { + Stargate.debug("Gate::Matches", "Block Type Mismatch: " + topLeft.modRelative(x, y, 0, modX, 1, modZ).getType() + " != " + id); + return false; + } + } + } + } + + return true; + } + + /** + * Saves this gate to a file + * + *

This method will save the gate to its filename in the given folder.

+ * + * @param gateFolder

The folder to save the gate file in

+ */ + public void save(String gateFolder) { + try { + BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(gateFolder + filename)); + + writeConfig(bufferedWriter, "portal-open", portalOpenBlock.name()); + writeConfig(bufferedWriter, "portal-closed", portalClosedBlock.name()); + writeConfig(bufferedWriter, "button", portalButton.name()); + + //Save the values necessary for economy + saveEconomyValues(bufferedWriter); + + //Store type material type to use for frame blocks + saveFrameBlockTypes(bufferedWriter); + + bufferedWriter.newLine(); + + //Save the layout + layout.save(bufferedWriter); + + bufferedWriter.close(); + } catch (IOException ex) { + Stargate.log.log(Level.SEVERE, "Could not save Gate " + filename + " - " + ex.getMessage()); + } + } + + /** + * Saves current economy related values using a buffered writer + * + * @param bufferedWriter

The buffered writer to write to

+ * * @throws IOException

If unable to write to the buffered writer

+ */ + private void saveEconomyValues(BufferedWriter bufferedWriter) throws IOException { + if (useCost != -1) { + writeConfig(bufferedWriter, "usecost", useCost); + } + if (createCost != -1) { + writeConfig(bufferedWriter, "createcost", createCost); + } + if (destroyCost != -1) { + writeConfig(bufferedWriter, "destroycost", destroyCost); + } + writeConfig(bufferedWriter, "toowner", toOwner); + } + + /** + * Saves the types of blocks used for the gate frame/border using a buffered writer + * + * @param bufferedWriter

The buffered writer to write to

+ * @throws IOException

If unable to write to the buffered writer

+ */ + private void saveFrameBlockTypes(BufferedWriter bufferedWriter) throws IOException { + for (Map.Entry entry : types.entrySet()) { + Character type = entry.getKey(); + Material value = entry.getValue(); + // Skip control values + if (type.equals(GateHandler.getAnythingCharacter()) || + type.equals(GateHandler.getEntranceCharacter()) || + type.equals(GateHandler.getExitCharacter())) { + continue; + } + + bufferedWriter.append(type); + bufferedWriter.append('='); + if (value != null) { + bufferedWriter.append(value.toString()); + } + bufferedWriter.newLine(); + } + } + + /** + * Writes an integer to a config + * + * @param bufferedWriter

The buffered writer to write the config to

+ * @param key

The config key to save

+ * @param value

The value of the config key

+ * @throws IOException

If unable to write to the buffered writer

+ */ + private void writeConfig(BufferedWriter bufferedWriter, String key, int value) throws IOException { + writeConfig(bufferedWriter, "%s=%d", key, value); + } + + /** + * Writes a boolean to a config + * + * @param bufferedWriter

The buffered writer to write the config to

+ * @param key

The config key to save

+ * @param value

The value of the config key

+ * @throws IOException

If unable to write to the buffered writer

+ */ + private void writeConfig(BufferedWriter bufferedWriter, String key, boolean value) throws IOException { + writeConfig(bufferedWriter, "%s=%b", key, value); + } + + /** + * Writes a string to a config + * + * @param bufferedWriter

The buffered writer to write the config to

+ * @param key

The config key to save

+ * @param value

The value of the config key

+ * @throws IOException

If unable to write to the buffered writer

+ */ + private void writeConfig(BufferedWriter bufferedWriter, String key, String value) throws IOException { + writeConfig(bufferedWriter, "%s=%s", key, value); + } + + /** + * Writes a formatted string to a buffered writer + * + * @param bufferedWriter

The buffered writer to write the formatted string to

+ * @param format

The format to use

+ * @param key

The config key to save

+ * @param value

The config value to save

+ * @throws IOException

If unable to write to the buffered writer

+ */ + private void writeConfig(BufferedWriter bufferedWriter, String format, String key, Object value) throws IOException { + bufferedWriter.append(String.format(format, key, value)); + bufferedWriter.newLine(); + } + +} diff --git a/src/main/java/net/knarcraft/stargate/Gate.java b/src/main/java/net/knarcraft/stargate/portal/GateHandler.java similarity index 51% rename from src/main/java/net/knarcraft/stargate/Gate.java rename to src/main/java/net/knarcraft/stargate/portal/GateHandler.java index a5db5d8..7c94e9f 100644 --- a/src/main/java/net/knarcraft/stargate/Gate.java +++ b/src/main/java/net/knarcraft/stargate/portal/GateHandler.java @@ -1,54 +1,56 @@ -package net.knarcraft.stargate; +package net.knarcraft.stargate.portal; +import net.knarcraft.stargate.EconomyHandler; +import net.knarcraft.stargate.Stargate; import net.knarcraft.stargate.utility.MaterialHelper; import org.bukkit.Material; import org.bukkit.block.Block; - -import java.io.BufferedWriter; import java.io.File; -import java.io.FileWriter; -import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Scanner; import java.util.logging.Level; -public class Gate { +public class GateHandler { private static final Character ANYTHING = ' '; private static final Character ENTRANCE = '.'; private static final Character EXIT = '*'; + + private static Material defaultPortalBlockOpen = Material.NETHER_PORTAL; + private static Material defaultPortalBlockClosed = Material.AIR; + private static Material defaultButton = Material.STONE_BUTTON; + private static final HashMap gates = new HashMap<>(); private static final HashMap> controlBlocks = new HashMap<>(); private static final HashSet frameBlocks = new HashSet<>(); - private final String filename; - private final Character[][] layout; - private final HashMap types; - private final HashMap exits = new HashMap<>(); - private RelativeBlockVector[] entrances = new RelativeBlockVector[0]; - private RelativeBlockVector[] border = new RelativeBlockVector[0]; - private RelativeBlockVector[] controls = new RelativeBlockVector[0]; - private RelativeBlockVector exitBlock = null; - private Material portalBlockOpen = Material.NETHER_PORTAL; - private Material portalBlockClosed = Material.AIR; - private Material button = Material.STONE_BUTTON; + private GateHandler() { - // Economy information - private int useCost = -1; - private int createCost = -1; - private int destroyCost = -1; - private boolean toOwner = false; + } - public Gate(String filename, Character[][] layout, HashMap types) { - this.filename = filename; - this.layout = layout; - this.types = types; + /** + * Gets the character used for blocks that are not part of the gate + * + * @return

The character used for blocks that are not part of the gate

+ */ + public static Character getAnythingCharacter() { + return ANYTHING; + } - populateCoordinates(); + /** + * Gets the character used for defining the entrance + * + * @return

The character used for defining the entrance

+ */ + public static Character getEntranceCharacter() { + return ENTRANCE; + } + + public static Character getExitCharacter() { + return EXIT; } public static void registerGate(Gate gate) { @@ -64,17 +66,11 @@ public class Gate { } public static Gate loadGate(File file) { - Scanner scanner = null; - try { - scanner = new Scanner(file); + try (Scanner scanner = new Scanner(file)) { return loadGate(file.getName(), file.getParent(), scanner); } catch (Exception ex) { Stargate.log.log(Level.SEVERE, "Could not load Gate " + file.getName() + " - " + ex.getMessage()); return null; - } finally { - if (scanner != null) { - scanner.close(); - } } } @@ -144,6 +140,7 @@ public class Gate { Character[][] layout = new Character[design.size()][cols]; + //y = relative line number of layout file for (int y = 0; y < design.size(); y++) { List row = design.get(y); Character[] result = new Character[cols]; @@ -159,22 +156,25 @@ public class Gate { layout[y] = result; } - Gate gate = new Gate(fileName, layout, types); + Material portalOpenBlock = readConfig(config, fileName, "portal-open", defaultPortalBlockOpen); + Material portalClosedBlock = readConfig(config, fileName, "portal-closed", defaultPortalBlockClosed); + Material portalButton = readConfig(config, fileName, "button", defaultButton); + int useCost = readConfig(config, fileName, "usecost", -1); + int createCost = readConfig(config, fileName, "createcost", -1); + int destroyCost = readConfig(config, fileName, "destroycost", -1); + boolean toOwner = (config.containsKey("toowner") ? Boolean.valueOf(config.get("toowner")) : EconomyHandler.toOwner); - gate.portalBlockOpen = readConfig(config, fileName, "portal-open", gate.portalBlockOpen); - gate.portalBlockClosed = readConfig(config, fileName, "portal-closed", gate.portalBlockClosed); - gate.button = readConfig(config, fileName, "button", gate.button); - gate.useCost = readConfig(config, fileName, "usecost", -1); - gate.destroyCost = readConfig(config, fileName, "destroycost", -1); - gate.createCost = readConfig(config, fileName, "createcost", -1); - gate.toOwner = (config.containsKey("toowner") ? Boolean.valueOf(config.get("toowner")) : EconomyHandler.toOwner); + Gate gate = new Gate(fileName, new GateLayout(layout), types, portalOpenBlock, portalClosedBlock, portalButton, useCost, + createCost, destroyCost, toOwner); - if (gate.getControls().length != 2) { + + + if (gate.getLayout().getControls().length != 2) { Stargate.log.log(Level.SEVERE, "Could not load Gate " + fileName + " - Gates must have exactly 2 control points."); return null; } - if (!MaterialHelper.isButtonCompatible(gate.button)) { + if (!MaterialHelper.isButtonCompatible(gate.getPortalButton())) { Stargate.log.log(Level.SEVERE, "Could not load Gate " + fileName + " - Gate button must be a type of button."); return null; } @@ -341,227 +341,4 @@ public class Gate { frameBlocks.clear(); } - private void populateCoordinates() { - List entranceList = new ArrayList<>(); - List borderList = new ArrayList<>(); - List controlList = new ArrayList<>(); - RelativeBlockVector[] relativeExits = new RelativeBlockVector[layout[0].length]; - int[] exitDepths = new int[layout[0].length]; - RelativeBlockVector lastExit = null; - - for (int y = 0; y < layout.length; y++) { - for (int x = 0; x < layout[y].length; x++) { - Character key = layout[y][x]; - if (key.equals('-')) { - controlList.add(new RelativeBlockVector(x, y, 0)); - } - - if (key.equals(ENTRANCE) || key.equals(EXIT)) { - entranceList.add(new RelativeBlockVector(x, y, 0)); - exitDepths[x] = y; - if (key.equals(EXIT)) { - this.exitBlock = new RelativeBlockVector(x, y, 0); - } - } else if (!key.equals(ANYTHING)) { - borderList.add(new RelativeBlockVector(x, y, 0)); - } - } - } - - for (int x = 0; x < exitDepths.length; x++) { - relativeExits[x] = new RelativeBlockVector(x, exitDepths[x], 0); - } - - for (int x = relativeExits.length - 1; x >= 0; x--) { - if (relativeExits[x] != null) { - lastExit = relativeExits[x]; - } else { - relativeExits[x] = lastExit; - } - - if (exitDepths[x] > 0) this.exits.put(relativeExits[x], x); - } - - this.entrances = entranceList.toArray(this.entrances); - this.border = borderList.toArray(this.border); - this.controls = controlList.toArray(this.controls); - } - - public void save(String gateFolder) { - try { - BufferedWriter bw = new BufferedWriter(new FileWriter(gateFolder + filename)); - - writeConfig(bw, "portal-open", portalBlockOpen.name()); - writeConfig(bw, "portal-closed", portalBlockClosed.name()); - writeConfig(bw, "button", button.name()); - if (useCost != -1) - writeConfig(bw, "usecost", useCost); - if (createCost != -1) - writeConfig(bw, "createcost", createCost); - if (destroyCost != -1) - writeConfig(bw, "destroycost", destroyCost); - writeConfig(bw, "toowner", toOwner); - - for (Map.Entry entry : types.entrySet()) { - Character type = entry.getKey(); - Material value = entry.getValue(); - // Skip control values - if (type.equals(ANYTHING) || type.equals(ENTRANCE) || type.equals(EXIT)) { - continue; - } - - bw.append(type); - bw.append('='); - if (value != null) { - bw.append(value.toString()); - } - bw.newLine(); - } - - bw.newLine(); - - for (Character[] aLayout : layout) { - for (Character symbol : aLayout) { - bw.append(symbol); - } - bw.newLine(); - } - - bw.close(); - } catch (IOException ex) { - Stargate.log.log(Level.SEVERE, "Could not save Gate " + filename + " - " + ex.getMessage()); - } - } - - private void writeConfig(BufferedWriter bw, String key, int value) throws IOException { - bw.append(String.format("%s=%d", key, value)); - bw.newLine(); - } - - private void writeConfig(BufferedWriter bw, String key, boolean value) throws IOException { - bw.append(String.format("%s=%b", key, value)); - bw.newLine(); - } - - private void writeConfig(BufferedWriter bw, String key, String value) throws IOException { - bw.append(String.format("%s=%s", key, value)); - bw.newLine(); - } - - public Character[][] getLayout() { - return layout; - } - - public HashMap getTypes() { - return types; - } - - public RelativeBlockVector[] getEntrances() { - return entrances; - } - - public RelativeBlockVector[] getBorder() { - return border; - } - - public RelativeBlockVector[] getControls() { - return controls; - } - - public HashMap getExits() { - return exits; - } - - public RelativeBlockVector getExit() { - return exitBlock; - } - - public Material getControlBlock() { - return types.get('-'); - } - - public String getFilename() { - return filename; - } - - public Material getPortalBlockOpen() { - return portalBlockOpen; - } - - public void setPortalBlockOpen(Material type) { - portalBlockOpen = type; - } - - public Material getPortalBlockClosed() { - return portalBlockClosed; - } - - public void setPortalBlockClosed(Material type) { - portalBlockClosed = type; - } - - public Material getButton() { - return button; - } - - public int getUseCost() { - if (useCost < 0) return EconomyHandler.useCost; - return useCost; - } - - public Integer getCreateCost() { - if (createCost < 0) return EconomyHandler.createCost; - return createCost; - } - - public Integer getDestroyCost() { - if (destroyCost < 0) return EconomyHandler.destroyCost; - return destroyCost; - } - - public Boolean getToOwner() { - return toOwner; - } - - public boolean matches(BlockLocation topLeft, int modX, int modZ) { - return matches(topLeft, modX, modZ, false); - } - - public boolean matches(BlockLocation topLeft, int modX, int modZ, boolean onCreate) { - HashMap portalTypes = new HashMap<>(types); - for (int y = 0; y < layout.length; y++) { - for (int x = 0; x < layout[y].length; x++) { - Character key = layout[y][x]; - - if (key.equals(ENTRANCE) || key.equals(EXIT)) { - if (Stargate.ignoreEntrance) { - continue; - } - - Material type = topLeft.modRelative(x, y, 0, modX, 1, modZ).getType(); - - // Ignore entrance if it's air and we're creating a new gate - if (onCreate && type == Material.AIR) { - continue; - } - - if (type != portalBlockClosed && type != portalBlockOpen) { - Stargate.debug("Gate::Matches", "Entrance/Exit Material Mismatch: " + type); - return false; - } - } else if (!key.equals(ANYTHING)) { - Material id = portalTypes.get(key); - if (id == null) { - portalTypes.put(key, topLeft.modRelative(x, y, 0, modX, 1, modZ).getType()); - } else if (topLeft.modRelative(x, y, 0, modX, 1, modZ).getType() != id) { - Stargate.debug("Gate::Matches", "Block Type Mismatch: " + topLeft.modRelative(x, y, 0, modX, 1, modZ).getType() + " != " + id); - return false; - } - } - } - } - - return true; - } - } diff --git a/src/main/java/net/knarcraft/stargate/portal/GateLayout.java b/src/main/java/net/knarcraft/stargate/portal/GateLayout.java new file mode 100644 index 0000000..bdbff33 --- /dev/null +++ b/src/main/java/net/knarcraft/stargate/portal/GateLayout.java @@ -0,0 +1,202 @@ +package net.knarcraft.stargate.portal; + +import net.knarcraft.stargate.RelativeBlockVector; + +import java.io.BufferedWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * The gate layout describes where every part of the gate should be + * + *

The gate layout parses a layout described by a Character matrix and stores the different parts of the gate as + * relative block vectors.

+ */ +public class GateLayout { + + private Character [][] layout; + private final HashMap exits = new HashMap<>(); + private RelativeBlockVector[] entrances = new RelativeBlockVector[0]; + private RelativeBlockVector[] border = new RelativeBlockVector[0]; + private RelativeBlockVector[] controls = new RelativeBlockVector[0]; + private RelativeBlockVector exitBlock = null; + + /** + * Instantiates a new gate layout + * + * @param layout

A character array describing the layout

+ */ + public GateLayout(Character[][] layout) { + this.layout = layout; + readLayout(); + } + + /** + * Gets the character array describing this layout + * + * @return

The character array describing this layout

+ */ + public Character[][] getLayout() { + return this.layout; + } + + /** + * Gets the locations of entrances for this gate + * + * @return

The locations of entrances for this gate

+ */ + public RelativeBlockVector[] getEntrances() { + return entrances; + } + + /** + * Gets the locations of border blocks for the gate described by this layout + * + *

A border block is basically any block of the frame. In terms of the nether gate, the border blocks are every + * block of the gate that's not air when the gate is closed. The sign and button are not border blocks.

+ * + * @return

The locations of border blocks for this gate

+ */ + public RelativeBlockVector[] getBorder() { + return border; + } + + /** + * Gets the exit block defined in the layout + * + * @return

The exit block defined in the layout

+ */ + public RelativeBlockVector getExit() { + return exitBlock; + } + + /** + * Gets other possible exits of the gate + * + * @return

Other possible gate exits

+ */ + public HashMap getExits() { + return exits; + } + + /** + * Gets the locations of the control blocks for this gate + * + *

The control blocks are the blocks where a sign can be placed to create a portal.

+ * + * @return

The locations of the control blocks for this gate

+ */ + public RelativeBlockVector[] getControls() { + return controls; + } + + /** + * Saves the gate layout using a buffered writer + * + * @param bufferedWriter

The buffered writer to write to

+ * @throws IOException

If unable to write to the buffered writer

+ */ + public void save(BufferedWriter bufferedWriter) throws IOException { + for (Character[] line : this.layout) { + for (Character symbol : line) { + bufferedWriter.append(symbol); + } + bufferedWriter.newLine(); + } + } + + /** + * Reads the gate layout to relative block vectors + */ + private void readLayout() { + List entranceList = new ArrayList<>(); + List borderList = new ArrayList<>(); + List controlList = new ArrayList<>(); + RelativeBlockVector[] relativeExits = new RelativeBlockVector[layout[0].length]; + RelativeBlockVector lastExit = null; + + int[] exitDepths = readLayout(controlList, entranceList, borderList); + + //Generate other possible exits + for (int x = 0; x < exitDepths.length; x++) { + relativeExits[x] = new RelativeBlockVector(x, exitDepths[x], 0); + } + + //Add non-null exits to the exits list + for (int x = relativeExits.length - 1; x >= 0; x--) { + if (relativeExits[x] != null) { + lastExit = relativeExits[x]; + } else { + relativeExits[x] = lastExit; + } + + if (exitDepths[x] > 0) { + this.exits.put(relativeExits[x], x); + } + } + + this.entrances = entranceList.toArray(this.entrances); + this.border = borderList.toArray(this.border); + this.controls = controlList.toArray(this.controls); + } + + /** + * Reads the given layout matrix, filling in the given lists of relative block vectors + * + * @param controlList

The list of control blocks to save to

+ * @param entranceList

The list of entrances to save to

+ * @param borderList

The list of border blocks to save to

+ * @return

A list of depths of possible extra exits

+ */ + private int[] readLayout(List controlList, List entranceList, + List borderList) { + //Store the depth/line of each + int[] exitDepths = new int[layout[0].length]; + + int lineCount = layout.length; + for (int lineIndex = 0; lineIndex < lineCount; lineIndex++) { + int rowSize = layout[lineIndex].length; + for (int rowIndex = 0; rowIndex < rowSize; rowIndex++) { + Character key = layout[lineIndex][rowIndex]; + parseLayoutCharacter(key, rowIndex, lineIndex, exitDepths, controlList, entranceList, borderList); + } + } + return exitDepths; + } + + /** + * Parses one character of the layout + * + * @param key

The character read

+ * @param rowIndex

The row of the read character

+ * @param lineIndex

The line of the read character

+ * @param exitDepths

The list of exit depths to save to

+ * @param controlList

The list of control blocks to save to

+ * @param entranceList

The list of entrances to save to

+ * @param borderList

The list of border blocks to save to

+ */ + private void parseLayoutCharacter(Character key, int rowIndex, int lineIndex, int[] exitDepths, + List controlList, List entranceList, + List borderList) { + //Add control blocks + if (key.equals('-')) { + controlList.add(new RelativeBlockVector(rowIndex, lineIndex, 0)); + } + + if (key.equals(GateHandler.getEntranceCharacter()) || key.equals(GateHandler.getExitCharacter())) { + //Register entrances + entranceList.add(new RelativeBlockVector(rowIndex, lineIndex, 0)); + //Find the lowest exit block at a given x position + exitDepths[rowIndex] = lineIndex; + //Register exit + if (key.equals(GateHandler.getExitCharacter())) { + this.exitBlock = new RelativeBlockVector(rowIndex, lineIndex, 0); + } + } else if (!key.equals(GateHandler.getAnythingCharacter())) { + //Add border + borderList.add(new RelativeBlockVector(rowIndex, lineIndex, 0)); + } + } +} diff --git a/src/main/java/net/knarcraft/stargate/Portal.java b/src/main/java/net/knarcraft/stargate/portal/Portal.java similarity index 97% rename from src/main/java/net/knarcraft/stargate/Portal.java rename to src/main/java/net/knarcraft/stargate/portal/Portal.java index 065596b..a705168 100644 --- a/src/main/java/net/knarcraft/stargate/Portal.java +++ b/src/main/java/net/knarcraft/stargate/portal/Portal.java @@ -1,5 +1,10 @@ -package net.knarcraft.stargate; +package net.knarcraft.stargate.portal; +import net.knarcraft.stargate.BlockLocation; +import net.knarcraft.stargate.BloxPopulator; +import net.knarcraft.stargate.EconomyHandler; +import net.knarcraft.stargate.RelativeBlockVector; +import net.knarcraft.stargate.Stargate; import net.knarcraft.stargate.event.StargateActivateEvent; import net.knarcraft.stargate.event.StargateCloseEvent; import net.knarcraft.stargate.event.StargateDeactivateEvent; @@ -317,7 +322,7 @@ public class Portal { public BlockLocation[] getEntrances() { if (entrances == null) { - RelativeBlockVector[] space = gate.getEntrances(); + RelativeBlockVector[] space = gate.getLayout().getEntrances(); entrances = new BlockLocation[space.length]; int i = 0; @@ -330,7 +335,7 @@ public class Portal { public BlockLocation[] getFrame() { if (frame == null) { - RelativeBlockVector[] border = gate.getBorder(); + RelativeBlockVector[] border = gate.getLayout().getBorder(); frame = new BlockLocation[border.length]; int i = 0; @@ -371,7 +376,7 @@ public class Portal { if (isOpen() && !force) return false; - Material openType = gate.getPortalBlockOpen(); + Material openType = gate.getPortalOpenBlock(); Axis ax = openType == Material.NETHER_PORTAL ? rot : null; for (BlockLocation inside : getEntrances()) { Stargate.blockPopulatorQueue.add(new BloxPopulator(inside, openType, ax)); @@ -409,7 +414,7 @@ public class Portal { if (isAlwaysOn() && !force) return; // Only close always-open if forced // Close this gate, then the dest gate. - Material closedType = gate.getPortalBlockClosed(); + Material closedType = gate.getPortalClosedBlock(); for (BlockLocation inside : getEntrances()) { Stargate.blockPopulatorQueue.add(new BloxPopulator(inside, closedType)); } @@ -455,7 +460,7 @@ public class Portal { } public boolean isPowered() { - RelativeBlockVector[] controls = gate.getControls(); + RelativeBlockVector[] controls = gate.getLayout().getControls(); for (RelativeBlockVector vector : controls) { BlockData data = getBlockAt(vector).getBlock().getBlockData(); @@ -583,8 +588,8 @@ public class Portal { public Location getExit(Entity entity, Location traveller) { Location exitLocation = null; // Check if the gate has an exit block - if (gate.getExit() != null) { - BlockLocation exit = getBlockAt(gate.getExit()); + 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); @@ -657,7 +662,7 @@ public class Portal { if (!Stargate.verifyPortals) { return true; } - for (RelativeBlockVector control : gate.getControls()) { + for (RelativeBlockVector control : gate.getLayout().getControls()) { verified = verified && getBlockAt(control).getBlock().getType().equals(gate.getControlBlock()); } return verified; diff --git a/src/main/java/net/knarcraft/stargate/PortalHandler.java b/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java similarity index 97% rename from src/main/java/net/knarcraft/stargate/PortalHandler.java rename to src/main/java/net/knarcraft/stargate/portal/PortalHandler.java index a45f8c2..4c38422 100644 --- a/src/main/java/net/knarcraft/stargate/PortalHandler.java +++ b/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java @@ -1,5 +1,9 @@ -package net.knarcraft.stargate; +package net.knarcraft.stargate.portal; +import net.knarcraft.stargate.BlockLocation; +import net.knarcraft.stargate.RelativeBlockVector; +import net.knarcraft.stargate.Stargate; +import net.knarcraft.stargate.TwoTuple; import net.knarcraft.stargate.event.StargateCreateEvent; import net.knarcraft.stargate.utility.EconomyHelper; import org.bukkit.Bukkit; @@ -38,6 +42,10 @@ public class PortalHandler { // A list of Bungee gates private static final Map bungeePortals = new HashMap<>(); + private PortalHandler() { + + } + public static List getNetwork(String network) { return allPortalsNet.get(network.toLowerCase()); } @@ -208,7 +216,7 @@ public class PortalHandler { return null; } - if (Gate.getGatesByControlBlock(idParent).length == 0) { + if (GateHandler.getGatesByControlBlock(idParent).length == 0) { return null; } @@ -250,7 +258,7 @@ public class PortalHandler { buttonFacing = BlockFace.SOUTH; } - Gate[] possibleGates = Gate.getGatesByControlBlock(idParent); + Gate[] possibleGates = GateHandler.getGatesByControlBlock(idParent); Gate gate = null; RelativeBlockVector buttonVector = null; @@ -258,7 +266,7 @@ public class PortalHandler { if (gate != null || buttonVector != null) { break; } - RelativeBlockVector[] vectors = possibility.getControls(); + RelativeBlockVector[] vectors = possibility.getLayout().getControls(); RelativeBlockVector otherControl = null; for (RelativeBlockVector vector : vectors) { @@ -357,7 +365,7 @@ public class PortalHandler { } // Bleh, gotta check to make sure none of this gate belongs to another gate. Boo slow. - for (RelativeBlockVector v : gate.getBorder()) { + for (RelativeBlockVector v : gate.getLayout().getBorder()) { BlockLocation b = topLeft.modRelative(v.getRight(), v.getDepth(), v.getDistance(), modX, 1, modZ); if (getByBlock(b.getBlock()) != null) { Stargate.debug("createPortal", "Gate conflicts with existing gate"); @@ -427,7 +435,7 @@ public class PortalHandler { // No button on an always-open gate. if (!portalOptions.get(PortalOption.ALWAYS_ON)) { button = topLeft.modRelative(buttonVector.getRight(), buttonVector.getDepth(), buttonVector.getDistance() + 1, modX, 1, modZ); - Directional buttonData = (Directional) Bukkit.createBlockData(gate.getButton()); + Directional buttonData = (Directional) Bukkit.createBlockData(gate.getPortalButton()); buttonData.setFacing(buttonFacing); button.getBlock().setBlockData(buttonData); portal.setButton(button); @@ -447,7 +455,7 @@ public class PortalHandler { // Set the inside of the gate to its closed material } else { for (BlockLocation inside : portal.getEntrances()) { - inside.setType(portal.getGate().getPortalBlockClosed()); + inside.setType(portal.getGate().getPortalClosedBlock()); } } @@ -813,7 +821,7 @@ public class PortalHandler { int modZ = Integer.parseInt(portalData[4]); float rotX = Float.parseFloat(portalData[5]); BlockLocation topLeft = new BlockLocation(world, portalData[6]); - Gate gate = Gate.getGateByName(portalData[7]); + Gate gate = GateHandler.getGateByName(portalData[7]); if (gate == null) { Stargate.log.info(Stargate.getString("prefix") + "Gate layout on line " + lineIndex + " does not exist [" + portalData[7] + "]"); @@ -907,7 +915,7 @@ public class PortalHandler { */ private static void destroyInvalidStarGate(Portal portal) { // DEBUG - for (RelativeBlockVector control : portal.getGate().getControls()) { + for (RelativeBlockVector control : portal.getGate().getLayout().getControls()) { if (!portal.getBlockAt(control).getBlock().getType().equals(portal.getGate().getControlBlock())) { Stargate.debug("loadAllGates", "Control Block Type == " + portal.getBlockAt(control).getBlock().getType().name()); } diff --git a/src/main/java/net/knarcraft/stargate/PortalOption.java b/src/main/java/net/knarcraft/stargate/portal/PortalOption.java similarity index 98% rename from src/main/java/net/knarcraft/stargate/PortalOption.java rename to src/main/java/net/knarcraft/stargate/portal/PortalOption.java index 1c87685..e989aec 100644 --- a/src/main/java/net/knarcraft/stargate/PortalOption.java +++ b/src/main/java/net/knarcraft/stargate/portal/PortalOption.java @@ -1,4 +1,4 @@ -package net.knarcraft.stargate; +package net.knarcraft.stargate.portal; public enum PortalOption { diff --git a/src/main/java/net/knarcraft/stargate/thread/StarGateThread.java b/src/main/java/net/knarcraft/stargate/thread/StarGateThread.java index bfdedec..234c370 100644 --- a/src/main/java/net/knarcraft/stargate/thread/StarGateThread.java +++ b/src/main/java/net/knarcraft/stargate/thread/StarGateThread.java @@ -1,6 +1,6 @@ package net.knarcraft.stargate.thread; -import net.knarcraft.stargate.Portal; +import net.knarcraft.stargate.portal.Portal; import net.knarcraft.stargate.Stargate; import java.util.Iterator; diff --git a/src/main/java/net/knarcraft/stargate/utility/BungeeHelper.java b/src/main/java/net/knarcraft/stargate/utility/BungeeHelper.java index 0f2d4b7..b51cf4e 100644 --- a/src/main/java/net/knarcraft/stargate/utility/BungeeHelper.java +++ b/src/main/java/net/knarcraft/stargate/utility/BungeeHelper.java @@ -1,7 +1,7 @@ package net.knarcraft.stargate.utility; -import net.knarcraft.stargate.Portal; -import net.knarcraft.stargate.PortalHandler; +import net.knarcraft.stargate.portal.Portal; +import net.knarcraft.stargate.portal.PortalHandler; import net.knarcraft.stargate.Stargate; import org.bukkit.entity.Player; @@ -20,6 +20,10 @@ public final class BungeeHelper { private final static String bungeeChannel = "BungeeCord"; private final static String teleportMessageDelimiter = "#@#"; + private BungeeHelper() { + + } + /** * Sends a plugin message to BungeeCord allowing the target server to catch it * diff --git a/src/main/java/net/knarcraft/stargate/utility/EconomyHelper.java b/src/main/java/net/knarcraft/stargate/utility/EconomyHelper.java index 238be40..4ca48e0 100644 --- a/src/main/java/net/knarcraft/stargate/utility/EconomyHelper.java +++ b/src/main/java/net/knarcraft/stargate/utility/EconomyHelper.java @@ -1,11 +1,15 @@ package net.knarcraft.stargate.utility; import net.knarcraft.stargate.EconomyHandler; -import net.knarcraft.stargate.Portal; +import net.knarcraft.stargate.portal.Portal; import net.knarcraft.stargate.Stargate; import org.bukkit.entity.Player; -public class EconomyHelper { +public final class EconomyHelper { + + private EconomyHelper() { + + } /** * Tries to make the given user pay the teleport fee diff --git a/src/main/java/net/knarcraft/stargate/utility/MaterialHelper.java b/src/main/java/net/knarcraft/stargate/utility/MaterialHelper.java index 76e4d27..285e118 100644 --- a/src/main/java/net/knarcraft/stargate/utility/MaterialHelper.java +++ b/src/main/java/net/knarcraft/stargate/utility/MaterialHelper.java @@ -8,6 +8,10 @@ import org.bukkit.Tag; */ public final class MaterialHelper { + private MaterialHelper() { + + } + /** * Checks whether the given material is a dead or alive wall coral * diff --git a/src/test/java/net/knarcraft/stargate/RelativeBlockVectorTest.java b/src/test/java/net/knarcraft/stargate/RelativeBlockVectorTest.java index 293e9fd..f4eb05c 100644 --- a/src/test/java/net/knarcraft/stargate/RelativeBlockVectorTest.java +++ b/src/test/java/net/knarcraft/stargate/RelativeBlockVectorTest.java @@ -3,6 +3,7 @@ package net.knarcraft.stargate; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; public class RelativeBlockVectorTest { @@ -14,4 +15,18 @@ public class RelativeBlockVectorTest { assertEquals(23, relativeBlockVector.getDistance()); } + @Test + public void equalsTest() { + RelativeBlockVector vector1 = new RelativeBlockVector(56, 34, 76); + RelativeBlockVector vector2 = new RelativeBlockVector(56, 34, 76); + assertEquals(vector1, vector2); + } + + @Test + public void notEqualsTest() { + RelativeBlockVector vector1 = new RelativeBlockVector(456, 78, 234); + RelativeBlockVector vector2 = new RelativeBlockVector(56, 34, 76); + assertNotEquals(vector1, vector2); + } + } diff --git a/src/test/java/net/knarcraft/stargate/portal/GateLayoutTest.java b/src/test/java/net/knarcraft/stargate/portal/GateLayoutTest.java new file mode 100644 index 0000000..537df09 --- /dev/null +++ b/src/test/java/net/knarcraft/stargate/portal/GateLayoutTest.java @@ -0,0 +1,95 @@ +package net.knarcraft.stargate.portal; + +import be.seeseemelk.mockbukkit.ServerMock; +import be.seeseemelk.mockbukkit.WorldMock; +import net.knarcraft.stargate.RelativeBlockVector; +import net.knarcraft.stargate.Stargate; +import org.bukkit.Material; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import be.seeseemelk.mockbukkit.MockBukkit; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class GateLayoutTest { + + private static GateLayout layout; + + @BeforeAll + public static void setUp() { + ServerMock server = MockBukkit.mock(); + server.addWorld(new WorldMock(Material.DIRT, 5)); + MockBukkit.load(Stargate.class); + layout = GateHandler.getGateByName("nethergate.gate").getLayout(); + } + + @Test + public void gateLayoutExitTest() { + assertEquals(new RelativeBlockVector(1, 3, 0), layout.getExit()); + } + + @Test + public void gateLayoutExitsTest() { + List expected = new ArrayList<>(); + expected.add(new RelativeBlockVector(1, 3, 0)); + expected.add(new RelativeBlockVector(2, 3, 0)); + + Set exits = layout.getExits().keySet(); + exits.forEach((blockVector) -> assertTrue(expected.contains(blockVector))); + } + + @Test + public void gateLayoutBorderTest() { + List expected = new ArrayList<>(); + expected.add(new RelativeBlockVector(1, 0, 0)); + expected.add(new RelativeBlockVector(2, 0, 0)); + expected.add(new RelativeBlockVector(0, 1, 0)); + expected.add(new RelativeBlockVector(0, 2, 0)); + expected.add(new RelativeBlockVector(0, 3, 0)); + expected.add(new RelativeBlockVector(1, 4, 0)); + expected.add(new RelativeBlockVector(2, 4, 0)); + expected.add(new RelativeBlockVector(3, 1, 0)); + expected.add(new RelativeBlockVector(3, 2, 0)); + expected.add(new RelativeBlockVector(3, 3, 0)); + + RelativeBlockVector[] borderBlocks = layout.getBorder(); + for (RelativeBlockVector blockVector : borderBlocks) { + assertTrue(expected.contains(blockVector)); + } + } + + @Test + public void gateLayoutControlsTest() { + List expected = new ArrayList<>(); + expected.add(new RelativeBlockVector(0, 2, 0)); + expected.add(new RelativeBlockVector(3, 2, 0)); + + RelativeBlockVector[] controlBlocks = layout.getControls(); + for (RelativeBlockVector blockVector : controlBlocks) { + assertTrue(expected.contains(blockVector)); + } + } + + @Test + public void gateLayoutEntrancesTest() { + List expected = new ArrayList<>(); + expected.add(new RelativeBlockVector(1, 1, 0)); + expected.add(new RelativeBlockVector(2, 1, 0)); + expected.add(new RelativeBlockVector(1, 2, 0)); + expected.add(new RelativeBlockVector(2, 2, 0)); + expected.add(new RelativeBlockVector(1, 3, 0)); + expected.add(new RelativeBlockVector(2, 3, 0)); + + RelativeBlockVector[] controlBlocks = layout.getEntrances(); + for (RelativeBlockVector blockVector : controlBlocks) { + assertTrue(expected.contains(blockVector)); + } + } + +}