diff --git a/OpenRA.Game/Network/Handshake.cs b/OpenRA.Game/Network/Handshake.cs index 1fae372484..c11fd5c8de 100644 --- a/OpenRA.Game/Network/Handshake.cs +++ b/OpenRA.Game/Network/Handshake.cs @@ -20,19 +20,19 @@ namespace OpenRA.Network public string Version; public string Map; - public string Serialize() - { - var data = new List(); - data.Add(new MiniYamlNode("Handshake", FieldSaver.Save(this))); - return data.WriteToString(); - } - public static HandshakeRequest Deserialize(string data) { var handshake = new HandshakeRequest(); FieldLoader.Load(handshake, MiniYaml.FromString(data).First().Value); return handshake; } + + public string Serialize() + { + var data = new List(); + data.Add(new MiniYamlNode("Handshake", FieldSaver.Save(this))); + return data.WriteToString(); + } } public class HandshakeResponse @@ -42,16 +42,6 @@ namespace OpenRA.Network public string Password; [FieldLoader.Ignore] public Session.Client Client; - public string Serialize() - { - var data = new List(); - data.Add( new MiniYamlNode( "Handshake", null, - new string[]{ "Mod", "Version", "Password" }.Select( p => FieldSaver.SaveField(this, p) ).ToList() ) ); - data.Add(new MiniYamlNode("Client", FieldSaver.Save(Client))); - - return data.WriteToString(); - } - public static HandshakeResponse Deserialize(string data) { var handshake = new HandshakeResponse(); @@ -59,6 +49,7 @@ namespace OpenRA.Network var ys = MiniYaml.FromString(data); foreach (var y in ys) + { switch (y.Key) { case "Handshake": @@ -68,7 +59,19 @@ namespace OpenRA.Network FieldLoader.Load(handshake.Client, y.Value); break; } + } + return handshake; } + + public string Serialize() + { + var data = new List(); + data.Add(new MiniYamlNode("Handshake", null, + new string[] { "Mod", "Version", "Password" }.Select(p => FieldSaver.SaveField(this, p)).ToList())); + data.Add(new MiniYamlNode("Client", FieldSaver.Save(Client))); + + return data.WriteToString(); + } } } diff --git a/OpenRA.Game/Network/Session.cs b/OpenRA.Game/Network/Session.cs index d60ea085f9..7ee8d64bf5 100644 --- a/OpenRA.Game/Network/Session.cs +++ b/OpenRA.Game/Network/Session.cs @@ -38,19 +38,19 @@ namespace OpenRA.Network switch (yy[0]) { + case "Client": + session.Clients.Add(FieldLoader.Load(y.Value)); + break; + + case "ClientPing": + session.ClientPings.Add(FieldLoader.Load(y.Value)); + break; + case "GlobalSettings": FieldLoader.Load(session.GlobalSettings, y.Value); break; - case "Client": - session.Clients.Add(FieldLoader.Load(y.Value)); - break; - - case "ClientPing": - session.ClientPings.Add(FieldLoader.Load(y.Value)); - break; - - case "Slot": + case "Slot": var s = FieldLoader.Load(y.Value); session.Slots.Add(s.PlayerReference, s); break; diff --git a/OpenRA.Game/Server/Server.cs b/OpenRA.Game/Server/Server.cs index 80d34a19c9..325f5f4c35 100644 --- a/OpenRA.Game/Server/Server.cs +++ b/OpenRA.Game/Server/Server.cs @@ -459,6 +459,7 @@ namespace OpenRA.Server break; } + case "HandshakeResponse": ValidateClient(conn, so.Data); break; @@ -581,6 +582,7 @@ namespace OpenRA.Server if (State != ServerState.WaitingPlayers) return; + // TODO: only need to sync the specific client that has changed to avoid conflicts var clientData = new System.Text.StringBuilder(); foreach (var client in LobbyInfo.Clients) clientData.Append(client.Serialize()); @@ -597,6 +599,7 @@ namespace OpenRA.Server if (State != ServerState.WaitingPlayers) return; + // TODO: don't sync all the slots if just one changed var slotData = new System.Text.StringBuilder(); foreach (var slot in LobbyInfo.Slots) slotData.Append(slot.Value.Serialize()); @@ -622,6 +625,7 @@ namespace OpenRA.Server public void SyncClientPing() { + // TODO: split this further into per client ping orders var clientPings = new System.Text.StringBuilder(); foreach (var ping in LobbyInfo.ClientPings) clientPings.Append(ping.Serialize());