PageRenderTime 63ms CodeModel.GetById 27ms RepoModel.GetById 1ms app.codeStats 0ms

/src/net/edoxile/bettermechanics/listeners/MechanicsPlayerListener.java

https://github.com/GuntherDW/BetterMechanics
Java | 240 lines | 216 code | 12 blank | 12 comment | 81 complexity | 1ea950ab465fb9126e92179f9c29bee4 MD5 | raw file
  1. package net.edoxile.bettermechanics.listeners;
  2. import net.edoxile.bettermechanics.MechanicsType;
  3. import net.edoxile.bettermechanics.exceptions.*;
  4. import net.edoxile.bettermechanics.mechanics.*;
  5. import net.edoxile.bettermechanics.utils.MechanicsConfig;
  6. import net.edoxile.bettermechanics.utils.SignUtil;
  7. import org.bukkit.ChatColor;
  8. import org.bukkit.Material;
  9. import org.bukkit.block.BlockFace;
  10. import org.bukkit.block.Sign;
  11. import org.bukkit.event.block.Action;
  12. import org.bukkit.event.block.SignChangeEvent;
  13. import org.bukkit.event.player.PlayerInteractEvent;
  14. import org.bukkit.event.player.PlayerJoinEvent;
  15. import org.bukkit.event.player.PlayerListener;
  16. import java.util.logging.Logger;
  17. /**
  18. * Created by IntelliJ IDEA.
  19. * User: Edoxile
  20. */
  21. public class MechanicsPlayerListener extends PlayerListener {
  22. private static final Logger log = Logger.getLogger("Minecraft");
  23. private MechanicsConfig config;
  24. private MechanicsConfig.PermissionConfig permissions;
  25. public MechanicsPlayerListener(MechanicsConfig c) {
  26. config = c;
  27. permissions = c.getPermissionConfig();
  28. }
  29. public void setConfig(MechanicsConfig c) {
  30. config = c;
  31. }
  32. public void onPlayerJoin(PlayerJoinEvent event) {
  33. Pen.clear(event.getPlayer());
  34. }
  35. public void onPlayerInteract(PlayerInteractEvent event) {
  36. if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
  37. if (SignUtil.isSign(event.getClickedBlock())) {
  38. Sign sign = SignUtil.getSign(event.getClickedBlock());
  39. if (sign != null) {
  40. if (SignUtil.getActiveMechanicsType(sign) != null) {
  41. switch (SignUtil.getActiveMechanicsType(sign)) {
  42. case BRIDGE:
  43. case SMALL_BRIDGE:
  44. if (!permissions.check(event.getPlayer(), SignUtil.getActiveMechanicsType(sign).name().toLowerCase().concat(".use"), event.getClickedBlock(), false))
  45. return;
  46. Bridge bridge = new Bridge(config, sign, event.getPlayer());
  47. try {
  48. if (!bridge.map())
  49. return;
  50. if (bridge.isClosed()) {
  51. bridge.toggleOpen();
  52. } else {
  53. bridge.toggleClosed();
  54. }
  55. } catch (InvalidMaterialException e) {
  56. event.getPlayer().sendMessage(ChatColor.RED + "Bridge not made of an allowed Material!");
  57. } catch (BlockNotFoundException e) {
  58. event.getPlayer().sendMessage(ChatColor.RED + "Bridge is too long or sign on the other side was not found!");
  59. } catch (ChestNotFoundException e) {
  60. event.getPlayer().sendMessage(ChatColor.RED + "No chest found near signs!");
  61. } catch (NonCardinalDirectionException e) {
  62. event.getPlayer().sendMessage(ChatColor.RED + "Sign is not in a cardinal direction!");
  63. }
  64. break;
  65. case GATE:
  66. case SMALL_GATE:
  67. if (!permissions.check(event.getPlayer(), SignUtil.getActiveMechanicsType(sign).name().toLowerCase().concat(".use"), event.getClickedBlock(), false))
  68. return;
  69. Gate gate = new Gate(config, sign, event.getPlayer());
  70. try {
  71. if (!gate.map())
  72. return;
  73. if (gate.isClosed()) {
  74. gate.toggleOpen();
  75. } else {
  76. gate.toggleClosed();
  77. }
  78. } catch (ChestNotFoundException e) {
  79. event.getPlayer().sendMessage(ChatColor.RED + "No chest found near signs!");
  80. } catch (NonCardinalDirectionException e) {
  81. event.getPlayer().sendMessage(ChatColor.RED + "Sign is not in a cardinal direction!");
  82. } catch (OutOfBoundsException e) {
  83. event.getPlayer().sendMessage(ChatColor.RED + "Gate too long or too wide!");
  84. } catch (BlockNotFoundException e) {
  85. event.getPlayer().sendMessage(ChatColor.RED + "No fences were found close to bridge!");
  86. }
  87. break;
  88. case DOOR:
  89. case SMALL_DOOR:
  90. if (!permissions.check(event.getPlayer(), SignUtil.getActiveMechanicsType(sign).name().toLowerCase().concat(".use"), event.getClickedBlock(), false))
  91. return;
  92. Door door = new Door(config, sign, event.getPlayer());
  93. try {
  94. if (!door.map())
  95. return;
  96. if (door.isClosed()) {
  97. door.toggleOpen();
  98. } else {
  99. door.toggleClosed();
  100. }
  101. } catch (InvalidMaterialException e) {
  102. event.getPlayer().sendMessage(ChatColor.RED + "Door not made of an allowed Material!");
  103. } catch (BlockNotFoundException e) {
  104. event.getPlayer().sendMessage(ChatColor.RED + "Door is too long or sign on the other side was not found!");
  105. } catch (ChestNotFoundException e) {
  106. event.getPlayer().sendMessage(ChatColor.RED + "No chest found near signs!");
  107. } catch (NonCardinalDirectionException e) {
  108. event.getPlayer().sendMessage(ChatColor.RED + "Sign is not in a cardinal direction!");
  109. }
  110. break;
  111. case LIFT:
  112. if (!permissions.check(event.getPlayer(), SignUtil.getActiveMechanicsType(sign).name().toLowerCase().concat(".use"), event.getClickedBlock(), true, false))
  113. return;
  114. Lift lift = new Lift(config, sign, event.getPlayer());
  115. try {
  116. if (!lift.map()) {
  117. return;
  118. }
  119. lift.movePlayer();
  120. } catch (BlockNotFoundException e) {
  121. event.getPlayer().sendMessage(ChatColor.RED + "Lift is too high or signs are not aligned!");
  122. }
  123. break;
  124. case TELELIFT:
  125. if (!permissions.check(event.getPlayer(), SignUtil.getActiveMechanicsType(sign).name().toLowerCase().concat(".use"), event.getClickedBlock(), true, false))
  126. return;
  127. TeleLift tlift = new TeleLift(config, sign, event.getPlayer());
  128. try {
  129. if (!tlift.map()) {
  130. return;
  131. }
  132. tlift.movePlayer();
  133. } catch (NumberFormatException e) {
  134. event.getPlayer().sendMessage(ChatColor.RED + "Non-numbers found as location!");
  135. }
  136. break;
  137. }
  138. } else if (event.getPlayer().getItemInHand().getType() == config.getPenConfig().penMaterial) {
  139. if (permissions.check(event.getPlayer(), "pen", event.getClickedBlock(), false)) {
  140. String[] text = Pen.getLines(event.getPlayer());
  141. if (text != null) {
  142. String firstline = ((Sign)sign.getBlock().getState()).getLine(0);
  143. Boolean LocketteSign = firstline.equals("[Private]") || firstline.equals("[More Users]");
  144. if(!LocketteSign) {
  145. SignChangeEvent evt = new SignChangeEvent(sign.getBlock(), event.getPlayer(), text);
  146. event.getPlayer().getServer().getPluginManager().callEvent(evt);
  147. if (!evt.isCancelled()) {
  148. for (int i = 0; i < text.length; i++) {
  149. sign.setLine(i, text[i]);
  150. }
  151. sign.update(true);
  152. event.getPlayer().sendMessage(ChatColor.GOLD + "You edited the sign!");
  153. }
  154. } else {
  155. event.getPlayer().sendMessage(ChatColor.GOLD + "I'm not changing lockette signs!");
  156. event.getPlayer().sendMessage(ChatColor.GOLD + "use /lockette!");
  157. }
  158. } else {
  159. text = sign.getLines();
  160. Pen.setText(event.getPlayer(), text);
  161. event.getPlayer().sendMessage(ChatColor.GOLD + "Loaded sign text in memory.");
  162. }
  163. }
  164. }
  165. }
  166. } else if (event.getClickedBlock().getTypeId() == Material.REDSTONE_WIRE.getId() && event.getPlayer().getItemInHand().getTypeId() == Material.COAL.getId()) {
  167. if (!permissions.check(event.getPlayer(), "ammeter", event.getClickedBlock(), true)) {
  168. return;
  169. }
  170. Ammeter ammeter = new Ammeter(config, event.getClickedBlock(), event.getPlayer());
  171. ammeter.measure();
  172. } else if (event.getClickedBlock().getTypeId() == Material.CHEST.getId() && event.getPlayer().getItemInHand().getTypeId() == Material.WOOD_HOE.getId()) {
  173. if(!Cycler.cycle(event.getPlayer(), event.getClickedBlock(), config)){
  174. event.getPlayer().sendMessage(ChatColor.DARK_RED + "You don't have permissions to cycle chests here!");
  175. return;
  176. } else {
  177. event.setCancelled(true);
  178. return;
  179. }
  180. } else {
  181. if (!event.getPlayer().getItemInHand().getType().isBlock() || event.getPlayer().getItemInHand().getType() == Material.AIR) {
  182. Cauldron cauldron = Cauldron.preCauldron(event.getClickedBlock(), config, event.getPlayer());
  183. if (cauldron != null) {
  184. if (permissions.check(event.getPlayer(), "cauldron", event.getClickedBlock(), false)) {
  185. cauldron.performCauldron();
  186. } else {
  187. return;
  188. }
  189. }
  190. }
  191. if (isRedstoneBlock(event.getClickedBlock().getTypeId()))
  192. return;
  193. // BlockFace[] toCheck = {BlockFace.WEST, BlockFace.EAST, BlockFace.SOUTH, BlockFace.NORTH, BlockFace.DOWN, BlockFace.UP};
  194. BlockFace[] toCheck = {BlockFace.WEST, BlockFace.EAST, BlockFace.SOUTH, BlockFace.NORTH};
  195. for (BlockFace b : toCheck) {
  196. if (SignUtil.isSign(event.getClickedBlock().getRelative(b))) {
  197. Sign sign = SignUtil.getSign(event.getClickedBlock().getRelative(b));
  198. if (SignUtil.getMechanicsType(sign) == MechanicsType.HIDDEN_SWITCH) {
  199. if (permissions.check(event.getPlayer(), "hidden_switch.use", event.getClickedBlock(), true, false)) {
  200. HiddenSwitch hiddenSwitch = new HiddenSwitch(config, sign, event.getPlayer());
  201. if (hiddenSwitch.map())
  202. hiddenSwitch.toggleLevers();
  203. }
  204. }
  205. }
  206. }
  207. }
  208. }
  209. }
  210. /**
  211. * Returns true if a block uses redstone in some way.
  212. * Shamelessly stolen from sk89q's craftbook
  213. *
  214. * @param id
  215. * @return
  216. */
  217. public static boolean isRedstoneBlock(int id) {
  218. return id == Material.LEVER.getId()
  219. || id == Material.STONE_PLATE.getId()
  220. || id == Material.WOOD_PLATE.getId()
  221. || id == Material.REDSTONE_TORCH_ON.getId()
  222. || id == Material.REDSTONE_TORCH_OFF.getId()
  223. || id == Material.STONE_BUTTON.getId()
  224. || id == Material.REDSTONE_WIRE.getId()
  225. || id == Material.WOODEN_DOOR.getId()
  226. || id == Material.IRON_DOOR.getId();
  227. }
  228. }