feat: 使用预缓存实体加速器能耗Map减少使用过程中的计算

This commit is contained in:
C-H716 2025-09-29 08:56:36 +08:00
parent 869ab98af4
commit ea8168a8c1
21 changed files with 228 additions and 132 deletions

View File

@ -51,7 +51,7 @@ import java.util.List;
* 实体加速器部件用于加速目标方块实体的 tick 速率消耗 AE 网络能量支持加速卡和能量卡升级
* 灵感来源于 <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(
ExtendedAEPlus.MODID, "part/entity_speed_ticker_part");

View File

@ -98,8 +98,8 @@ public class EntitySpeedTickerScreen<C extends EntitySpeedTickerMenu> extends Up
*/
private void textData() {
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("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<C extends EntitySpeedTickerMenu> 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"));

View File

@ -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 兼容性测试完成 ===");
}
/**

View File

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

View File

@ -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<AdvPatt
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<YesNo> 的外观原版图标但自定义悬停描述为智能阻挡
@ -89,7 +89,7 @@ public abstract class AdvPatternProviderScreenMixin extends AEBaseScreen<AdvPatt
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 AdvPatternProviderScreenMixin extends AEBaseScreen<AdvPatt
try {
((IExPatternButtonsAccessor) this).eap$updateButtonsLayout();
} catch (Throwable t) {
LOGGER.debug("[EAP] updateButtonsLayout skipped: {}", t.toString());
EAP$LOGGER.debug("[EAP] updateButtonsLayout skipped: {}", t.toString());
}
}
}

View File

@ -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 SmallAdvPatternProviderScreenMixin extends AEBaseScreen<Sm
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<YesNo> 的外观原版图标但自定义悬停描述为智能阻挡
@ -89,7 +89,7 @@ public abstract class SmallAdvPatternProviderScreenMixin extends AEBaseScreen<Sm
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 SmallAdvPatternProviderScreenMixin extends AEBaseScreen<Sm
try {
((IExPatternButtonsAccessor) this).eap$updateButtonsLayout();
} catch (Throwable t) {
LOGGER.debug("[EAP] updateButtonsLayout skipped: {}", t.toString());
EAP$LOGGER.debug("[EAP] updateButtonsLayout skipped: {}", t.toString());
}
}
}

View File

@ -21,7 +21,7 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable;
import java.util.List;
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
@ -92,7 +92,7 @@ public abstract class CraftingTreeProcessMixin {
var scaled = PatternScaler.scale(proc, parentTarget, perProvider);
return scaled != null ? scaled : original;
} catch (Exception e) {
LOGGER.warn("构建倍增样板出错", e);
EAP$LOGGER.warn("构建倍增样板出错", e);
e.printStackTrace();
return original;
}

View File

@ -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;
/**
* AE2 原版样板供应器界面添加高级阻挡模式按钮
@ -56,7 +56,7 @@ public abstract class PatternProviderScreenMixin<C extends PatternProviderMenu>
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<YesNo> 的外观原版图标但自定义悬停描述为智能阻挡
@ -89,7 +89,7 @@ public abstract class PatternProviderScreenMixin<C extends PatternProviderMenu>
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<C extends PatternProviderMenu>
try {
((IExPatternButtonsAccessor) this).eap$updateButtonsLayout();
} catch (Throwable t) {
LOGGER.debug("[EAP] updateButtonsLayout skipped: {}", t.toString());
EAP$LOGGER.debug("[EAP] updateButtonsLayout skipped: {}", t.toString());
}
}
}

View File

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

View File

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

View File

@ -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<C extends PatternProvider
}
} 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) {
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) {
com.extendedae_plus.util.ExtendedAELogger.LOGGER.error("获取兼容升级列表失败", e);
Logger.EAP$LOGGER.error("获取兼容升级列表失败", e);
}
return list;

View File

@ -36,7 +36,7 @@ import java.lang.reflect.Method;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
import static com.extendedae_plus.util.ExtendedAELogger.LOGGER;
import static com.extendedae_plus.util.Logger.EAP$LOGGER;
/**
* AE2 石英切割刀添加潜行 + 右键 指向世界中的方块/部件如线缆复制其名称到剪贴板
@ -196,10 +196,10 @@ public abstract class QuartzCuttingKnifeItemMixin {
}
}
} catch (ClassNotFoundException e) {
LOGGER.info("GregTech CEu 类未找到,跳过配方翻译处理");
EAP$LOGGER.info("GregTech CEu 类未找到,跳过配方翻译处理");
return null; // GTCEu 不可用
} catch (NoSuchFieldException | NoSuchMethodException | IllegalAccessException | java.lang.reflect.InvocationTargetException e) {
LOGGER.error("处理 GTCEu 配方翻译失败: {}", e.getMessage());
EAP$LOGGER.error("处理 GTCEu 配方翻译失败: {}", e.getMessage());
return null; // 反射失败
}
return null; // GTCEu 方块实体
@ -248,7 +248,7 @@ public abstract class QuartzCuttingKnifeItemMixin {
try {
latch.await();
} catch (InterruptedException e) {
LOGGER.error("剪贴板复制线程中断: {}", e.getMessage());
EAP$LOGGER.error("剪贴板复制线程中断: {}", e.getMessage());
}
return result.get();
} else {

View File

@ -17,7 +17,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;
@Mixin(PatternProviderMenu.class)
public abstract class PatternProviderMenuAdvancedMixin implements IPatternProviderMenuAdvancedSync {
@ -61,7 +61,7 @@ public abstract class PatternProviderMenuAdvancedMixin implements IPatternProvid
this.eap$AdvancedBlocking = holder.eap$getAdvancedBlocking();
}
} catch (Throwable t) {
LOGGER.error("Error initializing advanced sync", t);
EAP$LOGGER.error("Error initializing advanced sync", t);
}
}

View File

@ -17,7 +17,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;
@Mixin(PatternProviderMenu.class)
public abstract class PatternProviderMenuDoublingMixin implements IPatternProviderMenuDoublingSync {
@ -47,7 +47,7 @@ public abstract class PatternProviderMenuDoublingMixin implements IPatternProvid
this.eap$SmartDoubling = holder.eap$getSmartDoubling();
}
} 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();
}
} catch (Throwable t) {
LOGGER.error("Error initializing smart doubling sync", t);
EAP$LOGGER.error("Error initializing smart doubling sync", t);
}
}

View File

@ -9,7 +9,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;
@ -86,14 +86,14 @@ public abstract class IOBusPartChannelCardMixin implements IInterfaceWirelessLin
}
eap$lastChannel = channel;
ExtendedAELogger.LOGGER.debug("[服务端] IOBus 初始化频道链接: found={}, channel={}", found, channel);
Logger.EAP$LOGGER.debug("[服务端] IOBus 初始化频道链接: found={}, channel={}", found, channel);
if (!found) {
// 无频道卡则断开
if (eap$link != null) {
eap$link.setFrequency(0L);
eap$link.updateStatus();
ExtendedAELogger.LOGGER.debug("[服务端] IOBus 断开频道链接");
Logger.EAP$LOGGER.debug("[服务端] IOBus 断开频道链接");
// 立即通知客户端状态变化断开连接无需延迟
((appeng.parts.AEBasePart)(Object)this).getHost().markForUpdate();
}
@ -106,17 +106,17 @@ public abstract class IOBusPartChannelCardMixin implements IInterfaceWirelessLin
() -> ((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);
}
}

View File

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

View File

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

View File

@ -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<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) {}
int calcPages = Math.max(1, (int) Math.ceil(totalSlots / (double) SLOTS_PER_PAGE));
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$currentPage = 0;
@ -159,7 +159,7 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<Co
// 同步到本地 GUI 页码
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.STORAGE);
this.hoveredSlot = null;
@ -186,7 +186,7 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<Co
// 同步到本地 GUI 页码
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.STORAGE);
this.hoveredSlot = null;

View File

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

View File

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

View File

@ -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<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 maxCards 最大计入的卡数
* @return 被上限约束后的乘积
*/
public static long computeProductWithCap(IUpgradeInventory upgrades, int maxCards) {
public static int computeProductWithCap(IUpgradeInventory upgrades, int maxCards) {
List<Integer> 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<Integer, Double> 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;
}
/**