From ed336f8aa9441da2013162a75826ba1885d7b6c3 Mon Sep 17 00:00:00 2001 From: C-H716 <1536152356@qq.com> Date: Sat, 11 Oct 2025 02:36:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- .../AdvPatternProviderLogicDoublingMixin.java | 14 +----- .../PatternProviderLogicDoublingMixin.java | 14 +----- .../util/smartDoubling/PatternScaler.java | 45 ++++++++++++++++--- 4 files changed, 44 insertions(+), 31 deletions(-) diff --git a/.gitignore b/.gitignore index 37b19ff..16b0b3c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ build/ out/ classes/ source/ -Applied-Energistics-2-forge-1.20.1/ + # Eclipse *.tmp *.bak diff --git a/src/main/java/com/extendedae_plus/mixin/advancedae/helpers/AdvPatternProviderLogicDoublingMixin.java b/src/main/java/com/extendedae_plus/mixin/advancedae/helpers/AdvPatternProviderLogicDoublingMixin.java index a66fb47..3dbf49f 100644 --- a/src/main/java/com/extendedae_plus/mixin/advancedae/helpers/AdvPatternProviderLogicDoublingMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/advancedae/helpers/AdvPatternProviderLogicDoublingMixin.java @@ -24,7 +24,6 @@ public class AdvPatternProviderLogicDoublingMixin implements ISmartDoublingHolde @Unique private boolean eap$smartDoubling = false; @Unique private int eap$providerScalingLimit = 0; // 供应器级别的上限,0 表示不限制 - @Unique private boolean eap$multiplierDirty = false; // 标记是否需要重新计算 multiplier @Override public boolean eap$getSmartDoubling() { @@ -48,7 +47,6 @@ public class AdvPatternProviderLogicDoublingMixin implements ISmartDoublingHolde @Override public void eap$setProviderSmartDoublingLimit(int limit) { this.eap$providerScalingLimit = limit; - this.eap$multiplierDirty = true; try { ((AdvPatternProviderLogic) (Object) this).updatePatterns(); } catch (Throwable ignored) {} @@ -80,18 +78,10 @@ public class AdvPatternProviderLogicDoublingMixin implements ISmartDoublingHolde for (IPatternDetails details : list) { if (details instanceof AEProcessingPattern proc && proc instanceof ISmartDoublingAwarePattern pattern) { pattern.eap$setAllowScaling(allow); - if (this.eap$multiplierDirty) { - pattern.eap$setMultiplierLimit(getComputedMul(proc, limit)); - } + pattern.eap$setMultiplierLimit(getComputedMul(proc, limit)); } } - // 如果刚刚重建了 multiplier 清除脏标记 - if (this.eap$multiplierDirty) { - this.eap$multiplierDirty = false; - } - } catch (Throwable ignored) { - this.eap$multiplierDirty = true; - } + } catch (Throwable ignored) {} } @Shadow diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicDoublingMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicDoublingMixin.java index e44c9fd..bc14c4c 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicDoublingMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/helpers/PatternProviderLogicDoublingMixin.java @@ -24,7 +24,6 @@ public class PatternProviderLogicDoublingMixin implements ISmartDoublingHolder { @Unique private boolean eap$smartDoubling = false; @Unique private int eap$providerScalingLimit = 0; // 供应器级别的上限,0 表示不限制 - @Unique private boolean eap$multiplierDirty = false; // 标记是否需要重新计算 multiplier @Override public boolean eap$getSmartDoubling() { @@ -48,7 +47,6 @@ public class PatternProviderLogicDoublingMixin implements ISmartDoublingHolder { @Override public void eap$setProviderSmartDoublingLimit(int limit) { this.eap$providerScalingLimit = limit; - this.eap$multiplierDirty = true; try { ((PatternProviderLogic) (Object) this).updatePatterns(); } catch (Throwable ignored) {} @@ -81,18 +79,10 @@ public class PatternProviderLogicDoublingMixin implements ISmartDoublingHolder { for (IPatternDetails details : list) { if (details instanceof AEProcessingPattern proc && proc instanceof ISmartDoublingAwarePattern pattern) { pattern.eap$setAllowScaling(allow); - if (this.eap$multiplierDirty) { - pattern.eap$setMultiplierLimit(getComputedMul(proc, limit)); - } + pattern.eap$setMultiplierLimit(getComputedMul(proc, limit)); } } - // 如果刚刚重建了 multiplier 清除脏标记 - if (this.eap$multiplierDirty) { - this.eap$multiplierDirty = false; - } - } catch (Throwable ignored) { - this.eap$multiplierDirty = true; - } + } catch (Throwable ignored) {} } @Shadow 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 6b5d2be..5f4fcca 100644 --- a/src/main/java/com/extendedae_plus/util/smartDoubling/PatternScaler.java +++ b/src/main/java/com/extendedae_plus/util/smartDoubling/PatternScaler.java @@ -1,5 +1,7 @@ package com.extendedae_plus.util.smartDoubling; +import appeng.api.stacks.AEFluidKey; +import appeng.api.stacks.AEItemKey; import appeng.api.stacks.AEKey; import appeng.api.stacks.GenericStack; import appeng.crafting.pattern.AEProcessingPattern; @@ -106,17 +108,48 @@ public final class PatternScaler { for (var input : proc.getInputs()) { long amt = input.getMultiplier(); - if (amt > 0) { - // 保证翻倍限制至少为 1 - long allowedMul = Math.max(1, limit / amt); - minMul = Math.min(minMul, allowedMul); - } + if (amt <= 0) continue; + + AEKey key = input.getPossibleInputs()[0].what(); + + // 使用统一单位换算 + long unitMultiplier = getUnitMultiplier(key); + long limitInAEUnit = limit * unitMultiplier; + + // 计算该输入允许的倍数 + long allowedMul = limitInAEUnit / amt; + + // 保证至少为 1 + allowedMul = Math.max(1, allowedMul); + + // 取最小值,保证所有输入都不超过 limit + minMul = Math.min(minMul, allowedMul); } if (minMul != Long.MAX_VALUE) { - computedMul = (int) minMul; + computedMul = (int) Math.min(minMul, Integer.MAX_VALUE); } } + return computedMul; } + + /** + * 获取 AEKey 的单位换算系数 + * 物品默认 1,流体默认 1000,其它类型可通过扩展接口提供 + */ + private static long getUnitMultiplier(AEKey key) { + if (key instanceof AEItemKey) return 1L; + if (key instanceof AEFluidKey) return 1000L; + + try { + // 反射判断扩展 Key 类型 + if (key.getClass().getName().equals("me.ramidzkh.mekae2.ae2.MekanismKey")) { + return 1000L; + } + // 根据需要继续增加 + } catch (Exception ignored) {} + + return 1L; // 默认单位 + } }