diff --git a/src/main/java/com/forsteri/createliquidfuel/core/BurnerStomachHandler.java b/src/main/java/com/forsteri/createliquidfuel/core/BurnerStomachHandler.java index 42f3b20..4894943 100644 --- a/src/main/java/com/forsteri/createliquidfuel/core/BurnerStomachHandler.java +++ b/src/main/java/com/forsteri/createliquidfuel/core/BurnerStomachHandler.java @@ -22,23 +22,23 @@ public class BurnerStomachHandler { public static Map>> LIQUID_BURNER_FUEL_MAP = new HashMap<>(); - public static void tick(SmartBlockEntity entity) { - if (!(entity instanceof BlazeBurnerAccessor burnerAccessor)) return; + public static boolean tick(SmartBlockEntity entity) { + if (!(entity instanceof BlazeBurnerAccessor burnerAccessor)) return false; @SuppressWarnings("DataFlowIssue") SmartFluidTank stomach = (SmartFluidTank) entity.getCapability(ForgeCapabilities.FLUID_HANDLER).orElse(null); //noinspection ConstantValue if (stomach == null) - return; + return false; - if (stomach.getFluid().getAmount() <= 0) return; + if (stomach.getFluid().getAmount() <= 0) return false; Triplet burnerProperty = LIQUID_BURNER_FUEL_MAP.get( stomach.getFluid().getFluid()).getSecond(); if (burnerProperty == null) - return; + return false; boolean fluidSuperHeats = burnerProperty.getSecond(); @@ -46,7 +46,7 @@ public static void tick(SmartBlockEntity entity) { if (stomach.getFluid().getAmount() < mbConsuming) { stomach.getFluid().setAmount(0); - return; + return false; } if (fluidSuperHeats) @@ -57,12 +57,12 @@ public static void tick(SmartBlockEntity entity) { int newBurnTime = burnerAccessor.createliquidfuel$getRemainingBurnTime() + burnerProperty.getFirst(); if (newBurnTime > BlazeBurnerBlockEntity.MAX_HEAT_CAPACITY) - return; + return false; burnerAccessor.createliquidfuel$setRemainingBurnTime(newBurnTime); stomach.getFluid().shrink(mbConsuming); - + return true; } public static void tryUpdateFuel(@NotNull SmartBlockEntity entity, ItemStack itemStack, boolean forceOverflow, boolean simulate, CallbackInfoReturnable cir) { @@ -85,15 +85,15 @@ public static void tryUpdateFuel(@NotNull SmartBlockEntity entity, ItemStack ite if (!BurnerStomachHandler.LIQUID_BURNER_FUEL_MAP.containsKey(fluidStack.getFluid())) return; + if (stomach.getFluid().getAmount() + fluidStack.getAmount() > stomach.getCapacity()) { if (!forceOverflow) return; } if (!simulate) { - if (stomach.getFluid().isEmpty()) - stomach.setFluid(fluidStack.copy()); - else - stomach.getFluid().grow(fluidStack.getAmount()); + int amount = fluidStack.getAmount(); + FluidStack drained = handler.drain(amount, IFluidHandler.FluidAction.EXECUTE); + stomach.fill(drained, IFluidHandler.FluidAction.EXECUTE); } cir.setReturnValue(true); diff --git a/src/main/java/com/forsteri/createliquidfuel/mixin/MixinBlazeBurnerBlock.java b/src/main/java/com/forsteri/createliquidfuel/mixin/MixinBlazeBurnerBlock.java new file mode 100644 index 0000000..0af86e5 --- /dev/null +++ b/src/main/java/com/forsteri/createliquidfuel/mixin/MixinBlazeBurnerBlock.java @@ -0,0 +1,24 @@ +package com.forsteri.createliquidfuel.mixin; + +import com.simibubi.create.content.processing.burner.BlazeBurnerBlock; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.fluids.capability.IFluidHandler; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(BlazeBurnerBlock.class) +public class MixinBlazeBurnerBlock { + @Redirect(method = "tryInsert", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;shrink(I)V")) + private static void tryInsert(ItemStack instance, int p_41775_) { + var handler = instance.getCapability(ForgeCapabilities.FLUID_HANDLER_ITEM); + if (!handler.isPresent()) { + instance.shrink(p_41775_); + } + else if (ForgeHooks.getBurnTime(instance, null) != 0) { + instance.shrink(p_41775_); + } + } +} diff --git a/src/main/java/com/forsteri/createliquidfuel/mixin/MixinBlazeBurnerTileEntity.java b/src/main/java/com/forsteri/createliquidfuel/mixin/MixinBlazeBurnerTileEntity.java index 86ffc1a..303aa9f 100644 --- a/src/main/java/com/forsteri/createliquidfuel/mixin/MixinBlazeBurnerTileEntity.java +++ b/src/main/java/com/forsteri/createliquidfuel/mixin/MixinBlazeBurnerTileEntity.java @@ -52,9 +52,9 @@ public boolean isFluidValid(@NotNull FluidStack stack) { }; } - @Inject(method = "tick", at = @At("TAIL")) + @Inject(method = "tick", at = @At(value = "INVOKE", target = "Lcom/simibubi/create/content/processing/burner/BlazeBurnerBlockEntity;updateBlockState()V", ordinal = 1), cancellable = true) public void tick(CallbackInfo info) { - BurnerStomachHandler.tick(this); + if (BurnerStomachHandler.tick(this)) info.cancel(); } @Inject(method = "read", at = @At("TAIL")) diff --git a/src/main/resources/createliquidfuel.mixins.json b/src/main/resources/createliquidfuel.mixins.json index 5426e6b..5f2b785 100644 --- a/src/main/resources/createliquidfuel.mixins.json +++ b/src/main/resources/createliquidfuel.mixins.json @@ -6,6 +6,7 @@ "refmap": "CreateLiquidFuel.refmap.json", "mixins": [ "BlazeBurnerAccessor", + "MixinBlazeBurnerBlock", "MixinBlazeBurnerTileEntity" ], "client": [