From b294f4d8944d342611e95616152b128e5a03d6b5 Mon Sep 17 00:00:00 2001 From: David Quintana Date: Sat, 5 Oct 2019 19:49:26 +0200 Subject: [PATCH] New round of fluid system fixes: (#6175) - Fix race condition lazy-initializing flowing fluid block data. - Fix typo in ItemTextureQuadConverter that prevents certain animated textures from being used in the fluid bucket. - Fix calls to onContentsChanged in FluidTank. - Fix FluidUtil.tryEmptyContainer logic when simulating. - Fix EmptyFluidHandler.fill returning the wrong number. --- .../block/FlowingFluidBlock.java.patch | 23 +++++++----- .../model/ItemTextureQuadConverter.java | 4 +-- .../net/minecraftforge/fluids/FluidUtil.java | 35 +++++++------------ .../templates/EmptyFluidHandler.java | 2 +- .../capability/templates/FluidTank.java | 6 +++- 5 files changed, 34 insertions(+), 36 deletions(-) diff --git a/patches/minecraft/net/minecraft/block/FlowingFluidBlock.java.patch b/patches/minecraft/net/minecraft/block/FlowingFluidBlock.java.patch index 931283c01..20b6fc3b6 100644 --- a/patches/minecraft/net/minecraft/block/FlowingFluidBlock.java.patch +++ b/patches/minecraft/net/minecraft/block/FlowingFluidBlock.java.patch @@ -59,7 +59,7 @@ this.func_180688_d(p_204515_1_, p_204515_2_); return false; } -@@ -160,4 +176,22 @@ +@@ -160,4 +176,27 @@ } } @@ -70,15 +70,20 @@ + return (FlowingFluid)supplier.get(); + } + -+ private boolean fluidStateCacheInitialized; -+ protected void initFluidStateCache() { -+ this.field_212565_c.add(getFluid().func_207204_a(false)); ++ private boolean fluidStateCacheInitialized = false; ++ protected synchronized void initFluidStateCache() { ++ if (fluidStateCacheInitialized == false) ++ { ++ this.field_212565_c.add(getFluid().func_207204_a(false)); + -+ for(int i = 1; i < 8; ++i) { -+ this.field_212565_c.add(getFluid().func_207207_a(8 - i, false)); ++ for (int i = 1; i < 8; ++i) ++ { ++ this.field_212565_c.add(getFluid().func_207207_a(8 - i, false)); ++ } ++ ++ this.field_212565_c.add(getFluid().func_207207_a(8, true)); ++ ++ fluidStateCacheInitialized = true; + } -+ -+ this.field_212565_c.add(getFluid().func_207207_a(8, true)); -+ fluidStateCacheInitialized = true; + } } diff --git a/src/main/java/net/minecraftforge/client/model/ItemTextureQuadConverter.java b/src/main/java/net/minecraftforge/client/model/ItemTextureQuadConverter.java index 1658cab20..cc95a4bdf 100644 --- a/src/main/java/net/minecraftforge/client/model/ItemTextureQuadConverter.java +++ b/src/main/java/net/minecraftforge/client/model/ItemTextureQuadConverter.java @@ -150,7 +150,7 @@ public final class ItemTextureQuadConverter for (int y = 0; y < h; y++) { // current pixel - boolean isVisible = !sprite.isPixelTransparent(0, x, y); + boolean isVisible = !template.isPixelTransparent(0, x, y); // no current quad but found a new one if (start < 0 && isVisible) @@ -168,7 +168,7 @@ public final class ItemTextureQuadConverter { for (int i = 0; i < h; i++) { - if (sprite.isPixelTransparent(0, x, i) != sprite.isPixelTransparent(0, endX, i)) + if (template.isPixelTransparent(0, x, i) != template.isPixelTransparent(0, endX, i)) { sameColumn = false; break; diff --git a/src/main/java/net/minecraftforge/fluids/FluidUtil.java b/src/main/java/net/minecraftforge/fluids/FluidUtil.java index 1dc6d0541..6fb01f182 100644 --- a/src/main/java/net/minecraftforge/fluids/FluidUtil.java +++ b/src/main/java/net/minecraftforge/fluids/FluidUtil.java @@ -178,31 +178,20 @@ public class FluidUtil ItemStack containerCopy = ItemHandlerHelper.copyStackWithSize(container, 1); // do not modify the input return getFluidHandler(containerCopy) .map(containerFluidHandler -> { - if (doDrain) + + // We are acting on a COPY of the stack, so performing changes is acceptable even if we are simulating. + FluidStack transfer = tryFluidTransfer(fluidDestination, containerFluidHandler, maxAmount, true); + if (transfer.isEmpty()) + return FluidActionResult.FAILURE; + + if (doDrain && player != null) { - FluidStack transfer = tryFluidTransfer(fluidDestination, containerFluidHandler, maxAmount, true); - if (!transfer.isEmpty()) - { - if (player != null) - { - SoundEvent soundevent = transfer.getFluid().getAttributes().getEmptySound(transfer); - player.world.playSound(null, player.posX, player.posY + 0.5, player.posZ, soundevent, SoundCategory.BLOCKS, 1.0F, 1.0F); - } - ItemStack resultContainer = containerFluidHandler.getContainer(); - return new FluidActionResult(resultContainer); - } + SoundEvent soundevent = transfer.getFluid().getAttributes().getEmptySound(transfer); + player.world.playSound(null, player.posX, player.posY + 0.5, player.posZ, soundevent, SoundCategory.BLOCKS, 1.0F, 1.0F); } - else - { - FluidStack simulatedTransfer = tryFluidTransfer(fluidDestination, containerFluidHandler, maxAmount, false); - if (!simulatedTransfer.isEmpty()) - { - containerFluidHandler.drain(simulatedTransfer, IFluidHandler.FluidAction.SIMULATE); - ItemStack resultContainer = containerFluidHandler.getContainer(); - return new FluidActionResult(resultContainer); - } - } - return FluidActionResult.FAILURE; + + ItemStack resultContainer = containerFluidHandler.getContainer(); + return new FluidActionResult(resultContainer); }) .orElse(FluidActionResult.FAILURE); } 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 122360b6e..6dabc93db 100644 --- a/src/main/java/net/minecraftforge/fluids/capability/templates/EmptyFluidHandler.java +++ b/src/main/java/net/minecraftforge/fluids/capability/templates/EmptyFluidHandler.java @@ -47,7 +47,7 @@ public class EmptyFluidHandler implements IFluidHandler @Override public int fill(FluidStack resource, FluidAction action) { - return resource.getAmount(); + return 0; } @Nonnull 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 377a4f9da..5c34f02b3 100644 --- a/src/main/java/net/minecraftforge/fluids/capability/templates/FluidTank.java +++ b/src/main/java/net/minecraftforge/fluids/capability/templates/FluidTank.java @@ -147,8 +147,8 @@ public class FluidTank implements IFluidHandler, IFluidTank { } if (fluid.isEmpty()) { - onContentsChanged(); fluid = new FluidStack(resource, Math.min(capacity, resource.getAmount())); + onContentsChanged(); return fluid.getAmount(); } if (!fluid.isFluidEqual(resource)) @@ -166,6 +166,8 @@ public class FluidTank implements IFluidHandler, IFluidTank { { fluid.setAmount(capacity); } + if (filled > 0) + onContentsChanged(); return filled; } @@ -194,6 +196,8 @@ public class FluidTank implements IFluidHandler, IFluidTank { { fluid.shrink(drained); } + if (drained > 0) + onContentsChanged(); return stack; }