package org.sandboxpowered.sandbox.fabric.mixin.event.network; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerInteractionManager; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import org.sandboxpowered.sandbox.api.event.BlockEvent; import org.sandboxpowered.sandbox.api.state.BlockState; import org.sandboxpowered.sandbox.api.util.math.Position; import org.sandboxpowered.sandbox.api.world.World; import org.sandboxpowered.sandbox.fabric.event.EventDispatcher; import org.sandboxpowered.sandbox.fabric.util.WrappingUtil; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(ServerPlayerInteractionManager.class) public class MixinServerPlayerInteractionManager { @Shadow public ServerWorld world; @Shadow public ServerPlayerEntity player; @Inject(method = "tryBreakBlock", at = @At("HEAD"), cancellable = true) public void tryBreakBlock(BlockPos pos, CallbackInfoReturnable<Boolean> info) { BlockEvent.Break event = EventDispatcher.publish(new BlockEvent.Break( (World) world, (Position) pos, (BlockState) world.getBlockState(pos), WrappingUtil.convert(this.player))); if (event.isCancelled()) { info.setReturnValue(false); } } }