Parcourir la source

Add null checks to networking for better errors.

shedaniel il y a 4 ans
Parent
commit
b93cb04b6f

+ 10 - 12
common/src/main/java/me/shedaniel/architectury/networking/NetworkChannel.java

@@ -20,7 +20,6 @@
 package me.shedaniel.architectury.networking;
 
 import com.google.common.collect.Maps;
-import com.mojang.datafixers.util.Pair;
 import io.netty.buffer.Unpooled;
 import me.shedaniel.architectury.networking.NetworkManager.PacketContext;
 import me.shedaniel.architectury.platform.Platform;
@@ -111,32 +110,31 @@ public final class NetworkChannel {
         register(type, encoder, decoder, messageConsumer);
     }
     
-    private <T> Pair<MessageInfo<T>, FriendlyByteBuf> encode(T message) {
-        MessageInfo<T> messageInfo = (MessageInfo<T>) Objects.requireNonNull(encoders.get(message.getClass()));
+    public <T> Packet<?> toPacket(NetworkManager.Side side, T message) {
+        MessageInfo<T> messageInfo = (MessageInfo<T>) Objects.requireNonNull(encoders.get(message.getClass()), "Unknown message type! " + message);
         FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer());
         messageInfo.encoder.accept(message, buf);
-        return new Pair<>(messageInfo, buf);
-    }
-    
-    public <T> Packet<?> toPacket(NetworkManager.Side side, T message) {
-        Pair<MessageInfo<T>, FriendlyByteBuf> encoded = encode(message);
-        return NetworkManager.toPacket(side, encoded.getFirst().packetId, encoded.getSecond());
+        return NetworkManager.toPacket(side, messageInfo.packetId, buf);
     }
     
     public <T> void sendToPlayer(ServerPlayer player, T message) {
-        player.connection.send(toPacket(NetworkManager.s2c(), message));
+        Objects.requireNonNull(player, "Unable to send packet to a 'null' player!").connection.send(toPacket(NetworkManager.s2c(), message));
     }
     
     public <T> void sendToPlayers(Iterable<ServerPlayer> players, T message) {
         Packet<?> packet = toPacket(NetworkManager.s2c(), message);
         for (ServerPlayer player : players) {
-            player.connection.send(packet);
+            Objects.requireNonNull(player, "Unable to send packet to a 'null' player!").connection.send(packet);
         }
     }
     
     @Environment(EnvType.CLIENT)
     public <T> void sendToServer(T message) {
-        Minecraft.getInstance().getConnection().send(toPacket(NetworkManager.c2s(), message));
+        if (Minecraft.getInstance().getConnection() != null) {
+            Minecraft.getInstance().getConnection().send(toPacket(NetworkManager.c2s(), message));
+        } else {
+            throw new IllegalStateException("Unable to send packet to the server while not in game!");
+        }
     }
     
     @Environment(EnvType.CLIENT)

+ 10 - 4
common/src/main/java/me/shedaniel/architectury/networking/NetworkManager.java

@@ -30,6 +30,8 @@ import net.minecraft.resources.ResourceLocation;
 import net.minecraft.server.level.ServerPlayer;
 import net.minecraft.world.entity.player.Player;
 
+import java.util.Objects;
+
 public final class NetworkManager {
     @ExpectPlatform
     public static void registerReceiver(Side side, ResourceLocation id, NetworkReceiver receiver) {
@@ -42,19 +44,23 @@ public final class NetworkManager {
     }
     
     public static void sendToPlayer(ServerPlayer player, ResourceLocation id, FriendlyByteBuf buf) {
-        player.connection.send(toPacket(serverToClient(), id, buf));
+        Objects.requireNonNull(player, "Unable to send packet to a 'null' player!").connection.send(toPacket(serverToClient(), id, buf));
     }
     
     public static void sendToPlayers(Iterable<ServerPlayer> players, ResourceLocation id, FriendlyByteBuf buf) {
         Packet<?> packet = toPacket(serverToClient(), id, buf);
         for (ServerPlayer player : players) {
-            player.connection.send(packet);
+            Objects.requireNonNull(player, "Unable to send packet to a 'null' player!").connection.send(packet);
         }
     }
     
     @Environment(EnvType.CLIENT)
     public static void sendToServer(ResourceLocation id, FriendlyByteBuf buf) {
-        Minecraft.getInstance().getConnection().send(toPacket(clientToServer(), id, buf));
+        if (Minecraft.getInstance().getConnection() != null) {
+            Minecraft.getInstance().getConnection().send(toPacket(clientToServer(), id, buf));
+        } else {
+            throw new IllegalStateException("Unable to send packet to the server while not in game!");
+        }
     }
     
     @Environment(EnvType.CLIENT)
@@ -77,7 +83,7 @@ public final class NetworkManager {
         Player getPlayer();
         
         void queue(Runnable runnable);
-    
+        
         Env getEnvironment();
         
         default EnvType getEnv() {