80 lines
2.6 KiB
Java
80 lines
2.6 KiB
Java
package com.extendedae_plus.util;
|
||
|
||
import appeng.api.crafting.PatternDetailsHelper;
|
||
import appeng.api.stacks.GenericStack;
|
||
import net.minecraft.client.Minecraft;
|
||
import net.minecraft.client.gui.Font;
|
||
import net.minecraft.client.gui.GuiGraphics;
|
||
import net.minecraft.world.item.ItemStack;
|
||
|
||
|
||
/**
|
||
* GUI工具类,提供样板获取、绘制等通用功能
|
||
*/
|
||
public class GuiUtil {
|
||
private GuiUtil() {throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");}
|
||
|
||
/**
|
||
* 从样板中获取输出数量文本
|
||
*
|
||
* @param pattern 样板物品
|
||
* @return 格式化后的数量文本
|
||
*/
|
||
public static String getPatternOutputText(ItemStack pattern) {
|
||
if (pattern.isEmpty()) {
|
||
return "";
|
||
}
|
||
|
||
var details = PatternDetailsHelper.decodePattern(pattern, Minecraft.getInstance().level, false);
|
||
if (details == null || details.getOutputs().length == 0) {
|
||
return "";
|
||
}
|
||
|
||
GenericStack out = details.getOutputs()[0];
|
||
long amount = out.amount();
|
||
long perUnit = out.what().getAmountPerUnit();
|
||
if (amount <= 0 || perUnit <= 0) {
|
||
return "";
|
||
}
|
||
|
||
// 计算实际单位数量,支持小数
|
||
double units = (double) amount / perUnit;
|
||
if (units <= 0) {
|
||
return "";
|
||
}
|
||
|
||
// 自动判断是否为流体,避免重复后缀
|
||
String autoSuffix = "";
|
||
if (perUnit > 1) {
|
||
// 如果每单位数量大于1,说明是流体(如1000mB = 1B)
|
||
autoSuffix = "B";
|
||
}
|
||
return NumberFormatUtil.formatNumberWithDecimal(units) + autoSuffix;
|
||
}
|
||
|
||
/**
|
||
* 在槽位右下角绘制数量文本
|
||
* @param guiGraphics GUI图形上下文
|
||
* @param font 字体
|
||
* @param text 要绘制的文本
|
||
* @param slotX 槽位X坐标
|
||
* @param slotY 槽位Y坐标
|
||
* @param scale 缩放比例
|
||
*/
|
||
public static void drawAmountText(GuiGraphics guiGraphics, Font font, String text, int slotX, int slotY, float scale) {
|
||
if (text.isEmpty()) {
|
||
return;
|
||
}
|
||
|
||
// 计算缩放后的字体宽度,确保右对齐
|
||
int scaledWidth = (int)(font.width(text) * scale);
|
||
int textX = slotX + 16 - scaledWidth;
|
||
int textY = slotY + 11; // 右下角显示
|
||
|
||
guiGraphics.pose().pushPose();
|
||
guiGraphics.pose().translate(0, 0, 300); // 提升 Z,确保在最上层
|
||
guiGraphics.pose().scale(scale, scale, 1.0f); // 缩小字体
|
||
guiGraphics.drawString(font, text, (int)(textX / scale), (int)(textY / scale), 0xFFFFFFFF, true);
|
||
guiGraphics.pose().popPose();
|
||
}
|
||
} |