Skip to content

Commit

Permalink
Changed Drum and Tank right-click behavior
Browse files Browse the repository at this point in the history
Now passes the interaction for drums and tanks if the held item isn't a fluidhandler
Also cleaned up the CreativeTankMachine to more properly make use of being a subclass
Implemented CreativeTankMachine right-click behavior
  • Loading branch information
krossgg committed Sep 22, 2024
1 parent 1b45d3e commit d63719a
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 57 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,9 @@
import com.gregtechceu.gtceu.api.capability.recipe.IO;
import com.gregtechceu.gtceu.api.gui.GuiTextures;
import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity;
import com.gregtechceu.gtceu.api.machine.MetaMachine;
import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank;
import com.gregtechceu.gtceu.api.misc.lib.PhantomFluidWidget;
import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable;
import com.gregtechceu.gtceu.api.transfer.fluid.InfiniteFluidTransferProxy;
import com.gregtechceu.gtceu.utils.GTUtil;

import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup;
import com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture;
Expand All @@ -18,11 +16,19 @@
import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted;
import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder;

import net.minecraft.core.Direction;
import net.minecraft.core.BlockPos;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidType;
import net.minecraftforge.fluids.FluidUtil;
import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction;

import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull;

public class CreativeTankMachine extends QuantumTankMachine {

Expand All @@ -36,53 +42,66 @@ public class CreativeTankMachine extends QuantumTankMachine {
@DropSaved
private int ticksPerCycle = 1;

private final InfiniteFluidTransferProxy capabilityTransferProxy;

public CreativeTankMachine(IMachineBlockEntity holder) {
super(holder, GTValues.MAX, -1);

capabilityTransferProxy = new InfiniteFluidTransferProxy(cache, true, true);
}

@Nullable
@Override
public IFluidHandlerModifiable getFluidTransferCap(@Nullable Direction side, boolean useCoverCapability) {
if (side == null || (useCoverCapability && coverContainer.hasCover(side)))
return super.getFluidTransferCap(side, useCoverCapability);

return capabilityTransferProxy;
}

protected NotifiableFluidTank createCacheFluidHandler(Object... args) {
return new NotifiableFluidTank(this, 1, 1000, IO.BOTH, IO.NONE);
}

@Override
protected void updateAutoOutputSubscription() {
var outputFacing = getOutputFacingFluids();
if ((isAutoOutputFluids() && !cache.isEmpty()) && outputFacing != null &&
GTUtil.isAdjacentFluidHandler(getLevel(), getPos(), outputFacing)) {
autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput);
} else if (autoOutputSubs != null) {
autoOutputSubs.unsubscribe();
autoOutputSubs = null;
}
return new InfiniteTank(this);
}

protected void checkAutoOutput() {
if (getOffsetTimer() % ticksPerCycle == 0) {
if (isAutoOutputFluids() && getOutputFacingFluids() != null) {
updateFluidTick();
cache.exportToNearby(getOutputFacingFluids());
}
updateAutoOutputSubscription();
}
}

private void updateStored(FluidStack fluid) {
cache.setFluidInTank(0, new FluidStack(fluid, 1000));
stored = cache.getFluidInTank(0);
}

@Override
public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand,
BlockHitResult hit) {
var heldItem = player.getItemInHand(hand);
if (hit.getDirection() == getFrontFacing() && !isRemote()) {
// Clear fluid if empty + shift-rclick
if (heldItem.isEmpty() && player.isCrouching() && !stored.isEmpty()) {
updateStored(FluidStack.EMPTY);
return InteractionResult.SUCCESS;
}

// If no fluid set and held-item has fluid, set fluid
if (stored.isEmpty()) {
FluidUtil.getFluidContained(heldItem).ifPresent(this::updateStored);
return InteractionResult.SUCCESS;
}

// If held item can take fluid from tank, do it, otherwise set new fluid
var handler = FluidUtil.getFluidHandler(heldItem).resolve().orElse(null);
if (handler != null) {
var copy = stored.copy();
copy.setAmount(Integer.MAX_VALUE);
int filled = handler.fill(copy, FluidAction.SIMULATE);
if (filled > 0) {
handler.fill(copy, FluidAction.EXECUTE);
player.setItemInHand(hand, handler.getContainer());
} else updateStored(handler.getFluidInTank(0));
return InteractionResult.SUCCESS;
}
}
return InteractionResult.PASS;
}

@Override
public WidgetGroup createUIWidget() {
var group = new WidgetGroup(0, 0, 176, 131);
group.addWidget(new PhantomFluidWidget(this.cache.getStorages()[0], 0, 36, 6, 18, 18,
() -> this.cache.getStorages()[0].getFluid(), (fluid) -> this.cache.getStorages()[0].setFluid(fluid))
this::getStored, this::updateStored)
.setShowAmount(false).setBackground(GuiTextures.FLUID_SLOT));
group.addWidget(new LabelWidget(7, 9, "gtceu.creative.tank.fluid"));
group.addWidget(new ImageWidget(7, 45, 154, 14, GuiTextures.DISPLAY));
Expand Down Expand Up @@ -112,22 +131,33 @@ public WidgetGroup createUIWidget() {
return group;
}

public void updateFluidTick() {
if (ticksPerCycle == 0 || getOffsetTimer() % ticksPerCycle != 0 ||
cache.getStorages()[0].getFluid().isEmpty() || getLevel().isClientSide || !isWorkingEnabled())
return;

GTUtil.getAdjacentFluidHandler(getLevel(), getPos(), getOutputFacingFluids()).ifPresent(h -> {
FluidStack stack = cache.getFluidInTank(0).copy();
stack.setAmount(mBPerCycle);
int insertable = h.fill(stack, FluidAction.SIMULATE);
stack.setAmount(Math.min(mBPerCycle, insertable));
h.fill(stack, FluidAction.EXECUTE);
});
}

@Override
public ManagedFieldHolder getFieldHolder() {
return MANAGED_FIELD_HOLDER;
}

private class InfiniteTank extends NotifiableFluidTank {

public InfiniteTank(MetaMachine holder) {
super(holder, 1, FluidType.BUCKET_VOLUME, IO.BOTH, IO.BOTH);
}

@Override
public int fill(FluidStack resource, FluidAction action) {
if (!stored.isEmpty()) return resource.getAmount();
return 0;
}

@Override
public @NotNull FluidStack drain(int maxDrain, FluidAction action) {
if (!stored.isEmpty()) return new FluidStack(stored, mBPerCycle);
return FluidStack.EMPTY;
}

@Override
public @NotNull FluidStack drain(FluidStack resource, FluidAction action) {
if (!stored.isEmpty() && stored.isFluidEqual(resource)) return new FluidStack(resource, mBPerCycle);
return FluidStack.EMPTY;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -199,10 +199,8 @@ protected void checkAutoOutput() {
@Override
public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand,
BlockHitResult hit) {
var currentStack = player.getMainHandItem();
if (!currentStack.isEmpty()) {
if (!isRemote()) {
FluidUtil.interactWithFluidHandler(player, hand, cache);
if (!isRemote()) {
if (FluidUtil.interactWithFluidHandler(player, hand, cache)) {
return InteractionResult.SUCCESS;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank;
import com.gregtechceu.gtceu.api.misc.lib.PhantomFluidWidget;
import com.gregtechceu.gtceu.api.misc.lib.TankWidget;
import com.gregtechceu.gtceu.utils.GTUtil;

import com.lowdragmc.lowdraglib.gui.editor.ColorPattern;
import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture;
Expand Down Expand Up @@ -198,8 +199,8 @@ public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) {

protected void updateAutoOutputSubscription() {
var outputFacing = getOutputFacingFluids();
if ((isAutoOutputFluids() && !cache.isEmpty()) && outputFacing != null && FluidUtil
.getFluidHandler(getLevel(), getPos().relative(outputFacing), outputFacing.getOpposite()).isPresent()) {
if ((isAutoOutputFluids() && !cache.isEmpty()) && outputFacing != null &&
GTUtil.isAdjacentFluidHandler(getLevel(), getPos(), outputFacing)) {
autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput);
} else if (autoOutputSubs != null) {
autoOutputSubs.unsubscribe();
Expand Down Expand Up @@ -229,10 +230,8 @@ public boolean isFacingValid(Direction facing) {
@Override
public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand,
BlockHitResult hit) {
var currentStack = player.getMainHandItem();
if (hit.getDirection() == getFrontFacing() && !currentStack.isEmpty()) {
if (!isRemote()) {
FluidUtil.interactWithFluidHandler(player, hand, cache);
if (hit.getDirection() == getFrontFacing() && !isRemote()) {
if (FluidUtil.interactWithFluidHandler(player, hand, cache)) {
return InteractionResult.SUCCESS;
}
}
Expand Down

0 comments on commit d63719a

Please sign in to comment.