Actor properties consistency improved

This commit is contained in:
huwpascoe
2014-11-10 14:20:19 +00:00
parent 6a425b8636
commit a660bb95b5
58 changed files with 109 additions and 120 deletions

View File

@@ -23,20 +23,33 @@ namespace OpenRA
{ {
public class Actor : IScriptBindable, IScriptNotifyBind, ILuaTableBinding, ILuaEqualityBinding, ILuaToStringBinding, IEquatable<Actor> public class Actor : IScriptBindable, IScriptNotifyBind, ILuaTableBinding, ILuaEqualityBinding, ILuaToStringBinding, IEquatable<Actor>
{ {
public readonly ActorInfo Info; [Sync] public Player Owner;
public readonly ActorInfo Info;
public readonly World World; public readonly World World;
public readonly uint ActorID; public readonly uint ActorID;
public Lazy<Rectangle> Bounds;
Lazy<IOccupySpace> occupySpace; public bool IsInWorld { get; internal set; }
public bool Destroyed { get; private set; }
Activity currentActivity;
public Group Group;
public int Generation;
Lazy<Rectangle> bounds;
Lazy<IFacing> facing; Lazy<IFacing> facing;
Lazy<Health> health; Lazy<Health> health;
Lazy<IOccupySpace> occupySpace;
Lazy<IEffectiveOwner> effectiveOwner; Lazy<IEffectiveOwner> effectiveOwner;
public Rectangle Bounds { get { return bounds.Value; } }
public IOccupySpace OccupiesSpace { get { return occupySpace.Value; } } public IOccupySpace OccupiesSpace { get { return occupySpace.Value; } }
public IEffectiveOwner EffectiveOwner { get { return effectiveOwner.Value; } } public IEffectiveOwner EffectiveOwner { get { return effectiveOwner.Value; } }
public bool IsIdle { get { return currentActivity == null; } }
public bool IsDead { get { return Destroyed || (health.Value == null ? false : health.Value.IsDead); } }
public CPos Location { get { return occupySpace.Value.TopLeft; } } public CPos Location { get { return occupySpace.Value.TopLeft; } }
public WPos CenterPosition { get { return occupySpace.Value.CenterPosition; } } public WPos CenterPosition { get { return occupySpace.Value.CenterPosition; } }
@@ -50,12 +63,6 @@ namespace OpenRA
} }
} }
[Sync] public Player Owner;
Activity currentActivity;
public Group Group;
public int Generation;
internal Actor(World world, string name, TypeDictionary initDict) internal Actor(World world, string name, TypeDictionary initDict)
{ {
var init = new ActorInitializer(this, initDict); var init = new ActorInitializer(this, initDict);
@@ -69,10 +76,12 @@ namespace OpenRA
if (name != null) if (name != null)
{ {
if (!world.Map.Rules.Actors.ContainsKey(name.ToLowerInvariant())) name = name.ToLowerInvariant();
throw new NotImplementedException("No rules definition for unit {0}".F(name.ToLowerInvariant()));
Info = world.Map.Rules.Actors[name.ToLowerInvariant()]; if (!world.Map.Rules.Actors.ContainsKey(name))
throw new NotImplementedException("No rules definition for unit " + name);
Info = world.Map.Rules.Actors[name];
foreach (var trait in Info.TraitsInConstructOrder()) foreach (var trait in Info.TraitsInConstructOrder())
AddTrait(trait.Create(init)); AddTrait(trait.Create(init));
} }
@@ -81,7 +90,7 @@ namespace OpenRA
health = Exts.Lazy(() => TraitOrDefault<Health>()); health = Exts.Lazy(() => TraitOrDefault<Health>());
effectiveOwner = Exts.Lazy(() => TraitOrDefault<IEffectiveOwner>()); effectiveOwner = Exts.Lazy(() => TraitOrDefault<IEffectiveOwner>());
Bounds = Exts.Lazy(() => bounds = Exts.Lazy(() =>
{ {
var si = Info.Traits.GetOrDefault<SelectableInfo>(); var si = Info.Traits.GetOrDefault<SelectableInfo>();
var size = (si != null && si.Bounds != null) ? new int2(si.Bounds[0], si.Bounds[1]) : var size = (si != null && si.Bounds != null) ? new int2(si.Bounds[0], si.Bounds[1]) :
@@ -99,16 +108,12 @@ namespace OpenRA
{ {
var wasIdle = IsIdle; var wasIdle = IsIdle;
currentActivity = Traits.Util.RunActivity(this, currentActivity); currentActivity = Traits.Util.RunActivity(this, currentActivity);
if (!wasIdle && IsIdle) if (!wasIdle && IsIdle)
foreach (var n in TraitsImplementing<INotifyBecomingIdle>()) foreach (var n in TraitsImplementing<INotifyBecomingIdle>())
n.OnBecomingIdle(this); n.OnBecomingIdle(this);
} }
public bool IsIdle
{
get { return currentActivity == null; }
}
public IEnumerable<IRenderable> Render(WorldRenderer wr) public IEnumerable<IRenderable> Render(WorldRenderer wr)
{ {
var renderables = Renderables(wr); var renderables = Renderables(wr);
@@ -124,8 +129,6 @@ namespace OpenRA
yield return renderable; yield return renderable;
} }
public bool IsInWorld { get; internal set; }
public void QueueActivity(bool queued, Activity nextActivity) public void QueueActivity(bool queued, Activity nextActivity)
{ {
if (!queued) if (!queued)
@@ -198,8 +201,6 @@ namespace OpenRA
World.traitDict.AddTrait(this, trait); World.traitDict.AddTrait(this, trait);
} }
public bool Destroyed { get; private set; }
public void Destroy() public void Destroy()
{ {
World.AddFrameEndTask(w => World.AddFrameEndTask(w =>
@@ -239,19 +240,6 @@ namespace OpenRA
}); });
} }
public bool IsDead()
{
if (Destroyed)
return true;
return (health.Value == null) ? false : health.Value.IsDead;
}
public bool IsDisguised()
{
return effectiveOwner.Value != null && effectiveOwner.Value.Disguised;
}
public void Kill(Actor attacker) public void Kill(Actor attacker)
{ {
if (health.Value == null) if (health.Value == null)

View File

@@ -81,7 +81,8 @@ namespace OpenRA.Graphics
if (Game.Settings.Game.TeamHealthColors) if (Game.Settings.Game.TeamHealthColors)
{ {
var isAlly = actor.Owner.IsAlliedWith(actor.World.LocalPlayer) var isAlly = actor.Owner.IsAlliedWith(actor.World.LocalPlayer)
|| (actor.IsDisguised() && actor.World.LocalPlayer.IsAlliedWith(actor.EffectiveOwner.Owner)); || (actor.EffectiveOwner != null && actor.EffectiveOwner.Disguised
&& actor.World.LocalPlayer.IsAlliedWith(actor.EffectiveOwner.Owner));
return isAlly ? Color.LimeGreen : actor.Owner.NonCombatant ? Color.Tan : Color.Red; return isAlly ? Color.LimeGreen : actor.Owner.NonCombatant ? Color.Tan : Color.Red;
} }
else else
@@ -137,13 +138,13 @@ namespace OpenRA.Graphics
public void BeforeRender(WorldRenderer wr) {} public void BeforeRender(WorldRenderer wr) {}
public void Render(WorldRenderer wr) public void Render(WorldRenderer wr)
{ {
if (!actor.IsInWorld || actor.IsDead()) if (!actor.IsInWorld || actor.IsDead)
return; return;
var health = actor.TraitOrDefault<Health>(); var health = actor.TraitOrDefault<Health>();
var screenPos = wr.ScreenPxPosition(pos); var screenPos = wr.ScreenPxPosition(pos);
var bounds = actor.Bounds.Value; var bounds = actor.Bounds;
bounds.Offset(screenPos.X, screenPos.Y); bounds.Offset(screenPos.X, screenPos.Y);
var xy = new float2(bounds.Left, bounds.Top); var xy = new float2(bounds.Left, bounds.Top);

View File

@@ -22,7 +22,7 @@ namespace OpenRA.Graphics
readonly Color color; readonly Color color;
public SelectionBoxRenderable(Actor actor, Color color) public SelectionBoxRenderable(Actor actor, Color color)
: this(actor.CenterPosition, actor.Bounds.Value, 1f, color) { } : this(actor.CenterPosition, actor.Bounds, 1f, color) { }
public SelectionBoxRenderable(WPos pos, Rectangle bounds, float scale, Color color) public SelectionBoxRenderable(WPos pos, Rectangle bounds, float scale, Color color)
{ {

View File

@@ -22,7 +22,7 @@ namespace OpenRA.Scripting
protected override string MemberNotFoundError(string memberName) protected override string MemberNotFoundError(string memberName)
{ {
var actorName = actor.Info.Name; var actorName = actor.Info.Name;
if (actor.IsDead()) if (actor.IsDead)
actorName += " (dead)"; actorName += " (dead)";
return "Actor '{0}' does not define a property '{1}'".F(actorName, memberName); return "Actor '{0}' does not define a property '{1}'".F(actorName, memberName);

View File

@@ -88,7 +88,7 @@ namespace OpenRA
return; return;
} }
var groupActors = controlGroups[group].Where(a => !a.IsDead()); var groupActors = controlGroups[group].Where(a => !a.IsDead);
if (mods.HasModifier(Modifiers.Alt) || MultiTapCount >= 2) if (mods.HasModifier(Modifiers.Alt) || MultiTapCount >= 2)
{ {

View File

@@ -98,7 +98,7 @@ namespace OpenRA.Traits
foreach (var nd in self.TraitsImplementing<INotifyDamageStateChanged>()) foreach (var nd in self.TraitsImplementing<INotifyDamageStateChanged>())
nd.DamageStateChanged(self, ai); nd.DamageStateChanged(self, ai);
if (Info.NotifyAppliedDamage && repairer != null && repairer.IsInWorld && !repairer.IsDead()) if (Info.NotifyAppliedDamage && repairer != null && repairer.IsInWorld && !repairer.IsDead)
foreach (var nd in repairer.TraitsImplementing<INotifyAppliedDamage>() foreach (var nd in repairer.TraitsImplementing<INotifyAppliedDamage>()
.Concat(repairer.Owner.PlayerActor.TraitsImplementing<INotifyAppliedDamage>())) .Concat(repairer.Owner.PlayerActor.TraitsImplementing<INotifyAppliedDamage>()))
nd.AppliedDamage(repairer, self, ai); nd.AppliedDamage(repairer, self, ai);
@@ -141,7 +141,7 @@ namespace OpenRA.Traits
foreach (var nd in self.TraitsImplementing<INotifyDamageStateChanged>()) foreach (var nd in self.TraitsImplementing<INotifyDamageStateChanged>())
nd.DamageStateChanged(self, ai); nd.DamageStateChanged(self, ai);
if (Info.NotifyAppliedDamage && attacker != null && attacker.IsInWorld && !attacker.IsDead()) if (Info.NotifyAppliedDamage && attacker != null && attacker.IsInWorld && !attacker.IsDead)
foreach (var nd in attacker.TraitsImplementing<INotifyAppliedDamage>() foreach (var nd in attacker.TraitsImplementing<INotifyAppliedDamage>()
.Concat(attacker.Owner.PlayerActor.TraitsImplementing<INotifyAppliedDamage>())) .Concat(attacker.Owner.PlayerActor.TraitsImplementing<INotifyAppliedDamage>()))
nd.AppliedDamage(attacker, self, ai); nd.AppliedDamage(attacker, self, ai);

View File

@@ -47,13 +47,13 @@ namespace OpenRA.Traits
FootprintRegion = footprintRegion; FootprintRegion = footprintRegion;
CenterPosition = self.CenterPosition; CenterPosition = self.CenterPosition;
Bounds = self.Bounds.Value; Bounds = self.Bounds;
} }
public uint ID { get { return actor.ActorID; } } public uint ID { get { return actor.ActorID; } }
public bool IsValid { get { return Owner != null && HasRenderables; } } public bool IsValid { get { return Owner != null && HasRenderables; } }
public ActorInfo Info { get { return actor.Info; } } public ActorInfo Info { get { return actor.Info; } }
public Actor Actor { get { return !actor.IsDead() ? actor : null; } } public Actor Actor { get { return !actor.IsDead ? actor : null; } }
int flashTicks; int flashTicks;
public void Tick(World world, Shroud shroud) public void Tick(World world, Shroud shroud)

View File

@@ -38,7 +38,7 @@ namespace OpenRA.Traits
IEnumerable<WPos> ActivityTargetPath() IEnumerable<WPos> ActivityTargetPath()
{ {
if (!self.IsInWorld || self.IsDead()) if (!self.IsInWorld || self.IsDead)
yield break; yield break;
var activity = self.GetCurrentActivity(); var activity = self.GetCurrentActivity();

View File

@@ -41,7 +41,7 @@ namespace OpenRA.Traits
if (!self.Owner.IsAlliedWith(self.World.RenderPlayer) && self.World.FogObscures(self)) if (!self.Owner.IsAlliedWith(self.World.RenderPlayer) && self.World.FogObscures(self))
yield break; yield break;
var b = self.Bounds.Value; var b = self.Bounds;
var pos = wr.ScreenPxPosition(self.CenterPosition); var pos = wr.ScreenPxPosition(self.CenterPosition);
var tl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Top)); var tl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Top));
var bl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Bottom)); var bl = wr.Viewport.WorldToViewPx(pos + new int2(b.Left, b.Bottom));
@@ -85,7 +85,7 @@ namespace OpenRA.Traits
var pipxyBase = basePosition + new int2(1 - pipSize.X / 2, - (3 + pipSize.Y / 2)); var pipxyBase = basePosition + new int2(1 - pipSize.X / 2, - (3 + pipSize.Y / 2));
var pipxyOffset = new int2(0, 0); var pipxyOffset = new int2(0, 0);
var pal = wr.Palette(Info.Palette); var pal = wr.Palette(Info.Palette);
var width = self.Bounds.Value.Width; var width = self.Bounds.Width;
foreach (var pips in pipSources) foreach (var pips in pipSources)
{ {

View File

@@ -66,7 +66,7 @@ namespace OpenRA.Traits
if (type == TargetType.Actor) if (type == TargetType.Actor)
{ {
// Actor is no longer in the world // Actor is no longer in the world
if (!actor.IsInWorld || actor.IsDead()) if (!actor.IsInWorld || actor.IsDead)
return TargetType.Invalid; return TargetType.Invalid;
// Actor generation has changed (teleported or captured) // Actor generation has changed (teleported or captured)

View File

@@ -84,7 +84,7 @@ namespace OpenRA.Traits
public void Add(Actor a) public void Add(Actor a)
{ {
var pos = worldRenderer.ScreenPxPosition(a.CenterPosition); var pos = worldRenderer.ScreenPxPosition(a.CenterPosition);
var bounds = a.Bounds.Value; var bounds = a.Bounds;
bounds.Offset(pos.X, pos.Y); bounds.Offset(pos.X, pos.Y);
var top = Math.Max(0, bounds.Top / info.BinSize); var top = Math.Max(0, bounds.Top / info.BinSize);

View File

@@ -55,7 +55,7 @@ namespace OpenRA.Mods.Cnc
case State.Dock: case State.Dock:
ru.PlayCustomAnimation(self, "dock", () => { ru.PlayCustomAnimation(self, "dock", () => {
ru.PlayCustomAnimRepeating(self, "dock-loop"); ru.PlayCustomAnimRepeating(self, "dock-loop");
if (proc.IsInWorld && !proc.IsDead()) if (proc.IsInWorld && !proc.IsDead)
foreach (var nd in proc.TraitsImplementing<INotifyDocking>()) foreach (var nd in proc.TraitsImplementing<INotifyDocking>())
nd.Docked(proc, self); nd.Docked(proc, self);
state = State.Loop; state = State.Loop;
@@ -63,12 +63,12 @@ namespace OpenRA.Mods.Cnc
state = State.Wait; state = State.Wait;
return this; return this;
case State.Loop: case State.Loop:
if (!proc.IsInWorld || proc.IsDead() || harv.TickUnload(self, proc)) if (!proc.IsInWorld || proc.IsDead || harv.TickUnload(self, proc))
state = State.Undock; state = State.Undock;
return this; return this;
case State.Undock: case State.Undock:
ru.PlayCustomAnimBackwards(self, "dock", () => state = State.DragOut); ru.PlayCustomAnimBackwards(self, "dock", () => state = State.DragOut);
if (proc.IsInWorld && !proc.IsDead()) if (proc.IsInWorld && !proc.IsDead)
foreach (var nd in proc.TraitsImplementing<INotifyDocking>()) foreach (var nd in proc.TraitsImplementing<INotifyDocking>())
nd.Undocked(proc, self); nd.Undocked(proc, self);
state = State.Wait; state = State.Wait;

View File

@@ -64,7 +64,7 @@ namespace OpenRA.Mods.Cnc.Traits
a.QueueActivity(new Land(Target.FromActor(self))); a.QueueActivity(new Land(Target.FromActor(self)));
a.QueueActivity(new CallFunc(() => a.QueueActivity(new CallFunc(() =>
{ {
if (!self.IsInWorld || self.IsDead()) if (!self.IsInWorld || self.IsDead)
return; return;
foreach (var cargo in self.TraitsImplementing<INotifyDelivery>()) foreach (var cargo in self.TraitsImplementing<INotifyDelivery>())

View File

@@ -30,7 +30,7 @@ namespace OpenRA.Mods.Common.Effects
public void Tick(World world) public void Tick(World world)
{ {
if (!a.IsInWorld || a.IsDead() || !a.Trait<CanPowerDown>().Disabled) if (!a.IsInWorld || a.IsDead || !a.Trait<CanPowerDown>().Disabled)
world.AddFrameEndTask(w => w.Remove(this)); world.AddFrameEndTask(w => w.Remove(this));
anim.Tick(); anim.Tick();

View File

@@ -48,7 +48,7 @@ namespace OpenRA.Mods.Common.Effects
circles.Play("circles"); circles.Play("circles");
} }
if (!building.IsInWorld || building.IsDead()) if (!building.IsInWorld || building.IsDead)
world.AddFrameEndTask(w => w.Remove(this)); world.AddFrameEndTask(w => w.Remove(this));
} }

View File

@@ -148,7 +148,7 @@ namespace OpenRA.Mods.Common.Power
{ {
var actors = self.World.ActorsWithTrait<AffectedByPowerOutage>() var actors = self.World.ActorsWithTrait<AffectedByPowerOutage>()
.Select(tp => tp.Actor) .Select(tp => tp.Actor)
.Where(a => !a.IsDead() && a.IsInWorld && a.Owner == self.Owner); .Where(a => !a.IsDead && a.IsInWorld && a.Owner == self.Owner);
UpdateActors(actors); UpdateActors(actors);
} }

View File

@@ -35,7 +35,7 @@ namespace OpenRA.Mods.Common
{ {
if (claim.Claimer.Destroyed) return; if (claim.Claimer.Destroyed) return;
if (!claim.Claimer.IsInWorld) return; if (!claim.Claimer.IsInWorld) return;
if (claim.Claimer.IsDead()) return; if (claim.Claimer.IsDead) return;
claim.Claimer.Trait<INotifyResourceClaimLost>().OnNotifyResourceClaimLost(claim.Claimer, claim, claimer); claim.Claimer.Trait<INotifyResourceClaimLost>().OnNotifyResourceClaimLost(claim.Claimer, claim, claimer);
} }

View File

@@ -475,7 +475,7 @@ namespace OpenRA.Mods.RA.AI
List<Actor> FindEnemyConstructionYards() List<Actor> FindEnemyConstructionYards()
{ {
return world.Actors.Where(a => p.Stances[a.Owner] == Stance.Enemy && !a.IsDead() return world.Actors.Where(a => p.Stances[a.Owner] == Stance.Enemy && !a.IsDead
&& a.HasTrait<BaseBuilding>() && !a.HasTrait<Mobile>()).ToList(); && a.HasTrait<BaseBuilding>() && !a.HasTrait<Mobile>()).ToList();
} }
@@ -483,7 +483,7 @@ namespace OpenRA.Mods.RA.AI
{ {
squads.RemoveAll(s => !s.IsValid); squads.RemoveAll(s => !s.IsValid);
foreach (var s in squads) foreach (var s in squads)
s.units.RemoveAll(a => a.IsDead() || a.Owner != p); s.units.RemoveAll(a => a.IsDead || a.Owner != p);
} }
// Use of this function requires that one squad of this type. Hence it is a piece of shit // Use of this function requires that one squad of this type. Hence it is a piece of shit
@@ -506,8 +506,8 @@ namespace OpenRA.Mods.RA.AI
void AssignRolesToIdleUnits(Actor self) void AssignRolesToIdleUnits(Actor self)
{ {
CleanSquads(); CleanSquads();
activeUnits.RemoveAll(a => a.IsDead() || a.Owner != p); activeUnits.RemoveAll(a => a.IsDead || a.Owner != p);
unitsHangingAroundTheBase.RemoveAll(a => a.IsDead() || a.Owner != p); unitsHangingAroundTheBase.RemoveAll(a => a.IsDead || a.Owner != p);
if (--rushTicks <= 0) if (--rushTicks <= 0)
{ {

View File

@@ -94,7 +94,7 @@ namespace OpenRA.Mods.RA.AI
else else
{ {
var enemies = owner.world.FindActorsInCircle(leader.CenterPosition, WRange.FromCells(12)) var enemies = owner.world.FindActorsInCircle(leader.CenterPosition, WRange.FromCells(12))
.Where(a1 => !a1.Destroyed && !a1.IsDead()).ToList(); .Where(a1 => !a1.Destroyed && !a1.IsDead).ToList();
var enemynearby = enemies.Where(a1 => a1.HasTrait<ITargetable>() && leader.Owner.Stances[a1.Owner] == Stance.Enemy).ToList(); var enemynearby = enemies.Where(a1 => a1.HasTrait<ITargetable>() && leader.Owner.Stances[a1.Owner] == Stance.Enemy).ToList();
if (enemynearby.Any()) if (enemynearby.Any())
{ {

View File

@@ -98,7 +98,7 @@ namespace OpenRA.Mods.RA.Activities
public override Activity Tick(Actor self) public override Activity Tick(Actor self)
{ {
if (IsCanceled || self.IsDead()) if (IsCanceled || self.IsDead)
return NextActivity; return NextActivity;
if (!isCalculated) if (!isCalculated)

View File

@@ -34,7 +34,7 @@ namespace OpenRA.Mods.RA.Activities
protected override void OnInside(Actor self) protected override void OnInside(Actor self)
{ {
if (actor.IsDead() || capturable.BeingCaptured) if (actor.IsDead || capturable.BeingCaptured)
return; return;
var b = actor.TraitOrDefault<Building>(); var b = actor.TraitOrDefault<Building>();
@@ -46,7 +46,7 @@ namespace OpenRA.Mods.RA.Activities
if (b != null && b.Locked) if (b != null && b.Locked)
b.Unlock(); b.Unlock();
if (actor.IsDead() || capturable.BeingCaptured) if (actor.IsDead || capturable.BeingCaptured)
return; return;
var health = actor.Trait<Health>(); var health = actor.Trait<Health>();

View File

@@ -46,7 +46,7 @@ namespace OpenRA.Mods.RA.Activities
{ {
self.World.AddFrameEndTask(w => self.World.AddFrameEndTask(w =>
{ {
if (target.IsDead()) if (target.IsDead)
return; return;
for (var f = 0; f < flashes; f++) for (var f = 0; f < flashes; f++)
@@ -55,7 +55,7 @@ namespace OpenRA.Mods.RA.Activities
w.Add(new DelayedAction(delay, () => w.Add(new DelayedAction(delay, () =>
{ {
if (target.IsDead()) if (target.IsDead)
return; return;
var modifiers = target.TraitsImplementing<IDamageModifier>() var modifiers = target.TraitsImplementing<IDamageModifier>()

View File

@@ -27,7 +27,7 @@ namespace OpenRA.Mods.RA.Activities
protected override void OnInside(Actor self) protected override void OnInside(Actor self)
{ {
if (target.IsDead()) if (target.IsDead)
return; return;
target.Owner.PlayerActor.Trait<PlayerResources>().GiveCash(payload); target.Owner.PlayerActor.Trait<PlayerResources>().GiveCash(payload);

View File

@@ -46,7 +46,7 @@ namespace OpenRA.Mods.RA.Activities
{ {
self.World.AddFrameEndTask(w => self.World.AddFrameEndTask(w =>
{ {
if (self.IsDead() || transport.IsDead() || !cargo.CanLoad(transport, self)) if (self.IsDead || transport.IsDead || !cargo.CanLoad(transport, self))
return; return;
cargo.Load(transport, self); cargo.Load(transport, self);

View File

@@ -27,7 +27,7 @@ namespace OpenRA.Mods.RA.Activities
var capturable = target.Actor.Trait<ExternalCapturable>(); var capturable = target.Actor.Trait<ExternalCapturable>();
if (IsCanceled || !self.IsInWorld || self.IsDead() || !target.IsValidFor(self)) if (IsCanceled || !self.IsInWorld || self.IsDead || !target.IsValidFor(self))
{ {
if (capturable.CaptureInProgress) if (capturable.CaptureInProgress)
capturable.EndCapture(); capturable.EndCapture();
@@ -59,7 +59,7 @@ namespace OpenRA.Mods.RA.Activities
self.World.AddFrameEndTask(w => self.World.AddFrameEndTask(w =>
{ {
if (target.Actor.IsDead()) if (target.Actor.IsDead)
return; return;
var oldOwner = target.Actor.Owner; var oldOwner = target.Actor.Owner;

View File

@@ -21,7 +21,7 @@ namespace OpenRA.Mods.RA.Activities
public Hunt(Actor self) public Hunt(Actor self)
{ {
var attack = self.Trait<AttackBase>(); var attack = self.Trait<AttackBase>();
targets = self.World.Actors.Where(a => self != a && !a.IsDead() && a.IsInWorld && a.AppearsHostileTo(self) targets = self.World.Actors.Where(a => self != a && !a.IsDead && a.IsInWorld && a.AppearsHostileTo(self)
&& a.HasTrait<Huntable>() && attack.HasAnyValidWeapons(Target.FromActor(a))); && a.HasTrait<Huntable>() && attack.HasAnyValidWeapons(Target.FromActor(a)));
} }

View File

@@ -24,7 +24,7 @@ namespace OpenRA.Mods.RA.Activities
protected override void OnInside(Actor self) protected override void OnInside(Actor self)
{ {
if (target.IsDead() || target.Owner == self.Owner) if (target.IsDead || target.Owner == self.Owner)
return; return;
foreach (var t in target.TraitsImplementing<INotifyInfiltrated>()) foreach (var t in target.TraitsImplementing<INotifyInfiltrated>())

View File

@@ -47,7 +47,7 @@ namespace OpenRA.Mods.RA
case State.Dock: case State.Dock:
ru.PlayCustomAnimation(self, "dock", () => { ru.PlayCustomAnimation(self, "dock", () => {
ru.PlayCustomAnimRepeating(self, "dock-loop"); ru.PlayCustomAnimRepeating(self, "dock-loop");
if (proc.IsInWorld && !proc.IsDead()) if (proc.IsInWorld && !proc.IsDead)
foreach (var nd in proc.TraitsImplementing<INotifyDocking>()) foreach (var nd in proc.TraitsImplementing<INotifyDocking>())
nd.Docked(proc, self); nd.Docked(proc, self);
state = State.Loop; state = State.Loop;
@@ -55,7 +55,7 @@ namespace OpenRA.Mods.RA
state = State.Wait; state = State.Wait;
return this; return this;
case State.Loop: case State.Loop:
if (!proc.IsInWorld || proc.IsDead() || harv.TickUnload(self, proc)) if (!proc.IsInWorld || proc.IsDead || harv.TickUnload(self, proc))
state = State.Undock; state = State.Undock;
return this; return this;
case State.Undock: case State.Undock:
@@ -65,7 +65,7 @@ namespace OpenRA.Mods.RA
case State.Complete: case State.Complete:
harv.LastLinkedProc = harv.LinkedProc; harv.LastLinkedProc = harv.LinkedProc;
harv.LinkProc(self, null); harv.LinkProc(self, null);
if (proc.IsInWorld && !proc.IsDead()) if (proc.IsInWorld && !proc.IsDead)
foreach (var nd in proc.TraitsImplementing<INotifyDocking>()) foreach (var nd in proc.TraitsImplementing<INotifyDocking>())
nd.Undocked(proc, self); nd.Undocked(proc, self);
return NextActivity; return NextActivity;

View File

@@ -37,7 +37,7 @@ namespace OpenRA.Mods.RA.Activities
self.World.AddFrameEndTask(w => self.World.AddFrameEndTask(w =>
{ {
if (self.IsDead()) if (self.IsDead)
return; return;
foreach (var nt in self.TraitsImplementing<INotifyTransform>()) foreach (var nt in self.TraitsImplementing<INotifyTransform>())

View File

@@ -21,7 +21,7 @@ namespace OpenRA.Mods.RA
if (stance == Stance.Ally) if (stance == Stance.Ally)
return true; return true;
if (self.IsDisguised() && !toActor.HasTrait<IgnoresDisguise>()) if (self.EffectiveOwner != null && self.EffectiveOwner.Disguised && !toActor.HasTrait<IgnoresDisguise>())
return toActor.Owner.Stances[self.EffectiveOwner.Owner] == Stance.Ally; return toActor.Owner.Stances[self.EffectiveOwner.Owner] == Stance.Ally;
return stance == Stance.Ally; return stance == Stance.Ally;
@@ -33,7 +33,7 @@ namespace OpenRA.Mods.RA
if (stance == Stance.Ally) if (stance == Stance.Ally)
return false; /* otherwise, we'll hate friendly disguised spies */ return false; /* otherwise, we'll hate friendly disguised spies */
if (self.IsDisguised() && !toActor.HasTrait<IgnoresDisguise>()) if (self.EffectiveOwner != null && self.EffectiveOwner.Disguised && !toActor.HasTrait<IgnoresDisguise>())
return toActor.Owner.Stances[self.EffectiveOwner.Owner] == Stance.Enemy; return toActor.Owner.Stances[self.EffectiveOwner.Owner] == Stance.Enemy;
return stance == Stance.Enemy; return stance == Stance.Enemy;

View File

@@ -25,7 +25,7 @@ namespace OpenRA.Mods.RA
var target = inRange var target = inRange
.Where(a => a != self && a.AppearsFriendlyTo(self)) .Where(a => a != self && a.AppearsFriendlyTo(self))
.Where(a => a.IsInWorld && !a.IsDead()) .Where(a => a.IsInWorld && !a.IsDead)
.Where(a => a.GetDamageState() > DamageState.Undamaged) .Where(a => a.GetDamageState() > DamageState.Undamaged)
.Where(a => attack.HasAnyValidWeapons(Target.FromActor(a))) .Where(a => attack.HasAnyValidWeapons(Target.FromActor(a)))
.ClosestTo(self); .ClosestTo(self);

View File

@@ -59,7 +59,7 @@ namespace OpenRA.Mods.RA.Buildings
self.World.AddFrameEndTask(w => self.World.AddFrameEndTask(w =>
{ {
if (!self.IsDead()) if (!self.IsDead)
w.Add(new RepairIndicator(self, Info.IndicatorPalettePrefix)); w.Add(new RepairIndicator(self, Info.IndicatorPalettePrefix));
}); });
} }

View File

@@ -66,7 +66,7 @@ namespace OpenRA.Mods.RA.Crates
{ {
foreach (var a in actorsInRange.Append(collector)) foreach (var a in actorsInRange.Append(collector))
{ {
if (!a.IsInWorld || a.IsDead()) if (!a.IsInWorld || a.IsDead)
continue; continue;
var um = a.TraitOrDefault<UpgradeManager>(); var um = a.TraitOrDefault<UpgradeManager>();

View File

@@ -89,7 +89,7 @@ namespace OpenRA.Mods.RA.Effects
world.AddFrameEndTask(w => w.Remove(this)); world.AddFrameEndTask(w => w.Remove(this));
show = false; show = false;
if (!self.IsInWorld || self.IsDead() || self.World.RenderPlayer == null) if (!self.IsInWorld || self.IsDead || self.World.RenderPlayer == null)
return; return;
var gps = watcher[self.World.RenderPlayer]; var gps = watcher[self.World.RenderPlayer];

View File

@@ -33,7 +33,7 @@ namespace OpenRA.Mods.RA.Effects
public void Tick(World world) public void Tick(World world)
{ {
if (self.IsDead()) if (self.IsDead)
world.AddFrameEndTask(w => w.Remove(this)); world.AddFrameEndTask(w => w.Remove(this));
else else
anim.Tick(); anim.Tick();
@@ -44,7 +44,7 @@ namespace OpenRA.Mods.RA.Effects
if (!self.IsInWorld) if (!self.IsInWorld)
yield break; yield break;
if (self.IsDead()) if (self.IsDead)
yield break; yield break;
if (!self.Owner.IsAlliedWith(self.World.RenderPlayer)) if (!self.Owner.IsAlliedWith(self.World.RenderPlayer))
@@ -54,7 +54,7 @@ namespace OpenRA.Mods.RA.Effects
yield break; yield break;
var pos = wr.ScreenPxPosition(self.CenterPosition); var pos = wr.ScreenPxPosition(self.CenterPosition);
var bounds = self.Bounds.Value; var bounds = self.Bounds;
bounds.Offset(pos.X, pos.Y); bounds.Offset(pos.X, pos.Y);
var palette = wr.Palette(paletteName); var palette = wr.Palette(paletteName);

View File

@@ -38,7 +38,7 @@ namespace OpenRA.Mods.RA.Effects
public void Tick(World world) public void Tick(World world)
{ {
if (!building.IsInWorld || building.IsDead() || if (!building.IsInWorld || building.IsDead ||
rb == null || !rb.Repairers.Any()) rb == null || !rb.Repairers.Any())
world.AddFrameEndTask(w => w.Remove(this)); world.AddFrameEndTask(w => w.Remove(this));

View File

@@ -84,7 +84,7 @@ namespace OpenRA.Mods.RA
public void Tick(Actor self) public void Tick(Actor self)
{ {
if (Captor != null && (!Captor.IsInWorld || Captor.IsDead())) if (Captor != null && (!Captor.IsInWorld || Captor.IsDead))
EndCapture(); EndCapture();
if (!CaptureInProgress) if (!CaptureInProgress)

View File

@@ -115,7 +115,7 @@ namespace OpenRA.Mods.RA
{ {
self.World.AddFrameEndTask(w => self.World.AddFrameEndTask(w =>
{ {
if (!self.IsDead()) if (!self.IsDead)
w.Add(new Rank(self, info.ChevronPalette)); w.Add(new Rank(self, info.ChevronPalette));
}); });
} }

View File

@@ -64,7 +64,7 @@ namespace OpenRA.Mods.RA
var target = FriendlyGuardableUnits(world, mi).FirstOrDefault(); var target = FriendlyGuardableUnits(world, mi).FirstOrDefault();
if (target == null || subjects.All(s => s.IsDead())) if (target == null || subjects.All(s => s.IsDead))
yield break; yield break;
foreach (var subject in subjects) foreach (var subject in subjects)
@@ -74,7 +74,7 @@ namespace OpenRA.Mods.RA
public void Tick(World world) public void Tick(World world)
{ {
if (subjects.All(s => s.IsDead() || !s.HasTrait<Guard>())) if (subjects.All(s => s.IsDead || !s.HasTrait<Guard>()))
world.CancelInputMode(); world.CancelInputMode();
} }
@@ -96,7 +96,7 @@ namespace OpenRA.Mods.RA
static IEnumerable<Actor> FriendlyGuardableUnits(World world, MouseInput mi) static IEnumerable<Actor> FriendlyGuardableUnits(World world, MouseInput mi)
{ {
return world.ScreenMap.ActorsAt(mi) return world.ScreenMap.ActorsAt(mi)
.Where(a => !world.FogObscures(a) && !a.IsDead() && .Where(a => !world.FogObscures(a) && !a.IsDead &&
a.AppearsFriendlyTo(world.LocalPlayer.PlayerActor) && a.AppearsFriendlyTo(world.LocalPlayer.PlayerActor) &&
a.HasTrait<Guardable>()); a.HasTrait<Guardable>());
} }

View File

@@ -59,7 +59,7 @@ namespace OpenRA.Mods.RA
void Kill() void Kill()
{ {
if (self.IsDead()) if (self.IsDead)
return; return;
if (info.RemoveInstead || !self.HasTrait<Health>()) if (info.RemoveInstead || !self.HasTrait<Health>())

View File

@@ -166,7 +166,7 @@ namespace OpenRA.Mods.RA
public void Tick(World world) public void Tick(World world)
{ {
if (!minelayer.IsInWorld || minelayer.IsDead()) if (!minelayer.IsInWorld || minelayer.IsDead)
world.CancelInputMode(); world.CancelInputMode();
} }

View File

@@ -76,14 +76,14 @@ namespace OpenRA.Mods.RA
preventDock = true; preventDock = true;
// Cancel the dock sequence // Cancel the dock sequence
if (dockedHarv != null && !dockedHarv.IsDead()) if (dockedHarv != null && !dockedHarv.IsDead)
dockedHarv.CancelActivity(); dockedHarv.CancelActivity();
} }
public void Tick(Actor self) public void Tick(Actor self)
{ {
// Harvester was killed while unloading // Harvester was killed while unloading
if (dockedHarv != null && dockedHarv.IsDead()) if (dockedHarv != null && dockedHarv.IsDead)
{ {
self.Trait<RenderBuilding>().CancelCustomAnim(self); self.Trait<RenderBuilding>().CancelCustomAnim(self);
dockedHarv = null; dockedHarv = null;

View File

@@ -29,7 +29,7 @@ namespace OpenRA.Mods.RA
{ {
var prevItems = GetNumBuildables(self.Owner); var prevItems = GetNumBuildables(self.Owner);
if (order.TargetActor.IsDead()) if (order.TargetActor.IsDead)
return; return;
var unit = self.World.Map.Rules.Actors[order.TargetString]; var unit = self.World.Map.Rules.Actors[order.TargetString];

View File

@@ -59,7 +59,7 @@ namespace OpenRA.Mods.RA
{ {
var total = (double)world.Map.Bounds.Width * world.Map.Bounds.Height; var total = (double)world.Map.Bounds.Width * world.Map.Bounds.Height;
MapControl = world.Actors MapControl = world.Actors
.Where(a => !a.IsDead() && a.IsInWorld && a.Owner == player && a.HasTrait<RevealsShroud>()) .Where(a => !a.IsDead && a.IsInWorld && a.Owner == player && a.HasTrait<RevealsShroud>())
.SelectMany(a => world.Map.FindTilesInCircle( .SelectMany(a => world.Map.FindTilesInCircle(
a.Location, a.Location,
a.Trait<RevealsShroud>().Range.Clamp(WRange.Zero, WRange.FromCells(Map.MaxTilesInCircleRange)).Range / 1024)) a.Trait<RevealsShroud>().Range.Clamp(WRange.Zero, WRange.FromCells(Map.MaxTilesInCircleRange)).Range / 1024))

View File

@@ -372,7 +372,7 @@ namespace OpenRA.Mods.RA
protected virtual bool BuildUnit(string name) protected virtual bool BuildUnit(string name)
{ {
// Cannot produce if i'm dead // Cannot produce if i'm dead
if (!self.IsInWorld || self.IsDead()) if (!self.IsInWorld || self.IsDead)
{ {
CancelProduction(name, 1); CancelProduction(name, 1);
return true; return true;

View File

@@ -77,7 +77,7 @@ namespace OpenRA.Mods.RA
// Add all actors that provide prerequisites // Add all actors that provide prerequisites
var prerequisites = player.World.ActorsWithTrait<ITechTreePrerequisite>() var prerequisites = player.World.ActorsWithTrait<ITechTreePrerequisite>()
.Where(a => a.Actor.Owner == player && a.Actor.IsInWorld && !a.Actor.IsDead()); .Where(a => a.Actor.Owner == player && a.Actor.IsInWorld && !a.Actor.IsDead);
foreach (var b in prerequisites) foreach (var b in prerequisites)
{ {
@@ -96,7 +96,7 @@ namespace OpenRA.Mods.RA
.Where(a => .Where(a =>
a.Actor.Owner == player && a.Actor.Owner == player &&
a.Actor.IsInWorld && a.Actor.IsInWorld &&
!a.Actor.IsDead() && !a.Actor.IsDead &&
!ret.ContainsKey(a.Actor.Info.Name) && !ret.ContainsKey(a.Actor.Info.Name) &&
a.Actor.Info.Traits.Get<BuildableInfo>().BuildLimit > 0) a.Actor.Info.Traits.Get<BuildableInfo>().BuildLimit > 0)
.Do(b => ret[b.Actor.Info.Name].Add(b.Actor)); .Do(b => ret[b.Actor.Info.Name].Add(b.Actor));

View File

@@ -164,7 +164,7 @@ namespace OpenRA.Mods.RA
public void Tick(World world) public void Tick(World world)
{ {
if (!self.IsInWorld || self.IsDead()) if (!self.IsInWorld || self.IsDead)
world.CancelInputMode(); world.CancelInputMode();
} }

View File

@@ -51,7 +51,7 @@ namespace OpenRA.Mods.RA
public Production(ProductionInfo info, Actor self) public Production(ProductionInfo info, Actor self)
{ {
Info = info; Info = info;
rp = Exts.Lazy(() => self.IsDead() ? null : self.TraitOrDefault<RallyPoint>()); rp = Exts.Lazy(() => self.IsDead ? null : self.TraitOrDefault<RallyPoint>());
} }
public void DoProduction(Actor self, ActorInfo producee, ExitInfo exitinfo, string raceVariant) public void DoProduction(Actor self, ActorInfo producee, ExitInfo exitinfo, string raceVariant)
@@ -94,7 +94,7 @@ namespace OpenRA.Mods.RA
newUnit.SetTargetLine(target, rp.Value != null ? Color.Red : Color.Green, false); newUnit.SetTargetLine(target, rp.Value != null ? Color.Red : Color.Green, false);
if (!self.IsDead()) if (!self.IsDead)
foreach (var t in self.TraitsImplementing<INotifyProduction>()) foreach (var t in self.TraitsImplementing<INotifyProduction>())
t.UnitProduced(self, newUnit, exit); t.UnitProduced(self, newUnit, exit);

View File

@@ -46,7 +46,7 @@ namespace OpenRA.Mods.RA.Render
public IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr) public IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr)
{ {
var pos = wr.ScreenPxPosition(self.CenterPosition); var pos = wr.ScreenPxPosition(self.CenterPosition);
var bounds = self.Bounds.Value; var bounds = self.Bounds;
bounds.Offset(pos.X, pos.Y); bounds.Offset(pos.X, pos.Y);
var spaceBuffer = (int)(10 / wr.Viewport.Zoom); var spaceBuffer = (int)(10 / wr.Viewport.Zoom);
var effectPos = wr.Position(new int2(pos.X, bounds.Y - spaceBuffer)); var effectPos = wr.Position(new int2(pos.X, bounds.Y - spaceBuffer));

View File

@@ -69,7 +69,7 @@ namespace OpenRA.Mods.RA.Render
public void Tick(Actor self) public void Tick(Actor self)
{ {
var isFlying = movement.IsMoving && !self.IsDead(); var isFlying = movement.IsMoving && !self.IsDead;
if (isFlying ^ (rotorAnim.CurrentSequence.Name != info.Sequence)) if (isFlying ^ (rotorAnim.CurrentSequence.Name != info.Sequence))
return; return;

View File

@@ -42,7 +42,7 @@ namespace OpenRA.Mods.RA.Scripting
} }
[Desc("Specifies whether the actor is alive or dead.")] [Desc("Specifies whether the actor is alive or dead.")]
public bool IsDead { get { return self.IsDead(); } } public bool IsDead { get { return self.IsDead; } }
[Desc("Specifies whether the actor is idle (not performing any activities).")] [Desc("Specifies whether the actor is idle (not performing any activities).")]
public bool IsIdle { get { return self.IsIdle; } } public bool IsIdle { get { return self.IsIdle; } }

View File

@@ -29,7 +29,7 @@ namespace OpenRA.Mods.RA.Scripting
public Actor[] GetGroundAttackers() public Actor[] GetGroundAttackers()
{ {
return player.World.ActorsWithTrait<AttackBase>().Select(a => a.Actor) return player.World.ActorsWithTrait<AttackBase>().Select(a => a.Actor)
.Where(a => a.Owner == player && !a.IsDead() && a.IsInWorld && a.HasTrait<Mobile>()) .Where(a => a.Owner == player && !a.IsDead && a.IsInWorld && a.HasTrait<Mobile>())
.ToArray(); .ToArray();
} }
} }

View File

@@ -129,7 +129,7 @@ namespace OpenRA.Mods.RA.Scripting
if (squad.Count >= squadSize) if (squad.Count >= squadSize)
{ {
using (func) using (func)
using (var luaSquad = squad.Where(u => !u.IsDead()).ToArray().ToLuaValue(context)) using (var luaSquad = squad.Where(u => !u.IsDead).ToArray().ToLuaValue(context))
func.Call(luaSquad).Dispose(); func.Call(luaSquad).Dispose();
triggers.OnProducedInternal -= productionHandler; triggers.OnProducedInternal -= productionHandler;
@@ -230,7 +230,7 @@ namespace OpenRA.Mods.RA.Scripting
if (squad.Count >= squadSize) if (squad.Count >= squadSize)
{ {
using (func) using (func)
using (var luaSquad = squad.Where(u => !u.IsDead()).ToArray().ToLuaValue(context)) using (var luaSquad = squad.Where(u => !u.IsDead).ToArray().ToLuaValue(context))
func.Call(luaSquad).Dispose(); func.Call(luaSquad).Dispose();
foreach (var q in queueTypes) foreach (var q in queueTypes)

View File

@@ -60,7 +60,7 @@ namespace OpenRA.Mods.RA
public void Tick(Actor self) public void Tick(Actor self)
{ {
if (self.IsDead() || disabled) if (self.IsDead || disabled)
return; return;
if (health.HP >= info.HealIfBelow * health.MaxHP) if (health.HP >= info.HealIfBelow * health.MaxHP)

View File

@@ -95,7 +95,7 @@ namespace OpenRA.Mods.RA.Traits
return WVec.Zero; return WVec.Zero;
return self.World.FindActorsInCircle(self.CenterPosition, info.IdealSeparation) return self.World.FindActorsInCircle(self.CenterPosition, info.IdealSeparation)
.Where(a => !a.IsDead() && a.HasTrait<Aircraft>()) .Where(a => !a.IsDead && a.HasTrait<Aircraft>())
.Select(GetRepulsionForce) .Select(GetRepulsionForce)
.Aggregate(WVec.Zero, (a, b) => a + b); .Aggregate(WVec.Zero, (a, b) => a + b);
} }

View File

@@ -244,11 +244,11 @@ namespace OpenRA.Mods.RA.Widgets.Logic
var assets = template.Get<LabelWidget>("ASSETS"); var assets = template.Get<LabelWidget>("ASSETS");
assets.GetText = () => "$" + world.Actors assets.GetText = () => "$" + world.Actors
.Where(a => a.Owner == player && !a.IsDead() && a.Info.Traits.WithInterface<ValuedInfo>().Any()) .Where(a => a.Owner == player && !a.IsDead && a.Info.Traits.WithInterface<ValuedInfo>().Any())
.Sum(a => a.Info.Traits.WithInterface<ValuedInfo>().First().Cost); .Sum(a => a.Info.Traits.WithInterface<ValuedInfo>().First().Cost);
var harvesters = template.Get<LabelWidget>("HARVESTERS"); var harvesters = template.Get<LabelWidget>("HARVESTERS");
harvesters.GetText = () => world.Actors.Count(a => a.Owner == player && !a.IsDead() && a.HasTrait<Harvester>()).ToString(); harvesters.GetText = () => world.Actors.Count(a => a.Owner == player && !a.IsDead && a.HasTrait<Harvester>()).ToString();
return template; return template;
} }
@@ -282,7 +282,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
{ {
return ScrollItemWidget.Setup(template, () => false, () => return ScrollItemWidget.Setup(template, () => false, () =>
{ {
var playerBase = world.Actors.FirstOrDefault(a => !a.IsDead() && a.HasTrait<BaseBuilding>() && a.Owner == player); var playerBase = world.Actors.FirstOrDefault(a => !a.IsDead && a.HasTrait<BaseBuilding>() && a.Owner == player);
if (playerBase != null) if (playerBase != null)
worldRenderer.Viewport.Center(playerBase.CenterPosition); worldRenderer.Viewport.Center(playerBase.CenterPosition);
}); });

View File

@@ -29,7 +29,7 @@ namespace OpenRA.Mods.RA.Widgets
public SupportPowerTimerWidget(World world) public SupportPowerTimerWidget(World world)
{ {
powers = world.ActorsWithTrait<SupportPowerManager>() powers = world.ActorsWithTrait<SupportPowerManager>()
.Where(p => !p.Actor.IsDead() && !p.Actor.Owner.NonCombatant) .Where(p => !p.Actor.IsDead && !p.Actor.Owner.NonCombatant)
.SelectMany(s => s.Trait.Powers.Values) .SelectMany(s => s.Trait.Powers.Values)
.Where(p => p.Instances.Any() && p.Info.DisplayTimer && !p.Disabled); .Where(p => p.Instances.Any() && p.Info.DisplayTimer && !p.Disabled);
} }

View File

@@ -43,18 +43,18 @@ namespace OpenRA.Mods.TS
state = State.Dock; state = State.Dock;
return Util.SequenceActivities(new Turn(self, 160), this); return Util.SequenceActivities(new Turn(self, 160), this);
case State.Dock: case State.Dock:
if (proc.IsInWorld && !proc.IsDead()) if (proc.IsInWorld && !proc.IsDead)
foreach (var nd in proc.TraitsImplementing<INotifyDocking>()) foreach (var nd in proc.TraitsImplementing<INotifyDocking>())
nd.Docked(proc, self); nd.Docked(proc, self);
state = State.Loop; state = State.Loop;
body.Docked = true; body.Docked = true;
return this; return this;
case State.Loop: case State.Loop:
if (!proc.IsInWorld || proc.IsDead() || harv.TickUnload(self, proc)) if (!proc.IsInWorld || proc.IsDead || harv.TickUnload(self, proc))
state = State.Undock; state = State.Undock;
return this; return this;
case State.Undock: case State.Undock:
if (proc.IsInWorld && !proc.IsDead()) if (proc.IsInWorld && !proc.IsDead)
foreach (var nd in proc.TraitsImplementing<INotifyDocking>()) foreach (var nd in proc.TraitsImplementing<INotifyDocking>())
nd.Undocked(proc, self); nd.Undocked(proc, self);
body.Docked = false; body.Docked = false;