Merge pull request #7875 from penev92/bleed_exposePlayerReferences
Add upgrade rules support for map PlayerReferences
This commit is contained in:
@@ -18,19 +18,21 @@ namespace OpenRA.Mods.Common.Lint
|
||||
{
|
||||
public void Run(Action<string> emitError, Action<string> emitWarning, Map map)
|
||||
{
|
||||
var playerNames = map.Players.Values.Select(p => p.Name);
|
||||
foreach (var player in map.Players)
|
||||
var players = new MapPlayers(map.PlayerDefinitions).Players;
|
||||
|
||||
var playerNames = players.Values.Select(p => p.Name);
|
||||
foreach (var player in players)
|
||||
foreach (var ally in player.Value.Allies)
|
||||
if (!playerNames.Contains(ally))
|
||||
emitError("Allies contains player {0} that is not in list.".F(ally));
|
||||
|
||||
foreach (var player in map.Players)
|
||||
foreach (var player in players)
|
||||
foreach (var enemy in player.Value.Enemies)
|
||||
if (!playerNames.Contains(enemy))
|
||||
emitError("Enemies contains player {0} that is not in list.".F(enemy));
|
||||
|
||||
var races = map.Rules.Actors["world"].Traits.WithInterface<CountryInfo>().Select(c => c.Race);
|
||||
foreach (var player in map.Players)
|
||||
foreach (var player in players)
|
||||
if (!string.IsNullOrWhiteSpace(player.Value.Race) && player.Value.Race != "Random" && !races.Contains(player.Value.Race))
|
||||
emitError("Invalid race {0} chosen for player {1}.".F(player.Value.Race, player.Value.Name));
|
||||
}
|
||||
|
||||
@@ -175,8 +175,7 @@ namespace OpenRA.Mods.Common.Server
|
||||
return false;
|
||||
}
|
||||
|
||||
var mapPlayerColors = server.Map.Players.Values
|
||||
.Select(p => p.ColorRamp.RGB);
|
||||
var mapPlayerColors = server.MapPlayers.Players.Values.Select(p => p.ColorRamp.RGB);
|
||||
|
||||
if (!ValidateColorAgainstForbidden(askedColor, mapPlayerColors, out forbiddenColor))
|
||||
{
|
||||
|
||||
@@ -134,7 +134,7 @@ namespace OpenRA.Mods.Common.Server
|
||||
return false;
|
||||
|
||||
client.Slot = s;
|
||||
S.SyncClientToPlayerReference(client, server.Map.Players[s]);
|
||||
S.SyncClientToPlayerReference(client, server.MapPlayers.Players[s]);
|
||||
server.SyncLobbyClients();
|
||||
CheckAutoStart(server);
|
||||
|
||||
@@ -298,7 +298,7 @@ namespace OpenRA.Mods.Common.Server
|
||||
bot.Bot = botType;
|
||||
}
|
||||
|
||||
S.SyncClientToPlayerReference(bot, server.Map.Players[parts[0]]);
|
||||
S.SyncClientToPlayerReference(bot, server.MapPlayers.Players[parts[0]]);
|
||||
server.SyncLobbyClients();
|
||||
server.SyncLobbySlots();
|
||||
return true;
|
||||
@@ -346,9 +346,9 @@ namespace OpenRA.Mods.Common.Server
|
||||
if (c.Slot != null)
|
||||
{
|
||||
// Remove Bot from slot if slot forbids bots
|
||||
if (c.Bot != null && !server.Map.Players[c.Slot].AllowBots)
|
||||
if (c.Bot != null && !server.MapPlayers.Players[c.Slot].AllowBots)
|
||||
server.LobbyInfo.Clients.Remove(c);
|
||||
S.SyncClientToPlayerReference(c, server.Map.Players[c.Slot]);
|
||||
S.SyncClientToPlayerReference(c, server.MapPlayers.Players[c.Slot]);
|
||||
}
|
||||
else if (c.Bot != null)
|
||||
server.LobbyInfo.Clients.Remove(c);
|
||||
@@ -477,13 +477,13 @@ namespace OpenRA.Mods.Common.Server
|
||||
|
||||
var maxTeams = (server.LobbyInfo.Clients.Count(c => c.Slot != null) + 1) / 2;
|
||||
teamCount = teamCount.Clamp(0, maxTeams);
|
||||
var players = server.LobbyInfo.Slots
|
||||
var clients = server.LobbyInfo.Slots
|
||||
.Select(slot => server.LobbyInfo.ClientInSlot(slot.Key))
|
||||
.Where(c => c != null && !server.LobbyInfo.Slots[c.Slot].LockTeam);
|
||||
|
||||
var assigned = 0;
|
||||
var playerCount = players.Count();
|
||||
foreach (var player in players)
|
||||
var clientCount = clients.Count();
|
||||
foreach (var player in clients)
|
||||
{
|
||||
// Free for all
|
||||
if (teamCount == 0)
|
||||
@@ -493,7 +493,7 @@ namespace OpenRA.Mods.Common.Server
|
||||
else if (teamCount == 1)
|
||||
player.Team = player.Bot == null ? 1 : 2;
|
||||
else
|
||||
player.Team = assigned++ * teamCount / playerCount + 1;
|
||||
player.Team = assigned++ * teamCount / clientCount + 1;
|
||||
}
|
||||
|
||||
server.SyncLobbyClients();
|
||||
@@ -897,7 +897,9 @@ namespace OpenRA.Mods.Common.Server
|
||||
static void LoadMap(S server)
|
||||
{
|
||||
server.Map = server.ModData.MapCache[server.LobbyInfo.GlobalSettings.Map].Map;
|
||||
server.LobbyInfo.Slots = server.Map.Players
|
||||
|
||||
server.MapPlayers = new MapPlayers(server.Map.PlayerDefinitions);
|
||||
server.LobbyInfo.Slots = server.MapPlayers.Players
|
||||
.Select(p => MakeSlotFromPlayerReference(p.Value))
|
||||
.Where(s => s != null)
|
||||
.ToDictionary(s => s.PlayerReference, s => s);
|
||||
|
||||
@@ -21,8 +21,10 @@ namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
public void CreatePlayers(World w)
|
||||
{
|
||||
// create the unplayable map players -- neutral, shellmap, scripted, etc.
|
||||
foreach (var kv in w.Map.Players.Where(p => !p.Value.Playable))
|
||||
var players = new MapPlayers(w.Map.PlayerDefinitions).Players;
|
||||
|
||||
// Create the unplayable map players -- neutral, shellmap, scripted, etc.
|
||||
foreach (var kv in players.Where(p => !p.Value.Playable))
|
||||
{
|
||||
var player = new Player(w, null, null, kv.Value);
|
||||
w.AddPlayer(player);
|
||||
@@ -30,14 +32,14 @@ namespace OpenRA.Mods.Common.Traits
|
||||
w.WorldActor.Owner = player;
|
||||
}
|
||||
|
||||
// create the players which are bound through slots.
|
||||
// Create the players which are bound through slots.
|
||||
foreach (var kv in w.LobbyInfo.Slots)
|
||||
{
|
||||
var client = w.LobbyInfo.ClientInSlot(kv.Key);
|
||||
if (client == null)
|
||||
continue;
|
||||
|
||||
var player = new Player(w, client, kv.Value, w.Map.Players[kv.Value.PlayerReference]);
|
||||
var player = new Player(w, client, kv.Value, players[kv.Value.PlayerReference]);
|
||||
w.AddPlayer(player);
|
||||
|
||||
if (client.Index == Game.LocalClientId)
|
||||
|
||||
@@ -110,6 +110,7 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
||||
Ruleset rules;
|
||||
List<string> players = new List<string>();
|
||||
Action<string> errorHandler;
|
||||
MapPlayers mapPlayers;
|
||||
|
||||
LegacyMapImporter(string filename, Ruleset rules, Action<string> errorHandler)
|
||||
{
|
||||
@@ -123,7 +124,6 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
||||
{
|
||||
var map = new LegacyMapImporter(filename, rules, errorHandler).map;
|
||||
map.RequiresMod = mod;
|
||||
map.MakeDefaultPlayers();
|
||||
map.FixOpenAreas(rules);
|
||||
return map;
|
||||
}
|
||||
@@ -180,9 +180,6 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
||||
LoadActors(file, "INFANTRY");
|
||||
LoadSmudges(file, "SMUDGE");
|
||||
|
||||
foreach (var p in players)
|
||||
LoadPlayer(file, p, legacyMapFormat == IniMapFormat.RedAlert);
|
||||
|
||||
var wps = file.GetSection("Waypoints")
|
||||
.Where(kv => Exts.ParseIntegerInvariant(kv.Value) > 0)
|
||||
.Select(kv => Pair.New(Exts.ParseIntegerInvariant(kv.Key),
|
||||
@@ -193,19 +190,29 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
||||
{
|
||||
if (kv.First <= 7)
|
||||
{
|
||||
var a = new ActorReference("mpspawn");
|
||||
a.Add(new LocationInit((CPos)kv.Second));
|
||||
a.Add(new OwnerInit("Neutral"));
|
||||
var a = new ActorReference("mpspawn")
|
||||
{
|
||||
new LocationInit((CPos)kv.Second),
|
||||
new OwnerInit("Neutral")
|
||||
};
|
||||
map.Actors.Value.Add("Actor" + map.Actors.Value.Count.ToString(), a);
|
||||
}
|
||||
else
|
||||
{
|
||||
var a = new ActorReference("waypoint");
|
||||
a.Add(new LocationInit((CPos)kv.Second));
|
||||
a.Add(new OwnerInit("Neutral"));
|
||||
var a = new ActorReference("waypoint")
|
||||
{
|
||||
new LocationInit((CPos)kv.Second),
|
||||
new OwnerInit("Neutral")
|
||||
};
|
||||
map.Actors.Value.Add("waypoint" + kv.First, a);
|
||||
}
|
||||
}
|
||||
|
||||
// Create default player definitions only if there are no players to import
|
||||
mapPlayers = new MapPlayers(map.Rules, (players.Count == 0) ? map.GetSpawnPoints().Length : 0);
|
||||
foreach (var p in players)
|
||||
LoadPlayer(file, p, legacyMapFormat == IniMapFormat.RedAlert);
|
||||
map.PlayerDefinitions = mapPlayers.ToMiniYaml();
|
||||
}
|
||||
|
||||
static int2 LocationFromMapOffset(int offset, int mapSize)
|
||||
@@ -505,7 +512,11 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
||||
}
|
||||
}
|
||||
|
||||
map.Players.Add(section, pr);
|
||||
// Overwrite default player definitions if needed
|
||||
if (!mapPlayers.Players.ContainsKey(section))
|
||||
mapPlayers.Players.Add(section, pr);
|
||||
else
|
||||
mapPlayers.Players[section] = pr;
|
||||
}
|
||||
|
||||
void LoadVideos(IniFile file, string section)
|
||||
|
||||
@@ -30,6 +30,7 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
||||
|
||||
UpgradeRules.UpgradeWeaponRules(engineDate, ref map.WeaponDefinitions, null, 0);
|
||||
UpgradeRules.UpgradeActorRules(engineDate, ref map.RuleDefinitions, null, 0);
|
||||
UpgradeRules.UpgradePlayers(engineDate, ref map.PlayerDefinitions, null, 0);
|
||||
map.Save(args[1]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,6 +83,7 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
||||
Console.WriteLine("\t" + map.Path);
|
||||
UpgradeRules.UpgradeActorRules(engineDate, ref map.RuleDefinitions, null, 0);
|
||||
UpgradeRules.UpgradeWeaponRules(engineDate, ref map.WeaponDefinitions, null, 0);
|
||||
UpgradeRules.UpgradePlayers(engineDate, ref map.PlayerDefinitions, null, 0);
|
||||
map.Save(map.Path);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1339,5 +1339,11 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
||||
UpgradeCursors(engineVersion, ref node.Value.Nodes, node, depth + 1);
|
||||
}
|
||||
}
|
||||
|
||||
internal static void UpgradePlayers(int engineVersion, ref List<MiniYamlNode> nodes, MiniYamlNode parent, int depth)
|
||||
{
|
||||
foreach (var node in nodes)
|
||||
UpgradePlayers(engineVersion, ref node.Value.Nodes, node, depth + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user