Bladeren bron

命名牌 GUI 部分的 Code Review

LTCatt 6 jaren geleden
bovenliggende
commit
c48dd1bf8a

+ 40 - 37
src/main/java/com/hexdragon/enchrebirth/item/name_tag/NameTagScreen.java

@@ -20,68 +20,71 @@ public class NameTagScreen extends Screen {
     Hand hand;
     public NameTagScreen(String defaultName, Hand hand) {
         super(new TranslationTextComponent("gui.name_tag.title"));
+        // 从右键事件中获取命名牌的原名与使用的手
         this.defaultName = defaultName; this.hand = hand;
     }
-    final ResourceLocation GUI_TEXTURE = new ResourceLocation(Main.MODID, "textures/gui/name_tag.png");
-    TextFieldWidget textField;
 
-    @Override
-    protected void init() {
+    TextFieldWidget textField;
+    int guiLeft, guiTop;
+    @Override protected void init() {
         this.minecraft.keyboardListener.enableRepeatEvents(true);
+        // 计算不知道有啥用的 GUI 边距
         this.guiLeft = (this.width - this.xSize) / 2;
         this.guiTop = (this.height - this.ySize) / 2;
-        // (x,y), (width, height)
+        // 新建文本框;注意需要在这里指定 (x, y, width, height) 而不是在 render 中指定
         this.textField = new TextFieldWidget(this.font, guiLeft + 61, guiTop + 27, 95, 16, new StringTextComponent(defaultName));
-        this.textField.setText(defaultName);
+        this.textField.setText(defaultName); // 需要使用 setText 设置文本,构建函数的最后一个参数不知道有啥用
         this.children.add(this.textField);
         super.init();
     }
+    public void removed() {
+        this.minecraft.keyboardListener.enableRepeatEvents(false);
+    }
 
-    int xSize = 176, ySize = 56;
-    int titleX = 61, titleY = 12;
-    int guiLeft, guiTop;
-
-    @Override
-    public void render(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) {
+    int xSize = 176, ySize = 56, titleX = 61, titleY = 12; // GUI 大小与标题位置
+    @Override public void render(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) {
         this.renderBackground(matrixStack);
-
+        // 绘制背景图片
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        this.minecraft.getTextureManager().bindTexture(GUI_TEXTURE);
+        this.minecraft.getTextureManager().bindTexture(new ResourceLocation(Main.MODID, "textures/gui/name_tag.png"));
         this.blit(matrixStack, guiLeft, guiTop, 0, 0, this.xSize, this.ySize);
-
+        // 绘制标题
         this.font.func_243248_b(matrixStack, this.title, (float) this.titleX + guiLeft, (float) this.titleY + guiTop, 4210752);
+        // 绘制文本框
         this.textField.render(matrixStack, mouseX, mouseY, partialTicks);
-
         super.render(matrixStack, mouseX, mouseY, partialTicks);
     }
 
-    public boolean isPauseScreen() {
-        return false;
-    }
-    public void tick() {
-        super.tick();
-        if (!this.minecraft.player.isAlive() || this.minecraft.player.removed) {
-            this.minecraft.player.closeScreen();
-        }
-    }
-    public void removed() {
-        this.minecraft.keyboardListener.enableRepeatEvents(false);
-    }
-    public void closeScreen() {
-        this.minecraft.player.closeScreen();
-        super.closeScreen();
-    }
-    public void onClose() {
-        minecraft.player.getHeldItem(hand).setDisplayName(new StringTextComponent(textField.getText()));
-        // Networking.INSTANCE.sendToServer(new NameTagPacket(textField.getText(), (byte) (hand == Hand.MAIN_HAND ? 0 : 1)));
-    }
+    // 在玩家按下物品栏键或回车时,主动关闭 GUI
     public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
         InputMappings.Input mouseKey = InputMappings.getInputByCode(keyCode, scanCode);
-        if (!textField.isFocused() && minecraft.gameSettings.keyBindInventory.isActiveAndMatches(mouseKey)) {
+        if (keyCode == 257 || // 玩家按下回车键
+                (!textField.isFocused() && minecraft.gameSettings.keyBindInventory.isActiveAndMatches(mouseKey))) {
             this.closeScreen();
             return true;
         } else {
             return super.keyPressed(keyCode, scanCode, modifiers);
         }
     }
+
+    // 在关闭 GUI 时根据文本框内容更新命名牌的 DisplayName
+    public void onClose() {
+        minecraft.player.getHeldItem(hand).setDisplayName(new StringTextComponent(textField.getText()));
+        // 之前以为要用网络包发包给服务端,看上去是我想多了,不过还是留在这里,之后写需要发包的东西的时候还能用
+        // Networking.INSTANCE.sendToServer(new NameTagPacket(textField.getText(), (byte) (hand == Hand.MAIN_HAND ? 0 : 1)));
+    }
+
+    // 让游戏在打开 GUI 时不会暂停
+    public boolean isPauseScreen() {return false;}
+
+    // 在玩家挂掉的时候关闭 GUI
+    public void tick() {
+        super.tick();
+        if (!this.minecraft.player.isAlive() || this.minecraft.player.removed) this.minecraft.player.closeScreen();
+    }
+    public void closeScreen() {
+        this.minecraft.player.closeScreen();
+        super.closeScreen();
+    }
+
 }

+ 1 - 0
src/main/java/com/hexdragon/enchrebirth/mixin/item/NameTagItemMixin.java

@@ -18,6 +18,7 @@ import org.spongepowered.asm.mixin.Mixin;
 public abstract class NameTagItemMixin extends Item {
     public NameTagItemMixin(Properties properties) {super(properties);}
 
+    // 接管命名牌的右键事件,打开 GUI
     @Override public ActionResult<ItemStack> onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) {
         if (worldIn.isRemote) {
             DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> {

+ 4 - 6
src/main/java/com/hexdragon/enchrebirth/registry/RegClient.java

@@ -4,7 +4,6 @@ import com.hexdragon.enchrebirth.Main;
 import com.hexdragon.enchrebirth.block.anvil.AnvilRenderer;
 import com.hexdragon.enchrebirth.block.anvil.AnvilScreenRe;
 import com.hexdragon.enchrebirth.block.grindstone.GrindstoneScreenRe;
-import com.hexdragon.util.network.Networking;
 import net.minecraft.client.gui.ScreenManager;
 import net.minecraftforge.api.distmarker.Dist;
 import net.minecraftforge.api.distmarker.OnlyIn;
@@ -12,7 +11,6 @@ import net.minecraftforge.eventbus.api.SubscribeEvent;
 import net.minecraftforge.fml.client.registry.ClientRegistry;
 import net.minecraftforge.fml.common.Mod;
 import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
-import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
 
 @Mod.EventBusSubscriber(modid = Main.MODID, bus = Mod.EventBusSubscriber.Bus.MOD) @OnlyIn(Dist.CLIENT)
 public class RegClient {
@@ -33,9 +31,9 @@ public class RegClient {
         ClientRegistry.bindTileEntityRenderer(RegMain.tileEntityDamagedNetheriteAnvil.get(), (AnvilRenderer::new));
     }
 
-    @SubscribeEvent public static void onCommonSetup(FMLCommonSetupEvent event) {
-        // 注册数据包
-        Networking.registerMessage();
-    }
+    //    @SubscribeEvent public static void onCommonSetup(FMLCommonSetupEvent event) {
+    //        // 注册数据包
+    //        Networking.registerMessage();
+    //    }
 
 }

+ 1 - 0
src/main/java/com/hexdragon/util/network/NameTagPacket.java

@@ -11,6 +11,7 @@ import net.minecraftforge.fml.network.NetworkEvent;
 
 import java.util.function.Supplier;
 
+// 废弃的代码,如果之后要写发包的话可以拿来用
 public class NameTagPacket {
     private byte hand;
     private String message;

+ 1 - 0
src/main/java/com/hexdragon/util/network/Networking.java

@@ -4,6 +4,7 @@ import net.minecraft.util.ResourceLocation;
 import net.minecraftforge.fml.network.NetworkRegistry;
 import net.minecraftforge.fml.network.simple.SimpleChannel;
 
+// 废弃的代码,如果之后要写发包的话可以拿来用
 public class Networking {
     public static SimpleChannel INSTANCE;
     private static int ID = 0;