diff --git a/src/main/java/dev/galacticraft/machinelib/api/block/MachineBlock.java b/src/main/java/dev/galacticraft/machinelib/api/block/MachineBlock.java index 60c236d..3a9255d 100644 --- a/src/main/java/dev/galacticraft/machinelib/api/block/MachineBlock.java +++ b/src/main/java/dev/galacticraft/machinelib/api/block/MachineBlock.java @@ -272,16 +272,14 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List> { + /** + * Allows for a custom implementation of the {@code insert} method. + * + * @param storage the storage to insert into + * @param variant the variant to move + * @param maxAmount the maximum amount of resources to move + * @param transaction the transaction context to use + * @return the amount of resources moved + */ + long insert(ResourceStorage storage, TransferVariant variant, long maxAmount, TransactionContext transaction); +} diff --git a/src/main/java/dev/galacticraft/machinelib/api/storage/ResourceStorage.java b/src/main/java/dev/galacticraft/machinelib/api/storage/ResourceStorage.java index 5775283..7d5bb38 100644 --- a/src/main/java/dev/galacticraft/machinelib/api/storage/ResourceStorage.java +++ b/src/main/java/dev/galacticraft/machinelib/api/storage/ResourceStorage.java @@ -30,6 +30,7 @@ import dev.galacticraft.machinelib.api.storage.slot.ResourceSlot; import dev.galacticraft.machinelib.api.transfer.ResourceFlow; import net.fabricmc.fabric.api.transfer.v1.storage.TransferVariant; +import net.fabricmc.fabric.api.transfer.v1.transaction.TransactionContext; import net.minecraft.nbt.ListTag; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.world.level.block.entity.BlockEntity; @@ -53,6 +54,17 @@ public interface ResourceStorage> boolean isValid(); + /** + * Invokes the {@link dev.galacticraft.machinelib.api.compat.transfer.MachineInsertHandler#insert}, + * if the parent block entity implements {@link dev.galacticraft.machinelib.api.compat.transfer.MachineInsertHandler}. + * + * @param variant the variant to move + * @param maxAmount the maximum amount of resources to move + * @param transaction the transaction context to use + * @return the amount of resources moved + */ + long insert(TransferVariant variant, long maxAmount, TransactionContext transaction); + /** * Create an exposed storage for this storage. * diff --git a/src/main/java/dev/galacticraft/machinelib/impl/compat/transfer/ExposedStorageImpl.java b/src/main/java/dev/galacticraft/machinelib/impl/compat/transfer/ExposedStorageImpl.java index 8ec3d27..a67f708 100644 --- a/src/main/java/dev/galacticraft/machinelib/impl/compat/transfer/ExposedStorageImpl.java +++ b/src/main/java/dev/galacticraft/machinelib/impl/compat/transfer/ExposedStorageImpl.java @@ -67,23 +67,23 @@ public boolean supportsExtraction() { @Override public long insert(Variant variant, long maxAmount, TransactionContext transaction) { if (!this.storage.isValid()) return 0; - long requested = maxAmount; + long amount = this.storage.insert(variant, maxAmount, transaction); for (ExposedSlot slot : this.slots) { - if (maxAmount == 0) return requested; - maxAmount -= slot.insert(variant, maxAmount, transaction); + if (amount == maxAmount) break; + amount += slot.insert(variant, maxAmount, transaction); } - return requested - maxAmount; + return amount; } @Override public long extract(Variant variant, long maxAmount, TransactionContext transaction) { if (!this.storage.isValid()) return 0; - long requested = maxAmount; + long amount = 0; for (ExposedSlot slot : this.slots) { - if (maxAmount == 0) return requested; - maxAmount -= slot.extract(variant, maxAmount, transaction); + if (amount == maxAmount) return amount; + amount += slot.extract(variant, maxAmount, transaction); } - return requested - maxAmount; + return amount; } @Override diff --git a/src/main/java/dev/galacticraft/machinelib/impl/storage/ResourceStorageImpl.java b/src/main/java/dev/galacticraft/machinelib/impl/storage/ResourceStorageImpl.java index dead336..15a92d2 100644 --- a/src/main/java/dev/galacticraft/machinelib/impl/storage/ResourceStorageImpl.java +++ b/src/main/java/dev/galacticraft/machinelib/impl/storage/ResourceStorageImpl.java @@ -23,9 +23,11 @@ package dev.galacticraft.machinelib.impl.storage; import dev.galacticraft.machinelib.api.storage.ResourceStorage; +import dev.galacticraft.machinelib.api.compat.transfer.MachineInsertHandler; import dev.galacticraft.machinelib.api.storage.slot.ResourceSlot; import it.unimi.dsi.fastutil.longs.LongArrayList; import it.unimi.dsi.fastutil.longs.LongList; +import net.fabricmc.fabric.api.transfer.v1.storage.TransferVariant; import net.fabricmc.fabric.api.transfer.v1.transaction.TransactionContext; import net.minecraft.nbt.ListTag; import net.minecraft.network.RegistryFriendlyByteBuf; @@ -55,6 +57,14 @@ public boolean isValid() { return this.parent == null || !this.parent.isRemoved(); } + @Override + public long insert(TransferVariant variant, long maxAmount, TransactionContext transaction) { + if (this.parent instanceof MachineInsertHandler handler) { + return handler.insert(this, variant, maxAmount, transaction); + } + return 0; + } + @Override public long getModifications() { return this.modifications;