From 13881da2dcff2971262dd2c535aa35d90e254036 Mon Sep 17 00:00:00 2001 From: Julia Date: Sat, 28 Jun 2025 14:42:24 -0700 Subject: [PATCH 1/2] Fix fuel tanks and fuel storage interface --- .../railways/mixin/MixinContraption.java | 5 ++- .../psi/PortableFuelInterfaceBlockEntity.java | 4 +- .../fuel/tank/FuelTankMovementBehavior.java | 41 +++++++++++++++++++ .../registry/fabric/CRBlocksImpl.java | 7 ++-- .../psi/PortableFuelInterfaceBlockEntity.java | 6 ++- .../fuel/tank/FuelTankMovementBehavior.java | 41 +++++++++++++++++++ .../railways/registry/forge/CRBlocksImpl.java | 3 ++ 7 files changed, 99 insertions(+), 8 deletions(-) create mode 100644 fabric/src/main/java/com/railwayteam/railways/content/fuel/tank/FuelTankMovementBehavior.java create mode 100644 forge/src/main/java/com/railwayteam/railways/content/fuel/tank/FuelTankMovementBehavior.java diff --git a/common/src/main/java/com/railwayteam/railways/mixin/MixinContraption.java b/common/src/main/java/com/railwayteam/railways/mixin/MixinContraption.java index dcdee60bb..410ce32b2 100644 --- a/common/src/main/java/com/railwayteam/railways/mixin/MixinContraption.java +++ b/common/src/main/java/com/railwayteam/railways/mixin/MixinContraption.java @@ -38,7 +38,8 @@ @Mixin(Contraption.class) public abstract class MixinContraption implements IContraptionFuel { - @Shadow(remap = false) protected MountedStorageManager storage; + + @Shadow public abstract MountedStorageManager getStorage(); @Inject(method = "removeBlocksFromWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;removeBlockEntity(Lnet/minecraft/core/BlockPos;)V")) private void applyPreTransformCallback(Level world, BlockPos offset, CallbackInfo ci, @Local(name="add") BlockPos add) { @@ -56,6 +57,6 @@ private void applyPreTransformCallback(Level world, BlockPos offset, CallbackInf @Override public MountedFluidStorageWrapper railways$getFluidFuels() { - return ((IFuelInventory) storage).railways$getFluidFuels(); + return ((IFuelInventory) getStorage()).railways$getFluidFuels(); } } diff --git a/fabric/src/main/java/com/railwayteam/railways/content/fuel/psi/PortableFuelInterfaceBlockEntity.java b/fabric/src/main/java/com/railwayteam/railways/content/fuel/psi/PortableFuelInterfaceBlockEntity.java index 83f11bc9f..1f75002a1 100644 --- a/fabric/src/main/java/com/railwayteam/railways/content/fuel/psi/PortableFuelInterfaceBlockEntity.java +++ b/fabric/src/main/java/com/railwayteam/railways/content/fuel/psi/PortableFuelInterfaceBlockEntity.java @@ -19,6 +19,7 @@ package com.railwayteam.railways.content.fuel.psi; import com.railwayteam.railways.mixin_interfaces.IContraptionFuel; +import com.simibubi.create.api.contraption.storage.fluid.MountedFluidStorageWrapper; import com.simibubi.create.content.contraptions.Contraption; import com.simibubi.create.content.contraptions.actors.psi.PortableStorageInterfaceBlockEntity; import com.simibubi.create.foundation.utility.fabric.ListeningStorageView; @@ -49,7 +50,8 @@ public PortableFuelInterfaceBlockEntity(BlockEntityType type, BlockPos pos, B @Override public void startTransferringTo(Contraption contraption, float distance) { - capability.setWrapped(((IContraptionFuel) contraption).railways$getFluidFuels()); + MountedFluidStorageWrapper fuels = ((IContraptionFuel) contraption).railways$getFluidFuels(); + capability.setWrapped(fuels != null ? fuels : Storage.empty()); super.startTransferringTo(contraption, distance); } diff --git a/fabric/src/main/java/com/railwayteam/railways/content/fuel/tank/FuelTankMovementBehavior.java b/fabric/src/main/java/com/railwayteam/railways/content/fuel/tank/FuelTankMovementBehavior.java new file mode 100644 index 000000000..809cbe9a0 --- /dev/null +++ b/fabric/src/main/java/com/railwayteam/railways/content/fuel/tank/FuelTankMovementBehavior.java @@ -0,0 +1,41 @@ +/* + * Steam 'n' Rails + * Copyright (c) 2025 The Railways Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.railwayteam.railways.content.fuel.tank; + +import com.simibubi.create.api.behaviour.movement.MovementBehaviour; +import com.simibubi.create.content.contraptions.behaviour.MovementContext; +import net.minecraft.world.level.block.entity.BlockEntity; + +public class FuelTankMovementBehavior implements MovementBehaviour { + @Override + public boolean mustTickWhileDisabled() { + return true; + } + + @Override + public void tick(MovementContext context) { + if(!context.world.isClientSide) + return; + + BlockEntity be = context.contraption.presentBlockEntities.get(context.localPos); + if(be instanceof FuelTankBlockEntity fuelTank) { + fuelTank.getFluidLevel().tickChaser(); + } + } +} diff --git a/fabric/src/main/java/com/railwayteam/railways/registry/fabric/CRBlocksImpl.java b/fabric/src/main/java/com/railwayteam/railways/registry/fabric/CRBlocksImpl.java index b6c4aacb8..51f419d37 100644 --- a/fabric/src/main/java/com/railwayteam/railways/registry/fabric/CRBlocksImpl.java +++ b/fabric/src/main/java/com/railwayteam/railways/registry/fabric/CRBlocksImpl.java @@ -20,11 +20,9 @@ import com.railwayteam.railways.Railways; import com.railwayteam.railways.content.fuel.psi.PortableFuelInterfaceBlock; -import com.railwayteam.railways.content.fuel.tank.FuelTankBlock; -import com.railwayteam.railways.content.fuel.tank.FuelTankGenerator; -import com.railwayteam.railways.content.fuel.tank.FuelTankItem; -import com.railwayteam.railways.content.fuel.tank.FuelTankModel; +import com.railwayteam.railways.content.fuel.tank.*; import com.simibubi.create.AllTags; +import com.simibubi.create.api.behaviour.movement.MovementBehaviour; import com.simibubi.create.api.contraption.storage.fluid.MountedFluidStorageType; import com.simibubi.create.content.contraptions.actors.psi.PortableStorageInterfaceMovement; import com.simibubi.create.foundation.data.AssetLookup; @@ -51,6 +49,7 @@ public class CRBlocksImpl { .blockstate(new FuelTankGenerator()::generate) .onRegister(CreateRegistrate.blockModel(() -> FuelTankModel::standard)) .transform(MountedFluidStorageType.mountedFluidStorage(CRMountedStorageTypesImpl.FUEL_TANK)) + .onRegister(MovementBehaviour.movementBehaviour(new FuelTankMovementBehavior())) .addLayer(() -> RenderType::cutoutMipped) .item(FuelTankItem::new) .model(AssetLookup.customBlockItemModel("_", "block_single_window")) diff --git a/forge/src/main/java/com/railwayteam/railways/content/fuel/psi/PortableFuelInterfaceBlockEntity.java b/forge/src/main/java/com/railwayteam/railways/content/fuel/psi/PortableFuelInterfaceBlockEntity.java index 17e66eb75..c657364e0 100644 --- a/forge/src/main/java/com/railwayteam/railways/content/fuel/psi/PortableFuelInterfaceBlockEntity.java +++ b/forge/src/main/java/com/railwayteam/railways/content/fuel/psi/PortableFuelInterfaceBlockEntity.java @@ -19,6 +19,7 @@ package com.railwayteam.railways.content.fuel.psi; import com.railwayteam.railways.mixin_interfaces.IContraptionFuel; +import com.simibubi.create.api.contraption.storage.fluid.MountedFluidStorageWrapper; import com.simibubi.create.content.contraptions.Contraption; import com.simibubi.create.content.contraptions.actors.psi.PortableStorageInterfaceBlockEntity; import net.minecraft.core.BlockPos; @@ -43,7 +44,10 @@ public PortableFuelInterfaceBlockEntity(BlockEntityType type, BlockPos pos, B @Override public void startTransferringTo(Contraption contraption, float distance) { LazyOptional oldcap = capability; - capability = LazyOptional.of(() -> new InterfaceFluidHandler(((IContraptionFuel) contraption).railways$getFluidFuels())); + capability = LazyOptional.of(() -> { + MountedFluidStorageWrapper fuels = ((IContraptionFuel) contraption).railways$getFluidFuels(); + return new InterfaceFluidHandler(fuels != null ? fuels : new FluidTank(0)); + }); oldcap.invalidate(); super.startTransferringTo(contraption, distance); } diff --git a/forge/src/main/java/com/railwayteam/railways/content/fuel/tank/FuelTankMovementBehavior.java b/forge/src/main/java/com/railwayteam/railways/content/fuel/tank/FuelTankMovementBehavior.java new file mode 100644 index 000000000..809cbe9a0 --- /dev/null +++ b/forge/src/main/java/com/railwayteam/railways/content/fuel/tank/FuelTankMovementBehavior.java @@ -0,0 +1,41 @@ +/* + * Steam 'n' Rails + * Copyright (c) 2025 The Railways Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.railwayteam.railways.content.fuel.tank; + +import com.simibubi.create.api.behaviour.movement.MovementBehaviour; +import com.simibubi.create.content.contraptions.behaviour.MovementContext; +import net.minecraft.world.level.block.entity.BlockEntity; + +public class FuelTankMovementBehavior implements MovementBehaviour { + @Override + public boolean mustTickWhileDisabled() { + return true; + } + + @Override + public void tick(MovementContext context) { + if(!context.world.isClientSide) + return; + + BlockEntity be = context.contraption.presentBlockEntities.get(context.localPos); + if(be instanceof FuelTankBlockEntity fuelTank) { + fuelTank.getFluidLevel().tickChaser(); + } + } +} diff --git a/forge/src/main/java/com/railwayteam/railways/registry/forge/CRBlocksImpl.java b/forge/src/main/java/com/railwayteam/railways/registry/forge/CRBlocksImpl.java index ecdf19efc..4c4892080 100644 --- a/forge/src/main/java/com/railwayteam/railways/registry/forge/CRBlocksImpl.java +++ b/forge/src/main/java/com/railwayteam/railways/registry/forge/CRBlocksImpl.java @@ -23,7 +23,9 @@ import com.railwayteam.railways.content.fuel.tank.FuelTankBlock; import com.railwayteam.railways.content.fuel.tank.FuelTankItem; import com.railwayteam.railways.content.fuel.tank.FuelTankModel; +import com.railwayteam.railways.content.fuel.tank.FuelTankMovementBehavior; import com.simibubi.create.AllTags; +import com.simibubi.create.api.behaviour.movement.MovementBehaviour; import com.simibubi.create.api.contraption.storage.fluid.MountedFluidStorageType; import com.simibubi.create.content.contraptions.actors.psi.PortableStorageInterfaceMovement; import com.simibubi.create.foundation.data.AssetLookup; @@ -51,6 +53,7 @@ public class CRBlocksImpl { //.blockstate(new FuelTankGenerator()::generate) Handled by fabric subproject .onRegister(CreateRegistrate.blockModel(() -> FuelTankModel::standard)) .transform(MountedFluidStorageType.mountedFluidStorage(CRMountedStorageTypesImpl.FUEL_TANK)) + .onRegister(MovementBehaviour.movementBehaviour(new FuelTankMovementBehavior())) .addLayer(() -> RenderType::cutoutMipped) .item(FuelTankItem::new) .model(AssetLookup.customBlockItemModel("_", "block_single_window")) From 1b5271dee7289268e831b384fa199fb97b892d78 Mon Sep 17 00:00:00 2001 From: Julia Date: Sat, 28 Jun 2025 14:50:00 -0700 Subject: [PATCH 2/2] Revert IntelliJ's wildcard import change --- .../railwayteam/railways/registry/fabric/CRBlocksImpl.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fabric/src/main/java/com/railwayteam/railways/registry/fabric/CRBlocksImpl.java b/fabric/src/main/java/com/railwayteam/railways/registry/fabric/CRBlocksImpl.java index 51f419d37..4b9500e7f 100644 --- a/fabric/src/main/java/com/railwayteam/railways/registry/fabric/CRBlocksImpl.java +++ b/fabric/src/main/java/com/railwayteam/railways/registry/fabric/CRBlocksImpl.java @@ -20,7 +20,11 @@ import com.railwayteam.railways.Railways; import com.railwayteam.railways.content.fuel.psi.PortableFuelInterfaceBlock; -import com.railwayteam.railways.content.fuel.tank.*; +import com.railwayteam.railways.content.fuel.tank.FuelTankBlock; +import com.railwayteam.railways.content.fuel.tank.FuelTankGenerator; +import com.railwayteam.railways.content.fuel.tank.FuelTankItem; +import com.railwayteam.railways.content.fuel.tank.FuelTankModel; +import com.railwayteam.railways.content.fuel.tank.FuelTankMovementBehavior; import com.simibubi.create.AllTags; import com.simibubi.create.api.behaviour.movement.MovementBehaviour; import com.simibubi.create.api.contraption.storage.fluid.MountedFluidStorageType;