添加智能倍增对高级ae的处理样板支持

This commit is contained in:
C-H716 2025-11-03 23:53:18 +08:00
parent 61d7980ba6
commit ac2c524fe8
2 changed files with 64 additions and 6 deletions

View File

@ -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);
}
}

View File

@ -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;
}
}