diff --git a/src/main/java/thedarkcolour/exdeorum/blockentity/BarrelBlockEntity.java b/src/main/java/thedarkcolour/exdeorum/blockentity/BarrelBlockEntity.java
index ba8e64b4..c156ff6e 100644
--- a/src/main/java/thedarkcolour/exdeorum/blockentity/BarrelBlockEntity.java
+++ b/src/main/java/thedarkcolour/exdeorum/blockentity/BarrelBlockEntity.java
@@ -420,26 +420,28 @@ public class BarrelBlockEntity extends EBlockEntity {
*
When the fluid in the barrel changes (see {@link FluidHandler#onContentsChanged()})
*/
public void tryInWorldFluidMixing() {
- if (!this.tank.isEmpty() && this.item.getStackInSlot(0).isEmpty()) {
- var abovePos = this.worldPosition.above();
- var aboveBlockState = this.level.getBlockState(abovePos);
- var aboveFluidState = aboveBlockState.getFluidState();
- var aboveFluid = aboveFluidState.getType();
+ if (!this.level.isClientSide) {
+ if (!this.tank.isEmpty() && this.item.getStackInSlot(0).isEmpty()) {
+ var abovePos = this.worldPosition.above();
+ var aboveBlockState = this.level.getBlockState(abovePos);
+ var aboveFluidState = aboveBlockState.getFluidState();
+ var aboveFluid = aboveFluidState.getType();
- if (aboveFluid != Fluids.EMPTY) {
- BarrelFluidMixingRecipe recipe = RecipeUtil.getFluidMixingRecipe(this.tank.getFluid(), aboveFluid instanceof FlowingFluid flowing ? flowing.getSource() : aboveFluid);
+ if (aboveFluid != Fluids.EMPTY) {
+ BarrelFluidMixingRecipe recipe = RecipeUtil.getFluidMixingRecipe(this.tank.getFluid(), aboveFluid instanceof FlowingFluid flowing ? flowing.getSource() : aboveFluid);
- if (recipe != null) {
- // If additive is not consumed, just craft
- // If additive is consumed, check that the additive can be consumed before crafting
- if (!recipe.consumesAdditive) {
- this.tank.drain(recipe.baseFluidAmount, IFluidHandler.FluidAction.EXECUTE);
- setItem(new ItemStack(recipe.result));
- } else if (aboveBlockState.getBlock() instanceof BucketPickup pickup) {
- // If something was picked up, we can craft
- if (!pickup.pickupBlock(this.level, abovePos, aboveBlockState).isEmpty()) {
+ if (recipe != null) {
+ // If additive is not consumed, just craft
+ // If additive is consumed, check that the additive can be consumed before crafting
+ if (!recipe.consumesAdditive) {
this.tank.drain(recipe.baseFluidAmount, IFluidHandler.FluidAction.EXECUTE);
setItem(new ItemStack(recipe.result));
+ } else if (aboveBlockState.getBlock() instanceof BucketPickup pickup) {
+ // If something was picked up, we can craft
+ if (!pickup.pickupBlock(this.level, abovePos, aboveBlockState).isEmpty()) {
+ this.tank.drain(recipe.baseFluidAmount, IFluidHandler.FluidAction.EXECUTE);
+ setItem(new ItemStack(recipe.result));
+ }
}
}
}
@@ -619,5 +621,44 @@ public class BarrelBlockEntity extends EBlockEntity {
BarrelBlockEntity.this.markUpdated();
}
}
+
+ @Override
+ public int fill(FluidStack resource, FluidAction action) {
+ if (resource.isEmpty() || !isFluidValid(resource)) {
+ return 0;
+ }
+ if (action.simulate()) {
+ if (this.fluid.isEmpty()) {
+ return Math.min(this.capacity, resource.getAmount());
+ }
+ if (!this.fluid.isFluidEqual(resource)) {
+ return 0;
+ }
+ return Math.min(this.capacity - this.fluid.getAmount(), resource.getAmount());
+ }
+ if (this.fluid.isEmpty()) {
+ // fix forge's implementation to avoid dupes
+ int amount = Math.min(this.capacity, resource.getAmount());
+ this.fluid = new FluidStack(resource, Math.min(this.capacity, amount));
+ onContentsChanged();
+ return amount;
+ }
+ if (!this.fluid.isFluidEqual(resource))
+ {
+ return 0;
+ }
+ int filled = this.capacity - this.fluid.getAmount();
+
+ if (resource.getAmount() < filled) {
+ this.fluid.grow(resource.getAmount());
+ filled = resource.getAmount();
+ } else {
+ this.fluid.setAmount(this.capacity);
+ }
+ if (filled > 0) {
+ onContentsChanged();
+ }
+ return filled;
+ }
}
}