diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 index 013832a0b..b56f0fd67 100644 --- a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 +++ b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 @@ -1,2 +1,2 @@ -// 1.20.1 2024-03-14T10:02:21.002961 Languages: en_us -fafdc29c1651188bf7e6cd558f854b196852895b assets/railcraft/lang/en_us.json +// 1.20.1 2024-03-14T16:35:30.213199 Languages: en_us +910cc1acd8c0dd39065b0cc7f71c0710179e7faa assets/railcraft/lang/en_us.json diff --git a/src/generated/resources/assets/railcraft/lang/en_us.json b/src/generated/resources/assets/railcraft/lang/en_us.json index e5d1c8632..612a52f1b 100644 --- a/src/generated/resources/assets/railcraft/lang/en_us.json +++ b/src/generated/resources/assets/railcraft/lang/en_us.json @@ -406,10 +406,16 @@ "block.railcraft.zinc_ore": "Zinc Ore", "block.railcraft.zinc_silver_battery": "Zinc-Silver Battery", "block.railcraft.zinc_silver_battery_empty": "Zinc-Silver Empty Battery", - "charge_meter.railcraft.cart": "Cart -> Charge: %s FE | Draw: %s FE/t | Loss: %s FE/t", - "charge_meter.railcraft.network": "Network -> Size: %s | Charge: %s FE | Draw: %s FE/t | MaxDraw: %s FE/t | Loss: %s FE/t | Eff: %s%%", - "charge_meter.railcraft.node": "Node -> Draw: %s FE/t | Loss: %s FE/t", - "charge_meter.railcraft.producer": "Supply -> Charge: %s FE | Production: %s FE/t | MaxDraw: %s FE/t | Loss: %s FE/t | Eff: %s%%", + "charge_meter.railcraft.cart": "Cart:", + "charge_meter.railcraft.charge": "Charge:", + "charge_meter.railcraft.draw": "Draw:", + "charge_meter.railcraft.efficiency": "Efficiency:", + "charge_meter.railcraft.loss": "Loss:", + "charge_meter.railcraft.max_draw": "MaxDraw:", + "charge_meter.railcraft.network": "Network:", + "charge_meter.railcraft.node": "Node:", + "charge_meter.railcraft.producer": "Producer:", + "charge_meter.railcraft.size": "Size:", "charge_meter.railcraft.start": "Recording data over %s seconds...", "config.jade.plugin_railcraft.locomotive": "Locomotive", "config.jade.plugin_railcraft.signals": "Signals", @@ -879,6 +885,7 @@ "tips.railcraft.efficiency": "Efficiency: %s%%", "tips.railcraft.embarking_track": "Loads entities into carts", "tips.railcraft.empty": "Empty", + "tips.railcraft.energy": "Energy:", "tips.railcraft.explosion_resistant": "Explosion resistant", "tips.railcraft.feed_station": "Feeds animals", "tips.railcraft.firestone.charged": "Filled with energy, you only need to exert your will onto it to release it's blistering heat...", @@ -956,6 +963,7 @@ "tips.railcraft.one_way_track": "Carts can only pass in the direction of the arrow", "tips.railcraft.overalls": "Protection against the dangers of track-working", "tips.railcraft.pair_with_control_track": "- Pair with Control track -", + "tips.railcraft.percentage": "Percentage:", "tips.railcraft.place_above_track": "- Place 1-2 blocks above track -", "tips.railcraft.place_over_track": "- Place over track -", "tips.railcraft.place_under_track": "- Place under track -", diff --git a/src/main/java/mods/railcraft/Railcraft.java b/src/main/java/mods/railcraft/Railcraft.java index c86dca2ba..21d343f8c 100644 --- a/src/main/java/mods/railcraft/Railcraft.java +++ b/src/main/java/mods/railcraft/Railcraft.java @@ -302,8 +302,7 @@ public void handleEntityInteract(PlayerInteractEvent.EntityInteract event) { .filter(ChargeCartStorageImpl.class::isInstance) .map(ChargeCartStorageImpl.class::cast) .ifPresent(battery -> { - ChargeMeterItem.sendChat(player, Translations.ChargeMeter.CART, - battery.getEnergyStored(), battery.getDraw(), battery.getLosses()); + ChargeMeterItem.sendCartStat(player, cart.getDisplayName(), battery); event.setCanceled(true); event.setCancellationResult(InteractionResult.SUCCESS); }); diff --git a/src/main/java/mods/railcraft/Translations.java b/src/main/java/mods/railcraft/Translations.java index 413c989a7..bfa0e6451 100644 --- a/src/main/java/mods/railcraft/Translations.java +++ b/src/main/java/mods/railcraft/Translations.java @@ -337,6 +337,8 @@ public static class Tips { public static final String TYPE_RECHARGEABLE = makeKey("tips", "type_rechargeable"); public static final String TYPE_DISPOSABLE = makeKey("tips", "type_disposable"); public static final String EMPTY = makeKey("tips", "empty"); + public static final String ENERGY = makeKey("tips", "energy"); + public static final String PERCENTAGE = makeKey("tips", "percentage"); } public static class Container { @@ -583,7 +585,13 @@ public static class RoutingTable { public static class ChargeMeter { public static final String START = makeKey("charge_meter", "start"); public static final String CART = makeKey("charge_meter", "cart"); + public static final String CHARGE = makeKey("charge_meter", "charge"); + public static final String DRAW = makeKey("charge_meter", "draw"); + public static final String LOSS = makeKey("charge_meter", "loss"); public static final String NETWORK = makeKey("charge_meter", "network"); + public static final String SIZE = makeKey("charge_meter", "size"); + public static final String MAX_DRAW = makeKey("charge_meter", "max_draw"); + public static final String EFFICIENCY = makeKey("charge_meter", "efficiency"); public static final String NODE = makeKey("charge_meter", "node"); public static final String PRODUCER = makeKey("charge_meter", "producer"); } diff --git a/src/main/java/mods/railcraft/data/RailcraftLanguageProvider.java b/src/main/java/mods/railcraft/data/RailcraftLanguageProvider.java index fcf4398eb..50319f90e 100644 --- a/src/main/java/mods/railcraft/data/RailcraftLanguageProvider.java +++ b/src/main/java/mods/railcraft/data/RailcraftLanguageProvider.java @@ -613,6 +613,8 @@ private void tipsTranslations() { this.add(Translations.Tips.TOKEN_SIGNAL, "Detects carts entering/leaving Token Area"); this.add(Translations.Tips.TOKEN_AREA, "%sx Token Area"); this.add(Translations.Tips.EMPTY, "Empty"); + this.add(Translations.Tips.ENERGY, "Energy:"); + this.add(Translations.Tips.PERCENTAGE, "Percentage:"); } private void screenTranslations() { @@ -1282,15 +1284,16 @@ private void routingTableTranslations() { private void chargeMeterTranslations() { this.add(Translations.ChargeMeter.START, "Recording data over %s seconds..."); - this.add(Translations.ChargeMeter.CART, """ - Cart -> Charge: %s FE | Draw: %s FE/t | Loss: %s FE/t"""); - this.add(Translations.ChargeMeter.NETWORK, """ - Network -> Size: %s | Charge: %s FE | Draw: %s FE/t | MaxDraw: %s FE/t | Loss: %s FE/t | \ - Eff: %s%%"""); - this.add(Translations.ChargeMeter.NODE, "Node -> Draw: %s FE/t | Loss: %s FE/t"); - this.add(Translations.ChargeMeter.PRODUCER, """ - Supply -> Charge: %s FE | Production: %s FE/t | MaxDraw: %s FE/t | Loss: %s FE/t | \ - Eff: %s%%"""); + this.add(Translations.ChargeMeter.CART, "Cart:"); + this.add(Translations.ChargeMeter.CHARGE, "Charge:"); + this.add(Translations.ChargeMeter.DRAW, "Draw:"); + this.add(Translations.ChargeMeter.LOSS, "Loss:"); + this.add(Translations.ChargeMeter.NETWORK, "Network:"); + this.add(Translations.ChargeMeter.SIZE, "Size:"); + this.add(Translations.ChargeMeter.MAX_DRAW, "MaxDraw:"); + this.add(Translations.ChargeMeter.EFFICIENCY, "Efficiency:"); + this.add(Translations.ChargeMeter.NODE, "Node:"); + this.add(Translations.ChargeMeter.PRODUCER, "Producer:"); } private void keyBindingTranslations() { diff --git a/src/main/java/mods/railcraft/gui/widget/EnergyStorageBatteryIndicator.java b/src/main/java/mods/railcraft/gui/widget/EnergyStorageBatteryIndicator.java index c357c06eb..500672d60 100644 --- a/src/main/java/mods/railcraft/gui/widget/EnergyStorageBatteryIndicator.java +++ b/src/main/java/mods/railcraft/gui/widget/EnergyStorageBatteryIndicator.java @@ -2,7 +2,9 @@ import java.util.ArrayList; import java.util.List; +import mods.railcraft.Translations; import mods.railcraft.util.HumanReadableNumberFormatter; +import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraftforge.energy.IEnergyStorage; @@ -23,10 +25,18 @@ public void refresh() { float chargeLevel = charge * 100.0F; float energyStorage = charge * capacity; this.tooltip.clear(); - this.tooltip.add(Component.literal(String.format("%.0f%%", chargeLevel))); - this.tooltip.add(Component.literal(String.format("%sFE / %sFE", + this.tooltip.add(Component.translatable(Translations.Tips.PERCENTAGE) + .withStyle(ChatFormatting.GREEN) + .append(" ") + .append(Component.literal(String.format("%.0f%%", chargeLevel)) + .withStyle(ChatFormatting.WHITE))); + this.tooltip.add(Component.translatable(Translations.Tips.ENERGY) + .withStyle(ChatFormatting.GREEN) + .append(" ") + .append(Component.literal(String.format("%sFE / %sFE", HumanReadableNumberFormatter.format(energyStorage), - HumanReadableNumberFormatter.format(capacity)))); + HumanReadableNumberFormatter.format(capacity))) + .withStyle(ChatFormatting.WHITE))); } @Override diff --git a/src/main/java/mods/railcraft/world/item/ChargeMeterItem.java b/src/main/java/mods/railcraft/world/item/ChargeMeterItem.java index a88b0ce4d..15c3da2df 100644 --- a/src/main/java/mods/railcraft/world/item/ChargeMeterItem.java +++ b/src/main/java/mods/railcraft/world/item/ChargeMeterItem.java @@ -1,13 +1,18 @@ package mods.railcraft.world.item; +import org.apache.commons.lang3.StringUtils; import mods.railcraft.RailcraftConfig; import mods.railcraft.Translations; import mods.railcraft.api.charge.Charge; import mods.railcraft.api.charge.ChargeBlock; import mods.railcraft.api.charge.ChargeStorage; +import mods.railcraft.charge.ChargeCartStorageImpl; import mods.railcraft.charge.ChargeNetworkImpl; +import mods.railcraft.charge.ChargeStorageBlockImpl; import mods.railcraft.util.HumanReadableNumberFormatter; +import net.minecraft.ChatFormatting; import net.minecraft.SharedConstants; +import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionResult; @@ -37,25 +42,15 @@ public InteractionResult useOn(UseOnContext context) { var node = (ChargeNetworkImpl.ChargeNode) chargeBlock.getMeterAccess(Charge.distribution, state, (ServerLevel) level, pos); if (node != null && node.isValid() && !node.isGridNull()) { - sendChat(player, Translations.ChargeMeter.START, SECONDS_TO_RECORD); + player.displayClientMessage( + Component.translatable(Translations.ChargeMeter.START, SECONDS_TO_RECORD), false); node.startUsageRecording(SECONDS_TO_RECORD * SharedConstants.TICKS_PER_SECOND, avg -> { - var grid = node.getGrid(); - sendChat(player, Translations.ChargeMeter.NETWORK, grid.size(), - grid.isInfinite() ? "INF" : grid.getCharge(), grid.getAverageUsagePerTick(), - grid.getMaxDraw(), grid.getLosses(), grid.getEfficiency() * 100.0); - - + sendNetworkStat(player, node.getGrid()); var battery = node.storage().orElse(null); if (battery == null) { - sendChat(player, Translations.ChargeMeter.NODE, avg, node.getChargeSpec().losses()); + sendNodeStat(player, avg, node); } else { - var infiniteBattery = battery.getState() == ChargeStorage.State.INFINITE; - sendChat(player, Translations.ChargeMeter.PRODUCER, - infiniteBattery ? "INF" : battery.getAvailableCharge(), - infiniteBattery ? "INF" : "NA", - battery.getMaxDraw(), - node.getChargeSpec().losses() * RailcraftConfig.SERVER.lossMultiplier.get(), - battery.getEfficiency() * 100.0); + sendProducerStat(player, battery, node); } }); returnValue = InteractionResult.SUCCESS; @@ -64,11 +59,55 @@ public InteractionResult useOn(UseOnContext context) { return returnValue; } - public static void sendChat(Player player, String translation, Object... args) { - for (int i = 0; i < args.length; i++) { - if (args[i] instanceof Double doubleArg) - args[i] = HumanReadableNumberFormatter.format(doubleArg); - } - player.displayClientMessage(Component.translatable(translation, args), false); + public static void sendCartStat(Player player, Component displayName, + ChargeCartStorageImpl cartStorage) { + player.displayClientMessage(CommonComponents.joinLines( + displayName.copy().withStyle(ChatFormatting.BLUE), + lineFormatter(Translations.ChargeMeter.CHARGE, cartStorage.getEnergyStored(), "FE"), + lineFormatter(Translations.ChargeMeter.DRAW, cartStorage.getDraw(), "FE/t"), + lineFormatter(Translations.ChargeMeter.LOSS, cartStorage.getLosses(), "FE/t") + ), false); + } + + private static void sendNetworkStat(Player player, ChargeNetworkImpl.ChargeGrid grid) { + player.displayClientMessage(CommonComponents.joinLines( + Component.translatable(Translations.ChargeMeter.NETWORK).withStyle(ChatFormatting.BLUE), + lineFormatter(Translations.ChargeMeter.SIZE, grid.size(), ""), + lineFormatter(Translations.ChargeMeter.CHARGE, grid.isInfinite() ? "INF" : grid.getCharge(), "FE"), + lineFormatter(Translations.ChargeMeter.DRAW, grid.getAverageUsagePerTick(), "FE/t"), + lineFormatter(Translations.ChargeMeter.MAX_DRAW, grid.getMaxDraw(), "FE/t"), + lineFormatter(Translations.ChargeMeter.LOSS, grid.getLosses(), "FE/t"), + lineFormatter(Translations.ChargeMeter.EFFICIENCY, grid.getEfficiency() * 100.0, "%") + ), false); + } + + private static void sendNodeStat(Player player, double avg, ChargeNetworkImpl.ChargeNode node) { + player.displayClientMessage(CommonComponents.joinLines( + Component.translatable(Translations.ChargeMeter.NODE).withStyle(ChatFormatting.BLUE), + lineFormatter(Translations.ChargeMeter.DRAW, avg, "FE"), + lineFormatter(Translations.ChargeMeter.LOSS, node.getChargeSpec().losses(), "FE/t") + ), false); + } + + private static void sendProducerStat(Player player, ChargeStorageBlockImpl battery, + ChargeNetworkImpl.ChargeNode node) { + var infiniteBattery = battery.getState() == ChargeStorage.State.INFINITE; + var loss = node.getChargeSpec().losses() * RailcraftConfig.SERVER.lossMultiplier.get(); + player.displayClientMessage(CommonComponents.joinLines( + Component.translatable(Translations.ChargeMeter.PRODUCER).withStyle(ChatFormatting.BLUE), + lineFormatter(Translations.ChargeMeter.CHARGE, infiniteBattery ? "INF" : battery.getAvailableCharge(), "FE"), + lineFormatter(Translations.ChargeMeter.MAX_DRAW, battery.getMaxDraw(), "FE/t"), + lineFormatter(Translations.ChargeMeter.LOSS, loss, "FE/t"), + lineFormatter(Translations.ChargeMeter.EFFICIENCY, battery.getEfficiency() * 100.0, "%") + ), false); + } + + private static Component lineFormatter(String translation, Object data, String unit) { + if (data instanceof Double doubleArg) + data = HumanReadableNumberFormatter.format(doubleArg); + return Component.translatable(translation) + .withStyle(ChatFormatting.GREEN) + .append(Component.literal(" " + data + (StringUtils.isEmpty(unit) ? "" : " ") + unit) + .withStyle(ChatFormatting.WHITE)); } }