diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java index cb8c5199a4..7a4eebf121 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -2,9 +2,14 @@ import com.gregtechceu.gtceu.api.data.RotationState; import com.gregtechceu.gtceu.api.item.ComponentItem; +import com.gregtechceu.gtceu.api.item.IGTTool; import com.gregtechceu.gtceu.api.item.MetaMachineItem; +import com.gregtechceu.gtceu.api.item.component.IInteractionItem; +import com.gregtechceu.gtceu.api.item.component.IItemComponent; +import com.gregtechceu.gtceu.api.item.tool.GTToolItem; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.item.tool.ToolHelper; +import com.gregtechceu.gtceu.api.item.tool.behavior.IToolBehavior; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; @@ -251,6 +256,7 @@ public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { var machine = getMachine(world, pos); ItemStack itemStack = player.getItemInHand(hand); + boolean shouldOpenUi = true; Set types = ToolHelper.getToolTypes(itemStack); if (machine != null && !types.isEmpty() && ToolHelper.canUse(itemStack)) { @@ -269,14 +275,18 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player return itemStack.getItem().use(world, player, hand).getResult(); } + if (itemStack.getItem() instanceof IGTTool gtToolItem) { + shouldOpenUi = gtToolItem.definition$shouldOpenUIAfterUse(new UseOnContext(player, hand, hit)); + } + if (machine instanceof IInteractedMachine interactedMachine) { var result = interactedMachine.onUse(state, world, pos, player, hand, hit); if (result != InteractionResult.PASS) return result; } - if (machine instanceof IUIMachine uiMachine) { + if (shouldOpenUi && machine instanceof IUIMachine uiMachine) { return uiMachine.tryToOpenUI(player, hand, hit); } - return InteractionResult.PASS; + return shouldOpenUi ? InteractionResult.PASS : InteractionResult.CONSUME; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java b/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java index 301b8052cb..1aff46ac1c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java @@ -586,6 +586,16 @@ default int getTotalHarvestLevel(ItemStack stack) { return InteractionResultHolder.pass(stack); } + default boolean definition$shouldOpenUIAfterUse(UseOnContext context) { + for (IToolBehavior behavior : getToolStats().getBehaviors()) { + if (!behavior.shouldOpenUIAfterUse(context)) { + return false; + } + } + + return true; + } + default void definition$fillItemCategory(CreativeModeTab category, @Nonnull NonNullList items) { if (isElectric()) { items.add(get(Integer.MAX_VALUE)); diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/behavior/IToolBehavior.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/behavior/IToolBehavior.java index 0be1c69825..cf492b8d5f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/behavior/IToolBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/behavior/IToolBehavior.java @@ -116,6 +116,16 @@ default InteractionResultHolder onItemRightClick(@Nonnull Level world return InteractionResultHolder.pass(player.getItemInHand(hand)); } + /** + * Called when a block is right-clicked with this Item + * + * @param context The UseOnContext used to determine the result. + * @return True if the UI of the MetaMachine should open after using this tool. + */ + default boolean shouldOpenUIAfterUse(UseOnContext context) { + return true; + } + @OnlyIn(Dist.CLIENT) default void addInformation(@Nonnull ItemStack stack, @Nullable Level world, @Nonnull List tooltip, @Nonnull TooltipFlag flag) { } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/PlungerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/PlungerBehavior.java index 5b0ebfefc4..979659d88f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/PlungerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/PlungerBehavior.java @@ -1,8 +1,11 @@ package com.gregtechceu.gtceu.common.item.tool.behavior; +import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; +import com.gregtechceu.gtceu.api.item.component.IInteractionItem; import com.gregtechceu.gtceu.api.item.component.forge.IComponentCapability; import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.item.tool.behavior.IToolBehavior; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.misc.forge.VoidFluidHandlerItemStack; import com.lowdragmc.lowdraglib.side.fluid.FluidHelper; import com.lowdragmc.lowdraglib.side.fluid.FluidTransferHelper; @@ -22,7 +25,7 @@ import java.util.List; -public class PlungerBehavior implements IToolBehavior, IComponentCapability { +public class PlungerBehavior implements IToolBehavior, IComponentCapability, IInteractionItem { public static final PlungerBehavior INSTANCE = PlungerBehavior.create(); @@ -32,22 +35,36 @@ protected static PlungerBehavior create() { return new PlungerBehavior(); } + @Override + public boolean shouldOpenUIAfterUse(UseOnContext context) { + return !(context.getPlayer() != null && context.getPlayer().isShiftKeyDown()); + } + @Override public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { - IFluidTransfer fluidHandler = FluidTransferHelper.getFluidTransfer(context.getLevel(), context.getClickedPos(), context.getClickedFace()); - if (fluidHandler == null) { + + if (context.getPlayer() == null || !context.getPlayer().isShiftKeyDown()) { return InteractionResult.PASS; } - IFluidTransfer handlerToRemoveFrom = fluidHandler; -// player.isCrouching() ? -// (fluidHandler instanceof IOFluidTransferList ? ((IOFluidTransferList) fluidHandler).input : null) : -// (fluidHandler instanceof IOFluidTransferList ? ((IOFluidTransferList) fluidHandler).output : fluidHandler); + IFluidTransfer fluidHandler; - if (handlerToRemoveFrom != null && handlerToRemoveFrom.drain(FluidHelper.getBucket(), true) != null) { - ToolHelper.onActionDone(context.getPlayer(), context.getLevel(), context.getHand()); + if (context.getLevel().getBlockEntity(context.getClickedPos()) instanceof IMachineBlockEntity metaMachineBlockEntity) { + fluidHandler = metaMachineBlockEntity.getMetaMachine().getFluidTransferCap(context.getClickedFace(), false); + } else { + fluidHandler = FluidTransferHelper.getFluidTransfer(context.getLevel(), context.getClickedPos(), context.getClickedFace()); + } + + if (fluidHandler == null) { return InteractionResult.PASS; } + + com.lowdragmc.lowdraglib.side.fluid.FluidStack drained = fluidHandler.drain(FluidHelper.getBucket(), true); + if (drained != null && !drained.isEmpty()) { + fluidHandler.drain(FluidHelper.getBucket(), false); + ToolHelper.onActionDone(context.getPlayer(), context.getLevel(), context.getHand()); + return InteractionResult.CONSUME; + } return InteractionResult.PASS; }