Просмотр исходного кода

网络模块支持服务端向客户端发包

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

+ 8 - 7
src/main/java/com/hexdragon/enchrebirth/item/name_tag/NameTagPacket.java

@@ -10,8 +10,6 @@ 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 extends Packet {
 
     // 数据包内容
@@ -26,20 +24,23 @@ public class NameTagPacket extends Packet {
     public static NameTagPacket decoder(PacketBuffer buffer) {
         return new NameTagPacket(buffer.readString(Short.MAX_VALUE), buffer.readEnumValue(Hand.class));
     }
-    public void encoder(PacketBuffer buf) {
+    @Override public void encoder(PacketBuffer buf) {
         buf.writeString(this.displayName);
         buf.writeEnumValue(this.hand);
     }
 
-    // 服务端接收到数据包的事件处理
-    public void onServerReceivePacket(Supplier<NetworkEvent.Context> ctx) {
-        ServerPlayerEntity player = ctx.get().getSender();
+    // 接收到数据包的事件处理
+    @Override public void onServerReceivePacket(NetworkEvent.Context ctx) {
+        ServerPlayerEntity player = ctx.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);
+            Main.LOGGER.warn("接收到修改命名牌名称的数据包,但玩家并未手持命名牌");
         }
     }
+    @Override public void onClientReceivePacket(NetworkEvent.Context ctx) {
+        Main.LOGGER.warn("客户端接收到了修改命名牌名称的数据包,它应该发送给服务端");
+    }
 
 }

+ 22 - 7
src/main/java/com/hexdragon/util/network/Packet.java

@@ -1,24 +1,39 @@
 package com.hexdragon.util.network;
 
+import net.minecraft.entity.player.ServerPlayerEntity;
 import net.minecraft.network.PacketBuffer;
+import net.minecraftforge.fml.network.NetworkDirection;
 import net.minecraftforge.fml.network.NetworkEvent;
+import net.minecraftforge.fml.network.PacketDistributor;
 
 import java.util.function.Supplier;
 
 public abstract class Packet {
 
-    // 编码与解码方法
-    // public abstract <T extends Packet> T decoder(PacketBuffer buffer);
+    // 编码方法(解码方法让子类自己写,Java 不允许 Override 一个 Static 方法)
     public abstract void encoder(PacketBuffer buf);
 
-    // 服务端接收到数据包的事件处理
-    public void onServerReceivePacketConsumer(Supplier<NetworkEvent.Context> ctx) {
-        ctx.get().enqueueWork(() -> onServerReceivePacket(ctx));
+    // 接收到数据包的事件处理
+    public void onReceivePacket(Supplier<NetworkEvent.Context> ctx) {
+        ctx.get().enqueueWork(() -> {
+            NetworkEvent.Context context = ctx.get();
+            if (context.getDirection() == NetworkDirection.PLAY_TO_SERVER) {
+                onServerReceivePacket(context);
+            } else {
+                onClientReceivePacket(context);
+            }
+        });
         ctx.get().setPacketHandled(true);
     }
-    public abstract void onServerReceivePacket(Supplier<NetworkEvent.Context> ctx);
 
-    // 将数据包发送至服务器
+    // 接收到数据包的处理
+    public abstract void onServerReceivePacket(NetworkEvent.Context ctx);
+
+    public abstract void onClientReceivePacket(NetworkEvent.Context ctx);
+
+    // 将数据包发送至特定对象
+    // 如果要扩展支持的对象范围,使用不同的 PacketDistributor 即可
     public void sendToServer() {PacketManager.channel.sendToServer(this);}
+    public void sendToPlayer(ServerPlayerEntity player) {PacketManager.channel.send(PacketDistributor.PLAYER.with(() -> player), this); }
 
 }

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

@@ -21,7 +21,7 @@ public class PacketManager {
 
     // 注册数据包
     public static <T extends Packet> void registerPacket(Class<T> messageType, Function<PacketBuffer, T> decoder) {
-        channel.registerMessage(nextID(), messageType, T::encoder, decoder, T::onServerReceivePacketConsumer);
+        channel.registerMessage(nextID(), messageType, T::encoder, decoder, T::onReceivePacket);
     }
 
 }