Persist generated map across skirmish settings.
This commit is contained in:
committed by
Gustas Kažukauskas
parent
ed1ebd536b
commit
924c79b0ad
@@ -115,7 +115,7 @@ namespace OpenRA
|
||||
nodes.Add(new MiniYamlNode($"Player@{i}", FieldSaver.Save(Players[i])));
|
||||
|
||||
if (MapGenerationArgs != null)
|
||||
nodes.Add(new MiniYamlNode("MapGenerationArgs", new MiniYaml("", MiniYaml.FromString(MapGenerationArgs.Serialize(), "MapGenerationArgs"))));
|
||||
nodes.Add(new MiniYamlNode("MapGenerationArgs", new MiniYaml("", MapGenerationArgs.Serialize())));
|
||||
|
||||
return nodes.WriteToString();
|
||||
}
|
||||
|
||||
@@ -41,10 +41,10 @@ namespace OpenRA
|
||||
return yaml.NodeWithKey("Settings").Value;
|
||||
}
|
||||
|
||||
public string Serialize()
|
||||
public List<MiniYamlNode> Serialize()
|
||||
{
|
||||
return new List<MiniYamlNode>()
|
||||
{
|
||||
return
|
||||
[
|
||||
new("Uid", Uid),
|
||||
new("Generator", Generator),
|
||||
new("Tileset", Tileset),
|
||||
@@ -52,7 +52,7 @@ namespace OpenRA
|
||||
new("Settings", Settings),
|
||||
new("Title", Title),
|
||||
new("Author", Author)
|
||||
}.WriteToString();
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -314,7 +314,7 @@ namespace OpenRA.Network
|
||||
.ToList();
|
||||
file.WriteLengthPrefixedString(Encoding.UTF8, slotClientNodes.WriteToString());
|
||||
|
||||
file.WriteLengthPrefixedString(Encoding.UTF8, MapGenerationArgs?.Serialize() ?? string.Empty);
|
||||
file.WriteLengthPrefixedString(Encoding.UTF8, MapGenerationArgs?.Serialize().WriteToString() ?? string.Empty);
|
||||
|
||||
var traitDataOffset = file.Length;
|
||||
file.Write(TraitDataMarker);
|
||||
|
||||
@@ -76,8 +76,19 @@ namespace OpenRA.Mods.Common.Server
|
||||
// Only set players and options if the map is available
|
||||
if (server.LobbyInfo.GlobalSettings.Map != mapNode.Value.Value)
|
||||
{
|
||||
var map = server.ModData.MapCache[mapNode.Value.Value];
|
||||
if (map.Status != MapStatus.Available || !server.InterpretCommand($"map {map.Uid}", conn))
|
||||
var preview = server.ModData.MapCache[mapNode.Value.Value];
|
||||
if (preview.Status != MapStatus.Available)
|
||||
{
|
||||
if (mapNode.Value.Nodes.Length == 0)
|
||||
return false;
|
||||
|
||||
var args = FieldLoader.Load<MapGenerationArgs>(mapNode.Value);
|
||||
preview.UpdateFromGenerationArgs(args);
|
||||
preview.Generate();
|
||||
server.GeneratedMapData = mapNode.Value.Nodes.WriteToString();
|
||||
}
|
||||
|
||||
if (!server.InterpretCommand($"map {preview.Uid}", conn))
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -157,9 +168,10 @@ namespace OpenRA.Mods.Common.Server
|
||||
return;
|
||||
|
||||
var playerClient = server.LobbyInfo.NonBotClients.First();
|
||||
var map = server.ModData.MapCache[server.LobbyInfo.GlobalSettings.Map];
|
||||
var nodes = new List<MiniYamlNode>
|
||||
{
|
||||
new("Map", server.LobbyInfo.GlobalSettings.Map),
|
||||
new("Map", server.LobbyInfo.GlobalSettings.Map, map.GenerationArgs?.Serialize() ?? []),
|
||||
new("Options", new MiniYaml("", server.LobbyInfo.GlobalSettings.LobbyOptions
|
||||
.Select(kv => new MiniYamlNode(kv.Key, kv.Value.Value)))),
|
||||
new("Player", new SkirmishSlot(playerClient).ToYaml()),
|
||||
|
||||
@@ -263,7 +263,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
return;
|
||||
|
||||
lastGeneratedMap = args;
|
||||
orderManager.IssueOrder(Order.FromTargetString("GenerateMap", args.Serialize(), true));
|
||||
orderManager.IssueOrder(Order.FromTargetString("GenerateMap", args.Serialize().WriteToString(), true));
|
||||
orderManager.IssueOrder(Order.Command("map " + args.Uid));
|
||||
Game.Settings.Server.Map = args.Uid;
|
||||
Game.Settings.Save();
|
||||
@@ -703,6 +703,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
return;
|
||||
|
||||
map = modData.MapCache[uid];
|
||||
if (map.GenerationArgs != null)
|
||||
lastGeneratedMap = map.GenerationArgs;
|
||||
|
||||
// Tell the server that we have the map
|
||||
mapAvailable = map.Status == MapStatus.Available;
|
||||
|
||||
Reference in New Issue
Block a user