adds fluid handling with pipes on fabric

This commit is contained in:
2026-05-03 22:29:40 -04:00
parent c0fd3c18df
commit 68a4b56567
2 changed files with 96 additions and 6 deletions
@@ -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()
@@ -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<FluidVariant> storage;
public static class InternalFluidStorage implements Storage<FluidVariant> {
private final net.cmr.jurassicrevived.platform.transfer.InternalFluidHandler handler;
private FabricFluidHandler(net.fabricmc.fabric.api.transfer.v1.storage.Storage<FluidVariant> 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<StorageView<FluidVariant>> iterator() {
FluidStack stored = handler.getFluid();
return List.<StorageView<FluidVariant>>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<FluidVariant> storage;
private FabricFluidHandler(Storage<FluidVariant> storage) {
this.storage = storage;
}