From ea8168a8c18fc76f6d629f344bfc7a8a71f123ba Mon Sep 17 00:00:00 2001 From: C-H716 <1536152356@qq.com> Date: Mon, 29 Sep 2025 08:56:36 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BD=BF=E7=94=A8=E9=A2=84=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E5=AE=9E=E4=BD=93=E5=8A=A0=E9=80=9F=E5=99=A8=E8=83=BD?= =?UTF-8?q?=E8=80=97Map=E5=87=8F=E5=B0=91=E4=BD=BF=E7=94=A8=E8=BF=87?= =?UTF-8?q?=E7=A8=8B=E4=B8=AD=E7=9A=84=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ae/parts/EntitySpeedTickerPart.java | 2 +- .../ae/screen/EntitySpeedTickerScreen.java | 8 +- .../compat/CompatibilityTest.java | 16 +- .../compat/UpgradeSlotCompat.java | 12 +- .../gui/AdvPatternProviderScreenMixin.java | 8 +- .../SmallAdvPatternProviderScreenMixin.java | 8 +- .../autopattern/CraftingTreeProcessMixin.java | 4 +- .../gui/PatternProviderScreenMixin.java | 8 +- .../compat/PatternProviderCompatMixin.java | 3 +- .../PatternProviderLogicCompatMixin.java | 45 +++--- .../PatternProviderScreenCompatMixin.java | 7 +- .../items/QuartzCuttingKnifeItemMixin.java | 8 +- .../PatternProviderMenuAdvancedMixin.java | 4 +- .../PatternProviderMenuDoublingMixin.java | 6 +- .../automation/IOBusPartChannelCardMixin.java | 12 +- .../StorageBusPartChannelCardMixin.java | 12 +- .../AppfluxPatternProviderLogicMixin.java | 16 +- .../client/gui/GuiExPatternProviderMixin.java | 8 +- .../{ExtendedAELogger.java => Logger.java} | 9 +- .../util/entitySpeed/ConfigParsingUtils.java | 14 +- .../util/entitySpeed/PowerUtils.java | 150 ++++++++++++++---- 21 files changed, 228 insertions(+), 132 deletions(-) rename src/main/java/com/extendedae_plus/util/{ExtendedAELogger.java => Logger.java} (55%) diff --git a/src/main/java/com/extendedae_plus/ae/parts/EntitySpeedTickerPart.java b/src/main/java/com/extendedae_plus/ae/parts/EntitySpeedTickerPart.java index 53f634f..4d06f38 100644 --- a/src/main/java/com/extendedae_plus/ae/parts/EntitySpeedTickerPart.java +++ b/src/main/java/com/extendedae_plus/ae/parts/EntitySpeedTickerPart.java @@ -51,7 +51,7 @@ import java.util.List; * 实体加速器部件,用于加速目标方块实体的 tick 速率,消耗 AE 网络能量,支持加速卡和能量卡升级。 * 灵感来源于 Crazy AE2 Addons。 */ -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( ExtendedAEPlus.MODID, "part/entity_speed_ticker_part"); diff --git a/src/main/java/com/extendedae_plus/ae/screen/EntitySpeedTickerScreen.java b/src/main/java/com/extendedae_plus/ae/screen/EntitySpeedTickerScreen.java index 751d318..7a4a169 100644 --- a/src/main/java/com/extendedae_plus/ae/screen/EntitySpeedTickerScreen.java +++ b/src/main/java/com/extendedae_plus/ae/screen/EntitySpeedTickerScreen.java @@ -98,8 +98,8 @@ public class EntitySpeedTickerScreen extends Up */ private void textData() { Map 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("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))); @@ -110,8 +110,8 @@ public class EntitySpeedTickerScreen extends Up int energyCardCount = getMenu().energyCardCount; double multiplier = getMenu().multiplier; int effectiveSpeed = getMenu().effectiveSpeed; - double finalPower = PowerUtils.computeFinalPowerForProduct(effectiveSpeed, energyCardCount); - double remainingRatio = PowerUtils.getRemainingRatio(energyCardCount); + double finalPower = PowerUtils.getCachedPower(effectiveSpeed, energyCardCount); + double remainingRatio = PowerUtils.getCachedRatio(energyCardCount); textContents.put("enable", getMenu().networkEnergySufficient ? null : Component.translatable("screen.extendedae_plus.entity_speed_ticker.warning_network_energy_insufficient")); diff --git a/src/main/java/com/extendedae_plus/compat/CompatibilityTest.java b/src/main/java/com/extendedae_plus/compat/CompatibilityTest.java index 50b7687..ffb5556 100644 --- a/src/main/java/com/extendedae_plus/compat/CompatibilityTest.java +++ b/src/main/java/com/extendedae_plus/compat/CompatibilityTest.java @@ -1,6 +1,6 @@ package com.extendedae_plus.compat; -import com.extendedae_plus.util.ExtendedAELogger; +import com.extendedae_plus.util.Logger; import net.minecraftforge.fml.ModList; /** @@ -13,28 +13,28 @@ public class CompatibilityTest { * 测试模组兼容性检测 */ public static void testCompatibility() { - ExtendedAELogger.LOGGER.info("=== ExtendedAE_Plus 兼容性测试开始 ==="); + Logger.EAP$LOGGER.info("=== ExtendedAE_Plus 兼容性测试开始 ==="); // 测试appflux模组检测 boolean appfluxExists = ModList.get().isLoaded("appflux"); - ExtendedAELogger.LOGGER.info("ExtendedAE-appflux模组检测结果: {}", appfluxExists ? "存在" : "不存在"); + Logger.EAP$LOGGER.info("ExtendedAE-appflux模组检测结果: {}", appfluxExists ? "存在" : "不存在"); // 测试升级卡槽功能启用状态 boolean shouldEnableUpgrades = UpgradeSlotCompat.shouldEnableUpgradeSlots(); - ExtendedAELogger.LOGGER.info("升级卡槽功能启用状态: {}", shouldEnableUpgrades ? "启用" : "禁用"); + Logger.EAP$LOGGER.info("升级卡槽功能启用状态: {}", shouldEnableUpgrades ? "启用" : "禁用"); // 测试Screen升级面板添加状态 boolean shouldAddPanel = UpgradeSlotCompat.shouldAddUpgradePanelToScreen(); - ExtendedAELogger.LOGGER.info("Screen升级面板添加状态: {}", shouldAddPanel ? "启用" : "禁用"); + Logger.EAP$LOGGER.info("Screen升级面板添加状态: {}", shouldAddPanel ? "启用" : "禁用"); // 输出兼容性策略 if (appfluxExists) { - ExtendedAELogger.LOGGER.info("兼容性策略: 检测到ExtendedAE-appflux模组,将使用其升级卡槽功能"); + Logger.EAP$LOGGER.info("兼容性策略: 检测到ExtendedAE-appflux模组,将使用其升级卡槽功能"); } else { - ExtendedAELogger.LOGGER.info("兼容性策略: 未检测到ExtendedAE-appflux模组,将使用我们自己的升级卡槽功能"); + Logger.EAP$LOGGER.info("兼容性策略: 未检测到ExtendedAE-appflux模组,将使用我们自己的升级卡槽功能"); } - ExtendedAELogger.LOGGER.info("=== ExtendedAE_Plus 兼容性测试完成 ==="); + Logger.EAP$LOGGER.info("=== ExtendedAE_Plus 兼容性测试完成 ==="); } /** diff --git a/src/main/java/com/extendedae_plus/compat/UpgradeSlotCompat.java b/src/main/java/com/extendedae_plus/compat/UpgradeSlotCompat.java index c78c7c7..c6eab7a 100644 --- a/src/main/java/com/extendedae_plus/compat/UpgradeSlotCompat.java +++ b/src/main/java/com/extendedae_plus/compat/UpgradeSlotCompat.java @@ -10,7 +10,7 @@ import appeng.helpers.patternprovider.PatternProviderLogicHost; import appeng.menu.AEBaseMenu; import appeng.menu.SlotSemantics; 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.world.inventory.Slot; import net.minecraftforge.fml.ModList; @@ -83,7 +83,7 @@ public class UpgradeSlotCompat { setupUpgradesMethod.setAccessible(true); setupUpgradesMethod.invoke(menu, upgradeableHost.getUpgrades()); } catch (Exception e) { - ExtendedAELogger.LOGGER.error("反射调用setupUpgrades失败", e); + Logger.EAP$LOGGER.error("反射调用setupUpgrades失败", e); return false; } @@ -94,7 +94,7 @@ public class UpgradeSlotCompat { return true; } } catch (Exception e) { - ExtendedAELogger.LOGGER.error("初始化PatternProviderMenu升级功能时出错", e); + Logger.EAP$LOGGER.error("初始化PatternProviderMenu升级功能时出错", e); } return false; @@ -162,13 +162,13 @@ public class UpgradeSlotCompat { } return true; } catch (Exception e2) { - ExtendedAELogger.LOGGER.error("反射调用widgets方法失败", e2); + Logger.EAP$LOGGER.error("反射调用widgets方法失败", e2); return false; } } } } catch (Exception e) { - ExtendedAELogger.LOGGER.error("为PatternProviderScreen添加升级面板时出错", e); + Logger.EAP$LOGGER.error("为PatternProviderScreen添加升级面板时出错", e); } return false; @@ -187,7 +187,7 @@ public class UpgradeSlotCompat { list.addAll(appeng.api.upgrades.Upgrades.getTooltipLinesForMachine(upgrades.getUpgradableItem())); } } catch (Exception e) { - ExtendedAELogger.LOGGER.error("获取兼容升级列表时出错", e); + Logger.EAP$LOGGER.error("获取兼容升级列表时出错", e); } return list; diff --git a/src/main/java/com/extendedae_plus/mixin/advancedae/client/gui/AdvPatternProviderScreenMixin.java b/src/main/java/com/extendedae_plus/mixin/advancedae/client/gui/AdvPatternProviderScreenMixin.java index 813c164..cbefdde 100644 --- a/src/main/java/com/extendedae_plus/mixin/advancedae/client/gui/AdvPatternProviderScreenMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/advancedae/client/gui/AdvPatternProviderScreenMixin.java @@ -22,7 +22,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; 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样板供应器界面添加“高级阻挡模式”按钮。 @@ -56,7 +56,7 @@ public abstract class AdvPatternProviderScreenMixin extends AEBaseScreen 的外观(原版图标),但自定义悬停描述为“智能阻挡” @@ -89,7 +89,7 @@ public abstract class AdvPatternProviderScreenMixin extends AEBaseScreen( @@ -139,7 +139,7 @@ public abstract class AdvPatternProviderScreenMixin extends AEBaseScreen 的外观(原版图标),但自定义悬停描述为“智能阻挡” @@ -89,7 +89,7 @@ public abstract class SmallAdvPatternProviderScreenMixin extends AEBaseScreen( @@ -139,7 +139,7 @@ public abstract class SmallAdvPatternProviderScreenMixin extends AEBaseScreen this.eap$AdvancedBlockingEnabled = sync.eap$getAdvancedBlockingSynced(); } } catch (Throwable t) { - LOGGER.error("Error initializing advanced sync", t); + EAP$LOGGER.error("Error initializing advanced sync", t); } // 使用 SettingToggleButton 的外观(原版图标),但自定义悬停描述为“智能阻挡” @@ -89,7 +89,7 @@ public abstract class PatternProviderScreenMixin this.eap$SmartDoublingEnabled = sync2.eap$getSmartDoublingSynced(); } } 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<>( @@ -139,7 +139,7 @@ public abstract class PatternProviderScreenMixin try { ((IExPatternButtonsAccessor) this).eap$updateButtonsLayout(); } catch (Throwable t) { - LOGGER.debug("[EAP] updateButtonsLayout skipped: {}", t.toString()); + EAP$LOGGER.debug("[EAP] updateButtonsLayout skipped: {}", t.toString()); } } } diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/compat/PatternProviderCompatMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/compat/PatternProviderCompatMixin.java index edba48a..db7ef04 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/compat/PatternProviderCompatMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/compat/PatternProviderCompatMixin.java @@ -6,6 +6,7 @@ import appeng.menu.AEBaseMenu; import appeng.menu.ToolboxMenu; import appeng.menu.implementations.PatternProviderMenu; import com.extendedae_plus.compat.UpgradeSlotCompat; +import com.extendedae_plus.util.Logger; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.MenuType; import org.spongepowered.asm.mixin.Mixin; @@ -43,7 +44,7 @@ public abstract class PatternProviderCompatMixin extends AEBaseMenu implements U } } catch (Exception e) { // 静默处理异常,确保不会因为升级功能导致崩溃 - com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("PatternProviderMenu兼容性升级初始化失败", e); + Logger.EAP$LOGGER.error("PatternProviderMenu兼容性升级初始化失败", e); } } diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/compat/PatternProviderLogicCompatMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/compat/PatternProviderLogicCompatMixin.java index 69e52af..edebb1c 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/compat/PatternProviderLogicCompatMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/compat/PatternProviderLogicCompatMixin.java @@ -13,6 +13,7 @@ import com.extendedae_plus.ae.wireless.endpoint.GenericNodeEndpointImpl; import com.extendedae_plus.api.bridge.IInterfaceWirelessLinkBridge; import com.extendedae_plus.compat.UpgradeSlotCompat; import com.extendedae_plus.init.ModItems; +import com.extendedae_plus.util.Logger; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; import org.spongepowered.asm.mixin.Final; @@ -75,7 +76,7 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj eap$compatInitializeChannelLink(); } } 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) { try { if (UpgradeSlotCompat.shouldEnableChannelCard()) { - com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("监听到appflux升级变化,处理频道卡"); + Logger.EAP$LOGGER.info("监听到appflux升级变化,处理频道卡"); // 升级变更,重置并尝试初始化频道卡 eap$compatLastChannel = -1; eap$compatHasInitialized = false; eap$compatInitializeChannelLink(); } } 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")) private void eap$compatInitUpgrades(IManagedGridNode mainNode, PatternProviderLogicHost host, int patternInventorySize, CallbackInfo ci) { try { - com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("兼容性PatternProviderLogic初始化被调用"); + Logger.EAP$LOGGER.info("兼容性PatternProviderLogic初始化被调用"); boolean upgradeSlots = UpgradeSlotCompat.shouldEnableUpgradeSlots(); boolean channelCard = UpgradeSlotCompat.shouldEnableChannelCard(); - com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("升级槽功能: {}, 频道卡功能: {}", upgradeSlots, channelCard); + Logger.EAP$LOGGER.info("升级槽功能: {}, 频道卡功能: {}", upgradeSlots, channelCard); if (upgradeSlots) { // 只有在升级槽功能启用时才创建升级槽 @@ -113,15 +114,15 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj 1, this::eap$compatOnUpgradesChanged ); - com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("创建了完整的升级槽"); + Logger.EAP$LOGGER.info("创建了完整的升级槽"); } else if (channelCard) { // 如果装了appflux,我们不创建自己的升级槽,而是监听appflux的升级槽 - com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("装了appflux,将监听其升级槽来处理频道卡"); + Logger.EAP$LOGGER.info("装了appflux,将监听其升级槽来处理频道卡"); } else { - com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("跳过升级槽创建"); + Logger.EAP$LOGGER.info("跳过升级槽创建"); } } 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"); } } 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) { - 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) { - 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(); } } 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 { // 装了appflux时,这个方法不应该被调用,因为appflux的Mixin会覆盖它 // 但是为了安全起见,返回空的升级槽 - com.extendedae_plus.util.ExtendedAELogger.LOGGER.debug("装了appflux时getUpgrades被调用,这不应该发生"); + Logger.EAP$LOGGER.debug("装了appflux时getUpgrades被调用,这不应该发生"); return UpgradeInventories.empty(); } } @@ -203,7 +204,7 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj eap$compatLink.updateStatus(); } } 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) { IUpgradeableObject upgradeableThis = (IUpgradeableObject) this; upgrades = upgradeableThis.getUpgrades(); - com.extendedae_plus.util.ExtendedAELogger.LOGGER.debug("从appflux获取到升级槽: {}", upgrades != null); + Logger.EAP$LOGGER.debug("从appflux获取到升级槽: {}", upgrades != null); } } 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()) { channel = ChannelCardItem.getChannel(stack); found = true; - com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("找到频道卡,频道: {}", channel); + Logger.EAP$LOGGER.info("找到频道卡,频道: {}", channel); break; } } @@ -297,7 +298,7 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj } catch (Throwable ignored) {} } } 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(); } } catch (Exception e) { - com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("检查兼容性无线连接状态失败", e); + Logger.EAP$LOGGER.error("检查兼容性无线连接状态失败", e); return false; } } @@ -370,7 +371,7 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj } } } 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 (Exception e) { - com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("兼容性主节点状态变更处理失败", e); + Logger.EAP$LOGGER.error("兼容性主节点状态变更处理失败", e); } } } diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/compat/PatternProviderScreenCompatMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/compat/PatternProviderScreenCompatMixin.java index eaee82c..32b450f 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/compat/PatternProviderScreenCompatMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/compat/PatternProviderScreenCompatMixin.java @@ -10,6 +10,7 @@ import appeng.core.localization.GuiText; import appeng.menu.SlotSemantics; import appeng.menu.implementations.PatternProviderMenu; import com.extendedae_plus.compat.UpgradeSlotCompat; +import com.extendedae_plus.util.Logger; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; import org.spongepowered.asm.mixin.Mixin; @@ -38,7 +39,7 @@ public abstract class PatternProviderScreenCompatMixin ((IActionHost)(Object)this).getActionableNode() ); eap$link = new WirelessSlaveLink(endpoint); - ExtendedAELogger.LOGGER.debug("[服务端] IOBus 创建新的无线链接"); + Logger.EAP$LOGGER.debug("[服务端] IOBus 创建新的无线链接"); } eap$link.setFrequency(channel); 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(); } catch (Exception e) { - ExtendedAELogger.LOGGER.error("[服务端] IOBus 初始化频道链接失败", e); + Logger.EAP$LOGGER.error("[服务端] IOBus 初始化频道链接失败", e); } } diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/parts/storagebus/StorageBusPartChannelCardMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/parts/storagebus/StorageBusPartChannelCardMixin.java index d54d757..be8ee96 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/parts/storagebus/StorageBusPartChannelCardMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/parts/storagebus/StorageBusPartChannelCardMixin.java @@ -10,7 +10,7 @@ import com.extendedae_plus.ae.wireless.WirelessSlaveLink; import com.extendedae_plus.ae.wireless.endpoint.GenericNodeEndpointImpl; import com.extendedae_plus.api.bridge.IInterfaceWirelessLinkBridge; import com.extendedae_plus.init.ModItems; -import com.extendedae_plus.util.ExtendedAELogger; +import com.extendedae_plus.util.Logger; import net.minecraft.nbt.CompoundTag; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @@ -84,13 +84,13 @@ public abstract class StorageBusPartChannelCardMixin implements IInterfaceWirele } eap$lastChannel = channel; - ExtendedAELogger.LOGGER.debug("[服务端] StorageBus 初始化频道链接: found={}, channel={}", found, channel); + Logger.EAP$LOGGER.debug("[服务端] StorageBus 初始化频道链接: found={}, channel={}", found, channel); if (!found) { if (eap$link != null) { eap$link.setFrequency(0L); eap$link.updateStatus(); - ExtendedAELogger.LOGGER.debug("[服务端] StorageBus 断开频道链接"); + Logger.EAP$LOGGER.debug("[服务端] StorageBus 断开频道链接"); // 通知客户端状态变化 ((appeng.parts.AEBasePart)(Object)this).getHost().markForUpdate(); } @@ -103,17 +103,17 @@ public abstract class StorageBusPartChannelCardMixin implements IInterfaceWirele () -> ((IActionHost)(Object)this).getActionableNode() ); eap$link = new WirelessSlaveLink(endpoint); - ExtendedAELogger.LOGGER.debug("[服务端] StorageBus 创建新的无线链接"); + Logger.EAP$LOGGER.debug("[服务端] StorageBus 创建新的无线链接"); } eap$link.setFrequency(channel); 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(); } catch (Exception e) { - ExtendedAELogger.LOGGER.error("[服务端] StorageBus 初始化频道链接失败", e); + Logger.EAP$LOGGER.error("[服务端] StorageBus 初始化频道链接失败", e); } } diff --git a/src/main/java/com/extendedae_plus/mixin/appflux/AppfluxPatternProviderLogicMixin.java b/src/main/java/com/extendedae_plus/mixin/appflux/AppfluxPatternProviderLogicMixin.java index 201121e..4a22199 100644 --- a/src/main/java/com/extendedae_plus/mixin/appflux/AppfluxPatternProviderLogicMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/appflux/AppfluxPatternProviderLogicMixin.java @@ -6,8 +6,8 @@ import appeng.api.upgrades.UpgradeInventories; import appeng.helpers.patternprovider.PatternProviderLogic; import appeng.helpers.patternprovider.PatternProviderLogicHost; import com.extendedae_plus.compat.UpgradeSlotCompat; +import com.extendedae_plus.util.Logger; 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.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -28,11 +28,11 @@ public class AppfluxPatternProviderLogicMixin { at = @At("TAIL")) private void eap$modifyAppfluxUpgradeSlots(IManagedGridNode mainNode, PatternProviderLogicHost host, int patternInventorySize, CallbackInfo ci) { try { - com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("AppfluxPatternProviderLogicMixin被调用!"); + Logger.EAP$LOGGER.info("AppfluxPatternProviderLogicMixin被调用!"); // 只有当appflux存在且不启用我们的升级槽时才修改数量 if (!UpgradeSlotCompat.shouldEnableUpgradeSlots() && UpgradeSlotCompat.shouldEnableChannelCard()) { - com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("尝试修改appflux升级槽数量为2个"); + Logger.EAP$LOGGER.info("尝试修改appflux升级槽数量为2个"); // 使用反射找到appflux的升级槽字段并替换 try { @@ -41,7 +41,7 @@ public class AppfluxPatternProviderLogicMixin { IUpgradeInventory currentUpgrades = (IUpgradeInventory) upgradesField.get(this); if (currentUpgrades != null) { - com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("找到appflux升级槽,当前大小: {}", currentUpgrades.size()); + Logger.EAP$LOGGER.info("找到appflux升级槽,当前大小: {}", currentUpgrades.size()); // 创建新的2槽升级槽 IUpgradeInventory newUpgrades = UpgradeInventories.forMachine( @@ -52,7 +52,7 @@ public class AppfluxPatternProviderLogicMixin { // 调用appflux的升级变更方法 this.getClass().getDeclaredMethod("af_$onUpgradesChanged").invoke(this); } 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); - com.extendedae_plus.util.ExtendedAELogger.LOGGER.info("成功将appflux升级槽替换为2个槽"); + Logger.EAP$LOGGER.info("成功将appflux升级槽替换为2个槽"); } } catch (Exception e) { - com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("反射修改appflux升级槽失败", e); + Logger.EAP$LOGGER.error("反射修改appflux升级槽失败", e); } } } catch (Exception e) { - com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("AppfluxPatternProviderLogicMixin执行失败", e); + Logger.EAP$LOGGER.error("AppfluxPatternProviderLogicMixin执行失败", e); } } } diff --git a/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternProviderMixin.java b/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternProviderMixin.java index 6cc4b9d..4b0df62 100644 --- a/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternProviderMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternProviderMixin.java @@ -24,7 +24,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.lang.reflect.Field; 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) public abstract class GuiExPatternProviderMixin extends PatternProviderScreen implements IExPatternButtonsAccessor, IExPatternPageAccessor { @@ -127,7 +127,7 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen {} (max={})", currentPage, newPage, maxPage); + EAP$LOGGER.info("[EAP] PrevPage clicked: {} -> {} (max={})", currentPage, newPage, maxPage); this.repositionSlots(SlotSemantics.ENCODED_PATTERN); this.repositionSlots(SlotSemantics.STORAGE); this.hoveredSlot = null; @@ -186,7 +186,7 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen {} (max={})", currentPage, newPage, maxPage); + EAP$LOGGER.info("[EAP] NextPage clicked: {} -> {} (max={})", currentPage, newPage, maxPage); this.repositionSlots(SlotSemantics.ENCODED_PATTERN); this.repositionSlots(SlotSemantics.STORAGE); this.hoveredSlot = null; diff --git a/src/main/java/com/extendedae_plus/util/ExtendedAELogger.java b/src/main/java/com/extendedae_plus/util/Logger.java similarity index 55% rename from src/main/java/com/extendedae_plus/util/ExtendedAELogger.java rename to src/main/java/com/extendedae_plus/util/Logger.java index 728f5ab..b7ec4e8 100644 --- a/src/main/java/com/extendedae_plus/util/ExtendedAELogger.java +++ b/src/main/java/com/extendedae_plus/util/Logger.java @@ -1,17 +1,16 @@ package com.extendedae_plus.util; import com.extendedae_plus.ExtendedAEPlus; -import org.slf4j.Logger; 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 static final Logger LOGGER = LoggerFactory.getLogger(ExtendedAEPlus.MODID); - private ExtendedAELogger() { +public final class Logger { + public static final org.slf4j.Logger EAP$LOGGER = LoggerFactory.getLogger(ExtendedAEPlus.MODID); + private Logger() { // no instance throw new UnsupportedOperationException("This is a utility class and cannot be instantiated"); } diff --git a/src/main/java/com/extendedae_plus/util/entitySpeed/ConfigParsingUtils.java b/src/main/java/com/extendedae_plus/util/entitySpeed/ConfigParsingUtils.java index 44c9713..1aa0b1f 100644 --- a/src/main/java/com/extendedae_plus/util/entitySpeed/ConfigParsingUtils.java +++ b/src/main/java/com/extendedae_plus/util/entitySpeed/ConfigParsingUtils.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.regex.Pattern; 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) { 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"); } raw = raw.trim(); @@ -39,7 +39,7 @@ public final class ConfigParsingUtils { try { return Pattern.compile("^" + raw + "$"); } 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 } } @@ -73,7 +73,7 @@ public final class ConfigParsingUtils { if (entry == null || entry.trim().isEmpty()) return null; String[] parts = entry.trim().split("\\s+"); if (parts.length < 2) { - LOGGER.warn("Invalid multiplier entry: {}", entry); + EAP$LOGGER.warn("Invalid multiplier entry: {}", entry); return null; } String key = parts[0]; @@ -83,14 +83,14 @@ public final class ConfigParsingUtils { try { multiplier = Double.parseDouble(val); } catch (NumberFormatException e) { - LOGGER.warn("Invalid multiplier value in '{}': {}", entry, val); + EAP$LOGGER.warn("Invalid multiplier value in '{}': {}", entry, val); return null; } try { Pattern pattern = compilePattern(key); return new MultiplierEntry(pattern, multiplier); } 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; } } @@ -125,7 +125,7 @@ public final class ConfigParsingUtils { try { out.add(compilePattern(s)); } catch (IllegalArgumentException e) { - LOGGER.warn("Failed to compile pattern '{}': {}", s, e.getMessage()); + EAP$LOGGER.warn("Failed to compile pattern '{}': {}", s, e.getMessage()); } } return out; diff --git a/src/main/java/com/extendedae_plus/util/entitySpeed/PowerUtils.java b/src/main/java/com/extendedae_plus/util/entitySpeed/PowerUtils.java index 529b40f..feba836 100644 --- a/src/main/java/com/extendedae_plus/util/entitySpeed/PowerUtils.java +++ b/src/main/java/com/extendedae_plus/util/entitySpeed/PowerUtils.java @@ -6,21 +6,89 @@ import com.extendedae_plus.config.ModConfig; import net.minecraft.world.item.ItemStack; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; /** * 用于计算实体加速器的能耗与加速倍率的工具类 */ 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> powerCache = new HashMap<>(); + private static volatile Map 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 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 maxCards 最大计入的卡数 * @return 被上限约束后的乘积 */ - public static long computeProductWithCap(IUpgradeInventory upgrades, int maxCards) { + public static int computeProductWithCap(IUpgradeInventory upgrades, int maxCards) { List multipliers = new ArrayList<>(); int considered = 0; for (ItemStack stack : upgrades) { @@ -34,7 +102,7 @@ public final class PowerUtils { } } } - long product = 1L; + int product = 1; int highest = 1; for (Integer m : multipliers) { if (m == null || m <= 0) continue; @@ -47,43 +115,69 @@ public final class PowerUtils { /** * 根据最高单卡倍率返回上限值。 */ - public static long capForHighestMultiplier(int highestMultiplier) { - if (highestMultiplier >= 16) return 1024L; - if (highestMultiplier >= 8) return 256L; - if (highestMultiplier >= 4) return 64L; - if (highestMultiplier >= 2) return 8L; - return 1L; + public static int capForHighestMultiplier(int highestMultiplier) { + if (highestMultiplier >= 16) return 1024; + if (highestMultiplier >= 8) return 256; + if (highestMultiplier >= 4) return 64; + if (highestMultiplier >= 2) return 8; + return 1; } /** * 计算最终能耗。 - * @param product 加速卡乘积 + * + * @param product 加速卡乘积 * @param energyCardCount 能量卡数量 * @return 最终能耗值 */ - public static double computeFinalPowerForProduct(long product, int energyCardCount) { - if (product <= 1L) return 0.0; - double base = ModConfig.INSTANCE.entityTickerCost; - double log2 = Math.log(product) / Math.log(2.0); - double raw; - if (product == 2L) { - raw = base * 4; - } else if (product <= 256L) { - raw = base * Math.pow(2.0, 1.5 * log2) * 2; - } else { - raw = base * Math.pow(2.0, 2.5 * log2); + public static double computeFinalPowerForProduct(int product, int energyCardCount) { + if (product <= 1) return 0.0; + // 每 100 次调用检查一次配置 + if (checkCounter.getAndIncrement() % CHECK_COUNTER_THRESHOLD == 0) { + checkCounter.set(checkCounter.get() % CHECK_COUNTER_RESET_THRESHOLD); + if (lastEntityTickerCost != ModConfig.INSTANCE.entityTickerCost) { + synchronized (PowerUtils.class) { + if (lastEntityTickerCost != ModConfig.INSTANCE.entityTickerCost) { + initializeCaches(); + } + } + } } - return raw * getRemainingRatio(energyCardCount) / 8.0; + // 查找缓存 + return getCachedPower(product, energyCardCount); } /** - * 计算能量卡减免后的剩余功耗比率。 + * 直接从缓存获取能耗值(无配置检查)。 + * + * @param product 加速卡乘积 + * @param energyCardCount 能量卡数量 + * @return 缓存的能耗值 */ - public static double getRemainingRatio(int energyCardCount) { - if (energyCardCount <= 0) return 1.0; - if (energyCardCount == 1) return 0.9; - if (energyCardCount >= 8) return 0.5; - return 1.0 - 0.5 * (1.0 - Math.pow(0.7, energyCardCount)); + public static double getCachedPower(int product, int energyCardCount) { + Map energyCardMap = powerCache.get(product); + if (energyCardMap == null) { + return 0.0; + } + 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; } /**