feat: 使用预缓存实体加速器能耗Map减少使用过程中的计算
This commit is contained in:
parent
869ab98af4
commit
ea8168a8c1
|
|
@ -51,7 +51,7 @@ import java.util.List;
|
||||||
* 实体加速器部件,用于加速目标方块实体的 tick 速率,消耗 AE 网络能量,支持加速卡和能量卡升级。
|
* 实体加速器部件,用于加速目标方块实体的 tick 速率,消耗 AE 网络能量,支持加速卡和能量卡升级。
|
||||||
* 灵感来源于 <a href="https://github.com/GilbertzRivi/crazyae2addons">Crazy AE2 Addons</a>。
|
* 灵感来源于 <a href="https://github.com/GilbertzRivi/crazyae2addons">Crazy AE2 Addons</a>。
|
||||||
*/
|
*/
|
||||||
public class EntitySpeedTickerPart extends UpgradeablePart implements IGridTickable, MenuProvider, IUpgradeableObject {
|
public class EntitySpeedTickerPart extends UpgradeablePart implements IGridTickable, MenuProvider, IUpgradeableObject {
|
||||||
public static final ResourceLocation MODEL_BASE = new ResourceLocation(
|
public static final ResourceLocation MODEL_BASE = new ResourceLocation(
|
||||||
ExtendedAEPlus.MODID, "part/entity_speed_ticker_part");
|
ExtendedAEPlus.MODID, "part/entity_speed_ticker_part");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -98,8 +98,8 @@ public class EntitySpeedTickerScreen<C extends EntitySpeedTickerMenu> extends Up
|
||||||
*/
|
*/
|
||||||
private void textData() {
|
private void textData() {
|
||||||
Map<String, Component> textContents = new HashMap<>();
|
Map<String, Component> textContents = new HashMap<>();
|
||||||
if (getMenu().targetBlacklisted) {
|
if (getMenu().targetBlacklisted || !getMenu().getAccelerateEnabled()) {
|
||||||
// 黑名单禁用时的默认显示
|
// 黑名单禁用或加速关闭时的默认显示
|
||||||
textContents.put("enable", Component.translatable("screen.extendedae_plus.entity_speed_ticker.enable"));
|
textContents.put("enable", Component.translatable("screen.extendedae_plus.entity_speed_ticker.enable"));
|
||||||
textContents.put("speed", Component.translatable("screen.extendedae_plus.entity_speed_ticker.speed", 0));
|
textContents.put("speed", Component.translatable("screen.extendedae_plus.entity_speed_ticker.speed", 0));
|
||||||
textContents.put("energy", Component.translatable("screen.extendedae_plus.entity_speed_ticker.energy", Platform.formatPower(0.0, false)));
|
textContents.put("energy", Component.translatable("screen.extendedae_plus.entity_speed_ticker.energy", Platform.formatPower(0.0, false)));
|
||||||
|
|
@ -110,8 +110,8 @@ public class EntitySpeedTickerScreen<C extends EntitySpeedTickerMenu> extends Up
|
||||||
int energyCardCount = getMenu().energyCardCount;
|
int energyCardCount = getMenu().energyCardCount;
|
||||||
double multiplier = getMenu().multiplier;
|
double multiplier = getMenu().multiplier;
|
||||||
int effectiveSpeed = getMenu().effectiveSpeed;
|
int effectiveSpeed = getMenu().effectiveSpeed;
|
||||||
double finalPower = PowerUtils.computeFinalPowerForProduct(effectiveSpeed, energyCardCount);
|
double finalPower = PowerUtils.getCachedPower(effectiveSpeed, energyCardCount);
|
||||||
double remainingRatio = PowerUtils.getRemainingRatio(energyCardCount);
|
double remainingRatio = PowerUtils.getCachedRatio(energyCardCount);
|
||||||
|
|
||||||
textContents.put("enable", getMenu().networkEnergySufficient ? null :
|
textContents.put("enable", getMenu().networkEnergySufficient ? null :
|
||||||
Component.translatable("screen.extendedae_plus.entity_speed_ticker.warning_network_energy_insufficient"));
|
Component.translatable("screen.extendedae_plus.entity_speed_ticker.warning_network_energy_insufficient"));
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package com.extendedae_plus.compat;
|
package com.extendedae_plus.compat;
|
||||||
|
|
||||||
import com.extendedae_plus.util.ExtendedAELogger;
|
import com.extendedae_plus.util.Logger;
|
||||||
import net.minecraftforge.fml.ModList;
|
import net.minecraftforge.fml.ModList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -13,28 +13,28 @@ public class CompatibilityTest {
|
||||||
* 测试模组兼容性检测
|
* 测试模组兼容性检测
|
||||||
*/
|
*/
|
||||||
public static void testCompatibility() {
|
public static void testCompatibility() {
|
||||||
ExtendedAELogger.LOGGER.info("=== ExtendedAE_Plus 兼容性测试开始 ===");
|
Logger.EAP$LOGGER.info("=== ExtendedAE_Plus 兼容性测试开始 ===");
|
||||||
|
|
||||||
// 测试appflux模组检测
|
// 测试appflux模组检测
|
||||||
boolean appfluxExists = ModList.get().isLoaded("appflux");
|
boolean appfluxExists = ModList.get().isLoaded("appflux");
|
||||||
ExtendedAELogger.LOGGER.info("ExtendedAE-appflux模组检测结果: {}", appfluxExists ? "存在" : "不存在");
|
Logger.EAP$LOGGER.info("ExtendedAE-appflux模组检测结果: {}", appfluxExists ? "存在" : "不存在");
|
||||||
|
|
||||||
// 测试升级卡槽功能启用状态
|
// 测试升级卡槽功能启用状态
|
||||||
boolean shouldEnableUpgrades = UpgradeSlotCompat.shouldEnableUpgradeSlots();
|
boolean shouldEnableUpgrades = UpgradeSlotCompat.shouldEnableUpgradeSlots();
|
||||||
ExtendedAELogger.LOGGER.info("升级卡槽功能启用状态: {}", shouldEnableUpgrades ? "启用" : "禁用");
|
Logger.EAP$LOGGER.info("升级卡槽功能启用状态: {}", shouldEnableUpgrades ? "启用" : "禁用");
|
||||||
|
|
||||||
// 测试Screen升级面板添加状态
|
// 测试Screen升级面板添加状态
|
||||||
boolean shouldAddPanel = UpgradeSlotCompat.shouldAddUpgradePanelToScreen();
|
boolean shouldAddPanel = UpgradeSlotCompat.shouldAddUpgradePanelToScreen();
|
||||||
ExtendedAELogger.LOGGER.info("Screen升级面板添加状态: {}", shouldAddPanel ? "启用" : "禁用");
|
Logger.EAP$LOGGER.info("Screen升级面板添加状态: {}", shouldAddPanel ? "启用" : "禁用");
|
||||||
|
|
||||||
// 输出兼容性策略
|
// 输出兼容性策略
|
||||||
if (appfluxExists) {
|
if (appfluxExists) {
|
||||||
ExtendedAELogger.LOGGER.info("兼容性策略: 检测到ExtendedAE-appflux模组,将使用其升级卡槽功能");
|
Logger.EAP$LOGGER.info("兼容性策略: 检测到ExtendedAE-appflux模组,将使用其升级卡槽功能");
|
||||||
} else {
|
} else {
|
||||||
ExtendedAELogger.LOGGER.info("兼容性策略: 未检测到ExtendedAE-appflux模组,将使用我们自己的升级卡槽功能");
|
Logger.EAP$LOGGER.info("兼容性策略: 未检测到ExtendedAE-appflux模组,将使用我们自己的升级卡槽功能");
|
||||||
}
|
}
|
||||||
|
|
||||||
ExtendedAELogger.LOGGER.info("=== ExtendedAE_Plus 兼容性测试完成 ===");
|
Logger.EAP$LOGGER.info("=== ExtendedAE_Plus 兼容性测试完成 ===");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ import appeng.helpers.patternprovider.PatternProviderLogicHost;
|
||||||
import appeng.menu.AEBaseMenu;
|
import appeng.menu.AEBaseMenu;
|
||||||
import appeng.menu.SlotSemantics;
|
import appeng.menu.SlotSemantics;
|
||||||
import appeng.menu.ToolboxMenu;
|
import appeng.menu.ToolboxMenu;
|
||||||
import com.extendedae_plus.util.ExtendedAELogger;
|
import com.extendedae_plus.util.Logger;
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
import net.minecraft.world.inventory.Slot;
|
import net.minecraft.world.inventory.Slot;
|
||||||
import net.minecraftforge.fml.ModList;
|
import net.minecraftforge.fml.ModList;
|
||||||
|
|
@ -83,7 +83,7 @@ public class UpgradeSlotCompat {
|
||||||
setupUpgradesMethod.setAccessible(true);
|
setupUpgradesMethod.setAccessible(true);
|
||||||
setupUpgradesMethod.invoke(menu, upgradeableHost.getUpgrades());
|
setupUpgradesMethod.invoke(menu, upgradeableHost.getUpgrades());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
ExtendedAELogger.LOGGER.error("反射调用setupUpgrades失败", e);
|
Logger.EAP$LOGGER.error("反射调用setupUpgrades失败", e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -94,7 +94,7 @@ public class UpgradeSlotCompat {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
ExtendedAELogger.LOGGER.error("初始化PatternProviderMenu升级功能时出错", e);
|
Logger.EAP$LOGGER.error("初始化PatternProviderMenu升级功能时出错", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -162,13 +162,13 @@ public class UpgradeSlotCompat {
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} catch (Exception e2) {
|
} catch (Exception e2) {
|
||||||
ExtendedAELogger.LOGGER.error("反射调用widgets方法失败", e2);
|
Logger.EAP$LOGGER.error("反射调用widgets方法失败", e2);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
ExtendedAELogger.LOGGER.error("为PatternProviderScreen添加升级面板时出错", e);
|
Logger.EAP$LOGGER.error("为PatternProviderScreen添加升级面板时出错", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -187,7 +187,7 @@ public class UpgradeSlotCompat {
|
||||||
list.addAll(appeng.api.upgrades.Upgrades.getTooltipLinesForMachine(upgrades.getUpgradableItem()));
|
list.addAll(appeng.api.upgrades.Upgrades.getTooltipLinesForMachine(upgrades.getUpgradableItem()));
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
ExtendedAELogger.LOGGER.error("获取兼容升级列表时出错", e);
|
Logger.EAP$LOGGER.error("获取兼容升级列表时出错", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
return list;
|
return list;
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
import static com.extendedae_plus.util.ExtendedAELogger.LOGGER;
|
import static com.extendedae_plus.util.Logger.EAP$LOGGER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 为高级ae样板供应器界面添加“高级阻挡模式”按钮。
|
* 为高级ae样板供应器界面添加“高级阻挡模式”按钮。
|
||||||
|
|
@ -56,7 +56,7 @@ public abstract class AdvPatternProviderScreenMixin extends AEBaseScreen<AdvPatt
|
||||||
this.eap$AdvancedBlockingEnabled = sync.eap$getAdvancedBlockingSynced();
|
this.eap$AdvancedBlockingEnabled = sync.eap$getAdvancedBlockingSynced();
|
||||||
}
|
}
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
LOGGER.error("Error initializing advanced sync", t);
|
EAP$LOGGER.error("Error initializing advanced sync", t);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 使用 SettingToggleButton<YesNo> 的外观(原版图标),但自定义悬停描述为“智能阻挡”
|
// 使用 SettingToggleButton<YesNo> 的外观(原版图标),但自定义悬停描述为“智能阻挡”
|
||||||
|
|
@ -89,7 +89,7 @@ public abstract class AdvPatternProviderScreenMixin extends AEBaseScreen<AdvPatt
|
||||||
this.eap$SmartDoublingEnabled = sync2.eap$getSmartDoublingSynced();
|
this.eap$SmartDoublingEnabled = sync2.eap$getSmartDoublingSynced();
|
||||||
}
|
}
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
LOGGER.error("Error initializing smart doubling sync", t);
|
EAP$LOGGER.error("Error initializing smart doubling sync", t);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.eap$SmartDoublingToggle = new SettingToggleButton<>(
|
this.eap$SmartDoublingToggle = new SettingToggleButton<>(
|
||||||
|
|
@ -139,7 +139,7 @@ public abstract class AdvPatternProviderScreenMixin extends AEBaseScreen<AdvPatt
|
||||||
try {
|
try {
|
||||||
((IExPatternButtonsAccessor) this).eap$updateButtonsLayout();
|
((IExPatternButtonsAccessor) this).eap$updateButtonsLayout();
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
LOGGER.debug("[EAP] updateButtonsLayout skipped: {}", t.toString());
|
EAP$LOGGER.debug("[EAP] updateButtonsLayout skipped: {}", t.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
import static com.extendedae_plus.util.ExtendedAELogger.LOGGER;
|
import static com.extendedae_plus.util.Logger.EAP$LOGGER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 为高级ae样板供应器界面添加“高级阻挡模式”按钮。
|
* 为高级ae样板供应器界面添加“高级阻挡模式”按钮。
|
||||||
|
|
@ -56,7 +56,7 @@ public abstract class SmallAdvPatternProviderScreenMixin extends AEBaseScreen<Sm
|
||||||
this.eap$AdvancedBlockingEnabled = sync.eap$getAdvancedBlockingSynced();
|
this.eap$AdvancedBlockingEnabled = sync.eap$getAdvancedBlockingSynced();
|
||||||
}
|
}
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
LOGGER.error("Error initializing advanced sync", t);
|
EAP$LOGGER.error("Error initializing advanced sync", t);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 使用 SettingToggleButton<YesNo> 的外观(原版图标),但自定义悬停描述为“智能阻挡”
|
// 使用 SettingToggleButton<YesNo> 的外观(原版图标),但自定义悬停描述为“智能阻挡”
|
||||||
|
|
@ -89,7 +89,7 @@ public abstract class SmallAdvPatternProviderScreenMixin extends AEBaseScreen<Sm
|
||||||
this.eap$SmartDoublingEnabled = sync2.eap$getSmartDoublingSynced();
|
this.eap$SmartDoublingEnabled = sync2.eap$getSmartDoublingSynced();
|
||||||
}
|
}
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
LOGGER.error("Error initializing smart doubling sync", t);
|
EAP$LOGGER.error("Error initializing smart doubling sync", t);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.eap$SmartDoublingToggle = new SettingToggleButton<>(
|
this.eap$SmartDoublingToggle = new SettingToggleButton<>(
|
||||||
|
|
@ -139,7 +139,7 @@ public abstract class SmallAdvPatternProviderScreenMixin extends AEBaseScreen<Sm
|
||||||
try {
|
try {
|
||||||
((IExPatternButtonsAccessor) this).eap$updateButtonsLayout();
|
((IExPatternButtonsAccessor) this).eap$updateButtonsLayout();
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
LOGGER.debug("[EAP] updateButtonsLayout skipped: {}", t.toString());
|
EAP$LOGGER.debug("[EAP] updateButtonsLayout skipped: {}", t.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.StreamSupport;
|
import java.util.stream.StreamSupport;
|
||||||
|
|
||||||
import static com.extendedae_plus.util.ExtendedAELogger.LOGGER;
|
import static com.extendedae_plus.util.Logger.EAP$LOGGER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 注入 CraftingTreeProcess 构造器尾部:将 AEProcessingPattern 替换为 ScaledProcessingPattern
|
* 注入 CraftingTreeProcess 构造器尾部:将 AEProcessingPattern 替换为 ScaledProcessingPattern
|
||||||
|
|
@ -92,7 +92,7 @@ public abstract class CraftingTreeProcessMixin {
|
||||||
var scaled = PatternScaler.scale(proc, parentTarget, perProvider);
|
var scaled = PatternScaler.scale(proc, parentTarget, perProvider);
|
||||||
return scaled != null ? scaled : original;
|
return scaled != null ? scaled : original;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LOGGER.warn("构建倍增样板出错", e);
|
EAP$LOGGER.warn("构建倍增样板出错", e);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return original;
|
return original;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
import static com.extendedae_plus.util.ExtendedAELogger.LOGGER;
|
import static com.extendedae_plus.util.Logger.EAP$LOGGER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 为 AE2 原版样板供应器界面添加“高级阻挡模式”按钮。
|
* 为 AE2 原版样板供应器界面添加“高级阻挡模式”按钮。
|
||||||
|
|
@ -56,7 +56,7 @@ public abstract class PatternProviderScreenMixin<C extends PatternProviderMenu>
|
||||||
this.eap$AdvancedBlockingEnabled = sync.eap$getAdvancedBlockingSynced();
|
this.eap$AdvancedBlockingEnabled = sync.eap$getAdvancedBlockingSynced();
|
||||||
}
|
}
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
LOGGER.error("Error initializing advanced sync", t);
|
EAP$LOGGER.error("Error initializing advanced sync", t);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 使用 SettingToggleButton<YesNo> 的外观(原版图标),但自定义悬停描述为“智能阻挡”
|
// 使用 SettingToggleButton<YesNo> 的外观(原版图标),但自定义悬停描述为“智能阻挡”
|
||||||
|
|
@ -89,7 +89,7 @@ public abstract class PatternProviderScreenMixin<C extends PatternProviderMenu>
|
||||||
this.eap$SmartDoublingEnabled = sync2.eap$getSmartDoublingSynced();
|
this.eap$SmartDoublingEnabled = sync2.eap$getSmartDoublingSynced();
|
||||||
}
|
}
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
LOGGER.error("Error initializing smart doubling sync", t);
|
EAP$LOGGER.error("Error initializing smart doubling sync", t);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.eap$SmartDoublingToggle = new SettingToggleButton<>(
|
this.eap$SmartDoublingToggle = new SettingToggleButton<>(
|
||||||
|
|
@ -139,7 +139,7 @@ public abstract class PatternProviderScreenMixin<C extends PatternProviderMenu>
|
||||||
try {
|
try {
|
||||||
((IExPatternButtonsAccessor) this).eap$updateButtonsLayout();
|
((IExPatternButtonsAccessor) this).eap$updateButtonsLayout();
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
LOGGER.debug("[EAP] updateButtonsLayout skipped: {}", t.toString());
|
EAP$LOGGER.debug("[EAP] updateButtonsLayout skipped: {}", t.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import appeng.menu.AEBaseMenu;
|
||||||
import appeng.menu.ToolboxMenu;
|
import appeng.menu.ToolboxMenu;
|
||||||
import appeng.menu.implementations.PatternProviderMenu;
|
import appeng.menu.implementations.PatternProviderMenu;
|
||||||
import com.extendedae_plus.compat.UpgradeSlotCompat;
|
import com.extendedae_plus.compat.UpgradeSlotCompat;
|
||||||
|
import com.extendedae_plus.util.Logger;
|
||||||
import net.minecraft.world.entity.player.Inventory;
|
import net.minecraft.world.entity.player.Inventory;
|
||||||
import net.minecraft.world.inventory.MenuType;
|
import net.minecraft.world.inventory.MenuType;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
|
@ -43,7 +44,7 @@ public abstract class PatternProviderCompatMixin extends AEBaseMenu implements U
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// 静默处理异常,确保不会因为升级功能导致崩溃
|
// 静默处理异常,确保不会因为升级功能导致崩溃
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("PatternProviderMenu兼容性升级初始化失败", e);
|
Logger.EAP$LOGGER.error("PatternProviderMenu兼容性升级初始化失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import com.extendedae_plus.ae.wireless.endpoint.GenericNodeEndpointImpl;
|
||||||
import com.extendedae_plus.api.bridge.IInterfaceWirelessLinkBridge;
|
import com.extendedae_plus.api.bridge.IInterfaceWirelessLinkBridge;
|
||||||
import com.extendedae_plus.compat.UpgradeSlotCompat;
|
import com.extendedae_plus.compat.UpgradeSlotCompat;
|
||||||
import com.extendedae_plus.init.ModItems;
|
import com.extendedae_plus.init.ModItems;
|
||||||
|
import com.extendedae_plus.util.Logger;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
|
|
@ -75,7 +76,7 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj
|
||||||
eap$compatInitializeChannelLink();
|
eap$compatInitializeChannelLink();
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("兼容性升级变更处理失败", e);
|
Logger.EAP$LOGGER.error("兼容性升级变更处理失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -84,14 +85,14 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj
|
||||||
private void eap$onAppfluxUpgradesChanged(CallbackInfo ci) {
|
private void eap$onAppfluxUpgradesChanged(CallbackInfo ci) {
|
||||||
try {
|
try {
|
||||||
if (UpgradeSlotCompat.shouldEnableChannelCard()) {
|
if (UpgradeSlotCompat.shouldEnableChannelCard()) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("监听到appflux升级变化,处理频道卡");
|
Logger.EAP$LOGGER.info("监听到appflux升级变化,处理频道卡");
|
||||||
// 升级变更,重置并尝试初始化频道卡
|
// 升级变更,重置并尝试初始化频道卡
|
||||||
eap$compatLastChannel = -1;
|
eap$compatLastChannel = -1;
|
||||||
eap$compatHasInitialized = false;
|
eap$compatHasInitialized = false;
|
||||||
eap$compatInitializeChannelLink();
|
eap$compatInitializeChannelLink();
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("监听appflux升级变化失败", e);
|
Logger.EAP$LOGGER.error("监听appflux升级变化失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -99,12 +100,12 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj
|
||||||
at = @At("TAIL"))
|
at = @At("TAIL"))
|
||||||
private void eap$compatInitUpgrades(IManagedGridNode mainNode, PatternProviderLogicHost host, int patternInventorySize, CallbackInfo ci) {
|
private void eap$compatInitUpgrades(IManagedGridNode mainNode, PatternProviderLogicHost host, int patternInventorySize, CallbackInfo ci) {
|
||||||
try {
|
try {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("兼容性PatternProviderLogic初始化被调用");
|
Logger.EAP$LOGGER.info("兼容性PatternProviderLogic初始化被调用");
|
||||||
|
|
||||||
boolean upgradeSlots = UpgradeSlotCompat.shouldEnableUpgradeSlots();
|
boolean upgradeSlots = UpgradeSlotCompat.shouldEnableUpgradeSlots();
|
||||||
boolean channelCard = UpgradeSlotCompat.shouldEnableChannelCard();
|
boolean channelCard = UpgradeSlotCompat.shouldEnableChannelCard();
|
||||||
|
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("升级槽功能: {}, 频道卡功能: {}", upgradeSlots, channelCard);
|
Logger.EAP$LOGGER.info("升级槽功能: {}, 频道卡功能: {}", upgradeSlots, channelCard);
|
||||||
|
|
||||||
if (upgradeSlots) {
|
if (upgradeSlots) {
|
||||||
// 只有在升级槽功能启用时才创建升级槽
|
// 只有在升级槽功能启用时才创建升级槽
|
||||||
|
|
@ -113,15 +114,15 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj
|
||||||
1,
|
1,
|
||||||
this::eap$compatOnUpgradesChanged
|
this::eap$compatOnUpgradesChanged
|
||||||
);
|
);
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("创建了完整的升级槽");
|
Logger.EAP$LOGGER.info("创建了完整的升级槽");
|
||||||
} else if (channelCard) {
|
} else if (channelCard) {
|
||||||
// 如果装了appflux,我们不创建自己的升级槽,而是监听appflux的升级槽
|
// 如果装了appflux,我们不创建自己的升级槽,而是监听appflux的升级槽
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("装了appflux,将监听其升级槽来处理频道卡");
|
Logger.EAP$LOGGER.info("装了appflux,将监听其升级槽来处理频道卡");
|
||||||
} else {
|
} else {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("跳过升级槽创建");
|
Logger.EAP$LOGGER.info("跳过升级槽创建");
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("兼容性升级初始化失败", e);
|
Logger.EAP$LOGGER.error("兼容性升级初始化失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -132,7 +133,7 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj
|
||||||
this.eap$compatUpgrades.writeToNBT(tag, "compat_upgrades");
|
this.eap$compatUpgrades.writeToNBT(tag, "compat_upgrades");
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("兼容性升级保存失败", e);
|
Logger.EAP$LOGGER.error("兼容性升级保存失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -149,7 +150,7 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("兼容性升级加载失败", e);
|
Logger.EAP$LOGGER.error("兼容性升级加载失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -164,7 +165,7 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("兼容性升级掉落失败", e);
|
Logger.EAP$LOGGER.error("兼容性升级掉落失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -175,7 +176,7 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj
|
||||||
this.eap$compatUpgrades.clear();
|
this.eap$compatUpgrades.clear();
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("兼容性升级清理失败", e);
|
Logger.EAP$LOGGER.error("兼容性升级清理失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -187,7 +188,7 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj
|
||||||
} else {
|
} else {
|
||||||
// 装了appflux时,这个方法不应该被调用,因为appflux的Mixin会覆盖它
|
// 装了appflux时,这个方法不应该被调用,因为appflux的Mixin会覆盖它
|
||||||
// 但是为了安全起见,返回空的升级槽
|
// 但是为了安全起见,返回空的升级槽
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.debug("装了appflux时getUpgrades被调用,这不应该发生");
|
Logger.EAP$LOGGER.debug("装了appflux时getUpgrades被调用,这不应该发生");
|
||||||
return UpgradeInventories.empty();
|
return UpgradeInventories.empty();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -203,7 +204,7 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj
|
||||||
eap$compatLink.updateStatus();
|
eap$compatLink.updateStatus();
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("兼容性无线链接更新失败", e);
|
Logger.EAP$LOGGER.error("兼容性无线链接更新失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -249,10 +250,10 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj
|
||||||
if (this instanceof IUpgradeableObject) {
|
if (this instanceof IUpgradeableObject) {
|
||||||
IUpgradeableObject upgradeableThis = (IUpgradeableObject) this;
|
IUpgradeableObject upgradeableThis = (IUpgradeableObject) this;
|
||||||
upgrades = upgradeableThis.getUpgrades();
|
upgrades = upgradeableThis.getUpgrades();
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.debug("从appflux获取到升级槽: {}", upgrades != null);
|
Logger.EAP$LOGGER.debug("从appflux获取到升级槽: {}", upgrades != null);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("获取appflux升级槽失败", e);
|
Logger.EAP$LOGGER.error("获取appflux升级槽失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -261,7 +262,7 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj
|
||||||
if (!stack.isEmpty() && stack.getItem() == ModItems.CHANNEL_CARD.get()) {
|
if (!stack.isEmpty() && stack.getItem() == ModItems.CHANNEL_CARD.get()) {
|
||||||
channel = ChannelCardItem.getChannel(stack);
|
channel = ChannelCardItem.getChannel(stack);
|
||||||
found = true;
|
found = true;
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("找到频道卡,频道: {}", channel);
|
Logger.EAP$LOGGER.info("找到频道卡,频道: {}", channel);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -297,7 +298,7 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj
|
||||||
} catch (Throwable ignored) {}
|
} catch (Throwable ignored) {}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("兼容性频道链接初始化失败", e);
|
Logger.EAP$LOGGER.error("兼容性频道链接初始化失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -321,7 +322,7 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj
|
||||||
return eap$compatLink != null && eap$compatLink.isConnected();
|
return eap$compatLink != null && eap$compatLink.isConnected();
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("检查兼容性无线连接状态失败", e);
|
Logger.EAP$LOGGER.error("检查兼容性无线连接状态失败", e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -370,7 +371,7 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("兼容性延迟初始化失败", e);
|
Logger.EAP$LOGGER.error("兼容性延迟初始化失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -390,7 +391,7 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj
|
||||||
});
|
});
|
||||||
} catch (Throwable ignored) {}
|
} catch (Throwable ignored) {}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("兼容性主节点状态变更处理失败", e);
|
Logger.EAP$LOGGER.error("兼容性主节点状态变更处理失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import appeng.core.localization.GuiText;
|
||||||
import appeng.menu.SlotSemantics;
|
import appeng.menu.SlotSemantics;
|
||||||
import appeng.menu.implementations.PatternProviderMenu;
|
import appeng.menu.implementations.PatternProviderMenu;
|
||||||
import com.extendedae_plus.compat.UpgradeSlotCompat;
|
import com.extendedae_plus.compat.UpgradeSlotCompat;
|
||||||
|
import com.extendedae_plus.util.Logger;
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
import net.minecraft.world.entity.player.Inventory;
|
import net.minecraft.world.entity.player.Inventory;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
|
@ -38,7 +39,7 @@ public abstract class PatternProviderScreenCompatMixin<C extends PatternProvider
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// 静默处理异常,确保不会因为升级功能导致崩溃
|
// 静默处理异常,确保不会因为升级功能导致崩溃
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("PatternProviderScreen兼容性升级面板初始化失败", e);
|
Logger.EAP$LOGGER.error("PatternProviderScreen兼容性升级面板初始化失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -58,7 +59,7 @@ public abstract class PatternProviderScreenCompatMixin<C extends PatternProvider
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("直接添加升级面板失败", e);
|
Logger.EAP$LOGGER.error("直接添加升级面板失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -75,7 +76,7 @@ public abstract class PatternProviderScreenCompatMixin<C extends PatternProvider
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("获取兼容升级列表失败", e);
|
Logger.EAP$LOGGER.error("获取兼容升级列表失败", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
return list;
|
return list;
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ import java.lang.reflect.Method;
|
||||||
import java.util.concurrent.CountDownLatch;
|
import java.util.concurrent.CountDownLatch;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
import static com.extendedae_plus.util.ExtendedAELogger.LOGGER;
|
import static com.extendedae_plus.util.Logger.EAP$LOGGER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 为 AE2 石英切割刀添加:潜行 + 右键 指向世界中的方块/部件(如线缆)时,复制其名称到剪贴板。
|
* 为 AE2 石英切割刀添加:潜行 + 右键 指向世界中的方块/部件(如线缆)时,复制其名称到剪贴板。
|
||||||
|
|
@ -196,10 +196,10 @@ public abstract class QuartzCuttingKnifeItemMixin {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (ClassNotFoundException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
LOGGER.info("GregTech CEu 类未找到,跳过配方翻译处理");
|
EAP$LOGGER.info("GregTech CEu 类未找到,跳过配方翻译处理");
|
||||||
return null; // GTCEu 不可用
|
return null; // GTCEu 不可用
|
||||||
} catch (NoSuchFieldException | NoSuchMethodException | IllegalAccessException | java.lang.reflect.InvocationTargetException e) {
|
} catch (NoSuchFieldException | NoSuchMethodException | IllegalAccessException | java.lang.reflect.InvocationTargetException e) {
|
||||||
LOGGER.error("处理 GTCEu 配方翻译失败: {}", e.getMessage());
|
EAP$LOGGER.error("处理 GTCEu 配方翻译失败: {}", e.getMessage());
|
||||||
return null; // 反射失败
|
return null; // 反射失败
|
||||||
}
|
}
|
||||||
return null; // 非 GTCEu 方块实体
|
return null; // 非 GTCEu 方块实体
|
||||||
|
|
@ -248,7 +248,7 @@ public abstract class QuartzCuttingKnifeItemMixin {
|
||||||
try {
|
try {
|
||||||
latch.await();
|
latch.await();
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
LOGGER.error("剪贴板复制线程中断: {}", e.getMessage());
|
EAP$LOGGER.error("剪贴板复制线程中断: {}", e.getMessage());
|
||||||
}
|
}
|
||||||
return result.get();
|
return result.get();
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
import static com.extendedae_plus.util.ExtendedAELogger.LOGGER;
|
import static com.extendedae_plus.util.Logger.EAP$LOGGER;
|
||||||
|
|
||||||
@Mixin(PatternProviderMenu.class)
|
@Mixin(PatternProviderMenu.class)
|
||||||
public abstract class PatternProviderMenuAdvancedMixin implements IPatternProviderMenuAdvancedSync {
|
public abstract class PatternProviderMenuAdvancedMixin implements IPatternProviderMenuAdvancedSync {
|
||||||
|
|
@ -61,7 +61,7 @@ public abstract class PatternProviderMenuAdvancedMixin implements IPatternProvid
|
||||||
this.eap$AdvancedBlocking = holder.eap$getAdvancedBlocking();
|
this.eap$AdvancedBlocking = holder.eap$getAdvancedBlocking();
|
||||||
}
|
}
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
LOGGER.error("Error initializing advanced sync", t);
|
EAP$LOGGER.error("Error initializing advanced sync", t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
import static com.extendedae_plus.util.ExtendedAELogger.LOGGER;
|
import static com.extendedae_plus.util.Logger.EAP$LOGGER;
|
||||||
|
|
||||||
@Mixin(PatternProviderMenu.class)
|
@Mixin(PatternProviderMenu.class)
|
||||||
public abstract class PatternProviderMenuDoublingMixin implements IPatternProviderMenuDoublingSync {
|
public abstract class PatternProviderMenuDoublingMixin implements IPatternProviderMenuDoublingSync {
|
||||||
|
|
@ -47,7 +47,7 @@ public abstract class PatternProviderMenuDoublingMixin implements IPatternProvid
|
||||||
this.eap$SmartDoubling = holder.eap$getSmartDoubling();
|
this.eap$SmartDoubling = holder.eap$getSmartDoubling();
|
||||||
}
|
}
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
LOGGER.error("Error initializing smart doubling sync", t);
|
EAP$LOGGER.error("Error initializing smart doubling sync", t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -59,7 +59,7 @@ public abstract class PatternProviderMenuDoublingMixin implements IPatternProvid
|
||||||
this.eap$SmartDoubling = holder.eap$getSmartDoubling();
|
this.eap$SmartDoubling = holder.eap$getSmartDoubling();
|
||||||
}
|
}
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
LOGGER.error("Error initializing smart doubling sync", t);
|
EAP$LOGGER.error("Error initializing smart doubling sync", t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ import com.extendedae_plus.ae.wireless.WirelessSlaveLink;
|
||||||
import com.extendedae_plus.ae.wireless.endpoint.GenericNodeEndpointImpl;
|
import com.extendedae_plus.ae.wireless.endpoint.GenericNodeEndpointImpl;
|
||||||
import com.extendedae_plus.api.bridge.IInterfaceWirelessLinkBridge;
|
import com.extendedae_plus.api.bridge.IInterfaceWirelessLinkBridge;
|
||||||
import com.extendedae_plus.init.ModItems;
|
import com.extendedae_plus.init.ModItems;
|
||||||
import com.extendedae_plus.util.ExtendedAELogger;
|
import com.extendedae_plus.util.Logger;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Unique;
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
|
|
@ -86,14 +86,14 @@ public abstract class IOBusPartChannelCardMixin implements IInterfaceWirelessLin
|
||||||
}
|
}
|
||||||
eap$lastChannel = channel;
|
eap$lastChannel = channel;
|
||||||
|
|
||||||
ExtendedAELogger.LOGGER.debug("[服务端] IOBus 初始化频道链接: found={}, channel={}", found, channel);
|
Logger.EAP$LOGGER.debug("[服务端] IOBus 初始化频道链接: found={}, channel={}", found, channel);
|
||||||
|
|
||||||
if (!found) {
|
if (!found) {
|
||||||
// 无频道卡则断开
|
// 无频道卡则断开
|
||||||
if (eap$link != null) {
|
if (eap$link != null) {
|
||||||
eap$link.setFrequency(0L);
|
eap$link.setFrequency(0L);
|
||||||
eap$link.updateStatus();
|
eap$link.updateStatus();
|
||||||
ExtendedAELogger.LOGGER.debug("[服务端] IOBus 断开频道链接");
|
Logger.EAP$LOGGER.debug("[服务端] IOBus 断开频道链接");
|
||||||
// 立即通知客户端状态变化(断开连接无需延迟)
|
// 立即通知客户端状态变化(断开连接无需延迟)
|
||||||
((appeng.parts.AEBasePart)(Object)this).getHost().markForUpdate();
|
((appeng.parts.AEBasePart)(Object)this).getHost().markForUpdate();
|
||||||
}
|
}
|
||||||
|
|
@ -106,17 +106,17 @@ public abstract class IOBusPartChannelCardMixin implements IInterfaceWirelessLin
|
||||||
() -> ((IActionHost)(Object)this).getActionableNode()
|
() -> ((IActionHost)(Object)this).getActionableNode()
|
||||||
);
|
);
|
||||||
eap$link = new WirelessSlaveLink(endpoint);
|
eap$link = new WirelessSlaveLink(endpoint);
|
||||||
ExtendedAELogger.LOGGER.debug("[服务端] IOBus 创建新的无线链接");
|
Logger.EAP$LOGGER.debug("[服务端] IOBus 创建新的无线链接");
|
||||||
}
|
}
|
||||||
|
|
||||||
eap$link.setFrequency(channel);
|
eap$link.setFrequency(channel);
|
||||||
eap$link.updateStatus();
|
eap$link.updateStatus();
|
||||||
ExtendedAELogger.LOGGER.debug("[服务端] IOBus 设置频道: {}, 连接状态: {}", channel, eap$link.isConnected());
|
Logger.EAP$LOGGER.debug("[服务端] IOBus 设置频道: {}, 连接状态: {}", channel, eap$link.isConnected());
|
||||||
|
|
||||||
// 通知客户端状态变化
|
// 通知客户端状态变化
|
||||||
((appeng.parts.AEBasePart)(Object)this).getHost().markForUpdate();
|
((appeng.parts.AEBasePart)(Object)this).getHost().markForUpdate();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
ExtendedAELogger.LOGGER.error("[服务端] IOBus 初始化频道链接失败", e);
|
Logger.EAP$LOGGER.error("[服务端] IOBus 初始化频道链接失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ import com.extendedae_plus.ae.wireless.WirelessSlaveLink;
|
||||||
import com.extendedae_plus.ae.wireless.endpoint.GenericNodeEndpointImpl;
|
import com.extendedae_plus.ae.wireless.endpoint.GenericNodeEndpointImpl;
|
||||||
import com.extendedae_plus.api.bridge.IInterfaceWirelessLinkBridge;
|
import com.extendedae_plus.api.bridge.IInterfaceWirelessLinkBridge;
|
||||||
import com.extendedae_plus.init.ModItems;
|
import com.extendedae_plus.init.ModItems;
|
||||||
import com.extendedae_plus.util.ExtendedAELogger;
|
import com.extendedae_plus.util.Logger;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Unique;
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
|
|
@ -84,13 +84,13 @@ public abstract class StorageBusPartChannelCardMixin implements IInterfaceWirele
|
||||||
}
|
}
|
||||||
eap$lastChannel = channel;
|
eap$lastChannel = channel;
|
||||||
|
|
||||||
ExtendedAELogger.LOGGER.debug("[服务端] StorageBus 初始化频道链接: found={}, channel={}", found, channel);
|
Logger.EAP$LOGGER.debug("[服务端] StorageBus 初始化频道链接: found={}, channel={}", found, channel);
|
||||||
|
|
||||||
if (!found) {
|
if (!found) {
|
||||||
if (eap$link != null) {
|
if (eap$link != null) {
|
||||||
eap$link.setFrequency(0L);
|
eap$link.setFrequency(0L);
|
||||||
eap$link.updateStatus();
|
eap$link.updateStatus();
|
||||||
ExtendedAELogger.LOGGER.debug("[服务端] StorageBus 断开频道链接");
|
Logger.EAP$LOGGER.debug("[服务端] StorageBus 断开频道链接");
|
||||||
// 通知客户端状态变化
|
// 通知客户端状态变化
|
||||||
((appeng.parts.AEBasePart)(Object)this).getHost().markForUpdate();
|
((appeng.parts.AEBasePart)(Object)this).getHost().markForUpdate();
|
||||||
}
|
}
|
||||||
|
|
@ -103,17 +103,17 @@ public abstract class StorageBusPartChannelCardMixin implements IInterfaceWirele
|
||||||
() -> ((IActionHost)(Object)this).getActionableNode()
|
() -> ((IActionHost)(Object)this).getActionableNode()
|
||||||
);
|
);
|
||||||
eap$link = new WirelessSlaveLink(endpoint);
|
eap$link = new WirelessSlaveLink(endpoint);
|
||||||
ExtendedAELogger.LOGGER.debug("[服务端] StorageBus 创建新的无线链接");
|
Logger.EAP$LOGGER.debug("[服务端] StorageBus 创建新的无线链接");
|
||||||
}
|
}
|
||||||
|
|
||||||
eap$link.setFrequency(channel);
|
eap$link.setFrequency(channel);
|
||||||
eap$link.updateStatus();
|
eap$link.updateStatus();
|
||||||
ExtendedAELogger.LOGGER.debug("[服务端] StorageBus 设置频道: {}, 连接状态: {}", channel, eap$link.isConnected());
|
Logger.EAP$LOGGER.debug("[服务端] StorageBus 设置频道: {}, 连接状态: {}", channel, eap$link.isConnected());
|
||||||
|
|
||||||
// 通知客户端状态变化
|
// 通知客户端状态变化
|
||||||
((appeng.parts.AEBasePart)(Object)this).getHost().markForUpdate();
|
((appeng.parts.AEBasePart)(Object)this).getHost().markForUpdate();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
ExtendedAELogger.LOGGER.error("[服务端] StorageBus 初始化频道链接失败", e);
|
Logger.EAP$LOGGER.error("[服务端] StorageBus 初始化频道链接失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@ import appeng.api.upgrades.UpgradeInventories;
|
||||||
import appeng.helpers.patternprovider.PatternProviderLogic;
|
import appeng.helpers.patternprovider.PatternProviderLogic;
|
||||||
import appeng.helpers.patternprovider.PatternProviderLogicHost;
|
import appeng.helpers.patternprovider.PatternProviderLogicHost;
|
||||||
import com.extendedae_plus.compat.UpgradeSlotCompat;
|
import com.extendedae_plus.compat.UpgradeSlotCompat;
|
||||||
|
import com.extendedae_plus.util.Logger;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
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.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
@ -28,11 +28,11 @@ public class AppfluxPatternProviderLogicMixin {
|
||||||
at = @At("TAIL"))
|
at = @At("TAIL"))
|
||||||
private void eap$modifyAppfluxUpgradeSlots(IManagedGridNode mainNode, PatternProviderLogicHost host, int patternInventorySize, CallbackInfo ci) {
|
private void eap$modifyAppfluxUpgradeSlots(IManagedGridNode mainNode, PatternProviderLogicHost host, int patternInventorySize, CallbackInfo ci) {
|
||||||
try {
|
try {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("AppfluxPatternProviderLogicMixin被调用!");
|
Logger.EAP$LOGGER.info("AppfluxPatternProviderLogicMixin被调用!");
|
||||||
|
|
||||||
// 只有当appflux存在且不启用我们的升级槽时才修改数量
|
// 只有当appflux存在且不启用我们的升级槽时才修改数量
|
||||||
if (!UpgradeSlotCompat.shouldEnableUpgradeSlots() && UpgradeSlotCompat.shouldEnableChannelCard()) {
|
if (!UpgradeSlotCompat.shouldEnableUpgradeSlots() && UpgradeSlotCompat.shouldEnableChannelCard()) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("尝试修改appflux升级槽数量为2个");
|
Logger.EAP$LOGGER.info("尝试修改appflux升级槽数量为2个");
|
||||||
|
|
||||||
// 使用反射找到appflux的升级槽字段并替换
|
// 使用反射找到appflux的升级槽字段并替换
|
||||||
try {
|
try {
|
||||||
|
|
@ -41,7 +41,7 @@ public class AppfluxPatternProviderLogicMixin {
|
||||||
IUpgradeInventory currentUpgrades = (IUpgradeInventory) upgradesField.get(this);
|
IUpgradeInventory currentUpgrades = (IUpgradeInventory) upgradesField.get(this);
|
||||||
|
|
||||||
if (currentUpgrades != null) {
|
if (currentUpgrades != null) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("找到appflux升级槽,当前大小: {}", currentUpgrades.size());
|
Logger.EAP$LOGGER.info("找到appflux升级槽,当前大小: {}", currentUpgrades.size());
|
||||||
|
|
||||||
// 创建新的2槽升级槽
|
// 创建新的2槽升级槽
|
||||||
IUpgradeInventory newUpgrades = UpgradeInventories.forMachine(
|
IUpgradeInventory newUpgrades = UpgradeInventories.forMachine(
|
||||||
|
|
@ -52,7 +52,7 @@ public class AppfluxPatternProviderLogicMixin {
|
||||||
// 调用appflux的升级变更方法
|
// 调用appflux的升级变更方法
|
||||||
this.getClass().getDeclaredMethod("af_$onUpgradesChanged").invoke(this);
|
this.getClass().getDeclaredMethod("af_$onUpgradesChanged").invoke(this);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("调用appflux升级变更方法失败", e);
|
Logger.EAP$LOGGER.error("调用appflux升级变更方法失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
@ -66,14 +66,14 @@ public class AppfluxPatternProviderLogicMixin {
|
||||||
|
|
||||||
// 替换升级槽
|
// 替换升级槽
|
||||||
upgradesField.set(this, newUpgrades);
|
upgradesField.set(this, newUpgrades);
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("成功将appflux升级槽替换为2个槽");
|
Logger.EAP$LOGGER.info("成功将appflux升级槽替换为2个槽");
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("反射修改appflux升级槽失败", e);
|
Logger.EAP$LOGGER.error("反射修改appflux升级槽失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("AppfluxPatternProviderLogicMixin执行失败", e);
|
Logger.EAP$LOGGER.error("AppfluxPatternProviderLogicMixin执行失败", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
import static com.extendedae_plus.util.ExtendedAELogger.LOGGER;
|
import static com.extendedae_plus.util.Logger.EAP$LOGGER;
|
||||||
|
|
||||||
@Mixin(GuiExPatternProvider.class)
|
@Mixin(GuiExPatternProvider.class)
|
||||||
public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<ContainerExPatternProvider> implements IExPatternButtonsAccessor, IExPatternPageAccessor {
|
public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<ContainerExPatternProvider> implements IExPatternButtonsAccessor, IExPatternPageAccessor {
|
||||||
|
|
@ -127,7 +127,7 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<Co
|
||||||
try { cfgPages = Math.max(1, ModConfig.INSTANCE.pageMultiplier); } catch (Throwable ignored) {}
|
try { cfgPages = Math.max(1, ModConfig.INSTANCE.pageMultiplier); } catch (Throwable ignored) {}
|
||||||
int calcPages = Math.max(1, (int) Math.ceil(totalSlots / (double) SLOTS_PER_PAGE));
|
int calcPages = Math.max(1, (int) Math.ceil(totalSlots / (double) SLOTS_PER_PAGE));
|
||||||
int desiredMaxPage = Math.max(cfgPages, calcPages);
|
int desiredMaxPage = Math.max(cfgPages, calcPages);
|
||||||
LOGGER.info("[EAP] GuiExPatternProvider init: totalSlots={}, cfgPages={}, calcPages={}, desiredMaxPage={}", totalSlots, cfgPages, calcPages, desiredMaxPage);
|
EAP$LOGGER.info("[EAP] GuiExPatternProvider init: totalSlots={}, cfgPages={}, calcPages={}, desiredMaxPage={}", totalSlots, cfgPages, calcPages, desiredMaxPage);
|
||||||
// 更新本地最大页
|
// 更新本地最大页
|
||||||
this.eap$maxPageLocal = Math.max(1, desiredMaxPage);
|
this.eap$maxPageLocal = Math.max(1, desiredMaxPage);
|
||||||
this.eap$currentPage = 0;
|
this.eap$currentPage = 0;
|
||||||
|
|
@ -159,7 +159,7 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<Co
|
||||||
// 同步到本地 GUI 页码
|
// 同步到本地 GUI 页码
|
||||||
this.eap$currentPage = newPage;
|
this.eap$currentPage = newPage;
|
||||||
// 日志与强制重排(放在更新本地页码之后,确保布局读取到新页)
|
// 日志与强制重排(放在更新本地页码之后,确保布局读取到新页)
|
||||||
LOGGER.info("[EAP] PrevPage clicked: {} -> {} (max={})", currentPage, newPage, maxPage);
|
EAP$LOGGER.info("[EAP] PrevPage clicked: {} -> {} (max={})", currentPage, newPage, maxPage);
|
||||||
this.repositionSlots(SlotSemantics.ENCODED_PATTERN);
|
this.repositionSlots(SlotSemantics.ENCODED_PATTERN);
|
||||||
this.repositionSlots(SlotSemantics.STORAGE);
|
this.repositionSlots(SlotSemantics.STORAGE);
|
||||||
this.hoveredSlot = null;
|
this.hoveredSlot = null;
|
||||||
|
|
@ -186,7 +186,7 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<Co
|
||||||
// 同步到本地 GUI 页码
|
// 同步到本地 GUI 页码
|
||||||
this.eap$currentPage = newPage;
|
this.eap$currentPage = newPage;
|
||||||
// 日志与强制重排(放在更新本地页码之后,确保布局读取到新页)
|
// 日志与强制重排(放在更新本地页码之后,确保布局读取到新页)
|
||||||
LOGGER.info("[EAP] NextPage clicked: {} -> {} (max={})", currentPage, newPage, maxPage);
|
EAP$LOGGER.info("[EAP] NextPage clicked: {} -> {} (max={})", currentPage, newPage, maxPage);
|
||||||
this.repositionSlots(SlotSemantics.ENCODED_PATTERN);
|
this.repositionSlots(SlotSemantics.ENCODED_PATTERN);
|
||||||
this.repositionSlots(SlotSemantics.STORAGE);
|
this.repositionSlots(SlotSemantics.STORAGE);
|
||||||
this.hoveredSlot = null;
|
this.hoveredSlot = null;
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,16 @@
|
||||||
package com.extendedae_plus.util;
|
package com.extendedae_plus.util;
|
||||||
|
|
||||||
import com.extendedae_plus.ExtendedAEPlus;
|
import com.extendedae_plus.ExtendedAEPlus;
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 统一日志工具类。
|
* 统一日志工具类。
|
||||||
* 在需要的类中可使用:
|
* 在需要的类中可使用:
|
||||||
* import static com.extendedae_plus.util.ExtendedAELogger.LOGGER;
|
* import static com.extendedae_plus.util.Logger.LOGGER;
|
||||||
*/
|
*/
|
||||||
public final class ExtendedAELogger {
|
public final class Logger {
|
||||||
public static final Logger LOGGER = LoggerFactory.getLogger(ExtendedAEPlus.MODID);
|
public static final org.slf4j.Logger EAP$LOGGER = LoggerFactory.getLogger(ExtendedAEPlus.MODID);
|
||||||
private ExtendedAELogger() {
|
private Logger() {
|
||||||
// no instance
|
// no instance
|
||||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||||
}
|
}
|
||||||
|
|
@ -6,7 +6,7 @@ import java.util.List;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.regex.PatternSyntaxException;
|
import java.util.regex.PatternSyntaxException;
|
||||||
|
|
||||||
import static com.extendedae_plus.util.ExtendedAELogger.LOGGER;
|
import static com.extendedae_plus.util.Logger.EAP$LOGGER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 配置解析工具类:用于解析黑名单与倍率配置的字符串
|
* 配置解析工具类:用于解析黑名单与倍率配置的字符串
|
||||||
|
|
@ -29,7 +29,7 @@ public final class ConfigParsingUtils {
|
||||||
*/
|
*/
|
||||||
public static Pattern compilePattern(String raw) {
|
public static Pattern compilePattern(String raw) {
|
||||||
if (raw == null || raw.trim().isEmpty()) {
|
if (raw == null || raw.trim().isEmpty()) {
|
||||||
LOGGER.warn("Invalid pattern: {}", raw);
|
EAP$LOGGER.warn("Invalid pattern: {}", raw);
|
||||||
throw new IllegalArgumentException("Pattern is null or empty");
|
throw new IllegalArgumentException("Pattern is null or empty");
|
||||||
}
|
}
|
||||||
raw = raw.trim();
|
raw = raw.trim();
|
||||||
|
|
@ -39,7 +39,7 @@ public final class ConfigParsingUtils {
|
||||||
try {
|
try {
|
||||||
return Pattern.compile("^" + raw + "$");
|
return Pattern.compile("^" + raw + "$");
|
||||||
} catch (PatternSyntaxException e) {
|
} catch (PatternSyntaxException e) {
|
||||||
LOGGER.warn("Failed to compile regex pattern '{}': {}", raw, e.getMessage());
|
EAP$LOGGER.warn("Failed to compile regex pattern '{}': {}", raw, e.getMessage());
|
||||||
// Fallback to glob
|
// Fallback to glob
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -73,7 +73,7 @@ public final class ConfigParsingUtils {
|
||||||
if (entry == null || entry.trim().isEmpty()) return null;
|
if (entry == null || entry.trim().isEmpty()) return null;
|
||||||
String[] parts = entry.trim().split("\\s+");
|
String[] parts = entry.trim().split("\\s+");
|
||||||
if (parts.length < 2) {
|
if (parts.length < 2) {
|
||||||
LOGGER.warn("Invalid multiplier entry: {}", entry);
|
EAP$LOGGER.warn("Invalid multiplier entry: {}", entry);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
String key = parts[0];
|
String key = parts[0];
|
||||||
|
|
@ -83,14 +83,14 @@ public final class ConfigParsingUtils {
|
||||||
try {
|
try {
|
||||||
multiplier = Double.parseDouble(val);
|
multiplier = Double.parseDouble(val);
|
||||||
} catch (NumberFormatException e) {
|
} catch (NumberFormatException e) {
|
||||||
LOGGER.warn("Invalid multiplier value in '{}': {}", entry, val);
|
EAP$LOGGER.warn("Invalid multiplier value in '{}': {}", entry, val);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
Pattern pattern = compilePattern(key);
|
Pattern pattern = compilePattern(key);
|
||||||
return new MultiplierEntry(pattern, multiplier);
|
return new MultiplierEntry(pattern, multiplier);
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
LOGGER.warn("Failed to compile pattern in '{}': {}", entry, e.getMessage());
|
EAP$LOGGER.warn("Failed to compile pattern in '{}': {}", entry, e.getMessage());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -125,7 +125,7 @@ public final class ConfigParsingUtils {
|
||||||
try {
|
try {
|
||||||
out.add(compilePattern(s));
|
out.add(compilePattern(s));
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
LOGGER.warn("Failed to compile pattern '{}': {}", s, e.getMessage());
|
EAP$LOGGER.warn("Failed to compile pattern '{}': {}", s, e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
|
|
|
||||||
|
|
@ -6,21 +6,89 @@ import com.extendedae_plus.config.ModConfig;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用于计算实体加速器的能耗与加速倍率的工具类
|
* 用于计算实体加速器的能耗与加速倍率的工具类
|
||||||
*/
|
*/
|
||||||
public final class PowerUtils {
|
public final class PowerUtils {
|
||||||
private PowerUtils() {}
|
private static final int[] VALID_MULTIPLIERS = {2, 4, 8, 16, 32, 64, 128, 256, 512, 1024};
|
||||||
|
private static final int[] VALID_ENERGY_CARD_COUNTS = {0, 1, 2, 3, 4, 5, 6, 7, 8};
|
||||||
|
private static final AtomicInteger checkCounter = new AtomicInteger(0); // 原子计数器
|
||||||
|
private static final int CHECK_COUNTER_THRESHOLD = 100; // 配置检查阈值
|
||||||
|
private static final int CHECK_COUNTER_RESET_THRESHOLD = 10000; // 计数器重置阈值
|
||||||
|
private static volatile Map<Integer, Map<Integer, Double>> powerCache = new HashMap<>();
|
||||||
|
private static volatile Map<Integer, Double> ratioCache = new HashMap<>();
|
||||||
|
private static volatile int lastEntityTickerCost = -1; // 使用 int,与 entityTickerCost 类型一致
|
||||||
|
|
||||||
|
// 静态初始化块,预计算缓存
|
||||||
|
static {
|
||||||
|
initializeCaches();
|
||||||
|
}
|
||||||
|
|
||||||
|
private PowerUtils() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化所有可能的缓存条目
|
||||||
|
*/
|
||||||
|
private static void initializeCaches() {
|
||||||
|
synchronized (PowerUtils.class) {
|
||||||
|
powerCache.clear();
|
||||||
|
ratioCache.clear();
|
||||||
|
for (int energyCardCount : VALID_ENERGY_CARD_COUNTS) {
|
||||||
|
double ratio =
|
||||||
|
energyCardCount == 0 ? 1.0 :
|
||||||
|
energyCardCount == 1 ? 0.9 :
|
||||||
|
energyCardCount == 8 ? 0.5 :
|
||||||
|
1.0 - 0.5 * (1.0 - Math.pow(0.7, energyCardCount));
|
||||||
|
ratioCache.put(energyCardCount, ratio);
|
||||||
|
}
|
||||||
|
for (int product : VALID_MULTIPLIERS) {
|
||||||
|
Map<Integer, Double> energyCardMap = new HashMap<>();
|
||||||
|
for (int energyCardCount : VALID_ENERGY_CARD_COUNTS) {
|
||||||
|
double power = computePowerForProduct(product, energyCardCount);
|
||||||
|
energyCardMap.put(energyCardCount, power);
|
||||||
|
}
|
||||||
|
powerCache.put(product, energyCardMap);
|
||||||
|
}
|
||||||
|
lastEntityTickerCost = ModConfig.INSTANCE.entityTickerCost;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计算指定倍率和能源卡数量的能耗
|
||||||
|
*/
|
||||||
|
private static double computePowerForProduct(int product, int energyCardCount) {
|
||||||
|
double base = ModConfig.INSTANCE.entityTickerCost;
|
||||||
|
int log2 = Integer.numberOfTrailingZeros(product);
|
||||||
|
double raw;
|
||||||
|
if (product == 2) {
|
||||||
|
raw = base * 4;
|
||||||
|
} else if (product <= 256) {
|
||||||
|
raw = base * (1L << (int)(1.5 * log2)) * 2;
|
||||||
|
} else {
|
||||||
|
raw = base * (1L << (int)(2.5 * log2));
|
||||||
|
}
|
||||||
|
double ratio =
|
||||||
|
energyCardCount <= 0 ? 1.0 :
|
||||||
|
energyCardCount == 1 ? 0.9 :
|
||||||
|
energyCardCount >= 8 ? 0.5 :
|
||||||
|
1.0 - 0.5 * (1.0 - Math.pow(0.7, energyCardCount));
|
||||||
|
return raw * ratio / 8.0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 计算加速卡的乘积并应用上限。
|
* 计算加速卡的乘积并应用上限。
|
||||||
|
*
|
||||||
* @param upgrades 升级槽位
|
* @param upgrades 升级槽位
|
||||||
* @param maxCards 最大计入的卡数
|
* @param maxCards 最大计入的卡数
|
||||||
* @return 被上限约束后的乘积
|
* @return 被上限约束后的乘积
|
||||||
*/
|
*/
|
||||||
public static long computeProductWithCap(IUpgradeInventory upgrades, int maxCards) {
|
public static int computeProductWithCap(IUpgradeInventory upgrades, int maxCards) {
|
||||||
List<Integer> multipliers = new ArrayList<>();
|
List<Integer> multipliers = new ArrayList<>();
|
||||||
int considered = 0;
|
int considered = 0;
|
||||||
for (ItemStack stack : upgrades) {
|
for (ItemStack stack : upgrades) {
|
||||||
|
|
@ -34,7 +102,7 @@ public final class PowerUtils {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
long product = 1L;
|
int product = 1;
|
||||||
int highest = 1;
|
int highest = 1;
|
||||||
for (Integer m : multipliers) {
|
for (Integer m : multipliers) {
|
||||||
if (m == null || m <= 0) continue;
|
if (m == null || m <= 0) continue;
|
||||||
|
|
@ -47,43 +115,69 @@ public final class PowerUtils {
|
||||||
/**
|
/**
|
||||||
* 根据最高单卡倍率返回上限值。
|
* 根据最高单卡倍率返回上限值。
|
||||||
*/
|
*/
|
||||||
public static long capForHighestMultiplier(int highestMultiplier) {
|
public static int capForHighestMultiplier(int highestMultiplier) {
|
||||||
if (highestMultiplier >= 16) return 1024L;
|
if (highestMultiplier >= 16) return 1024;
|
||||||
if (highestMultiplier >= 8) return 256L;
|
if (highestMultiplier >= 8) return 256;
|
||||||
if (highestMultiplier >= 4) return 64L;
|
if (highestMultiplier >= 4) return 64;
|
||||||
if (highestMultiplier >= 2) return 8L;
|
if (highestMultiplier >= 2) return 8;
|
||||||
return 1L;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 计算最终能耗。
|
* 计算最终能耗。
|
||||||
* @param product 加速卡乘积
|
*
|
||||||
|
* @param product 加速卡乘积
|
||||||
* @param energyCardCount 能量卡数量
|
* @param energyCardCount 能量卡数量
|
||||||
* @return 最终能耗值
|
* @return 最终能耗值
|
||||||
*/
|
*/
|
||||||
public static double computeFinalPowerForProduct(long product, int energyCardCount) {
|
public static double computeFinalPowerForProduct(int product, int energyCardCount) {
|
||||||
if (product <= 1L) return 0.0;
|
if (product <= 1) return 0.0;
|
||||||
double base = ModConfig.INSTANCE.entityTickerCost;
|
// 每 100 次调用检查一次配置
|
||||||
double log2 = Math.log(product) / Math.log(2.0);
|
if (checkCounter.getAndIncrement() % CHECK_COUNTER_THRESHOLD == 0) {
|
||||||
double raw;
|
checkCounter.set(checkCounter.get() % CHECK_COUNTER_RESET_THRESHOLD);
|
||||||
if (product == 2L) {
|
if (lastEntityTickerCost != ModConfig.INSTANCE.entityTickerCost) {
|
||||||
raw = base * 4;
|
synchronized (PowerUtils.class) {
|
||||||
} else if (product <= 256L) {
|
if (lastEntityTickerCost != ModConfig.INSTANCE.entityTickerCost) {
|
||||||
raw = base * Math.pow(2.0, 1.5 * log2) * 2;
|
initializeCaches();
|
||||||
} else {
|
}
|
||||||
raw = base * Math.pow(2.0, 2.5 * log2);
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return raw * getRemainingRatio(energyCardCount) / 8.0;
|
// 查找缓存
|
||||||
|
return getCachedPower(product, energyCardCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 计算能量卡减免后的剩余功耗比率。
|
* 直接从缓存获取能耗值(无配置检查)。
|
||||||
|
*
|
||||||
|
* @param product 加速卡乘积
|
||||||
|
* @param energyCardCount 能量卡数量
|
||||||
|
* @return 缓存的能耗值
|
||||||
*/
|
*/
|
||||||
public static double getRemainingRatio(int energyCardCount) {
|
public static double getCachedPower(int product, int energyCardCount) {
|
||||||
if (energyCardCount <= 0) return 1.0;
|
Map<Integer, Double> energyCardMap = powerCache.get(product);
|
||||||
if (energyCardCount == 1) return 0.9;
|
if (energyCardMap == null) {
|
||||||
if (energyCardCount >= 8) return 0.5;
|
return 0.0;
|
||||||
return 1.0 - 0.5 * (1.0 - Math.pow(0.7, energyCardCount));
|
}
|
||||||
|
Double cachedPower = energyCardMap.get(energyCardCount);
|
||||||
|
if (cachedPower == null) {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
return cachedPower;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 直接从缓存获取比率(无配置检查)。
|
||||||
|
*
|
||||||
|
* @param energyCardCount 能量卡数量
|
||||||
|
* @return 缓存的比率值
|
||||||
|
*/
|
||||||
|
public static double getCachedRatio(int energyCardCount) {
|
||||||
|
Double cachedRatio = ratioCache.get(energyCardCount);
|
||||||
|
if (cachedRatio == null) {
|
||||||
|
return 1.0;
|
||||||
|
}
|
||||||
|
return cachedRatio;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user