diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java index fda33a2bb..6221827a6 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java @@ -32,14 +32,17 @@ import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.world.GenericGameEvent; import org.bukkit.inventory.ItemStack; +import java.util.Arrays; import java.util.List; import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; -// TODO interact waterlogged blocks public class BlockEventListener implements Listener { private final BukkitCraftEngine plugin; private final boolean enableNoteBlockCheck; private final BukkitBlockManager manager; + private static final Set WATER_BUCKETS = Arrays.stream(ItemKeys.WATER_BUCKETS).map(it -> Registry.MATERIAL.get(new NamespacedKey(it.namespace(), it.value()))).collect(Collectors.toSet()); public BlockEventListener(BukkitCraftEngine plugin, BukkitBlockManager manager, boolean enableNoteBlockCheck) { this.plugin = plugin; @@ -275,4 +278,41 @@ public class BlockEventListener implements Listener { } } } + + // TODO Is there a way to deceive the server? +// @SuppressWarnings("unchecked") +// @EventHandler(ignoreCancelled = true) +// public void onDispenserWork(BlockDispenseEvent event) { +// ItemStack itemStack = event.getItem(); +// Material type = itemStack.getType(); +// Block block = event.getBlock(); +// if (type == Material.BUCKET) { +// if (block.getBlockData() instanceof Dispenser dispenser) { +// Block against = block.getRelative(dispenser.getFacing()); +// ImmutableBlockState state = this.manager.getImmutableBlockState(BlockStateUtils.blockDataToId(against.getBlockData())); +// if (state != null && !state.isEmpty()) { +// Location location = against.getLocation(); +// CustomBlock customBlock = state.owner().value(); +// Property waterlogged = (Property) customBlock.getProperty("waterlogged"); +// if (waterlogged == null) return; +// if (!state.get(waterlogged)) return; +// ImmutableBlockState nextState = state.with(waterlogged, false); +// CraftEngineBlocks.place(location, nextState, UpdateOption.UPDATE_ALL); +// } +// } +// } else if (WATER_BUCKETS.contains(type)) { +// if (block.getBlockData() instanceof Dispenser dispenser) { +// Block against = block.getRelative(dispenser.getFacing()); +// ImmutableBlockState state = this.manager.getImmutableBlockState(BlockStateUtils.blockDataToId(against.getBlockData())); +// if (state != null && !state.isEmpty()) { +// Location location = against.getLocation(); +// CustomBlock customBlock = state.owner().value(); +// Property waterlogged = (Property) customBlock.getProperty("waterlogged"); +// if (waterlogged == null) return; +// ImmutableBlockState nextState = state.with(waterlogged, true); +// CraftEngineBlocks.place(location, nextState, UpdateOption.UPDATE_ALL); +// } +// } +// } +// } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java index a99f2a1b3..ba6164c96 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java @@ -43,8 +43,8 @@ public class BukkitItemManager extends AbstractItemManager { private static final Map VANILLA_ITEM_EXTRA_BEHAVIORS = new HashMap<>(); static { - registerVanillaItemExtraBehavior(AxeItemBehavior.INSTANCE, ItemKeys.WOODEN_AXE, ItemKeys.STONE_AXE, ItemKeys.IRON_AXE, ItemKeys.GOLDEN_AXE, ItemKeys.DIAMOND_AXE, ItemKeys.NETHERITE_AXE); - registerVanillaItemExtraBehavior(WaterBucketItemBehavior.INSTANCE, ItemKeys.WATER_BUCKET, ItemKeys.COD_BUCKET, ItemKeys.SALMON_BUCKET, ItemKeys.TROPICAL_FISH_BUCKET, ItemKeys.TADPOLE_BUCKET, ItemKeys.PUFFERFISH_BUCKET, ItemKeys.AXOLOTL_BUCKET); + registerVanillaItemExtraBehavior(AxeItemBehavior.INSTANCE, ItemKeys.AXES); + registerVanillaItemExtraBehavior(WaterBucketItemBehavior.INSTANCE, ItemKeys.WATER_BUCKETS); registerVanillaItemExtraBehavior(BucketItemBehavior.INSTANCE, ItemKeys.BUCKET); registerVanillaItemExtraBehavior(BoneMealBehavior.INSTANCE, ItemKeys.BONE_MEAL); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/WaterBucketItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/WaterBucketItemBehavior.java index 3336cd3e8..ce1a95618 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/WaterBucketItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/WaterBucketItemBehavior.java @@ -43,11 +43,12 @@ public class WaterBucketItemBehavior extends ItemBehavior { Location location = new Location(world, pos.x(), pos.y(), pos.z()); // TODO Refactor all of this because it's playing a trick with the server - block.setBlockData(BlockStateUtils.createBlockData(state.vanillaBlockState().handle()), false); + ImmutableBlockState nextState = state.with(waterlogged, true); + block.setBlockData(BlockStateUtils.createBlockData(nextState.vanillaBlockState().handle()), false); // actually we should broadcast this change context.getPlayer().sendPacket(BlockStateUtils.createBlockUpdatePacket(pos, state), true); BukkitCraftEngine.instance().scheduler().sync().runDelayed(() -> - CraftEngineBlocks.place(location, state.with(waterlogged, true), UpdateOption.UPDATE_ALL), world, location.getBlockX() >> 4, location.getBlockZ() >> 4); + CraftEngineBlocks.place(location, nextState, UpdateOption.UPDATE_ALL), world, location.getBlockX() >> 4, location.getBlockZ() >> 4); return InteractionResult.SUCCESS; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java index b1a81069b..8b07342d3 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java @@ -26,4 +26,12 @@ public class ItemKeys { public static final Key AXOLOTL_BUCKET = Key.of("minecraft:axolotl_bucket"); public static final Key BUCKET = Key.of("minecraft:bucket"); public static final Key BONE_MEAL = Key.of("minecraft:bone_meal"); + + public static final Key[] AXES = new Key[] { + WOODEN_AXE, STONE_AXE, IRON_AXE, GOLDEN_AXE, DIAMOND_AXE, NETHERITE_AXE + }; + + public static final Key[] WATER_BUCKETS = new Key[] { + WATER_BUCKET, COD_BUCKET, SALMON_BUCKET, TROPICAL_FISH_BUCKET, TADPOLE_BUCKET, PUFFERFISH_BUCKET, AXOLOTL_BUCKET + }; }