BlockCommands.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. package me.hammerle.mp.snuviscript.commands;
  2. import java.util.stream.Collectors;
  3. import org.bukkit.Bukkit;
  4. import org.bukkit.Location;
  5. import org.bukkit.Material;
  6. import org.bukkit.NamespacedKey;
  7. import org.bukkit.Tag;
  8. import org.bukkit.block.Block;
  9. import org.bukkit.block.BlockFace;
  10. import org.bukkit.block.BlockState;
  11. import org.bukkit.block.Container;
  12. import org.bukkit.block.Sign;
  13. import org.bukkit.block.data.Bisected;
  14. import org.bukkit.block.data.BlockData;
  15. import org.bukkit.block.data.Directional;
  16. import org.bukkit.block.data.Openable;
  17. import org.bukkit.block.data.Waterlogged;
  18. import org.bukkit.block.data.type.Bed;
  19. import org.bukkit.block.data.type.Door;
  20. import org.bukkit.block.data.type.Leaves;
  21. import org.bukkit.block.sign.Side;
  22. import org.bukkit.block.sign.SignSide;
  23. import org.bukkit.entity.LivingEntity;
  24. import org.bukkit.inventory.InventoryHolder;
  25. import de.tr7zw.nbtapi.NBTBlock;
  26. import de.tr7zw.nbtapi.NBTCompound;
  27. import me.hammerle.mp.MundusPlugin;
  28. import net.kyori.adventure.text.Component;
  29. public class BlockCommands {
  30. @SuppressWarnings("unchecked")
  31. public static void registerFunctions() {
  32. MundusPlugin.scriptManager.registerFunction("block.gettag",
  33. (sc, in) -> Bukkit.getTag(Tag.REGISTRY_BLOCKS,
  34. NamespacedKey.fromString(in[0].getString(sc)), Material.class));
  35. MundusPlugin.scriptManager.registerFunction("block.hastag", (sc,
  36. in) -> ((Tag<Material>) in[1].get(sc)).isTagged(((Block) in[0].get(sc)).getType()));
  37. MundusPlugin.scriptManager.registerFunction("block.gettype",
  38. (sc, in) -> ((Block) in[0].get(sc)).getType());
  39. MundusPlugin.scriptManager.registerFunction("block.getlocation",
  40. (sc, in) -> ((Block) in[0].get(sc)).getLocation());
  41. MundusPlugin.scriptManager.registerFunction("block.get",
  42. (sc, in) -> ((Location) in[0].get(sc)).getBlock());
  43. MundusPlugin.scriptManager.registerFunction("block.getdata",
  44. (sc, in) -> ((Block) in[0].get(sc)).getBlockData());
  45. MundusPlugin.scriptManager.registerConsumer("block.clone", (sc, in) -> {
  46. Block fromBlock = (Block) in[0].get(sc);
  47. Location toLoc = (Location) in[1].get(sc);
  48. boolean applyPhysics = in.length > 2 ? in[2].getBoolean(sc) : false;
  49. toLoc.getBlock().setType(fromBlock.getType(), applyPhysics);
  50. toLoc.getBlock().setBlockData(fromBlock.getBlockData(), applyPhysics);
  51. Block toBlock = toLoc.getBlock();
  52. NBTBlock fromNBTBlock = new NBTBlock(fromBlock);
  53. NBTBlock toNBTBlock = new NBTBlock(toBlock);
  54. NBTCompound fromNBT = fromNBTBlock.getData();
  55. NBTCompound toNBT = toNBTBlock.getData();
  56. toNBT.mergeCompound(fromNBT);
  57. // Handle InventoryHolder (like chests, furnaces, etc.)
  58. if(fromBlock.getState() instanceof InventoryHolder
  59. && toBlock.getState() instanceof InventoryHolder) {
  60. InventoryHolder fromHolder = (InventoryHolder) fromBlock.getState();
  61. InventoryHolder toHolder = (InventoryHolder) toBlock.getState();
  62. toHolder.getInventory().setContents(fromHolder.getInventory().getContents());
  63. }
  64. // Update the block state to apply changes
  65. BlockState state = toBlock.getState();
  66. state.update(true, applyPhysics);
  67. });
  68. MundusPlugin.scriptManager.registerConsumer("block.break", (sc, in) -> {
  69. Block b = (Block) in[0].get(sc);
  70. if(in.length > 1) {
  71. LivingEntity liv = (LivingEntity) in[1].get(sc);
  72. b.breakNaturally(liv.getEquipment().getItemInMainHand(), true);
  73. return;
  74. }
  75. b.breakNaturally(true);
  76. });
  77. MundusPlugin.scriptManager.registerConsumer("block.setdata", (sc, in) -> {
  78. Block b = (Block) in[0].get(sc);
  79. boolean applyPhysics = in.length > 2 ? in[2].getBoolean(sc) : false;
  80. b.setBlockData((BlockData) in[1].get(sc), applyPhysics);
  81. });
  82. MundusPlugin.scriptManager.registerConsumer("block.setmaterial", (sc, in) -> {
  83. Block b = (Block) in[0].get(sc);
  84. boolean applyPhysics = in.length > 2 ? in[2].getBoolean(sc) : false;
  85. b.setType((Material) in[1].get(sc), applyPhysics);
  86. });
  87. MundusPlugin.scriptManager.registerConsumer("block.setsign", (sc, in) -> {
  88. Block b = (Block) in[0].get(sc);
  89. Sign sign = (Sign) b.getState();
  90. SignSide side = (SignSide) sign.getSide(Side.valueOf(in[1].getString(sc)));
  91. side.line(in[2].getInt(sc), (Component) in[3].get(sc));
  92. sign.update(true, false);
  93. });
  94. MundusPlugin.scriptManager.registerFunction("block.getsign", (sc, in) -> {
  95. Block b = (Block) in[0].get(sc);
  96. Sign sign = (Sign) b.getState();
  97. SignSide side = (SignSide) sign.getSide(Side.valueOf(in[1].getString(sc)));
  98. return side.line(in[2].getInt(sc));
  99. });
  100. MundusPlugin.scriptManager.registerConsumer("block.signsetwaxed", (sc, in) -> {
  101. Block b = (Block) in[0].get(sc);
  102. Sign sign = (Sign) b.getState();
  103. sign.setWaxed(in[1].getBoolean(sc));
  104. sign.update(true, false);
  105. });
  106. MundusPlugin.scriptManager.registerFunction("block.getinventory", (sc, in) -> {
  107. BlockState state = ((Block) in[0].get(sc)).getState();
  108. if(state instanceof Container) {
  109. return ((Container) state).getInventory();
  110. }
  111. return null;
  112. });
  113. MundusPlugin.scriptManager.registerConsumer("block.setopen", (sc, in) -> {
  114. Block b = (Block) in[0].get(sc);
  115. Openable o = (Openable) b.getBlockData();
  116. o.setOpen(in[1].getBoolean(sc));
  117. b.setBlockData(o);
  118. });
  119. MundusPlugin.scriptManager.registerFunction("block.isopen", (sc, in) -> {
  120. Block b = (Block) in[0].get(sc);
  121. Openable o = (Openable) b.getBlockData();
  122. return o.isOpen();
  123. });
  124. MundusPlugin.scriptManager.registerFunction("block.isopenable",
  125. (sc, in) -> ((Block) in[0].get(sc)).getBlockData() instanceof Openable);
  126. MundusPlugin.scriptManager.registerConsumer("block.setdoorhinge", (sc, in) -> {
  127. Block b = (Block) in[0].get(sc);
  128. Door o = (Door) b.getBlockData();
  129. o.setHinge(Door.Hinge.valueOf(in[1].getString(sc)));
  130. b.setBlockData(o);
  131. });
  132. MundusPlugin.scriptManager.registerFunction("block.getdoorhinge", (sc, in) -> {
  133. Block b = (Block) in[0].get(sc);
  134. Door o = (Door) b.getBlockData();
  135. return o.getHinge().toString();
  136. });
  137. MundusPlugin.scriptManager.registerFunction("block.isdoor",
  138. (sc, in) -> ((Block) in[0].get(sc)).getBlockData() instanceof Door);
  139. MundusPlugin.scriptManager.registerConsumer("block.setbisectedhalf", (sc, in) -> {
  140. Block b = (Block) in[0].get(sc);
  141. Bisected o = (Bisected) b.getBlockData();
  142. o.setHalf(Bisected.Half.valueOf(in[1].getString(sc)));
  143. b.setBlockData(o);
  144. });
  145. MundusPlugin.scriptManager.registerFunction("block.getbisectedhalf", (sc, in) -> {
  146. Block b = (Block) in[0].get(sc);
  147. Bisected o = (Bisected) b.getBlockData();
  148. return o.getHalf().toString();
  149. });
  150. MundusPlugin.scriptManager.registerFunction("block.isbisected",
  151. (sc, in) -> ((Block) in[0].get(sc)).getBlockData() instanceof Bisected);
  152. MundusPlugin.scriptManager.registerConsumer("block.setdirectionalface", (sc, in) -> {
  153. Block b = (Block) in[0].get(sc);
  154. Directional o = (Directional) b.getBlockData();
  155. o.setFacing(BlockFace.valueOf(in[1].getString(sc)));
  156. b.setBlockData(o);
  157. });
  158. MundusPlugin.scriptManager.registerFunction("block.getdirectionalface", (sc, in) -> {
  159. Block b = (Block) in[0].get(sc);
  160. Directional o = (Directional) b.getBlockData();
  161. return o.getFacing().toString();
  162. });
  163. MundusPlugin.scriptManager.registerFunction("block.getdirectionalfaces", (sc, in) -> {
  164. Block b = (Block) in[0].get(sc);
  165. Directional o = (Directional) b.getBlockData();
  166. return o.getFaces().stream().map(f -> f.toString()).collect(Collectors.toList());
  167. });
  168. MundusPlugin.scriptManager.registerFunction("block.isdirectional",
  169. (sc, in) -> ((Block) in[0].get(sc)).getBlockData() instanceof Directional);
  170. MundusPlugin.scriptManager.registerConsumer("block.setpersistent", (sc, in) -> {
  171. Block b = (Block) in[0].get(sc);
  172. Leaves o = (Leaves) b.getBlockData();
  173. o.setPersistent(in[1].getBoolean(sc));
  174. b.setBlockData(o);
  175. });
  176. MundusPlugin.scriptManager.registerFunction("block.ispersistent", (sc, in) -> {
  177. Block b = (Block) in[0].get(sc);
  178. Leaves o = (Leaves) b.getBlockData();
  179. return o.isPersistent();
  180. });
  181. MundusPlugin.scriptManager.registerFunction("block.isleaves",
  182. (sc, in) -> ((Block) in[0].get(sc)).getBlockData() instanceof Leaves);
  183. MundusPlugin.scriptManager.registerFunction("block.isbed",
  184. (sc, in) -> ((Block) in[0].get(sc)).getBlockData() instanceof Bed);
  185. MundusPlugin.scriptManager.registerConsumer("block.setbedpart", (sc, in) -> {
  186. Block b = (Block) in[0].get(sc);
  187. Bed o = (Bed) b.getBlockData();
  188. o.setPart(Bed.Part.valueOf(in[1].getString(sc)));
  189. b.setBlockData(o);
  190. });
  191. MundusPlugin.scriptManager.registerFunction("block.getbedpart", (sc, in) -> {
  192. Block b = (Block) in[0].get(sc);
  193. Bed o = (Bed) b.getBlockData();
  194. return o.getPart().toString();
  195. });
  196. MundusPlugin.scriptManager.registerFunction("block.canhavewater",
  197. (sc, in) -> ((Block) in[0].get(sc)).getBlockData() instanceof Waterlogged);
  198. MundusPlugin.scriptManager.registerFunction("block.iswaterlogged", (sc, in) -> {
  199. Block b = (Block) in[0].get(sc);
  200. Waterlogged o = (Waterlogged) b.getBlockData();
  201. return o.isWaterlogged();
  202. });
  203. MundusPlugin.scriptManager.registerConsumer("block.setwaterlogged", (sc, in) -> {
  204. Block b = (Block) in[0].get(sc);
  205. Waterlogged o = (Waterlogged) b.getBlockData();
  206. o.setWaterlogged(in[1].getBoolean(sc));
  207. b.setBlockData(o);
  208. });
  209. MundusPlugin.scriptManager.registerConsumer("block.setwaterlogged", (sc, in) -> {
  210. Block b = (Block) in[0].get(sc);
  211. Waterlogged o = (Waterlogged) b.getBlockData();
  212. o.setWaterlogged(in[1].getBoolean(sc));
  213. b.setBlockData(o);
  214. });
  215. }
  216. }