Skip to content

Commit

Permalink
Fix handling of zero emc fluids (#88)
Browse files Browse the repository at this point in the history
  • Loading branch information
DonovanDMC committed Oct 12, 2023
1 parent bbac7cb commit 6a7162f
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 14 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cool.furry.mc.forge.projectexpansion.block.entity;

import cool.furry.mc.forge.projectexpansion.Main;
import cool.furry.mc.forge.projectexpansion.block.BlockEMCLink;
import cool.furry.mc.forge.projectexpansion.config.Config;
import cool.furry.mc.forge.projectexpansion.registries.BlockEntityTypes;
Expand Down Expand Up @@ -43,7 +44,12 @@
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.logging.LogManager;
import java.util.logging.Logger;

@SuppressWarnings("unused")
public class BlockEntityEMCLink extends BlockEntityNBTFilterable implements IHasMatter {
Expand Down Expand Up @@ -184,8 +190,8 @@ public InteractionResult handleActivation(Player player, InteractionHand hand) {
}

Fluid fluid = fluidHandler.getFluid();
if(fluid != null && fluidHandler.getFluidCostPer() != 0D && inHand.getItem() instanceof BucketItem bucketItem && ((BucketItem) inHand.getItem()).getFluid() == Fluids.EMPTY) {
if(Config.limitEmcLinkVendor.get() && remainingExport < 1000) {
if(fluid != null && fluidHandler.isValid() && inHand.getItem() instanceof BucketItem bucketItem && ((BucketItem) inHand.getItem()).getFluid() == Fluids.EMPTY) {
if(Config.limitEmcLinkVendor.get() && remainingFluid < 1000) {
player.displayClientMessage(Lang.Blocks.EMC_LINK_NO_EXPORT_REMAINING.translateColored(ChatFormatting.RED), true);
return InteractionResult.CONSUME;
}
Expand Down Expand Up @@ -265,8 +271,8 @@ public long insertEmc(long emc, EmcAction action) {
}
}

public EMCHandler getEMCHandlerCapability() {
return (EMCHandler) getCapability(PECapabilities.EMC_STORAGE_CAPABILITY).orElseThrow(NullPointerException::new);
public IEmcStorage getEMCHandlerCapability() {
return getCapability(PECapabilities.EMC_STORAGE_CAPABILITY).orElseThrow(NullPointerException::new);
}

private class ItemHandler implements IItemHandler {
Expand Down Expand Up @@ -370,8 +376,8 @@ public boolean isItemValid(int slot, @Nonnull ItemStack stack) {
}
}

public ItemHandler getItemHandlerCapability() {
return (ItemHandler) getCapability(ForgeCapabilities.ITEM_HANDLER).orElseThrow(NullPointerException::new);
public IItemHandler getItemHandlerCapability() {
return getCapability(ForgeCapabilities.ITEM_HANDLER).orElseThrow(NullPointerException::new);
}

private class FluidHandler implements IFluidHandler {
Expand All @@ -391,6 +397,14 @@ private double getFluidCostPer() {
}
}

private boolean isFreeFluid() {
return getFluidCostPer() == 0D && Config.zeroEmcFluidsAreFree.get();
}

private boolean isValid() {
return getFluid() != null && (getFluidCostPer() != 0D || isFreeFluid());
}

private long getFluidCost(double amount) {
try {
double cost = getFluidCostPer();
Expand All @@ -408,13 +422,21 @@ public int getTanks() {
@Nonnull
@Override
public FluidStack getFluidInTank(int tank) {
if(tank != 0) {
return FluidStack.EMPTY;
}

Fluid fluid = getFluid();
if(fluid == null || getFluidCostPer() == 0D) return FluidStack.EMPTY;
if(fluid == null || !isValid()) return FluidStack.EMPTY;
return new FluidStack(fluid, remainingFluid);
}

@Override
public int getTankCapacity(int tank) {
if(tank != 0) {
return 0;
}

return remainingFluid;
}

Expand All @@ -432,16 +454,16 @@ public int fill(FluidStack resource, FluidAction action) {
@Override
public FluidStack drain(FluidStack resource, FluidAction action) {
Fluid fluid = getFluid();
if(fluid != null && getFluidCostPer() != 0D && resource.getFluid().equals(fluid)) return drain(resource.getAmount(), action);
return FluidStack.EMPTY;
if(fluid == null || !isValid() || !resource.getFluid().equals(fluid)) return FluidStack.EMPTY;
return drain(resource.getAmount(), action);
}

@Nonnull
@Override
public FluidStack drain(int maxDrain, FluidAction action) {
boolean isFinal = getMatter() == Matter.FINAL;
Fluid fluid = getFluid();
if(fluid == null || getFluidCostPer() == 0D || Util.getPlayer(owner) == null) return FluidStack.EMPTY;
if(fluid == null || !isValid() || Util.getPlayer(owner) == null) return FluidStack.EMPTY;
if(!isFinal && maxDrain > remainingFluid) maxDrain = remainingFluid;
if(maxDrain > remainingFluid) maxDrain = remainingFluid;
long cost = getFluidCost(maxDrain);
Expand All @@ -461,15 +483,17 @@ public FluidStack drain(int maxDrain, FluidAction action) {
if(action.execute()) {
if(!isFinal) remainingFluid -= maxDrain;
markDirty();
provider.setEmc(emc.subtract(BigInteger.valueOf(cost)));
provider.syncEmc(Objects.requireNonNull(Util.getPlayer(owner)));
if(!isFreeFluid()) {
provider.setEmc(emc.subtract(BigInteger.valueOf(cost)));
provider.syncEmc(Objects.requireNonNull(Util.getPlayer(owner)));
}
}
return new FluidStack(fluid, maxDrain);
}
}

public FluidHandler getFluidHandlerCapability() {
return (FluidHandler) getCapability(ForgeCapabilities.FLUID_HANDLER).orElseThrow(NullPointerException::new);
public IFluidHandler getFluidHandlerCapability() {
return getCapability(ForgeCapabilities.FLUID_HANDLER).orElseThrow(NullPointerException::new);
}

@Nonnull
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;

import java.util.List;
import java.util.logging.Logger;

public final class Config {
Expand Down Expand Up @@ -34,6 +35,7 @@ public final class Config {
public static final ForgeConfigSpec.ConfigValue<Boolean> enabledLearnedTooltip = Builder.comment("If a tooltip should be shown on items which can be learned, denoting if the item has been learned or not. Note: ProjectE's client.shiftEmcToolTips applies to this.").define("enabledLearnedTooltip", true);
public static final ForgeConfigSpec.ConfigValue<Boolean> alchemicalCollectionSound = Builder.comment("If a sound should be played when something is collected with Alchemical Collection.").define("alchemicalCollectionSound", true);
private static final ForgeConfigSpec.ConfigValue<String> editOthersAlchemicalBooks = Builder.comment("If players should be allowed to edit books bound to other players. A player is considered to be \"OP\" when they have an op level of 2 or greater. Allowed values: DISABLED, OP_ONLY, ENABLED").define("editOthersAlchemicalBooks", AlchemicalBookEditLevel.DISABLED.name());
public static final ForgeConfigSpec.ConfigValue<Boolean> zeroEmcFluidsAreFree = Builder.comment("If fluids which end their calculations at zero emc should be returned as free.").define("zeroEmcFluidsAreFree", true);
static { Spec = Builder.build(); }
public static AlchemicalBookEditLevel editOthersAlchemicalBooks() {
try {
Expand Down

0 comments on commit 6a7162f

Please sign in to comment.