appliedflux下供应器逻辑

This commit is contained in:
GaLicn 2025-09-24 23:34:14 +08:00
parent aa0c26246b
commit b0684cd354
2 changed files with 84 additions and 20 deletions

View File

@ -155,7 +155,7 @@ dependencies {
compileOnly "curse.maven:ae2-jei-integration-1074338:5748513"
// runtime test
//runtimeOnly "curse.maven:applied-flux-965012:5614830"
runtimeOnly "curse.maven:applied-flux-965012:5614830"
runtimeOnly "de.mari_023:ae2wtlib:19.2.1"
runtimeOnly "curse.maven:jade-324717:5427817"
runtimeOnly "curse.maven:mega-cells-622112:6005043"

View File

@ -33,7 +33,7 @@ import java.util.List;
* - 安装 appflux 优先从 appflux 提供的升级槽读取频道卡
* - 建立到无线主站的网格连接
*/
@Mixin(value = PatternProviderLogic.class, remap = false)
@Mixin(value = PatternProviderLogic.class, priority = 1500, remap = false)
public abstract class PatternProviderLogicCompatMixin implements CompatUpgradeProvider, InterfaceWirelessLinkBridge {
@Unique
@ -51,9 +51,6 @@ public abstract class PatternProviderLogicCompatMixin implements CompatUpgradePr
@Unique
private boolean eap$compatHasInitialized = false;
@Unique
private int eap$compatDelayedInitTicks = 0;
@Final
@Shadow
private PatternProviderLogicHost host;
@ -70,10 +67,21 @@ public abstract class PatternProviderLogicCompatMixin implements CompatUpgradePr
at = @At("TAIL"))
private void eap$compatInit(IManagedGridNode mainNode, PatternProviderLogicHost host, int size, CallbackInfo ci) {
try {
ExtendedAELogger.LOGGER.debug("[样板供应器] 初始化兼容升级槽shouldEnableUpgradeSlots: {}", UpgradeSlotCompat.shouldEnableUpgradeSlots());
ExtendedAELogger.LOGGER.debug("[样板供应器] this instanceof IUpgradeableObject: {}", this instanceof IUpgradeableObject);
if (UpgradeSlotCompat.shouldEnableUpgradeSlots()) {
// 未安装AppliedFlux我们需要提供升级槽
this.eap$compatUpgrades = UpgradeInventories.forMachine(
host.getTerminalIcon().getItem(), 1, this::eap$compatOnUpgradesChanged);
ExtendedAELogger.LOGGER.debug("[样板供应器] 初始化自带升级槽 (未安装 appflux)");
} else {
// 安装了AppliedFlux我们不提供升级槽但保留空的兼容槽用于备用
this.eap$compatUpgrades = UpgradeInventories.empty();
ExtendedAELogger.LOGGER.debug("[样板供应器] 跳过初始化升级槽 (已安装 appflux)");
// 尝试监听AppliedFlux的升级变更
eap$tryHookAppliedFluxUpgradeChanges();
}
} catch (Throwable t) {
ExtendedAELogger.LOGGER.error("[样板供应器] 初始化兼容升级槽失败", t);
@ -93,6 +101,26 @@ public abstract class PatternProviderLogicCompatMixin implements CompatUpgradePr
}
}
/**
* 尝试监听AppliedFlux的升级变更
*/
@Unique
private void eap$tryHookAppliedFluxUpgradeChanges() {
try {
if (this instanceof IUpgradeableObject upgradeableObject) {
IUpgradeInventory afUpgrades = upgradeableObject.getUpgrades();
if (afUpgrades != null) {
ExtendedAELogger.LOGGER.debug("[样板供应器] 尝试监听AppliedFlux升级变更");
// 我们不能直接修改AppliedFlux的升级槽回调但我们可以定期检查
// 这里我们先记录一下实际的检查会在tick中进行
}
}
} catch (Throwable t) {
ExtendedAELogger.LOGGER.debug("[样板供应器] 监听AppliedFlux升级变更失败: {}", t.getMessage());
}
}
@Inject(method = "writeToNBT", at = @At("TAIL"))
private void eap$compatWrite(CompoundTag tag, net.minecraft.core.HolderLookup.Provider registries, CallbackInfo ci) {
try {
@ -109,10 +137,11 @@ public abstract class PatternProviderLogicCompatMixin implements CompatUpgradePr
try {
if (UpgradeSlotCompat.shouldEnableUpgradeSlots()) {
this.eap$compatUpgrades.readFromNBT(tag, "compat_upgrades", registries);
eap$compatLastChannel = -1;
eap$compatHasInitialized = false;
eap$compatInitializeChannelLink();
}
// 无论哪种模式都重新初始化
eap$compatLastChannel = -1;
eap$compatHasInitialized = false;
eap$compatInitializeChannelLink();
} catch (Throwable t) {
ExtendedAELogger.LOGGER.error("[样板供应器] 读取兼容升级失败", t);
}
@ -147,7 +176,8 @@ public abstract class PatternProviderLogicCompatMixin implements CompatUpgradePr
try {
eap$compatLastChannel = -1;
eap$compatHasInitialized = false;
eap$compatDelayedInitTicks = 10;
// 直接初始化不使用延迟
eap$compatInitializeChannelLink();
mainNode.ifPresent((grid, node) -> {
try { grid.getTickManager().wakeDevice(node); } catch (Throwable ignored) {}
});
@ -156,6 +186,7 @@ public abstract class PatternProviderLogicCompatMixin implements CompatUpgradePr
}
}
@Override
@ -189,13 +220,16 @@ public abstract class PatternProviderLogicCompatMixin implements CompatUpgradePr
if (!UpgradeSlotCompat.shouldEnableUpgradeSlots()) {
// 安装了appflux优先使用appflux的升级槽
try {
if ((Object) this instanceof IUpgradeableObject uo) {
upgrades = uo.getUpgrades();
ExtendedAELogger.LOGGER.debug("[样板供应器] 使用 appflux 提供的升级槽: {}", upgrades != null);
// 更安全的方式获取AppliedFlux升级槽
upgrades = eap$getAppliedFluxUpgrades();
if (upgrades != null) {
ExtendedAELogger.LOGGER.debug("[样板供应器] 成功获取 appflux 升级槽,大小: {}", upgrades.size());
} else {
ExtendedAELogger.LOGGER.warn("[样板供应器] 无法获取 appflux 升级槽,回退到兼容槽");
upgrades = this.eap$compatUpgrades;
}
} catch (Throwable t) {
ExtendedAELogger.LOGGER.error("[样板供应器] 获取 appflux 升级槽失败,回退到兼容槽", t);
// 如果获取AppliedFlux升级槽失败回退到我们的兼容槽
upgrades = this.eap$compatUpgrades;
}
} else {
@ -211,12 +245,10 @@ public abstract class PatternProviderLogicCompatMixin implements CompatUpgradePr
if (UpgradeSlotCompat.shouldEnableUpgradeSlots()) {
// 如果我们的槽为空尝试检查是否有AppliedFlux的槽
try {
if ((Object) this instanceof IUpgradeableObject uo) {
IUpgradeInventory backupUpgrades = uo.getUpgrades();
if (backupUpgrades != null && !eap$isUpgradeInventoryEmpty(backupUpgrades)) {
upgrades = backupUpgrades;
ExtendedAELogger.LOGGER.debug("[样板供应器] 使用备用 appflux 升级槽");
}
IUpgradeInventory backupUpgrades = eap$getAppliedFluxUpgrades();
if (backupUpgrades != null && !eap$isUpgradeInventoryEmpty(backupUpgrades)) {
upgrades = backupUpgrades;
ExtendedAELogger.LOGGER.debug("[样板供应器] 使用备用 appflux 升级槽");
}
} catch (Throwable t) {
ExtendedAELogger.LOGGER.debug("[样板供应器] 备用升级槽检查失败: {}", t.getMessage());
@ -269,7 +301,7 @@ public abstract class PatternProviderLogicCompatMixin implements CompatUpgradePr
eap$compatHasInitialized = true;
} else {
eap$compatHasInitialized = false;
eap$compatDelayedInitTicks = Math.max(eap$compatDelayedInitTicks, 5);
// 如果连接失败唤醒设备以便稍后重试
mainNode.ifPresent((grid, node) -> {
try { grid.getTickManager().wakeDevice(node); } catch (Throwable ignored) {}
});
@ -317,6 +349,38 @@ public abstract class PatternProviderLogicCompatMixin implements CompatUpgradePr
return true;
}
/**
* 安全地获取AppliedFlux提供的升级槽
*/
@Unique
private IUpgradeInventory eap$getAppliedFluxUpgrades() {
try {
ExtendedAELogger.LOGGER.debug("[样板供应器] 尝试获取AppliedFlux升级槽");
ExtendedAELogger.LOGGER.debug("[样板供应器] this instanceof IUpgradeableObject: {}", this instanceof IUpgradeableObject);
// 检查当前对象是否实现了IUpgradeableObject接口
if (this instanceof IUpgradeableObject upgradeableObject) {
IUpgradeInventory upgrades = upgradeableObject.getUpgrades();
ExtendedAELogger.LOGGER.debug("[样板供应器] AppliedFlux升级槽: {}", upgrades);
ExtendedAELogger.LOGGER.debug("[样板供应器] 兼容升级槽: {}", this.eap$compatUpgrades);
ExtendedAELogger.LOGGER.debug("[样板供应器] 是否为同一对象: {}", upgrades == this.eap$compatUpgrades);
// 确保这不是我们自己的兼容升级槽
if (upgrades != null && upgrades != this.eap$compatUpgrades) {
ExtendedAELogger.LOGGER.debug("[样板供应器] 成功获取AppliedFlux升级槽大小: {}", upgrades.size());
return upgrades;
} else {
ExtendedAELogger.LOGGER.debug("[样板供应器] AppliedFlux升级槽无效或与兼容槽相同");
}
} else {
ExtendedAELogger.LOGGER.debug("[样板供应器] 当前对象未实现IUpgradeableObject接口");
}
} catch (Throwable t) {
ExtendedAELogger.LOGGER.error("[样板供应器] 获取AppliedFlux升级槽时出错", t);
}
return null;
}
@Override
public IUpgradeInventory eap$getCompatUpgrades() {
return this.eap$compatUpgrades != null ? this.eap$compatUpgrades : UpgradeInventories.empty();