Events.java 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. package xyz.spaceio.customoregen;
  2. import java.util.Arrays;
  3. import java.util.Random;
  4. import org.bukkit.Bukkit;
  5. import org.bukkit.Location;
  6. import org.bukkit.Material;
  7. import org.bukkit.OfflinePlayer;
  8. import org.bukkit.Sound;
  9. import org.bukkit.block.Block;
  10. import org.bukkit.block.BlockFace;
  11. import org.bukkit.event.EventHandler;
  12. import org.bukkit.event.Listener;
  13. import org.bukkit.event.block.BlockFromToEvent;
  14. import org.bukkit.event.player.PlayerJoinEvent;
  15. public class Events implements Listener {
  16. /*
  17. * CustomOreGen main class
  18. */
  19. private CustomOreGen plugin;
  20. public Events(CustomOreGen customOreGen) {
  21. this.plugin = customOreGen;
  22. }
  23. @SuppressWarnings("deprecation")
  24. @EventHandler
  25. public void onFromTo(BlockFromToEvent event) {
  26. if (plugin.getDisabledWorlds().contains(event.getBlock().getLocation().getWorld().getName())) {
  27. return;
  28. }
  29. Material fromType = event.getBlock().getType();
  30. if (Arrays.asList(Material.WATER, Material.STATIONARY_WATER, Material.LAVA, Material.STATIONARY_LAVA).contains(fromType) && event.getFace() != BlockFace.DOWN) {
  31. Block toBlock = event.getToBlock();
  32. Material toType = toBlock.getType();
  33. Location fromLoc = toBlock.getLocation();
  34. // fix for (lava -> water)
  35. if (fromType.equals(Material.LAVA) || fromType.equals(Material.STATIONARY_LAVA)) {
  36. if(!isSurroundedByWater(fromLoc)){
  37. return;
  38. }
  39. }
  40. if (Arrays.asList(Material.WATER, Material.STATIONARY_WATER, Material.LAVA, Material.STATIONARY_LAVA, Material.AIR).contains(toType)
  41. && generatesCobble(fromType, toBlock)) {
  42. OfflinePlayer p = plugin.getOwner(toBlock.getLocation());
  43. if (p == null)
  44. return;
  45. GeneratorConfig gc = plugin.getGeneratorConfigForPlayer(p, event.getBlock().getWorld().getName());
  46. if (gc == null)
  47. return;
  48. if (getObject(gc) == null)
  49. return;
  50. GeneratorItem winning = getObject(gc);
  51. if (Material.getMaterial(winning.getName()) == null)
  52. return;
  53. if (Material.getMaterial(winning.getName()).equals(Material.COBBLESTONE) && winning.getDamage() == 0) {
  54. return;
  55. }
  56. event.setCancelled(true);
  57. //b.setType(Material.getMaterial(winning.getName()));
  58. // <Block>.setData(...) is deprecated, but there is no
  59. // alternative to it. #spigot
  60. if(Arrays.stream(event.getBlock().getClass().getMethods()).anyMatch(method -> method.getName() == "getTypeId")) {
  61. toBlock.setTypeIdAndData(Material.getMaterial(winning.getName()).getId() , winning.getDamage(), true);
  62. }else {
  63. Bukkit.getScheduler().runTask(plugin, () -> {
  64. toBlock.setType(Material.getMaterial(winning.getName()));
  65. toBlock.getState().update(true);
  66. toBlock.getWorld().playSound(toBlock.getLocation(), Sound.BLOCK_FIRE_EXTINGUISH, 1f, 10f);
  67. });
  68. }
  69. //b.setData(winning.getDamage(), true);
  70. }
  71. }
  72. }
  73. /**
  74. * Checks if a block is surrounded by water
  75. * @param fromLoc
  76. * @return
  77. */
  78. public boolean isSurroundedByWater(Location fromLoc) {
  79. Block[] blocks = {
  80. fromLoc.getWorld().getBlockAt(fromLoc.getBlockX() + 1, fromLoc.getBlockY(), fromLoc.getBlockZ()),
  81. fromLoc.getWorld().getBlockAt(fromLoc.getBlockX() - 1, fromLoc.getBlockY(), fromLoc.getBlockZ()),
  82. fromLoc.getWorld().getBlockAt(fromLoc.getBlockX(), fromLoc.getBlockY(), fromLoc.getBlockZ() + 1),
  83. fromLoc.getWorld().getBlockAt(fromLoc.getBlockX(), fromLoc.getBlockY(), fromLoc.getBlockZ() - 1) };
  84. for (Block b : blocks) {
  85. if (b.getType().toString().contains("WATER")) {
  86. return true;
  87. }
  88. }
  89. return false;
  90. }
  91. @EventHandler
  92. public void onJoin(PlayerJoinEvent e) {
  93. plugin.getGeneratorConfigForPlayer(e.getPlayer(), e.getPlayer().getWorld().getName());
  94. }
  95. /**
  96. * Chooses a GeneratorItem randomly
  97. * @param gc
  98. * @return
  99. */
  100. public GeneratorItem getObject(GeneratorConfig gc) {
  101. Random random = new Random();
  102. double d = random.nextDouble() * 100;
  103. for (GeneratorItem key : gc.itemList) {
  104. if ((d -= key.getChance()) < 0)
  105. return key;
  106. }
  107. return new GeneratorItem("COBBLESTONE", (byte) 0, 0); // DEFAULT
  108. }
  109. private final BlockFace[] faces = { BlockFace.SELF, BlockFace.UP, BlockFace.DOWN, BlockFace.NORTH, BlockFace.EAST,
  110. BlockFace.SOUTH, BlockFace.WEST };
  111. public boolean generatesCobble(Material type, Block block) {
  112. Material mirrorType1 = (type == Material.WATER) || (type == Material.STATIONARY_WATER) ? Material.STATIONARY_LAVA : Material.STATIONARY_WATER;
  113. Material mirrorType2 = (type == Material.WATER) || (type == Material.STATIONARY_WATER) ? Material.LAVA : Material.WATER;
  114. for (BlockFace face : this.faces) {
  115. Block r = block.getRelative(face, 1);
  116. if (r.getType() == mirrorType1 || r.getType() == mirrorType2) {
  117. return true;
  118. }
  119. }
  120. return false;
  121. }
  122. /**
  123. * Method for getting the block id from a block
  124. * @param b
  125. * @return
  126. */
  127. public int getID(Block b) {
  128. if(Arrays.stream(b.getClass().getMethods()).anyMatch(method -> method.getName() == "getTypeId")) {
  129. return b.getTypeId();
  130. }else {
  131. try {
  132. return Utils.Material113.valueOf(Utils.Material113.class, b.getType().name()).getID();
  133. } catch(IllegalArgumentException e) {
  134. return 2;
  135. }
  136. }
  137. }
  138. }