1
0

Events.java 4.6 KB

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