filename:
common/src/main/java/rearth/oritech/util/TooltipHelper.java
branch:
1.21
back to repo
package rearth.oritech.util;
import net.minecraft.block.Block;
import net.minecraft.block.BlockEntityProvider;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.resource.language.I18n;
import net.minecraft.registry.Registries;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import net.minecraft.util.math.BlockPos;
import rearth.oritech.api.energy.EnergyApi;
import rearth.oritech.block.base.entity.ExpandableEnergyStorageBlockEntity;
import rearth.oritech.block.base.entity.FrameInteractionBlockEntity;
import rearth.oritech.block.base.entity.MachineBlockEntity;
import rearth.oritech.block.base.entity.UpgradableGeneratorBlockEntity;
import rearth.oritech.block.entity.interaction.DeepDrillEntity;
import rearth.oritech.block.entity.processing.AtomicForgeBlockEntity;
import java.text.NumberFormat;
import java.util.List;
import java.util.Locale;
public class TooltipHelper {
public static String getEnergyText(long amount) {
if (amount < 1000) {
return String.valueOf(amount);
} else if (amount < 1_000_000) {
return getFormatted(amount / 1_000.0) + I18n.translate("tooltip.oritech.thousand_abbrev");
} else if (amount < 1_000_000_000) {
return getFormatted(amount / 1_000_000.0) + I18n.translate("tooltip.oritech.million_abbrev");
} else if (amount < 1_000_000_000_000L) {
return getFormatted(amount / 1_000_000_000.0) + I18n.translate("tooltip.oritech.billion_abbrev");
} else {
return getFormatted(amount / 1_000_000_000_000.0) + I18n.translate("tooltip.oritech.trillion_abbrev");
}
}
private static String getFormatted(double number) {
var formatter = NumberFormat.getNumberInstance(Locale.ROOT);
formatter.setMinimumFractionDigits(0);
formatter.setMaximumFractionDigits(2);
return formatter.format(number);
}
public static void addMachineTooltip(List<Text> tooltip, Block block, BlockEntityProvider entityProvider) {
var showExtra = Screen.hasControlDown();
if (showExtra) {
var entity = entityProvider.createBlockEntity(BlockPos.ORIGIN, block.getDefaultState());
if (entity instanceof MultiblockMachineController multiblockController) {
var corePositions = multiblockController.getCorePositions();
tooltip.add(Text.translatable("tooltip.oritech.core_desc").formatted(Formatting.GRAY).append(Text.literal(String.valueOf(corePositions.size())).formatted(Formatting.GOLD)));
}
if (entity instanceof FrameInteractionBlockEntity) {
tooltip.add(Text.translatable("tooltip.oritech.frame_needed").formatted(Formatting.GRAY));
}
if (entity instanceof MachineAddonController addonProvider) {
var addonSlots = addonProvider.getAddonSlots();
tooltip.add(Text.translatable("tooltip.oritech.addon_desc").formatted(Formatting.GRAY).append(Text.literal(String.valueOf(addonSlots.size())).formatted(Formatting.GOLD)));
}
if (entity instanceof MachineBlockEntity machineEntity) {
var energyRate = machineEntity.getEnergyPerTick();
if (entity instanceof UpgradableGeneratorBlockEntity) {
tooltip.add(Text.translatable("tooltip.oritech.generator_rate_desc").formatted(Formatting.GRAY).append(Text.translatable("tooltip.oritech.energy_transfer_rate", energyRate).formatted(Formatting.GOLD)));
} else if (entity instanceof MachineBlockEntity) {
tooltip.add(Text.translatable("tooltip.oritech.machine_rate_desc").formatted(Formatting.GRAY).append(Text.translatable("tooltip.oritech.energy_transfer_rate", energyRate).formatted(Formatting.GOLD)));
}
} else if (entity instanceof ExpandableEnergyStorageBlockEntity energyStorage) {
var transferRate = energyStorage.getDefaultExtractionRate();
tooltip.add(Text.translatable("tooltip.oritech.energy_max_transfer").formatted(Formatting.GRAY).append(Text.translatable("tooltip.oritech.energy_transfer_rate", transferRate).formatted(Formatting.GOLD)));
}
if (entity instanceof EnergyApi.BlockProvider energyProvider) {
var maxStorage = getEnergyText(energyProvider.getEnergyStorage(null).getCapacity());
tooltip.add(Text.translatable("tooltip.oritech.machine_capacity_desc").formatted(Formatting.GRAY).append(Text.translatable("tooltip.oritech.energy_capacity", maxStorage).formatted(Formatting.GOLD)));
if (energyProvider instanceof AtomicForgeBlockEntity || energyProvider instanceof DeepDrillEntity)
tooltip.add(Text.translatable("tooltip.oritech.needs_laser_power").formatted(Formatting.BOLD));
var id = Registries.BLOCK.getId(block);
if (I18n.hasTranslation("tooltip.oritech." + id.getPath() + ".extra")) {
tooltip.add(Text.translatable("tooltip.oritech." + id.getPath() + ".extra").formatted(Formatting.GRAY));
}
}
} else {
tooltip.add(Text.translatable("tooltip.oritech.item_extra_info").formatted(Formatting.GRAY).formatted(Formatting.ITALIC));
}
}
public static Text getFormattedEnergyChangeTooltip(long amount, String unit) {
var formatted = getEnergyText(amount);
var text = amount > 0 ? "+" + formatted : formatted;
return Text.literal(text).formatted(Formatting.GOLD).append(unit).formatted(Formatting.GOLD);
}
public static Text getFormattedValueChangeTooltip(int amount) {
var text = amount > 0 ? "+" + amount : String.valueOf(amount);
var color = amount > 0 ? Formatting.GREEN : Formatting.RED;
return Text.literal(text).formatted(color).append("%").formatted(color);
}
}