From a8e202eaeff1bfd8c70539ea82511354831d1e52 Mon Sep 17 00:00:00 2001 From: David Quintino Date: Mon, 31 Mar 2025 11:30:14 +0100 Subject: [PATCH] fix #7382: Chain Conveyor travel doesn't work with Wrench in offhand Swapping the Wrench to the offhand causes the player to disconnect from the Chain Conveyor. Chain Conveyors are not targetable while holding a Wrench in the offhand, only in the main hand. This bugfix allows for targeting and riding a chain conveyor while holding a Wrench in the offhand and also allows for hand swapping while riding without disconecting. However, it doesn't change the arm swing animation for the off-hand when getting on or the hanging animation. --- .../ChainConveyorInteractionHandler.java | 22 +++++++++-------- .../ChainConveyorRidingHandler.java | 2 +- .../ChainPackageInteractionPacket.java | 24 ++++++++++++------- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java index cca47498dc..529b567895 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorInteractionHandler.java @@ -52,8 +52,7 @@ public static void clientTick() { } Minecraft mc = Minecraft.getInstance(); - ItemStack mainHandItem = mc.player.getMainHandItem(); - boolean isWrench = AllItemTags.CHAIN_RIDEABLE.matches(mainHandItem); + boolean isWrench = mc.player.isHolding(AllItemTags.CHAIN_RIDEABLE::matches); boolean dismantling = isWrench && mc.player.isShiftKeyDown(); double range = mc.player.getAttribute(ForgeMod.BLOCK_REACH.get()) .getValue() + 1; @@ -114,9 +113,9 @@ public static void clientTick() { private static boolean isActive() { Minecraft mc = Minecraft.getInstance(); - ItemStack mainHandItem = mc.player.getMainHandItem(); - return AllItemTags.CHAIN_RIDEABLE.matches(mainHandItem) || AllBlocks.PACKAGE_FROGPORT.isIn(mainHandItem) - || PackageItem.isPackage(mainHandItem); + return mc.player.isHolding(AllItemTags.CHAIN_RIDEABLE::matches) + || mc.player.isHolding(s->AllBlocks.PACKAGE_FROGPORT.isIn(s)) + || mc.player.isHolding(PackageItem::isPackage); } public static boolean onUse() { @@ -125,8 +124,10 @@ public static boolean onUse() { Minecraft mc = Minecraft.getInstance(); ItemStack mainHandItem = mc.player.getMainHandItem(); + ItemStack offHandItem = mc.player.getOffhandItem(); + if (mc.player.isHolding(AllItemTags.CHAIN_RIDEABLE::matches)) { + ItemStack usedItem = AllItemTags.CHAIN_RIDEABLE.matches(mainHandItem) ? mainHandItem : offHandItem; - if (AllItemTags.CHAIN_RIDEABLE.matches(mainHandItem)) { if (!mc.player.isShiftKeyDown()) { ChainConveyorRidingHandler.embark(selectedLift, selectedChainPosition, selectedConnection); return true; @@ -134,21 +135,22 @@ public static boolean onUse() { AllPackets.getChannel() .sendToServer(new ChainConveyorConnectionPacket(selectedLift, selectedLift.offset(selectedConnection), - mainHandItem, false)); + usedItem, false)); return true; } - if (AllBlocks.PACKAGE_FROGPORT.isIn(mainHandItem)) { + if (mc.player.isHolding(s->AllBlocks.PACKAGE_FROGPORT.isIn(s))) { PackagePortTargetSelectionHandler.exactPositionOfTarget = selectedBakedPosition; PackagePortTargetSelectionHandler.activePackageTarget = new PackagePortTarget.ChainConveyorFrogportTarget(selectedLift, selectedChainPosition, selectedConnection); return true; } - if (PackageItem.isPackage(mainHandItem)) { + if (mc.player.isHolding(PackageItem::isPackage)) { + ItemStack usedItem = PackageItem.isPackage(mainHandItem) ? mainHandItem : offHandItem; AllPackets.getChannel() .sendToServer(new ChainPackageInteractionPacket(selectedLift, selectedConnection, selectedChainPosition, - mainHandItem)); + usedItem)); return true; } diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java index 883caa0da0..f46fec14e3 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainConveyorRidingHandler.java @@ -46,7 +46,7 @@ public static void clientTick() { Minecraft mc = Minecraft.getInstance(); if (mc.isPaused()) return; - if (!AllItemTags.CHAIN_RIDEABLE.matches(mc.player.getMainHandItem())) { + if (!mc.player.isHolding(AllItemTags.CHAIN_RIDEABLE::matches)) { stopRiding(); return; } diff --git a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainPackageInteractionPacket.java b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainPackageInteractionPacket.java index c1e01c23ac..463e26b696 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainPackageInteractionPacket.java +++ b/src/main/java/com/simibubi/create/content/kinetics/chainConveyor/ChainPackageInteractionPacket.java @@ -77,9 +77,13 @@ protected void applySettings(ServerPlayer player, ChainConveyorBlockEntity be) { if (best == null) return; - if (player.getMainHandItem() - .isEmpty()) - player.setItemInHand(InteractionHand.MAIN_HAND, best.item.copy()); + if (player.isHolding(stack -> stack.isEmpty())) { + if (player.getMainHandItem().isEmpty()) { + player.setItemInHand(InteractionHand.MAIN_HAND, best.item.copy()); + } else { + player.setItemInHand(InteractionHand.OFF_HAND, best.item.copy()); + } + } else player.getInventory() .placeItemBackInInventory(best.item.copy()); @@ -95,11 +99,15 @@ protected void applySettings(ServerPlayer player, ChainConveyorBlockEntity be) { return; if (!player.isCreative()) { - player.getMainHandItem() - .shrink(1); - if (player.getMainHandItem() - .isEmpty()) - player.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); + player.getMainHandItem().shrink(1); + player.getOffhandItem().shrink(1); + if (player.isHolding(stack -> stack.isEmpty())) { + if (player.getMainHandItem().isEmpty()) { + player.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); + } else { + player.setItemInHand(InteractionHand.OFF_HAND, ItemStack.EMPTY); + } + } } if (selectedConnection.equals(BlockPos.ZERO))