From f8e95eacbe383cdd0fe1954f0d1d6c7c17d4e488 Mon Sep 17 00:00:00 2001 From: PseudoKnight Date: Wed, 23 May 2018 16:27:48 -0700 Subject: [PATCH] Change gate configuration to use Material names --- src/net/TheDgtl/Stargate/Blox.java | 8 +- src/net/TheDgtl/Stargate/BloxPopulator.java | 12 +- src/net/TheDgtl/Stargate/Gate.java | 139 +++++++++++--------- src/net/TheDgtl/Stargate/Portal.java | 14 +- src/net/TheDgtl/Stargate/Stargate.java | 5 +- 5 files changed, 99 insertions(+), 79 deletions(-) diff --git a/src/net/TheDgtl/Stargate/Blox.java b/src/net/TheDgtl/Stargate/Blox.java index 53dffad..31f0da7 100644 --- a/src/net/TheDgtl/Stargate/Blox.java +++ b/src/net/TheDgtl/Stargate/Blox.java @@ -77,12 +77,12 @@ public class Blox { return makeRelativeLoc(0.5 + -right * modX + distance * modZ, depth, 0.5 + -right * modZ + -distance * modX, rotX, 0); } - public void setType(int type) { - world.getBlockAt(x, y, z).setTypeId(type); + public void setType(Material type) { + world.getBlockAt(x, y, z).setType(type); } - public int getType() { - return world.getBlockAt(x, y, z).getTypeId(); + public Material getType() { + return world.getBlockAt(x, y, z).getType(); } public void setData(int data) { diff --git a/src/net/TheDgtl/Stargate/BloxPopulator.java b/src/net/TheDgtl/Stargate/BloxPopulator.java index 4f6495c..fd18537 100644 --- a/src/net/TheDgtl/Stargate/BloxPopulator.java +++ b/src/net/TheDgtl/Stargate/BloxPopulator.java @@ -1,17 +1,19 @@ package net.TheDgtl.Stargate; +import org.bukkit.Material; + public class BloxPopulator { private Blox blox; - private int nextMat; + private Material nextMat; private byte nextData; - public BloxPopulator(Blox b, int m) { + public BloxPopulator(Blox b, Material m) { blox = b; nextMat = m; nextData = 0; } - public BloxPopulator(Blox b, int m, byte d) { + public BloxPopulator(Blox b, Material m, byte d) { blox = b; nextMat = m; nextData = d; @@ -21,7 +23,7 @@ public class BloxPopulator { blox = b; } - public void setMat(int m) { + public void setMat(Material m) { nextMat = m; } @@ -33,7 +35,7 @@ public class BloxPopulator { return blox; } - public int getMat() { + public Material getMat() { return nextMat; } diff --git a/src/net/TheDgtl/Stargate/Gate.java b/src/net/TheDgtl/Stargate/Gate.java index 340ad29..adbf5e8 100644 --- a/src/net/TheDgtl/Stargate/Gate.java +++ b/src/net/TheDgtl/Stargate/Gate.java @@ -8,6 +8,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Scanner; import java.util.logging.Level; @@ -35,25 +36,24 @@ import org.bukkit.block.Block; */ public class Gate { - public static final int ANYTHING = -1; - public static final int ENTRANCE = -2; - public static final int CONTROL = -3; - public static final int EXIT = -4; + private static final Character ANYTHING = ' '; + private static final Character ENTRANCE = '.'; + private static final Character EXIT = '*'; private static HashMap gates = new HashMap<>(); - private static HashMap> controlBlocks = new HashMap<>(); - private static HashSet frameBlocks = new HashSet<>(); + private static HashMap> controlBlocks = new HashMap<>(); + private static HashSet frameBlocks = new HashSet<>(); private String filename; private Character[][] layout; - private HashMap types; + private HashMap types; private HashMap metadata; private RelativeBlockVector[] entrances = new RelativeBlockVector[0]; private RelativeBlockVector[] border = new RelativeBlockVector[0]; private RelativeBlockVector[] controls = new RelativeBlockVector[0]; private RelativeBlockVector exitBlock = null; private HashMap exits = new HashMap<>(); - private int portalBlockOpen = Material.PORTAL.getId(); - private int portalBlockClosed = Material.AIR.getId(); + private Material portalBlockOpen = Material.PORTAL; + private Material portalBlockClosed = Material.AIR; // Economy information private int useCost = -1; @@ -61,7 +61,7 @@ public class Gate { private int destroyCost = -1; private boolean toOwner = false; - public Gate(String filename, Character[][] layout, HashMap types, HashMap metadata) { + public Gate(String filename, Character[][] layout, HashMap types, HashMap metadata) { this.filename = filename; this.layout = layout; this.metadata = metadata; @@ -80,17 +80,18 @@ public class Gate { for (int y = 0; y < layout.length; y++) { for (int x = 0; x < layout[y].length; x++) { - Integer id = types.get(layout[y][x]); - if (layout[y][x] == '-') { + Character key = layout[y][x]; + if (key.equals('-')) { controlList.add(new RelativeBlockVector(x, y, 0)); } - if (id == ENTRANCE || id == EXIT) { + if (key.equals(ENTRANCE) || key.equals(EXIT)) { entranceList.add(new RelativeBlockVector(x, y, 0)); exitDepths[x] = y; - if (id == EXIT) + if (key.equals(EXIT)) { this.exitBlock = new RelativeBlockVector(x, y, 0); - } else if (id != ANYTHING) { + } + } else if (!key.equals(ANYTHING)) { borderList.add(new RelativeBlockVector(x, y, 0)); } } @@ -119,8 +120,8 @@ public class Gate { try { BufferedWriter bw = new BufferedWriter(new FileWriter(gateFolder + filename)); - writeConfig(bw, "portal-open", portalBlockOpen); - writeConfig(bw, "portal-closed", portalBlockClosed); + writeConfig(bw, "portal-open", portalBlockOpen.name()); + writeConfig(bw, "portal-closed", portalBlockClosed.name()); if (useCost != -1) writeConfig(bw, "usecost", useCost); if (createCost != -1) @@ -129,10 +130,13 @@ public class Gate { writeConfig(bw, "destroycost", destroyCost); writeConfig(bw, "toowner", toOwner); - for (Character type : types.keySet()) { - Integer value = types.get(type); + for (Map.Entry entry : types.entrySet()) { + Character type = entry.getKey(); + Material value = entry.getValue(); // Skip control values - if (value < 0) continue; + if (type.equals(ANYTHING) || type.equals(ENTRANCE) || type.equals(EXIT)) { + continue; + } bw.append(type); bw.append('='); @@ -148,9 +152,8 @@ public class Gate { bw.newLine(); - for (int y = 0; y < layout.length; y++) { - for (int x = 0; x < layout[y].length; x++) { - Character symbol = layout[y][x]; + for(Character[] aLayout : layout) { + for(Character symbol : aLayout) { bw.append(symbol); } bw.newLine(); @@ -172,11 +175,16 @@ public class Gate { 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() { + public HashMap getTypes() { return types; } @@ -203,7 +211,7 @@ public class Gate { return exitBlock; } - public int getControlBlock() { + public Material getControlBlock() { return types.get('-'); } @@ -211,19 +219,19 @@ public class Gate { return filename; } - public int getPortalBlockOpen() { + public Material getPortalBlockOpen() { return portalBlockOpen; } - public void setPortalBlockOpen(int type) { + public void setPortalBlockOpen(Material type) { portalBlockOpen = type; } - public int getPortalBlockClosed() { + public Material getPortalBlockClosed() { return portalBlockClosed; } - public void setPortalBlockClosed(int type) { + public void setPortalBlockClosed(Material type) { portalBlockClosed = type; } @@ -253,34 +261,34 @@ public class Gate { public boolean matches(Blox topleft, int modX, int modZ, boolean onCreate) { for (int y = 0; y < layout.length; y++) { for (int x = 0; x < layout[y].length; x++) { - int id = types.get(layout[y][x]); + Character key = layout[y][x]; - if (id == ENTRANCE || id == EXIT) { - // TODO: Remove once snowmanTrailEvent is added + if (key.equals(ENTRANCE) || key.equals(EXIT)) { if (Stargate.ignoreEntrance) continue; - - int type = topleft.modRelative(x, y, 0, modX, 1, modZ).getType(); + + 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.getId()) continue; + if (onCreate && type == Material.AIR) continue; if (type != portalBlockClosed && type != portalBlockOpen) { // Special case for water gates - if (portalBlockOpen == Material.WATER.getId() || portalBlockOpen == Material.STATIONARY_WATER.getId()) { - if (type == Material.WATER.getId() || type == Material.STATIONARY_WATER.getId()) { + if (portalBlockOpen == Material.WATER || portalBlockOpen == Material.STATIONARY_WATER) { + if (type == Material.WATER || type == Material.STATIONARY_WATER) { continue; } } // Special case for lava gates - if (portalBlockOpen == Material.LAVA.getId() || portalBlockOpen == Material.STATIONARY_LAVA.getId()) { - if (type == Material.LAVA.getId() || type == Material.STATIONARY_LAVA.getId()) { + if (portalBlockOpen == Material.LAVA || portalBlockOpen == Material.STATIONARY_LAVA) { + if (type == Material.LAVA || type == Material.STATIONARY_LAVA) { continue; } } Stargate.debug("Gate::Matches", "Entrance/Exit Material Mismatch: " + type); return false; } - } else if (id != ANYTHING) { + } else if (!key.equals(ANYTHING)) { + Material id = types.get(key); 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; @@ -300,7 +308,7 @@ public class Gate { public static void registerGate(Gate gate) { gates.put(gate.getFilename(), gate); - int blockID = gate.getControlBlock(); + Material blockID = gate.getControlBlock(); if (!controlBlocks.containsKey(blockID)) { controlBlocks.put(blockID, new ArrayList()); @@ -313,16 +321,16 @@ public class Gate { Scanner scanner = null; boolean designing = false; ArrayList> design = new ArrayList<>(); - HashMap types = new HashMap<>(); + HashMap types = new HashMap<>(); HashMap metadata = new HashMap<>(); HashMap config = new HashMap<>(); - HashSet frameTypes = new HashSet<>(); + HashSet frameTypes = new HashSet<>(); int cols = 0; // Init types map - types.put('.', ENTRANCE); - types.put('*', EXIT); - types.put(' ', ANYTHING); + types.put(ENTRANCE, Material.AIR); + types.put(EXIT, Material.AIR); + types.put(ANYTHING, Material.AIR); try { scanner = new Scanner(file); @@ -363,7 +371,7 @@ public class Gate { String mData = split[1].trim(); metadata.put(symbol, Integer.parseInt(mData)); } - Integer id = Integer.parseInt(value); + Material id = Material.valueOf(value); types.put(symbol, id); frameTypes.add(id); @@ -430,6 +438,17 @@ public class Gate { return def; } + private static Material readConfig(HashMap config, Gate gate, File file, String key, Material def) { + if (config.containsKey(key)) { + Material mat = Material.getMaterial(config.get(key)); + if(mat != null) { + return mat; + } + Stargate.log.log(Level.WARNING, String.format("Error reading %s: %s is not a material", file, key)); + } + return def; + } + public static void loadGates(String gateFolder) { File dir = new File(gateFolder); File[] files; @@ -440,9 +459,10 @@ public class Gate { files = new File[0]; } - if (files.length == 0) { - dir.mkdir(); - populateDefaults(gateFolder); + if (files == null || files.length == 0) { + if (dir.mkdir()) { + populateDefaults(gateFolder); + } } else { for (File file : files) { Gate gate = loadGate(file); @@ -452,7 +472,6 @@ public class Gate { } public static void populateDefaults(String gateFolder) { - int Obsidian = Material.OBSIDIAN.getId(); Character[][] layout = new Character[][] { {' ', 'X','X', ' '}, {'X', '.', '.', 'X'}, @@ -460,12 +479,12 @@ public class Gate { {'X', '*', '.', 'X'}, {' ', 'X', 'X', ' '}, }; - HashMap types = new HashMap<>(); - types.put('.', ENTRANCE); - types.put('*', EXIT); - types.put(' ', ANYTHING); - types.put('X', Obsidian); - types.put('-', Obsidian); + HashMap types = new HashMap<>(); + types.put(ENTRANCE, Material.AIR); + types.put(EXIT, Material.AIR); + types.put(ANYTHING, Material.AIR); + types.put('X', Material.OBSIDIAN); + types.put('-', Material.OBSIDIAN); HashMap metadata = new HashMap<>(); Gate gate = new Gate("nethergate.gate", layout, types, metadata); @@ -474,10 +493,10 @@ public class Gate { } public static Gate[] getGatesByControlBlock(Block block) { - return getGatesByControlBlock(block.getTypeId()); + return getGatesByControlBlock(block.getType()); } - public static Gate[] getGatesByControlBlock(int type) { + public static Gate[] getGatesByControlBlock(Material type) { Gate[] result = new Gate[0]; ArrayList lookup = controlBlocks.get(type); @@ -494,7 +513,7 @@ public class Gate { return gates.size(); } - public static boolean isGateBlock(int type) { + public static boolean isGateBlock(Material type) { return frameBlocks.contains(type); } diff --git a/src/net/TheDgtl/Stargate/Portal.java b/src/net/TheDgtl/Stargate/Portal.java index 5c1d804..1695baa 100644 --- a/src/net/TheDgtl/Stargate/Portal.java +++ b/src/net/TheDgtl/Stargate/Portal.java @@ -7,7 +7,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; -import java.util.List; import java.util.Random; import java.util.Scanner; import java.util.logging.Level; @@ -366,7 +365,7 @@ public class Portal { getWorld().loadChunk(getWorld().getChunkAt(topLeft.getBlock())); - int openType = gate.getPortalBlockOpen(); + Material openType = gate.getPortalBlockOpen(); for (Blox inside : getEntrances()) { Stargate.blockPopulatorQueue.add(new BloxPopulator(inside, openType)); } @@ -403,7 +402,7 @@ public class Portal { if (isAlwaysOn() && !force) return; // Only close always-open if forced // Close this gate, then the dest gate. - int closedType = gate.getPortalBlockClosed(); + Material closedType = gate.getPortalBlockClosed(); for (Blox inside : getEntrances()) { Stargate.blockPopulatorQueue.add(new BloxPopulator(inside, closedType)); } @@ -569,8 +568,9 @@ public class Portal { public boolean isVerified() { verified = true; - for (RelativeBlockVector control : gate.getControls()) - verified = verified && getBlockAt(control).getBlock().getTypeId() == gate.getControlBlock(); + for (RelativeBlockVector control : gate.getControls()) { + verified = verified && getBlockAt(control).getBlock().getType().equals(gate.getControlBlock()); + } return verified; } @@ -1144,7 +1144,7 @@ public class Portal { // No button on an always-open gate. if (!alwaysOn) { button = topleft.modRelative(buttonVector.getRight(), buttonVector.getDepth(), buttonVector.getDistance() + 1, modX, 1, modZ); - button.setType(Material.STONE_BUTTON.getId()); + button.setType(Material.STONE_BUTTON); button.setData(facing); portal.setButton(button); } @@ -1354,7 +1354,7 @@ public class Portal { if (!portal.isVerified() || !portal.checkIntegrity()) { // DEBUG for (RelativeBlockVector control : portal.getGate().getControls()) { - if (portal.getBlockAt(control).getBlock().getTypeId() != portal.getGate().getControlBlock()) { + if (!portal.getBlockAt(control).getBlock().getType().equals(portal.getGate().getControlBlock())) { Stargate.debug("loadAllGates", "Control Block Type == " + portal.getBlockAt(control).getBlock().getTypeId()); } } diff --git a/src/net/TheDgtl/Stargate/Stargate.java b/src/net/TheDgtl/Stargate/Stargate.java index b8e1e61..ef117b5 100644 --- a/src/net/TheDgtl/Stargate/Stargate.java +++ b/src/net/TheDgtl/Stargate/Stargate.java @@ -29,7 +29,6 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Entity; -import org.bukkit.entity.Minecart; import org.bukkit.entity.Player; import org.bukkit.entity.Vehicle; import org.bukkit.event.Event.Result; @@ -1095,7 +1094,7 @@ public class Stargate extends JavaPlugin { if (destroyExplosion) { portal.unregister(true); } else { - Stargate.blockPopulatorQueue.add(new BloxPopulator(new Blox(b), b.getTypeId(), b.getData())); + Stargate.blockPopulatorQueue.add(new BloxPopulator(new Blox(b), b.getType(), b.getData())); event.setCancelled(true); } } @@ -1124,7 +1123,7 @@ public class Stargate extends JavaPlugin { while (System.nanoTime() - sTime < 50000000) { BloxPopulator b = Stargate.blockPopulatorQueue.poll(); if (b == null) return; - b.getBlox().getBlock().setTypeId(b.getMat(), false); + b.getBlox().getBlock().setType(b.getMat(), false); b.getBlox().getBlock().setData(b.getData(), false); } }