Persist generated map across skirmish settings.

This commit is contained in:
Paul Chote
2026-01-18 22:38:24 +00:00
committed by Gustas Kažukauskas
parent ed1ebd536b
commit 924c79b0ad
5 changed files with 24 additions and 10 deletions

View File

@@ -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();
}

View File

@@ -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();
];
}
}
}

View File

@@ -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);

View File

@@ -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()),

View File

@@ -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;