我写的一个mc模组需要一个ui, 我就让大肥鱼试试写的怎么样 眩晕瘫坐了

代码
package org.creepebucket.programmable_magic.gui.machines.buffer;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Inventory;
import org.creepebucket.programmable_magic.gui.lib.api.DynamicValue;
import org.creepebucket.programmable_magic.gui.lib.widgets.*;
import org.creepebucket.programmable_magic.gui.machines.api.MachineScreen;
import org.creepebucket.programmable_magic.gui.machines.api.MachineWidgets;
import org.creepebucket.programmable_magic.utils.ModColors;
import java.util.List;
import static net.minecraft.network.chat.Component.literal;
import static org.creepebucket.programmable_magic.gui.lib.api.Coordinate.*;
import static org.creepebucket.programmable_magic.gui.lib.api.ThemeTemplate.*;
public class ManaBufferScreen extends MachineScreen<ManaBufferMenu> {
public ManaBufferScreen(ManaBufferMenu menu, Inventory playerInv, Component title) {
super(menu, playerInv, title);
}
@Override
public void buildWidget() {
super.buildWidget();
root.mainColor(ModColors.MAIN_COLOR_M);
var dividerColor = root.mainColor().withAlpha(0x3f);
// ================= 魔力存储窗口 ================= //
var storageWindow = addWidget(new MachineWidgets.InformationWindowWidget(fromCenter(-90, -75), fromTopLeft(280, 150), literal("魔力存储"), 0, 0));
storageWindow.addChild(new TextWidget(fromTopLeft(7, 18), literal("总当前存储 / J")).applyTheme(LABEL_TEXT));
storageWindow.addChild(new NumberDisplayWidget(fromTopLeft(7, 29), DynamicValue.fromSupplier(() ->
menu.radiationStorageJ.get() + menu.temperatureStorageJ.get() + menu.momentumStorageJ.get() + menu.pressureStorageJ.get()), 7, 1, true).mainColor(-1));
storageWindow.addChild(new TextWidget(fromTopRight(-7, 18), literal("总缓存上限 / J")).rightAlign().applyTheme(LABEL_TEXT));
storageWindow.addChild(new NumberDisplayWidget(fromTopRight(-7, 29), DynamicValue.fromSupplier(() ->
menu.radiationCacheJ.get() + menu.temperatureCacheJ.get() + menu.momentumCacheJ.get() + menu.pressureCacheJ.get()), 7, 1, true).rightAlign().mainColor(-1));
storageWindow.addChild(new RectangleWidget(fromTopLeft(7, 42), custom(1, -14, 0, 1)).mainColor(dividerColor));
var names = List.of(literal("辐射"), literal("温度"), literal("动量"), literal("压力"));
var colors = List.of(ModColors.MAIN_COLOR_R, ModColors.MAIN_COLOR_T, ModColors.MAIN_COLOR_M, ModColors.MAIN_COLOR_P);
var currents = List.of(menu.radiationStorageJ, menu.temperatureStorageJ, menu.momentumStorageJ, menu.pressureStorageJ);
var caches = List.of(menu.radiationCacheJ, menu.temperatureCacheJ, menu.momentumCacheJ, menu.pressureCacheJ);
for (int i = 0; i < 4; i++) {
int y = 48 + i * 16;
storageWindow.addChild(new RectangleWidget(fromTopLeft(7, y + 1), fromTopLeft(2, 8)).mainColor(colors.get(i)));
storageWindow.addChild(new TextWidget(fromTopLeft(13, y), names.get(i)).applyTheme(GENERAL_TEXT));
storageWindow.addChild(new ProgressBarWidget(fromTopLeft(45, y), custom(1, -52, 0, 9), currents.get(i), caches.get(i)).mainColor(colors.get(i)).bgColor(colors.get(i).withAlpha(0x1f)));
}
storageWindow.addChild(new RectangleWidget(fromTopLeft(7, 110), custom(1, -14, 0, 1)).mainColor(dividerColor));
storageWindow.addChild(new TextWidget(fromTopLeft(7, 118), literal("基础存储 / J")).applyTheme(LABEL_TEXT));
storageWindow.addChild(new NumberDisplayWidget(fromTopLeft(7, 128), menu.baseStorage, 6, 1, true).mainColor(-1));
storageWindow.addChild(new TextWidget(fromCenterTop(0, 118), literal("基础扩容量 / J")).applyTheme(LABEL_TEXT));
storageWindow.addChild(new NumberDisplayWidget(fromCenterTop(0, 128), menu.baseExpansion, 6, 1, true).centerAlign().mainColor(-1));
storageWindow.addChild(new TextWidget(fromTopRight(-7, 118), literal("扩容功率 / W")).rightAlign().applyTheme(LABEL_TEXT));
storageWindow.addChild(new NumberDisplayWidget(fromTopRight(-7, 128), menu.baseExpansionPower, 6, 1, true).rightAlign().mainColor(-1));
// ================= 充能窗口 ================= //
var chargeWindow = addWidget(new MachineWidgets.InformationWindowWidget(fromCenter(160, -70), fromTopLeft(180, 135), literal("充能"), 0, 0));
chargeWindow.addChild(new TextWidget(fromTopLeft(7, 18), literal("充能槽位")).applyTheme(LABEL_TEXT));
int slotCount = menu.slots.size() - 36;
int slotsW = slotCount * 20 - 4;
int slotsX = (180 - slotsW) / 2;
for (int i = 0; i < slotCount; i++) {
chargeWindow.addChild(new OutlineWidget(fromTopLeft(slotsX + i * 20, 29), fromTopLeft(16, 16)).mainColor(0x1fffffff));
chargeWindow.addChild(new SlotWidget(menu.slots.get(36 + i), fromTopLeft(slotsX + i * 20, 29)));
}
chargeWindow.addChild(new RectangleWidget(fromTopLeft(7, 52), custom(1, -14, 0, 1)).mainColor(dividerColor));
chargeWindow.addChild(new TextWidget(fromTopLeft(7, 60), literal("充能功率 / W")).applyTheme(LABEL_TEXT));
chargeWindow.addChild(new NumberDisplayWidget(fromTopLeft(7, 71), DynamicValue.fromSupplier(() -> menu.maxChargePower.get() * menu.powerFact.get()), 7, 1, true).mainColor(-1));
chargeWindow.addChild(new TextWidget(fromTopRight(-7, 60), literal("扩容功率 / W")).rightAlign().applyTheme(LABEL_TEXT));
chargeWindow.addChild(new NumberDisplayWidget(fromTopRight(-7, 71), DynamicValue.fromSupplier(() -> menu.baseExpansionPower.get() * menu.powerFact.get()), 7, 1, true).rightAlign().mainColor(-1));
chargeWindow.addChild(new RectangleWidget(fromTopLeft(7, 88), custom(1, -14, 0, 1)).mainColor(dividerColor));
chargeWindow.addChild(new TextWidget(fromTopLeft(7, 96), literal("超频倍率")).applyTheme(GENERAL_TEXT));
chargeWindow.addChild(new NumberDisplayWidget(fromTopLeft(44, 92), menu.powerFact, 4, 1.5, true).mainColor(-1));
for (int i = 1; i < 5; i++) {
chargeWindow.addChild(new TextWidget(custom((double) i / 5, (int) Math.floor(-14 * (double) i / 5 + 7), 1, -13), literal(String.valueOf(i))).scaled(0.5).centerAlign().applyTheme(DIM_TEXT));
}
chargeWindow.addChild(new TextWidget(custom(0, 7, 1, -13), literal("0")).scaled(0.5).applyTheme(DIM_TEXT));
chargeWindow.addChild(new TextWidget(custom(1, -6, 1, -13), literal("5")).scaled(0.5).rightAlign().applyTheme(DIM_TEXT));
chargeWindow.addChild(new ThinSlideBarWidget(fromBottomLeft(7, -9), custom(1, -14, 0, 5), 0, 5, menu.powerFact).step(0.05).bgColor(-1));
// ================= 机器控制窗口 ================= //
addWidget(new MachineWidgets.MachineControlWindow(fromCenter(160, 85), fromTopLeft(180, 40), menu));
}
}
4pro的

代码
package org.creepebucket.programmable_magic.gui.machines.buffer;
import net.minecraft.client.gui.GuiGraphicsExtractor;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Inventory;
import org.creepebucket.programmable_magic.gui.lib.api.Coordinate;
import org.creepebucket.programmable_magic.gui.lib.api.DynamicValue;
import org.creepebucket.programmable_magic.gui.lib.api.Widget;
import org.creepebucket.programmable_magic.gui.lib.api.widgets.Lifecycle;
import org.creepebucket.programmable_magic.gui.lib.api.widgets.Renderable;
import org.creepebucket.programmable_magic.gui.lib.widgets.*;
import org.creepebucket.programmable_magic.gui.machines.api.MachineScreen;
import org.creepebucket.programmable_magic.gui.machines.api.MachineWidgets;
import org.creepebucket.programmable_magic.utils.ModColors;
import static net.minecraft.network.chat.Component.literal;
import static org.creepebucket.programmable_magic.gui.lib.api.Coordinate.*;
import static org.creepebucket.programmable_magic.gui.lib.api.ThemeTemplate.GENERAL_TEXT;
import static org.creepebucket.programmable_magic.gui.lib.api.ThemeTemplate.LABEL_TEXT;
public class ManaBufferScreen extends MachineScreen<ManaBufferMenu> {
public ManaBufferScreen(ManaBufferMenu menu, Inventory playerInv, Component title) {
super(menu, playerInv, title);
}
@Override
public void buildWidget() {
super.buildWidget();
root.mainColor(ModColors.MAIN_COLOR_T);
addWidget(new RectangleWidget(fromTopLeft(0, 0), fromBottomRight(0, 0))
.mainColor(0x7f000000));
var titleWidget = new TextWidget(fromCenterTop(0, 12), literal("魔力缓冲器"))
.scaled(2.2).noShadow().mainColor(-1);
addWidget(titleWidget.centerAlign());
var powerSwitch = new SwitchWidget(fromTopRight(-56, 12),
fromTopLeft(50, 19), literal("关闭"), literal("开启"), menu.enabled)
.onSwitch(enabled -> menu.powerSwitch.trigger(enabled));
addWidget(powerSwitch.rightAlign().mainColor(-1));
buildManaWindow();
buildParamWindow();
buildSlotWindow();
buildInventoryWindow();
}
private void buildManaWindow() {
addWidget(new MachineWidgets.InformationWindowWidget(fromTopLeft(8, 40), fromTopLeft(240, 260), literal("魔力网络"), 200, 200) {
@Override
public void onInitialize() {
super.onInitialize();
String[] names = {"辐射", "温度", "动量", "压力"};
int[] colors = {
ModColors.MAIN_COLOR_R.toArgb(),
ModColors.MAIN_COLOR_T.toArgb(),
ModColors.MAIN_COLOR_M.toArgb(),
ModColors.MAIN_COLOR_P.toArgb()};
addManaRow(this, 0, names[0], colors[0],
menu.radiationStorageJ, menu.radiationCacheJ, menu.radiationPowerW);
addManaRow(this, 1, names[1], colors[1],
menu.temperatureStorageJ, menu.temperatureCacheJ, menu.temperaturePowerW);
addManaRow(this, 2, names[2], colors[2],
menu.momentumStorageJ, menu.momentumCacheJ, menu.momentumPowerW);
addManaRow(this, 3, names[3], colors[3],
menu.pressureStorageJ, menu.pressureCacheJ, menu.pressurePowerW);
}
});
}
private void addManaRow(Widget panel, int idx, String name, int color,
DynamicValue<Double> storage, DynamicValue<Double> cache,
DynamicValue<Double> power) {
int rowY = 16 + idx * 62;
panel.addChild(new RectangleWidget(fromTopLeft(4, rowY + 2), fromTopLeft(3, 44))
.mainColor(color));
panel.addChild(new TextWidget(fromTopLeft(11, rowY + 4), literal(name))
.noShadow().mainColor(0xffbfbfbf));
panel.addChild(new NumberDisplayWidget(fromTopLeft(11, rowY + 16),
storage, 7, 1, true).mainColor(-1));
panel.addChild(new TextWidget(fromTopLeft(54, rowY + 17), literal("J"))
.applyTheme(GENERAL_TEXT));
panel.addChild(new ProgressBarWidget(
fromTopLeft(11, rowY + 28),
fromTopRight(-50, 8), storage, cache)
.mainColor(color)
.bgColor(0x0f000000 | (color & 0x00ffffff)));
panel.addChild(new NumberDisplayWidget(fromTopRight(-48, rowY + 16),
power, 6, 1, true).rightAlign().mainColor(-1));
panel.addChild(new TextWidget(fromTopRight(-12, rowY + 17), literal("W"))
.rightAlign().applyTheme(GENERAL_TEXT));
}
private void buildParamWindow() {
addWidget(new MachineWidgets.InformationWindowWidget(fromTopLeft(254, 40), fromTopLeft(238, 188), literal("机器参数"), 150, 120) {
@Override
public void onInitialize() {
super.onInitialize();
addParamRow(this, 0, "基础储量", menu.baseStorage, "");
addParamRow(this, 1, "基础扩张", menu.baseExpansion, "");
addParamRow(this, 2, "扩张功率", menu.baseExpansionPower, " W");
addParamRow(this, 3, "最大充电功率", menu.maxChargePower, " W");
int powerRowY = 16 + 4 * 22;
addChild(new TextWidget(fromTopLeft(7, powerRowY), literal("功率因子"))
.applyTheme(LABEL_TEXT));
addChild(new NumberDisplayWidget(fromTopLeft(7, powerRowY + 11),
menu.powerFact, 4, 1.1, true).mainColor(-1));
menu.powerFact.whenFirstDataArrivesDo(() -> addChild(
new ThinSlideBarWidget(fromTopLeft(40, powerRowY + 11),
fromTopRight(-14, 7), 0, 4, menu.powerFact)
.step(0.05).mainColor(-1).bgColor(-1)));
int countRowY = powerRowY + 22;
addChild(new TextWidget(fromTopLeft(7, countRowY), literal("充电槽数"))
.applyTheme(LABEL_TEXT));
addChild(new NumberDisplayWidget(fromTopLeft(7, countRowY + 11),
DynamicValue.fromSupplier(() -> (double) menu.chargeSlotCount.get()),
3, 1.1, true).mainColor(-1));
}
});
}
private void addParamRow(Widget panel, int idx, String label,
DynamicValue<Double> value, String unit) {
int rowY = 16 + idx * 22;
panel.addChild(new TextWidget(fromTopLeft(7, rowY), literal(label))
.applyTheme(LABEL_TEXT));
panel.addChild(new NumberDisplayWidget(fromTopLeft(7, rowY + 11),
value, 7, 1, true).mainColor(-1));
if (!unit.isEmpty())
panel.addChild(new TextWidget(fromTopLeft(50, rowY + 12),
literal(unit)).noShadow().mainColor(-1));
}
private void buildSlotWindow() {
addWidget(new MachineWidgets.InformationWindowWidget(fromTopLeft(254, 234), fromTopLeft(238, 100), literal("充电槽"), 150, 60) {
@Override
public void onInitialize() {
super.onInitialize();
var slots = menu.slots;
int startIdx = 36;
int cols = 7;
for (int i = startIdx; i < slots.size(); i++) {
int idx = i - startIdx;
int col = idx % cols;
int row = idx / cols;
int x = 16 + col * 19;
int y = 18 + row * 19;
addChild(new RectangleWidget(
fromTopLeft(x - 1, y - 1), fromTopLeft(18, 18))
.mainColor(0x1fffffff));
addChild(new SlotWidget(slots.get(i), fromTopLeft(x, y)));
}
}
});
}
private void buildInventoryWindow() {
addWidget(new MachineWidgets.InventoryWindow(fromTopLeft(8, 306), fromTopLeft(240, 88)));
}
public static class Panel extends Widget implements Lifecycle, Renderable {
public Component title;
public Panel(Coordinate pos, Coordinate size, Component title) {
super(pos, size);
this.title = title;
}
@Override
public void onInitialize() {
addChild(new RectangleWidget(fromTopLeft(0, 0), fromTopRight(0, 11))
.mainColor(0xbf000000));
addChild(new TextWidget(fromTopLeft(7, 2), title).applyTheme(LABEL_TEXT));
addChild(new RectangleWidget(fromTopLeft(0, 11), fromBottomRight(0, -11))
.mainColor(0x3f000000));
}
@Override
public void render(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float partialTick) {
graphics.outline(left(), top(), w(), h(), 0x7fffffff);
}
}
}
我说无论是在输出质量上 代码质量上都是无敌了
而且4flash一次过的编译, 4pro和编译器斗智斗勇了好半天