superb-warfare/src/main/java/com/atsuishio/superbwarfare/client/tooltip/ClientCellImageTooltip.java
2025-05-24 02:20:33 +08:00

97 lines
3.3 KiB
Java

package com.atsuishio.superbwarfare.client.tooltip;
import com.atsuishio.superbwarfare.client.tooltip.component.CellImageComponent;
import net.minecraft.ChatFormatting;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.util.Mth;
import net.minecraft.world.item.ItemStack;
import net.neoforged.neoforge.capabilities.Capabilities;
import org.jetbrains.annotations.NotNull;
public class ClientCellImageTooltip implements ClientTooltipComponent {
protected final int width;
protected final int height;
protected final ItemStack stack;
public ClientCellImageTooltip(CellImageComponent tooltip) {
this.width = tooltip.width;
this.height = tooltip.height;
this.stack = tooltip.stack;
}
@Override
public void renderImage(@NotNull Font font, int x, int y, GuiGraphics guiGraphics) {
guiGraphics.pose().pushPose();
if (shouldRenderEnergyTooltip()) {
renderEnergyTooltip(font, guiGraphics, x, y);
}
guiGraphics.pose().popPose();
}
protected boolean shouldRenderEnergyTooltip() {
return stack.getCapability(Capabilities.EnergyStorage.ITEM) != null;
}
protected void renderEnergyTooltip(Font font, GuiGraphics guiGraphics, int x, int y) {
guiGraphics.drawString(font, getEnergyComponent(), x, y, 0xFFFFFF);
}
protected Component getEnergyComponent() {
var storage = stack.getCapability(Capabilities.EnergyStorage.ITEM);
assert storage != null;
int energy = storage.getEnergyStored();
int maxEnergy = storage.getMaxEnergyStored();
float percentage = Mth.clamp((float) energy / maxEnergy, 0, 1);
MutableComponent component = Component.empty();
ChatFormatting format;
if (percentage <= .2f) {
format = ChatFormatting.RED;
} else if (percentage <= .6f) {
format = ChatFormatting.YELLOW;
} else {
format = ChatFormatting.GREEN;
}
int count = (int) (percentage * 50);
for (int i = 0; i < count; i++) {
component.append(Component.literal("|").withStyle(format));
}
component.append(Component.empty().withStyle(ChatFormatting.RESET));
for (int i = 0; i < 50 - count; i++) {
component.append(Component.literal("|").withStyle(ChatFormatting.GRAY));
}
component.append(Component.literal(" " + energy + "/" + maxEnergy + " FE").withStyle(ChatFormatting.GRAY));
return component;
}
@Override
public int getHeight() {
int height = 20;
if (shouldRenderEnergyTooltip()) height -= 10;
return height;
}
@Override
public int getWidth(@NotNull Font font) {
int width;
if (Screen.hasShiftDown()) {
width = Math.max(this.width, 20);
} else {
width = 20;
}
if (shouldRenderEnergyTooltip())
width = Math.max(width, font.width(getEnergyComponent().getVisualOrderText()) + 10);
return width;
}
}