Add some basic safeguards around RenderPlayer.set.

This commit is contained in:
Paul Chote
2018-05-28 12:01:23 +00:00
committed by reaperrr
parent 3a1857886a
commit ebf3ec0e90
4 changed files with 43 additions and 5 deletions

View File

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

View File

@@ -467,4 +467,7 @@ namespace OpenRA.Traits
return playerName + " " + BoolValues[newValue] + " " + Name + ".";
}
}
[RequireExplicitImplementation]
public interface IUnlocksRenderPlayer { bool RenderPlayerUnlocked { get; } }
}

View File

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