feat: 实体加速器界面显示能量是否充足

This commit is contained in:
C-H716 2025-09-26 22:09:20 +08:00
parent 9ac7d11813
commit fc25e2bd1c
6 changed files with 78 additions and 25 deletions

View File

@ -36,6 +36,28 @@ public class EntitySpeedTickerMenu extends UpgradeableMenu<EntitySpeedTickerPart
public double multiplier = 1.0;
@GuiSync(721)
public boolean targetBlacklisted = false;
// 来自部件的网络能量充足提示服务端设置客户端用于显示警告
@GuiSync(722) public boolean networkEnergySufficient = true;
public boolean getAccelerateEnabled() {
return this.accelerateEnabled;
}
public void setAccelerateEnabled(boolean 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) {
@ -45,16 +67,7 @@ public class EntitySpeedTickerMenu extends UpgradeableMenu<EntitySpeedTickerPart
// 初始同步部件上的开关状态到菜单服务器端构造时保证一致
try {
this.accelerateEnabled = getHost().getAccelerateEnabled();
} catch (Exception ignored) {
}
}
public boolean getAccelerateEnabled() {
return this.accelerateEnabled;
}
public void setAccelerateEnabled(boolean enabled) {
this.accelerateEnabled = enabled;
} catch (Exception ignored) {}
}
@Override
@ -79,7 +92,8 @@ public class EntitySpeedTickerMenu extends UpgradeableMenu<EntitySpeedTickerPart
}
}
}
} catch (Exception ignored) {}
} catch (Exception ignored) {
}
this.multiplier = mult;
// 检查目标是否在黑名单中如果是则标记并将生效速度设为 0服务器端计算
@ -111,6 +125,14 @@ public class EntitySpeedTickerMenu extends UpgradeableMenu<EntitySpeedTickerPart
this.effectiveSpeed = (int) PowerUtils.computeProductWithCapFromMenu(this, 8);
}
// 从部件同步网络能量充足状态仅在服务器端从部件读取客户端应使用由 @GuiSync 同步过来的值
try {
EntitySpeedTickerPart host = getHost();
if (host != null && !isClientSide()) {
this.networkEnergySufficient = host.isNetworkEnergySufficient();
}
} catch (Exception ignored) {}
// 如果在客户端刷新界面
if (isClientSide()) {
if (Minecraft.getInstance().screen instanceof EntitySpeedTickerScreen screen) {

View File

@ -63,14 +63,8 @@ public class EntitySpeedTickerPart extends UpgradeablePart implements IGridTicka
MODELS_HAS_CHANNEL = new PartModel(MODEL_BASE, ResourceLocation.fromNamespaceAndPath(ExtendedAEPlus.MODID, "part/entity_speed_ticker_has_channel"));
}
// 当前打开的菜单实例如果有
public EntitySpeedTickerMenu menu;
// 控制是否启用加速默认启用
private boolean accelerateEnabled = true;
/**
* 构造函数初始化部件并设置网络节点属性
*
* @param partItem 部件物品
*/
public EntitySpeedTickerPart(IPartItem<?> partItem) {
@ -81,18 +75,42 @@ public class EntitySpeedTickerPart extends UpgradeablePart implements IGridTicka
.setIdlePowerUsage(1)
.addService(IGridTickable.class, this);
}
// 当前打开的菜单实例如果有
public EntitySpeedTickerMenu menu;
// 控制是否启用加速默认启用
private boolean accelerateEnabled = true;
// 标记网络中能量是否充足用于 GUI 提示默认充足
private boolean networkEnergySufficient = true;
public boolean getAccelerateEnabled() {
return this.accelerateEnabled;
}
public boolean isNetworkEnergySufficient() {
return this.networkEnergySufficient;
}
public void setAccelerateEnabled(boolean accelerateEnabled) {
this.accelerateEnabled = accelerateEnabled;
}
/**
* 更新网络能量充足标记并在菜单存在且状态变化时触发同步
* @param sufficient 是否能量充足
*/
private void updateNetworkEnergySufficient(boolean sufficient) {
// 保持部件内部状态一致部件为权威来源
this.networkEnergySufficient = sufficient;
if (this.menu != null) {
try {
// 使用菜单的封装方法更新并广播以保持封装性
this.menu.setNetworkEnergySufficient(sufficient);
} catch (Exception ignored) {}
}
}
/**
* 获取当前状态下的静态模型用于渲染
*
* @return 当前状态的模型
*/
public IPartModel getStaticModels() {
@ -105,8 +123,6 @@ public class EntitySpeedTickerPart extends UpgradeablePart implements IGridTicka
}
}
/**
* 当玩家激活部件右键时调用打开自定义菜单
*
@ -239,14 +255,21 @@ public class EntitySpeedTickerPart extends UpgradeablePart implements IGridTicka
requiredPower *= multiplier;
// 先模拟提取以检查网络中是否有足够能量再真正抽取
// 先模拟提取以检查网络中是否有足够能量再真正抽取
double simulated = getMainNode().getGrid().getEnergyService()
.extractAEPower(requiredPower, Actionable.SIMULATE, PowerMultiplier.CONFIG);
if (simulated < requiredPower) return;
if (simulated < requiredPower) {
updateNetworkEnergySufficient(false); // 能量不足
return;
}
double extractedPower = getMainNode().getGrid().getEnergyService()
.extractAEPower(requiredPower, Actionable.MODULATE, PowerMultiplier.CONFIG);
if (extractedPower < requiredPower) return;
if (extractedPower < requiredPower) {
updateNetworkEnergySufficient(false); // 能量不足
return;
}
updateNetworkEnergySufficient(true); // 能量充足
// 计算加速倍数基于 2 的次方并把 8 张映射到最大 1024x2^10
// 已由 product 计算得到 speed上面已在没有卡时提前返回

View File

@ -128,6 +128,13 @@ public class EntitySpeedTickerScreen<C extends EntitySpeedTickerMenu> extends Up
double finalPower = PowerUtils.computeFinalPowerForProduct(effectiveSpeed, energyCardCount);
double remainingRatio = PowerUtils.getRemainingRatio(energyCardCount);
// 如果网络能量不足优先显示警告信息并在能量值处显示 0
if (!getMenu().networkEnergySufficient) {
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("energy", Component.translatable("screen.extendedae_plus.entity_speed_ticker.energy", Platform.formatPower(finalPower, false)));
setTextContent("power_ratio", Component.translatable("screen.extendedae_plus.entity_speed_ticker.power_ratio", PowerUtils.formatPercentage(remainingRatio)));

View File

@ -51,8 +51,7 @@
"left": 88
},
"align": "CENTER"
}
,
},
"multiplier": {
"position": {
"top": 80,

View File

@ -53,6 +53,7 @@
"screen.extendedae_plus.entity_speed_ticker.power_ratio": "Power Ratio: %s",
"screen.extendedae_plus.entity_speed_ticker.speed": "Current Acceleration Multiplier: %d",
"screen.extendedae_plus.entity_speed_ticker.multiplier": "Additional Consumption Multiplier: %s",
"screen.extendedae_plus.entity_speed_ticker.warning_network_energy_insufficient": "§c§lInsufficient network energy",
"item.extendedae_plus.entity_speed_ticker.tip.requirement": "Requires Entity Speed Card to Enable Acceleration",
"item.extendedae_plus.entity_speed_ticker.tip.max": "Up to 1024x Acceleration",

View File

@ -53,6 +53,7 @@
"screen.extendedae_plus.entity_speed_ticker.power_ratio": "功耗比例: %s",
"screen.extendedae_plus.entity_speed_ticker.speed": "当前加速倍率: %d",
"screen.extendedae_plus.entity_speed_ticker.multiplier": "额外消耗倍率: %s",
"screen.extendedae_plus.entity_speed_ticker.warning_network_energy_insufficient": "§c§l网络能量不足",
"item.extendedae_plus.entity_speed_ticker.tip.requirement": "需要放入实体加速卡以启用加速",
"item.extendedae_plus.entity_speed_ticker.tip.max": "最高可达 1024x 加速",