From 63064d3d76b774959ace3fec68551fa0a8ecf263 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Tue, 22 Oct 2019 16:23:57 -0400 Subject: [PATCH] Add swapping when attacking breaks tool --- .../mixin/MixinServerPlayNetworkHandler.java | 49 +++++++++++++++++++ .../MixinServerPlayerInteractionManager.java | 9 ++-- .../net/shadowfacts/autoswap/AutoSwap.kt | 12 +++++ src/main/resources/autoswap.mixins.json | 3 +- 4 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 src/main/java/net/shadowfacts/autoswap/mixin/MixinServerPlayNetworkHandler.java diff --git a/src/main/java/net/shadowfacts/autoswap/mixin/MixinServerPlayNetworkHandler.java b/src/main/java/net/shadowfacts/autoswap/mixin/MixinServerPlayNetworkHandler.java new file mode 100644 index 0000000..843cbea --- /dev/null +++ b/src/main/java/net/shadowfacts/autoswap/mixin/MixinServerPlayNetworkHandler.java @@ -0,0 +1,49 @@ +package net.shadowfacts.autoswap.mixin; + +import net.minecraft.item.ItemStack; +import net.minecraft.server.network.ServerPlayNetworkHandler; +import net.minecraft.server.network.ServerPlayerEntity; +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.callback.CallbackInfo; + +/** + * @author shadowfacts + */ +@Mixin(ServerPlayNetworkHandler.class) +public abstract class MixinServerPlayNetworkHandler { + + @Shadow + private ServerPlayerEntity player; + + private ItemStack heldStackBeforeAttack = ItemStack.EMPTY; + + @Inject( + method = "onPlayerInteractEntity", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/network/ServerPlayerEntity;attack(Lnet/minecraft/entity/Entity;)V" + ) + ) + private void beforePlayerAttack(CallbackInfo cb) { + this.heldStackBeforeAttack = player.inventory.getMainHandStack().copy(); + } + + @Inject( + method = "onPlayerInteractEntity", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/network/ServerPlayerEntity;attack(Lnet/minecraft/entity/Entity;)V", + shift = At.Shift.AFTER + ) + ) + private void afterPlayerAttack(CallbackInfo cb) { + AutoSwap.INSTANCE.afterAttack(player.inventory, heldStackBeforeAttack); + heldStackBeforeAttack = ItemStack.EMPTY; + } + + +} diff --git a/src/main/java/net/shadowfacts/autoswap/mixin/MixinServerPlayerInteractionManager.java b/src/main/java/net/shadowfacts/autoswap/mixin/MixinServerPlayerInteractionManager.java index a82dc32..5f922bf 100644 --- a/src/main/java/net/shadowfacts/autoswap/mixin/MixinServerPlayerInteractionManager.java +++ b/src/main/java/net/shadowfacts/autoswap/mixin/MixinServerPlayerInteractionManager.java @@ -1,6 +1,5 @@ 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; @@ -24,12 +23,14 @@ public abstract class MixinServerPlayerInteractionManager { @Shadow private ServerPlayerEntity player; + @Shadow + abstract boolean isCreative(); + 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(); + heldStackAtBeginningOfBreak = player.inventory.getMainHandStack().copy(); } @Inject(method = "tryBreakBlock", at = @At("RETURN")) @@ -45,7 +46,7 @@ public abstract class MixinServerPlayerInteractionManager { private ActionResult useOnBlock(ItemStack self, ItemUsageContext context) { ItemStack selfCopy = self.copy(); ActionResult result = self.useOnBlock(context); - if (result == ActionResult.SUCCESS) { + if (!isCreative() && result == ActionResult.SUCCESS) { AutoSwap.INSTANCE.onUseOnItem(player, player.inventory, selfCopy); } return result; diff --git a/src/main/kotlin/net/shadowfacts/autoswap/AutoSwap.kt b/src/main/kotlin/net/shadowfacts/autoswap/AutoSwap.kt index 3edd65b..93423f3 100644 --- a/src/main/kotlin/net/shadowfacts/autoswap/AutoSwap.kt +++ b/src/main/kotlin/net/shadowfacts/autoswap/AutoSwap.kt @@ -44,4 +44,16 @@ object AutoSwap: ModInitializer { } } + fun afterAttack(playerInv: PlayerInventory, heldStackBeforeAttack: ItemStack) { + val heldStack = playerInv.mainHandStack + if (!heldStackBeforeAttack.isEmpty && heldStack.isEmpty) { + val index = playerInv.main.indexOfFirst { + ItemStack.areItemsEqualIgnoreDamage(heldStackBeforeAttack, it) + } + if (index >= 0) { + playerInv.swapSlotWithHotbar(index) + } + } + } + } \ No newline at end of file diff --git a/src/main/resources/autoswap.mixins.json b/src/main/resources/autoswap.mixins.json index 5ff3a3e..b131c5b 100644 --- a/src/main/resources/autoswap.mixins.json +++ b/src/main/resources/autoswap.mixins.json @@ -3,7 +3,8 @@ "package": "net.shadowfacts.autoswap.mixin", "compatibilityLevel": "JAVA_8", "mixins": [ - "MixinServerPlayerInteractionManager" + "MixinServerPlayerInteractionManager", + "MixinServerPlayNetworkHandler" ], "client": [ ],