Add some basic safeguards around RenderPlayer.set.
This commit is contained in:
@@ -68,6 +68,20 @@ namespace OpenRA
|
||||
public Shroud Shroud;
|
||||
public World World { get; private set; }
|
||||
|
||||
readonly bool inMissionMap;
|
||||
readonly IUnlocksRenderPlayer[] unlockRenderPlayer;
|
||||
|
||||
public bool UnlockedRenderPlayer
|
||||
{
|
||||
get
|
||||
{
|
||||
if (unlockRenderPlayer.Any(x => x.RenderPlayerUnlocked))
|
||||
return true;
|
||||
|
||||
return WinState != WinState.Undefined && !inMissionMap;
|
||||
}
|
||||
}
|
||||
|
||||
readonly StanceColors stanceColors;
|
||||
|
||||
static FactionInfo ChooseFaction(World world, string name, bool requireSelectable = true)
|
||||
@@ -105,6 +119,8 @@ namespace OpenRA
|
||||
InternalName = pr.Name;
|
||||
PlayerReference = pr;
|
||||
|
||||
inMissionMap = world.Map.Visibility.HasFlag(MapVisibility.MissionSelector);
|
||||
|
||||
// Real player or host-created bot
|
||||
if (client != null)
|
||||
{
|
||||
@@ -156,6 +172,8 @@ namespace OpenRA
|
||||
stanceColors.Allies = ChromeMetrics.Get<Color>("PlayerStanceColorAllies");
|
||||
stanceColors.Enemies = ChromeMetrics.Get<Color>("PlayerStanceColorEnemies");
|
||||
stanceColors.Neutrals = ChromeMetrics.Get<Color>("PlayerStanceColorNeutrals");
|
||||
|
||||
unlockRenderPlayer = PlayerActor.TraitsImplementing<IUnlocksRenderPlayer>().ToArray();
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
|
||||
@@ -467,4 +467,7 @@ namespace OpenRA.Traits
|
||||
return playerName + " " + BoolValues[newValue] + " " + Name + ".";
|
||||
}
|
||||
}
|
||||
|
||||
[RequireExplicitImplementation]
|
||||
public interface IUnlocksRenderPlayer { bool RenderPlayerUnlocked { get; } }
|
||||
}
|
||||
|
||||
@@ -73,8 +73,16 @@ namespace OpenRA
|
||||
Player renderPlayer;
|
||||
public Player RenderPlayer
|
||||
{
|
||||
get { return renderPlayer == null || (renderPlayer.WinState != WinState.Undefined && !Map.Visibility.HasFlag(MapVisibility.MissionSelector)) ? null : renderPlayer; }
|
||||
set { renderPlayer = value; }
|
||||
get
|
||||
{
|
||||
return renderPlayer;
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
if (LocalPlayer == null || LocalPlayer.UnlockedRenderPlayer)
|
||||
renderPlayer = value;
|
||||
}
|
||||
}
|
||||
|
||||
public bool FogObscures(Actor a) { return RenderPlayer != null && !a.CanBeViewedByPlayer(RenderPlayer); }
|
||||
@@ -101,7 +109,9 @@ namespace OpenRA
|
||||
return;
|
||||
|
||||
LocalPlayer = localPlayer;
|
||||
RenderPlayer = LocalPlayer;
|
||||
|
||||
// Set the property backing field directly
|
||||
renderPlayer = LocalPlayer;
|
||||
}
|
||||
|
||||
public readonly Actor WorldActor;
|
||||
@@ -410,7 +420,12 @@ namespace OpenRA
|
||||
ret += n++ * Sync.Hash(sync);
|
||||
|
||||
// Hash the shared random number generator.
|
||||
ret += SharedRandom.Last;
|
||||
ret += SharedRandom.Last;
|
||||
|
||||
// Hash player RenderPlayer status
|
||||
foreach (var p in Players)
|
||||
if (p.UnlockedRenderPlayer)
|
||||
ret += Sync.HashPlayer(p);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user