LTCatt 6 лет назад
Родитель
Сommit
427cfa3295

+ 47 - 0
src/main/java/com/hexdragon/enchrebirth/item/name_tag/NameTagPacket.java

@@ -0,0 +1,47 @@
+package com.hexdragon.enchrebirth.item.name_tag;
+
+import com.hexdragon.enchrebirth.Main;
+import net.minecraft.entity.player.ServerPlayerEntity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
+import net.minecraft.network.PacketBuffer;
+import net.minecraft.util.Hand;
+import net.minecraft.util.text.StringTextComponent;
+import net.minecraftforge.fml.network.NetworkEvent;
+
+import java.util.function.Supplier;
+
+public class NameTagPacket {
+
+    // 数据包内容
+    private final Hand hand; // 修改哪只手上的物品
+    private final String displayName; // 物品的新名称
+    public NameTagPacket(String displayName, Hand hand) {
+        this.displayName = displayName;
+        this.hand = hand;
+    }
+
+    // 数据包实例与字节流的互相转化
+    public NameTagPacket(PacketBuffer buffer) {
+        hand = buffer.readEnumValue(Hand.class);
+        displayName = buffer.readString(Short.MAX_VALUE);
+    }
+    public void toBytes(PacketBuffer buf) {
+        buf.writeEnumValue(this.hand);
+        buf.writeString(this.displayName);
+    }
+
+    public void handler(Supplier<NetworkEvent.Context> ctx) {
+        ctx.get().enqueueWork(() -> {
+            // 服务端接收到数据包的事件处理
+            ServerPlayerEntity player = ctx.get().getSender();
+            ItemStack item = player.getHeldItem(this.hand);
+            if (item.getItem() == Items.NAME_TAG) { // 检查物品,避免客户端通过伪造数据包作弊
+                item.setDisplayName(new StringTextComponent(this.displayName));
+            } else {
+                Main.LOGGER.warn("接收到修改命名牌名称的数据包,但玩家并未手持命名牌:" + this.displayName);
+            }
+        });
+        ctx.get().setPacketHandled(true);
+    }
+}

+ 2 - 4
src/main/java/com/hexdragon/enchrebirth/item/name_tag/NameTagScreen.java

@@ -1,8 +1,7 @@
 package com.hexdragon.enchrebirth.item.name_tag;
 
 import com.hexdragon.enchrebirth.Main;
-import com.hexdragon.util.network.NameTagPacket;
-import com.hexdragon.util.network.Networking;
+import com.hexdragon.util.network.PackManager;
 import com.mojang.blaze3d.matrix.MatrixStack;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.gui.widget.TextFieldWidget;
@@ -72,8 +71,7 @@ public class NameTagScreen extends Screen {
     // 在关闭 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)));
+        PackManager.sendToServer(new NameTagPacket(textField.getText(), hand));
     }
 
     // 让游戏在打开 GUI 时不会暂停

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

@@ -4,7 +4,8 @@ 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 com.hexdragon.enchrebirth.item.name_tag.NameTagPacket;
+import com.hexdragon.util.network.PackManager;
 import net.minecraft.client.gui.ScreenManager;
 import net.minecraftforge.api.distmarker.Dist;
 import net.minecraftforge.api.distmarker.OnlyIn;
@@ -35,7 +36,8 @@ public class RegClient {
 
     @SubscribeEvent public static void onCommonSetup(FMLCommonSetupEvent event) {
         // 注册数据包
-        Networking.registerMessage();
+        PackManager.create(Main.MODID);
+        PackManager.registerPack(NameTagPacket.class, NameTagPacket::toBytes, NameTagPacket::new, NameTagPacket::handler);
     }
 
 }

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

@@ -1,45 +0,0 @@
-package com.hexdragon.util.network;
-
-import com.hexdragon.enchrebirth.Main;
-import net.minecraft.entity.player.ServerPlayerEntity;
-import net.minecraft.item.ItemStack;
-import net.minecraft.item.Items;
-import net.minecraft.network.PacketBuffer;
-import net.minecraft.util.Hand;
-import net.minecraft.util.text.StringTextComponent;
-import net.minecraftforge.fml.network.NetworkEvent;
-
-import java.util.function.Supplier;
-
-public class NameTagPacket {
-    private byte hand;
-    private String message;
-
-    public NameTagPacket(PacketBuffer buffer) {
-        hand = buffer.readByte();
-        message = buffer.readString(Short.MAX_VALUE);
-    }
-
-    public NameTagPacket(String message, byte hand) {
-        this.message = message;
-        this.hand = hand;
-    }
-
-    public void toBytes(PacketBuffer buf) {
-        buf.writeByte(this.hand);
-        buf.writeString(this.message);
-    }
-
-    public void handler(Supplier<NetworkEvent.Context> ctx) {
-        ctx.get().enqueueWork(() -> {
-            ServerPlayerEntity player = ctx.get().getSender();
-            ItemStack item = player.getHeldItem(this.hand == 0 ? Hand.MAIN_HAND : Hand.OFF_HAND);
-            if (item.getItem() == Items.NAME_TAG) {
-                item.setDisplayName(new StringTextComponent(this.message));
-            } else {
-                Main.LOGGER.warn("Got a wrong name tag packet: " + this.message);
-            }
-        });
-        ctx.get().setPacketHandled(true);
-    }
-}

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

@@ -1,25 +0,0 @@
-package com.hexdragon.util.network;
-
-import net.minecraft.util.ResourceLocation;
-import net.minecraftforge.fml.network.NetworkRegistry;
-import net.minecraftforge.fml.network.simple.SimpleChannel;
-
-// TODO : 重新整理一下网络相关的代码
-public class Networking {
-    public static SimpleChannel INSTANCE;
-    private static int ID = 0;
-
-    public static int nextID() {
-        return ID++;
-    }
-
-    public static void registerMessage() {
-        INSTANCE = NetworkRegistry.newSimpleChannel(
-                new ResourceLocation("corerebirth" + ":string_packet"),
-                () -> "1.0",
-                (s) -> true,
-                (s) -> true
-        );
-        INSTANCE.registerMessage(nextID(), NameTagPacket.class, NameTagPacket::toBytes, NameTagPacket::new, NameTagPacket::handler);
-    }
-}

+ 35 - 0
src/main/java/com/hexdragon/util/network/PackManager.java

@@ -0,0 +1,35 @@
+package com.hexdragon.util.network;
+
+import net.minecraft.network.PacketBuffer;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.fml.network.NetworkEvent;
+import net.minecraftforge.fml.network.NetworkRegistry;
+import net.minecraftforge.fml.network.simple.SimpleChannel;
+
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+public class PackManager {
+
+    // 获取数据包的种类 ID
+    private static int ID = 0;
+    private static int nextID() {return ID++;}
+
+    // 创建 channel
+    private static SimpleChannel channel;
+    public static void create(String modid) {
+        PackManager.channel = NetworkRegistry.newSimpleChannel(new ResourceLocation(modid + ":packets"), () -> "1.0", (s) -> true, (s) -> true);
+    }
+
+    // 注册数据包
+    public static <Packet> void registerPack(Class<Packet> messageType, BiConsumer<Packet, PacketBuffer> encoder, Function<PacketBuffer, Packet> decoder, BiConsumer<Packet, Supplier<NetworkEvent.Context>> messageConsumer) {
+        channel.registerMessage(nextID(), messageType, encoder, decoder, messageConsumer);
+    }
+
+    // 将数据包发送至服务器
+    public static <Packet> void sendToServer(Packet message) {
+        channel.sendToServer(message);
+    }
+
+}