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.
This commit is contained in:
parent
ca980a56bc
commit
b294f4d894
5 changed files with 34 additions and 36 deletions
|
@ -59,7 +59,7 @@
|
||||||
this.func_180688_d(p_204515_1_, p_204515_2_);
|
this.func_180688_d(p_204515_1_, p_204515_2_);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -160,4 +176,22 @@
|
@@ -160,4 +176,27 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -70,15 +70,20 @@
|
||||||
+ return (FlowingFluid)supplier.get();
|
+ return (FlowingFluid)supplier.get();
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ private boolean fluidStateCacheInitialized;
|
+ private boolean fluidStateCacheInitialized = false;
|
||||||
+ protected void initFluidStateCache() {
|
+ protected synchronized void initFluidStateCache() {
|
||||||
|
+ if (fluidStateCacheInitialized == false)
|
||||||
|
+ {
|
||||||
+ this.field_212565_c.add(getFluid().func_207204_a(false));
|
+ this.field_212565_c.add(getFluid().func_207204_a(false));
|
||||||
+
|
+
|
||||||
+ for(int i = 1; i < 8; ++i) {
|
+ 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 - i, false));
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ this.field_212565_c.add(getFluid().func_207207_a(8, true));
|
+ this.field_212565_c.add(getFluid().func_207207_a(8, true));
|
||||||
|
+
|
||||||
+ fluidStateCacheInitialized = true;
|
+ fluidStateCacheInitialized = true;
|
||||||
|
+ }
|
||||||
+ }
|
+ }
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,7 +150,7 @@ public final class ItemTextureQuadConverter
|
||||||
for (int y = 0; y < h; y++)
|
for (int y = 0; y < h; y++)
|
||||||
{
|
{
|
||||||
// current pixel
|
// current pixel
|
||||||
boolean isVisible = !sprite.isPixelTransparent(0, x, y);
|
boolean isVisible = !template.isPixelTransparent(0, x, y);
|
||||||
|
|
||||||
// no current quad but found a new one
|
// no current quad but found a new one
|
||||||
if (start < 0 && isVisible)
|
if (start < 0 && isVisible)
|
||||||
|
@ -168,7 +168,7 @@ public final class ItemTextureQuadConverter
|
||||||
{
|
{
|
||||||
for (int i = 0; i < h; i++)
|
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;
|
sameColumn = false;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -178,31 +178,20 @@ public class FluidUtil
|
||||||
ItemStack containerCopy = ItemHandlerHelper.copyStackWithSize(container, 1); // do not modify the input
|
ItemStack containerCopy = ItemHandlerHelper.copyStackWithSize(container, 1); // do not modify the input
|
||||||
return getFluidHandler(containerCopy)
|
return getFluidHandler(containerCopy)
|
||||||
.map(containerFluidHandler -> {
|
.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);
|
FluidStack transfer = tryFluidTransfer(fluidDestination, containerFluidHandler, maxAmount, true);
|
||||||
if (!transfer.isEmpty())
|
if (transfer.isEmpty())
|
||||||
{
|
return FluidActionResult.FAILURE;
|
||||||
if (player != null)
|
|
||||||
|
if (doDrain && player != null)
|
||||||
{
|
{
|
||||||
SoundEvent soundevent = transfer.getFluid().getAttributes().getEmptySound(transfer);
|
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);
|
player.world.playSound(null, player.posX, player.posY + 0.5, player.posZ, soundevent, SoundCategory.BLOCKS, 1.0F, 1.0F);
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemStack resultContainer = containerFluidHandler.getContainer();
|
ItemStack resultContainer = containerFluidHandler.getContainer();
|
||||||
return new FluidActionResult(resultContainer);
|
return new FluidActionResult(resultContainer);
|
||||||
}
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
})
|
})
|
||||||
.orElse(FluidActionResult.FAILURE);
|
.orElse(FluidActionResult.FAILURE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@ public class EmptyFluidHandler implements IFluidHandler
|
||||||
@Override
|
@Override
|
||||||
public int fill(FluidStack resource, FluidAction action)
|
public int fill(FluidStack resource, FluidAction action)
|
||||||
{
|
{
|
||||||
return resource.getAmount();
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
|
|
|
@ -147,8 +147,8 @@ public class FluidTank implements IFluidHandler, IFluidTank {
|
||||||
}
|
}
|
||||||
if (fluid.isEmpty())
|
if (fluid.isEmpty())
|
||||||
{
|
{
|
||||||
onContentsChanged();
|
|
||||||
fluid = new FluidStack(resource, Math.min(capacity, resource.getAmount()));
|
fluid = new FluidStack(resource, Math.min(capacity, resource.getAmount()));
|
||||||
|
onContentsChanged();
|
||||||
return fluid.getAmount();
|
return fluid.getAmount();
|
||||||
}
|
}
|
||||||
if (!fluid.isFluidEqual(resource))
|
if (!fluid.isFluidEqual(resource))
|
||||||
|
@ -166,6 +166,8 @@ public class FluidTank implements IFluidHandler, IFluidTank {
|
||||||
{
|
{
|
||||||
fluid.setAmount(capacity);
|
fluid.setAmount(capacity);
|
||||||
}
|
}
|
||||||
|
if (filled > 0)
|
||||||
|
onContentsChanged();
|
||||||
return filled;
|
return filled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -194,6 +196,8 @@ public class FluidTank implements IFluidHandler, IFluidTank {
|
||||||
{
|
{
|
||||||
fluid.shrink(drained);
|
fluid.shrink(drained);
|
||||||
}
|
}
|
||||||
|
if (drained > 0)
|
||||||
|
onContentsChanged();
|
||||||
return stack;
|
return stack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue