package net.shadowfacts.autoswap.mixin; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUsageContext; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerInteractionManager; import net.minecraft.util.ActionResult; import net.minecraft.util.math.BlockPos; import net.shadowfacts.autoswap.AutoSwap; 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.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; /** * @author shadowfacts */ @Mixin(ServerPlayerInteractionManager.class) public abstract class MixinServerPlayerInteractionManager { @Shadow private ServerPlayerEntity player; private ItemStack heldStackAtBeginningOfBreak = ItemStack.EMPTY; @Inject(method = "tryBreakBlock", at = @At("HEAD")) private void beginTryBreakBlock(BlockPos pos, CallbackInfoReturnable cb) { PlayerInventory playerInv = player.inventory; heldStackAtBeginningOfBreak = playerInv.getInvStack(playerInv.selectedSlot).copy(); } @Inject(method = "tryBreakBlock", at = @At("RETURN")) private void endTryBreakBlock(BlockPos pos, CallbackInfoReturnable cb) { AutoSwap.INSTANCE.endBreakBlock(player.inventory, heldStackAtBeginningOfBreak); heldStackAtBeginningOfBreak = ItemStack.EMPTY; } @Redirect( method = "interactBlock", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;useOnBlock(Lnet/minecraft/item/ItemUsageContext;)Lnet/minecraft/util/ActionResult;") ) private ActionResult useOnBlock(ItemStack self, ItemUsageContext context) { ItemStack selfCopy = self.copy(); ActionResult result = self.useOnBlock(context); if (result == ActionResult.SUCCESS) { AutoSwap.INSTANCE.onUseOnItem(player, player.inventory, selfCopy); } return result; } }