/src/main/java/com/edoxile/bukkit/bettermechanics/mechanics/Bridge.java

https://github.com/Retinue/BetterMechanics · Java · 195 lines · 179 code · 12 blank · 4 comment · 42 complexity · 750215d3cbd86e527ef45075b1ec838c MD5 · raw file

  1. package com.edoxile.bukkit.bettermechanics.mechanics;
  2. import java.util.Set;
  3. import java.util.logging.Logger;
  4. import org.bukkit.ChatColor;
  5. import org.bukkit.Material;
  6. import org.bukkit.block.Block;
  7. import org.bukkit.block.BlockFace;
  8. import org.bukkit.block.Chest;
  9. import org.bukkit.block.Sign;
  10. import org.bukkit.entity.Player;
  11. import org.bukkit.material.MaterialData;
  12. import com.edoxile.bukkit.bettermechanics.MechanicsType;
  13. import com.edoxile.bukkit.bettermechanics.exceptions.BlockNotFoundException;
  14. import com.edoxile.bukkit.bettermechanics.exceptions.ChestNotFoundException;
  15. import com.edoxile.bukkit.bettermechanics.exceptions.InvalidDirectionException;
  16. import com.edoxile.bukkit.bettermechanics.exceptions.InvalidMaterialException;
  17. import com.edoxile.bukkit.bettermechanics.exceptions.NonCardinalDirectionException;
  18. import com.edoxile.bukkit.bettermechanics.exceptions.OutOfMaterialException;
  19. import com.edoxile.bukkit.bettermechanics.exceptions.OutOfSpaceException;
  20. import com.edoxile.bukkit.bettermechanics.utils.BlockMapper;
  21. import com.edoxile.bukkit.bettermechanics.utils.BlockbagUtil;
  22. import com.edoxile.bukkit.bettermechanics.utils.MechanicsConfig;
  23. import com.edoxile.bukkit.bettermechanics.utils.SignUtil;
  24. /**
  25. * Created by IntelliJ IDEA. User: Edoxile
  26. */
  27. public class Bridge {
  28. private Logger log = Logger.getLogger("Minecraft");
  29. private Sign sign;
  30. private Player player;
  31. private Chest chest;
  32. private MechanicsConfig.BridgeConfig config;
  33. private Set<Block> blockSet;
  34. private MaterialData bridgeMaterial;
  35. public Bridge(MechanicsConfig c, Sign s, Player p) {
  36. sign = s;
  37. player = p;
  38. config = c.getBridgeConfig();
  39. }
  40. public boolean map() throws NonCardinalDirectionException,
  41. BlockNotFoundException, InvalidMaterialException,
  42. ChestNotFoundException {
  43. if (!config.enabled)
  44. return false;
  45. BlockFace bf;
  46. if (config.canUseBlock(sign.getBlock().getRelative(BlockFace.UP)
  47. .getType())) {
  48. bf = BlockFace.UP;
  49. bridgeMaterial = new MaterialData(sign.getBlock()
  50. .getRelative(BlockFace.UP).getType(), sign.getBlock()
  51. .getRelative(BlockFace.UP).getData());
  52. } else if (config.canUseBlock(sign.getBlock()
  53. .getRelative(BlockFace.DOWN).getType())) {
  54. bf = BlockFace.DOWN;
  55. bridgeMaterial = new MaterialData(sign.getBlock()
  56. .getRelative(BlockFace.DOWN).getType(), sign.getBlock()
  57. .getRelative(BlockFace.DOWN).getData());
  58. } else {
  59. throw new InvalidMaterialException();
  60. }
  61. MechanicsType bridgeType = SignUtil.getMechanicsType(sign);
  62. Sign endSign = BlockMapper.findMechanicsSign(sign.getBlock(),
  63. SignUtil.getBackBlockFace(sign), bridgeType, config.maxLength);
  64. Block startBlock = sign.getBlock()
  65. .getRelative(SignUtil.getBackBlockFace(sign)).getRelative(bf);
  66. Block endBlock = endSign.getBlock().getRelative(bf);
  67. try {
  68. blockSet = BlockMapper.mapHorizontal(
  69. SignUtil.getBackBlockFace(sign), startBlock, endBlock,
  70. bridgeType == MechanicsType.SMALL_BRIDGE);
  71. if (!blockSet.isEmpty()) {
  72. Block chestBlock = BlockMapper.mapCuboidRegion(sign.getBlock(),
  73. 3, Material.CHEST);
  74. if (chestBlock == null) {
  75. // Check other sign
  76. chestBlock = BlockMapper.mapCuboidRegion(
  77. endSign.getBlock(), 3, Material.CHEST);
  78. if (chestBlock == null) {
  79. throw new ChestNotFoundException();
  80. }
  81. }
  82. chest = BlockbagUtil.getChest(chestBlock);
  83. if (chest == null) {
  84. throw new ChestNotFoundException();
  85. }
  86. return true;
  87. } else {
  88. log.info("[BetterMechanics] Empty blockSet?");
  89. return false;
  90. }
  91. } catch (InvalidDirectionException ex) {
  92. log.info("[BetterMechanics] Our mapper is acting weird!");
  93. return false;
  94. }
  95. }
  96. public void toggleOpen() {
  97. int amount = 0;
  98. try {
  99. for (Block b : blockSet) {
  100. if (b.getType() == bridgeMaterial.getItemType()) {
  101. b.setType(Material.AIR);
  102. amount++;
  103. }
  104. }
  105. BlockbagUtil
  106. .safeAddItems(chest, bridgeMaterial.toItemStack(amount));
  107. if (player != null) {
  108. player.sendMessage(ChatColor.GOLD + "Bridge opened!");
  109. }
  110. } catch (OutOfSpaceException ex) {
  111. for (Block b : blockSet) {
  112. if (b.getType() == Material.AIR) {
  113. b.setType(bridgeMaterial.getItemType());
  114. b.setData(bridgeMaterial.getData());
  115. amount--;
  116. if (amount == 0) {
  117. if (player != null) {
  118. player.sendMessage(ChatColor.RED
  119. + "Not enough space in chest!");
  120. }
  121. return;
  122. }
  123. }
  124. }
  125. }
  126. }
  127. public void toggleClosed() {
  128. int amount = 0;
  129. try {
  130. for (Block b : blockSet) {
  131. if (canPassThrough(b.getType())) {
  132. b.setType(bridgeMaterial.getItemType());
  133. b.setData(bridgeMaterial.getData());
  134. amount++;
  135. }
  136. }
  137. BlockbagUtil.safeRemoveItems(chest,
  138. bridgeMaterial.toItemStack(amount));
  139. if (player != null) {
  140. player.sendMessage(ChatColor.GOLD + "Bridge closed!");
  141. }
  142. } catch (OutOfMaterialException ex) {
  143. for (Block b : blockSet) {
  144. if (b.getType() == bridgeMaterial.getItemType()) {
  145. b.setType(Material.AIR);
  146. amount--;
  147. if (amount == 0) {
  148. if (player != null) {
  149. player.sendMessage(ChatColor.RED
  150. + "Not enough items in chest! Still need: "
  151. + Integer.toString(ex.getAmount())
  152. + " of type: "
  153. + bridgeMaterial.getItemType().name());
  154. }
  155. return;
  156. }
  157. }
  158. }
  159. }
  160. }
  161. private boolean canPassThrough(Material m) {
  162. switch (m) {
  163. case AIR:
  164. case WATER:
  165. case STATIONARY_WATER:
  166. case LAVA:
  167. case STATIONARY_LAVA:
  168. case SNOW:
  169. return true;
  170. default:
  171. return false;
  172. }
  173. }
  174. public boolean isClosed() {
  175. for (Block b : blockSet) {
  176. if (b.getType() == bridgeMaterial.getItemType()
  177. || canPassThrough(b.getType())) {
  178. return (!canPassThrough(b.getType()));
  179. }
  180. }
  181. return false;
  182. }
  183. }