Remove direct access to MapPreview.Rules.

This commit is contained in:
Paul Chote
2021-04-04 16:40:46 +01:00
committed by teinarss
parent 53e6d974f0
commit abee274f88
22 changed files with 57 additions and 54 deletions

View File

@@ -86,11 +86,13 @@ namespace OpenRA
public MapVisibility Visibility; public MapVisibility Visibility;
Lazy<Ruleset> rules; Lazy<Ruleset> rules;
public Ruleset Rules => rules?.Value;
public bool InvalidCustomRules { get; private set; } public bool InvalidCustomRules { get; private set; }
public bool DefinesUnsafeCustomRules { get; private set; } public bool DefinesUnsafeCustomRules { get; private set; }
public bool RulesLoaded { get; private set; } public bool RulesLoaded { get; private set; }
public ActorInfo WorldActorInfo => rules?.Value.Actors[SystemActors.World];
public ActorInfo PlayerActorInfo => rules?.Value.Actors[SystemActors.Player];
public void SetRulesetGenerator(ModData modData, Func<(Ruleset Ruleset, bool DefinesUnsafeCustomRules)> generator) public void SetRulesetGenerator(ModData modData, Func<(Ruleset Ruleset, bool DefinesUnsafeCustomRules)> generator)
{ {
InvalidCustomRules = false; InvalidCustomRules = false;
@@ -154,16 +156,18 @@ namespace OpenRA
public MapClassification Class => innerData.Class; public MapClassification Class => innerData.Class;
public MapVisibility Visibility => innerData.Visibility; public MapVisibility Visibility => innerData.Visibility;
public Ruleset Rules => innerData.Rules;
public bool InvalidCustomRules => innerData.InvalidCustomRules; public bool InvalidCustomRules => innerData.InvalidCustomRules;
public bool RulesLoaded => innerData.RulesLoaded; public bool RulesLoaded => innerData.RulesLoaded;
public ActorInfo WorldActorInfo => innerData.WorldActorInfo;
public ActorInfo PlayerActorInfo => innerData.PlayerActorInfo;
public bool DefinesUnsafeCustomRules public bool DefinesUnsafeCustomRules
{ {
get get
{ {
// Force lazy rules to be evaluated // Force lazy rules to be evaluated
var force = innerData.Rules; var force = innerData.WorldActorInfo;
return innerData.DefinesUnsafeCustomRules; return innerData.DefinesUnsafeCustomRules;
} }
} }
@@ -338,7 +342,7 @@ namespace OpenRA
public void PreloadRules() public void PreloadRules()
{ {
var unused = Rules; var unused = WorldActorInfo;
} }
public void UpdateRemoteSearch(MapStatus status, MiniYaml yaml, Action<MapPreview> parseMetadata = null) public void UpdateRemoteSearch(MapStatus status, MiniYaml yaml, Action<MapPreview> parseMetadata = null)

View File

@@ -1209,7 +1209,7 @@ namespace OpenRA.Server
// The null padding is needed to keep the player indexes in sync with world.Players on the clients // The null padding is needed to keep the player indexes in sync with world.Players on the clients
// This will need to change if future code wants to use worldPlayers for other purposes // This will need to change if future code wants to use worldPlayers for other purposes
var playerRandom = new MersenneTwister(LobbyInfo.GlobalSettings.RandomSeed); var playerRandom = new MersenneTwister(LobbyInfo.GlobalSettings.RandomSeed);
foreach (var cmpi in Map.Rules.Actors[SystemActors.World].TraitInfos<ICreatePlayersInfo>()) foreach (var cmpi in Map.WorldActorInfo.TraitInfos<ICreatePlayersInfo>())
cmpi.CreateServerPlayers(Map, LobbyInfo, worldPlayers, playerRandom); cmpi.CreateServerPlayers(Map, LobbyInfo, worldPlayers, playerRandom);
if (recorder != null) if (recorder != null)

View File

@@ -54,7 +54,7 @@ namespace OpenRA.Traits
[Desc("Display order for the explore map checkbox in the lobby.")] [Desc("Display order for the explore map checkbox in the lobby.")]
public readonly int ExploredMapCheckboxDisplayOrder = 0; public readonly int ExploredMapCheckboxDisplayOrder = 0;
IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(Ruleset rules) IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(MapPreview map)
{ {
yield return new LobbyBooleanOption("explored", ExploredMapCheckboxLabel, ExploredMapCheckboxDescription, yield return new LobbyBooleanOption("explored", ExploredMapCheckboxLabel, ExploredMapCheckboxDescription,
ExploredMapCheckboxVisible, ExploredMapCheckboxDisplayOrder, ExploredMapCheckboxEnabled, ExploredMapCheckboxLocked); ExploredMapCheckboxVisible, ExploredMapCheckboxDisplayOrder, ExploredMapCheckboxEnabled, ExploredMapCheckboxLocked);

View File

@@ -530,7 +530,7 @@ namespace OpenRA.Traits
[RequireExplicitImplementation] [RequireExplicitImplementation]
public interface ILobbyOptions : ITraitInfoInterface public interface ILobbyOptions : ITraitInfoInterface
{ {
IEnumerable<LobbyOption> LobbyOptions(Ruleset rules); IEnumerable<LobbyOption> LobbyOptions(MapPreview map);
} }
public class LobbyOption public class LobbyOption

View File

@@ -357,7 +357,7 @@ namespace OpenRA.Mods.Common.Server
} }
var botType = parts[2]; var botType = parts[2];
var botInfo = server.Map.Rules.Actors[SystemActors.Player].TraitInfos<IBotInfo>() var botInfo = server.Map.PlayerActorInfo.TraitInfos<IBotInfo>()
.FirstOrDefault(b => b.Type == botType); .FirstOrDefault(b => b.Type == botType);
if (botInfo == null) if (botInfo == null)
@@ -386,7 +386,7 @@ namespace OpenRA.Mods.Common.Server
// Pick a random color for the bot // Pick a random color for the bot
var validator = server.ModData.Manifest.Get<ColorValidator>(); var validator = server.ModData.Manifest.Get<ColorValidator>();
var terrainColors = server.Map.Rules.TerrainInfo.RestrictedPlayerColors; var terrainColors = server.ModData.DefaultTerrainInfo[server.Map.TileSet].RestrictedPlayerColors;
var playerColors = server.LobbyInfo.Clients.Select(c => c.Color) var playerColors = server.LobbyInfo.Clients.Select(c => c.Color)
.Concat(server.Map.Players.Players.Values.Select(p => p.Color)); .Concat(server.Map.Players.Players.Values.Select(p => p.Color));
bot.Color = bot.PreferredColor = validator.RandomPresetColor(server.Random, terrainColors, playerColors); bot.Color = bot.PreferredColor = validator.RandomPresetColor(server.Random, terrainColors, playerColors);
@@ -437,10 +437,10 @@ namespace OpenRA.Mods.Common.Server
.Where(ss => ss != null) .Where(ss => ss != null)
.ToDictionary(ss => ss.PlayerReference, ss => ss); .ToDictionary(ss => ss.PlayerReference, ss => ss);
LoadMapSettings(server, server.LobbyInfo.GlobalSettings, server.Map.Rules); LoadMapSettings(server, server.LobbyInfo.GlobalSettings, server.Map);
// Reset client states // Reset client states
var selectableFactions = server.Map.Rules.Actors[SystemActors.World].TraitInfos<FactionInfo>() var selectableFactions = server.Map.WorldActorInfo.TraitInfos<FactionInfo>()
.Where(f => f.Selectable) .Where(f => f.Selectable)
.Select(f => f.InternalName) .Select(f => f.InternalName)
.ToList(); .ToList();
@@ -457,7 +457,7 @@ namespace OpenRA.Mods.Common.Server
// - Players who now lack a slot are made observers // - Players who now lack a slot are made observers
// - Bots who now lack a slot are dropped // - Bots who now lack a slot are dropped
// - Bots who are not defined in the map rules are dropped // - Bots who are not defined in the map rules are dropped
var botTypes = server.Map.Rules.Actors[SystemActors.Player].TraitInfos<IBotInfo>().Select(t => t.Type); var botTypes = server.Map.PlayerActorInfo.TraitInfos<IBotInfo>().Select(t => t.Type);
var slots = server.LobbyInfo.Slots.Keys.ToArray(); var slots = server.LobbyInfo.Slots.Keys.ToArray();
var i = 0; var i = 0;
foreach (var os in oldSlots) foreach (var os in oldSlots)
@@ -534,9 +534,9 @@ namespace OpenRA.Mods.Common.Server
return true; return true;
} }
var allOptions = server.Map.Rules.Actors[SystemActors.Player].TraitInfos<ILobbyOptions>() var allOptions = server.Map.PlayerActorInfo.TraitInfos<ILobbyOptions>()
.Concat(server.Map.Rules.Actors[SystemActors.World].TraitInfos<ILobbyOptions>()) .Concat(server.Map.WorldActorInfo.TraitInfos<ILobbyOptions>())
.SelectMany(t => t.LobbyOptions(server.Map.Rules)); .SelectMany(t => t.LobbyOptions(server.Map));
// Overwrite keys with duplicate ids // Overwrite keys with duplicate ids
var options = new Dictionary<string, LobbyOption>(); var options = new Dictionary<string, LobbyOption>();
@@ -775,7 +775,7 @@ namespace OpenRA.Mods.Common.Server
if (server.LobbyInfo.Slots[targetClient.Slot].LockFaction) if (server.LobbyInfo.Slots[targetClient.Slot].LockFaction)
return true; return true;
var factions = server.Map.Rules.Actors[SystemActors.World].TraitInfos<FactionInfo>() var factions = server.Map.WorldActorInfo.TraitInfos<FactionInfo>()
.Where(f => f.Selectable).Select(f => f.InternalName); .Where(f => f.Selectable).Select(f => f.InternalName);
if (!factions.Contains(parts[1])) if (!factions.Contains(parts[1]))
@@ -1018,7 +1018,7 @@ namespace OpenRA.Mods.Common.Server
.Where(s => s != null) .Where(s => s != null)
.ToDictionary(s => s.PlayerReference, s => s); .ToDictionary(s => s.PlayerReference, s => s);
LoadMapSettings(server, server.LobbyInfo.GlobalSettings, server.Map.Rules); LoadMapSettings(server, server.LobbyInfo.GlobalSettings, server.Map);
} }
} }
@@ -1041,13 +1041,13 @@ namespace OpenRA.Mods.Common.Server
}; };
} }
public static void LoadMapSettings(S server, Session.Global gs, Ruleset rules) public static void LoadMapSettings(S server, Session.Global gs, MapPreview map)
{ {
lock (server.LobbyInfo) lock (server.LobbyInfo)
{ {
var options = rules.Actors[SystemActors.Player].TraitInfos<ILobbyOptions>() var options = map.PlayerActorInfo.TraitInfos<ILobbyOptions>()
.Concat(rules.Actors[SystemActors.World].TraitInfos<ILobbyOptions>()) .Concat(map.WorldActorInfo.TraitInfos<ILobbyOptions>())
.SelectMany(t => t.LobbyOptions(rules)); .SelectMany(t => t.LobbyOptions(map));
foreach (var o in options) foreach (var o in options)
{ {
@@ -1090,7 +1090,7 @@ namespace OpenRA.Mods.Common.Server
server.SendOrderTo(connectionToEcho, "Message", message); server.SendOrderTo(connectionToEcho, "Message", message);
}; };
var terrainColors = server.Map.Rules.TerrainInfo.RestrictedPlayerColors; var terrainColors = server.ModData.DefaultTerrainInfo[server.Map.TileSet].RestrictedPlayerColors;
var playerColors = server.LobbyInfo.Clients.Where(c => c.Index != playerIndex).Select(c => c.Color) var playerColors = server.LobbyInfo.Clients.Where(c => c.Index != playerIndex).Select(c => c.Color)
.Concat(server.Map.Players.Players.Values.Select(p => p.Color)).ToList(); .Concat(server.Map.Players.Players.Values.Select(p => p.Color)).ToList();
@@ -1100,7 +1100,7 @@ namespace OpenRA.Mods.Common.Server
static string MissionBriefingOrDefault(S server) static string MissionBriefingOrDefault(S server)
{ {
var missionData = server.Map.Rules.Actors[SystemActors.World].TraitInfoOrDefault<MissionDataInfo>(); var missionData = server.Map.WorldActorInfo.TraitInfoOrDefault<MissionDataInfo>();
if (missionData != null && !string.IsNullOrEmpty(missionData.Briefing)) if (missionData != null && !string.IsNullOrEmpty(missionData.Briefing))
return missionData.Briefing.Replace("\\n", "\n"); return missionData.Briefing.Replace("\\n", "\n");

View File

@@ -23,11 +23,11 @@ namespace OpenRA.Mods.Common.Server
lock (server.LobbyInfo) lock (server.LobbyInfo)
{ {
var defaults = new Session.Global(); var defaults = new Session.Global();
LobbyCommands.LoadMapSettings(server, defaults, server.Map.Rules); LobbyCommands.LoadMapSettings(server, defaults, server.Map);
var options = server.Map.Rules.Actors[SystemActors.Player].TraitInfos<ILobbyOptions>() var options = server.Map.PlayerActorInfo.TraitInfos<ILobbyOptions>()
.Concat(server.Map.Rules.Actors[SystemActors.World].TraitInfos<ILobbyOptions>()) .Concat(server.Map.WorldActorInfo.TraitInfos<ILobbyOptions>())
.SelectMany(t => t.LobbyOptions(server.Map.Rules)) .SelectMany(t => t.LobbyOptions(server.Map))
.ToDictionary(o => o.Id, o => o); .ToDictionary(o => o.Id, o => o);
foreach (var kv in server.LobbyInfo.GlobalSettings.LobbyOptions) foreach (var kv in server.LobbyInfo.GlobalSettings.LobbyOptions)

View File

@@ -62,7 +62,7 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Enable the path debug overlay by default.")] [Desc("Enable the path debug overlay by default.")]
public readonly bool PathDebug; public readonly bool PathDebug;
IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(Ruleset rules) IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(MapPreview map)
{ {
yield return new LobbyBooleanOption("cheats", CheckboxLabel, CheckboxDescription, CheckboxVisible, CheckboxDisplayOrder, CheckboxEnabled, CheckboxLocked); yield return new LobbyBooleanOption("cheats", CheckboxLabel, CheckboxDescription, CheckboxVisible, CheckboxDisplayOrder, CheckboxEnabled, CheckboxLocked);
} }

View File

@@ -56,7 +56,7 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Monetery value of each resource type.", "Dictionary of [resource type]: [value per unit].")] [Desc("Monetery value of each resource type.", "Dictionary of [resource type]: [value per unit].")]
public readonly Dictionary<string, int> ResourceValues = new Dictionary<string, int>(); public readonly Dictionary<string, int> ResourceValues = new Dictionary<string, int>();
IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(Ruleset rules) IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(MapPreview map)
{ {
var startingCash = SelectableCash.ToDictionary(c => c.ToString(), c => "$" + c.ToString()); var startingCash = SelectableCash.ToDictionary(c => c.ToString(), c => "$" + c.ToString());

View File

@@ -74,7 +74,7 @@ namespace OpenRA.Mods.Common.Traits
throw new YamlException("TimeLimitDefault must be a value from TimeLimitOptions"); throw new YamlException("TimeLimitDefault must be a value from TimeLimitOptions");
} }
IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(Ruleset rules) IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(MapPreview map)
{ {
var timelimits = TimeLimitOptions.ToDictionary(c => c.ToString(), c => var timelimits = TimeLimitOptions.ToDictionary(c => c.ToString(), c =>
{ {

View File

@@ -77,7 +77,7 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Spawn and remove the plane this far outside the map.")] [Desc("Spawn and remove the plane this far outside the map.")]
public readonly WDist Cordon = new WDist(5120); public readonly WDist Cordon = new WDist(5120);
IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(Ruleset rules) IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(MapPreview map)
{ {
yield return new LobbyBooleanOption("crates", CheckboxLabel, CheckboxDescription, CheckboxVisible, CheckboxDisplayOrder, CheckboxEnabled, CheckboxLocked); yield return new LobbyBooleanOption("crates", CheckboxLabel, CheckboxDescription, CheckboxVisible, CheckboxDisplayOrder, CheckboxEnabled, CheckboxLocked);
} }

View File

@@ -28,9 +28,8 @@ namespace OpenRA.Mods.Common.Traits
/// </summary> /// </summary>
void ICreatePlayersInfo.CreateServerPlayers(MapPreview map, Session lobbyInfo, List<GameInformation.Player> players, MersenneTwister playerRandom) void ICreatePlayersInfo.CreateServerPlayers(MapPreview map, Session lobbyInfo, List<GameInformation.Player> players, MersenneTwister playerRandom)
{ {
var worldInfo = map.Rules.Actors[SystemActors.World]; var factions = map.WorldActorInfo.TraitInfos<FactionInfo>().ToArray();
var factions = worldInfo.TraitInfos<FactionInfo>().ToArray(); var assignSpawnLocations = map.WorldActorInfo.TraitInfoOrDefault<IAssignSpawnPointsInfo>();
var assignSpawnLocations = worldInfo.TraitInfoOrDefault<IAssignSpawnPointsInfo>();
var spawnState = assignSpawnLocations?.InitializeState(map, lobbyInfo); var spawnState = assignSpawnLocations?.InitializeState(map, lobbyInfo);
// Create the unplayable map players -- neutral, shellmap, scripted, etc. // Create the unplayable map players -- neutral, shellmap, scripted, etc.
@@ -42,7 +41,7 @@ namespace OpenRA.Mods.Common.Traits
} }
// Create the regular playable players. // Create the regular playable players.
var bots = map.Rules.Actors[SystemActors.Player].TraitInfos<IBotInfo>().ToArray(); var bots = map.PlayerActorInfo.TraitInfos<IBotInfo>().ToArray();
foreach (var kv in lobbyInfo.Slots) foreach (var kv in lobbyInfo.Slots)
{ {

View File

@@ -47,7 +47,7 @@ namespace OpenRA.Mods.Common.Traits
IEnumerable<string> ITechTreePrerequisiteInfo.Prerequisites(ActorInfo info) { return Prerequisites; } IEnumerable<string> ITechTreePrerequisiteInfo.Prerequisites(ActorInfo info) { return Prerequisites; }
IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(Ruleset rules) IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(MapPreview map)
{ {
yield return new LobbyBooleanOption(ID, Label, Description, yield return new LobbyBooleanOption(ID, Label, Description,
Visible, DisplayOrder, Enabled, Locked); Visible, DisplayOrder, Enabled, Locked);

View File

@@ -54,7 +54,7 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Display order for the build radius checkbox in the lobby.")] [Desc("Display order for the build radius checkbox in the lobby.")]
public readonly int BuildRadiusCheckboxDisplayOrder = 0; public readonly int BuildRadiusCheckboxDisplayOrder = 0;
IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(Ruleset rules) IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(MapPreview map)
{ {
yield return new LobbyBooleanOption("allybuild", AllyBuildRadiusCheckboxLabel, AllyBuildRadiusCheckboxDescription, yield return new LobbyBooleanOption("allybuild", AllyBuildRadiusCheckboxLabel, AllyBuildRadiusCheckboxDescription,
AllyBuildRadiusCheckboxVisible, AllyBuildRadiusCheckboxDisplayOrder, AllyBuildRadiusCheckboxEnabled, AllyBuildRadiusCheckboxLocked); AllyBuildRadiusCheckboxVisible, AllyBuildRadiusCheckboxDisplayOrder, AllyBuildRadiusCheckboxEnabled, AllyBuildRadiusCheckboxLocked);

View File

@@ -36,7 +36,7 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Display order for the creeps checkbox in the lobby.")] [Desc("Display order for the creeps checkbox in the lobby.")]
public readonly int CheckboxDisplayOrder = 0; public readonly int CheckboxDisplayOrder = 0;
IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(Ruleset rules) IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(MapPreview map)
{ {
yield return new LobbyBooleanOption("creeps", CheckboxLabel, CheckboxDescription, CheckboxVisible, CheckboxDisplayOrder, CheckboxEnabled, CheckboxLocked); yield return new LobbyBooleanOption("creeps", CheckboxLabel, CheckboxDescription, CheckboxVisible, CheckboxDisplayOrder, CheckboxEnabled, CheckboxLocked);
} }

View File

@@ -73,12 +73,12 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Display order for the game speed option in the lobby.")] [Desc("Display order for the game speed option in the lobby.")]
public readonly int GameSpeedDropdownDisplayOrder = 0; public readonly int GameSpeedDropdownDisplayOrder = 0;
IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(Ruleset rules) IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(MapPreview map)
{ {
yield return new LobbyBooleanOption("shortgame", ShortGameCheckboxLabel, ShortGameCheckboxDescription, yield return new LobbyBooleanOption("shortgame", ShortGameCheckboxLabel, ShortGameCheckboxDescription,
ShortGameCheckboxVisible, ShortGameCheckboxDisplayOrder, ShortGameCheckboxEnabled, ShortGameCheckboxLocked); ShortGameCheckboxVisible, ShortGameCheckboxDisplayOrder, ShortGameCheckboxEnabled, ShortGameCheckboxLocked);
var techLevels = rules.Actors[SystemActors.Player].TraitInfos<ProvidesTechPrerequisiteInfo>() var techLevels = map.PlayerActorInfo.TraitInfos<ProvidesTechPrerequisiteInfo>()
.ToDictionary(t => t.Id, t => t.Name); .ToDictionary(t => t.Id, t => t.Name);
if (techLevels.Any()) if (techLevels.Any())

View File

@@ -45,7 +45,7 @@ namespace OpenRA.Mods.Common.Traits
public override object Create(ActorInitializer init) { return new MapStartingLocations(this); } public override object Create(ActorInitializer init) { return new MapStartingLocations(this); }
IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(Ruleset rules) IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(MapPreview map)
{ {
yield return new LobbyBooleanOption( yield return new LobbyBooleanOption(
"separateteamspawns", "separateteamspawns",

View File

@@ -45,7 +45,7 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Display order for the option in the lobby.")] [Desc("Display order for the option in the lobby.")]
public readonly int DisplayOrder = 0; public readonly int DisplayOrder = 0;
IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(Ruleset rules) IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(MapPreview map)
{ {
yield return new LobbyOption(ID, Label, Description, Visible, DisplayOrder, yield return new LobbyOption(ID, Label, Description, Visible, DisplayOrder,
Values, Default, Locked); Values, Default, Locked);

View File

@@ -39,12 +39,12 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Display order for the starting units option in the lobby.")] [Desc("Display order for the starting units option in the lobby.")]
public readonly int DropdownDisplayOrder = 0; public readonly int DropdownDisplayOrder = 0;
IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(Ruleset rules) IEnumerable<LobbyOption> ILobbyOptions.LobbyOptions(MapPreview map)
{ {
var startingUnits = new Dictionary<string, string>(); var startingUnits = new Dictionary<string, string>();
// Duplicate classes are defined for different race variants // Duplicate classes are defined for different race variants
foreach (var t in rules.Actors[SystemActors.World].TraitInfos<StartingUnitsInfo>()) foreach (var t in map.WorldActorInfo.TraitInfos<StartingUnitsInfo>())
startingUnits[t.Class] = t.ClassName; startingUnits[t.Class] = t.ClassName;
if (startingUnits.Any()) if (startingUnits.Any())

View File

@@ -207,7 +207,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
slotsButton.OnMouseDown = _ => slotsButton.OnMouseDown = _ =>
{ {
var botTypes = map.Rules.Actors[SystemActors.Player].TraitInfos<IBotInfo>().Select(t => t.Type); var botTypes = map.PlayerActorInfo.TraitInfos<IBotInfo>().Select(t => t.Type);
var options = new Dictionary<string, IEnumerable<DropDownOption>>(); var options = new Dictionary<string, IEnumerable<DropDownOption>>();
var botController = orderManager.LobbyInfo.Clients.FirstOrDefault(c => c.IsAdmin); var botController = orderManager.LobbyInfo.Clients.FirstOrDefault(c => c.IsAdmin);
@@ -539,7 +539,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
if (addBotOnMapLoad) if (addBotOnMapLoad)
{ {
var slot = orderManager.LobbyInfo.FirstEmptyBotSlot(); var slot = orderManager.LobbyInfo.FirstEmptyBotSlot();
var bot = currentMap.Rules.Actors[SystemActors.Player].TraitInfos<IBotInfo>().Select(t => t.Type).FirstOrDefault(); var bot = currentMap.PlayerActorInfo.TraitInfos<IBotInfo>().Select(t => t.Type).FirstOrDefault();
var botController = orderManager.LobbyInfo.Clients.FirstOrDefault(c => c.IsAdmin); var botController = orderManager.LobbyInfo.Clients.FirstOrDefault(c => c.IsAdmin);
if (slot != null && bot != null) if (slot != null && bot != null)
orderManager.IssueOrder(Order.Command("slot_bot {0} {1} {2}".F(slot, botController.Index, bot))); orderManager.IssueOrder(Order.Command("slot_bot {0} {1} {2}".F(slot, botController.Index, bot)));

View File

@@ -73,14 +73,14 @@ namespace OpenRA.Mods.Common.Widgets.Logic
void RebuildOptions() void RebuildOptions()
{ {
if (mapPreview == null || mapPreview.Rules == null || mapPreview.InvalidCustomRules) if (mapPreview == null || mapPreview.WorldActorInfo == null || mapPreview.InvalidCustomRules)
return; return;
optionsContainer.RemoveChildren(); optionsContainer.RemoveChildren();
optionsContainer.Bounds.Height = 0; optionsContainer.Bounds.Height = 0;
var allOptions = mapPreview.Rules.Actors[SystemActors.Player].TraitInfos<ILobbyOptions>() var allOptions = mapPreview.PlayerActorInfo.TraitInfos<ILobbyOptions>()
.Concat(mapPreview.Rules.Actors[SystemActors.World].TraitInfos<ILobbyOptions>()) .Concat(mapPreview.WorldActorInfo.TraitInfos<ILobbyOptions>())
.SelectMany(t => t.LobbyOptions(mapPreview.Rules)) .SelectMany(t => t.LobbyOptions(mapPreview))
.Where(o => o.IsVisible) .Where(o => o.IsVisible)
.OrderBy(o => o.DisplayOrder) .OrderBy(o => o.DisplayOrder)
.ToArray(); .ToArray();

View File

@@ -53,7 +53,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
var bots = new List<SlotDropDownOption>(); var bots = new List<SlotDropDownOption>();
if (slot.AllowBots) if (slot.AllowBots)
{ {
foreach (var b in map.Rules.Actors[SystemActors.Player].TraitInfos<IBotInfo>()) foreach (var b in map.PlayerActorInfo.TraitInfos<IBotInfo>())
{ {
var botController = orderManager.LobbyInfo.Clients.FirstOrDefault(c => c.IsAdmin); var botController = orderManager.LobbyInfo.Clients.FirstOrDefault(c => c.IsAdmin);
bots.Add(new SlotDropDownOption(b.Name, bots.Add(new SlotDropDownOption(b.Name,

View File

@@ -219,7 +219,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
new Thread(() => new Thread(() =>
{ {
var mapDifficulty = preview.Rules.Actors[SystemActors.World].TraitInfos<ScriptLobbyDropdownInfo>() var mapDifficulty = preview.WorldActorInfo.TraitInfos<ScriptLobbyDropdownInfo>()
.FirstOrDefault(sld => sld.ID == "difficulty"); .FirstOrDefault(sld => sld.ID == "difficulty");
if (mapDifficulty != null) if (mapDifficulty != null)
@@ -229,7 +229,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
difficultyDisabled = mapDifficulty.Locked; difficultyDisabled = mapDifficulty.Locked;
} }
var missionData = preview.Rules.Actors[SystemActors.World].TraitInfoOrDefault<MissionDataInfo>(); var missionData = preview.WorldActorInfo.TraitInfoOrDefault<MissionDataInfo>();
if (missionData != null) if (missionData != null)
{ {
briefingVideo = missionData.BriefingVideo; briefingVideo = missionData.BriefingVideo;
@@ -383,7 +383,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
orders.Add(Order.Command("option gamespeed {0}".F(gameSpeed))); orders.Add(Order.Command("option gamespeed {0}".F(gameSpeed)));
orders.Add(Order.Command("state {0}".F(Session.ClientState.Ready))); orders.Add(Order.Command("state {0}".F(Session.ClientState.Ready)));
var missionData = selectedMap.Rules.Actors[SystemActors.World].TraitInfoOrDefault<MissionDataInfo>(); var missionData = selectedMap.WorldActorInfo.TraitInfoOrDefault<MissionDataInfo>();
if (missionData != null && missionData.StartVideo != null && modData.DefaultFileSystem.Exists(missionData.StartVideo)) if (missionData != null && missionData.StartVideo != null && modData.DefaultFileSystem.Exists(missionData.StartVideo))
{ {
var fsPlayer = fullscreenVideoPlayer.Get<VideoPlayerWidget>("PLAYER"); var fsPlayer = fullscreenVideoPlayer.Get<VideoPlayerWidget>("PLAYER");