diff --git a/core/src/main/java/de/erethon/dungeonsxl/sign/LocationSign.java b/core/src/main/java/de/erethon/dungeonsxl/sign/LocationSign.java index d19e1d53..31046e7d 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/sign/LocationSign.java +++ b/core/src/main/java/de/erethon/dungeonsxl/sign/LocationSign.java @@ -16,6 +16,7 @@ */ package de.erethon.dungeonsxl.sign; +import de.erethon.commons.misc.BlockUtil; import de.erethon.dungeonsxl.DungeonsXL; import de.erethon.dungeonsxl.world.DGameWorld; import org.bukkit.Location; @@ -37,7 +38,7 @@ public abstract class LocationSign extends DSign { double x = getSign().getX() + 0.5; double y = getSign().getY(); double z = getSign().getZ() + 0.5; - float yaw = letterToYaw(((org.bukkit.material.Sign) getSign().getData()).getFacing().getOppositeFace().name().charAt(0)); + float yaw = BlockUtil.blockFaceToYaw(((org.bukkit.material.Sign) getSign().getData()).getFacing().getOppositeFace()); float pitch = 0; location = new Location(getGameWorld().getWorld(), x, y, z, yaw, pitch); } @@ -49,23 +50,4 @@ public abstract class LocationSign extends DSign { return location; } - public static int letterToYaw(char c) { - switch (c) { - case 'S': - case 's': - return 0; - case 'W': - case 'w': - return 90; - case 'N': - case 'n': - return 180; - case 'E': - case 'e': - return -90; - default: - return -1; - } - } - } diff --git a/core/src/main/java/de/erethon/dungeonsxl/sign/TeleportSign.java b/core/src/main/java/de/erethon/dungeonsxl/sign/TeleportSign.java index b0a456ec..b80c347d 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/sign/TeleportSign.java +++ b/core/src/main/java/de/erethon/dungeonsxl/sign/TeleportSign.java @@ -17,6 +17,7 @@ package de.erethon.dungeonsxl.sign; import de.erethon.caliburn.item.VanillaItem; +import de.erethon.commons.misc.BlockUtil; import de.erethon.commons.misc.NumberUtil; import de.erethon.dungeonsxl.DungeonsXL; import de.erethon.dungeonsxl.world.DGameWorld; @@ -36,7 +37,7 @@ public class TeleportSign extends LocationSign { public boolean check() { for (int i = 1; i <= 2; i++) { if (!lines[i].isEmpty()) { - if (letterToYaw(lines[i].charAt(0)) == -1) { + if (BlockUtil.lettersToYaw(lines[i]) == -1) { String[] loc = lines[i].split(","); if (loc.length != 3) { return false; @@ -52,7 +53,7 @@ public class TeleportSign extends LocationSign { super.onInit(); for (int i = 1; i <= 2; i++) { if (!lines[i].isEmpty()) { - int yaw = letterToYaw(lines[i].charAt(0)); + int yaw = BlockUtil.lettersToYaw(lines[i]); if (yaw != -1) { location.setYaw(yaw); } else { diff --git a/core/src/main/java/de/erethon/dungeonsxl/world/block/PlaceableBlock.java b/core/src/main/java/de/erethon/dungeonsxl/world/block/PlaceableBlock.java index f5b9ce81..5332169d 100644 --- a/core/src/main/java/de/erethon/dungeonsxl/world/block/PlaceableBlock.java +++ b/core/src/main/java/de/erethon/dungeonsxl/world/block/PlaceableBlock.java @@ -17,11 +17,11 @@ package de.erethon.dungeonsxl.world.block; import de.erethon.caliburn.item.ExItem; +import de.erethon.commons.misc.BlockUtil; import de.erethon.dungeonsxl.DungeonsXL; import de.erethon.dungeonsxl.world.DGameWorld; import java.util.HashSet; import java.util.Set; -import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.event.block.BlockBreakEvent; @@ -33,224 +33,21 @@ public class PlaceableBlock extends GameBlock { // Variables private Set materials = new HashSet<>(); - - private boolean onTop = false; - private boolean onBottom = false; - private boolean onNorth = false; - private boolean onSouth = false; - private boolean onEast = false; - private boolean onWest = false; + private Set faces = new HashSet<>(); public PlaceableBlock(DungeonsXL plugin, Block block, String ids, String directions) { super(plugin, block); - // Split ids - if (!ids.isEmpty()) { - String[] splittedIds = ids.split(","); - for (String id : splittedIds) { - ExItem item = plugin.getCaliburn().getExItem(id); - if (item != null) { - materials.add(item); - } + for (String id : ids.split(",")) { + ExItem item = plugin.getCaliburn().getExItem(id); + if (item != null) { + materials.add(item); } } - // Read directions - if (directions.length() == 6) { - for (byte direction = 0; direction < 6; direction++) { - boolean positive = String.valueOf(directions.charAt(direction)).equals("x"); - - if (!positive) { - continue; - } - - if (direction == 0) { - onTop = true; - } - - if (direction == 1) { - onBottom = true; - } - - if (block.getType() == Material.WALL_SIGN) { - byte data = block.getData(); - switch (data) { - case 3: - if (direction == 2) { - onNorth = true; - } - - if (direction == 3) { - onEast = true; - } - - if (direction == 4) { - onSouth = true; - } - - if (direction == 5) { - onWest = true; - } - - break; - - case 4: - if (direction == 5) { - onNorth = true; - } - - if (direction == 2) { - onEast = true; - } - - if (direction == 3) { - onSouth = true; - } - - if (direction == 4) { - onWest = true; - } - - break; - - case 2: - if (direction == 4) { - onNorth = true; - } - - if (direction == 5) { - onEast = true; - } - - if (direction == 2) { - onSouth = true; - } - - if (direction == 3) { - onWest = true; - } - - break; - - case 5: - if (direction == 3) { - onNorth = true; - } - - if (direction == 4) { - onEast = true; - } - - if (direction == 5) { - onSouth = true; - } - - if (direction == 2) { - onWest = true; - - } - break; - } - - } else { - byte data = block.getData(); - switch (data) { - case 0: - case 1: - case 2: - case 15: - if (direction == 2) { - onNorth = true; - } - - if (direction == 3) { - onEast = true; - } - - if (direction == 4) { - onSouth = true; - } - - if (direction == 5) { - onWest = true; - } - - break; - case 4: - case 3: - case 5: - case 6: - if (direction == 5) { - onNorth = true; - } - - if (direction == 2) { - onEast = true; - } - - if (direction == 3) { - onSouth = true; - } - - if (direction == 4) { - onWest = true; - } - - break; - - case 8: - case 7: - case 9: - case 10: - if (direction == 4) { - onNorth = true; - } - - if (direction == 5) { - onEast = true; - } - - if (direction == 2) { - onSouth = true; - } - - if (direction == 3) { - onWest = true; - } - - break; - case 12: - case 11: - case 13: - case 14: - if (direction == 3) { - onNorth = true; - } - - if (direction == 4) { - onEast = true; - } - - if (direction == 5) { - onSouth = true; - } - - if (direction == 2) { - onWest = true; - } - - break; - } - } - } - - } else { - onTop = true; - onBottom = true; - onNorth = true; - onEast = true; - onSouth = true; - onWest = true; + faces.add(BlockFace.SELF); + for (String direction : directions.split(",")) { + faces.add(BlockUtil.lettersToBlockFace(direction)); } } @@ -260,42 +57,16 @@ public class PlaceableBlock extends GameBlock { return false; } - // Can build - public static boolean canBuildHere(Block block, BlockFace blockFace, ExItem mat, DGameWorld gameWorld) { - for (PlaceableBlock gamePlacableBlock : gameWorld.getPlaceableBlocks()) { - if (gamePlacableBlock.block.getFace(block) != BlockFace.SELF) { - continue; - } + public boolean canPlace(Block toPlace, ExItem material) { + return faces.contains(toPlace.getFace(block)) && (materials.isEmpty() || materials.contains(material)); + } - if (!(gamePlacableBlock.materials.contains(mat) || gamePlacableBlock.materials.isEmpty())) { - continue; - } - - if (blockFace == BlockFace.NORTH && gamePlacableBlock.onNorth) { - return true; - } - - if (blockFace == BlockFace.SOUTH && gamePlacableBlock.onSouth) { - return true; - } - - if (blockFace == BlockFace.EAST && gamePlacableBlock.onEast) { - return true; - } - - if (blockFace == BlockFace.WEST && gamePlacableBlock.onWest) { - return true; - } - - if (blockFace == BlockFace.UP && gamePlacableBlock.onTop) { - return true; - } - - if (blockFace == BlockFace.DOWN && gamePlacableBlock.onBottom) { + public static boolean canBuildHere(Block block, BlockFace blockFace, ExItem material, DGameWorld gameWorld) { + for (PlaceableBlock gamePlaceableBlock : gameWorld.getPlaceableBlocks()) { + if (gamePlaceableBlock.canPlace(block, material)) { return true; } } - return false; }