feat: 修正逻辑
This commit is contained in:
parent
3fe2b8bb20
commit
cb280b7236
|
|
@ -329,42 +329,62 @@ public class EntitySpeedTickerPart extends UpgradeablePart implements IGridTicka
|
||||||
* @param requiredPower 所需能量(AE 单位)
|
* @param requiredPower 所需能量(AE 单位)
|
||||||
* @return 是否成功提取足够能量
|
* @return 是否成功提取足够能量
|
||||||
*/
|
*/
|
||||||
|
/**
|
||||||
|
* 提取网络能量并更新状态,优先从 AE2 网络提取 AE 能量,不足时从磁盘提取 FE 能量。
|
||||||
|
* @param requiredPower 所需能量(AE 单位)
|
||||||
|
* @return 是否成功提取足够能量
|
||||||
|
*/
|
||||||
private boolean extractPower(double requiredPower) {
|
private boolean extractPower(double requiredPower) {
|
||||||
IEnergyService energyService = getMainNode().getGrid().getEnergyService();
|
IEnergyService energyService = getMainNode().getGrid().getEnergyService();
|
||||||
MEStorage storage = getMainNode().getGrid().getStorageService().getInventory();
|
MEStorage storage = getMainNode().getGrid().getStorageService().getInventory();
|
||||||
IActionSource source = IActionSource.ofMachine(this);
|
IActionSource source = IActionSource.ofMachine(this);
|
||||||
|
|
||||||
for (int i = 0; i < cachedAttempts.length; i++) {
|
boolean preferDiskEnergy = ModConfig.INSTANCE.prioritizeDiskEnergy;
|
||||||
if (!cachedAttempts[i]) continue;
|
|
||||||
if (i == 0 || i == 2) { // FE 提取
|
// 如果优先磁盘能量,先尝试 FE
|
||||||
if (!FE_UNAVAILABLE && cachedFEExtractMethod != null) {
|
if (preferDiskEnergy && tryExtractFE(energyService, storage, requiredPower, source)) {
|
||||||
try {
|
return true;
|
||||||
long feRequired = (long) requiredPower << 1;
|
}
|
||||||
long feExtracted = (long) cachedFEExtractMethod.invoke(null, energyService, storage, feRequired, source);
|
|
||||||
if (feExtracted >= feRequired) {
|
// 先尝试 AE 能量
|
||||||
updateNetworkEnergySufficient(true);
|
double simulated = energyService.extractAEPower(requiredPower, Actionable.SIMULATE, PowerMultiplier.CONFIG);
|
||||||
return true;
|
if (simulated >= requiredPower) {
|
||||||
}
|
double extracted = energyService.extractAEPower(requiredPower, Actionable.MODULATE, PowerMultiplier.CONFIG);
|
||||||
} catch (Exception e) {
|
boolean sufficient = extracted >= requiredPower;
|
||||||
FE_UNAVAILABLE = true;
|
updateNetworkEnergySufficient(sufficient);
|
||||||
}
|
return sufficient;
|
||||||
}
|
}
|
||||||
} else { // AE 提取
|
updateNetworkEnergySufficient(false);
|
||||||
double simulated = energyService.extractAEPower(requiredPower, Actionable.SIMULATE, PowerMultiplier.CONFIG);
|
|
||||||
if (simulated >= requiredPower) {
|
// 如果没成功,且不是优先磁盘能量,再尝试 FE
|
||||||
double extracted = energyService.extractAEPower(requiredPower, Actionable.MODULATE, PowerMultiplier.CONFIG);
|
if (!preferDiskEnergy) {
|
||||||
boolean sufficient = extracted >= requiredPower;
|
return tryExtractFE(energyService, storage, requiredPower, source);
|
||||||
updateNetworkEnergySufficient(sufficient);
|
}
|
||||||
if (sufficient) {
|
|
||||||
return true;
|
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);
|
updateNetworkEnergySufficient(false);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 执行加速 tick 操作。
|
* 执行加速 tick 操作。
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user