|
| 1 | +package juuxel.adorn.block.entity; |
| 2 | + |
| 3 | +import com.google.common.base.Predicates; |
| 4 | +import juuxel.adorn.fluid.FluidReference; |
| 5 | +import juuxel.adorn.util.FluidStorageReference; |
| 6 | +import net.fabricmc.fabric.api.transfer.v1.context.ContainerItemContext; |
| 7 | +import net.fabricmc.fabric.api.transfer.v1.fluid.FluidConstants; |
| 8 | +import net.fabricmc.fabric.api.transfer.v1.fluid.FluidStorage; |
| 9 | +import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant; |
| 10 | +import net.fabricmc.fabric.api.transfer.v1.item.InventoryStorage; |
| 11 | +import net.fabricmc.fabric.api.transfer.v1.storage.StorageUtil; |
| 12 | +import net.fabricmc.fabric.api.transfer.v1.storage.base.SingleVariantStorage; |
| 13 | +import net.fabricmc.fabric.api.transfer.v1.transaction.Transaction; |
| 14 | +import net.fabricmc.fabric.api.transfer.v1.transaction.TransactionContext; |
| 15 | +import net.minecraft.block.BlockState; |
| 16 | +import net.minecraft.nbt.NbtCompound; |
| 17 | +import net.minecraft.util.math.BlockPos; |
| 18 | +import org.jetbrains.annotations.Nullable; |
| 19 | + |
| 20 | +public final class BrewerBlockEntityFabric extends BrewerBlockEntity { |
| 21 | + private static final String NBT_FLUID = "Fluid"; |
| 22 | + private static final String NBT_VOLUME = "Volume"; |
| 23 | + |
| 24 | + private final SingleVariantStorage<FluidVariant> fluidStorage = new SingleVariantStorage<FluidVariant>() { |
| 25 | + @Override |
| 26 | + protected long getCapacity(FluidVariant variant) { |
| 27 | + return FLUID_CAPACITY_IN_BUCKETS * FluidConstants.BUCKET; |
| 28 | + } |
| 29 | + |
| 30 | + @Override |
| 31 | + protected FluidVariant getBlankVariant() { |
| 32 | + return FluidVariant.blank(); |
| 33 | + } |
| 34 | + |
| 35 | + @Override |
| 36 | + protected void onFinalCommit() { |
| 37 | + markDirty(); |
| 38 | + } |
| 39 | + }; |
| 40 | + |
| 41 | + private final FluidReference fluidReference = new FluidStorageReference(fluidStorage); |
| 42 | + |
| 43 | + public BrewerBlockEntityFabric(BlockPos pos, BlockState state) { |
| 44 | + super(pos, state); |
| 45 | + } |
| 46 | + |
| 47 | + public SingleVariantStorage<FluidVariant> getFluidStorage() { |
| 48 | + return fluidStorage; |
| 49 | + } |
| 50 | + |
| 51 | + @Override |
| 52 | + public FluidReference getFluidReference() { |
| 53 | + return fluidReference; |
| 54 | + } |
| 55 | + |
| 56 | + @Override |
| 57 | + protected boolean canExtractFluidContainer() { |
| 58 | + try (var transaction = Transaction.openOuter()) { |
| 59 | + return extractFluidContainer(transaction) == 0L; |
| 60 | + } |
| 61 | + } |
| 62 | + |
| 63 | + @Override |
| 64 | + protected void tryExtractFluidContainer() { |
| 65 | + extractFluidContainer(null); |
| 66 | + } |
| 67 | + |
| 68 | + private long extractFluidContainer(@Nullable TransactionContext transaction) { |
| 69 | + var fluidContainerSlot = InventoryStorage.of(this, null).getSlot(FLUID_CONTAINER_SLOT); |
| 70 | + var itemStorage = FluidStorage.ITEM.find(getStack(FLUID_CONTAINER_SLOT), ContainerItemContext.ofSingleSlot(fluidContainerSlot)); |
| 71 | + return StorageUtil.move(itemStorage, fluidStorage, Predicates.alwaysTrue(), Long.MAX_VALUE, transaction); |
| 72 | + } |
| 73 | + |
| 74 | + @Override |
| 75 | + protected void writeNbt(NbtCompound nbt) { |
| 76 | + super.writeNbt(nbt); |
| 77 | + nbt.put(NBT_FLUID, fluidStorage.variant.toNbt()); |
| 78 | + nbt.putLong(NBT_VOLUME, fluidStorage.amount); |
| 79 | + } |
| 80 | + |
| 81 | + @Override |
| 82 | + public void readNbt(NbtCompound nbt) { |
| 83 | + super.readNbt(nbt); |
| 84 | + fluidStorage.variant = FluidVariant.fromNbt(nbt.getCompound(NBT_FLUID)); |
| 85 | + fluidStorage.amount = nbt.getLong(NBT_VOLUME); |
| 86 | + } |
| 87 | +} |
0 commit comments