diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java index f34eb8935..3618b8d43 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java @@ -5,6 +5,7 @@ import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.LocationUtils; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.bukkit.world.BukkitWorld; import net.momirealms.craftengine.core.block.CustomBlock; @@ -184,8 +185,7 @@ public final class CraftEngineBlocks { world.playBlockSound(vec3d, state.sounds().breakSound()); } if (sendParticles) { - // TODO Particles. needs world event - //ParticleUtils.addBlockBreakParticles(block.getWorld(), LocationUtils.toBlockPos(location), state.customBlockState().handle()); + FastNMS.INSTANCE.method$Level$levelEvent(world.serverWorld(), 2001, LocationUtils.toBlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()), state.customBlockState().registryId()); } block.setType(Material.AIR, applyPhysics); return true; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java index 7c42b3ad8..77a537757 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java @@ -63,7 +63,8 @@ public class BushBlockBehavior extends BukkitBlockBehavior { blockPos = args[4]; } if (!canSurvive(thisBlock, state, level, blockPos)) { - ImmutableBlockState previousState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(state)); + int stateId = BlockStateUtils.blockStateToId(state); + ImmutableBlockState previousState = BukkitBlockManager.instance().getImmutableBlockState(stateId); if (previousState != null && !previousState.isEmpty()) { ContextHolder.Builder builder = ContextHolder.builder(); BlockPos pos = LocationUtils.fromBlockPos(blockPos); @@ -74,6 +75,8 @@ public class BushBlockBehavior extends BukkitBlockBehavior { for (Item item : previousState.getDrops(builder, world)) { world.dropItemNaturally(vec3d, item); } + world.playBlockSound(vec3d, previousState.sounds().breakSound()); + FastNMS.INSTANCE.method$Level$levelEvent(level, 2001, blockPos, stateId); } return Reflections.method$Block$defaultBlockState.invoke(Reflections.instance$Blocks$AIR); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java index 7fe72f9f6..c11a5d511 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SugarCaneBlockBehavior.java @@ -55,19 +55,21 @@ public class SugarCaneBlockBehavior extends BushBlockBehavior { Object level = args[1]; Object blockPos = args[2]; if (!canSurvive(thisBlock, blockState, level, blockPos)) { - ImmutableBlockState currentState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(blockState)); + int stateId = BlockStateUtils.blockStateToId(blockState); + ImmutableBlockState currentState = BukkitBlockManager.instance().getImmutableBlockState(stateId); if (currentState != null && !currentState.isEmpty()) { // break the sugar cane Reflections.method$Level$removeBlock.invoke(level, blockPos, false); Vec3d vec3d = Vec3d.atCenterOf(LocationUtils.fromBlockPos(blockPos)); net.momirealms.craftengine.core.world.World world = new BukkitWorld(FastNMS.INSTANCE.method$Level$getCraftWorld(level)); - // TODO client side particles? ContextHolder.Builder builder = ContextHolder.builder() .withParameter(LootParameters.LOCATION, vec3d) .withParameter(LootParameters.WORLD, world); for (Item item : currentState.getDrops(builder, world)) { world.dropItemNaturally(vec3d, item); } + world.playBlockSound(vec3d, currentState.sounds().breakSound()); + FastNMS.INSTANCE.method$Level$levelEvent(level, 2001, blockPos, stateId); } } } diff --git a/gradle.properties b/gradle.properties index 295ac58ef..4c86a43c1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -49,7 +49,7 @@ mojang_brigadier_version=1.0.18 byte_buddy_version=1.15.11 snake_yaml_version=2.3 anti_grief_version=0.13 -nms_helper_version=0.33 +nms_helper_version=0.34 # Ignite Dependencies mixinextras_version=0.4.1 mixin_version=0.15.2+mixin.0.8.7