Fix several bugs with fluids (null vs. EMPTY).

Fix IAEFluidStack NBT serialization.
Fix fluid export bus not exporting.
Fix fluid formation planes.
Fix fluid annihilation planes.
This commit is contained in:
Sebastian Hartte
2020-06-20 00:45:47 +02:00
parent 2458f9c890
commit 2f8cffdd93
18 changed files with 106 additions and 91 deletions
@@ -366,7 +366,7 @@ public class ContainerFluidTerminal extends AEBaseContainer
} else if (action == InventoryAction.EMPTY_ITEM) {
// See how much we can drain from the item
final FluidStack extract = fh.drain(Integer.MAX_VALUE, FluidAction.SIMULATE);
if (extract == null || extract.getAmount() < 1) {
if (extract.isEmpty() || extract.getAmount() < 1) {
return;
}
@@ -378,7 +378,7 @@ public class ContainerFluidTerminal extends AEBaseContainer
final int toStore = (int) (extract.getAmount() - notStorable.getStackSize());
final FluidStack storable = fh.drain(toStore, FluidAction.SIMULATE);
if (storable == null || storable.getAmount() == 0) {
if (storable.isEmpty() || storable.getAmount() == 0) {
return;
} else {
extract.setAmount(storable.getAmount());
@@ -335,7 +335,7 @@ public class DualityFluidInterface
// make sure strange things didn't happen...
final FluidStack canExtract = this.tanks.drain(slot, toStore.getFluidStack(), false);
if (canExtract == null || canExtract.getAmount() != toStore.getStackSize()) {
if (canExtract.isEmpty() || canExtract.getAmount() != toStore.getStackSize()) {
changed = true;
} else {
IAEFluidStack notStored = Platform.poweredInsert(src, dest, toStore, this.interfaceRequestSource);
@@ -345,7 +345,7 @@ public class DualityFluidInterface
// extract items!
changed = true;
final FluidStack removed = this.tanks.drain(slot, toStore.getFluidStack(), true);
if (removed == null || toStore.getStackSize() != removed.getAmount()) {
if (removed.isEmpty() || toStore.getStackSize() != removed.getAmount()) {
throw new IllegalStateException("bad attempt at managing tanks. ( drain )");
}
}
@@ -18,6 +18,7 @@
package appeng.fluids.items;
import net.minecraft.fluid.FluidState;
import net.minecraft.fluid.Fluids;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
@@ -44,7 +45,7 @@ public class FluidDummyItem extends AEBaseItem {
@Override
public String getTranslationKey(ItemStack stack) {
FluidStack fluidStack = this.getFluidStack(stack);
if (fluidStack == null) {
if (fluidStack.isEmpty()) {
fluidStack = new FluidStack(Fluids.WATER, FluidAttributes.BUCKET_VOLUME);
}
return fluidStack.getTranslationKey();
@@ -55,11 +56,11 @@ public class FluidDummyItem extends AEBaseItem {
CompoundNBT tag = is.getTag();
return FluidStack.loadFluidStackFromNBT(tag);
}
return null;
return FluidStack.EMPTY;
}
public void setFluidStack(ItemStack is, FluidStack fs) {
if (fs == null) {
if (fs.isEmpty()) {
is.setTag(null);
} else {
CompoundNBT tag = new CompoundNBT();
@@ -96,7 +96,7 @@ public class FluidHandlerAdapter implements IMEInventory<IAEFluidStack>, IBaseMo
// Drain the fluid from the tank
FluidStack gathered = this.fluidHandler.drain(requestedFluidStack, mode.getFluidAction());
if (gathered == null) {
if (gathered.isEmpty()) {
// If nothing was pulled from the tank, return null
return null;
}
@@ -102,7 +102,8 @@ public class PartFluidExportBus extends PartSharedFluidBus {
final TileEntity te = this.getConnectedTE();
LazyOptional<IFluidHandler> fhOpt = LazyOptional.empty();
if (te != null) {
te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, this.getSide().getFacing().getOpposite());
fhOpt = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY,
this.getSide().getFacing().getOpposite());
}
if (fhOpt.isPresent()) {
try {
@@ -8,6 +8,7 @@ import java.util.List;
import javax.annotation.Nonnull;
import net.minecraft.block.BlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.container.ContainerType;
import net.minecraft.item.ItemStack;
@@ -17,10 +18,14 @@ import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.client.model.data.IModelData;
import net.minecraftforge.common.util.FakePlayer;
import net.minecraftforge.common.util.FakePlayerFactory;
import net.minecraftforge.fluids.FluidAttributes;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidUtil;
import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.templates.FluidTank;
import appeng.api.AEApi;
@@ -117,8 +122,11 @@ public class PartFluidFormationPlane extends PartAbstractFormationPlane<IAEFluid
final FluidStack fs = input.getFluidStack();
fs.setAmount(FluidAttributes.BUCKET_VOLUME);
final FluidTank tank = new FluidTank(FluidAttributes.BUCKET_VOLUME, e -> e.isFluidEqual(fs));
if (!FluidUtil.tryPlaceFluid(null, w, Hand.MAIN_HAND, pos, tank, fs)) {
final FluidTank tank = new FluidTank(FluidAttributes.BUCKET_VOLUME);
tank.fill(fs, IFluidHandler.FluidAction.EXECUTE);
FakePlayer fakePlayer = FakePlayerFactory.getMinecraft((ServerWorld) w);
if (!FluidUtil.tryPlaceFluid(fakePlayer, w, Hand.MAIN_HAND, pos, tank, fs)) {
return input;
}
}
@@ -124,7 +124,7 @@ public class AEFluidInventory implements IAEFluidTank {
@Override
public int fill(FluidStack resource, FluidAction action) {
if (resource == null || resource.isEmpty() || resource.getAmount() <= 0) {
if (resource.isEmpty() || resource.getAmount() <= 0) {
return 0;
}
@@ -161,7 +161,7 @@ public class AEFluidInventory implements IAEFluidTank {
@Override
public FluidStack drain(final FluidStack fluid, final FluidAction action) {
if (fluid == null || fluid.getAmount() <= 0) {
if (fluid.isEmpty() || fluid.getAmount() <= 0) {
return FluidStack.EMPTY;
}
@@ -19,12 +19,20 @@
package appeng.fluids.util;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import com.google.common.base.Preconditions;
import net.minecraft.fluid.EmptyFluid;
import net.minecraft.fluid.Fluid;
import net.minecraft.fluid.Fluids;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.registries.ForgeRegistries;
import appeng.api.AEApi;
import appeng.api.config.FuzzyMode;
@@ -39,7 +47,8 @@ public final class AEFluidStack extends AEStack<IAEFluidStack> implements IAEFlu
private static final String NBT_STACKSIZE = "cnt";
private static final String NBT_REQUESTABLE = "req";
private static final String NBT_CRAFTABLE = "craft";
private static final String NBT_FLUIDSTACK = "fs";
private static final String NBT_FLUID_ID = "f";
private static final String NBT_FLUID_TAG = "ft";
private final Fluid fluid;
private CompoundNBT tagCompound;
@@ -57,47 +66,53 @@ public final class AEFluidStack extends AEStack<IAEFluidStack> implements IAEFlu
}
}
private AEFluidStack(@Nonnull final FluidStack fluidStack) {
this.fluid = fluidStack.getFluid();
if (this.fluid == null) {
throw new IllegalArgumentException("Fluid is null.");
private AEFluidStack(@Nonnull Fluid fluid, long amount, @Nullable CompoundNBT tag) {
if (fluid == Fluids.EMPTY) {
System.out.println();
}
this.setStackSize(fluidStack.getAmount());
this.fluid = Preconditions.checkNotNull(fluid);
this.setStackSize(amount);
this.setCraftable(false);
this.setCountRequestable(0);
if (fluidStack.getTag() != null) {
this.tagCompound = fluidStack.getTag().copy();
}
this.tagCompound = tag;
}
public static AEFluidStack fromFluidStack(final FluidStack input) {
if (input == null) {
if (input.isEmpty()) {
return null;
}
return new AEFluidStack(input);
Fluid fluid = input.getFluid();
if (fluid == null) {
throw new IllegalArgumentException("Fluid is null.");
}
long amount = input.getAmount();
CompoundNBT tag = null;
if (input.getTag() != null) {
tag = input.getTag().copy();
}
return new AEFluidStack(fluid, amount, tag);
}
public static IAEFluidStack fromNBT(final CompoundNBT data) {
final FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(data.getCompound(NBT_FLUIDSTACK));
if (fluidStack == null) {
ResourceLocation fluidId = new ResourceLocation(data.getString(NBT_FLUID_ID));
Fluid fluid = ForgeRegistries.FLUIDS.getValue(fluidId);
if (fluid == null || fluid == Fluids.EMPTY) {
return null;
}
final AEFluidStack fluid = AEFluidStack.fromFluidStack(fluidStack);
fluid.setStackSize(data.getLong(NBT_STACKSIZE));
fluid.setCountRequestable(data.getLong(NBT_REQUESTABLE));
fluid.setCraftable(data.getBoolean(NBT_CRAFTABLE));
if (fluid.hasTagCompound()) {
fluid.tagCompound = fluid.tagCompound.copy();
CompoundNBT tag = null;
if (data.contains(NBT_FLUID_TAG, Constants.NBT.TAG_COMPOUND)) {
tag = data.getCompound(NBT_FLUID_TAG);
}
return fluid;
long amount = data.getLong(NBT_STACKSIZE);
AEFluidStack fluidStack = new AEFluidStack(fluid, amount, tag);
fluidStack.setCountRequestable(data.getLong(NBT_REQUESTABLE));
fluidStack.setCraftable(data.getBoolean(NBT_CRAFTABLE));
return fluidStack;
}
@Override
@@ -112,14 +127,10 @@ public final class AEFluidStack extends AEStack<IAEFluidStack> implements IAEFlu
@Override
public void writeToNBT(final CompoundNBT data) {
data.getCompound(NBT_FLUIDSTACK).putString("FluidName", this.fluid.getRegistryName().toString());
data.getCompound(NBT_FLUIDSTACK).putInt("Amount", 0);
data.putString(NBT_FLUID_ID, this.fluid.getRegistryName().toString());
if (this.hasTagCompound()) {
data.getCompound(NBT_FLUIDSTACK).put("Tag", this.tagCompound);
} else {
data.getCompound(NBT_FLUIDSTACK).remove("Tag");
data.put(NBT_FLUID_TAG, this.tagCompound);
}
data.putLong(NBT_STACKSIZE, this.getStackSize());
data.putLong(NBT_REQUESTABLE, this.getCountRequestable());
data.putBoolean(NBT_CRAFTABLE, this.isCraftable());
@@ -234,7 +245,7 @@ public final class AEFluidStack extends AEStack<IAEFluidStack> implements IAEFlu
final long stackSize = buffer.readVarLong();
final long countRequestable = buffer.readVarLong();
if (fluidStack == null) {
if (fluidStack.isEmpty()) {
return null;
}
@@ -29,10 +29,6 @@ public class AEFluidTank extends FluidTank implements IAEFluidTank {
public AEFluidTank(IAEFluidInventory host, int capacity) {
super(capacity);
this.host = host;
// FIXME if( host instanceof TileEntity )
// FIXME {
// FIXME this.setTileEntity( (TileEntity) host );
// FIXME }
}
@Override