From c03bbf5b5b9236b9260ef84a2fbbce212bd5efc4 Mon Sep 17 00:00:00 2001 From: frostbite-bot <304862314+frostbite-bot@users.noreply.github.com> Date: Sat, 18 Jul 2026 11:37:13 +0000 Subject: [PATCH] Add network extraction handler pipeline --- .../api/dimensionnet/UnifiedStorage.java | 43 ++++++++ .../UnifiedStorageBeforeExtractHandler.java | 98 +++++++++++++++++++ .../impl/AbstractUnorderedStackHandler.java | 4 +- .../module/kubejs/BD_KubeJSPlugin.java | 2 + 4 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/wintercogs/beyonddimensions/api/dimensionnet/helper/UnifiedStorageBeforeExtractHandler.java diff --git a/src/main/java/com/wintercogs/beyonddimensions/api/dimensionnet/UnifiedStorage.java b/src/main/java/com/wintercogs/beyonddimensions/api/dimensionnet/UnifiedStorage.java index 7af451b4..21a88063 100644 --- a/src/main/java/com/wintercogs/beyonddimensions/api/dimensionnet/UnifiedStorage.java +++ b/src/main/java/com/wintercogs/beyonddimensions/api/dimensionnet/UnifiedStorage.java @@ -1,10 +1,12 @@ package com.wintercogs.beyonddimensions.api.dimensionnet; +import com.wintercogs.beyonddimensions.api.dimensionnet.helper.UnifiedStorageBeforeExtractHandler; import com.wintercogs.beyonddimensions.api.dimensionnet.helper.UnifiedStorageBeforeInsertHandler; import com.wintercogs.beyonddimensions.api.storage.handler.impl.UnorderedStackHandlerRemoveZero; import com.wintercogs.beyonddimensions.api.storage.key.IStackKey; import com.wintercogs.beyonddimensions.api.storage.key.KeyAmount; import com.wintercogs.beyonddimensions.api.storage.key.impl.EmptyStackKey; +import net.minecraft.tags.TagKey; import org.jetbrains.annotations.NotNull; import java.util.Objects; @@ -92,4 +94,45 @@ public void onChange() return super.insert(adjusted.key(), adjusted.amount(), simulate); } + @Override + public @NotNull KeyAmount extract(int slot, long amount, boolean simulate) + { + return handleExtract(getStackBySlot(slot), amount, simulate, false); + } + + @Override + public @NotNull KeyAmount extract(IStackKey key, long amount, boolean simulate, boolean fuzzy) + { + return handleExtract(new KeyAmount(Objects.requireNonNullElse(key, EmptyStackKey.INSTANCE), amount), amount, simulate, fuzzy); + } + + @Override + public @NotNull KeyAmount extract(TagKey tagKey, long amount, boolean simulate) + { + KeyAmount extracted = super.extract(tagKey, amount, true); + return handleExtract(extracted, amount, simulate, false); + } + + private @NotNull KeyAmount handleExtract(KeyAmount requested, long amount, boolean simulate, boolean fuzzy) + { + if (amount <= 0L || requested.isEmpty()) + return new KeyAmount(EmptyStackKey.INSTANCE, 0L); + + KeyAmount available = super.extract(requested.key(), amount, true, fuzzy); + var info = UnifiedStorageBeforeExtractHandler.onBeforeExtract(available, net); + + if (info.cancel()) + return new KeyAmount(EmptyStackKey.INSTANCE, 0L); + + KeyAmount adjusted = info.beforeExtract(); + if (adjusted.isEmpty()) + return adjusted; + + long extractedAmount = Math.min(available.amount(), adjusted.amount()); + if (!simulate) + super.extract(available.key(), extractedAmount, false, false); + + return new KeyAmount(adjusted.key(), extractedAmount); + } + } diff --git a/src/main/java/com/wintercogs/beyonddimensions/api/dimensionnet/helper/UnifiedStorageBeforeExtractHandler.java b/src/main/java/com/wintercogs/beyonddimensions/api/dimensionnet/helper/UnifiedStorageBeforeExtractHandler.java new file mode 100644 index 00000000..e45b13c6 --- /dev/null +++ b/src/main/java/com/wintercogs/beyonddimensions/api/dimensionnet/helper/UnifiedStorageBeforeExtractHandler.java @@ -0,0 +1,98 @@ +package com.wintercogs.beyonddimensions.api.dimensionnet.helper; + +import com.wintercogs.beyonddimensions.api.dimensionnet.DimensionsNet; +import com.wintercogs.beyonddimensions.api.storage.key.KeyAmount; +import com.wintercogs.beyonddimensions.api.storage.key.impl.EmptyStackKey; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +/** + * 一些辅助工具,让UnifiedStorage可以在提取操作真实执行前对即将离开网络的堆叠进行调整 + */ +public final class UnifiedStorageBeforeExtractHandler +{ + private static final List handlers = new ArrayList<>(); + + @FunctionalInterface + public interface BeforeExtractHandler + { + /** + * @param originalExtract 本次提取最原始的堆叠 + * @param tryExtract 当前调用链上传递的堆叠 + * @param net 网络信息,可为空 + */ + @NotNull + BeforeExtractHandlerReturnInfo beforeExtract( + @NotNull KeyAmount originalExtract, + @NotNull KeyAmount tryExtract, + @Nullable DimensionsNet net + ); + } + + public record BeforeExtractHandlerReturnInfo(@NotNull KeyAmount beforeExtract, boolean cancel) + { + boolean isEmpty() + { + return beforeExtract.isEmpty(); + } + + boolean isCanceled() + { + return cancel; + } + } + + /** + * 调用此函数以添加处理 + */ + public static void addHandler(BeforeExtractHandler handler) + { + handlers.add(handler); + } + + /** + * @param tryExtract 本次尝试提取的原始堆叠 + * @param net 携带的网络信息,可为空 + * @return 最终离开维度网络的堆叠 + *

+ * 会对handlers表进行链式调用,每一次处理完的extract会被传递给下一次调用。 + * 如果cancel,则网络不会移除或输出任何内容;否则网络最多移除原始可提取数量, + * 并输出最后一次处理得到的堆叠。处理器可以减少输出数量或替换输出类型,但不能增加实际提取数量。 + */ + @NotNull + public static BeforeExtractHandlerReturnInfo onBeforeExtract(@Nullable KeyAmount tryExtract, @Nullable DimensionsNet net) + { + final KeyAmount original = (tryExtract == null) + ? new KeyAmount(EmptyStackKey.INSTANCE, 0) + : tryExtract; + + if (tryExtract == null) + return new BeforeExtractHandlerReturnInfo(original, true); + + if (tryExtract.isEmpty()) + return new BeforeExtractHandlerReturnInfo(tryExtract, true); + + KeyAmount current = tryExtract; + + for (var handler : handlers) + { + if (handler == null) + continue; + + var ret = handler.beforeExtract(original, current, net); + + current = ret.beforeExtract(); + + if (ret.cancel()) + return new BeforeExtractHandlerReturnInfo(current, true); + + if (current.isEmpty()) + return new BeforeExtractHandlerReturnInfo(current, false); + } + + return new BeforeExtractHandlerReturnInfo(current, false); + } +} diff --git a/src/main/java/com/wintercogs/beyonddimensions/api/storage/handler/impl/AbstractUnorderedStackHandler.java b/src/main/java/com/wintercogs/beyonddimensions/api/storage/handler/impl/AbstractUnorderedStackHandler.java index dc8f89c1..388f669e 100644 --- a/src/main/java/com/wintercogs/beyonddimensions/api/storage/handler/impl/AbstractUnorderedStackHandler.java +++ b/src/main/java/com/wintercogs/beyonddimensions/api/storage/handler/impl/AbstractUnorderedStackHandler.java @@ -628,7 +628,7 @@ protected KeyAmount unzipMatterBall(ItemStackKey ballKey, long ballCount, boolea for (int i = applied.size() - 1; i >= 0; i--) { KeyAmount a = applied.get(i); - extract(a.key(), a.amount(), false, false); + extractByKey(a.key(), a.amount(), false); } return new KeyAmount(ballKey, ballCount); } @@ -640,7 +640,7 @@ protected KeyAmount unzipMatterBall(ItemStackKey ballKey, long ballCount, boolea for (int i = applied.size() - 1; i >= 0; i--) { KeyAmount a = applied.get(i); - extract(a.key(), a.amount(), false, false); + extractByKey(a.key(), a.amount(), false); } return new KeyAmount(ballKey, ballCount); } diff --git a/src/main/java/com/wintercogs/beyonddimensions/integration/module/kubejs/BD_KubeJSPlugin.java b/src/main/java/com/wintercogs/beyonddimensions/integration/module/kubejs/BD_KubeJSPlugin.java index 5d0124ef..bcb2d3df 100644 --- a/src/main/java/com/wintercogs/beyonddimensions/integration/module/kubejs/BD_KubeJSPlugin.java +++ b/src/main/java/com/wintercogs/beyonddimensions/integration/module/kubejs/BD_KubeJSPlugin.java @@ -5,6 +5,7 @@ import com.wintercogs.beyonddimensions.api.dimensionnet.NetPermissionlevel; import com.wintercogs.beyonddimensions.api.dimensionnet.PlayerPermissionInfo; import com.wintercogs.beyonddimensions.api.dimensionnet.UnifiedStorage; +import com.wintercogs.beyonddimensions.api.dimensionnet.helper.UnifiedStorageBeforeExtractHandler; import com.wintercogs.beyonddimensions.api.dimensionnet.helper.UnifiedStorageBeforeInsertHandler; import com.wintercogs.beyonddimensions.api.longtype.LongType; import com.wintercogs.beyonddimensions.api.storage.handler.IStackHandler; @@ -24,6 +25,7 @@ public void registerBindings(BindingsEvent bindings) { bindings.add("UnifiedStorage", UnifiedStorage.class); bindings.add("UnifiedStorageBeforeInsertHandler", UnifiedStorageBeforeInsertHandler.class); + bindings.add("UnifiedStorageBeforeExtractHandler", UnifiedStorageBeforeExtractHandler.class); bindings.add("IStackTypedHandler", IStackHandler.class); bindings.add("StackTypedHandler", StackHandler.class); bindings.add("LongType", LongType.class);