diff --git a/Source/Client/Networking/State/ClientJoiningState.cs b/Source/Client/Networking/State/ClientJoiningState.cs index c5601c5a..d5729845 100644 --- a/Source/Client/Networking/State/ClientJoiningState.cs +++ b/Source/Client/Networking/State/ClientJoiningState.cs @@ -77,8 +77,7 @@ public void HandleUsernameOk(ByteReader data) connection.SendFragmented(Packets.Client_JoinData, writer.ToArray()); } - [PacketHandler(Packets.Server_JoinData)] - [IsFragmented] + [PacketHandler(Packets.Server_JoinData, allowFragmented: true)] public void HandleJoinData(ByteReader data) { Multiplayer.session.gameName = data.ReadString(); diff --git a/Source/Client/Networking/State/ClientLoadingState.cs b/Source/Client/Networking/State/ClientLoadingState.cs index 78f19bfb..832edfa0 100644 --- a/Source/Client/Networking/State/ClientLoadingState.cs +++ b/Source/Client/Networking/State/ClientLoadingState.cs @@ -28,8 +28,7 @@ public void HandleWorldDataStart(ByteReader data) connection.Lenient = false; // Lenient is set while rejoining } - [PacketHandler(Packets.Server_WorldData)] - [IsFragmented] + [PacketHandler(Packets.Server_WorldData, allowFragmented: true)] public void HandleWorldData(ByteReader data) { Log.Message("Game data size: " + data.Length); diff --git a/Source/Client/Networking/State/ClientPlayingState.cs b/Source/Client/Networking/State/ClientPlayingState.cs index 080f7b51..bebb38f4 100644 --- a/Source/Client/Networking/State/ClientPlayingState.cs +++ b/Source/Client/Networking/State/ClientPlayingState.cs @@ -208,8 +208,7 @@ public void HandleNotification(ByteReader data) Messages.Message(key.Translate(Array.ConvertAll(args, s => (NamedArgument)s)), MessageTypeDefOf.SilentInput, false); } - [PacketHandler(Packets.Server_SyncInfo)] - [IsFragmented] + [PacketHandler(Packets.Server_SyncInfo, allowFragmented: true)] public void HandleDesyncCheck(ByteReader data) { Multiplayer.game?.sync.AddClientOpinionAndCheckDesync(ClientSyncOpinion.Deserialize(data)); @@ -225,8 +224,7 @@ public void HandleFreze(ByteReader data) TickPatch.frozenAt = frozenAt; } - [PacketHandler(Packets.Server_Traces)] - [IsFragmented] + [PacketHandler(Packets.Server_Traces, allowFragmented: true)] public void HandleTraces(ByteReader data) { var type = (TracesPacket)data.ReadInt32(); diff --git a/Source/Common/Networking/MpConnectionState.cs b/Source/Common/Networking/MpConnectionState.cs index 4c0b75a4..d53a4e28 100644 --- a/Source/Common/Networking/MpConnectionState.cs +++ b/Source/Common/Networking/MpConnectionState.cs @@ -40,11 +40,12 @@ public static void SetImplementation(ConnectionStateEnum state, Type type) if (method.GetParameters().Length != 1 || method.GetParameters()[0].ParameterType != typeof(ByteReader)) throw new Exception($"Bad packet handler signature for {method}"); + if (packetHandlers[(int)state, (int)attr.packet] != null) - throw new Exception($"Packet {state}:{attr.packet} already has a handler"); - bool fragment = method.GetAttribute() != null; + throw new Exception($"Packet {state}:{type} already has a handler"); + packetHandlers[(int)state, (int)attr.packet] = - new PacketHandlerInfo(MethodInvoker.GetHandler(method), fragment); + new PacketHandlerInfo(MethodInvoker.GetHandler(method), attr.allowFragmented); } } } diff --git a/Source/Common/Networking/PacketHandlerAttribute.cs b/Source/Common/Networking/PacketHandlerAttribute.cs index dabca59e..be678ff4 100644 --- a/Source/Common/Networking/PacketHandlerAttribute.cs +++ b/Source/Common/Networking/PacketHandlerAttribute.cs @@ -5,18 +5,10 @@ namespace Multiplayer.Common { [MeansImplicitUse] - public class PacketHandlerAttribute : Attribute - { - public readonly Packets packet; - - public PacketHandlerAttribute(Packets packet) - { - this.packet = packet; - } - } - - public class IsFragmentedAttribute : Attribute + public class PacketHandlerAttribute(Packets packet, bool allowFragmented = false) : Attribute { + public readonly Packets packet = packet; + public readonly bool allowFragmented = allowFragmented; } public record PacketHandlerInfo(FastInvokeHandler Method, bool Fragment); diff --git a/Source/Common/Networking/State/ServerPlayingState.cs b/Source/Common/Networking/State/ServerPlayingState.cs index c818b296..1e4f2152 100644 --- a/Source/Common/Networking/State/ServerPlayingState.cs +++ b/Source/Common/Networking/State/ServerPlayingState.cs @@ -28,8 +28,7 @@ public void HandleDesynced(ByteReader data) Server.playerManager.OnDesync(Player, tick, diffAt); } - [PacketHandler(Packets.Client_Traces)] - [IsFragmented] + [PacketHandler(Packets.Client_Traces, allowFragmented: true)] public void HandleTraces(ByteReader data) { var type = (TracesPacket)data.ReadInt32(); @@ -77,8 +76,7 @@ public void HandleChat(ByteReader data) } } - [PacketHandler(Packets.Client_WorldDataUpload)] - [IsFragmented] + [PacketHandler(Packets.Client_WorldDataUpload, allowFragmented: true)] public void HandleWorldDataUpload(ByteReader data) { if (Server.ArbiterPlaying ? !Player.IsArbiter : !Player.IsHost) // policy @@ -203,8 +201,7 @@ public void HandleClientKeepAlive(ByteReader data) } } - [PacketHandler(Packets.Client_SyncInfo)] - [IsFragmented] + [PacketHandler(Packets.Client_SyncInfo, allowFragmented: true)] public void HandleDesyncCheck(ByteReader data) { var arbiter = Server.ArbiterPlaying;