From 68a4b56567823d68ae6245231ccd267b20592a3d Mon Sep 17 00:00:00 2001 From: eligibbs Date: Sun, 3 May 2026 22:29:40 -0400 Subject: [PATCH] adds fluid handling with pipes on fabric --- .../java/net/cmr/jurassicrevived/JRMod.java | 11 ++- .../platform/FabricTransferHelper.java | 91 ++++++++++++++++++- 2 files changed, 96 insertions(+), 6 deletions(-) diff --git a/fabricmc/src/main/java/net/cmr/jurassicrevived/JRMod.java b/fabricmc/src/main/java/net/cmr/jurassicrevived/JRMod.java index 7d24133..b0bee71 100755 --- a/fabricmc/src/main/java/net/cmr/jurassicrevived/JRMod.java +++ b/fabricmc/src/main/java/net/cmr/jurassicrevived/JRMod.java @@ -4,10 +4,10 @@ import net.cmr.jurassicrevived.block.entity.ModBlockEntities; import net.cmr.jurassicrevived.block.entity.custom.*; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.transfer.v1.fluid.FluidStorage; -import net.fabricmc.fabric.api.transfer.v1.item.ItemStorage; -import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant; -import net.fabricmc.fabric.api.transfer.v1.storage.Storage; import net.cmr.jurassicrevived.platform.FabricEnergyWrapper; +import net.cmr.jurassicrevived.platform.FabricTransferHelper; +import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.transfer.v1.fluid.FluidStorage; import team.reborn.energy.api.EnergyStorage; public class JRMod implements ModInitializer @@ -24,6 +24,11 @@ public class JRMod implements ModInitializer Constants.LOG.info("Hello Fabric world!"); CommonClass.init(); + FluidStorage.SIDED.registerForBlockEntities((be, side) -> + new FabricTransferHelper.InternalFluidStorage(((TankBlockEntity) be).getFluidHandler(side)), + ModBlockEntities.TANK_BE.get() + ); + EnergyStorage.SIDED.registerForBlockEntities((be, side) -> new FabricEnergyWrapper(((PowerCellBlockEntity) be).getEnergyStorage(side)), ModBlockEntities.POWER_CELL_BE.get() diff --git a/fabricmc/src/main/java/net/cmr/jurassicrevived/platform/FabricTransferHelper.java b/fabricmc/src/main/java/net/cmr/jurassicrevived/platform/FabricTransferHelper.java index e8fc820..73c9270 100755 --- a/fabricmc/src/main/java/net/cmr/jurassicrevived/platform/FabricTransferHelper.java +++ b/fabricmc/src/main/java/net/cmr/jurassicrevived/platform/FabricTransferHelper.java @@ -7,6 +7,7 @@ import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant; import net.fabricmc.fabric.api.transfer.v1.storage.Storage; import net.fabricmc.fabric.api.transfer.v1.storage.StorageView; import net.fabricmc.fabric.api.transfer.v1.transaction.Transaction; +import net.fabricmc.fabric.api.transfer.v1.transaction.TransactionContext; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; @@ -25,6 +26,7 @@ import net.fabricmc.fabric.api.transfer.v1.transaction.Transaction; //import team.reborn.energy.api.EnergyStorage; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Optional; @@ -50,10 +52,93 @@ public class FabricTransferHelper implements ITransferHelper { return Optional.empty(); } - private static class FabricFluidHandler implements PlatformFluidHandler { - private final net.fabricmc.fabric.api.transfer.v1.storage.Storage storage; + public static class InternalFluidStorage implements Storage { + private final net.cmr.jurassicrevived.platform.transfer.InternalFluidHandler handler; - private FabricFluidHandler(net.fabricmc.fabric.api.transfer.v1.storage.Storage storage) { + public InternalFluidStorage(net.cmr.jurassicrevived.platform.transfer.InternalFluidHandler handler) { + this.handler = handler; + } + + @Override + public long insert(FluidVariant resource, long maxAmount, TransactionContext transaction) { + if (resource.isBlank() || maxAmount <= 0) { + return 0; + } + + FluidStack stack = FluidStack.create(resource.getFluid(), maxAmount); + long inserted = handler.fill(stack, true); + + if (inserted > 0) { + transaction.addCloseCallback((tx, result) -> { + if (result.wasCommitted()) { + handler.fill(FluidStack.create(resource.getFluid(), inserted), false); + } + }); + } + + return inserted; + } + + @Override + public long extract(FluidVariant resource, long maxAmount, TransactionContext transaction) { + if (resource.isBlank() || maxAmount <= 0) { + return 0; + } + + FluidStack stored = handler.getFluid(); + if (stored.isEmpty() || stored.getFluid() != resource.getFluid()) { + return 0; + } + + long extracted = Math.min(maxAmount, stored.getAmount()); + + if (extracted > 0) { + transaction.addCloseCallback((tx, result) -> { + if (result.wasCommitted()) { + handler.drain(extracted, false); + } + }); + } + + return extracted; + } + + @Override + public Iterator> iterator() { + FluidStack stored = handler.getFluid(); + return List.>of(new StorageView<>() { + @Override + public FluidVariant getResource() { + return stored.isEmpty() ? FluidVariant.blank() : FluidVariant.of(stored.getFluid()); + } + + @Override + public long getAmount() { + return stored.getAmount(); + } + + @Override + public long getCapacity() { + return handler.getCapacity(); + } + + @Override + public boolean isResourceBlank() { + return stored.isEmpty(); + } + + @Override + public long extract(FluidVariant resource, long maxAmount, TransactionContext transaction) { + return InternalFluidStorage.this.extract(resource, maxAmount, transaction); + } + }).iterator(); + } + } + + private static class FabricFluidHandler implements PlatformFluidHandler { + private final Storage storage; + + private FabricFluidHandler(Storage storage) { this.storage = storage; }