LTCatt 6 лет назад
Родитель
Сommit
3f02ed9c66

+ 17 - 19
src/main/java/com/hexdragon/enchrebirth/item/name_tag/NameTagPacket.java

@@ -1,6 +1,7 @@
 package com.hexdragon.enchrebirth.item.name_tag;
 
 import com.hexdragon.enchrebirth.Main;
+import com.hexdragon.util.network.Packet;
 import net.minecraft.entity.player.ServerPlayerEntity;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.Items;
@@ -11,7 +12,7 @@ import net.minecraftforge.fml.network.NetworkEvent;
 
 import java.util.function.Supplier;
 
-public class NameTagPacket {
+public class NameTagPacket extends Packet {
 
     // 数据包内容
     private final Hand hand; // 修改哪只手上的物品
@@ -21,27 +22,24 @@ public class NameTagPacket {
         this.hand = hand;
     }
 
-    // 数据包实例与字节流的互相转化
-    public NameTagPacket(PacketBuffer buffer) {
-        hand = buffer.readEnumValue(Hand.class);
-        displayName = buffer.readString(Short.MAX_VALUE);
+    // 数据包的编码解码
+    public static NameTagPacket decoder(PacketBuffer buffer) {
+        return new NameTagPacket(buffer.readString(Short.MAX_VALUE), buffer.readEnumValue(Hand.class));
     }
-    public void toBytes(PacketBuffer buf) {
-        buf.writeEnumValue(this.hand);
+    public void encoder(PacketBuffer buf) {
         buf.writeString(this.displayName);
+        buf.writeEnumValue(this.hand);
     }
 
-    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);
+    // 服务端接收到数据包的事件处理
+    public void onServerReceivePacket(Supplier<NetworkEvent.Context> ctx) {
+        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);
+        }
     }
+
 }

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

@@ -1,7 +1,6 @@
 package com.hexdragon.enchrebirth.item.name_tag;
 
 import com.hexdragon.enchrebirth.Main;
-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;
@@ -69,9 +68,9 @@ public class NameTagScreen extends Screen {
     }
 
     // 在关闭 GUI 时根据文本框内容更新命名牌的 DisplayName
+    // 必须通过网络发包的方式提交更新,否则只是客户端 “认为” 名字变了,把物品换个格子就又改回去了
     public void onClose() {
-        // 必须通过网络发包的方式提交更新,否则只是客户端 “认为” 名字变了,把物品换个格子就又改回去了
-        PackManager.sendToServer(new NameTagPacket(textField.getText(), hand));
+        new NameTagPacket(textField.getText(), hand).sendToServer();
     }
 
     // 让游戏在打开 GUI 时不会暂停

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

@@ -5,7 +5,7 @@ import com.hexdragon.enchrebirth.block.anvil.AnvilRenderer;
 import com.hexdragon.enchrebirth.block.anvil.AnvilScreenRe;
 import com.hexdragon.enchrebirth.block.grindstone.GrindstoneScreenRe;
 import com.hexdragon.enchrebirth.item.name_tag.NameTagPacket;
-import com.hexdragon.util.network.PackManager;
+import com.hexdragon.util.network.PacketManager;
 import net.minecraft.client.gui.ScreenManager;
 import net.minecraftforge.api.distmarker.Dist;
 import net.minecraftforge.api.distmarker.OnlyIn;
@@ -19,25 +19,25 @@ import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
 public class RegClient {
 
     @SubscribeEvent public static void clientSetup(final FMLClientSetupEvent e) {
-        // 注册 Screen
+        // 注册容器的 Screen
         ScreenManager.registerFactory(RegMain.containerGrindstone.get(), GrindstoneScreenRe::new);
         ScreenManager.registerFactory(RegMain.containerAnvil.get(), AnvilScreenRe::new);
     }
 
     @SubscribeEvent public static void onClientEvent(FMLClientSetupEvent event) {
         // 注册 Renderer
-        ClientRegistry.bindTileEntityRenderer(RegMain.tileEntityPerfectAnvil.get(), (AnvilRenderer::new));
-        ClientRegistry.bindTileEntityRenderer(RegMain.tileEntityChippedAnvil.get(), (AnvilRenderer::new));
-        ClientRegistry.bindTileEntityRenderer(RegMain.tileEntityDamagedAnvil.get(), (AnvilRenderer::new));
-        ClientRegistry.bindTileEntityRenderer(RegMain.tileEntityPerfectNetheriteAnvil.get(), (AnvilRenderer::new));
-        ClientRegistry.bindTileEntityRenderer(RegMain.tileEntityChippedNetheriteAnvil.get(), (AnvilRenderer::new));
-        ClientRegistry.bindTileEntityRenderer(RegMain.tileEntityDamagedNetheriteAnvil.get(), (AnvilRenderer::new));
+        ClientRegistry.bindTileEntityRenderer(RegMain.tileEntityPerfectAnvil.get(), AnvilRenderer::new);
+        ClientRegistry.bindTileEntityRenderer(RegMain.tileEntityChippedAnvil.get(), AnvilRenderer::new);
+        ClientRegistry.bindTileEntityRenderer(RegMain.tileEntityDamagedAnvil.get(), AnvilRenderer::new);
+        ClientRegistry.bindTileEntityRenderer(RegMain.tileEntityPerfectNetheriteAnvil.get(), AnvilRenderer::new);
+        ClientRegistry.bindTileEntityRenderer(RegMain.tileEntityChippedNetheriteAnvil.get(), AnvilRenderer::new);
+        ClientRegistry.bindTileEntityRenderer(RegMain.tileEntityDamagedNetheriteAnvil.get(), AnvilRenderer::new);
     }
 
     @SubscribeEvent public static void onCommonSetup(FMLCommonSetupEvent event) {
         // 注册数据包
-        PackManager.create(Main.MODID);
-        PackManager.registerPack(NameTagPacket.class, NameTagPacket::toBytes, NameTagPacket::new, NameTagPacket::handler);
+        PacketManager.create(Main.MODID);
+        PacketManager.registerPacket(NameTagPacket.class, NameTagPacket::decoder);
     }
 
 }

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

@@ -1,35 +0,0 @@
-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);
-    }
-
-}

+ 24 - 0
src/main/java/com/hexdragon/util/network/Packet.java

@@ -0,0 +1,24 @@
+package com.hexdragon.util.network;
+
+import net.minecraft.network.PacketBuffer;
+import net.minecraftforge.fml.network.NetworkEvent;
+
+import java.util.function.Supplier;
+
+public abstract class Packet {
+
+    // 编码与解码方法
+    // public abstract <T extends Packet> T decoder(PacketBuffer buffer);
+    public abstract void encoder(PacketBuffer buf);
+
+    // 服务端接收到数据包的事件处理
+    public void onServerReceivePacketConsumer(Supplier<NetworkEvent.Context> ctx) {
+        ctx.get().enqueueWork(() -> onServerReceivePacket(ctx));
+        ctx.get().setPacketHandled(true);
+    }
+    public abstract void onServerReceivePacket(Supplier<NetworkEvent.Context> ctx);
+
+    // 将数据包发送至服务器
+    public void sendToServer() {PacketManager.channel.sendToServer(this);}
+
+}

+ 27 - 0
src/main/java/com/hexdragon/util/network/PacketManager.java

@@ -0,0 +1,27 @@
+package com.hexdragon.util.network;
+
+import net.minecraft.network.PacketBuffer;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.fml.network.NetworkRegistry;
+import net.minecraftforge.fml.network.simple.SimpleChannel;
+
+import java.util.function.Function;
+
+public class PacketManager {
+
+    // 获取数据包的种类 ID
+    private static int ID = 0;
+    private static int nextID() {return ID++;}
+
+    // 创建 channel
+    public static SimpleChannel channel;
+    public static void create(String modid) {
+        PacketManager.channel = NetworkRegistry.newSimpleChannel(new ResourceLocation(modid + ":packets"), () -> "1.0", (s) -> true, (s) -> true);
+    }
+
+    // 注册数据包
+    public static <T extends Packet> void registerPacket(Class<T> messageType, Function<PacketBuffer, T> decoder) {
+        channel.registerMessage(nextID(), messageType, T::encoder, decoder, T::onServerReceivePacketConsumer);
+    }
+
+}