Make IsDisabled a method on Actor.
This allows us to cache the disabled traits, which simplifies life for some callers since we relieve them of having to cache it, as well as improving perf for all IsDisabled calls.
This commit is contained in:
@@ -85,6 +85,7 @@ namespace OpenRA
|
|||||||
|
|
||||||
readonly IRenderModifier[] renderModifiers;
|
readonly IRenderModifier[] renderModifiers;
|
||||||
readonly IRender[] renders;
|
readonly IRender[] renders;
|
||||||
|
readonly IDisable[] disables;
|
||||||
|
|
||||||
internal Actor(World world, string name, TypeDictionary initDict)
|
internal Actor(World world, string name, TypeDictionary initDict)
|
||||||
{
|
{
|
||||||
@@ -128,6 +129,7 @@ namespace OpenRA
|
|||||||
|
|
||||||
renderModifiers = TraitsImplementing<IRenderModifier>().ToArray();
|
renderModifiers = TraitsImplementing<IRenderModifier>().ToArray();
|
||||||
renders = TraitsImplementing<IRender>().ToArray();
|
renders = TraitsImplementing<IRender>().ToArray();
|
||||||
|
disables = TraitsImplementing<IDisable>().ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Tick()
|
public void Tick()
|
||||||
@@ -277,6 +279,14 @@ namespace OpenRA
|
|||||||
health.Value.InflictDamage(this, attacker, health.Value.MaxHP, null, true);
|
health.Value.InflictDamage(this, attacker, health.Value.MaxHP, null, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool IsDisabled()
|
||||||
|
{
|
||||||
|
foreach (var disable in disables)
|
||||||
|
if (disable.Disabled)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
#region Scripting interface
|
#region Scripting interface
|
||||||
|
|
||||||
Lazy<ScriptActorInterface> luaInterface;
|
Lazy<ScriptActorInterface> luaInterface;
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ namespace OpenRA.Traits
|
|||||||
if (lobbyShroudFogDisabled)
|
if (lobbyShroudFogDisabled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var disabled = self.TraitsImplementing<IDisable>().Any(d => d.Disabled);
|
var disabled = self.IsDisabled();
|
||||||
if (cachedLocation != self.Location || cachedDisabled != disabled)
|
if (cachedLocation != self.Location || cachedDisabled != disabled)
|
||||||
{
|
{
|
||||||
cachedLocation = self.Location;
|
cachedLocation = self.Location;
|
||||||
|
|||||||
@@ -329,14 +329,6 @@ namespace OpenRA.Traits
|
|||||||
void OnObjectiveFailed(Player player, int objectiveID);
|
void OnObjectiveFailed(Player player, int objectiveID);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class DisableExts
|
|
||||||
{
|
|
||||||
public static bool IsDisabled(this Actor a)
|
|
||||||
{
|
|
||||||
return a.TraitsImplementing<IDisable>().Any(d => d.Disabled);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface ILegacyEditorRenderInfo
|
public interface ILegacyEditorRenderInfo
|
||||||
{
|
{
|
||||||
string EditorPalette { get; }
|
string EditorPalette { get; }
|
||||||
|
|||||||
@@ -54,11 +54,8 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
DefaultAnimation.PlayRepeating(NormalizeSequence(self, info.Sequence));
|
DefaultAnimation.PlayRepeating(NormalizeSequence(self, info.Sequence));
|
||||||
|
|
||||||
if (info.PauseOnLowPower)
|
if (info.PauseOnLowPower)
|
||||||
{
|
DefaultAnimation.Paused = () =>
|
||||||
var disabled = self.TraitsImplementing<IDisable>();
|
self.IsDisabled() && DefaultAnimation.CurrentSequence.Name == NormalizeSequence(self, info.Sequence);
|
||||||
DefaultAnimation.Paused = () => disabled.Any(d => d.Disabled)
|
|
||||||
&& DefaultAnimation.CurrentSequence.Name == NormalizeSequence(self, info.Sequence);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PlayCustomAnimThen(Actor self, string name, Action a)
|
public void PlayCustomAnimThen(Actor self, string name, Action a)
|
||||||
|
|||||||
@@ -30,13 +30,11 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
public class WithActiveAnimation : ITick, INotifyBuildComplete, INotifySold
|
public class WithActiveAnimation : ITick, INotifyBuildComplete, INotifySold
|
||||||
{
|
{
|
||||||
readonly IEnumerable<IDisable> disabled;
|
|
||||||
readonly WithActiveAnimationInfo info;
|
readonly WithActiveAnimationInfo info;
|
||||||
readonly RenderBuilding renderBuilding;
|
readonly RenderBuilding renderBuilding;
|
||||||
|
|
||||||
public WithActiveAnimation(Actor self, WithActiveAnimationInfo info)
|
public WithActiveAnimation(Actor self, WithActiveAnimationInfo info)
|
||||||
{
|
{
|
||||||
disabled = self.TraitsImplementing<IDisable>();
|
|
||||||
renderBuilding = self.Trait<RenderBuilding>();
|
renderBuilding = self.Trait<RenderBuilding>();
|
||||||
this.info = info;
|
this.info = info;
|
||||||
}
|
}
|
||||||
@@ -49,7 +47,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
if (--ticks <= 0)
|
if (--ticks <= 0)
|
||||||
{
|
{
|
||||||
if (!(info.PauseOnLowPower && disabled.Any(d => d.Disabled)))
|
if (!(info.PauseOnLowPower && self.IsDisabled()))
|
||||||
renderBuilding.PlayCustomAnim(self, info.Sequence);
|
renderBuilding.PlayCustomAnim(self, info.Sequence);
|
||||||
ticks = info.Interval;
|
ticks = info.Interval;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,7 +61,6 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
{
|
{
|
||||||
var rs = self.Trait<RenderSprites>();
|
var rs = self.Trait<RenderSprites>();
|
||||||
var body = self.Trait<IBodyOrientation>();
|
var body = self.Trait<IBodyOrientation>();
|
||||||
var disabled = self.TraitsImplementing<IDisable>();
|
|
||||||
|
|
||||||
buildComplete = !self.HasTrait<Building>(); // always render instantly for units
|
buildComplete = !self.HasTrait<Building>(); // always render instantly for units
|
||||||
overlay = new Animation(self.World, rs.GetImage(self));
|
overlay = new Animation(self.World, rs.GetImage(self));
|
||||||
@@ -70,7 +69,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
new AnimationWithOffset(overlay,
|
new AnimationWithOffset(overlay,
|
||||||
() => body.LocalToWorld(info.Offset.Rotate(body.QuantizeOrientation(self, self.Orientation))),
|
() => body.LocalToWorld(info.Offset.Rotate(body.QuantizeOrientation(self, self.Orientation))),
|
||||||
() => IsTraitDisabled || !buildComplete,
|
() => IsTraitDisabled || !buildComplete,
|
||||||
() => info.PauseOnLowPower && disabled.Any(d => d.Disabled),
|
() => info.PauseOnLowPower && self.IsDisabled(),
|
||||||
p => WithTurret.ZOffsetFromCenter(self, p, 1)),
|
p => WithTurret.ZOffsetFromCenter(self, p, 1)),
|
||||||
info.Palette, info.IsPlayerPalette);
|
info.Palette, info.IsPlayerPalette);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,19 +27,17 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
public class WithRepairAnimation : INotifyRepair
|
public class WithRepairAnimation : INotifyRepair
|
||||||
{
|
{
|
||||||
IEnumerable<IDisable> disabled;
|
|
||||||
WithRepairAnimationInfo info;
|
WithRepairAnimationInfo info;
|
||||||
|
|
||||||
public WithRepairAnimation(Actor self, WithRepairAnimationInfo info)
|
public WithRepairAnimation(Actor self, WithRepairAnimationInfo info)
|
||||||
{
|
{
|
||||||
disabled = self.TraitsImplementing<IDisable>();
|
|
||||||
this.info = info;
|
this.info = info;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Repairing(Actor self, Actor host)
|
public void Repairing(Actor self, Actor host)
|
||||||
{
|
{
|
||||||
var building = host.TraitOrDefault<RenderBuilding>();
|
var building = host.TraitOrDefault<RenderBuilding>();
|
||||||
if (building != null && !(info.PauseOnLowPower && disabled.Any(d => d.Disabled)))
|
if (building != null && !(info.PauseOnLowPower && self.IsDisabled()))
|
||||||
building.PlayCustomAnim(host, info.Sequence);
|
building.PlayCustomAnim(host, info.Sequence);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
{
|
{
|
||||||
var rs = self.Trait<RenderSprites>();
|
var rs = self.Trait<RenderSprites>();
|
||||||
var body = self.Trait<IBodyOrientation>();
|
var body = self.Trait<IBodyOrientation>();
|
||||||
var disabled = self.TraitsImplementing<IDisable>();
|
|
||||||
|
|
||||||
buildComplete = !self.HasTrait<Building>(); // always render instantly for units
|
buildComplete = !self.HasTrait<Building>(); // always render instantly for units
|
||||||
overlay = new Animation(self.World, rs.GetImage(self));
|
overlay = new Animation(self.World, rs.GetImage(self));
|
||||||
@@ -53,7 +52,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
new AnimationWithOffset(overlay,
|
new AnimationWithOffset(overlay,
|
||||||
() => body.LocalToWorld(info.Offset.Rotate(body.QuantizeOrientation(self, self.Orientation))),
|
() => body.LocalToWorld(info.Offset.Rotate(body.QuantizeOrientation(self, self.Orientation))),
|
||||||
() => !buildComplete,
|
() => !buildComplete,
|
||||||
() => info.PauseOnLowPower && disabled.Any(d => d.Disabled),
|
() => info.PauseOnLowPower && self.IsDisabled(),
|
||||||
p => WithTurret.ZOffsetFromCenter(self, p, 1)),
|
p => WithTurret.ZOffsetFromCenter(self, p, 1)),
|
||||||
info.Palette, info.IsPlayerPalette);
|
info.Palette, info.IsPlayerPalette);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -179,7 +179,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
static bool InstanceDisabled(SupportPower sp)
|
static bool InstanceDisabled(SupportPower sp)
|
||||||
{
|
{
|
||||||
return sp.Self.TraitsImplementing<IDisable>().Any(d => d.Disabled);
|
return sp.Self.IsDisabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool notifiedCharging;
|
bool notifiedCharging;
|
||||||
|
|||||||
Reference in New Issue
Block a user