From ac2c524fe8fc337c093d0922ff49a76a3661e75b Mon Sep 17 00:00:00 2001 From: C-H716 <1536152356@qq.com> Date: Mon, 3 Nov 2025 23:53:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=99=BA=E8=83=BD=E5=80=8D?= =?UTF-8?q?=E5=A2=9E=E5=AF=B9=E9=AB=98=E7=BA=A7ae=E7=9A=84=E5=A4=84?= =?UTF-8?q?=E7=90=86=E6=A0=B7=E6=9D=BF=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CraftingSimulationStateMixin.java | 14 +++-- .../util/smartDoubling/PatternScaler.java | 56 ++++++++++++++++++- 2 files changed, 64 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/autopattern/CraftingSimulationStateMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/autopattern/CraftingSimulationStateMixin.java index d3f2d35..8b57eeb 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/autopattern/CraftingSimulationStateMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/autopattern/CraftingSimulationStateMixin.java @@ -5,6 +5,7 @@ import appeng.crafting.inv.CraftingSimulationState; import appeng.crafting.pattern.AEProcessingPattern; import com.extendedae_plus.ae.api.crafting.ScaledProcessingPattern; import com.extendedae_plus.api.smartDoubling.ISmartDoublingAwarePattern; +import com.extendedae_plus.util.smartDoubling.PatternScaler; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -42,6 +43,7 @@ public abstract class CraftingSimulationStateMixin { perCraftLimit = aware.eap$getMultiplierLimit(); // 已经是最大倍率限制 } + // 不允许缩放或者需求为 1 if (!allowScaling || craftsAmount == 1) { crafts.merge(processingPattern, craftsAmount, Long::sum); return; @@ -56,7 +58,7 @@ public abstract class CraftingSimulationStateMixin { } } - /** 无限制:合并倍率并复用 ScaledProcessingPattern 对象 */ + /** 无限制:合并倍率并复用 ScaledProcessingPattern 或 AAE 扩展 */ private void mergeUnlimited(AEProcessingPattern original, long multiplier) { ScaledProcessingPattern existing = scaledCache.get(original); long total = multiplier; @@ -66,23 +68,25 @@ public abstract class CraftingSimulationStateMixin { crafts.remove(existing); } - ScaledProcessingPattern scaled = new ScaledProcessingPattern(original, total); + // 使用 PatternScaler 自动选择原版或 AAE 扩展 + ScaledProcessingPattern scaled = PatternScaler.createScaled(original, total); + scaledCache.put(original, scaled); crafts.put(scaled, 1L); } - /** 有限制:拆分 full + remainder */ + /** 有限制:拆分 full + remainder,并支持原版/AAE 扩展 */ private void splitLimited(AEProcessingPattern original, long totalAmount, int limit) { long fullCrafts = totalAmount / limit; long remainder = totalAmount % limit; if (fullCrafts > 0) { - ScaledProcessingPattern scaledFull = new ScaledProcessingPattern(original, limit); + ScaledProcessingPattern scaledFull = PatternScaler.createScaled(original, limit); crafts.merge(scaledFull, fullCrafts, Long::sum); } if (remainder > 0) { - ScaledProcessingPattern scaledRemainder = new ScaledProcessingPattern(original, remainder); + ScaledProcessingPattern scaledRemainder = PatternScaler.createScaled(original, remainder); crafts.merge(scaledRemainder, 1L, Long::sum); } } diff --git a/src/main/java/com/extendedae_plus/util/smartDoubling/PatternScaler.java b/src/main/java/com/extendedae_plus/util/smartDoubling/PatternScaler.java index 9ccd94d..a0a7d1b 100644 --- a/src/main/java/com/extendedae_plus/util/smartDoubling/PatternScaler.java +++ b/src/main/java/com/extendedae_plus/util/smartDoubling/PatternScaler.java @@ -5,10 +5,63 @@ import appeng.api.stacks.AEFluidKey; import appeng.api.stacks.AEItemKey; import appeng.api.stacks.AEKey; import appeng.crafting.pattern.AEProcessingPattern; +import com.extendedae_plus.ae.api.crafting.ScaledProcessingPattern; +import net.minecraftforge.fml.loading.LoadingModList; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; public final class PatternScaler { + private static final boolean advAvailable; + private static final Constructor advCtor; + private static final Class advIfaceClass; + + static { + boolean available = false; + Constructor ctor = null; + Class iface = null; + + try { + // 尝试加载扩展类 + Class clazz = Class.forName("com.extendedae_plus.ae.api.crafting.ScaledProcessingPatternAdv"); + ctor = clazz.getConstructor(AEProcessingPattern.class, long.class); + + // 加载接口 + iface = Class.forName("net.pedroksl.advanced_ae.common.patterns.AdvPatternDetails"); + + // 检查是否安装 Advanced AE + if (LoadingModList.get() != null && LoadingModList.get().getModFileById("advanced_ae") != null) { + available = true; + } + } catch (Throwable ignored) {} + + advAvailable = available; + advCtor = ctor; + advIfaceClass = iface; + } + private PatternScaler() {} + /** + * 创建缩放样板。 + * 自动支持原版 AE 和可选 AAE 的 AdvProcessingPattern。 + */ + public static ScaledProcessingPattern createScaled(AEProcessingPattern base, long multiplier) { + // 尝试 Advanced AE 扩展 + if (advAvailable && advIfaceClass != null && advCtor != null) { + try { + if (advIfaceClass.isInstance(base)) { + return (ScaledProcessingPattern) advCtor.newInstance(base, multiplier); + } + } catch (InstantiationException | IllegalAccessException | InvocationTargetException ignored) { + // 出错退回普通逻辑 + } + } + + // 回退原版 + return new ScaledProcessingPattern(base, multiplier); + } + /** * 计算基于 limit 的最大允许倍率(单次输出主物品 ≤ limit) */ @@ -42,7 +95,8 @@ public final class PatternScaler { if ("me.ramidzkh.mekae2.ae2.MekanismKey".equals(key.getClass().getName())) { return 1000L; } - } catch (Exception ignored) {} + } catch (Exception ignored) { + } return 1L; } } \ No newline at end of file