diff --git a/OpenRA.Game/Player.cs b/OpenRA.Game/Player.cs index 444ea4ca9d..22d6378dc1 100644 --- a/OpenRA.Game/Player.cs +++ b/OpenRA.Game/Player.cs @@ -229,8 +229,6 @@ namespace OpenRA return "{0} ({1})".F(PlayerName, ClientIndex); } - public Dictionary Stances = new Dictionary(); - public PlayerRelationship RelationshipWith(Player other) { if (this == other) @@ -240,7 +238,13 @@ namespace OpenRA if (other == null || other.Spectating) return NonCombatant ? PlayerRelationship.Neutral : PlayerRelationship.Ally; - return Stances[other]; + if (AlliedPlayersMask.Overlaps(other.PlayerMask)) + return PlayerRelationship.Ally; + + if (EnemyPlayersMask.Overlaps(other.PlayerMask)) + return PlayerRelationship.Enemy; + + return PlayerRelationship.Neutral; } public bool IsAlliedWith(Player p) diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index ebae869dba..a39218adb0 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -207,30 +207,13 @@ namespace OpenRA Selection = WorldActor.Trait(); OrderValidators = WorldActor.TraitsImplementing().ToArray(); - // Reset mask LongBitSet.Reset(); - // Add players // Create an isolated RNG to simplify synchronization between client and server player faction/spawn assignments var playerRandom = new MersenneTwister(orderManager.LobbyInfo.GlobalSettings.RandomSeed); foreach (var cmp in WorldActor.TraitsImplementing()) cmp.CreatePlayers(this, playerRandom); - // Set defaults for any unset stances - foreach (var p in Players) - { - if (!p.Spectating) - AllPlayersMask = AllPlayersMask.Union(p.PlayerMask); - - foreach (var q in Players) - { - SetUpPlayerMask(p, q); - - if (!p.Stances.ContainsKey(q)) - p.Stances[q] = PlayerRelationship.Neutral; - } - } - Game.Sound.SoundVolumeModifier = 1.0f; gameInfo = new GameInformation @@ -245,25 +228,6 @@ namespace OpenRA RulesContainTemporaryBlocker = map.Rules.Actors.Any(a => a.Value.HasTraitInfo()); } - void SetUpPlayerMask(Player p, Player q) - { - if (q.Spectating) - return; - - var bitSet = q.PlayerMask; - - switch (p.Stances[q]) - { - case PlayerRelationship.Enemy: - case PlayerRelationship.Neutral: - p.EnemyPlayersMask = p.EnemyPlayersMask.Union(bitSet); - break; - case PlayerRelationship.Ally: - p.AlliedPlayersMask = p.AlliedPlayersMask.Union(bitSet); - break; - } - } - public void AddToMaps(Actor self, IOccupySpace ios) { ActorMap.AddInfluence(self, ios); diff --git a/OpenRA.Mods.Common/Traits/World/CreateMPPlayers.cs b/OpenRA.Mods.Common/Traits/World/CreateMPPlayers.cs index f1ea9fa4d7..2a6a0c78e2 100644 --- a/OpenRA.Mods.Common/Traits/World/CreateMPPlayers.cs +++ b/OpenRA.Mods.Common/Traits/World/CreateMPPlayers.cs @@ -132,23 +132,25 @@ namespace OpenRA.Mods.Common.Traits foreach (var p in w.Players) foreach (var q in w.Players) - if (!p.Stances.ContainsKey(q)) - p.Stances[q] = ChooseInitialStance(p, q); + SetupPlayerMasks(p, q); } - static PlayerRelationship ChooseInitialStance(Player p, Player q) + static void SetupPlayerMasks(Player p, Player q) { - if (p == q) - return PlayerRelationship.Ally; + if (!p.Spectating) + p.World.AllPlayersMask = p.World.AllPlayersMask.Union(p.PlayerMask); - if (q.Spectating && !p.NonCombatant && p.Playable) - return PlayerRelationship.Ally; + if (p == q || p.PlayerReference.Allies.Contains(q.InternalName)) + { + p.AlliedPlayersMask = p.AlliedPlayersMask.Union(q.PlayerMask); + return; + } - // Stances set via PlayerReference - if (p.PlayerReference.Allies.Contains(q.InternalName)) - return PlayerRelationship.Ally; if (p.PlayerReference.Enemies.Contains(q.InternalName)) - return PlayerRelationship.Enemy; + { + p.EnemyPlayersMask = p.EnemyPlayersMask.Union(q.PlayerMask); + return; + } // HACK: Map players share a ClientID with the host, so would // otherwise take the host's team stance instead of being neutral @@ -158,12 +160,13 @@ namespace OpenRA.Mods.Common.Traits var pc = GetClientForPlayer(p); var qc = GetClientForPlayer(q); if (pc != null && qc != null) - return pc.Team != 0 && pc.Team == qc.Team - ? PlayerRelationship.Ally : PlayerRelationship.Enemy; + { + if (pc.Team != 0 && pc.Team == qc.Team) + p.AlliedPlayersMask = p.AlliedPlayersMask.Union(q.PlayerMask); + else + p.EnemyPlayersMask = p.EnemyPlayersMask.Union(q.PlayerMask); + } } - - // Otherwise, default to neutral - return PlayerRelationship.Neutral; } static Session.Client GetClientForPlayer(Player p)