From 956729412ee1ff175d6dfa2f5babb0233f66c99e Mon Sep 17 00:00:00 2001 From: C-H716 <1536152356@qq.com> Date: Fri, 29 Aug 2025 19:27:03 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=94=AF=E6=8C=81=E6=A0=B7=E6=9D=BF?= =?UTF-8?q?=E4=BE=9B=E5=BA=94=E5=99=A8=E8=BD=AE=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CraftingCalculationAccessor.java | 15 ---- .../CraftingProviderListAccessor.java | 12 +++ .../CraftingServiceGetProvidersMixin.java | 2 +- .../autopattern/CraftingTreeNodeAccessor.java | 6 +- .../autopattern/CraftingTreeProcessMixin.java | 44 ++++++++--- ...ernProviderLogicContainsRedirectMixin.java | 2 +- .../extendedae_plus/util/ArraySimplifier.java | 78 ------------------- .../resources/extendedae_plus.mixins.json | 6 +- 8 files changed, 51 insertions(+), 114 deletions(-) delete mode 100644 src/main/java/com/extendedae_plus/mixin/autopattern/CraftingCalculationAccessor.java create mode 100644 src/main/java/com/extendedae_plus/mixin/autopattern/CraftingProviderListAccessor.java delete mode 100644 src/main/java/com/extendedae_plus/util/ArraySimplifier.java diff --git a/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingCalculationAccessor.java b/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingCalculationAccessor.java deleted file mode 100644 index 96bb300..0000000 --- a/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingCalculationAccessor.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.extendedae_plus.mixin.autopattern; - -import appeng.api.stacks.AEKey; -import appeng.crafting.CraftingCalculation; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(CraftingCalculation.class) -public interface CraftingCalculationAccessor { - @Accessor("output") - AEKey extendedae_plus$getOutput(); - - @Accessor("requestedAmount") - long extendedae_plus$getRequestedAmount(); -} \ No newline at end of file diff --git a/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingProviderListAccessor.java b/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingProviderListAccessor.java new file mode 100644 index 0000000..60f7cb5 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingProviderListAccessor.java @@ -0,0 +1,12 @@ +package com.extendedae_plus.mixin.autopattern; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; + +@Mixin(targets = "appeng.me.service.helpers.NetworkCraftingProviders.CraftingProviderList") +public interface CraftingProviderListAccessor { + @Accessor("providers") + List eap$getProviders(); +} diff --git a/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingServiceGetProvidersMixin.java b/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingServiceGetProvidersMixin.java index 5604bbb..5ae4d03 100644 --- a/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingServiceGetProvidersMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingServiceGetProvidersMixin.java @@ -16,7 +16,7 @@ public class CraftingServiceGetProvidersMixin { @ModifyArg(method = "getProviders(Lappeng/api/crafting/IPatternDetails;)Ljava/lang/Iterable;", at = @At(value = "INVOKE", target = "Lappeng/me/service/helpers/NetworkCraftingProviders;getMediums(Lappeng/api/crafting/IPatternDetails;)Ljava/lang/Iterable;"), index = 0) - private IPatternDetails extendedae_plus$modifyGetProvidersArg(IPatternDetails original) { + private IPatternDetails eap$modifyGetProvidersArg(IPatternDetails original) { IPatternDetails base = null; if (original instanceof ScaledProcessingPattern scaledProcessingPattern) { base = scaledProcessingPattern.getOriginal(); diff --git a/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingTreeNodeAccessor.java b/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingTreeNodeAccessor.java index 81d60e2..b6a274f 100644 --- a/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingTreeNodeAccessor.java +++ b/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingTreeNodeAccessor.java @@ -7,10 +7,6 @@ import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(CraftingTreeNode.class) public interface CraftingTreeNodeAccessor { - @Accessor("what") - AEKey extendedae_plus$getWhat(); - - @Accessor("amount") - long extendedae_plus$getAmount(); + AEKey eap$getWhat(); } diff --git a/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingTreeProcessMixin.java b/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingTreeProcessMixin.java index 644f1a3..164d3cc 100644 --- a/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingTreeProcessMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingTreeProcessMixin.java @@ -1,23 +1,25 @@ package com.extendedae_plus.mixin.autopattern; import appeng.api.crafting.IPatternDetails; +import appeng.api.networking.crafting.ICraftingProvider; import appeng.api.networking.crafting.ICraftingService; import appeng.api.stacks.AEKey; -import appeng.crafting.CraftBranchFailure; import appeng.crafting.CraftingCalculation; import appeng.crafting.CraftingTreeNode; import appeng.crafting.CraftingTreeProcess; -import appeng.crafting.inv.CraftingSimulationState; import appeng.crafting.pattern.AEProcessingPattern; -import com.extendedae_plus.util.PatternScaler; -import com.extendedae_plus.util.RequestedAmountHolder; +import appeng.me.service.CraftingService; import com.extendedae_plus.api.SmartDoublingAwarePattern; import com.extendedae_plus.content.ScaledProcessingPattern; +import com.extendedae_plus.util.PatternScaler; +import com.extendedae_plus.util.RequestedAmountHolder; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyVariable; +import java.util.List; +import java.util.stream.StreamSupport; + import static com.extendedae_plus.util.ExtendedAELogger.LOGGER; /** @@ -27,14 +29,12 @@ import static com.extendedae_plus.util.ExtendedAELogger.LOGGER; @Mixin(CraftingTreeProcess.class) public abstract class CraftingTreeProcessMixin { - @Shadow abstract void request(CraftingSimulationState inv, long times) throws CraftBranchFailure, InterruptedException; - @ModifyVariable( method = "(Lappeng/api/networking/crafting/ICraftingService;Lappeng/crafting/CraftingCalculation;Lappeng/api/crafting/IPatternDetails;Lappeng/crafting/CraftingTreeNode;)V", at = @At("HEAD"), argsOnly = true ) - private static IPatternDetails extendedae_plus$replaceDetailsAtHead(IPatternDetails original, ICraftingService cc, CraftingCalculation job, IPatternDetails details, CraftingTreeNode craftingTreeNode) { + private static IPatternDetails eap$replaceDetailsAtHead(IPatternDetails original, ICraftingService cc, CraftingCalculation job, IPatternDetails details, CraftingTreeNode craftingTreeNode) { try { // 若传入的 details 已经是缩放样板,且原始样板不允许缩放,则直接解包为原始样板 if (details instanceof ScaledProcessingPattern sp) { @@ -52,13 +52,35 @@ public abstract class CraftingTreeProcessMixin { } CraftingTreeNodeAccessor parentAcc = (CraftingTreeNodeAccessor) craftingTreeNode; - AEKey parentTarget = parentAcc.extendedae_plus$getWhat(); + AEKey parentTarget = parentAcc.eap$getWhat(); long requested = RequestedAmountHolder.get(); - // 使用当前线程栈顶的值进行缩放,不在此处清理;构造完成后应该由调用方的 pop 恢复状态 - var scaled = PatternScaler.scale(proc, parentTarget, requested); + + CraftingService craftingService = (CraftingService) cc; + Iterable providers = craftingService.getProviders(original); + + // 计算 provider 数量;优先使用 mixin accessor 以避免消费迭代器 + int size; + if (providers instanceof CraftingProviderListAccessor acc) { + List list = acc.eap$getProviders(); + size = list == null ? 0 : list.size(); + } else { + // 回退为遍历计数(会消费迭代器) + size = (int) StreamSupport.stream(providers.spliterator(), false).count(); + } + + // 将 requested 在 providers 间均分:仅在 providers 数量大于1时均分,保证整数且总量不少于 requested + long perProvider = requested; + if (size > 1) { + perProvider = requested / size + ((requested % size) == 0 ? 0 : 1); + if (perProvider <= 0) perProvider = 1L; + } + + // 使用每-provider 的分配量来缩放样板 + var scaled = PatternScaler.scale(proc, parentTarget, perProvider); return scaled != null ? scaled : original; } catch (Exception e) { LOGGER.warn("构建倍增样板出错", e); + e.printStackTrace(); return original; } } diff --git a/src/main/java/com/extendedae_plus/mixin/autopattern/PatternProviderLogicContainsRedirectMixin.java b/src/main/java/com/extendedae_plus/mixin/autopattern/PatternProviderLogicContainsRedirectMixin.java index 7674936..bd1500f 100644 --- a/src/main/java/com/extendedae_plus/mixin/autopattern/PatternProviderLogicContainsRedirectMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/autopattern/PatternProviderLogicContainsRedirectMixin.java @@ -21,7 +21,7 @@ public class PatternProviderLogicContainsRedirectMixin { value = "INVOKE", target = "Ljava/util/List;contains(Ljava/lang/Object;)Z") ) - private boolean extendedae_plus$patternsContains(List list, Object o) { + private boolean eap$patternsContains(List list, Object o) { try { if (o instanceof ScaledProcessingPattern scaled) { IPatternDetails base = scaled.getOriginal(); diff --git a/src/main/java/com/extendedae_plus/util/ArraySimplifier.java b/src/main/java/com/extendedae_plus/util/ArraySimplifier.java deleted file mode 100644 index 076eb31..0000000 --- a/src/main/java/com/extendedae_plus/util/ArraySimplifier.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.extendedae_plus.util; - -import java.util.Arrays; - -public class ArraySimplifier { - - // 计算两个数的GCD using Euclidean algorithm (long版本) - public static long gcd(long a, long b) { - while (b != 0) { - long temp = b; - b = a % b; - a = temp; - } - return a; - } - - // 计算整个数组的GCD - public static long findGCD(long[] arr) { - if (arr.length == 0) { - return 0; - } - long result = arr[0]; - for (int i = 1; i < arr.length; i++) { - result = gcd(result, arr[i]); - // 如果已经找到GCD为1,可以提前终止 - if (result == 1) { - break; - } - } - return result; - } - - // 简化数组:每个元素除以数组的GCD - public static long[] simplifyFraction(long[] arr) { - if (arr.length == 0) { - return new long[0]; - } - long gcd = findGCD(arr); - if (gcd == 0) { - // 如果GCD为0(所有元素为0),返回原数组的副本 - return Arrays.copyOf(arr, arr.length); - } - long[] simplified = new long[arr.length]; - for (int i = 0; i < arr.length; i++) { - simplified[i] = arr[i] / gcd; - } - return simplified; - } - - // 将两个数组合并为一个新数组(先放 a 后放 b) - public static long[] combine(long[] a, long[] b) { - long[] out = new long[a.length + b.length]; - System.arraycopy(a, 0, out, 0, a.length); - System.arraycopy(b, 0, out, a.length, b.length); - return out; - } - - // 寻找数组的 GCD,遇到 1 则立即返回 1(早期退出优化) - public static long findGCDWithEarlyExit(long[] arr) { - if (arr.length == 0) return 0; - long result = 0; - for (long v : arr) { - if (v == 1) return 1; // already irreducible - if (v == 0) continue; - if (result == 0) result = v; else result = gcd(result, v); - if (result == 1) return 1; - } - return result == 0 ? 0 : Math.abs(result); - } - - // 根据给定的 gcd 返回一个已除以 gcd 的新数组;如果 gcd==1 返回原数组(避免不必要的分配) - public static long[] simplifyByGcd(long[] arr, long gcd) { - if (gcd <= 1) return arr; - long[] out = new long[arr.length]; - for (int i = 0; i < arr.length; i++) out[i] = arr[i] / gcd; - return out; - } -} \ No newline at end of file diff --git a/src/main/resources/extendedae_plus.mixins.json b/src/main/resources/extendedae_plus.mixins.json index f855dd3..cb4d066 100644 --- a/src/main/resources/extendedae_plus.mixins.json +++ b/src/main/resources/extendedae_plus.mixins.json @@ -26,15 +26,15 @@ "jei.EncodePatternTransferHandlerMixin" ], "mixins": [ + "ae2.AEProcessingPatternMixin", "ae2.ContainerPatternEncodingTermMenuMixin", "ae2.CraftingCPUClusterMixin", "ae2.MEStorageMenuMixin", "ae2.PatternEncodingTermMenuMixin", "ae2.PatternProviderLogicAdvancedMixin", - "ae2.PatternProviderMenuAdvancedMixin", "ae2.PatternProviderLogicDoublingMixin", + "ae2.PatternProviderMenuAdvancedMixin", "ae2.PatternProviderMenuDoublingMixin", - "ae2.AEProcessingPatternMixin", "ae2.accessor.MEStorageMenuAccessor", "ae2.accessor.PatternEncodingTermMenuAccessor", "ae2.accessor.PatternProviderLogicAccessor", @@ -42,7 +42,7 @@ "ae2.accessor.PatternProviderLogicPatternsAccessor", "ae2.accessor.PatternProviderMenuAdvancedAccessor", "ae2WTlib.ContainerUWirelessExPatternTerminalMixin", - "autopattern.CraftingCalculationAccessor", + "autopattern.CraftingProviderListAccessor", "autopattern.CraftingServiceGetProvidersMixin", "autopattern.CraftingTreeNodeAccessor", "autopattern.CraftingTreeNodeMixin",