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;
}
/**