移植完成

This commit is contained in:
GaLicn 2025-12-12 14:32:37 +08:00
parent d5b7c09ac9
commit 9cf8a430f5
2 changed files with 100 additions and 14 deletions

View File

@ -9,16 +9,18 @@ import com.mojang.blaze3d.systems.RenderSystem;
import net.neoforged.neoforge.network.PacketDistributor; import net.neoforged.neoforge.network.PacketDistributor;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.components.Tooltip;
import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.EditBox;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Inventory;
import org.lwjgl.glfw.GLFW;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.Consumer;
public class LabeledWirelessTransceiverScreen extends AbstractContainerScreen<LabeledWirelessTransceiverMenu> { public class LabeledWirelessTransceiverScreen extends AbstractContainerScreen<LabeledWirelessTransceiverMenu> {
private static final ResourceLocation TEX = ExtendedAEPlus.id("textures/gui/lable_wireless_transceiver_gui.png"); private static final ResourceLocation TEX = ExtendedAEPlus.id("textures/gui/lable_wireless_transceiver_gui.png");
@ -42,10 +44,10 @@ public class LabeledWirelessTransceiverScreen extends AbstractContainerScreen<La
private static final int INFO_MAX_WIDTH = 116; // 信息区实际宽度(249-134+1=116) private static final int INFO_MAX_WIDTH = 116; // 信息区实际宽度(249-134+1=116)
private EditBox searchBox; private EditBox searchBox;
private Button newBtn; private AbstractWidget newBtn;
private Button deleteBtn; private AbstractWidget deleteBtn;
private Button setBtn; private AbstractWidget setBtn;
private Button disconnectBtn; private AbstractWidget disconnectBtn;
private final BlockPos bePos; private final BlockPos bePos;
private final List<LabelEntry> entries = new ArrayList<>(); private final List<LabelEntry> entries = new ArrayList<>();
@ -90,14 +92,14 @@ public class LabeledWirelessTransceiverScreen extends AbstractContainerScreen<La
int secondColX = startX + BTN_W + hGap; int secondColX = startX + BTN_W + hGap;
int secondRowY = startY + BTN_H + vGap; int secondRowY = startY + BTN_H + vGap;
this.newBtn = Button.builder(Component.translatable("gui.extendedae_plus.labeled_wireless.button.new"), b -> sendSet(searchBox.getValue())) this.newBtn = new StateButton(startX, startY, BTN_W, BTN_H, BTN_U, BTN_V, 2, 177, 2, 195, TEX, TEX_W, TEX_H,
.bounds(startX, startY, BTN_W, BTN_H).build(); b -> sendSet(searchBox.getValue()), Component.translatable("gui.extendedae_plus.labeled_wireless.button.new"));
this.deleteBtn = Button.builder(Component.translatable("gui.extendedae_plus.labeled_wireless.button.delete"), b -> sendDelete()) this.deleteBtn = new StateButton(secondColX, startY, BTN_W, BTN_H, BTN_U, BTN_V, 2, 177, 2, 195, TEX, TEX_W, TEX_H,
.bounds(secondColX, startY, BTN_W, BTN_H).build(); b -> sendDelete(), Component.translatable("gui.extendedae_plus.labeled_wireless.button.delete"));
this.setBtn = Button.builder(Component.translatable("gui.extendedae_plus.labeled_wireless.button.set"), b -> sendSet(getSelectedLabel())) this.setBtn = new StateButton(startX, secondRowY, BTN_W, BTN_H, BTN_U, BTN_V, 2, 177, 2, 195, TEX, TEX_W, TEX_H,
.bounds(startX, secondRowY, BTN_W, BTN_H).build(); b -> sendSet(getSelectedLabel()), Component.translatable("gui.extendedae_plus.labeled_wireless.button.set"));
this.disconnectBtn = Button.builder(Component.translatable("gui.extendedae_plus.labeled_wireless.button.refresh"), b -> sendDisconnect()) this.disconnectBtn = new StateButton(secondColX, secondRowY, BTN_W, BTN_H, BTN_U, BTN_V, 2, 177, 2, 195, TEX, TEX_W, TEX_H,
.bounds(secondColX, secondRowY, BTN_W, BTN_H).build(); b -> sendDisconnect(), Component.translatable("gui.extendedae_plus.labeled_wireless.button.refresh"));
this.addRenderableWidget(this.newBtn); this.addRenderableWidget(this.newBtn);
this.addRenderableWidget(this.deleteBtn); this.addRenderableWidget(this.deleteBtn);
@ -354,7 +356,26 @@ public class LabeledWirelessTransceiverScreen extends AbstractContainerScreen<La
private record LabelEntry(String label, long channel) {} private record LabelEntry(String label, long channel) {}
private void drawAllButtonText(GuiGraphics gfx) {} private void drawAllButtonText(GuiGraphics gfx) {
int startX = this.leftPos + 145;
int startY = this.topPos + 101;
int hGap = 30;
int vGap = 8;
int secondColX = startX + BTN_W + hGap;
int secondRowY = startY + BTN_H + vGap;
drawButtonText(gfx, Component.translatable("gui.extendedae_plus.labeled_wireless.button.new"), startX, startY);
drawButtonText(gfx, Component.translatable("gui.extendedae_plus.labeled_wireless.button.delete"), secondColX, startY);
drawButtonText(gfx, Component.translatable("gui.extendedae_plus.labeled_wireless.button.set"), startX, secondRowY);
drawButtonText(gfx, Component.translatable("gui.extendedae_plus.labeled_wireless.button.refresh"), secondColX, secondRowY);
}
private void drawButtonText(GuiGraphics gfx, Component text, int x, int y) {
String s = this.font.plainSubstrByWidth(text.getString(), BTN_W - 4);
int tx = x + (BTN_W - this.font.width(s)) / 2;
int ty = y + (BTN_H - this.font.lineHeight) / 2 + 1;
gfx.drawString(this.font, s, tx, ty, 0xFFFFFF, false);
}
private void ensureSelectionVisible() { private void ensureSelectionVisible() {
if (selectedIndex < 0) return; if (selectedIndex < 0) return;
@ -397,4 +418,66 @@ public class LabeledWirelessTransceiverScreen extends AbstractContainerScreen<La
return isEnglish() ? 0.75f : 1.0f; return isEnglish() ? 0.75f : 1.0f;
} }
private static class StateButton extends AbstractWidget {
private final ResourceLocation tex;
private final int texW;
private final int texH;
private final int baseU;
private final int baseV;
private final int hoverU;
private final int hoverV;
private final int pressU;
private final int pressV;
private final Consumer<StateButton> onPress;
private boolean pressedVisual = false;
public StateButton(int x, int y, int w, int h, int baseU, int baseV, int hoverU, int hoverV, int pressU, int pressV,
ResourceLocation tex, int texW, int texH, Consumer<StateButton> onPress, Component tooltip) {
super(x, y, w, h, tooltip);
this.tex = tex;
this.texW = texW;
this.texH = texH;
this.baseU = baseU;
this.baseV = baseV;
this.hoverU = hoverU;
this.hoverV = hoverV;
this.pressU = pressU;
this.pressV = pressV;
this.onPress = onPress;
this.setTooltip(Tooltip.create(tooltip));
}
@Override
protected void renderWidget(GuiGraphics gfx, int mouseX, int mouseY, float partialTicks) {
boolean hovered = this.isHoveredOrFocused();
boolean pressed = pressedVisual;
int u = baseU;
int v = baseV;
if (pressed) {
u = pressU;
v = pressV;
} else if (hovered) {
u = hoverU;
v = hoverV;
}
gfx.blit(tex, this.getX(), this.getY(), u, v, this.getWidth(), this.getHeight(), texW, texH);
}
@Override
public void onClick(double mouseX, double mouseY) {
this.pressedVisual = true;
this.onPress.accept(this);
this.playDownSound(Minecraft.getInstance().getSoundManager());
}
@Override
public void onRelease(double mouseX, double mouseY) {
this.pressedVisual = false;
}
@Override
protected void updateWidgetNarration(net.minecraft.client.gui.narration.NarrationElementOutput narration) {
defaultButtonNarrationText(narration);
}
}
} }

View File

@ -130,9 +130,12 @@
"gui.extendedae_plus.labeled_wireless.online_count": "Online", "gui.extendedae_plus.labeled_wireless.online_count": "Online",
"extendedae_plus.jade.label": "Label: %s", "extendedae_plus.jade.label": "Label: %s",
"extendedae_plus.jade.owner": "Owner: %s",
"extendedae_plus.jade.owner.public": "Owner: Public", "extendedae_plus.jade.owner.public": "Owner: Public",
"extendedae_plus.jade.channels": "Channels: %s", "extendedae_plus.jade.channels": "Channels: %s",
"extendedae_plus.jade.channels_of": "Channels: %s/%s", "extendedae_plus.jade.channels_of": "Channels: %s/%s",
"extendedae_plus.jade.online": "Online",
"extendedae_plus.jade.offline": "Offline",
"extendedae_plus.tooltip.owner": "Owner: %s", "extendedae_plus.tooltip.owner": "Owner: %s",
"extendedae_plus.tooltip.owner.public": "Owner: Public", "extendedae_plus.tooltip.owner.public": "Owner: Public",