fix: 实体加速器能量不足的显示界面显示问题

This commit is contained in:
C-H716 2025-09-26 21:50:59 +08:00
parent 28dfdaac78
commit 848cf86624
3 changed files with 34 additions and 22 deletions

View File

@ -30,8 +30,8 @@ public class EntitySpeedTickerMenu extends UpgradeableMenu<EntitySpeedTickerPart
@GuiSync(719) public int effectiveSpeed = 1; @GuiSync(719) public int effectiveSpeed = 1;
@GuiSync(720) public double multiplier = 1.0; @GuiSync(720) public double multiplier = 1.0;
@GuiSync(721) public boolean targetBlacklisted = false; @GuiSync(721) public boolean targetBlacklisted = false;
// 来自部件的网络能量足提示服务端设置客户端用于显示警告 // 来自部件的网络能量足提示服务端设置客户端用于显示警告
@GuiSync(722) public boolean networkEnergyInsufficient = false; @GuiSync(722) public boolean networkEnergySufficient = true;
public boolean getAccelerateEnabled() { public boolean getAccelerateEnabled() {
return this.accelerateEnabled; return this.accelerateEnabled;
@ -41,6 +41,16 @@ public class EntitySpeedTickerMenu extends UpgradeableMenu<EntitySpeedTickerPart
this.accelerateEnabled = enabled; this.accelerateEnabled = enabled;
} }
/**
* Part 更新 networkEnergySufficient 的封装方法由服务器调用
* 该方法会更新 @GuiSync 字段并广播变化到客户端
*/
public void setNetworkEnergySufficient(boolean sufficient) {
this.networkEnergySufficient = sufficient;
// 触发一次数据广播使客户端立即接收到最新状态
this.broadcastChanges();
}
// 构造方法初始化菜单并与部件绑定 // 构造方法初始化菜单并与部件绑定
public EntitySpeedTickerMenu(int id, Inventory ip, EntitySpeedTickerPart host) { public EntitySpeedTickerMenu(int id, Inventory ip, EntitySpeedTickerPart host) {
@ -99,11 +109,11 @@ public class EntitySpeedTickerMenu extends UpgradeableMenu<EntitySpeedTickerPart
this.effectiveSpeed = (int) PowerUtils.computeProductWithCapFromMenu(this, 8); this.effectiveSpeed = (int) PowerUtils.computeProductWithCapFromMenu(this, 8);
} }
// 从部件同步网络能量不足状态防御性编程避免 NPE // 从部件同步网络能量充足状态仅在服务器端从部件读取客户端应使用由 @GuiSync 同步过来的值
try { try {
EntitySpeedTickerPart host = getHost(); EntitySpeedTickerPart host = getHost();
if (host != null) { if (host != null && !isClientSide()) {
this.networkEnergyInsufficient = host.isNetworkEnergyInsufficient(); this.networkEnergySufficient = host.isNetworkEnergySufficient();
} }
} catch (Exception ignored) {} } catch (Exception ignored) {}

View File

@ -84,16 +84,15 @@ public class EntitySpeedTickerPart extends UpgradeablePart implements IGridTicka
// 控制是否启用加速默认启用 // 控制是否启用加速默认启用
private boolean accelerateEnabled = true; private boolean accelerateEnabled = true;
// 标记网络中是否能量不足用于 GUI 提示 // 标记网络中能量是否充足用于 GUI 提示默认充足
private boolean networkEnergyInsufficient = true; private boolean networkEnergySufficient = true;
public boolean getAccelerateEnabled() { public boolean getAccelerateEnabled() {
return this.accelerateEnabled; return this.accelerateEnabled;
} }
public boolean isNetworkEnergyInsufficient() { public boolean isNetworkEnergySufficient() {
return this.networkEnergyInsufficient; return this.networkEnergySufficient;
} }
public void setAccelerateEnabled(boolean accelerateEnabled) { public void setAccelerateEnabled(boolean accelerateEnabled) {
@ -101,15 +100,16 @@ public class EntitySpeedTickerPart extends UpgradeablePart implements IGridTicka
} }
/** /**
* 更新网络能量足标记并在菜单存在且状态变化时触发同步 * 更新网络能量足标记并在菜单存在且状态变化时触发同步
* @param insufficient 是否能量不 * @param sufficient 是否能量充
*/ */
private void updateNetworkEnergyInsufficient(boolean insufficient) { private void updateNetworkEnergySufficient(boolean sufficient) {
if (this.networkEnergyInsufficient == insufficient) return; // 保持部件内部状态一致部件为权威来源
this.networkEnergyInsufficient = insufficient; this.networkEnergySufficient = sufficient;
if (this.menu != null) { if (this.menu != null) {
try { try {
this.menu.broadcastChanges(); // 使用菜单的封装方法更新并广播以保持封装性
this.menu.setNetworkEnergySufficient(sufficient);
} catch (Exception ignored) {} } catch (Exception ignored) {}
} }
} }
@ -260,16 +260,17 @@ public class EntitySpeedTickerPart extends UpgradeablePart implements IGridTicka
double simulated = getMainNode().getGrid().getEnergyService() double simulated = getMainNode().getGrid().getEnergyService()
.extractAEPower(requiredPower, Actionable.SIMULATE, PowerMultiplier.CONFIG); .extractAEPower(requiredPower, Actionable.SIMULATE, PowerMultiplier.CONFIG);
if (simulated < requiredPower) { if (simulated < requiredPower) {
updateNetworkEnergyInsufficient(false); updateNetworkEnergySufficient(false); // 能量不足
return; return;
} }
double extractedPower = getMainNode().getGrid().getEnergyService() double extractedPower = getMainNode().getGrid().getEnergyService()
.extractAEPower(requiredPower, Actionable.MODULATE, PowerMultiplier.CONFIG); .extractAEPower(requiredPower, Actionable.MODULATE, PowerMultiplier.CONFIG);
if (extractedPower < requiredPower) { if (extractedPower < requiredPower) {
updateNetworkEnergyInsufficient(false); updateNetworkEnergySufficient(false); // 能量不足
return; return;
} }
updateNetworkEnergySufficient(true); // 能量充足
// 计算加速倍数基于 2 的次方并把 8 张映射到最大 1024x2^10 // 计算加速倍数基于 2 的次方并把 8 张映射到最大 1024x2^10
// 已由 product 计算得到 speed上面已在没有卡时提前返回 // 已由 product 计算得到 speed上面已在没有卡时提前返回

View File

@ -126,9 +126,10 @@ public class EntitySpeedTickerScreen<C extends EntitySpeedTickerMenu> extends Up
double finalPower = PowerUtils.computeFinalPowerForProduct(effectiveSpeed, energyCardCount); double finalPower = PowerUtils.computeFinalPowerForProduct(effectiveSpeed, energyCardCount);
double remainingRatio = PowerUtils.getRemainingRatio(energyCardCount); double remainingRatio = PowerUtils.getRemainingRatio(energyCardCount);
// 如果网络能量不足优先显示警告信息并在能量值处显示 0 if (!getMenu().networkEnergySufficient) {
if (getMenu().networkEnergyInsufficient) {
setTextContent("enable", Component.translatable("screen.extendedae_plus.entity_speed_ticker.warning_network_energy_insufficient")); setTextContent("enable", Component.translatable("screen.extendedae_plus.entity_speed_ticker.warning_network_energy_insufficient"));
}else {
setTextContent("enable", null);
} }
setTextContent("speed", Component.translatable("screen.extendedae_plus.entity_speed_ticker.speed", effectiveSpeed)); setTextContent("speed", Component.translatable("screen.extendedae_plus.entity_speed_ticker.speed", effectiveSpeed));
setTextContent("energy", Component.translatable("screen.extendedae_plus.entity_speed_ticker.energy", Platform.formatPower(finalPower, false))); setTextContent("energy", Component.translatable("screen.extendedae_plus.entity_speed_ticker.energy", Platform.formatPower(finalPower, false)));