Merge pull request #7875 from penev92/bleed_exposePlayerReferences

Add upgrade rules support for map PlayerReferences
This commit is contained in:
abcdefg30
2015-04-26 22:53:42 +02:00
17 changed files with 181 additions and 117 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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