feat: 修正逻辑

This commit is contained in:
C-H716 2025-10-01 20:28:11 +08:00
parent 3fe2b8bb20
commit cb280b7236

View File

@ -329,42 +329,62 @@ public class EntitySpeedTickerPart extends UpgradeablePart implements IGridTicka
* @param requiredPower 所需能量AE 单位
* @return 是否成功提取足够能量
*/
/**
* 提取网络能量并更新状态优先从 AE2 网络提取 AE 能量不足时从磁盘提取 FE 能量
* @param requiredPower 所需能量AE 单位
* @return 是否成功提取足够能量
*/
private boolean extractPower(double requiredPower) {
IEnergyService energyService = getMainNode().getGrid().getEnergyService();
MEStorage storage = getMainNode().getGrid().getStorageService().getInventory();
IActionSource source = IActionSource.ofMachine(this);
for (int i = 0; i < cachedAttempts.length; i++) {
if (!cachedAttempts[i]) continue;
if (i == 0 || i == 2) { // FE 提取
if (!FE_UNAVAILABLE && cachedFEExtractMethod != null) {
try {
long feRequired = (long) requiredPower << 1;
long feExtracted = (long) cachedFEExtractMethod.invoke(null, energyService, storage, feRequired, source);
if (feExtracted >= feRequired) {
updateNetworkEnergySufficient(true);
return true;
}
} catch (Exception e) {
FE_UNAVAILABLE = true;
}
}
} else { // AE 提取
double simulated = energyService.extractAEPower(requiredPower, Actionable.SIMULATE, PowerMultiplier.CONFIG);
if (simulated >= requiredPower) {
double extracted = energyService.extractAEPower(requiredPower, Actionable.MODULATE, PowerMultiplier.CONFIG);
boolean sufficient = extracted >= requiredPower;
updateNetworkEnergySufficient(sufficient);
if (sufficient) {
return true;
}
}
boolean preferDiskEnergy = ModConfig.INSTANCE.prioritizeDiskEnergy;
// 如果优先磁盘能量先尝试 FE
if (preferDiskEnergy && tryExtractFE(energyService, storage, requiredPower, source)) {
return true;
}
// 先尝试 AE 能量
double simulated = energyService.extractAEPower(requiredPower, Actionable.SIMULATE, PowerMultiplier.CONFIG);
if (simulated >= requiredPower) {
double extracted = energyService.extractAEPower(requiredPower, Actionable.MODULATE, PowerMultiplier.CONFIG);
boolean sufficient = extracted >= requiredPower;
updateNetworkEnergySufficient(sufficient);
return sufficient;
}
updateNetworkEnergySufficient(false);
// 如果没成功且不是优先磁盘能量再尝试 FE
if (!preferDiskEnergy) {
return tryExtractFE(energyService, storage, requiredPower, source);
}
return false;
}
private boolean tryExtractFE(IEnergyService energyService, MEStorage storage, double requiredPower, IActionSource source) {
if (FE_UNAVAILABLE || cachedFEExtractMethod == null) {
updateNetworkEnergySufficient(false);
return false;
}
try {
long feRequired = (long) requiredPower << 1; // 1 AE = 2 FE
long feExtracted = (long) cachedFEExtractMethod.invoke(null, energyService, storage, feRequired, source);
if (feExtracted >= feRequired) {
updateNetworkEnergySufficient(true);
return true;
}
} catch (Exception e) {
// 如果反射调用失败标记为不可用避免下次继续尝试
FE_UNAVAILABLE = true;
}
updateNetworkEnergySufficient(false);
return false;
}
/**
* 执行加速 tick 操作
*