Actor.traits is implementation detail

This commit is contained in:
Bob
2010-08-14 15:19:30 +12:00
committed by alzeih
parent f6c6255f64
commit ae703d50b2
165 changed files with 586 additions and 561 deletions

View File

@@ -30,7 +30,7 @@ namespace OpenRA.Mods.RA.Activities
public IActivity Tick( Actor self )
{
var facing = self.traits.Get<IFacing>();
var facing = self.Trait<IFacing>();
if (!Target.IsValid)
return NextActivity;
@@ -40,7 +40,7 @@ namespace OpenRA.Mods.RA.Activities
return new Move( Target, Range ) { NextActivity = this };
var desiredFacing = Util.GetFacing((targetCell - self.Location).ToFloat2(), 0);
var renderUnit = self.traits.GetOrDefault<RenderUnit>();
var renderUnit = self.TraitOrDefault<RenderUnit>();
var numDirs = (renderUnit != null)
? renderUnit.anim.CurrentSequence.Facings : 8;
@@ -50,7 +50,7 @@ namespace OpenRA.Mods.RA.Activities
return new Turn( desiredFacing ) { NextActivity = this };
}
var attack = self.traits.Get<AttackBase>();
var attack = self.Trait<AttackBase>();
attack.target = Target;
attack.DoAttack(self);
return this;

View File

@@ -32,7 +32,7 @@ namespace OpenRA.Mods.RA.Activities
target.Owner = self.Owner;
w.Add(target);
foreach (var t in target.traits.WithInterface<INotifyCapture>())
foreach (var t in target.TraitsImplementing<INotifyCapture>())
t.OnCapture(target, self, oldOwner, self.Owner);
w.Remove(self);

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Mods.RA.Activities
if( NextActivity != null )
return NextActivity;
var harv = self.traits.Get<Harvester>();
var harv = self.Trait<Harvester>();
if (harv.LinkedProc == null)
harv.ChooseNewProc(self, null);
@@ -36,14 +36,14 @@ namespace OpenRA.Mods.RA.Activities
var proc = harv.LinkedProc;
if( self.Location != proc.Location + proc.traits.Get<IAcceptOre>().DeliverOffset )
if( self.Location != proc.Location + proc.Trait<IAcceptOre>().DeliverOffset )
{
return new Move(proc.Location + proc.traits.Get<IAcceptOre>().DeliverOffset, 0) { NextActivity = this };
return new Move(proc.Location + proc.Trait<IAcceptOre>().DeliverOffset, 0) { NextActivity = this };
}
else if (!isDocking)
{
isDocking = true;
proc.traits.Get<IAcceptOre>().OnDock(self, this);
proc.Trait<IAcceptOre>().OnDock(self, this);
}
return new Wait(10) { NextActivity = this };
}

View File

@@ -28,7 +28,7 @@ namespace OpenRA.Mods.RA.Activities
if (isCanceled) return NextActivity;
if (transport == null || !transport.IsInWorld) return NextActivity;
var cargo = transport.traits.Get<Cargo>();
var cargo = transport.Trait<Cargo>();
if (cargo.IsFull(transport))
return NextActivity;

View File

@@ -34,7 +34,7 @@ namespace OpenRA.Mods.RA.Activities
if (d.LengthSquared < 50) /* close enough */
return NextActivity;
var aircraft = self.traits.Get<Aircraft>();
var aircraft = self.Trait<Aircraft>();
var desiredFacing = Util.GetFacing(d, aircraft.Facing);
if (aircraft.Altitude == cruiseAltitude)
@@ -54,7 +54,7 @@ namespace OpenRA.Mods.RA.Activities
{
public static void Fly(Actor self, int desiredAltitude )
{
var aircraft = self.traits.Get<Aircraft>();
var aircraft = self.Trait<Aircraft>();
var speed = .2f * aircraft.MovementSpeedForCell(self, self.Location);
var angle = aircraft.Facing / 128f * Math.PI;
self.CenterLocation += speed * -float2.FromAngle((float)angle);

View File

@@ -24,7 +24,7 @@ namespace OpenRA.Mods.RA.Activities
if (!Target.IsValid)
return NextActivity;
var limitedAmmo = self.traits.GetOrDefault<LimitedAmmo>();
var limitedAmmo = self.TraitOrDefault<LimitedAmmo>();
if (limitedAmmo != null && !limitedAmmo.HasAmmo())
return NextActivity;

View File

@@ -25,7 +25,7 @@ namespace OpenRA.Mods.RA.Activities
if( isHarvesting ) return this;
if( NextActivity != null ) return NextActivity;
var harv = self.traits.Get<Harvester>();
var harv = self.Trait<Harvester>();
harv.LastHarvestedCell = self.Location;
if( harv.IsFull )
@@ -42,10 +42,10 @@ namespace OpenRA.Mods.RA.Activities
bool HarvestThisTile(Actor self)
{
var harv = self.traits.Get<Harvester>();
var renderUnit = self.traits.Get<RenderUnit>(); /* better have one of these! */
var harv = self.Trait<Harvester>();
var renderUnit = self.Trait<RenderUnit>(); /* better have one of these! */
var resource = self.World.WorldActor.traits.Get<ResourceLayer>().Harvest(self.Location);
var resource = self.World.WorldActor.Trait<ResourceLayer>().Harvest(self.Location);
if (resource == null)
return false;
@@ -60,7 +60,7 @@ namespace OpenRA.Mods.RA.Activities
void FindMoreResource(Actor self)
{
var res = self.World.WorldActor.traits.Get<ResourceLayer>();
var res = self.World.WorldActor.Trait<ResourceLayer>();
var harv = self.Info.Traits.Get<HarvesterInfo>();
self.QueueActivity(new Move(

View File

@@ -26,14 +26,14 @@ namespace OpenRA.Mods.RA.Activities
if (!target.IsValid)
return NextActivity;
var limitedAmmo = self.traits.GetOrDefault<LimitedAmmo>();
var limitedAmmo = self.TraitOrDefault<LimitedAmmo>();
if (limitedAmmo != null && !limitedAmmo.HasAmmo())
{
self.QueueActivity(new HeliReturn());
return NextActivity;
}
var aircraft = self.traits.Get<Aircraft>();
var aircraft = self.Trait<Aircraft>();
var info = self.Info.Traits.Get<HelicopterInfo>();
if (aircraft.Altitude != info.CruiseAltitude)
{
@@ -41,7 +41,7 @@ namespace OpenRA.Mods.RA.Activities
return this;
}
var range = self.traits.Get<AttackBase>().GetMaximumRange() - 1;
var range = self.Trait<AttackBase>().GetMaximumRange() - 1;
var dist = target.CenterLocation - self.CenterLocation;
var desiredFacing = Util.GetFacing(dist, aircraft.Facing);
@@ -50,7 +50,7 @@ namespace OpenRA.Mods.RA.Activities
if (!float2.WithinEpsilon(float2.Zero, dist, range * Game.CellSize))
self.CenterLocation += (rawSpeed / dist.Length) * dist;
return this;
}

View File

@@ -31,7 +31,7 @@ namespace OpenRA.Mods.RA.Activities
return NextActivity;
var info = self.Info.Traits.Get<HelicopterInfo>();
var aircraft = self.traits.Get<Aircraft>();
var aircraft = self.Trait<Aircraft>();
if (aircraft.Altitude != info.CruiseAltitude)
{

View File

@@ -23,7 +23,7 @@ namespace OpenRA.Mods.RA.Activities
public IActivity Tick(Actor self)
{
if (isCanceled) return NextActivity;
var aircraft = self.traits.Get<Aircraft>();
var aircraft = self.Trait<Aircraft>();
if (aircraft.Altitude == 0)
return NextActivity;

View File

@@ -40,11 +40,11 @@ namespace OpenRA.Mods.RA.Activities
new HeliLand(true),
NextActivity);
var res = dest.traits.GetOrDefault<Reservable>();
var res = dest.TraitOrDefault<Reservable>();
if (res != null)
self.traits.Get<Helicopter>().reservation = res.Reserve(self);
self.Trait<Helicopter>().reservation = res.Reserve(self);
var pi = dest.traits.Get<Production>();
var pi = dest.Trait<Production>();
var offset = pi != null ? pi.Spawns.First().First : float2.Zero;
return Util.SequenceActivities(

View File

@@ -23,7 +23,7 @@ namespace OpenRA.Mods.RA.Activities
if (target == null || target.IsDead()) return NextActivity;
if (target.Owner == self.Owner) return NextActivity;
foreach (var t in target.traits.WithInterface<IAcceptSpy>())
foreach (var t in target.TraitsImplementing<IAcceptSpy>())
t.OnInfiltrate(target, self);
self.World.AddFrameEndTask(w => w.Remove(self));

View File

@@ -34,7 +34,7 @@ namespace OpenRA.Mods.RA.Activities
if (d.LengthSquared < 50) /* close enough */
return NextActivity;
var aircraft = self.traits.Get<Aircraft>();
var aircraft = self.Trait<Aircraft>();
if (aircraft.Altitude > 0)
--aircraft.Altitude;

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Mods.RA.Activities
{
if (canceled) return NextActivity;
var limitedAmmo = self.traits.GetOrDefault<LimitedAmmo>();
var limitedAmmo = self.TraitOrDefault<LimitedAmmo>();
if (!limitedAmmo.HasAmmo())
{
// rearm & repair at fix, then back out here to refill the minefield some more
@@ -41,7 +41,7 @@ namespace OpenRA.Mods.RA.Activities
{ NextActivity = new Rearm() { NextActivity = new Repair(rearmTarget) { NextActivity = this } } };
}
var ml = self.traits.Get<Minelayer>();
var ml = self.Trait<Minelayer>();
if (ml.minefield.Contains(self.Location) &&
ShouldLayMine(self, self.Location))
{
@@ -64,13 +64,13 @@ namespace OpenRA.Mods.RA.Activities
bool ShouldLayMine(Actor self, int2 p)
{
// if there is no unit (other than me) here, we want to place a mine here
return !self.World.WorldActor.traits.Get<UnitInfluence>()
return !self.World.WorldActor.Trait<UnitInfluence>()
.GetUnitsAt(p).Any(a => a != self);
}
void LayMine(Actor self)
{
var limitedAmmo = self.traits.GetOrDefault<LimitedAmmo>();
var limitedAmmo = self.TraitOrDefault<LimitedAmmo>();
if (limitedAmmo != null) limitedAmmo.Attacking(self);
self.World.AddFrameEndTask(

View File

@@ -27,7 +27,7 @@ namespace OpenRA.Mods.RA.Activities
this.target = target;
initialLocation = self.CenterLocation;
self.traits.Get<RenderInfantry>().Attacking(self);
self.Trait<RenderInfantry>().Attacking(self);
Sound.Play("dogg5p.aud", self.CenterLocation);
}
@@ -44,7 +44,7 @@ namespace OpenRA.Mods.RA.Activities
if (t >= 1f)
{
self.traits.WithInterface<IMove>().FirstOrDefault()
self.TraitsImplementing<IMove>().FirstOrDefault()
.SetPosition(self, Util.CellContaining(target.CenterLocation));
if (target.IsActor)

View File

@@ -25,7 +25,7 @@ namespace OpenRA.Mods.RA.Activities
public IActivity Tick(Actor self)
{
if (isCanceled) return NextActivity;
var limitedAmmo = self.traits.GetOrDefault<LimitedAmmo>();
var limitedAmmo = self.TraitOrDefault<LimitedAmmo>();
if (limitedAmmo == null) return NextActivity;
if (--remainingTicks == 0)
@@ -33,10 +33,10 @@ namespace OpenRA.Mods.RA.Activities
if (!limitedAmmo.GiveAmmo()) return NextActivity;
var hostBuilding = self.World.FindUnits(self.CenterLocation, self.CenterLocation)
.FirstOrDefault(a => a.traits.Contains<RenderBuilding>());
.FirstOrDefault(a => a.HasTrait<RenderBuilding>());
if (hostBuilding != null)
hostBuilding.traits.Get<RenderBuilding>().PlayCustomAnim(hostBuilding, "active");
hostBuilding.Trait<RenderBuilding>().PlayCustomAnim(hostBuilding, "active");
remainingTicks = ticksPerPip;
}

View File

@@ -28,7 +28,7 @@ namespace OpenRA.Mods.RA.Activities
if (isCanceled) return NextActivity;
if (remainingTicks == 0)
{
var health = self.traits.GetOrDefault<Health>();
var health = self.TraitOrDefault<Health>();
if (health == null) return NextActivity;
var unitCost = self.Info.Traits.Get<ValuedInfo>().Cost;
@@ -36,7 +36,7 @@ namespace OpenRA.Mods.RA.Activities
var costPerHp = (repairsUnits.URepairPercent * unitCost) / health.MaxHP;
var hpToRepair = Math.Min(host.Info.Traits.Get<RepairsUnitsInfo>().URepairStep, health.MaxHP - health.HP);
var cost = (int)Math.Ceiling(costPerHp * hpToRepair);
if (!self.Owner.PlayerActor.traits.Get<PlayerResources>().TakeCash(cost))
if (!self.Owner.PlayerActor.Trait<PlayerResources>().TakeCash(cost))
{
remainingTicks = 1;
return this;
@@ -47,7 +47,7 @@ namespace OpenRA.Mods.RA.Activities
return NextActivity;
if (host != null)
host.traits.Get<RenderBuilding>()
host.Trait<RenderBuilding>()
.PlayCustomAnim(host, "active");
remainingTicks = (int)(repairsUnits.RepairRate * 60 * 25);

View File

@@ -23,7 +23,7 @@ namespace OpenRA.Mods.RA.Activities
public IActivity Tick(Actor self)
{
if (target == null || target.IsDead()) return NextActivity;
var health = target.traits.Get<Health>();
var health = target.Trait<Health>();
if (health.DamageState == DamageState.Undamaged)
return NextActivity;

View File

@@ -40,16 +40,16 @@ namespace OpenRA.Mods.RA.Activities
dest = ChooseAirfield(self);
}
var res = dest.traits.GetOrDefault<Reservable>();
var res = dest.TraitOrDefault<Reservable>();
if (res != null)
{
var plane = self.traits.Get<Plane>();
var plane = self.Trait<Plane>();
plane.UnReserve();
plane.reservation = res.Reserve(self);
}
var landPos = dest.CenterLocation;
var aircraft = self.traits.Get<Aircraft>();
var aircraft = self.Trait<Aircraft>();
var speed = .2f * aircraft.MovementSpeedForCell(self, self.Location);

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Mods.RA.Activities
public IActivity Tick(Actor self)
{
self.traits.WithInterface<IMove>().FirstOrDefault().SetPosition(self, destination);
self.TraitsImplementing<IMove>().FirstOrDefault().SetPosition(self, destination);
return NextActivity;
}

View File

@@ -32,7 +32,7 @@ namespace OpenRA.Mods.RA.Activities
this.offset = offset;
this.sounds = sounds;
this.facing = facing;
rb = self.traits.GetOrDefault<RenderBuilding>();
rb = self.TraitOrDefault<RenderBuilding>();
}
public IActivity NextActivity { get; set; }
@@ -59,8 +59,8 @@ namespace OpenRA.Mods.RA.Activities
new OwnerInit( self.Owner ),
new FacingInit( facing ),
};
if (self.traits.Contains<Health>())
init.Add( new HealthInit( self.traits.Get<Health>().HPFraction ));
if (self.HasTrait<Health>())
init.Add( new HealthInit( self.Trait<Health>().HPFraction ));
var a = w.CreateActor( actor, init );

View File

@@ -24,10 +24,10 @@ namespace OpenRA.Mods.RA.Activities
int2? ChooseExitTile(Actor self, Actor cargo)
{
// is anyone still hogging this tile?
if (self.World.WorldActor.traits.Get<UnitInfluence>().GetUnitsAt(self.Location).Count() > 1)
if (self.World.WorldActor.Trait<UnitInfluence>().GetUnitsAt(self.Location).Count() > 1)
return null;
var mobile = cargo.traits.Get<Mobile>();
var mobile = cargo.Trait<Mobile>();
for (var i = -1; i < 2; i++)
for (var j = -1; j < 2; j++)
@@ -44,7 +44,7 @@ namespace OpenRA.Mods.RA.Activities
// if we're a thing that can turn, turn to the
// right facing for the unload animation
var facing = self.traits.GetOrDefault<IFacing>();
var facing = self.TraitOrDefault<IFacing>();
var unloadFacing = self.Info.Traits.Get<CargoInfo>().UnloadFacing;
if (facing != null && facing.Facing != unloadFacing)
return new Turn(unloadFacing) { NextActivity = this };
@@ -52,11 +52,11 @@ namespace OpenRA.Mods.RA.Activities
// todo: handle the BS of open/close sequences, which are inconsistent,
// for reasons that probably make good sense to the westwood guys.
var cargo = self.traits.Get<Cargo>();
var cargo = self.Trait<Cargo>();
if (cargo.IsEmpty(self))
return NextActivity;
var ru = self.traits.GetOrDefault<RenderUnit>();
var ru = self.TraitOrDefault<RenderUnit>();
if (ru != null)
ru.PlayCustomAnimation(self, "unload", null);
@@ -69,12 +69,12 @@ namespace OpenRA.Mods.RA.Activities
self.World.AddFrameEndTask(w =>
{
w.Add(actor);
actor.traits.WithInterface<IMove>().FirstOrDefault().SetPosition(actor, self.Location);
actor.TraitsImplementing<IMove>().FirstOrDefault().SetPosition(actor, self.Location);
actor.CancelActivity();
actor.QueueActivity(new Move(exitTile.Value, 0));
if (actor.Owner == self.World.LocalPlayer)
{
var line = actor.traits.GetOrDefault<DrawLineToTarget>();
var line = actor.TraitOrDefault<DrawLineToTarget>();
if (line != null)
line.SetTargetSilently(self, Target.FromCell(exitTile.Value), Color.Green);
}