diff --git a/src/main/java/com/minelittlepony/unicopia/BlockDestructionManager.java b/src/main/java/com/minelittlepony/unicopia/BlockDestructionManager.java index 77887820..2bf8a6cd 100644 --- a/src/main/java/com/minelittlepony/unicopia/BlockDestructionManager.java +++ b/src/main/java/com/minelittlepony/unicopia/BlockDestructionManager.java @@ -5,6 +5,7 @@ import com.minelittlepony.unicopia.network.MsgBlockDestruction; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; +import net.minecraft.block.BlockState; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -49,6 +50,12 @@ public class BlockDestructionManager { return amount; } + public void onBlockChanged(BlockPos pos, BlockState oldState, BlockState newstate) { + if (oldState.getBlock() != newstate.getBlock()) { + clearBlockDestruction(pos); + } + } + public void tick() { synchronized (locker) { destructions.long2ObjectEntrySet().removeIf(entry -> entry.getValue().tick()); diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinServerWorld.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinServerWorld.java new file mode 100644 index 00000000..9a2ecf46 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinServerWorld.java @@ -0,0 +1,23 @@ +package com.minelittlepony.unicopia.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.minelittlepony.unicopia.BlockDestructionManager; +import net.minecraft.block.BlockState; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.World; + +@Mixin(ServerWorld.class) +abstract class MixinServerWorld extends World implements StructureWorldAccess { + private MixinServerWorld() {super(null, null, null, null, false, false, 0);} + + @Inject(method = "onBlockChanged", at = @At("HEAD")) + private void onOnBlockChanged(BlockPos pos, BlockState oldState, BlockState newState, CallbackInfo info) { + ((BlockDestructionManager.Source)this).getDestructionManager().onBlockChanged(pos, oldState, newState); + } +} diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json index abf8d34c..e6fac879 100644 --- a/src/main/resources/unicopia.mixin.json +++ b/src/main/resources/unicopia.mixin.json @@ -16,6 +16,7 @@ "MixinPlayerEntity", "MixinProjectileEntity", "MixinServerPlayerEntity", + "MixinServerWorld", "MixinSheepEntity", "MixinShulkerEntity", "MixinTargetPredicate",