diff --git a/OpenRA.Server/Server.cs b/OpenRA.Server/Server.cs index cebdf21cc8..44c263fa90 100644 --- a/OpenRA.Server/Server.cs +++ b/OpenRA.Server/Server.cs @@ -22,6 +22,7 @@ namespace OpenRA.Server listener.Start(); Console.WriteLine("Server started."); + Console.WriteLine("Testing."); for (; ; ) { @@ -282,8 +283,8 @@ namespace OpenRA.Server return true; } - DispatchOrders( null, 0, - new ServerOrder(0, "ChangeMap", s).Serialize()); + lobbyInfo.GlobalSettings.Map = s; + SyncLobbyInfo(); return true; }}, }; @@ -379,10 +380,12 @@ namespace OpenRA.Server { var clientData = lobbyInfo.Clients.ToDictionary( a => a.Index.ToString(), - a => FieldSaver.Save(a)).WriteToString(); + a => FieldSaver.Save(a)); - DispatchOrders(null, 0, - new ServerOrder(0, "SyncInfo", clientData).Serialize()); + clientData["GlobalSettings"] = FieldSaver.Save(lobbyInfo.GlobalSettings); + + DispatchOrders(null, 0, + new ServerOrder(0, "SyncInfo", clientData.WriteToString()).Serialize()); } } } diff --git a/OpenRa.FileFormats/FieldLoader.cs b/OpenRa.FileFormats/FieldLoader.cs index 0c0046df5b..f5f1b1616f 100644 --- a/OpenRa.FileFormats/FieldLoader.cs +++ b/OpenRa.FileFormats/FieldLoader.cs @@ -22,12 +22,13 @@ namespace OpenRa.FileFormats var field = self.GetType().GetField(x.Key.Trim()); if (field == null) throw new NotImplementedException("Missing field `{0}` on `{1}`".F(x.Key.Trim(), self.GetType().Name)); - field.SetValue(self, GetValue(field.FieldType, x.Value.Value.Trim())); + field.SetValue(self, GetValue(field.FieldType, x.Value.Value)); } } static object GetValue( Type fieldType, string x ) { + if (x != null) x = x.Trim(); if( fieldType == typeof( int ) ) return int.Parse( x ); @@ -45,6 +46,9 @@ namespace OpenRa.FileFormats else if (fieldType.IsArray) { + if (x == null) + return Array.CreateInstance(fieldType.GetElementType(), 0); + var parts = x.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); var ret = Array.CreateInstance(fieldType.GetElementType(), parts.Length); diff --git a/OpenRa.FileFormats/Session.cs b/OpenRa.FileFormats/Session.cs index 375d49205c..c3efa20afc 100644 --- a/OpenRa.FileFormats/Session.cs +++ b/OpenRa.FileFormats/Session.cs @@ -8,13 +8,12 @@ namespace OpenRa.FileFormats public class Session { public List Clients = new List(); - // todo: add mods, mapname, global settings here + public Global GlobalSettings = new Global(); public enum ClientState { NotReady, - // Downloading, - // Uploading, + Downloading, Ready } @@ -27,5 +26,12 @@ namespace OpenRa.FileFormats public string Name; public ClientState State; } + + public class Global + { + public string Map = "scm12ea.ini"; + public string[] Mods = {}; // filename:sha1 pairs. + public int OrderLatency; + } } } diff --git a/OpenRa.Game/Game.cs b/OpenRa.Game/Game.cs index 91d1943ddf..780461466d 100644 --- a/OpenRa.Game/Game.cs +++ b/OpenRa.Game/Game.cs @@ -48,12 +48,14 @@ namespace OpenRa.Game static bool usingAftermath; static int2 clientSize; static HardwarePalette palette; + static string mapName; public static Minimap minimap; public static Session LobbyInfo = new Session(); public static void ChangeMap(string mapName) { + Game.mapName = mapName; SheetBuilder.Initialize(renderer); SpriteSheetBuilder.Initialize(); FileSystem.UnmountTemporaryPackages(); @@ -352,6 +354,12 @@ namespace OpenRa.Game var ys = MiniYaml.FromString(data); foreach (var y in ys) { + if (y.Key == "GlobalSettings") + { + FieldLoader.Load(session.GlobalSettings, y.Value); + continue; + } + int index; if (!int.TryParse(y.Key, out index)) continue; // not a player. @@ -364,6 +372,14 @@ namespace OpenRa.Game } LobbyInfo = session; + + // todo: if we don't have all the resources, we don't want to do this yet. + + if (mapName != LobbyInfo.GlobalSettings.Map) + { + chat.AddLine(Color.White, "Debug", "Map change {0} -> {1}".F(mapName, session.GlobalSettings.Map)); + ChangeMap(LobbyInfo.GlobalSettings.Map); + } } } } diff --git a/OpenRa.Game/Orders/UnitOrders.cs b/OpenRa.Game/Orders/UnitOrders.cs index 9031aa3488..c669259074 100644 --- a/OpenRa.Game/Orders/UnitOrders.cs +++ b/OpenRa.Game/Orders/UnitOrders.cs @@ -68,12 +68,6 @@ namespace OpenRa.Game.Orders Game.orderManager.StartGame(); break; } - case "ChangeMap": - { - Game.chat.AddLine(Color.White, "Server", "Changing map to {0}".F(order.TargetString)); - Game.ChangeMap(order.TargetString); - break; - } case "SyncInfo": { // Game.chat.AddLine(Color.White, "Server", "Synchronizing lobby info...");