From bb8a3e96f8fd5e8ecf28ee99a79c75c665751b1e Mon Sep 17 00:00:00 2001 From: Roelymole Date: Sun, 14 Jun 2026 10:14:03 +0100 Subject: [PATCH 1/2] fix: remove Screen.hasAltDown() to prevent crashing on dedicated servers --- .../machinelib/api/block/MachineBlock.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) 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 Date: Wed, 24 Jun 2026 23:55:43 +0100 Subject: [PATCH 2/2] feat: add MachineInsertHandler functional interface to allow for custom behaviour when inserting resources e.g. to split silicon between the two slots in the circuit fabricator --- .../compat/transfer/MachineInsertHandler.java | 42 +++++++++++++++++++ .../api/storage/ResourceStorage.java | 12 ++++++ .../compat/transfer/ExposedStorageImpl.java | 16 +++---- .../impl/storage/ResourceStorageImpl.java | 10 +++++ 4 files changed, 72 insertions(+), 8 deletions(-) create mode 100644 src/main/java/dev/galacticraft/machinelib/api/compat/transfer/MachineInsertHandler.java diff --git a/src/main/java/dev/galacticraft/machinelib/api/compat/transfer/MachineInsertHandler.java b/src/main/java/dev/galacticraft/machinelib/api/compat/transfer/MachineInsertHandler.java new file mode 100644 index 0000000..ff01ed3 --- /dev/null +++ b/src/main/java/dev/galacticraft/machinelib/api/compat/transfer/MachineInsertHandler.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2021-2026 Team Galacticraft + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package dev.galacticraft.machinelib.api.compat.transfer; + +import dev.galacticraft.machinelib.api.storage.ResourceStorage; +import dev.galacticraft.machinelib.api.storage.slot.ResourceSlot; +import net.fabricmc.fabric.api.transfer.v1.storage.TransferVariant; +import net.fabricmc.fabric.api.transfer.v1.transaction.TransactionContext; + +@FunctionalInterface +public interface MachineInsertHandler> { + /** + * 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;