diff --git a/patches/minecraft/net/minecraft/fluid/Fluid.java.patch b/patches/minecraft/net/minecraft/fluid/Fluid.java.patch index 4eb0f6dd03..825abc00c6 100644 --- a/patches/minecraft/net/minecraft/fluid/Fluid.java.patch +++ b/patches/minecraft/net/minecraft/fluid/Fluid.java.patch @@ -9,7 +9,7 @@ public static final ObjectIntIdentityMap field_207201_d = new ObjectIntIdentityMap<>(); protected final StateContainer field_207202_e; private IFluidState field_207200_b; -@@ -102,4 +102,41 @@ +@@ -102,4 +102,40 @@ } public abstract VoxelShape func_215664_b(IFluidState p_215664_1_, IBlockReader p_215664_2_, BlockPos p_215664_3_); @@ -34,12 +34,11 @@ + new net.minecraft.util.ResourceLocation("block/water_still"), + new net.minecraft.util.ResourceLocation("block/water_flow")) + .overlay(new net.minecraft.util.ResourceLocation("block/water_overlay")) -+ .vanillaColor().block(() -> net.minecraft.block.Blocks.field_150355_j).build(); ++ .vanillaColor().build(); + if (fluid instanceof LavaFluid) + return net.minecraftforge.fluids.FluidAttributes.builder("lava", + new net.minecraft.util.ResourceLocation("block/lava_still"), + new net.minecraft.util.ResourceLocation("block/lava_flow")) -+ .block(() -> net.minecraft.block.Blocks.field_150353_l) + .vanillaColor().luminosity(15).density(3000).viscosity(6000).temperature(1300).build(); + throw new RuntimeException("Mod fluids must override createAttributes."); + } diff --git a/src/main/java/net/minecraftforge/fluids/DispenseFluidContainer.java b/src/main/java/net/minecraftforge/fluids/DispenseFluidContainer.java index 78845b12b1..1394bdda93 100644 --- a/src/main/java/net/minecraftforge/fluids/DispenseFluidContainer.java +++ b/src/main/java/net/minecraftforge/fluids/DispenseFluidContainer.java @@ -53,7 +53,7 @@ public class DispenseFluidContainer extends DefaultDispenseItemBehavior @Nonnull public ItemStack dispenseStack(@Nonnull IBlockSource source, @Nonnull ItemStack stack) { - if (FluidUtil.getFluidContained(stack) != null) + if (FluidUtil.getFluidContained(stack).isPresent()) { return dumpContainer(source, stack); } diff --git a/src/main/java/net/minecraftforge/fluids/FluidAttributes.java b/src/main/java/net/minecraftforge/fluids/FluidAttributes.java index a8ffe710b0..60f39c5508 100644 --- a/src/main/java/net/minecraftforge/fluids/FluidAttributes.java +++ b/src/main/java/net/minecraftforge/fluids/FluidAttributes.java @@ -131,9 +131,6 @@ public class FluidAttributes */ private final Rarity rarity; - private final Supplier blockSupplier; - private final Supplier bucketSupplier; - /** * Color used by universal bucket and the ModelFluid baked model. * Note that this int includes the alpha so converting this to RGB with alpha would be @@ -151,7 +148,6 @@ public class FluidAttributes this.stillTexture = builder.stillTexture; this.flowingTexture = builder.flowingTexture; this.overlayTexture = builder.overlayTexture; - this.blockSupplier = builder.blockSupplier; this.color = builder.color; this.fillSound = builder.fillSound; this.emptySound = builder.emptySound; @@ -161,7 +157,6 @@ public class FluidAttributes this.density = builder.density; this.isGaseous = builder.isGaseous; this.rarity = builder.rarity; - this.bucketSupplier = builder.bucketSupplier; } public final String getName() @@ -171,12 +166,12 @@ public class FluidAttributes public ItemStack getBucket(FluidStack stack) { - return bucketSupplier != null ? new ItemStack(bucketSupplier.get()) : ItemStack.EMPTY; + return new ItemStack(stack.getFluid().getFilledBucket()); } public BlockState getBlock(IEnviromentBlockReader reader, BlockPos pos, IFluidState state) { - return (blockSupplier != null ? blockSupplier.get() : Blocks.AIR).getDefaultState(); + return state.getBlockState(); } public IFluidState getStateForPlacement(IEnviromentBlockReader reader, BlockPos pos, FluidStack state) @@ -186,12 +181,12 @@ public class FluidAttributes public final boolean canBePlacedInWorld(IEnviromentBlockReader reader, BlockPos pos, IFluidState state) { - return getBlock(reader, pos, state) != null; + return !getBlock(reader, pos, state).isAir(reader, pos); } public final boolean canBePlacedInWorld(IEnviromentBlockReader reader, BlockPos pos, FluidStack state) { - return getBlock(reader, pos, getStateForPlacement(reader, pos, state)) != null; + return !getBlock(reader, pos, getStateForPlacement(reader, pos, state)).isAir(reader, pos); } public final boolean isLighterThanAir() @@ -362,8 +357,6 @@ public class FluidAttributes private String translationKey; private SoundEvent fillSound; private SoundEvent emptySound; - private Supplier blockSupplier; - private Supplier bucketSupplier; private int luminosity = 0; private int density = 1000; private int temperature = 300; @@ -402,18 +395,6 @@ public class FluidAttributes return this; } - public final Builder block(Supplier supplier) - { - blockSupplier = supplier; - return this; - } - - public final Builder bucket(Supplier supplier) - { - bucketSupplier = supplier; - return this; - } - public final Builder luminosity(int luminosity) { this.luminosity = luminosity; diff --git a/src/main/java/net/minecraftforge/fluids/FluidStack.java b/src/main/java/net/minecraftforge/fluids/FluidStack.java index 59758aa476..e6eac704fe 100644 --- a/src/main/java/net/minecraftforge/fluids/FluidStack.java +++ b/src/main/java/net/minecraftforge/fluids/FluidStack.java @@ -69,6 +69,8 @@ public class FluidStack } this.fluidDelegate = fluid.delegate; this.amount = amount; + + updateEmpty(); } public FluidStack(Fluid fluid, int amount, CompoundNBT nbt) @@ -170,7 +172,6 @@ public class FluidStack public void setAmount(int amount) { if (getRawFluid() == Fluids.EMPTY) throw new IllegalStateException("Can't modify the empty stack."); - if (amount < 0) throw new IllegalStateException("The amount can't be negative."); this.amount = amount; updateEmpty(); } @@ -217,8 +218,10 @@ public class FluidStack { getOrCreateTag(); CompoundNBT child = tag.getCompound(childName); - if (child == null) - tag.put(childName, child = new CompoundNBT()); + if (!tag.contains(childName, Constants.NBT.TAG_COMPOUND)) + { + tag.put(childName, child); + } return child; } @@ -302,13 +305,8 @@ public class FluidStack * The ItemStack for comparison * @return true if the Fluids (IDs and NBT Tags) are the same */ - public boolean isFluidEqual(ItemStack other) + public boolean isFluidEqual(@Nonnull ItemStack other) { - if (other == null) - { - return false; - } - return FluidUtil.getFluidContained(other).map(this::isFluidEqual).orElse(false); } diff --git a/src/main/java/net/minecraftforge/fluids/FluidUtil.java b/src/main/java/net/minecraftforge/fluids/FluidUtil.java index 502614c6a0..1dc6d05417 100644 --- a/src/main/java/net/minecraftforge/fluids/FluidUtil.java +++ b/src/main/java/net/minecraftforge/fluids/FluidUtil.java @@ -554,7 +554,7 @@ public class FluidUtil return false; } - if (fluidSource.drain(resource, IFluidHandler.FluidAction.SIMULATE) == null) + if (fluidSource.drain(resource, IFluidHandler.FluidAction.SIMULATE).isEmpty()) { return false; } @@ -574,7 +574,7 @@ public class FluidUtil if (world.dimension.doesWaterVaporize() && fluid.getAttributes().doesVaporize(world, pos, resource)) { FluidStack result = fluidSource.drain(resource, IFluidHandler.FluidAction.EXECUTE); - if (result != null) + if (!result.isEmpty()) { result.getFluid().getAttributes().vaporize(player, world, pos, result); return true; @@ -585,7 +585,7 @@ public class FluidUtil // This fluid handler places the fluid block when filled IFluidHandler handler = getFluidBlockHandler(fluid, world, pos); FluidStack result = tryFluidTransfer(handler, fluidSource, resource, true); - if (result != null) + if (!result.isEmpty()) { SoundEvent soundevent = resource.getFluid().getAttributes().getEmptySound(resource); world.playSound(player, pos, soundevent, SoundCategory.BLOCKS, 1.0F, 1.0F); diff --git a/src/main/java/net/minecraftforge/fluids/capability/templates/EmptyFluidHandler.java b/src/main/java/net/minecraftforge/fluids/capability/templates/EmptyFluidHandler.java index 9fedb65832..122360b6e5 100644 --- a/src/main/java/net/minecraftforge/fluids/capability/templates/EmptyFluidHandler.java +++ b/src/main/java/net/minecraftforge/fluids/capability/templates/EmptyFluidHandler.java @@ -36,7 +36,7 @@ public class EmptyFluidHandler implements IFluidHandler @Nonnull @Override - public FluidStack getFluidInTank(int tank) { return null; } + public FluidStack getFluidInTank(int tank) { return FluidStack.EMPTY; } @Override public int getTankCapacity(int tank) { return 0; } @@ -54,13 +54,13 @@ public class EmptyFluidHandler implements IFluidHandler @Override public FluidStack drain(FluidStack resource, FluidAction action) { - return null; + return FluidStack.EMPTY; } @Nonnull @Override public FluidStack drain(int maxDrain, FluidAction action) { - return null; + return FluidStack.EMPTY; } } diff --git a/src/main/java/net/minecraftforge/fluids/capability/templates/FluidHandlerItemStack.java b/src/main/java/net/minecraftforge/fluids/capability/templates/FluidHandlerItemStack.java index 8661c62e2e..be5f6be81d 100644 --- a/src/main/java/net/minecraftforge/fluids/capability/templates/FluidHandlerItemStack.java +++ b/src/main/java/net/minecraftforge/fluids/capability/templates/FluidHandlerItemStack.java @@ -119,7 +119,7 @@ public class FluidHandlerItemStack implements IFluidHandlerItem, ICapabilityProv @Override public int fill(FluidStack resource, FluidAction doFill) { - if (container.getCount() != 1 || resource == null || resource.getAmount() <= 0 || !canFillFluidType(resource)) + if (container.getCount() != 1 || resource.isEmpty() || !canFillFluidType(resource)) { return 0; } @@ -190,7 +190,7 @@ public class FluidHandlerItemStack implements IFluidHandlerItem, ICapabilityProv if (action.execute()) { contained.shrink(drainAmount); - if (contained.getAmount() == 0) + if (contained.isEmpty()) { setContainerToEmpty(); } diff --git a/src/main/java/net/minecraftforge/fluids/capability/templates/FluidHandlerItemStackSimple.java b/src/main/java/net/minecraftforge/fluids/capability/templates/FluidHandlerItemStackSimple.java index fad6b94398..05a78d9613 100644 --- a/src/main/java/net/minecraftforge/fluids/capability/templates/FluidHandlerItemStackSimple.java +++ b/src/main/java/net/minecraftforge/fluids/capability/templates/FluidHandlerItemStackSimple.java @@ -143,7 +143,7 @@ public class FluidHandlerItemStackSimple implements IFluidHandlerItem, ICapabili @Override public FluidStack drain(FluidStack resource, FluidAction action) { - if (container.getCount() != 1 || resource == null || resource.getAmount() <= 0 || !resource.isFluidEqual(getFluid())) + if (container.getCount() != 1 || resource.isEmpty() || !resource.isFluidEqual(getFluid())) { return FluidStack.EMPTY; } diff --git a/src/main/java/net/minecraftforge/fluids/capability/templates/FluidTank.java b/src/main/java/net/minecraftforge/fluids/capability/templates/FluidTank.java index 3ff7acc1e1..56405abf01 100644 --- a/src/main/java/net/minecraftforge/fluids/capability/templates/FluidTank.java +++ b/src/main/java/net/minecraftforge/fluids/capability/templates/FluidTank.java @@ -89,25 +89,15 @@ public class FluidTank implements IFluidHandler, IFluidTank { public FluidTank readFromNBT(CompoundNBT nbt) { - FluidStack fluid = FluidStack.EMPTY; - if (!nbt.contains("Empty")) - { - fluid = FluidStack.loadFluidStackFromNBT(nbt); - } + FluidStack fluid = FluidStack.loadFluidStackFromNBT(nbt); setFluid(fluid); return this; } public CompoundNBT writeToNBT(CompoundNBT nbt) { - if (fluid != null) - { - fluid.writeToNBT(nbt); - } - else - { - nbt.putString("Empty", ""); - } + fluid.writeToNBT(nbt); + return nbt; } @@ -139,13 +129,13 @@ public class FluidTank implements IFluidHandler, IFluidTank { @Override public int fill(FluidStack resource, FluidAction action) { - if (resource == null || !isFluidValid(resource)) + if (resource.isEmpty() || !isFluidValid(resource)) { return 0; } if (action.simulate()) { - if (fluid == null) + if (fluid.isEmpty()) { return Math.min(capacity, resource.getAmount()); } @@ -155,7 +145,7 @@ public class FluidTank implements IFluidHandler, IFluidTank { } return Math.min(capacity - fluid.getAmount(), resource.getAmount()); } - if (fluid == null) + if (fluid.isEmpty()) { onContentsChanged(); fluid = new FluidStack(resource, Math.min(capacity, resource.getAmount())); @@ -183,7 +173,7 @@ public class FluidTank implements IFluidHandler, IFluidTank { @Override public FluidStack drain(FluidStack resource, FluidAction action) { - if (resource == null || !resource.isFluidEqual(fluid)) + if (resource.isEmpty() || !resource.isFluidEqual(fluid)) { return FluidStack.EMPTY; } @@ -203,10 +193,6 @@ public class FluidTank implements IFluidHandler, IFluidTank { if (action.execute()) { fluid.shrink(drained); - if (fluid.getAmount() <= 0) - { - fluid = FluidStack.EMPTY; - } } return stack; } diff --git a/src/main/java/net/minecraftforge/fluids/capability/templates/VoidFluidHandler.java b/src/main/java/net/minecraftforge/fluids/capability/templates/VoidFluidHandler.java index 117f584996..fd81490c6a 100644 --- a/src/main/java/net/minecraftforge/fluids/capability/templates/VoidFluidHandler.java +++ b/src/main/java/net/minecraftforge/fluids/capability/templates/VoidFluidHandler.java @@ -40,7 +40,7 @@ public class VoidFluidHandler implements IFluidHandler @Nonnull @Override - public FluidStack getFluidInTank(int tank) { return null; } + public FluidStack getFluidInTank(int tank) { return FluidStack.EMPTY; } @Override public int getTankCapacity(int tank) { return Integer.MAX_VALUE; } @@ -58,13 +58,13 @@ public class VoidFluidHandler implements IFluidHandler @Override public FluidStack drain(FluidStack resource, FluidAction action) { - return null; + return FluidStack.EMPTY; } @Nonnull @Override public FluidStack drain(int maxDrain, FluidAction action) { - return null; + return FluidStack.EMPTY; } } diff --git a/src/main/java/net/minecraftforge/fluids/capability/wrappers/FluidBucketWrapper.java b/src/main/java/net/minecraftforge/fluids/capability/wrappers/FluidBucketWrapper.java index b1452c865e..51404952c0 100644 --- a/src/main/java/net/minecraftforge/fluids/capability/wrappers/FluidBucketWrapper.java +++ b/src/main/java/net/minecraftforge/fluids/capability/wrappers/FluidBucketWrapper.java @@ -77,13 +77,13 @@ public class FluidBucketWrapper implements IFluidHandlerItem, ICapabilityProvide } else { - return null; + return FluidStack.EMPTY; } } protected void setFluid(@Nonnull FluidStack fluidStack) { - if (fluidStack.getAmount() <= 0) + if (fluidStack.isEmpty()) container = new ItemStack(Items.BUCKET); else container = FluidUtil.getFilledBucket(fluidStack); @@ -117,7 +117,7 @@ public class FluidBucketWrapper implements IFluidHandlerItem, ICapabilityProvide @Override public int fill(FluidStack resource, FluidAction action) { - if (container.getCount() != 1 || resource == null || resource.getAmount() < FluidAttributes.BUCKET_VOLUME || container.getItem() instanceof MilkBucketItem || getFluid() != null || !canFillFluidType(resource)) + if (container.getCount() != 1 || resource.getAmount() < FluidAttributes.BUCKET_VOLUME || container.getItem() instanceof MilkBucketItem || !getFluid().isEmpty() || !canFillFluidType(resource)) { return 0; } @@ -134,13 +134,13 @@ public class FluidBucketWrapper implements IFluidHandlerItem, ICapabilityProvide @Override public FluidStack drain(FluidStack resource, FluidAction action) { - if (container.getCount() != 1 || resource == null || resource.getAmount() < FluidAttributes.BUCKET_VOLUME) + if (container.getCount() != 1 || resource.getAmount() < FluidAttributes.BUCKET_VOLUME) { return FluidStack.EMPTY; } FluidStack fluidStack = getFluid(); - if (fluidStack != null && fluidStack.isFluidEqual(resource)) + if (!fluidStack.isEmpty() && fluidStack.isFluidEqual(resource)) { if (action.execute()) { @@ -162,7 +162,7 @@ public class FluidBucketWrapper implements IFluidHandlerItem, ICapabilityProvide } FluidStack fluidStack = getFluid(); - if (fluidStack != null) + if (!fluidStack.isEmpty()) { if (action.execute()) { diff --git a/src/test/java/net/minecraftforge/debug/fluid/NewFluidTest.java b/src/test/java/net/minecraftforge/debug/fluid/NewFluidTest.java index daf66e377e..b1535d422a 100644 --- a/src/test/java/net/minecraftforge/debug/fluid/NewFluidTest.java +++ b/src/test/java/net/minecraftforge/debug/fluid/NewFluidTest.java @@ -29,10 +29,7 @@ import net.minecraft.fluid.Fluid; import net.minecraft.fluid.Fluids; import net.minecraft.fluid.IFluidState; import net.minecraft.inventory.container.ContainerType; -import net.minecraft.item.BucketItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.Items; +import net.minecraft.item.*; import net.minecraft.state.StateContainer; import net.minecraft.tags.FluidTags; import net.minecraft.tileentity.TileEntity; @@ -47,10 +44,13 @@ import net.minecraft.world.IWorldReader; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fluids.FluidAttributes; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.ObjectHolder; +import org.apache.commons.lang3.Validate; @Mod("new_fluid_test") public class NewFluidTest @@ -77,6 +77,7 @@ public class NewFluidTest modEventBus.addGenericListener(Block.class, this::registerBlocks); modEventBus.addGenericListener(Item.class, this::registerItems); modEventBus.addGenericListener(Fluid.class, this::registerFluids); + modEventBus.addListener(this::loadComplete); } public void registerBlocks(RegistryEvent.Register event) @@ -103,6 +104,16 @@ public class NewFluidTest event.getRegistry().registerAll(test_fluid, test_fluid_flowing); } + public void loadComplete(FMLLoadCompleteEvent event) + { + // some sanity checks + BlockState state = Fluids.WATER.getDefaultState().getBlockState(); + BlockState state2 = Fluids.WATER.getAttributes().getBlock(null,null,Fluids.WATER.getDefaultState()); + Validate.isTrue(state.getBlock() == Blocks.WATER && state2 == state); + ItemStack stack = Fluids.WATER.getAttributes().getBucket(new FluidStack(Fluids.WATER, 1)); + Validate.isTrue(stack.getItem() == Fluids.WATER.getFilledBucket()); + } + private static final FluidAttributes ATTRIBUTES = FluidAttributes.builder("test_fluid", FLUID_STILL, FLUID_FLOWING).build(); private static abstract class MyFlowingFluid extends FlowingFluid @@ -187,7 +198,7 @@ public class NewFluidTest } @Override - public FluidAttributes createAttributes(Fluid fluid) + protected FluidAttributes createAttributes(Fluid fluid) { return ATTRIBUTES; }