/Essentials/src/com/earth2me/essentials/signs/SignBlockListener.java

https://github.com/YellowFellow/Essentials · Java · 259 lines · 242 code · 16 blank · 1 comment · 78 complexity · 9e47a477d59606a45b52106743950b0d MD5 · raw file

  1. package com.earth2me.essentials.signs;
  2. import com.earth2me.essentials.IEssentials;
  3. import com.earth2me.essentials.User;
  4. import java.util.logging.Level;
  5. import java.util.logging.Logger;
  6. import org.bukkit.Material;
  7. import org.bukkit.block.Block;
  8. import org.bukkit.block.Sign;
  9. import org.bukkit.entity.Player;
  10. import org.bukkit.event.block.BlockBreakEvent;
  11. import org.bukkit.event.block.BlockBurnEvent;
  12. import org.bukkit.event.block.BlockIgniteEvent;
  13. import org.bukkit.event.block.BlockListener;
  14. import org.bukkit.event.block.BlockPistonExtendEvent;
  15. import org.bukkit.event.block.BlockPistonRetractEvent;
  16. import org.bukkit.event.block.BlockPlaceEvent;
  17. import org.bukkit.event.block.SignChangeEvent;
  18. public class SignBlockListener extends BlockListener
  19. {
  20. private final transient IEssentials ess;
  21. private final static Logger LOGGER = Logger.getLogger("Minecraft");
  22. public SignBlockListener(IEssentials ess)
  23. {
  24. this.ess = ess;
  25. }
  26. @Override
  27. public void onBlockBreak(final BlockBreakEvent event)
  28. {
  29. if (event.isCancelled() || ess.getSettings().areSignsDisabled())
  30. {
  31. return;
  32. }
  33. if (protectSignsAndBlocks(event.getBlock(), event.getPlayer()))
  34. {
  35. event.setCancelled(true);
  36. }
  37. }
  38. public boolean protectSignsAndBlocks(final Block block, final Player player)
  39. {
  40. final int mat = block.getTypeId();
  41. if (mat == Material.SIGN_POST.getId() || mat == Material.WALL_SIGN.getId())
  42. {
  43. final Sign csign = (Sign)block.getState();
  44. for (Signs signs : Signs.values())
  45. {
  46. final EssentialsSign sign = signs.getSign();
  47. if (csign.getLine(0).equalsIgnoreCase(sign.getSuccessName())
  48. && !sign.onSignBreak(block, player, ess))
  49. {
  50. return true;
  51. }
  52. }
  53. }
  54. else
  55. {
  56. // prevent any signs be broken by destroying the block they are attached to
  57. if (EssentialsSign.checkIfBlockBreaksSigns(block))
  58. {
  59. LOGGER.log(Level.INFO, "Prevented that a block was broken next to a sign.");
  60. return true;
  61. }
  62. for (Signs signs : Signs.values())
  63. {
  64. final EssentialsSign sign = signs.getSign();
  65. if (sign.getBlocks().contains(block.getType())
  66. && !sign.onBlockBreak(block, player, ess))
  67. {
  68. LOGGER.log(Level.INFO, "A block was protected by a sign.");
  69. return true;
  70. }
  71. }
  72. }
  73. return false;
  74. }
  75. @Override
  76. public void onSignChange(final SignChangeEvent event)
  77. {
  78. if (event.isCancelled() || ess.getSettings().areSignsDisabled())
  79. {
  80. return;
  81. }
  82. User user = ess.getUser(event.getPlayer());
  83. if (user.isAuthorized("essentials.signs.color"))
  84. {
  85. for (int i = 0; i < 4; i++)
  86. {
  87. event.setLine(i, event.getLine(i).replaceAll("&([0-9a-f])", "§$1"));
  88. }
  89. }
  90. for (Signs signs : Signs.values())
  91. {
  92. final EssentialsSign sign = signs.getSign();
  93. if (event.getLine(0).equalsIgnoreCase(sign.getSuccessName()))
  94. {
  95. event.setCancelled(true);
  96. return;
  97. }
  98. if (event.getLine(0).equalsIgnoreCase(sign.getTemplateName())
  99. && !sign.onSignCreate(event, ess))
  100. {
  101. event.setCancelled(true);
  102. return;
  103. }
  104. }
  105. }
  106. @Override
  107. public void onBlockPlace(final BlockPlaceEvent event)
  108. {
  109. if (event.isCancelled() || ess.getSettings().areSignsDisabled())
  110. {
  111. return;
  112. }
  113. final Block against = event.getBlockAgainst();
  114. if ((against.getType() == Material.WALL_SIGN
  115. || against.getType() == Material.SIGN_POST)
  116. && EssentialsSign.isValidSign(new EssentialsSign.BlockSign(against)))
  117. {
  118. event.setCancelled(true);
  119. return;
  120. }
  121. final Block block = event.getBlock();
  122. if (block.getType() == Material.WALL_SIGN
  123. || block.getType() == Material.SIGN_POST)
  124. {
  125. return;
  126. }
  127. for (Signs signs : Signs.values())
  128. {
  129. final EssentialsSign sign = signs.getSign();
  130. if (sign.getBlocks().contains(block.getType())
  131. && !sign.onBlockPlace(block, event.getPlayer(), ess))
  132. {
  133. event.setCancelled(true);
  134. return;
  135. }
  136. }
  137. }
  138. @Override
  139. public void onBlockBurn(final BlockBurnEvent event)
  140. {
  141. if (event.isCancelled() || ess.getSettings().areSignsDisabled())
  142. {
  143. return;
  144. }
  145. final Block block = event.getBlock();
  146. if (((block.getType() == Material.WALL_SIGN
  147. || block.getType() == Material.SIGN_POST)
  148. && EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block)))
  149. || EssentialsSign.checkIfBlockBreaksSigns(block))
  150. {
  151. event.setCancelled(true);
  152. return;
  153. }
  154. for (Signs signs : Signs.values())
  155. {
  156. final EssentialsSign sign = signs.getSign();
  157. if (sign.getBlocks().contains(block.getType())
  158. && !sign.onBlockBurn(block, ess))
  159. {
  160. event.setCancelled(true);
  161. return;
  162. }
  163. }
  164. }
  165. @Override
  166. public void onBlockIgnite(final BlockIgniteEvent event)
  167. {
  168. if (event.isCancelled() || ess.getSettings().areSignsDisabled())
  169. {
  170. return;
  171. }
  172. final Block block = event.getBlock();
  173. if (((block.getType() == Material.WALL_SIGN
  174. || block.getType() == Material.SIGN_POST)
  175. && EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block)))
  176. || EssentialsSign.checkIfBlockBreaksSigns(block))
  177. {
  178. event.setCancelled(true);
  179. return;
  180. }
  181. for (Signs signs : Signs.values())
  182. {
  183. final EssentialsSign sign = signs.getSign();
  184. if (sign.getBlocks().contains(block.getType())
  185. && !sign.onBlockIgnite(block, ess))
  186. {
  187. event.setCancelled(true);
  188. return;
  189. }
  190. }
  191. }
  192. @Override
  193. public void onBlockPistonExtend(final BlockPistonExtendEvent event)
  194. {
  195. for (Block block : event.getBlocks())
  196. {
  197. if (((block.getType() == Material.WALL_SIGN
  198. || block.getType() == Material.SIGN_POST)
  199. && EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block)))
  200. || EssentialsSign.checkIfBlockBreaksSigns(block))
  201. {
  202. event.setCancelled(true);
  203. return;
  204. }
  205. for (Signs signs : Signs.values())
  206. {
  207. final EssentialsSign sign = signs.getSign();
  208. if (sign.getBlocks().contains(block.getType())
  209. && !sign.onBlockPush(block, ess))
  210. {
  211. event.setCancelled(true);
  212. return;
  213. }
  214. }
  215. }
  216. }
  217. @Override
  218. public void onBlockPistonRetract(final BlockPistonRetractEvent event)
  219. {
  220. if (event.isSticky())
  221. {
  222. final Block block = event.getBlock();
  223. if (((block.getType() == Material.WALL_SIGN
  224. || block.getType() == Material.SIGN_POST)
  225. && EssentialsSign.isValidSign(new EssentialsSign.BlockSign(block)))
  226. || EssentialsSign.checkIfBlockBreaksSigns(block))
  227. {
  228. event.setCancelled(true);
  229. return;
  230. }
  231. for (Signs signs : Signs.values())
  232. {
  233. final EssentialsSign sign = signs.getSign();
  234. if (sign.getBlocks().contains(block.getType())
  235. && !sign.onBlockPush(block, ess))
  236. {
  237. event.setCancelled(true);
  238. return;
  239. }
  240. }
  241. }
  242. }
  243. }