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));
+ }
+ }
+
+}