From 85fab4545141007032ae2419507714e4eec7ed2d Mon Sep 17 00:00:00 2001 From: atlimit8 Date: Sat, 1 Aug 2015 23:53:58 -0500 Subject: [PATCH 1/4] Remove Actor.HasTrait() --- OpenRA.Game/Actor.cs | 5 -- OpenRA.Game/Graphics/WorldRenderer.cs | 4 +- OpenRA.Game/Orders/UnitOrderGenerator.cs | 6 +-- OpenRA.Game/TraitDictionary.cs | 6 --- OpenRA.Game/Traits/TraitsInterfaces.cs | 8 +-- .../WorldInteractionControllerWidget.cs | 4 +- OpenRA.Mods.Common/AI/AttackOrFleeFuzzy.cs | 14 ++--- OpenRA.Mods.Common/AI/HackyAI.cs | 52 ++++++++++--------- OpenRA.Mods.Common/AI/Squad.cs | 2 +- OpenRA.Mods.Common/AI/States/AirStates.cs | 4 +- OpenRA.Mods.Common/AI/States/GroundStates.cs | 2 +- OpenRA.Mods.Common/AI/States/StateBase.cs | 6 +-- .../Activities/Air/HeliAttack.cs | 2 +- OpenRA.Mods.Common/Activities/Attack.cs | 2 +- OpenRA.Mods.Common/Activities/Hunt.cs | 2 +- .../Activities/Move/MoveAdjacentTo.cs | 2 +- OpenRA.Mods.Common/Activities/Rearm.cs | 3 +- OpenRA.Mods.Common/ActorExts.cs | 6 +-- OpenRA.Mods.Common/Commands/DevCommands.cs | 2 +- OpenRA.Mods.Common/Effects/Bullet.cs | 2 +- OpenRA.Mods.Common/Effects/Missile.cs | 2 +- .../Orders/EnterAlliedActorTargeter.cs | 4 +- .../Scripting/Properties/CombatProperties.cs | 2 +- .../Scripting/Properties/GuardProperties.cs | 2 +- .../Scripting/Properties/PlayerProperties.cs | 2 +- OpenRA.Mods.Common/Traits/Air/Aircraft.cs | 10 ++-- .../Traits/Attack/AttackBase.cs | 2 +- .../Traits/Attack/AttackFollow.cs | 4 +- OpenRA.Mods.Common/Traits/AutoTarget.cs | 2 +- .../Traits/BlocksProjectiles.cs | 2 +- OpenRA.Mods.Common/Traits/BodyOrientation.cs | 2 +- OpenRA.Mods.Common/Traits/Buildings/Bridge.cs | 2 +- .../Traits/Buildings/Building.cs | 6 +-- .../Traits/Buildings/Refinery.cs | 2 +- OpenRA.Mods.Common/Traits/Crates/Crate.cs | 2 +- OpenRA.Mods.Common/Traits/EngineerRepair.cs | 4 +- OpenRA.Mods.Common/Traits/Guard.cs | 4 +- OpenRA.Mods.Common/Traits/Harvester.cs | 2 +- OpenRA.Mods.Common/Traits/KillsSelf.cs | 2 +- OpenRA.Mods.Common/Traits/Mobile.cs | 5 +- .../Traits/Modifiers/FrozenUnderFog.cs | 4 +- OpenRA.Mods.Common/Traits/Passenger.cs | 6 +-- .../Traits/Player/AllyRepair.cs | 2 +- .../Traits/Player/BaseAttackNotifier.cs | 2 +- .../Traits/Player/HarvesterAttackNotifier.cs | 4 +- .../Traits/Player/PlayerStatistics.cs | 6 +-- .../Traits/Player/ProvidesPrerequisite.cs | 2 +- .../Traits/Player/ProvidesTechPrerequisite.cs | 2 +- OpenRA.Mods.Common/Traits/Player/TechTree.cs | 2 +- OpenRA.Mods.Common/Traits/Render/Hovers.cs | 2 +- .../Render/WithBuildingPlacedAnimation.cs | 2 +- .../Render/WithBuildingPlacedOverlay.cs | 2 +- .../Traits/Render/WithDockingOverlay.cs | 2 +- .../Traits/Render/WithIdleOverlay.cs | 2 +- .../Traits/Render/WithRepairOverlay.cs | 2 +- .../Traits/Render/WithSpriteBody.cs | 2 +- OpenRA.Mods.Common/Traits/Repairable.cs | 2 +- OpenRA.Mods.Common/Traits/RepairableNear.cs | 2 +- .../Traits/Sound/AmbientSound.cs | 2 +- OpenRA.Mods.Common/Traits/SupplyTruck.cs | 2 +- .../SupportPowers/SupportPowerManager.cs | 4 +- OpenRA.Mods.Common/Traits/Targetable.cs | 2 +- OpenRA.Mods.Common/Traits/Tooltip.cs | 2 +- OpenRA.Mods.Common/Traits/Transforms.cs | 4 +- OpenRA.Mods.Common/TraitsInterfaces.cs | 3 ++ .../Logic/Ingame/ObserverStatsLogic.cs | 4 +- .../Widgets/ProductionTabsWidget.cs | 2 +- .../Widgets/ViewportControllerWidget.cs | 6 +-- .../Widgets/WorldCommandWidget.cs | 6 +-- OpenRA.Mods.D2k/Activities/SwallowActor.cs | 2 +- OpenRA.Mods.D2k/Traits/Carryable.cs | 2 +- .../Traits/Render/WithDeliveryOverlay.cs | 2 +- OpenRA.Mods.D2k/Traits/Sandworm.cs | 4 +- OpenRA.Mods.RA/Activities/Infiltrate.cs | 2 +- .../Traits/Buildings/ClonesProducedUnits.cs | 2 +- OpenRA.Mods.RA/Traits/Chronoshiftable.cs | 2 +- OpenRA.Mods.RA/Traits/Disguise.cs | 4 +- OpenRA.Mods.RA/Traits/Mine.cs | 2 +- .../Traits/SupportPowers/ChronoshiftPower.cs | 2 +- 79 files changed, 153 insertions(+), 153 deletions(-) diff --git a/OpenRA.Game/Actor.cs b/OpenRA.Game/Actor.cs index e9e3c9d304..d2b82a414e 100644 --- a/OpenRA.Game/Actor.cs +++ b/OpenRA.Game/Actor.cs @@ -226,11 +226,6 @@ namespace OpenRA return World.TraitDict.WithInterface(this); } - public bool HasTrait() - { - return World.TraitDict.Contains(this); - } - public void AddTrait(object trait) { World.TraitDict.AddTrait(this, trait); diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index e274de0557..9fd39bf910 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -181,7 +181,7 @@ namespace OpenRA.Graphics if (World.Type == WorldType.Regular && Game.Settings.Game.AlwaysShowStatusBars) { foreach (var g in World.Actors.Where(a => !a.Disposed - && a.HasTrait() + && a.Info.Traits.Contains() && !World.FogObscures(a) && !World.Selection.Actors.Contains(a))) @@ -193,7 +193,7 @@ namespace OpenRA.Graphics public void DrawRollover(Actor unit) { - if (unit.HasTrait()) + if (unit.Info.Traits.Contains()) new SelectionBarsRenderable(unit).Render(this); } diff --git a/OpenRA.Game/Orders/UnitOrderGenerator.cs b/OpenRA.Game/Orders/UnitOrderGenerator.cs index 83f0e85f4a..ea583a437c 100644 --- a/OpenRA.Game/Orders/UnitOrderGenerator.cs +++ b/OpenRA.Game/Orders/UnitOrderGenerator.cs @@ -20,7 +20,7 @@ namespace OpenRA.Orders public IEnumerable Order(World world, CPos xy, MouseInput mi) { var underCursor = world.ScreenMap.ActorsAt(mi) - .Where(a => !world.FogObscures(a) && a.HasTrait()) + .Where(a => !world.FogObscures(a) && a.Info.Traits.Contains()) .WithHighestSelectionPriority(); Target target; @@ -58,12 +58,12 @@ namespace OpenRA.Orders { var useSelect = false; var underCursor = world.ScreenMap.ActorsAt(mi) - .Where(a => !world.FogObscures(a) && a.HasTrait()) + .Where(a => !world.FogObscures(a) && a.Info.Traits.Contains()) .WithHighestSelectionPriority(); if (underCursor != null && (mi.Modifiers.HasModifier(Modifiers.Shift) || !world.Selection.Actors.Any())) { - if (underCursor.HasTrait()) + if (underCursor.Info.Traits.Contains()) useSelect = true; } diff --git a/OpenRA.Game/TraitDictionary.cs b/OpenRA.Game/TraitDictionary.cs index a60bce30a9..3d6a9dbe30 100644 --- a/OpenRA.Game/TraitDictionary.cs +++ b/OpenRA.Game/TraitDictionary.cs @@ -84,12 +84,6 @@ namespace OpenRA throw new InvalidOperationException("Attempted to get trait from destroyed object ({0})".F(actor)); } - public bool Contains(Actor actor) - { - CheckDestroyed(actor); - return InnerGet().GetMultiple(actor.ActorID).Any(); - } - public T Get(Actor actor) { CheckDestroyed(actor); diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 2ee5cfb76c..82c22d2964 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -144,13 +144,13 @@ namespace OpenRA.Traits Player Owner { get; } } - public interface IToolTip + public interface ITooltip { ITooltipInfo TooltipInfo { get; } Player Owner { get; } } - public interface ITooltipInfo + public interface ITooltipInfo : ITraitInfo { string TooltipForPlayerStance(Stance stance); bool IsOwnerRowVisible { get; } @@ -226,6 +226,7 @@ namespace OpenRA.Traits public interface ITags { IEnumerable GetTags(); } public interface ISelectionBar { float GetValue(); Color GetColor(); } + public interface IPositionableInfo : ITraitInfo { } public interface IPositionable : IOccupySpace { bool IsLeavingCell(CPos location, SubCell subCell = SubCell.Any); @@ -296,6 +297,7 @@ namespace OpenRA.Traits public interface INotifyBecomingIdle { void OnBecomingIdle(Actor self); } public interface INotifyIdle { void TickIdle(Actor self); } + public interface IBlocksProjectilesInfo : ITraitInfo { } public interface IBlocksProjectiles { } public interface IRenderInfantrySequenceModifier { @@ -309,7 +311,7 @@ namespace OpenRA.Traits public interface IPostRenderSelection { IEnumerable RenderAfterWorld(WorldRenderer wr); } - public interface ITargetableInfo + public interface ITargetableInfo : ITraitInfo { HashSet GetTargetTypes(); } diff --git a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs index 3c35edf28d..c9188b3fe5 100644 --- a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs +++ b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs @@ -89,7 +89,7 @@ namespace OpenRA.Widgets { if (!hasBox && World.Selection.Actors.Any() && !multiClick) { - if (!(World.ScreenMap.ActorsAt(xy).Where(x => x.HasTrait() && + if (!(World.ScreenMap.ActorsAt(xy).Where(x => x.Info.Traits.Contains() && (x.Owner.IsAlliedWith(World.RenderPlayer) || !World.FogObscures(x))).Any() && !mi.Modifiers.HasModifier(Modifiers.Ctrl) && !mi.Modifiers.HasModifier(Modifiers.Alt) && UnitOrderGenerator.InputOverridesSelection(World, xy, mi))) { @@ -301,7 +301,7 @@ namespace OpenRA.Widgets a = b; return world.ScreenMap.ActorsInBox(a, b) - .Where(x => x.HasTrait() && (x.Owner.IsAlliedWith(world.RenderPlayer) || !world.FogObscures(x))) + .Where(x => x.Info.Traits.Contains() && (x.Owner.IsAlliedWith(world.RenderPlayer) || !world.FogObscures(x))) .SubsetWithHighestSelectionPriority(); } diff --git a/OpenRA.Mods.Common/AI/AttackOrFleeFuzzy.cs b/OpenRA.Mods.Common/AI/AttackOrFleeFuzzy.cs index 8ba55a2971..7fb05dd331 100644 --- a/OpenRA.Mods.Common/AI/AttackOrFleeFuzzy.cs +++ b/OpenRA.Mods.Common/AI/AttackOrFleeFuzzy.cs @@ -176,7 +176,7 @@ namespace OpenRA.Mods.Common.AI var sumOfHp = 0; foreach (var a in actors) { - if (a.HasTrait()) + if (a.Info.Traits.Contains()) { sumOfMaxHp += a.Trait().MaxHP; sumOfHp += a.Trait().HP; @@ -191,7 +191,7 @@ namespace OpenRA.Mods.Common.AI protected float RelativePower(IEnumerable own, IEnumerable enemy) { - return RelativeValue(own, enemy, 100, SumOfValues, a => + return RelativeValue(own, enemy, 100, SumOfValues, a => { var sumOfDamage = 0; var arms = a.TraitsImplementing(); @@ -208,7 +208,7 @@ namespace OpenRA.Mods.Common.AI protected float RelativeSpeed(IEnumerable own, IEnumerable enemy) { - return RelativeValue(own, enemy, 100, Average, (Actor a) => a.Trait().Info.Speed); + return RelativeValue(own, enemy, 100, Average, (Actor a) => a.Trait().Info.Speed); } protected static float RelativeValue(IEnumerable own, IEnumerable enemy, float normalizeByValue, @@ -224,23 +224,23 @@ namespace OpenRA.Mods.Common.AI return relative.Clamp(0.0f, 999.0f); } - protected float SumOfValues(IEnumerable actors, Func getValue) + protected float SumOfValues(IEnumerable actors, Func getValue) where TTraitInfo : ITraitInfo { var sum = 0; foreach (var a in actors) - if (a.HasTrait()) + if (a.Info.Traits.Contains()) sum += getValue(a); return sum; } - protected float Average(IEnumerable actors, Func getValue) + protected float Average(IEnumerable actors, Func getValue) where TTraitInfo : ITraitInfo { var sum = 0; var countActors = 0; foreach (var a in actors) { - if (a.HasTrait()) + if (a.Info.Traits.Contains()) { sum += getValue(a); countActors++; diff --git a/OpenRA.Mods.Common/AI/HackyAI.cs b/OpenRA.Mods.Common/AI/HackyAI.cs index ca15330896..b0f6fd748e 100644 --- a/OpenRA.Mods.Common/AI/HackyAI.cs +++ b/OpenRA.Mods.Common/AI/HackyAI.cs @@ -167,8 +167,8 @@ namespace OpenRA.Mods.Common.AI { var randomBaseBuilding = World.Actors.Where( a => a.Owner == Player - && a.HasTrait() - && !a.HasTrait()) + && a.Info.Traits.Contains() + && !a.Info.Traits.Contains()) .RandomOrDefault(Random); return randomBaseBuilding != null ? randomBaseBuilding.Location : initialBaseCenter; @@ -232,7 +232,9 @@ namespace OpenRA.Mods.Common.AI pathfinder = World.WorldActor.Trait(); isEnemyUnit = unit => - Player.Stances[unit.Owner] == Stance.Enemy && !unit.HasTrait() && unit.HasTrait(); + Player.Stances[unit.Owner] == Stance.Enemy + && !unit.Info.Traits.Contains() + && unit.Info.Traits.Contains(); foreach (var decision in info.PowerDecisions) powerDecisions.Add(decision.OrderName, decision); @@ -279,8 +281,8 @@ namespace OpenRA.Mods.Common.AI { var baseProviders = World.Actors.Where( a => a.Owner == Player - && a.HasTrait() - && !a.HasTrait()); + && a.Info.Traits.Contains() + && !a.Info.Traits.Contains()); foreach (var b in baseProviders) { @@ -306,8 +308,8 @@ namespace OpenRA.Mods.Common.AI { var areaProviders = World.Actors.Where( a => a.Owner == Player - && a.HasTrait() - && !a.HasTrait()); + && a.Info.Traits.Contains() + && !a.Info.Traits.Contains()); foreach (var a in areaProviders) { @@ -487,7 +489,7 @@ namespace OpenRA.Mods.Common.AI case BuildingType.Defense: // Build near the closest enemy structure - var closestEnemy = World.Actors.Where(a => !a.Disposed && a.HasTrait() && Player.Stances[a.Owner] == Stance.Enemy) + var closestEnemy = World.Actors.Where(a => !a.Disposed && a.Info.Traits.Contains() && Player.Stances[a.Owner] == Stance.Enemy) .ClosestTo(World.Map.CenterOfCell(defenseCenter)); var targetCell = closestEnemy != null ? closestEnemy.Location : baseCenter; @@ -563,7 +565,7 @@ namespace OpenRA.Mods.Common.AI // Pick something worth attacking owned by that player var target = World.Actors - .Where(a => a.Owner == enemy && a.HasTrait()) + .Where(a => a.Owner == enemy && a.Info.Traits.Contains()) .ClosestTo(World.Map.CenterOfCell(GetRandomBaseCenter())); if (target == null) @@ -595,7 +597,7 @@ namespace OpenRA.Mods.Common.AI List FindEnemyConstructionYards() { return World.Actors.Where(a => Player.Stances[a.Owner] == Stance.Enemy && !a.IsDead - && a.HasTrait() && !a.HasTrait()).ToList(); + && a.Info.Traits.Contains() && !a.Info.Traits.Contains()).ToList(); } void CleanSquads() @@ -705,18 +707,18 @@ namespace OpenRA.Mods.Common.AI void FindNewUnits(Actor self) { var newUnits = self.World.ActorsWithTrait() - .Where(a => a.Actor.Owner == Player && !a.Actor.HasTrait() + .Where(a => a.Actor.Owner == Player && !a.Actor.Info.Traits.Contains() && !activeUnits.Contains(a.Actor)) .Select(a => a.Actor); foreach (var a in newUnits) { - if (a.HasTrait()) + if (a.Info.Traits.Contains()) QueueOrder(new Order("Harvest", a, false)); else unitsHangingAroundTheBase.Add(a); - if (a.HasTrait() && a.HasTrait()) + if (a.Info.Traits.Contains() && a.Info.Traits.Contains()) { var air = GetSquadOfType(SquadType.Air); if (air == null) @@ -740,7 +742,7 @@ namespace OpenRA.Mods.Common.AI var attackForce = RegisterNewSquad(SquadType.Assault); foreach (var a in unitsHangingAroundTheBase) - if (!a.HasTrait()) + if (!a.Info.Traits.Contains()) attackForce.Units.Add(a); unitsHangingAroundTheBase.Clear(); @@ -751,7 +753,7 @@ namespace OpenRA.Mods.Common.AI { var allEnemyBaseBuilder = FindEnemyConstructionYards(); var ownUnits = activeUnits - .Where(unit => unit.HasTrait() && !unit.HasTrait() && unit.IsIdle).ToList(); + .Where(unit => unit.Info.Traits.Contains() && !unit.Info.Traits.Contains() && unit.IsIdle).ToList(); if (!allEnemyBaseBuilder.Any() || (ownUnits.Count < Info.SquadSize)) return; @@ -759,7 +761,7 @@ namespace OpenRA.Mods.Common.AI foreach (var b in allEnemyBaseBuilder) { var enemies = World.FindActorsInCircle(b.CenterPosition, WDist.FromCells(Info.RushAttackScanRadius)) - .Where(unit => Player.Stances[unit.Owner] == Stance.Enemy && unit.HasTrait()).ToList(); + .Where(unit => Player.Stances[unit.Owner] == Stance.Enemy && unit.Info.Traits.Contains()).ToList(); if (rushFuzzy.CanAttack(ownUnits, enemies)) { @@ -788,8 +790,8 @@ namespace OpenRA.Mods.Common.AI if (!protectSq.IsValid) { var ownUnits = World.FindActorsInCircle(World.Map.CenterOfCell(GetRandomBaseCenter()), WDist.FromCells(Info.ProtectUnitScanRadius)) - .Where(unit => unit.Owner == Player && !unit.HasTrait() - && unit.HasTrait()); + .Where(unit => unit.Owner == Player && !unit.Info.Traits.Contains() + && unit.Info.Traits.Contains()); foreach (var a in ownUnits) protectSq.Units.Add(a); @@ -830,7 +832,7 @@ namespace OpenRA.Mods.Common.AI { // Find and deploy our mcv var mcv = self.World.Actors - .FirstOrDefault(a => a.Owner == Player && a.HasTrait()); + .FirstOrDefault(a => a.Owner == Player && a.Info.Traits.Contains()); if (mcv != null) { @@ -839,7 +841,7 @@ namespace OpenRA.Mods.Common.AI // Don't transform the mcv if it is a fact // HACK: This needs to query against MCVs directly - if (mcv.HasTrait()) + if (mcv.Info.Traits.Contains()) QueueOrder(new Order("DeployTransform", mcv, false)); } else @@ -851,7 +853,8 @@ namespace OpenRA.Mods.Common.AI void FindAndDeployBackupMcv(Actor self) { // HACK: This needs to query against MCVs directly - var mcvs = self.World.Actors.Where(a => a.Owner == Player && a.HasTrait() && a.HasTrait()); + var mcvs = self.World.Actors + .Where(a => a.Owner == Player && a.Info.Traits.Contains() && a.Info.Traits.Contains()); if (!mcvs.Any()) return; @@ -1010,7 +1013,8 @@ namespace OpenRA.Mods.Common.AI return; // No construction yards - Build a new MCV - if (!HasAdequateFact() && !self.World.Actors.Any(a => a.Owner == Player && a.HasTrait() && a.HasTrait())) + if (!HasAdequateFact() && !self.World.Actors.Any(a => + a.Owner == Player && a.Info.Traits.Contains() && a.Info.Traits.Contains())) BuildUnit("Vehicle", GetUnitInfoByCommonName("Mcv", Player).Name); foreach (var q in Info.UnitQueues) @@ -1069,14 +1073,14 @@ namespace OpenRA.Mods.Common.AI if (e.Attacker.Disposed) return; - if (!e.Attacker.HasTrait()) + if (!e.Attacker.Info.Traits.Contains()) return; if (e.Damage > 0) aggro[e.Attacker.Owner].Aggro += e.Damage; // Protected harvesters or building - if ((self.HasTrait() || self.HasTrait()) && + if ((self.Info.Traits.Contains() || self.Info.Traits.Contains()) && Player.Stances[e.Attacker.Owner] == Stance.Enemy) { defenseCenter = e.Attacker.Location; diff --git a/OpenRA.Mods.Common/AI/Squad.cs b/OpenRA.Mods.Common/AI/Squad.cs index fb1a460bbd..c21b41a7e5 100644 --- a/OpenRA.Mods.Common/AI/Squad.cs +++ b/OpenRA.Mods.Common/AI/Squad.cs @@ -74,7 +74,7 @@ namespace OpenRA.Mods.Common.AI public bool IsTargetValid { - get { return Target.IsValidFor(Units.FirstOrDefault()) && !Target.Actor.HasTrait(); } + get { return Target.IsValidFor(Units.FirstOrDefault()) && !Target.Actor.Info.Traits.Contains(); } } public bool IsTargetVisible diff --git a/OpenRA.Mods.Common/AI/States/AirStates.cs b/OpenRA.Mods.Common/AI/States/AirStates.cs index 9cb08991bc..eed023eb9f 100644 --- a/OpenRA.Mods.Common/AI/States/AirStates.cs +++ b/OpenRA.Mods.Common/AI/States/AirStates.cs @@ -30,7 +30,7 @@ namespace OpenRA.Mods.Common.AI var missileUnitsCount = 0; foreach (var unit in units) { - if (unit != null && unit.HasTrait() && !unit.HasTrait() + if (unit != null && unit.Info.Traits.Contains() && !unit.Info.Traits.Contains() && !unit.IsDisabled()) { var arms = unit.TraitsImplementing(); @@ -223,7 +223,7 @@ namespace OpenRA.Mods.Common.AI continue; } - if (owner.TargetActor.HasTrait() && CanAttackTarget(a, owner.TargetActor)) + if (owner.TargetActor.Info.Traits.Contains() && CanAttackTarget(a, owner.TargetActor)) owner.Bot.QueueOrder(new Order("Attack", a, false) { TargetActor = owner.TargetActor }); } } diff --git a/OpenRA.Mods.Common/AI/States/GroundStates.cs b/OpenRA.Mods.Common/AI/States/GroundStates.cs index fdb022a56f..87115e3ae6 100644 --- a/OpenRA.Mods.Common/AI/States/GroundStates.cs +++ b/OpenRA.Mods.Common/AI/States/GroundStates.cs @@ -95,7 +95,7 @@ namespace OpenRA.Mods.Common.AI { var enemies = owner.World.FindActorsInCircle(leader.CenterPosition, WDist.FromCells(12)) .Where(a1 => !a1.Disposed && !a1.IsDead); - var enemynearby = enemies.Where(a1 => a1.HasTrait() && leader.Owner.Stances[a1.Owner] == Stance.Enemy); + var enemynearby = enemies.Where(a1 => a1.Info.Traits.Contains() && leader.Owner.Stances[a1.Owner] == Stance.Enemy); var target = enemynearby.ClosestTo(leader.CenterPosition); if (target != null) { diff --git a/OpenRA.Mods.Common/AI/States/StateBase.cs b/OpenRA.Mods.Common/AI/States/StateBase.cs index fd255dbec5..81bc6ff132 100644 --- a/OpenRA.Mods.Common/AI/States/StateBase.cs +++ b/OpenRA.Mods.Common/AI/States/StateBase.cs @@ -60,7 +60,7 @@ namespace OpenRA.Mods.Common.AI protected static bool CanAttackTarget(Actor a, Actor target) { - if (!a.HasTrait()) + if (!a.Info.Traits.Contains()) return false; var targetTypes = target.TraitsImplementing().Where(Exts.IsTraitEnabled).SelectMany(t => t.TargetTypes); @@ -82,11 +82,11 @@ namespace OpenRA.Mods.Common.AI var u = squad.Units.Random(squad.Random); var units = squad.World.FindActorsInCircle(u.CenterPosition, WDist.FromCells(DangerRadius)).ToList(); - var ownBaseBuildingAround = units.Where(unit => unit.Owner == squad.Bot.Player && unit.HasTrait()); + var ownBaseBuildingAround = units.Where(unit => unit.Owner == squad.Bot.Player && unit.Info.Traits.Contains()); if (ownBaseBuildingAround.Any()) return false; - var enemyAroundUnit = units.Where(unit => squad.Bot.Player.Stances[unit.Owner] == Stance.Enemy && unit.HasTrait()); + var enemyAroundUnit = units.Where(unit => squad.Bot.Player.Stances[unit.Owner] == Stance.Enemy && unit.Info.Traits.Contains()); if (!enemyAroundUnit.Any()) return false; diff --git a/OpenRA.Mods.Common/Activities/Air/HeliAttack.cs b/OpenRA.Mods.Common/Activities/Air/HeliAttack.cs index cf54845c5f..7840172f48 100644 --- a/OpenRA.Mods.Common/Activities/Air/HeliAttack.cs +++ b/OpenRA.Mods.Common/Activities/Air/HeliAttack.cs @@ -37,7 +37,7 @@ namespace OpenRA.Mods.Common.Activities { target = value; if (target.Type == TargetType.Actor) - canHideUnderFog = target.Actor.HasTrait(); + canHideUnderFog = target.Actor.Info.Traits.Contains(); } } diff --git a/OpenRA.Mods.Common/Activities/Attack.cs b/OpenRA.Mods.Common/Activities/Attack.cs index cfad985837..a940ff235d 100644 --- a/OpenRA.Mods.Common/Activities/Attack.cs +++ b/OpenRA.Mods.Common/Activities/Attack.cs @@ -61,7 +61,7 @@ namespace OpenRA.Mods.Common.Activities // HACK: This would otherwise break targeting frozen actors // The problem is that Shroud.IsTargetable returns false (as it should) for // frozen actors, but we do want to explicitly target the underlying actor here. - if (!attack.Info.IgnoresVisibility && type == TargetType.Actor && !Target.Actor.HasTrait() && !self.Owner.CanTargetActor(Target.Actor)) + if (!attack.Info.IgnoresVisibility && type == TargetType.Actor && !Target.Actor.Info.Traits.Contains() && !self.Owner.CanTargetActor(Target.Actor)) return NextActivity; // Try to move within range diff --git a/OpenRA.Mods.Common/Activities/Hunt.cs b/OpenRA.Mods.Common/Activities/Hunt.cs index 55ff87989d..7bb9225e7a 100644 --- a/OpenRA.Mods.Common/Activities/Hunt.cs +++ b/OpenRA.Mods.Common/Activities/Hunt.cs @@ -24,7 +24,7 @@ namespace OpenRA.Mods.Common.Activities { var attack = self.Trait(); targets = self.World.Actors.Where(a => self != a && !a.IsDead && a.IsInWorld && a.AppearsHostileTo(self) - && a.HasTrait() && IsTargetable(a, self) && attack.HasAnyValidWeapons(Target.FromActor(a))); + && a.Info.Traits.Contains() && IsTargetable(a, self) && attack.HasAnyValidWeapons(Target.FromActor(a))); } bool IsTargetable(Actor self, Actor viewer) diff --git a/OpenRA.Mods.Common/Activities/Move/MoveAdjacentTo.cs b/OpenRA.Mods.Common/Activities/Move/MoveAdjacentTo.cs index 90e9b519eb..255807ca26 100644 --- a/OpenRA.Mods.Common/Activities/Move/MoveAdjacentTo.cs +++ b/OpenRA.Mods.Common/Activities/Move/MoveAdjacentTo.cs @@ -41,7 +41,7 @@ namespace OpenRA.Mods.Common.Activities { target = value; if (target.Type == TargetType.Actor) - canHideUnderFog = target.Actor.HasTrait(); + canHideUnderFog = target.Actor.Info.Traits.Contains(); } } diff --git a/OpenRA.Mods.Common/Activities/Rearm.cs b/OpenRA.Mods.Common/Activities/Rearm.cs index 99ad7c8480..5fa3824933 100644 --- a/OpenRA.Mods.Common/Activities/Rearm.cs +++ b/OpenRA.Mods.Common/Activities/Rearm.cs @@ -48,7 +48,8 @@ namespace OpenRA.Mods.Common.Activities continue; // HACK to check if we are on the helipad/airfield/etc. - var hostBuilding = self.World.ActorMap.GetUnitsAt(self.Location).FirstOrDefault(a => a.HasTrait()); + var hostBuilding = self.World.ActorMap.GetUnitsAt(self.Location) + .FirstOrDefault(a => a.Info.Traits.Contains()); if (hostBuilding == null || !hostBuilding.IsInWorld) return NextActivity; diff --git a/OpenRA.Mods.Common/ActorExts.cs b/OpenRA.Mods.Common/ActorExts.cs index 2e95bc5f5f..4c58c25e19 100644 --- a/OpenRA.Mods.Common/ActorExts.cs +++ b/OpenRA.Mods.Common/ActorExts.cs @@ -23,7 +23,7 @@ namespace OpenRA.Mods.Common if (self.IsDead) return false; - if (!self.HasTrait()) + if (!self.Info.Traits.Contains()) return false; if (!self.IsInWorld) @@ -43,7 +43,7 @@ namespace OpenRA.Mods.Common if (stance == Stance.Ally) return true; - if (self.EffectiveOwner != null && self.EffectiveOwner.Disguised && !toActor.HasTrait()) + if (self.EffectiveOwner != null && self.EffectiveOwner.Disguised && !toActor.Info.Traits.Contains()) return toActor.Owner.Stances[self.EffectiveOwner.Owner] == Stance.Ally; return stance == Stance.Ally; @@ -55,7 +55,7 @@ namespace OpenRA.Mods.Common if (stance == Stance.Ally) return false; /* otherwise, we'll hate friendly disguised spies */ - if (self.EffectiveOwner != null && self.EffectiveOwner.Disguised && !toActor.HasTrait()) + if (self.EffectiveOwner != null && self.EffectiveOwner.Disguised && !toActor.Info.Traits.Contains()) return toActor.Owner.Stances[self.EffectiveOwner.Owner] == Stance.Enemy; return stance == Stance.Enemy; diff --git a/OpenRA.Mods.Common/Commands/DevCommands.cs b/OpenRA.Mods.Common/Commands/DevCommands.cs index 549b1b32b7..ec71d825ee 100644 --- a/OpenRA.Mods.Common/Commands/DevCommands.cs +++ b/OpenRA.Mods.Common/Commands/DevCommands.cs @@ -112,7 +112,7 @@ namespace OpenRA.Mods.Common.Commands var leveluporder = new Order("DevLevelUp", actor, false); leveluporder.ExtraData = (uint)level; - if (actor.HasTrait()) + if (actor.Info.Traits.Contains()) world.IssueOrder(leveluporder); } diff --git a/OpenRA.Mods.Common/Effects/Bullet.cs b/OpenRA.Mods.Common/Effects/Bullet.cs index 0b04322fa3..7df4ce6e68 100644 --- a/OpenRA.Mods.Common/Effects/Bullet.cs +++ b/OpenRA.Mods.Common/Effects/Bullet.cs @@ -165,7 +165,7 @@ namespace OpenRA.Mods.Common.Effects contrail.Update(pos); if (ticks++ >= length || (info.Blockable && world.ActorMap - .GetUnitsAt(world.Map.CellContaining(pos)).Any(a => a.HasTrait()))) + .GetUnitsAt(world.Map.CellContaining(pos)).Any(a => a.Info.Traits.Contains()))) Explode(world); } diff --git a/OpenRA.Mods.Common/Effects/Missile.cs b/OpenRA.Mods.Common/Effects/Missile.cs index 456201b9ac..7e8a3c7f8b 100644 --- a/OpenRA.Mods.Common/Effects/Missile.cs +++ b/OpenRA.Mods.Common/Effects/Missile.cs @@ -201,7 +201,7 @@ namespace OpenRA.Mods.Common.Effects var shouldExplode = (pos.Z < 0) // Hit the ground || (dist.LengthSquared < info.CloseEnough.LengthSquared) // Within range || (info.RangeLimit != 0 && ticks > info.RangeLimit) // Ran out of fuel - || (info.Blockable && world.ActorMap.GetUnitsAt(cell).Any(a => a.HasTrait())) // Hit a wall or other blocking obstacle + || (info.Blockable && world.ActorMap.GetUnitsAt(cell).Any(a => a.Info.Traits.Contains())) // Hit a wall or other blocking obstacle || !world.Map.Contains(cell) // This also avoids an IndexOutOfRangeException in GetTerrainInfo below. || (!string.IsNullOrEmpty(info.BoundToTerrainType) && world.Map.GetTerrainInfo(cell).Type != info.BoundToTerrainType); // Hit incompatible terrain diff --git a/OpenRA.Mods.Common/Orders/EnterAlliedActorTargeter.cs b/OpenRA.Mods.Common/Orders/EnterAlliedActorTargeter.cs index 82cb8cc93a..390e767b87 100644 --- a/OpenRA.Mods.Common/Orders/EnterAlliedActorTargeter.cs +++ b/OpenRA.Mods.Common/Orders/EnterAlliedActorTargeter.cs @@ -13,7 +13,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Orders { - public class EnterAlliedActorTargeter : UnitOrderTargeter + public class EnterAlliedActorTargeter : UnitOrderTargeter where T : ITraitInfo { readonly Func canTarget; readonly Func useEnterCursor; @@ -28,7 +28,7 @@ namespace OpenRA.Mods.Common.Orders public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor) { - if (!target.HasTrait() || !canTarget(target)) + if (!target.Info.Traits.Contains() || !canTarget(target)) return false; cursor = useEnterCursor(target) ? "enter" : "enter-blocked"; diff --git a/OpenRA.Mods.Common/Scripting/Properties/CombatProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/CombatProperties.cs index 4177cc6107..863ddfdc15 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/CombatProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/CombatProperties.cs @@ -83,7 +83,7 @@ namespace OpenRA.Mods.Common.Scripting if (!target.IsValidFor(Self) || target.Type == TargetType.FrozenActor) Log.Write("lua", "{1} is an invalid target for {0}!", Self, targetActor); - if (!targetActor.HasTrait() && !Self.Owner.CanTargetActor(targetActor)) + if (!targetActor.Info.Traits.Contains() && !Self.Owner.CanTargetActor(targetActor)) Log.Write("lua", "{1} is not revealed for player {0}!", Self.Owner, targetActor); attackBase.AttackTarget(target, true, allowMove); diff --git a/OpenRA.Mods.Common/Scripting/Properties/GuardProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/GuardProperties.cs index ecadcc632b..5e1b59b8f7 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/GuardProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/GuardProperties.cs @@ -28,7 +28,7 @@ namespace OpenRA.Mods.Common.Scripting [Desc("Guard the target actor.")] public void Guard(Actor targetActor) { - if (targetActor.HasTrait()) + if (targetActor.Info.Traits.Contains()) guard.GuardTarget(Self, Target.FromActor(targetActor)); } } diff --git a/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs index 4d2638fe0e..2ac2b0a54f 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs @@ -56,7 +56,7 @@ namespace OpenRA.Mods.Common.Scripting public Actor[] GetGroundAttackers() { return Player.World.ActorsWithTrait().Select(a => a.Actor) - .Where(a => a.Owner == Player && !a.IsDead && a.IsInWorld && a.HasTrait()) + .Where(a => a.Owner == Player && !a.IsDead && a.IsInWorld && a.Info.Traits.Contains()) .ToArray(); } diff --git a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs index c9bfd67942..ca9907ef63 100644 --- a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs @@ -19,7 +19,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { - public class AircraftInfo : ITraitInfo, IFacingInfo, IOccupySpaceInfo, ICruiseAltitudeInfo, UsesInit, UsesInit + public class AircraftInfo : IPositionableInfo, IFacingInfo, IOccupySpaceInfo, ICruiseAltitudeInfo, UsesInit, UsesInit { public readonly WDist CruiseAltitude = new WDist(1280); public readonly WDist IdealSeparation = new WDist(1706); @@ -120,7 +120,7 @@ namespace OpenRA.Mods.Common.Traits firstTick = false; // TODO: Aircraft husks don't properly unreserve. - if (self.HasTrait()) + if (self.Info.Traits.Contains()) return; ReserveSpawnBuilding(); @@ -158,7 +158,7 @@ namespace OpenRA.Mods.Common.Traits return WVec.Zero; return self.World.FindActorsInCircle(self.CenterPosition, info.IdealSeparation) - .Where(a => !a.IsDead && a.HasTrait() && a.Info.Traits.Get().CruiseAltitude == info.CruiseAltitude) + .Where(a => !a.IsDead && a.Info.Traits.Contains() && a.Info.Traits.Get().CruiseAltitude == info.CruiseAltitude) .Select(GetRepulsionForce) .Aggregate(WVec.Zero, (a, b) => a + b); } @@ -191,7 +191,7 @@ namespace OpenRA.Mods.Common.Traits return null; // not on the ground. return self.World.ActorMap.GetUnitsAt(self.Location) - .FirstOrDefault(a => a.HasTrait()); + .FirstOrDefault(a => a.Info.Traits.Contains()); } protected void ReserveSpawnBuilding() @@ -341,7 +341,7 @@ namespace OpenRA.Mods.Common.Traits { get { - yield return new EnterAlliedActorTargeter("Enter", 5, + yield return new EnterAlliedActorTargeter("Enter", 5, target => AircraftCanEnter(target), target => !Reservable.IsReserved(target)); yield return new AircraftMoveOrderTargeter(info); diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs index 35f9933bf9..78cf948d86 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs @@ -202,7 +202,7 @@ namespace OpenRA.Mods.Common.Traits public bool IsReachableTarget(Target target, bool allowMove) { return HasAnyValidWeapons(target) - && (target.IsInRange(self.CenterPosition, GetMaximumRange()) || (allowMove && self.HasTrait())); + && (target.IsInRange(self.CenterPosition, GetMaximumRange()) || (allowMove && self.Info.Traits.Contains())); } class AttackOrderTargeter : IOrderTargeter diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs b/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs index f3ecf7af04..38c44274b1 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs @@ -81,8 +81,8 @@ namespace OpenRA.Mods.Common.Traits var weapon = attack.ChooseArmamentForTarget(target); if (weapon != null) { - var targetIsMobile = (target.Type == TargetType.Actor && target.Actor.HasTrait()) - || (target.Type == TargetType.FrozenActor && target.FrozenActor.Info.Traits.Contains()); + var targetIsMobile = (target.Type == TargetType.Actor && target.Actor.Info.Traits.Contains()) + || (target.Type == TargetType.FrozenActor && target.FrozenActor.Info.Traits.Contains()); // Try and sit at least one cell closer than the max range to give some leeway if the target starts moving. var maxRange = targetIsMobile ? new WDist(Math.Max(weapon.Weapon.MinRange.Length, weapon.Weapon.Range.Length - 1024)) diff --git a/OpenRA.Mods.Common/Traits/AutoTarget.cs b/OpenRA.Mods.Common/Traits/AutoTarget.cs index a256358d89..be1d678022 100644 --- a/OpenRA.Mods.Common/Traits/AutoTarget.cs +++ b/OpenRA.Mods.Common/Traits/AutoTarget.cs @@ -154,7 +154,7 @@ namespace OpenRA.Mods.Common.Traits return inRange .Where(a => a.AppearsHostileTo(self) && - !a.HasTrait() && + !a.Info.Traits.Contains() && attack.HasAnyValidWeapons(Target.FromActor(a)) && self.Owner.CanTargetActor(a)) .ClosestTo(self); diff --git a/OpenRA.Mods.Common/Traits/BlocksProjectiles.cs b/OpenRA.Mods.Common/Traits/BlocksProjectiles.cs index e93add1764..c41398abd6 100644 --- a/OpenRA.Mods.Common/Traits/BlocksProjectiles.cs +++ b/OpenRA.Mods.Common/Traits/BlocksProjectiles.cs @@ -15,6 +15,6 @@ namespace OpenRA.Mods.Common.Traits { // TODO: Add functionality like a customizable Height that is compared to projectile altitude [Desc("This actor blocks bullets and missiles with 'Blockable' property.")] - public class BlocksProjectilesInfo : TraitInfo { } + public class BlocksProjectilesInfo : TraitInfo, IBlocksProjectilesInfo { } public class BlocksProjectiles : IBlocksProjectiles { } } diff --git a/OpenRA.Mods.Common/Traits/BodyOrientation.cs b/OpenRA.Mods.Common/Traits/BodyOrientation.cs index 8d65700106..f25452a31d 100644 --- a/OpenRA.Mods.Common/Traits/BodyOrientation.cs +++ b/OpenRA.Mods.Common/Traits/BodyOrientation.cs @@ -77,7 +77,7 @@ namespace OpenRA.Mods.Common.Traits // If a sprite actor has neither custom QuantizedFacings nor a trait implementing IQuantizeBodyOrientationInfo, throw if (qboi == null) { - if (self.HasTrait()) + if (self.Info.Traits.Contains()) throw new InvalidOperationException("Actor '" + self.Info.Name + "' has a sprite body but no facing quantization." + " Either add the QuantizeFacingsFromSequence trait or set custom QuantizedFacings on BodyOrientation."); else diff --git a/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs b/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs index eade73b54c..b4bb963654 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs @@ -201,7 +201,7 @@ namespace OpenRA.Mods.Common.Traits { foreach (var c in footprint.Keys) foreach (var a in self.World.ActorMap.GetUnitsAt(c)) - if (a.HasTrait() && !a.Trait().CanEnterCell(c)) + if (a.Info.Traits.Contains() && !a.Trait().CanEnterCell(c)) a.Kill(self); } diff --git a/OpenRA.Mods.Common/Traits/Buildings/Building.cs b/OpenRA.Mods.Common/Traits/Buildings/Building.cs index cefcc8686c..d7ac7860b2 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Building.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Building.cs @@ -87,12 +87,12 @@ namespace OpenRA.Mods.Common.Traits { var unitsAtPos = world.ActorMap.GetUnitsAt(pos).Where(a => a.IsInWorld && (a.Owner == p || (allyBuildRadius && a.Owner.Stances[p] == Stance.Ally)) - && a.HasTrait()); + && a.Info.Traits.Contains()); if (unitsAtPos.Any()) nearnessCandidates.Add(pos); } - else if (buildingAtPos.IsInWorld && buildingAtPos.HasTrait() + else if (buildingAtPos.IsInWorld && buildingAtPos.Info.Traits.Contains() && (buildingAtPos.Owner == p || (allyBuildRadius && buildingAtPos.Owner.Stances[p] == Stance.Ally))) nearnessCandidates.Add(pos); } @@ -164,7 +164,7 @@ namespace OpenRA.Mods.Common.Traits public void Created(Actor self) { - if (SkipMakeAnimation || !self.HasTrait()) + if (SkipMakeAnimation || !self.Info.Traits.Contains()) NotifyBuildingComplete(self); } diff --git a/OpenRA.Mods.Common/Traits/Buildings/Refinery.cs b/OpenRA.Mods.Common/Traits/Buildings/Refinery.cs index 6312b6395f..8f68e05901 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Refinery.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Refinery.cs @@ -18,7 +18,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { - public class RefineryInfo : ITraitInfo, Requires + public class RefineryInfo : IAcceptResourcesInfo, Requires { [Desc("Actual harvester facing when docking, 0-255 counter-clock-wise.")] public readonly int DockAngle = 0; diff --git a/OpenRA.Mods.Common/Traits/Crates/Crate.cs b/OpenRA.Mods.Common/Traits/Crates/Crate.cs index 813c48bb88..f21cb545b5 100644 --- a/OpenRA.Mods.Common/Traits/Crates/Crate.cs +++ b/OpenRA.Mods.Common/Traits/Crates/Crate.cs @@ -15,7 +15,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { - class CrateInfo : ITraitInfo, IOccupySpaceInfo, Requires + class CrateInfo : IPositionableInfo, IOccupySpaceInfo, Requires { [Desc("Length of time (in seconds) until the crate gets removed automatically. " + "A value of zero disables auto-removal.")] diff --git a/OpenRA.Mods.Common/Traits/EngineerRepair.cs b/OpenRA.Mods.Common/Traits/EngineerRepair.cs index ea4cff0c51..cee2c2a530 100644 --- a/OpenRA.Mods.Common/Traits/EngineerRepair.cs +++ b/OpenRA.Mods.Common/Traits/EngineerRepair.cs @@ -101,7 +101,7 @@ namespace OpenRA.Mods.Common.Traits public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor) { - if (!target.HasTrait()) + if (!target.Info.Traits.Contains()) return false; if (self.Owner.Stances[target.Owner] != Stance.Ally) @@ -115,7 +115,7 @@ namespace OpenRA.Mods.Common.Traits public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) { - if (!target.Info.Traits.Contains()) + if (!target.Info.Traits.Contains()) return false; if (self.Owner.Stances[target.Owner] != Stance.Ally) diff --git a/OpenRA.Mods.Common/Traits/Guard.cs b/OpenRA.Mods.Common/Traits/Guard.cs index 61a41bfb2d..bbbbd081a6 100644 --- a/OpenRA.Mods.Common/Traits/Guard.cs +++ b/OpenRA.Mods.Common/Traits/Guard.cs @@ -88,7 +88,7 @@ namespace OpenRA.Mods.Common.Traits public void Tick(World world) { - if (subjects.All(s => s.IsDead || !s.HasTrait())) + if (subjects.All(s => s.IsDead || !s.Info.Traits.Contains())) world.CancelInputMode(); } @@ -112,7 +112,7 @@ namespace OpenRA.Mods.Common.Traits return world.ScreenMap.ActorsAt(mi) .Where(a => !world.FogObscures(a) && !a.IsDead && a.AppearsFriendlyTo(world.LocalPlayer.PlayerActor) && - a.HasTrait()); + a.Info.Traits.Contains()); } } } diff --git a/OpenRA.Mods.Common/Traits/Harvester.cs b/OpenRA.Mods.Common/Traits/Harvester.cs index db203b71a6..dbb356706f 100644 --- a/OpenRA.Mods.Common/Traits/Harvester.cs +++ b/OpenRA.Mods.Common/Traits/Harvester.cs @@ -297,7 +297,7 @@ namespace OpenRA.Mods.Common.Traits { get { - yield return new EnterAlliedActorTargeter("Deliver", 5, + yield return new EnterAlliedActorTargeter("Deliver", 5, proc => IsAcceptableProcType(proc), proc => !IsEmpty && proc.Trait().AllowDocking); yield return new HarvestOrderTargeter(); diff --git a/OpenRA.Mods.Common/Traits/KillsSelf.cs b/OpenRA.Mods.Common/Traits/KillsSelf.cs index 48ccc153ba..9265ac1162 100644 --- a/OpenRA.Mods.Common/Traits/KillsSelf.cs +++ b/OpenRA.Mods.Common/Traits/KillsSelf.cs @@ -36,7 +36,7 @@ namespace OpenRA.Mods.Common.Traits if (self.IsDead) return; - if (Info.RemoveInstead || !self.HasTrait()) + if (Info.RemoveInstead || !self.Info.Traits.Contains()) self.Dispose(); else self.Kill(self); diff --git a/OpenRA.Mods.Common/Traits/Mobile.cs b/OpenRA.Mods.Common/Traits/Mobile.cs index 71ea825cd7..8b432701df 100644 --- a/OpenRA.Mods.Common/Traits/Mobile.cs +++ b/OpenRA.Mods.Common/Traits/Mobile.cs @@ -38,7 +38,8 @@ namespace OpenRA.Mods.Common.Traits } [Desc("Unit is able to move.")] - public class MobileInfo : IMoveInfo, IOccupySpaceInfo, IFacingInfo, UsesInit, UsesInit, UsesInit + public class MobileInfo : IMoveInfo, IPositionableInfo, IOccupySpaceInfo, IFacingInfo, + UsesInit, UsesInit, UsesInit { [FieldLoader.LoadUsing("LoadSpeeds", true)] [Desc("Set Water: 0 for ground units and lower the value on rough terrain.")] @@ -664,7 +665,7 @@ namespace OpenRA.Mods.Common.Traits { var cellInfo = notStupidCells .SelectMany(c => self.World.ActorMap.GetUnitsAt(c) - .Where(a => a.IsIdle && a.HasTrait()), + .Where(a => a.IsIdle && a.Info.Traits.Contains()), (c, a) => new { Cell = c, Actor = a }) .RandomOrDefault(self.World.SharedRandom); diff --git a/OpenRA.Mods.Common/Traits/Modifiers/FrozenUnderFog.cs b/OpenRA.Mods.Common/Traits/Modifiers/FrozenUnderFog.cs index 3b30c7ea2b..b3d366046a 100644 --- a/OpenRA.Mods.Common/Traits/Modifiers/FrozenUnderFog.cs +++ b/OpenRA.Mods.Common/Traits/Modifiers/FrozenUnderFog.cs @@ -35,7 +35,7 @@ namespace OpenRA.Mods.Common.Traits readonly bool startsRevealed; readonly PPos[] footprint; - readonly Lazy tooltip; + readonly Lazy tooltip; readonly Lazy health; readonly Dictionary visible; @@ -53,7 +53,7 @@ namespace OpenRA.Mods.Common.Traits startsRevealed = info.StartsRevealed && !init.Contains(); var footprintCells = FootprintUtils.Tiles(init.Self).ToList(); footprint = footprintCells.SelectMany(c => map.ProjectedCellsCovering(c.ToMPos(map))).ToArray(); - tooltip = Exts.Lazy(() => init.Self.TraitsImplementing().FirstOrDefault()); + tooltip = Exts.Lazy(() => init.Self.TraitsImplementing().FirstOrDefault()); health = Exts.Lazy(() => init.Self.TraitOrDefault()); frozen = new Dictionary(); diff --git a/OpenRA.Mods.Common/Traits/Passenger.cs b/OpenRA.Mods.Common/Traits/Passenger.cs index 0df46d9083..0c0a5efb1b 100644 --- a/OpenRA.Mods.Common/Traits/Passenger.cs +++ b/OpenRA.Mods.Common/Traits/Passenger.cs @@ -20,7 +20,7 @@ namespace OpenRA.Mods.Common.Traits { public enum AlternateTransportsMode { None, Force, Default, Always } - public class EnterTransportTargeter : EnterAlliedActorTargeter + public class EnterTransportTargeter : EnterAlliedActorTargeter { readonly AlternateTransportsMode mode; @@ -51,7 +51,7 @@ namespace OpenRA.Mods.Common.Traits } } - public class EnterTransportsTargeter : EnterAlliedActorTargeter + public class EnterTransportsTargeter : EnterAlliedActorTargeter { readonly AlternateTransportsMode mode; @@ -116,7 +116,7 @@ namespace OpenRA.Mods.Common.Traits Info = info; Func canTarget = IsCorrectCargoType; Func useEnterCursor = CanEnter; - Orders = new EnterAlliedActorTargeter[] + Orders = new EnterAlliedActorTargeter[] { new EnterTransportTargeter("EnterTransport", 5, canTarget, useEnterCursor, Info.AlternateTransportsMode), new EnterTransportsTargeter("EnterTransports", 5, canTarget, useEnterCursor, Info.AlternateTransportsMode) diff --git a/OpenRA.Mods.Common/Traits/Player/AllyRepair.cs b/OpenRA.Mods.Common/Traits/Player/AllyRepair.cs index fd27c6afaf..30a2df05d2 100644 --- a/OpenRA.Mods.Common/Traits/Player/AllyRepair.cs +++ b/OpenRA.Mods.Common/Traits/Player/AllyRepair.cs @@ -23,7 +23,7 @@ namespace OpenRA.Mods.Common.Traits { var building = order.TargetActor; - if (building.HasTrait()) + if (building.Info.Traits.Contains()) if (building.AppearsFriendlyTo(self)) building.Trait().RepairBuilding(building, self.Owner); } diff --git a/OpenRA.Mods.Common/Traits/Player/BaseAttackNotifier.cs b/OpenRA.Mods.Common/Traits/Player/BaseAttackNotifier.cs index d3f427fdbf..0494ef1aa8 100644 --- a/OpenRA.Mods.Common/Traits/Player/BaseAttackNotifier.cs +++ b/OpenRA.Mods.Common/Traits/Player/BaseAttackNotifier.cs @@ -48,7 +48,7 @@ namespace OpenRA.Mods.Common.Traits public void Damaged(Actor self, AttackInfo e) { // only track last hit against our base - if (!self.HasTrait()) + if (!self.Info.Traits.Contains()) return; if (e.Attacker == null) diff --git a/OpenRA.Mods.Common/Traits/Player/HarvesterAttackNotifier.cs b/OpenRA.Mods.Common/Traits/Player/HarvesterAttackNotifier.cs index fe02812b34..caa20dcb1a 100644 --- a/OpenRA.Mods.Common/Traits/Player/HarvesterAttackNotifier.cs +++ b/OpenRA.Mods.Common/Traits/Player/HarvesterAttackNotifier.cs @@ -47,8 +47,8 @@ namespace OpenRA.Mods.Common.Traits public void Damaged(Actor self, AttackInfo e) { - // only track last hit against our base - if (!self.HasTrait()) + // only track last hit against our harvesters + if (!self.Info.Traits.Contains()) return; // don't track self-damage diff --git a/OpenRA.Mods.Common/Traits/Player/PlayerStatistics.cs b/OpenRA.Mods.Common/Traits/Player/PlayerStatistics.cs index 10578444de..4f96c32465 100644 --- a/OpenRA.Mods.Common/Traits/Player/PlayerStatistics.cs +++ b/OpenRA.Mods.Common/Traits/Player/PlayerStatistics.cs @@ -107,18 +107,18 @@ namespace OpenRA.Mods.Common.Traits var attackerStats = e.Attacker.Owner.PlayerActor.Trait(); var defenderStats = self.Owner.PlayerActor.Trait(); - if (self.HasTrait()) + if (self.Info.Traits.Contains()) { attackerStats.BuildingsKilled++; defenderStats.BuildingsDead++; } - else if (self.HasTrait()) + else if (self.Info.Traits.Contains()) { attackerStats.UnitsKilled++; defenderStats.UnitsDead++; } - if (self.HasTrait()) + if (self.Info.Traits.Contains()) { var cost = self.Info.Traits.Get().Cost; attackerStats.KillsCost += cost; diff --git a/OpenRA.Mods.Common/Traits/Player/ProvidesPrerequisite.cs b/OpenRA.Mods.Common/Traits/Player/ProvidesPrerequisite.cs index 773d0353bd..a56744f2ab 100644 --- a/OpenRA.Mods.Common/Traits/Player/ProvidesPrerequisite.cs +++ b/OpenRA.Mods.Common/Traits/Player/ProvidesPrerequisite.cs @@ -14,7 +14,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { - public class ProvidesPrerequisiteInfo : ITraitInfo + public class ProvidesPrerequisiteInfo : ITechTreePrerequisiteInfo { [Desc("The prerequisite type that this provides. If left empty it defaults to the actor's name.")] public readonly string Prerequisite = null; diff --git a/OpenRA.Mods.Common/Traits/Player/ProvidesTechPrerequisite.cs b/OpenRA.Mods.Common/Traits/Player/ProvidesTechPrerequisite.cs index d9667b3e88..9065fb9047 100644 --- a/OpenRA.Mods.Common/Traits/Player/ProvidesTechPrerequisite.cs +++ b/OpenRA.Mods.Common/Traits/Player/ProvidesTechPrerequisite.cs @@ -13,7 +13,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { - public class ProvidesTechPrerequisiteInfo : ITraitInfo + public class ProvidesTechPrerequisiteInfo : ITechTreePrerequisiteInfo { public readonly string Name; public readonly string[] Prerequisites = { }; diff --git a/OpenRA.Mods.Common/Traits/Player/TechTree.cs b/OpenRA.Mods.Common/Traits/Player/TechTree.cs index 00fb3c624c..cc26cbd1e7 100644 --- a/OpenRA.Mods.Common/Traits/Player/TechTree.cs +++ b/OpenRA.Mods.Common/Traits/Player/TechTree.cs @@ -36,7 +36,7 @@ namespace OpenRA.Mods.Common.Traits public void ActorChanged(Actor a) { var bi = a.Info.Traits.GetOrDefault(); - if (a.Owner == player && (a.HasTrait() || (bi != null && bi.BuildLimit > 0))) + if (a.Owner == player && (a.Info.Traits.Contains() || (bi != null && bi.BuildLimit > 0))) Update(); } diff --git a/OpenRA.Mods.Common/Traits/Render/Hovers.cs b/OpenRA.Mods.Common/Traits/Render/Hovers.cs index a02609e405..49e7e970b0 100644 --- a/OpenRA.Mods.Common/Traits/Render/Hovers.cs +++ b/OpenRA.Mods.Common/Traits/Render/Hovers.cs @@ -34,7 +34,7 @@ namespace OpenRA.Mods.Common.Traits public Hovers(HoversInfo info, Actor self) { this.info = info; - aircraft = self.HasTrait(); + aircraft = self.Info.Traits.Contains(); } public IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) diff --git a/OpenRA.Mods.Common/Traits/Render/WithBuildingPlacedAnimation.cs b/OpenRA.Mods.Common/Traits/Render/WithBuildingPlacedAnimation.cs index 5b6294fe0b..b074d5194e 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithBuildingPlacedAnimation.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithBuildingPlacedAnimation.cs @@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Traits { this.info = info; wsb = self.Trait(); - buildComplete = !self.HasTrait(); + buildComplete = !self.Info.Traits.Contains(); } public void BuildingComplete(Actor self) diff --git a/OpenRA.Mods.Common/Traits/Render/WithBuildingPlacedOverlay.cs b/OpenRA.Mods.Common/Traits/Render/WithBuildingPlacedOverlay.cs index 7bbcb1b363..4a5085cf7c 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithBuildingPlacedOverlay.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithBuildingPlacedOverlay.cs @@ -41,7 +41,7 @@ namespace OpenRA.Mods.Common.Traits var rs = self.Trait(); var body = self.Trait(); - buildComplete = !self.HasTrait(); // always render instantly for units + buildComplete = !self.Info.Traits.Contains(); // always render instantly for units overlay = new Animation(self.World, rs.GetImage(self)); diff --git a/OpenRA.Mods.Common/Traits/Render/WithDockingOverlay.cs b/OpenRA.Mods.Common/Traits/Render/WithDockingOverlay.cs index cb0631f846..a650248977 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithDockingOverlay.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithDockingOverlay.cs @@ -46,7 +46,7 @@ namespace OpenRA.Mods.Common.Traits var rs = self.Trait(); var body = self.Trait(); - buildComplete = !self.HasTrait(); // always render instantly for units + buildComplete = !self.Info.Traits.Contains(); // always render instantly for units var overlay = new Animation(self.World, rs.GetImage(self)); overlay.Play(info.Sequence); diff --git a/OpenRA.Mods.Common/Traits/Render/WithIdleOverlay.cs b/OpenRA.Mods.Common/Traits/Render/WithIdleOverlay.cs index 2f4a58a107..d0fa673e3e 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithIdleOverlay.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithIdleOverlay.cs @@ -68,7 +68,7 @@ namespace OpenRA.Mods.Common.Traits var rs = self.Trait(); var body = self.Trait(); - buildComplete = !self.HasTrait(); // always render instantly for units + buildComplete = !self.Info.Traits.Contains(); // always render instantly for units overlay = new Animation(self.World, rs.GetImage(self)); if (info.StartSequence != null) overlay.PlayThen(RenderSprites.NormalizeSequence(overlay, self.GetDamageState(), info.StartSequence), diff --git a/OpenRA.Mods.Common/Traits/Render/WithRepairOverlay.cs b/OpenRA.Mods.Common/Traits/Render/WithRepairOverlay.cs index 52a4253640..9a5355bdf9 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithRepairOverlay.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithRepairOverlay.cs @@ -45,7 +45,7 @@ namespace OpenRA.Mods.Common.Traits var rs = self.Trait(); var body = self.Trait(); - buildComplete = !self.HasTrait(); // always render instantly for units + buildComplete = !self.Info.Traits.Contains(); // always render instantly for units overlay = new Animation(self.World, rs.GetImage(self)); overlay.Play(info.Sequence); diff --git a/OpenRA.Mods.Common/Traits/Render/WithSpriteBody.cs b/OpenRA.Mods.Common/Traits/Render/WithSpriteBody.cs index b7b5cdc42f..24ee8239fc 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithSpriteBody.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithSpriteBody.cs @@ -17,7 +17,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { [Desc("Default trait for rendering sprite-based actors.")] - public class WithSpriteBodyInfo : UpgradableTraitInfo, IRenderActorPreviewSpritesInfo, Requires + public class WithSpriteBodyInfo : UpgradableTraitInfo, ISpriteBodyInfo, IRenderActorPreviewSpritesInfo, Requires { [Desc("Animation to play when the actor is created."), SequenceReference] public readonly string StartSequence = null; diff --git a/OpenRA.Mods.Common/Traits/Repairable.cs b/OpenRA.Mods.Common/Traits/Repairable.cs index 310710d444..59e51c879f 100644 --- a/OpenRA.Mods.Common/Traits/Repairable.cs +++ b/OpenRA.Mods.Common/Traits/Repairable.cs @@ -45,7 +45,7 @@ namespace OpenRA.Mods.Common.Traits { get { - yield return new EnterAlliedActorTargeter("Repair", 5, CanRepairAt, _ => CanRepair() || CanRearm()); + yield return new EnterAlliedActorTargeter("Repair", 5, CanRepairAt, _ => CanRepair() || CanRearm()); } } diff --git a/OpenRA.Mods.Common/Traits/RepairableNear.cs b/OpenRA.Mods.Common/Traits/RepairableNear.cs index ddae2b19d5..4de7aad94d 100644 --- a/OpenRA.Mods.Common/Traits/RepairableNear.cs +++ b/OpenRA.Mods.Common/Traits/RepairableNear.cs @@ -42,7 +42,7 @@ namespace OpenRA.Mods.Common.Traits { get { - yield return new EnterAlliedActorTargeter("RepairNear", 5, + yield return new EnterAlliedActorTargeter("RepairNear", 5, target => CanRepairAt(target), _ => ShouldRepair()); } } diff --git a/OpenRA.Mods.Common/Traits/Sound/AmbientSound.cs b/OpenRA.Mods.Common/Traits/Sound/AmbientSound.cs index 7ad82ca1c7..80f1a7e52f 100644 --- a/OpenRA.Mods.Common/Traits/Sound/AmbientSound.cs +++ b/OpenRA.Mods.Common/Traits/Sound/AmbientSound.cs @@ -25,7 +25,7 @@ namespace OpenRA.Mods.Common.Traits { public AmbientSound(Actor self, AmbientSoundInfo info) { - if (self.HasTrait()) + if (self.Info.Traits.Contains()) Sound.PlayLooped(info.SoundFile, self.CenterPosition); else Sound.PlayLooped(info.SoundFile); diff --git a/OpenRA.Mods.Common/Traits/SupplyTruck.cs b/OpenRA.Mods.Common/Traits/SupplyTruck.cs index c80a63ddde..ae3ca5f03b 100644 --- a/OpenRA.Mods.Common/Traits/SupplyTruck.cs +++ b/OpenRA.Mods.Common/Traits/SupplyTruck.cs @@ -82,7 +82,7 @@ namespace OpenRA.Mods.Common.Traits public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor) { - return target.HasTrait(); + return target.Info.Traits.Contains(); } public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs b/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs index 4486b77a6e..1a93ecb8ff 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs @@ -78,7 +78,7 @@ namespace OpenRA.Mods.Common.Traits void ActorRemoved(Actor a) { - if (a.Owner != Self.Owner || !a.HasTrait()) + if (a.Owner != Self.Owner || !a.Info.Traits.Contains()) return; foreach (var t in a.TraitsImplementing()) @@ -119,7 +119,7 @@ namespace OpenRA.Mods.Common.Traits public IEnumerable GetPowersForActor(Actor a) { - if (a.Owner != Self.Owner || !a.HasTrait()) + if (a.Owner != Self.Owner || !a.Info.Traits.Contains()) return NoInstances; return a.TraitsImplementing() diff --git a/OpenRA.Mods.Common/Traits/Targetable.cs b/OpenRA.Mods.Common/Traits/Targetable.cs index 45cc822a09..ff7397bcfc 100644 --- a/OpenRA.Mods.Common/Traits/Targetable.cs +++ b/OpenRA.Mods.Common/Traits/Targetable.cs @@ -40,7 +40,7 @@ namespace OpenRA.Mods.Common.Traits { if (IsTraitDisabled) return false; - if (cloak == null || (!viewer.IsDead && viewer.HasTrait())) + if (cloak == null || (!viewer.IsDead && viewer.Info.Traits.Contains())) return true; return cloak.IsVisible(self, viewer.Owner); diff --git a/OpenRA.Mods.Common/Traits/Tooltip.cs b/OpenRA.Mods.Common/Traits/Tooltip.cs index 6bfb944c02..3d0de5e6d5 100644 --- a/OpenRA.Mods.Common/Traits/Tooltip.cs +++ b/OpenRA.Mods.Common/Traits/Tooltip.cs @@ -53,7 +53,7 @@ namespace OpenRA.Mods.Common.Traits public bool IsOwnerRowVisible { get { return ShowOwnerRow; } } } - public class Tooltip : IToolTip + public class Tooltip : ITooltip { readonly Actor self; readonly TooltipInfo info; diff --git a/OpenRA.Mods.Common/Traits/Transforms.cs b/OpenRA.Mods.Common/Traits/Transforms.cs index 2a33b2c1de..739cb293f7 100644 --- a/OpenRA.Mods.Common/Traits/Transforms.cs +++ b/OpenRA.Mods.Common/Traits/Transforms.cs @@ -109,10 +109,10 @@ namespace OpenRA.Mods.Common.Traits if (!queued) self.CancelActivity(); - if (self.HasTrait()) + if (self.Info.Traits.Contains()) self.QueueActivity(new Turn(self, info.Facing)); - if (self.HasTrait()) + if (self.Info.Traits.Contains()) self.QueueActivity(new HeliLand(self, true)); foreach (var nt in self.TraitsImplementing()) diff --git a/OpenRA.Mods.Common/TraitsInterfaces.cs b/OpenRA.Mods.Common/TraitsInterfaces.cs index a3e912dc0e..a508234b20 100644 --- a/OpenRA.Mods.Common/TraitsInterfaces.cs +++ b/OpenRA.Mods.Common/TraitsInterfaces.cs @@ -18,6 +18,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { + public interface ISpriteBodyInfo : ITraitInfo { } public interface ISpriteBody { void PlayCustomAnimation(Actor self, string newAnimation, Action after); @@ -67,6 +68,7 @@ namespace OpenRA.Mods.Common.Traits void Undocked(); } + public interface ITechTreePrerequisiteInfo : ITraitInfo { } public interface ITechTreePrerequisite { IEnumerable ProvidesPrerequisites { get; } @@ -91,6 +93,7 @@ namespace OpenRA.Mods.Common.Traits public interface INotifyTransform { void BeforeTransform(Actor self); void OnTransform(Actor self); void AfterTransform(Actor toActor); } + public interface IAcceptResourcesInfo : ITraitInfo { } public interface IAcceptResources { void OnDock(Actor harv, DeliverResources dockOrder); diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs index 708855fd99..1640d5df00 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs @@ -245,7 +245,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic .Sum(a => a.Info.Traits.WithInterface().First().Cost); var harvesters = template.Get("HARVESTERS"); - harvesters.GetText = () => world.Actors.Count(a => a.Owner == player && !a.IsDead && a.HasTrait()).ToString(); + harvesters.GetText = () => world.Actors.Count(a => a.Owner == player && !a.IsDead && a.Info.Traits.Contains()).ToString(); return template; } @@ -280,7 +280,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic { return ScrollItemWidget.Setup(template, () => false, () => { - var playerBase = world.Actors.FirstOrDefault(a => !a.IsDead && a.HasTrait() && a.Owner == player); + var playerBase = world.Actors.FirstOrDefault(a => !a.IsDead && a.Info.Traits.Contains() && a.Owner == player); if (playerBase != null) worldRenderer.Viewport.Center(playerBase.CenterPosition); }); diff --git a/OpenRA.Mods.Common/Widgets/ProductionTabsWidget.cs b/OpenRA.Mods.Common/Widgets/ProductionTabsWidget.cs index 14ea5e9943..135540d336 100644 --- a/OpenRA.Mods.Common/Widgets/ProductionTabsWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ProductionTabsWidget.cs @@ -198,7 +198,7 @@ namespace OpenRA.Mods.Common.Widgets // Is added to world.ActorAdded by the SidebarLogic handler public void ActorChanged(Actor a) { - if (a.HasTrait()) + if (a.Info.Traits.Contains()) { var allQueues = a.World.ActorsWithTrait() .Where(p => p.Actor.Owner == p.Actor.World.LocalPlayer && p.Actor.IsInWorld && p.Trait.Enabled) diff --git a/OpenRA.Mods.Common/Widgets/ViewportControllerWidget.cs b/OpenRA.Mods.Common/Widgets/ViewportControllerWidget.cs index dbd83528dd..e3d5f31122 100644 --- a/OpenRA.Mods.Common/Widgets/ViewportControllerWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ViewportControllerWidget.cs @@ -27,7 +27,7 @@ namespace OpenRA.Mods.Common.Widgets Lazy tooltipContainer; public WorldTooltipType TooltipType { get; private set; } - public IToolTip ActorTooltip { get; private set; } + public ITooltip ActorTooltip { get; private set; } public IProvideTooltipInfo[] ActorTooltipExtra { get; private set; } public FrozenActor FrozenActorTooltip { get; private set; } @@ -106,12 +106,12 @@ namespace OpenRA.Mods.Common.Widgets } var underCursor = world.ScreenMap.ActorsAt(worldRenderer.Viewport.ViewToWorldPx(Viewport.LastMousePos)) - .Where(a => !world.FogObscures(a) && a.HasTrait()) + .Where(a => !world.FogObscures(a) && a.Info.Traits.Contains()) .WithHighestSelectionPriority(); if (underCursor != null) { - ActorTooltip = underCursor.TraitsImplementing().First(); + ActorTooltip = underCursor.TraitsImplementing().First(); ActorTooltipExtra = underCursor.TraitsImplementing().ToArray(); TooltipType = WorldTooltipType.Actor; return; diff --git a/OpenRA.Mods.Common/Widgets/WorldCommandWidget.cs b/OpenRA.Mods.Common/Widgets/WorldCommandWidget.cs index 3021a1ac33..a3b48bfdb4 100644 --- a/OpenRA.Mods.Common/Widgets/WorldCommandWidget.cs +++ b/OpenRA.Mods.Common/Widgets/WorldCommandWidget.cs @@ -177,7 +177,7 @@ namespace OpenRA.Mods.Common.Widgets bool PerformGuard() { var actors = world.Selection.Actors - .Where(a => !a.Disposed && a.Owner == world.LocalPlayer && a.HasTrait()); + .Where(a => !a.Disposed && a.Owner == world.LocalPlayer && a.Info.Traits.Contains()); if (actors.Any()) world.OrderGenerator = new GuardOrderGenerator(actors); @@ -197,7 +197,7 @@ namespace OpenRA.Mods.Common.Widgets { var building = world.ActorsWithTrait() .Select(b => b.Actor) - .FirstOrDefault(a => a.Owner == world.LocalPlayer && a.HasTrait()); + .FirstOrDefault(a => a.Owner == world.LocalPlayer && a.Info.Traits.Contains()); // No buildings left if (building == null) @@ -223,7 +223,7 @@ namespace OpenRA.Mods.Common.Widgets bool CycleProductionBuildings() { var facilities = world.ActorsWithTrait() - .Where(a => a.Actor.Owner == world.LocalPlayer && !a.Actor.HasTrait()) + .Where(a => a.Actor.Owner == world.LocalPlayer && !a.Actor.Info.Traits.Contains()) .OrderBy(f => f.Actor.Info.Traits.Get().Produces.First()) .Select(b => b.Actor) .ToList(); diff --git a/OpenRA.Mods.D2k/Activities/SwallowActor.cs b/OpenRA.Mods.D2k/Activities/SwallowActor.cs index 9379c21bab..389a6536bd 100644 --- a/OpenRA.Mods.D2k/Activities/SwallowActor.cs +++ b/OpenRA.Mods.D2k/Activities/SwallowActor.cs @@ -79,7 +79,7 @@ namespace OpenRA.Mods.D2k.Activities actor1.Dispose(); // Harvester insurance - if (!actor1.HasTrait()) + if (!actor1.Info.Traits.Contains()) return; var insurance = actor1.Owner.PlayerActor.TraitOrDefault(); diff --git a/OpenRA.Mods.D2k/Traits/Carryable.cs b/OpenRA.Mods.D2k/Traits/Carryable.cs index e96847daf3..cad10371eb 100644 --- a/OpenRA.Mods.D2k/Traits/Carryable.cs +++ b/OpenRA.Mods.D2k/Traits/Carryable.cs @@ -117,7 +117,7 @@ namespace OpenRA.Mods.D2k.Traits { // HACK: Harvesters need special treatment to avoid getting stuck on resource fields, // so if a Harvester's afterLandActivity is not DeliverResources, queue a new FindResources activity - var findResources = self.HasTrait() && !(afterLandActivity is DeliverResources); + var findResources = self.Info.Traits.Contains() && !(afterLandActivity is DeliverResources); if (findResources) self.QueueActivity(new FindResources(self)); else diff --git a/OpenRA.Mods.D2k/Traits/Render/WithDeliveryOverlay.cs b/OpenRA.Mods.D2k/Traits/Render/WithDeliveryOverlay.cs index 017656005c..cd86d62c42 100644 --- a/OpenRA.Mods.D2k/Traits/Render/WithDeliveryOverlay.cs +++ b/OpenRA.Mods.D2k/Traits/Render/WithDeliveryOverlay.cs @@ -49,7 +49,7 @@ namespace OpenRA.Mods.D2k.Traits var body = self.Trait(); // always render instantly for units - buildComplete = !self.HasTrait(); + buildComplete = !self.Info.Traits.Contains(); var overlay = new Animation(self.World, rs.GetImage(self)); overlay.Play(info.Sequence); diff --git a/OpenRA.Mods.D2k/Traits/Sandworm.cs b/OpenRA.Mods.D2k/Traits/Sandworm.cs index a2c9615faa..ce8c0d2e5c 100644 --- a/OpenRA.Mods.D2k/Traits/Sandworm.cs +++ b/OpenRA.Mods.D2k/Traits/Sandworm.cs @@ -99,7 +99,7 @@ namespace OpenRA.Mods.D2k.Traits targetCountdown = Info.TargetRescanInterval; // If close enough, we don't care about other actors. - var target = self.World.FindActorsInCircle(self.CenterPosition, Info.IgnoreNoiseAttackRange).FirstOrDefault(x => x.HasTrait()); + var target = self.World.FindActorsInCircle(self.CenterPosition, Info.IgnoreNoiseAttackRange).FirstOrDefault(x => x.Info.Traits.Contains()); if (target != null) { self.CancelActivity(); @@ -109,7 +109,7 @@ namespace OpenRA.Mods.D2k.Traits Func isValidTarget = a => { - if (!a.HasTrait()) + if (!a.Info.Traits.Contains()) return false; return mobile.CanEnterCell(a.Location, null, false); diff --git a/OpenRA.Mods.RA/Activities/Infiltrate.cs b/OpenRA.Mods.RA/Activities/Infiltrate.cs index 4e566770a6..1f7c23fad8 100644 --- a/OpenRA.Mods.RA/Activities/Infiltrate.cs +++ b/OpenRA.Mods.RA/Activities/Infiltrate.cs @@ -50,7 +50,7 @@ namespace OpenRA.Mods.RA.Activities self.Dispose(); - if (target.HasTrait()) + if (target.Info.Traits.Contains()) Sound.PlayToPlayer(self.Owner, "bldginf1.aud"); } } diff --git a/OpenRA.Mods.RA/Traits/Buildings/ClonesProducedUnits.cs b/OpenRA.Mods.RA/Traits/Buildings/ClonesProducedUnits.cs index 75bf52f0be..f8abd6b7cf 100644 --- a/OpenRA.Mods.RA/Traits/Buildings/ClonesProducedUnits.cs +++ b/OpenRA.Mods.RA/Traits/Buildings/ClonesProducedUnits.cs @@ -41,7 +41,7 @@ namespace OpenRA.Mods.RA.Traits public void UnitProducedByOther(Actor self, Actor producer, Actor produced) { // No recursive cloning! - if (producer.Owner != self.Owner || producer.HasTrait()) + if (producer.Owner != self.Owner || producer.Info.Traits.Contains()) return; var ci = produced.Info.Traits.GetOrDefault(); diff --git a/OpenRA.Mods.RA/Traits/Chronoshiftable.cs b/OpenRA.Mods.RA/Traits/Chronoshiftable.cs index 68f7d33973..f5c4a5774b 100644 --- a/OpenRA.Mods.RA/Traits/Chronoshiftable.cs +++ b/OpenRA.Mods.RA/Traits/Chronoshiftable.cs @@ -64,7 +64,7 @@ namespace OpenRA.Mods.RA.Traits public virtual bool CanChronoshiftTo(Actor self, CPos targetLocation) { // TODO: Allow enemy units to be chronoshifted into bad terrain to kill them - return self.HasTrait() && self.Trait().CanEnterCell(targetLocation); + return self.Info.Traits.Contains() && self.Trait().CanEnterCell(targetLocation); } public virtual bool Teleport(Actor self, CPos targetLocation, int duration, bool killCargo, Actor chronosphere) diff --git a/OpenRA.Mods.RA/Traits/Disguise.cs b/OpenRA.Mods.RA/Traits/Disguise.cs index 73ecbc433d..96e814e4c1 100644 --- a/OpenRA.Mods.RA/Traits/Disguise.cs +++ b/OpenRA.Mods.RA/Traits/Disguise.cs @@ -24,7 +24,7 @@ namespace OpenRA.Mods.RA.Traits public override object Create(ActorInitializer init) { return new DisguiseToolTip(init.Self, this); } } - class DisguiseToolTip : IToolTip + class DisguiseToolTip : ITooltip { readonly Actor self; readonly Disguise disguise; @@ -147,7 +147,7 @@ namespace OpenRA.Mods.RA.Traits else { AsSprite = target.Trait().GetImage(target); - var tooltip = target.TraitsImplementing().FirstOrDefault(); + var tooltip = target.TraitsImplementing().FirstOrDefault(); AsPlayer = tooltip.Owner; AsTooltipInfo = tooltip.TooltipInfo; } diff --git a/OpenRA.Mods.RA/Traits/Mine.cs b/OpenRA.Mods.RA/Traits/Mine.cs index 9372bfc7db..068fdcc293 100644 --- a/OpenRA.Mods.RA/Traits/Mine.cs +++ b/OpenRA.Mods.RA/Traits/Mine.cs @@ -39,7 +39,7 @@ namespace OpenRA.Mods.RA.Traits public void OnCrush(Actor crusher) { - if (crusher.HasTrait() || (self.Owner.Stances[crusher.Owner] == Stance.Ally && info.AvoidFriendly)) + if (crusher.Info.Traits.Contains() || (self.Owner.Stances[crusher.Owner] == Stance.Ally && info.AvoidFriendly)) return; var mobile = crusher.TraitOrDefault(); diff --git a/OpenRA.Mods.RA/Traits/SupportPowers/ChronoshiftPower.cs b/OpenRA.Mods.RA/Traits/SupportPowers/ChronoshiftPower.cs index 3e33e74ff9..0c7ebdf689 100644 --- a/OpenRA.Mods.RA/Traits/SupportPowers/ChronoshiftPower.cs +++ b/OpenRA.Mods.RA/Traits/SupportPowers/ChronoshiftPower.cs @@ -64,7 +64,7 @@ namespace OpenRA.Mods.RA.Traits foreach (var t in tiles) units.UnionWith(Self.World.ActorMap.GetUnitsAt(t)); - return units.Where(a => a.HasTrait() && + return units.Where(a => a.Info.Traits.Contains() && !a.TraitsImplementing().Any(condition => condition.PreventsTeleport(a))); } From 8162fa27ab8bb378c866ccf871de95d898d568be Mon Sep 17 00:00:00 2001 From: atlimit8 Date: Sun, 2 Aug 2015 12:44:46 -0500 Subject: [PATCH 2/4] Add ActorInfo.HasTraitInfo() requiring ITraitInfo types --- OpenRA.Game/GameRules/ActorInfo.cs | 2 + OpenRA.Game/Graphics/WorldRenderer.cs | 4 +- OpenRA.Game/Orders/UnitOrderGenerator.cs | 10 ++-- .../WorldInteractionControllerWidget.cs | 4 +- OpenRA.Mods.Common/AI/AttackOrFleeFuzzy.cs | 6 +-- OpenRA.Mods.Common/AI/HackyAI.cs | 50 +++++++++---------- OpenRA.Mods.Common/AI/Squad.cs | 2 +- OpenRA.Mods.Common/AI/States/AirStates.cs | 4 +- OpenRA.Mods.Common/AI/States/GroundStates.cs | 2 +- OpenRA.Mods.Common/AI/States/StateBase.cs | 6 +-- .../Activities/Air/HeliAttack.cs | 2 +- OpenRA.Mods.Common/Activities/Attack.cs | 2 +- OpenRA.Mods.Common/Activities/Hunt.cs | 2 +- .../Activities/Move/MoveAdjacentTo.cs | 2 +- OpenRA.Mods.Common/Activities/Rearm.cs | 2 +- OpenRA.Mods.Common/ActorExts.cs | 6 +-- OpenRA.Mods.Common/Commands/DevCommands.cs | 2 +- .../EditorBrushes/EditorActorBrush.cs | 4 +- OpenRA.Mods.Common/Effects/Bullet.cs | 2 +- OpenRA.Mods.Common/Effects/Missile.cs | 2 +- OpenRA.Mods.Common/Lint/CheckPlayers.cs | 2 +- .../Orders/EnterAlliedActorTargeter.cs | 2 +- .../Orders/PlaceBuildingOrderGenerator.cs | 4 +- .../Orders/RepairOrderGenerator.cs | 2 +- .../Scripting/Properties/CombatProperties.cs | 2 +- .../Scripting/Properties/GuardProperties.cs | 2 +- .../Scripting/Properties/PlayerProperties.cs | 2 +- OpenRA.Mods.Common/Traits/Air/Aircraft.cs | 6 +-- .../Traits/Attack/AttackBase.cs | 2 +- .../Traits/Attack/AttackFollow.cs | 4 +- OpenRA.Mods.Common/Traits/AutoTarget.cs | 2 +- OpenRA.Mods.Common/Traits/BodyOrientation.cs | 2 +- OpenRA.Mods.Common/Traits/Buildings/Bridge.cs | 2 +- .../Traits/Buildings/Building.cs | 6 +-- .../Traits/CustomBuildTimeValue.cs | 2 +- OpenRA.Mods.Common/Traits/EngineerRepair.cs | 4 +- OpenRA.Mods.Common/Traits/Guard.cs | 4 +- OpenRA.Mods.Common/Traits/KillsSelf.cs | 2 +- OpenRA.Mods.Common/Traits/Mobile.cs | 2 +- .../Traits/Player/AllyRepair.cs | 2 +- .../Traits/Player/BaseAttackNotifier.cs | 2 +- .../Traits/Player/HarvesterAttackNotifier.cs | 2 +- .../Traits/Player/PlayerStatistics.cs | 6 +-- .../Traits/Player/ProductionQueue.cs | 8 +-- OpenRA.Mods.Common/Traits/Player/TechTree.cs | 2 +- OpenRA.Mods.Common/Traits/Production.cs | 2 +- OpenRA.Mods.Common/Traits/Render/Hovers.cs | 2 +- .../Render/WithBuildingPlacedAnimation.cs | 2 +- .../Render/WithBuildingPlacedOverlay.cs | 2 +- .../Traits/Render/WithDockingOverlay.cs | 2 +- .../Traits/Render/WithIdleOverlay.cs | 2 +- .../Traits/Render/WithProductionOverlay.cs | 2 +- .../Traits/Render/WithRepairOverlay.cs | 2 +- .../Traits/Sound/AmbientSound.cs | 2 +- OpenRA.Mods.Common/Traits/SupplyTruck.cs | 4 +- .../SupportPowers/SupportPowerManager.cs | 4 +- OpenRA.Mods.Common/Traits/Targetable.cs | 2 +- OpenRA.Mods.Common/Traits/Transforms.cs | 4 +- .../Traits/World/DomainIndex.cs | 2 +- OpenRA.Mods.Common/TraitsInterfaces.cs | 4 +- .../Logic/Editor/ActorSelectorLogic.cs | 4 +- .../Logic/Ingame/ObserverStatsLogic.cs | 4 +- .../Logic/Ingame/ProductionTooltipLogic.cs | 2 +- .../Widgets/ProductionPaletteWidget.cs | 2 +- .../Widgets/ProductionTabsWidget.cs | 2 +- .../Widgets/ViewportControllerWidget.cs | 2 +- .../Widgets/WorldCommandWidget.cs | 6 +-- OpenRA.Mods.D2k/Activities/SwallowActor.cs | 2 +- OpenRA.Mods.D2k/Traits/Carryable.cs | 2 +- .../Traits/Render/WithDeliveryOverlay.cs | 2 +- OpenRA.Mods.D2k/Traits/Sandworm.cs | 4 +- OpenRA.Mods.RA/Activities/Infiltrate.cs | 2 +- .../Traits/Buildings/ClonesProducedUnits.cs | 2 +- OpenRA.Mods.RA/Traits/Chronoshiftable.cs | 2 +- OpenRA.Mods.RA/Traits/Mine.cs | 2 +- OpenRA.Mods.RA/Traits/Minelayer.cs | 2 +- .../Traits/SupportPowers/ChronoshiftPower.cs | 2 +- 77 files changed, 138 insertions(+), 136 deletions(-) diff --git a/OpenRA.Game/GameRules/ActorInfo.cs b/OpenRA.Game/GameRules/ActorInfo.cs index 4e55518edf..b09140e4e0 100644 --- a/OpenRA.Game/GameRules/ActorInfo.cs +++ b/OpenRA.Game/GameRules/ActorInfo.cs @@ -183,5 +183,7 @@ namespace OpenRA i => Pair.New( i.Name.Replace("Init", ""), i)); } + + public bool HasTraitInfo() where T : ITraitInfo { return Traits.Contains(); } } } diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index 9fd39bf910..69d0c718b1 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -181,7 +181,7 @@ namespace OpenRA.Graphics if (World.Type == WorldType.Regular && Game.Settings.Game.AlwaysShowStatusBars) { foreach (var g in World.Actors.Where(a => !a.Disposed - && a.Info.Traits.Contains() + && a.Info.HasTraitInfo() && !World.FogObscures(a) && !World.Selection.Actors.Contains(a))) @@ -193,7 +193,7 @@ namespace OpenRA.Graphics public void DrawRollover(Actor unit) { - if (unit.Info.Traits.Contains()) + if (unit.Info.HasTraitInfo()) new SelectionBarsRenderable(unit).Render(this); } diff --git a/OpenRA.Game/Orders/UnitOrderGenerator.cs b/OpenRA.Game/Orders/UnitOrderGenerator.cs index ea583a437c..d5bf8ea790 100644 --- a/OpenRA.Game/Orders/UnitOrderGenerator.cs +++ b/OpenRA.Game/Orders/UnitOrderGenerator.cs @@ -20,7 +20,7 @@ namespace OpenRA.Orders public IEnumerable Order(World world, CPos xy, MouseInput mi) { var underCursor = world.ScreenMap.ActorsAt(mi) - .Where(a => !world.FogObscures(a) && a.Info.Traits.Contains()) + .Where(a => !world.FogObscures(a) && a.Info.HasTraitInfo()) .WithHighestSelectionPriority(); Target target; @@ -29,7 +29,7 @@ namespace OpenRA.Orders else { var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, mi) - .Where(a => a.Info.Traits.Contains() && !a.Footprint.All(world.ShroudObscures)) + .Where(a => a.Info.HasTraitInfo() && !a.Footprint.All(world.ShroudObscures)) .WithHighestSelectionPriority(); target = frozen != null ? Target.FromFrozenActor(frozen) : Target.FromCell(world, xy); } @@ -58,12 +58,12 @@ namespace OpenRA.Orders { var useSelect = false; var underCursor = world.ScreenMap.ActorsAt(mi) - .Where(a => !world.FogObscures(a) && a.Info.Traits.Contains()) + .Where(a => !world.FogObscures(a) && a.Info.HasTraitInfo()) .WithHighestSelectionPriority(); if (underCursor != null && (mi.Modifiers.HasModifier(Modifiers.Shift) || !world.Selection.Actors.Any())) { - if (underCursor.Info.Traits.Contains()) + if (underCursor.Info.HasTraitInfo()) useSelect = true; } @@ -73,7 +73,7 @@ namespace OpenRA.Orders else { var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, mi) - .Where(a => a.Info.Traits.Contains() && !a.Footprint.All(world.ShroudObscures)) + .Where(a => a.Info.HasTraitInfo() && !a.Footprint.All(world.ShroudObscures)) .WithHighestSelectionPriority(); target = frozen != null ? Target.FromFrozenActor(frozen) : Target.FromCell(world, xy); } diff --git a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs index c9188b3fe5..ce2d777554 100644 --- a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs +++ b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs @@ -89,7 +89,7 @@ namespace OpenRA.Widgets { if (!hasBox && World.Selection.Actors.Any() && !multiClick) { - if (!(World.ScreenMap.ActorsAt(xy).Where(x => x.Info.Traits.Contains() && + if (!(World.ScreenMap.ActorsAt(xy).Where(x => x.Info.HasTraitInfo() && (x.Owner.IsAlliedWith(World.RenderPlayer) || !World.FogObscures(x))).Any() && !mi.Modifiers.HasModifier(Modifiers.Ctrl) && !mi.Modifiers.HasModifier(Modifiers.Alt) && UnitOrderGenerator.InputOverridesSelection(World, xy, mi))) { @@ -301,7 +301,7 @@ namespace OpenRA.Widgets a = b; return world.ScreenMap.ActorsInBox(a, b) - .Where(x => x.Info.Traits.Contains() && (x.Owner.IsAlliedWith(world.RenderPlayer) || !world.FogObscures(x))) + .Where(x => x.Info.HasTraitInfo() && (x.Owner.IsAlliedWith(world.RenderPlayer) || !world.FogObscures(x))) .SubsetWithHighestSelectionPriority(); } diff --git a/OpenRA.Mods.Common/AI/AttackOrFleeFuzzy.cs b/OpenRA.Mods.Common/AI/AttackOrFleeFuzzy.cs index 7fb05dd331..a102996dbb 100644 --- a/OpenRA.Mods.Common/AI/AttackOrFleeFuzzy.cs +++ b/OpenRA.Mods.Common/AI/AttackOrFleeFuzzy.cs @@ -176,7 +176,7 @@ namespace OpenRA.Mods.Common.AI var sumOfHp = 0; foreach (var a in actors) { - if (a.Info.Traits.Contains()) + if (a.Info.HasTraitInfo()) { sumOfMaxHp += a.Trait().MaxHP; sumOfHp += a.Trait().HP; @@ -228,7 +228,7 @@ namespace OpenRA.Mods.Common.AI { var sum = 0; foreach (var a in actors) - if (a.Info.Traits.Contains()) + if (a.Info.HasTraitInfo()) sum += getValue(a); return sum; @@ -240,7 +240,7 @@ namespace OpenRA.Mods.Common.AI var countActors = 0; foreach (var a in actors) { - if (a.Info.Traits.Contains()) + if (a.Info.HasTraitInfo()) { sum += getValue(a); countActors++; diff --git a/OpenRA.Mods.Common/AI/HackyAI.cs b/OpenRA.Mods.Common/AI/HackyAI.cs index b0f6fd748e..fbbb79ef71 100644 --- a/OpenRA.Mods.Common/AI/HackyAI.cs +++ b/OpenRA.Mods.Common/AI/HackyAI.cs @@ -167,8 +167,8 @@ namespace OpenRA.Mods.Common.AI { var randomBaseBuilding = World.Actors.Where( a => a.Owner == Player - && a.Info.Traits.Contains() - && !a.Info.Traits.Contains()) + && a.Info.HasTraitInfo() + && !a.Info.HasTraitInfo()) .RandomOrDefault(Random); return randomBaseBuilding != null ? randomBaseBuilding.Location : initialBaseCenter; @@ -233,8 +233,8 @@ namespace OpenRA.Mods.Common.AI isEnemyUnit = unit => Player.Stances[unit.Owner] == Stance.Enemy - && !unit.Info.Traits.Contains() - && unit.Info.Traits.Contains(); + && !unit.Info.HasTraitInfo() + && unit.Info.HasTraitInfo(); foreach (var decision in info.PowerDecisions) powerDecisions.Add(decision.OrderName, decision); @@ -281,8 +281,8 @@ namespace OpenRA.Mods.Common.AI { var baseProviders = World.Actors.Where( a => a.Owner == Player - && a.Info.Traits.Contains() - && !a.Info.Traits.Contains()); + && a.Info.HasTraitInfo() + && !a.Info.HasTraitInfo()); foreach (var b in baseProviders) { @@ -308,8 +308,8 @@ namespace OpenRA.Mods.Common.AI { var areaProviders = World.Actors.Where( a => a.Owner == Player - && a.Info.Traits.Contains() - && !a.Info.Traits.Contains()); + && a.Info.HasTraitInfo() + && !a.Info.HasTraitInfo()); foreach (var a in areaProviders) { @@ -489,7 +489,7 @@ namespace OpenRA.Mods.Common.AI case BuildingType.Defense: // Build near the closest enemy structure - var closestEnemy = World.Actors.Where(a => !a.Disposed && a.Info.Traits.Contains() && Player.Stances[a.Owner] == Stance.Enemy) + var closestEnemy = World.Actors.Where(a => !a.Disposed && a.Info.HasTraitInfo() && Player.Stances[a.Owner] == Stance.Enemy) .ClosestTo(World.Map.CenterOfCell(defenseCenter)); var targetCell = closestEnemy != null ? closestEnemy.Location : baseCenter; @@ -565,7 +565,7 @@ namespace OpenRA.Mods.Common.AI // Pick something worth attacking owned by that player var target = World.Actors - .Where(a => a.Owner == enemy && a.Info.Traits.Contains()) + .Where(a => a.Owner == enemy && a.Info.HasTraitInfo()) .ClosestTo(World.Map.CenterOfCell(GetRandomBaseCenter())); if (target == null) @@ -597,7 +597,7 @@ namespace OpenRA.Mods.Common.AI List FindEnemyConstructionYards() { return World.Actors.Where(a => Player.Stances[a.Owner] == Stance.Enemy && !a.IsDead - && a.Info.Traits.Contains() && !a.Info.Traits.Contains()).ToList(); + && a.Info.HasTraitInfo() && !a.Info.HasTraitInfo()).ToList(); } void CleanSquads() @@ -707,18 +707,18 @@ namespace OpenRA.Mods.Common.AI void FindNewUnits(Actor self) { var newUnits = self.World.ActorsWithTrait() - .Where(a => a.Actor.Owner == Player && !a.Actor.Info.Traits.Contains() + .Where(a => a.Actor.Owner == Player && !a.Actor.Info.HasTraitInfo() && !activeUnits.Contains(a.Actor)) .Select(a => a.Actor); foreach (var a in newUnits) { - if (a.Info.Traits.Contains()) + if (a.Info.HasTraitInfo()) QueueOrder(new Order("Harvest", a, false)); else unitsHangingAroundTheBase.Add(a); - if (a.Info.Traits.Contains() && a.Info.Traits.Contains()) + if (a.Info.HasTraitInfo() && a.Info.HasTraitInfo()) { var air = GetSquadOfType(SquadType.Air); if (air == null) @@ -742,7 +742,7 @@ namespace OpenRA.Mods.Common.AI var attackForce = RegisterNewSquad(SquadType.Assault); foreach (var a in unitsHangingAroundTheBase) - if (!a.Info.Traits.Contains()) + if (!a.Info.HasTraitInfo()) attackForce.Units.Add(a); unitsHangingAroundTheBase.Clear(); @@ -753,7 +753,7 @@ namespace OpenRA.Mods.Common.AI { var allEnemyBaseBuilder = FindEnemyConstructionYards(); var ownUnits = activeUnits - .Where(unit => unit.Info.Traits.Contains() && !unit.Info.Traits.Contains() && unit.IsIdle).ToList(); + .Where(unit => unit.Info.HasTraitInfo() && !unit.Info.HasTraitInfo() && unit.IsIdle).ToList(); if (!allEnemyBaseBuilder.Any() || (ownUnits.Count < Info.SquadSize)) return; @@ -761,7 +761,7 @@ namespace OpenRA.Mods.Common.AI foreach (var b in allEnemyBaseBuilder) { var enemies = World.FindActorsInCircle(b.CenterPosition, WDist.FromCells(Info.RushAttackScanRadius)) - .Where(unit => Player.Stances[unit.Owner] == Stance.Enemy && unit.Info.Traits.Contains()).ToList(); + .Where(unit => Player.Stances[unit.Owner] == Stance.Enemy && unit.Info.HasTraitInfo()).ToList(); if (rushFuzzy.CanAttack(ownUnits, enemies)) { @@ -790,8 +790,8 @@ namespace OpenRA.Mods.Common.AI if (!protectSq.IsValid) { var ownUnits = World.FindActorsInCircle(World.Map.CenterOfCell(GetRandomBaseCenter()), WDist.FromCells(Info.ProtectUnitScanRadius)) - .Where(unit => unit.Owner == Player && !unit.Info.Traits.Contains() - && unit.Info.Traits.Contains()); + .Where(unit => unit.Owner == Player && !unit.Info.HasTraitInfo() + && unit.Info.HasTraitInfo()); foreach (var a in ownUnits) protectSq.Units.Add(a); @@ -832,7 +832,7 @@ namespace OpenRA.Mods.Common.AI { // Find and deploy our mcv var mcv = self.World.Actors - .FirstOrDefault(a => a.Owner == Player && a.Info.Traits.Contains()); + .FirstOrDefault(a => a.Owner == Player && a.Info.HasTraitInfo()); if (mcv != null) { @@ -841,7 +841,7 @@ namespace OpenRA.Mods.Common.AI // Don't transform the mcv if it is a fact // HACK: This needs to query against MCVs directly - if (mcv.Info.Traits.Contains()) + if (mcv.Info.HasTraitInfo()) QueueOrder(new Order("DeployTransform", mcv, false)); } else @@ -854,7 +854,7 @@ namespace OpenRA.Mods.Common.AI { // HACK: This needs to query against MCVs directly var mcvs = self.World.Actors - .Where(a => a.Owner == Player && a.Info.Traits.Contains() && a.Info.Traits.Contains()); + .Where(a => a.Owner == Player && a.Info.HasTraitInfo() && a.Info.HasTraitInfo()); if (!mcvs.Any()) return; @@ -1014,7 +1014,7 @@ namespace OpenRA.Mods.Common.AI // No construction yards - Build a new MCV if (!HasAdequateFact() && !self.World.Actors.Any(a => - a.Owner == Player && a.Info.Traits.Contains() && a.Info.Traits.Contains())) + a.Owner == Player && a.Info.HasTraitInfo() && a.Info.HasTraitInfo())) BuildUnit("Vehicle", GetUnitInfoByCommonName("Mcv", Player).Name); foreach (var q in Info.UnitQueues) @@ -1073,14 +1073,14 @@ namespace OpenRA.Mods.Common.AI if (e.Attacker.Disposed) return; - if (!e.Attacker.Info.Traits.Contains()) + if (!e.Attacker.Info.HasTraitInfo()) return; if (e.Damage > 0) aggro[e.Attacker.Owner].Aggro += e.Damage; // Protected harvesters or building - if ((self.Info.Traits.Contains() || self.Info.Traits.Contains()) && + if ((self.Info.HasTraitInfo() || self.Info.HasTraitInfo()) && Player.Stances[e.Attacker.Owner] == Stance.Enemy) { defenseCenter = e.Attacker.Location; diff --git a/OpenRA.Mods.Common/AI/Squad.cs b/OpenRA.Mods.Common/AI/Squad.cs index c21b41a7e5..9c528fe982 100644 --- a/OpenRA.Mods.Common/AI/Squad.cs +++ b/OpenRA.Mods.Common/AI/Squad.cs @@ -74,7 +74,7 @@ namespace OpenRA.Mods.Common.AI public bool IsTargetValid { - get { return Target.IsValidFor(Units.FirstOrDefault()) && !Target.Actor.Info.Traits.Contains(); } + get { return Target.IsValidFor(Units.FirstOrDefault()) && !Target.Actor.Info.HasTraitInfo(); } } public bool IsTargetVisible diff --git a/OpenRA.Mods.Common/AI/States/AirStates.cs b/OpenRA.Mods.Common/AI/States/AirStates.cs index eed023eb9f..7044941aac 100644 --- a/OpenRA.Mods.Common/AI/States/AirStates.cs +++ b/OpenRA.Mods.Common/AI/States/AirStates.cs @@ -30,7 +30,7 @@ namespace OpenRA.Mods.Common.AI var missileUnitsCount = 0; foreach (var unit in units) { - if (unit != null && unit.Info.Traits.Contains() && !unit.Info.Traits.Contains() + if (unit != null && unit.Info.HasTraitInfo() && !unit.Info.HasTraitInfo() && !unit.IsDisabled()) { var arms = unit.TraitsImplementing(); @@ -223,7 +223,7 @@ namespace OpenRA.Mods.Common.AI continue; } - if (owner.TargetActor.Info.Traits.Contains() && CanAttackTarget(a, owner.TargetActor)) + if (owner.TargetActor.Info.HasTraitInfo() && CanAttackTarget(a, owner.TargetActor)) owner.Bot.QueueOrder(new Order("Attack", a, false) { TargetActor = owner.TargetActor }); } } diff --git a/OpenRA.Mods.Common/AI/States/GroundStates.cs b/OpenRA.Mods.Common/AI/States/GroundStates.cs index 87115e3ae6..a35af0c358 100644 --- a/OpenRA.Mods.Common/AI/States/GroundStates.cs +++ b/OpenRA.Mods.Common/AI/States/GroundStates.cs @@ -95,7 +95,7 @@ namespace OpenRA.Mods.Common.AI { var enemies = owner.World.FindActorsInCircle(leader.CenterPosition, WDist.FromCells(12)) .Where(a1 => !a1.Disposed && !a1.IsDead); - var enemynearby = enemies.Where(a1 => a1.Info.Traits.Contains() && leader.Owner.Stances[a1.Owner] == Stance.Enemy); + var enemynearby = enemies.Where(a1 => a1.Info.HasTraitInfo() && leader.Owner.Stances[a1.Owner] == Stance.Enemy); var target = enemynearby.ClosestTo(leader.CenterPosition); if (target != null) { diff --git a/OpenRA.Mods.Common/AI/States/StateBase.cs b/OpenRA.Mods.Common/AI/States/StateBase.cs index 81bc6ff132..d8c5143ec1 100644 --- a/OpenRA.Mods.Common/AI/States/StateBase.cs +++ b/OpenRA.Mods.Common/AI/States/StateBase.cs @@ -60,7 +60,7 @@ namespace OpenRA.Mods.Common.AI protected static bool CanAttackTarget(Actor a, Actor target) { - if (!a.Info.Traits.Contains()) + if (!a.Info.HasTraitInfo()) return false; var targetTypes = target.TraitsImplementing().Where(Exts.IsTraitEnabled).SelectMany(t => t.TargetTypes); @@ -82,11 +82,11 @@ namespace OpenRA.Mods.Common.AI var u = squad.Units.Random(squad.Random); var units = squad.World.FindActorsInCircle(u.CenterPosition, WDist.FromCells(DangerRadius)).ToList(); - var ownBaseBuildingAround = units.Where(unit => unit.Owner == squad.Bot.Player && unit.Info.Traits.Contains()); + var ownBaseBuildingAround = units.Where(unit => unit.Owner == squad.Bot.Player && unit.Info.HasTraitInfo()); if (ownBaseBuildingAround.Any()) return false; - var enemyAroundUnit = units.Where(unit => squad.Bot.Player.Stances[unit.Owner] == Stance.Enemy && unit.Info.Traits.Contains()); + var enemyAroundUnit = units.Where(unit => squad.Bot.Player.Stances[unit.Owner] == Stance.Enemy && unit.Info.HasTraitInfo()); if (!enemyAroundUnit.Any()) return false; diff --git a/OpenRA.Mods.Common/Activities/Air/HeliAttack.cs b/OpenRA.Mods.Common/Activities/Air/HeliAttack.cs index 7840172f48..0d501ec01a 100644 --- a/OpenRA.Mods.Common/Activities/Air/HeliAttack.cs +++ b/OpenRA.Mods.Common/Activities/Air/HeliAttack.cs @@ -37,7 +37,7 @@ namespace OpenRA.Mods.Common.Activities { target = value; if (target.Type == TargetType.Actor) - canHideUnderFog = target.Actor.Info.Traits.Contains(); + canHideUnderFog = target.Actor.Info.HasTraitInfo(); } } diff --git a/OpenRA.Mods.Common/Activities/Attack.cs b/OpenRA.Mods.Common/Activities/Attack.cs index a940ff235d..9036d5fff7 100644 --- a/OpenRA.Mods.Common/Activities/Attack.cs +++ b/OpenRA.Mods.Common/Activities/Attack.cs @@ -61,7 +61,7 @@ namespace OpenRA.Mods.Common.Activities // HACK: This would otherwise break targeting frozen actors // The problem is that Shroud.IsTargetable returns false (as it should) for // frozen actors, but we do want to explicitly target the underlying actor here. - if (!attack.Info.IgnoresVisibility && type == TargetType.Actor && !Target.Actor.Info.Traits.Contains() && !self.Owner.CanTargetActor(Target.Actor)) + if (!attack.Info.IgnoresVisibility && type == TargetType.Actor && !Target.Actor.Info.HasTraitInfo() && !self.Owner.CanTargetActor(Target.Actor)) return NextActivity; // Try to move within range diff --git a/OpenRA.Mods.Common/Activities/Hunt.cs b/OpenRA.Mods.Common/Activities/Hunt.cs index 7bb9225e7a..aabac0df67 100644 --- a/OpenRA.Mods.Common/Activities/Hunt.cs +++ b/OpenRA.Mods.Common/Activities/Hunt.cs @@ -24,7 +24,7 @@ namespace OpenRA.Mods.Common.Activities { var attack = self.Trait(); targets = self.World.Actors.Where(a => self != a && !a.IsDead && a.IsInWorld && a.AppearsHostileTo(self) - && a.Info.Traits.Contains() && IsTargetable(a, self) && attack.HasAnyValidWeapons(Target.FromActor(a))); + && a.Info.HasTraitInfo() && IsTargetable(a, self) && attack.HasAnyValidWeapons(Target.FromActor(a))); } bool IsTargetable(Actor self, Actor viewer) diff --git a/OpenRA.Mods.Common/Activities/Move/MoveAdjacentTo.cs b/OpenRA.Mods.Common/Activities/Move/MoveAdjacentTo.cs index 255807ca26..d99150f2a1 100644 --- a/OpenRA.Mods.Common/Activities/Move/MoveAdjacentTo.cs +++ b/OpenRA.Mods.Common/Activities/Move/MoveAdjacentTo.cs @@ -41,7 +41,7 @@ namespace OpenRA.Mods.Common.Activities { target = value; if (target.Type == TargetType.Actor) - canHideUnderFog = target.Actor.Info.Traits.Contains(); + canHideUnderFog = target.Actor.Info.HasTraitInfo(); } } diff --git a/OpenRA.Mods.Common/Activities/Rearm.cs b/OpenRA.Mods.Common/Activities/Rearm.cs index 5fa3824933..47daa05840 100644 --- a/OpenRA.Mods.Common/Activities/Rearm.cs +++ b/OpenRA.Mods.Common/Activities/Rearm.cs @@ -49,7 +49,7 @@ namespace OpenRA.Mods.Common.Activities // HACK to check if we are on the helipad/airfield/etc. var hostBuilding = self.World.ActorMap.GetUnitsAt(self.Location) - .FirstOrDefault(a => a.Info.Traits.Contains()); + .FirstOrDefault(a => a.Info.HasTraitInfo()); if (hostBuilding == null || !hostBuilding.IsInWorld) return NextActivity; diff --git a/OpenRA.Mods.Common/ActorExts.cs b/OpenRA.Mods.Common/ActorExts.cs index 4c58c25e19..3d3633758c 100644 --- a/OpenRA.Mods.Common/ActorExts.cs +++ b/OpenRA.Mods.Common/ActorExts.cs @@ -23,7 +23,7 @@ namespace OpenRA.Mods.Common if (self.IsDead) return false; - if (!self.Info.Traits.Contains()) + if (!self.Info.HasTraitInfo()) return false; if (!self.IsInWorld) @@ -43,7 +43,7 @@ namespace OpenRA.Mods.Common if (stance == Stance.Ally) return true; - if (self.EffectiveOwner != null && self.EffectiveOwner.Disguised && !toActor.Info.Traits.Contains()) + if (self.EffectiveOwner != null && self.EffectiveOwner.Disguised && !toActor.Info.HasTraitInfo()) return toActor.Owner.Stances[self.EffectiveOwner.Owner] == Stance.Ally; return stance == Stance.Ally; @@ -55,7 +55,7 @@ namespace OpenRA.Mods.Common if (stance == Stance.Ally) return false; /* otherwise, we'll hate friendly disguised spies */ - if (self.EffectiveOwner != null && self.EffectiveOwner.Disguised && !toActor.Info.Traits.Contains()) + if (self.EffectiveOwner != null && self.EffectiveOwner.Disguised && !toActor.Info.HasTraitInfo()) return toActor.Owner.Stances[self.EffectiveOwner.Owner] == Stance.Enemy; return stance == Stance.Enemy; diff --git a/OpenRA.Mods.Common/Commands/DevCommands.cs b/OpenRA.Mods.Common/Commands/DevCommands.cs index ec71d825ee..dff76295e9 100644 --- a/OpenRA.Mods.Common/Commands/DevCommands.cs +++ b/OpenRA.Mods.Common/Commands/DevCommands.cs @@ -112,7 +112,7 @@ namespace OpenRA.Mods.Common.Commands var leveluporder = new Order("DevLevelUp", actor, false); leveluporder.ExtraData = (uint)level; - if (actor.Info.Traits.Contains()) + if (actor.Info.HasTraitInfo()) world.IssueOrder(leveluporder); } diff --git a/OpenRA.Mods.Common/EditorBrushes/EditorActorBrush.cs b/OpenRA.Mods.Common/EditorBrushes/EditorActorBrush.cs index af121d73e9..0ff3237969 100644 --- a/OpenRA.Mods.Common/EditorBrushes/EditorActorBrush.cs +++ b/OpenRA.Mods.Common/EditorBrushes/EditorActorBrush.cs @@ -116,10 +116,10 @@ namespace OpenRA.Mods.Common.Widgets var initDict = newActorReference.InitDict; - if (Actor.Traits.Contains()) + if (Actor.HasTraitInfo()) initDict.Add(new FacingInit(facing)); - if (Actor.Traits.Contains()) + if (Actor.HasTraitInfo()) initDict.Add(new TurretFacingInit(facing)); editorLayer.Add(newActorReference); diff --git a/OpenRA.Mods.Common/Effects/Bullet.cs b/OpenRA.Mods.Common/Effects/Bullet.cs index 7df4ce6e68..ac65568ad7 100644 --- a/OpenRA.Mods.Common/Effects/Bullet.cs +++ b/OpenRA.Mods.Common/Effects/Bullet.cs @@ -165,7 +165,7 @@ namespace OpenRA.Mods.Common.Effects contrail.Update(pos); if (ticks++ >= length || (info.Blockable && world.ActorMap - .GetUnitsAt(world.Map.CellContaining(pos)).Any(a => a.Info.Traits.Contains()))) + .GetUnitsAt(world.Map.CellContaining(pos)).Any(a => a.Info.HasTraitInfo()))) Explode(world); } diff --git a/OpenRA.Mods.Common/Effects/Missile.cs b/OpenRA.Mods.Common/Effects/Missile.cs index 7e8a3c7f8b..b4bdfd068e 100644 --- a/OpenRA.Mods.Common/Effects/Missile.cs +++ b/OpenRA.Mods.Common/Effects/Missile.cs @@ -201,7 +201,7 @@ namespace OpenRA.Mods.Common.Effects var shouldExplode = (pos.Z < 0) // Hit the ground || (dist.LengthSquared < info.CloseEnough.LengthSquared) // Within range || (info.RangeLimit != 0 && ticks > info.RangeLimit) // Ran out of fuel - || (info.Blockable && world.ActorMap.GetUnitsAt(cell).Any(a => a.Info.Traits.Contains())) // Hit a wall or other blocking obstacle + || (info.Blockable && world.ActorMap.GetUnitsAt(cell).Any(a => a.Info.HasTraitInfo())) // Hit a wall or other blocking obstacle || !world.Map.Contains(cell) // This also avoids an IndexOutOfRangeException in GetTerrainInfo below. || (!string.IsNullOrEmpty(info.BoundToTerrainType) && world.Map.GetTerrainInfo(cell).Type != info.BoundToTerrainType); // Hit incompatible terrain diff --git a/OpenRA.Mods.Common/Lint/CheckPlayers.cs b/OpenRA.Mods.Common/Lint/CheckPlayers.cs index 3968812ddf..9d52c86d79 100644 --- a/OpenRA.Mods.Common/Lint/CheckPlayers.cs +++ b/OpenRA.Mods.Common/Lint/CheckPlayers.cs @@ -43,7 +43,7 @@ namespace OpenRA.Mods.Common.Lint if (!string.IsNullOrWhiteSpace(player.Faction) && !factions.Contains(player.Faction)) emitError("Invalid faction {0} chosen for player {1}.".F(player.Faction, player.Name)); - if (worldActor.Traits.Contains()) + if (worldActor.HasTraitInfo()) { var multiPlayers = players.Count(p => p.Value.Playable); var spawns = map.ActorDefinitions.Where(a => a.Value.Value == "mpspawn"); diff --git a/OpenRA.Mods.Common/Orders/EnterAlliedActorTargeter.cs b/OpenRA.Mods.Common/Orders/EnterAlliedActorTargeter.cs index 390e767b87..e2cb3fb561 100644 --- a/OpenRA.Mods.Common/Orders/EnterAlliedActorTargeter.cs +++ b/OpenRA.Mods.Common/Orders/EnterAlliedActorTargeter.cs @@ -28,7 +28,7 @@ namespace OpenRA.Mods.Common.Orders public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor) { - if (!target.Info.Traits.Contains() || !canTarget(target)) + if (!target.Info.HasTraitInfo() || !canTarget(target)) return false; cursor = useEnterCursor(target) ? "enter" : "enter-blocked"; diff --git a/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs b/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs index 969468ad30..8609b0c7f7 100644 --- a/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs +++ b/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs @@ -100,7 +100,7 @@ namespace OpenRA.Mods.Common.Orders yield break; } - if (world.Map.Rules.Actors[building].Traits.Contains()) + if (world.Map.Rules.Actors[building].HasTraitInfo()) orderType = "LineBuild"; } @@ -156,7 +156,7 @@ namespace OpenRA.Mods.Common.Orders cells.Add(topLeft, AcceptsPlug(topLeft, plugInfo)); } - else if (rules.Actors[building].Traits.Contains()) + else if (rules.Actors[building].HasTraitInfo()) { // Linebuild for walls. if (buildingInfo.Dimensions.X != 1 || buildingInfo.Dimensions.Y != 1) diff --git a/OpenRA.Mods.Common/Orders/RepairOrderGenerator.cs b/OpenRA.Mods.Common/Orders/RepairOrderGenerator.cs index 32fbee25e7..7422ca2fad 100644 --- a/OpenRA.Mods.Common/Orders/RepairOrderGenerator.cs +++ b/OpenRA.Mods.Common/Orders/RepairOrderGenerator.cs @@ -41,7 +41,7 @@ namespace OpenRA.Mods.Common.Orders yield break; // Repair a building. - if (underCursor.Info.Traits.Contains()) + if (underCursor.Info.HasTraitInfo()) yield return new Order("RepairBuilding", world.LocalPlayer.PlayerActor, false) { TargetActor = underCursor }; // Test for generic Repairable (used on units). diff --git a/OpenRA.Mods.Common/Scripting/Properties/CombatProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/CombatProperties.cs index 863ddfdc15..f7f93a977d 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/CombatProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/CombatProperties.cs @@ -83,7 +83,7 @@ namespace OpenRA.Mods.Common.Scripting if (!target.IsValidFor(Self) || target.Type == TargetType.FrozenActor) Log.Write("lua", "{1} is an invalid target for {0}!", Self, targetActor); - if (!targetActor.Info.Traits.Contains() && !Self.Owner.CanTargetActor(targetActor)) + if (!targetActor.Info.HasTraitInfo() && !Self.Owner.CanTargetActor(targetActor)) Log.Write("lua", "{1} is not revealed for player {0}!", Self.Owner, targetActor); attackBase.AttackTarget(target, true, allowMove); diff --git a/OpenRA.Mods.Common/Scripting/Properties/GuardProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/GuardProperties.cs index 5e1b59b8f7..98b493c39a 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/GuardProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/GuardProperties.cs @@ -28,7 +28,7 @@ namespace OpenRA.Mods.Common.Scripting [Desc("Guard the target actor.")] public void Guard(Actor targetActor) { - if (targetActor.Info.Traits.Contains()) + if (targetActor.Info.HasTraitInfo()) guard.GuardTarget(Self, Target.FromActor(targetActor)); } } diff --git a/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs index 2ac2b0a54f..987276f682 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/PlayerProperties.cs @@ -56,7 +56,7 @@ namespace OpenRA.Mods.Common.Scripting public Actor[] GetGroundAttackers() { return Player.World.ActorsWithTrait().Select(a => a.Actor) - .Where(a => a.Owner == Player && !a.IsDead && a.IsInWorld && a.Info.Traits.Contains()) + .Where(a => a.Owner == Player && !a.IsDead && a.IsInWorld && a.Info.HasTraitInfo()) .ToArray(); } diff --git a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs index ca9907ef63..477cc294b9 100644 --- a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs @@ -120,7 +120,7 @@ namespace OpenRA.Mods.Common.Traits firstTick = false; // TODO: Aircraft husks don't properly unreserve. - if (self.Info.Traits.Contains()) + if (self.Info.HasTraitInfo()) return; ReserveSpawnBuilding(); @@ -158,7 +158,7 @@ namespace OpenRA.Mods.Common.Traits return WVec.Zero; return self.World.FindActorsInCircle(self.CenterPosition, info.IdealSeparation) - .Where(a => !a.IsDead && a.Info.Traits.Contains() && a.Info.Traits.Get().CruiseAltitude == info.CruiseAltitude) + .Where(a => !a.IsDead && a.Info.HasTraitInfo() && a.Info.Traits.Get().CruiseAltitude == info.CruiseAltitude) .Select(GetRepulsionForce) .Aggregate(WVec.Zero, (a, b) => a + b); } @@ -191,7 +191,7 @@ namespace OpenRA.Mods.Common.Traits return null; // not on the ground. return self.World.ActorMap.GetUnitsAt(self.Location) - .FirstOrDefault(a => a.Info.Traits.Contains()); + .FirstOrDefault(a => a.Info.HasTraitInfo()); } protected void ReserveSpawnBuilding() diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs index 78cf948d86..ac9e214668 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs @@ -202,7 +202,7 @@ namespace OpenRA.Mods.Common.Traits public bool IsReachableTarget(Target target, bool allowMove) { return HasAnyValidWeapons(target) - && (target.IsInRange(self.CenterPosition, GetMaximumRange()) || (allowMove && self.Info.Traits.Contains())); + && (target.IsInRange(self.CenterPosition, GetMaximumRange()) || (allowMove && self.Info.HasTraitInfo())); } class AttackOrderTargeter : IOrderTargeter diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs b/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs index 38c44274b1..d992065111 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs @@ -81,8 +81,8 @@ namespace OpenRA.Mods.Common.Traits var weapon = attack.ChooseArmamentForTarget(target); if (weapon != null) { - var targetIsMobile = (target.Type == TargetType.Actor && target.Actor.Info.Traits.Contains()) - || (target.Type == TargetType.FrozenActor && target.FrozenActor.Info.Traits.Contains()); + var targetIsMobile = (target.Type == TargetType.Actor && target.Actor.Info.HasTraitInfo()) + || (target.Type == TargetType.FrozenActor && target.FrozenActor.Info.HasTraitInfo()); // Try and sit at least one cell closer than the max range to give some leeway if the target starts moving. var maxRange = targetIsMobile ? new WDist(Math.Max(weapon.Weapon.MinRange.Length, weapon.Weapon.Range.Length - 1024)) diff --git a/OpenRA.Mods.Common/Traits/AutoTarget.cs b/OpenRA.Mods.Common/Traits/AutoTarget.cs index be1d678022..e63f549414 100644 --- a/OpenRA.Mods.Common/Traits/AutoTarget.cs +++ b/OpenRA.Mods.Common/Traits/AutoTarget.cs @@ -154,7 +154,7 @@ namespace OpenRA.Mods.Common.Traits return inRange .Where(a => a.AppearsHostileTo(self) && - !a.Info.Traits.Contains() && + !a.Info.HasTraitInfo() && attack.HasAnyValidWeapons(Target.FromActor(a)) && self.Owner.CanTargetActor(a)) .ClosestTo(self); diff --git a/OpenRA.Mods.Common/Traits/BodyOrientation.cs b/OpenRA.Mods.Common/Traits/BodyOrientation.cs index f25452a31d..5a9becc660 100644 --- a/OpenRA.Mods.Common/Traits/BodyOrientation.cs +++ b/OpenRA.Mods.Common/Traits/BodyOrientation.cs @@ -77,7 +77,7 @@ namespace OpenRA.Mods.Common.Traits // If a sprite actor has neither custom QuantizedFacings nor a trait implementing IQuantizeBodyOrientationInfo, throw if (qboi == null) { - if (self.Info.Traits.Contains()) + if (self.Info.HasTraitInfo()) throw new InvalidOperationException("Actor '" + self.Info.Name + "' has a sprite body but no facing quantization." + " Either add the QuantizeFacingsFromSequence trait or set custom QuantizedFacings on BodyOrientation."); else diff --git a/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs b/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs index b4bb963654..d3318755c9 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs @@ -201,7 +201,7 @@ namespace OpenRA.Mods.Common.Traits { foreach (var c in footprint.Keys) foreach (var a in self.World.ActorMap.GetUnitsAt(c)) - if (a.Info.Traits.Contains() && !a.Trait().CanEnterCell(c)) + if (a.Info.HasTraitInfo() && !a.Trait().CanEnterCell(c)) a.Kill(self); } diff --git a/OpenRA.Mods.Common/Traits/Buildings/Building.cs b/OpenRA.Mods.Common/Traits/Buildings/Building.cs index d7ac7860b2..c32883543b 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Building.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Building.cs @@ -87,12 +87,12 @@ namespace OpenRA.Mods.Common.Traits { var unitsAtPos = world.ActorMap.GetUnitsAt(pos).Where(a => a.IsInWorld && (a.Owner == p || (allyBuildRadius && a.Owner.Stances[p] == Stance.Ally)) - && a.Info.Traits.Contains()); + && a.Info.HasTraitInfo()); if (unitsAtPos.Any()) nearnessCandidates.Add(pos); } - else if (buildingAtPos.IsInWorld && buildingAtPos.Info.Traits.Contains() + else if (buildingAtPos.IsInWorld && buildingAtPos.Info.HasTraitInfo() && (buildingAtPos.Owner == p || (allyBuildRadius && buildingAtPos.Owner.Stances[p] == Stance.Ally))) nearnessCandidates.Add(pos); } @@ -164,7 +164,7 @@ namespace OpenRA.Mods.Common.Traits public void Created(Actor self) { - if (SkipMakeAnimation || !self.Info.Traits.Contains()) + if (SkipMakeAnimation || !self.Info.HasTraitInfo()) NotifyBuildingComplete(self); } diff --git a/OpenRA.Mods.Common/Traits/CustomBuildTimeValue.cs b/OpenRA.Mods.Common/Traits/CustomBuildTimeValue.cs index bdd7ea4c3d..9c01a4bd5f 100644 --- a/OpenRA.Mods.Common/Traits/CustomBuildTimeValue.cs +++ b/OpenRA.Mods.Common/Traits/CustomBuildTimeValue.cs @@ -30,7 +30,7 @@ namespace OpenRA.Mods.Common.Traits if (csv != null) return csv.Value; - var cost = a.Traits.Contains() ? a.Traits.Get().Cost : 0; + var cost = a.HasTraitInfo() ? a.Traits.Get().Cost : 0; var time = cost * (25 * 60) /* frames per min */ / 1000; diff --git a/OpenRA.Mods.Common/Traits/EngineerRepair.cs b/OpenRA.Mods.Common/Traits/EngineerRepair.cs index cee2c2a530..4da01c7c1a 100644 --- a/OpenRA.Mods.Common/Traits/EngineerRepair.cs +++ b/OpenRA.Mods.Common/Traits/EngineerRepair.cs @@ -101,7 +101,7 @@ namespace OpenRA.Mods.Common.Traits public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor) { - if (!target.Info.Traits.Contains()) + if (!target.Info.HasTraitInfo()) return false; if (self.Owner.Stances[target.Owner] != Stance.Ally) @@ -115,7 +115,7 @@ namespace OpenRA.Mods.Common.Traits public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) { - if (!target.Info.Traits.Contains()) + if (!target.Info.HasTraitInfo()) return false; if (self.Owner.Stances[target.Owner] != Stance.Ally) diff --git a/OpenRA.Mods.Common/Traits/Guard.cs b/OpenRA.Mods.Common/Traits/Guard.cs index bbbbd081a6..99cb0454b7 100644 --- a/OpenRA.Mods.Common/Traits/Guard.cs +++ b/OpenRA.Mods.Common/Traits/Guard.cs @@ -88,7 +88,7 @@ namespace OpenRA.Mods.Common.Traits public void Tick(World world) { - if (subjects.All(s => s.IsDead || !s.Info.Traits.Contains())) + if (subjects.All(s => s.IsDead || !s.Info.HasTraitInfo())) world.CancelInputMode(); } @@ -112,7 +112,7 @@ namespace OpenRA.Mods.Common.Traits return world.ScreenMap.ActorsAt(mi) .Where(a => !world.FogObscures(a) && !a.IsDead && a.AppearsFriendlyTo(world.LocalPlayer.PlayerActor) && - a.Info.Traits.Contains()); + a.Info.HasTraitInfo()); } } } diff --git a/OpenRA.Mods.Common/Traits/KillsSelf.cs b/OpenRA.Mods.Common/Traits/KillsSelf.cs index 9265ac1162..e045223fe8 100644 --- a/OpenRA.Mods.Common/Traits/KillsSelf.cs +++ b/OpenRA.Mods.Common/Traits/KillsSelf.cs @@ -36,7 +36,7 @@ namespace OpenRA.Mods.Common.Traits if (self.IsDead) return; - if (Info.RemoveInstead || !self.Info.Traits.Contains()) + if (Info.RemoveInstead || !self.Info.HasTraitInfo()) self.Dispose(); else self.Kill(self); diff --git a/OpenRA.Mods.Common/Traits/Mobile.cs b/OpenRA.Mods.Common/Traits/Mobile.cs index 8b432701df..d0cc2dfe45 100644 --- a/OpenRA.Mods.Common/Traits/Mobile.cs +++ b/OpenRA.Mods.Common/Traits/Mobile.cs @@ -665,7 +665,7 @@ namespace OpenRA.Mods.Common.Traits { var cellInfo = notStupidCells .SelectMany(c => self.World.ActorMap.GetUnitsAt(c) - .Where(a => a.IsIdle && a.Info.Traits.Contains()), + .Where(a => a.IsIdle && a.Info.HasTraitInfo()), (c, a) => new { Cell = c, Actor = a }) .RandomOrDefault(self.World.SharedRandom); diff --git a/OpenRA.Mods.Common/Traits/Player/AllyRepair.cs b/OpenRA.Mods.Common/Traits/Player/AllyRepair.cs index 30a2df05d2..76b089832d 100644 --- a/OpenRA.Mods.Common/Traits/Player/AllyRepair.cs +++ b/OpenRA.Mods.Common/Traits/Player/AllyRepair.cs @@ -23,7 +23,7 @@ namespace OpenRA.Mods.Common.Traits { var building = order.TargetActor; - if (building.Info.Traits.Contains()) + if (building.Info.HasTraitInfo()) if (building.AppearsFriendlyTo(self)) building.Trait().RepairBuilding(building, self.Owner); } diff --git a/OpenRA.Mods.Common/Traits/Player/BaseAttackNotifier.cs b/OpenRA.Mods.Common/Traits/Player/BaseAttackNotifier.cs index 0494ef1aa8..19c504a831 100644 --- a/OpenRA.Mods.Common/Traits/Player/BaseAttackNotifier.cs +++ b/OpenRA.Mods.Common/Traits/Player/BaseAttackNotifier.cs @@ -48,7 +48,7 @@ namespace OpenRA.Mods.Common.Traits public void Damaged(Actor self, AttackInfo e) { // only track last hit against our base - if (!self.Info.Traits.Contains()) + if (!self.Info.HasTraitInfo()) return; if (e.Attacker == null) diff --git a/OpenRA.Mods.Common/Traits/Player/HarvesterAttackNotifier.cs b/OpenRA.Mods.Common/Traits/Player/HarvesterAttackNotifier.cs index caa20dcb1a..5c17719c51 100644 --- a/OpenRA.Mods.Common/Traits/Player/HarvesterAttackNotifier.cs +++ b/OpenRA.Mods.Common/Traits/Player/HarvesterAttackNotifier.cs @@ -48,7 +48,7 @@ namespace OpenRA.Mods.Common.Traits public void Damaged(Actor self, AttackInfo e) { // only track last hit against our harvesters - if (!self.Info.Traits.Contains()) + if (!self.Info.HasTraitInfo()) return; // don't track self-damage diff --git a/OpenRA.Mods.Common/Traits/Player/PlayerStatistics.cs b/OpenRA.Mods.Common/Traits/Player/PlayerStatistics.cs index 4f96c32465..bdc75261d3 100644 --- a/OpenRA.Mods.Common/Traits/Player/PlayerStatistics.cs +++ b/OpenRA.Mods.Common/Traits/Player/PlayerStatistics.cs @@ -107,18 +107,18 @@ namespace OpenRA.Mods.Common.Traits var attackerStats = e.Attacker.Owner.PlayerActor.Trait(); var defenderStats = self.Owner.PlayerActor.Trait(); - if (self.Info.Traits.Contains()) + if (self.Info.HasTraitInfo()) { attackerStats.BuildingsKilled++; defenderStats.BuildingsDead++; } - else if (self.Info.Traits.Contains()) + else if (self.Info.HasTraitInfo()) { attackerStats.UnitsKilled++; defenderStats.UnitsDead++; } - if (self.Info.Traits.Contains()) + if (self.Info.HasTraitInfo()) { var cost = self.Info.Traits.Get().Cost; attackerStats.KillsCost += cost; diff --git a/OpenRA.Mods.Common/Traits/Player/ProductionQueue.cs b/OpenRA.Mods.Common/Traits/Player/ProductionQueue.cs index c903286bc4..e4ed86e53c 100644 --- a/OpenRA.Mods.Common/Traits/Player/ProductionQueue.cs +++ b/OpenRA.Mods.Common/Traits/Player/ProductionQueue.cs @@ -167,7 +167,7 @@ namespace OpenRA.Mods.Common.Traits return self.World.Map.Rules.Actors.Values .Where(x => x.Name[0] != '^' && - x.Traits.Contains() && + x.HasTraitInfo() && x.Traits.Get().Queue.Contains(category)); } @@ -254,7 +254,7 @@ namespace OpenRA.Mods.Common.Traits if (!bi.Queue.Contains(Info.Type)) return; /* Not built by this queue */ - var cost = unit.Traits.Contains() ? unit.Traits.Get().Cost : 0; + var cost = unit.HasTraitInfo() ? unit.Traits.Get().Cost : 0; var time = GetBuildTime(order.TargetString); if (BuildableItems().All(b => b.Name != order.TargetString)) @@ -278,7 +278,7 @@ namespace OpenRA.Mods.Common.Traits var hasPlayedSound = false; BeginProduction(new ProductionItem(this, order.TargetString, cost, playerPower, () => self.World.AddFrameEndTask(_ => { - var isBuilding = unit.Traits.Contains(); + var isBuilding = unit.HasTraitInfo(); if (isBuilding && !hasPlayedSound) hasPlayedSound = Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", Info.ReadyAudio, self.Owner.Faction.InternalName); @@ -314,7 +314,7 @@ namespace OpenRA.Mods.Common.Traits public virtual int GetBuildTime(string unitString) { var unit = self.World.Map.Rules.Actors[unitString]; - if (unit == null || !unit.Traits.Contains()) + if (unit == null || !unit.HasTraitInfo()) return 0; if (self.World.AllowDevCommands && self.Owner.PlayerActor.Trait().FastBuild) diff --git a/OpenRA.Mods.Common/Traits/Player/TechTree.cs b/OpenRA.Mods.Common/Traits/Player/TechTree.cs index cc26cbd1e7..5aabaf5021 100644 --- a/OpenRA.Mods.Common/Traits/Player/TechTree.cs +++ b/OpenRA.Mods.Common/Traits/Player/TechTree.cs @@ -36,7 +36,7 @@ namespace OpenRA.Mods.Common.Traits public void ActorChanged(Actor a) { var bi = a.Info.Traits.GetOrDefault(); - if (a.Owner == player && (a.Info.Traits.Contains() || (bi != null && bi.BuildLimit > 0))) + if (a.Owner == player && (a.Info.HasTraitInfo() || (bi != null && bi.BuildLimit > 0))) Update(); } diff --git a/OpenRA.Mods.Common/Traits/Production.cs b/OpenRA.Mods.Common/Traits/Production.cs index 99b340b268..1be4fd1c8f 100644 --- a/OpenRA.Mods.Common/Traits/Production.cs +++ b/OpenRA.Mods.Common/Traits/Production.cs @@ -40,7 +40,7 @@ namespace OpenRA.Mods.Common.Traits public Production(ActorInitializer init, ProductionInfo info) { Info = info; - occupiesSpace = init.Self.Info.Traits.Contains(); + occupiesSpace = init.Self.Info.HasTraitInfo(); rp = Exts.Lazy(() => init.Self.IsDead ? null : init.Self.TraitOrDefault()); Faction = init.Contains() ? init.Get() : init.Self.Owner.Faction.InternalName; } diff --git a/OpenRA.Mods.Common/Traits/Render/Hovers.cs b/OpenRA.Mods.Common/Traits/Render/Hovers.cs index 49e7e970b0..1b97a4509f 100644 --- a/OpenRA.Mods.Common/Traits/Render/Hovers.cs +++ b/OpenRA.Mods.Common/Traits/Render/Hovers.cs @@ -34,7 +34,7 @@ namespace OpenRA.Mods.Common.Traits public Hovers(HoversInfo info, Actor self) { this.info = info; - aircraft = self.Info.Traits.Contains(); + aircraft = self.Info.HasTraitInfo(); } public IEnumerable ModifyRender(Actor self, WorldRenderer wr, IEnumerable r) diff --git a/OpenRA.Mods.Common/Traits/Render/WithBuildingPlacedAnimation.cs b/OpenRA.Mods.Common/Traits/Render/WithBuildingPlacedAnimation.cs index b074d5194e..36a7fe6779 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithBuildingPlacedAnimation.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithBuildingPlacedAnimation.cs @@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Traits { this.info = info; wsb = self.Trait(); - buildComplete = !self.Info.Traits.Contains(); + buildComplete = !self.Info.HasTraitInfo(); } public void BuildingComplete(Actor self) diff --git a/OpenRA.Mods.Common/Traits/Render/WithBuildingPlacedOverlay.cs b/OpenRA.Mods.Common/Traits/Render/WithBuildingPlacedOverlay.cs index 4a5085cf7c..fe322347d9 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithBuildingPlacedOverlay.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithBuildingPlacedOverlay.cs @@ -41,7 +41,7 @@ namespace OpenRA.Mods.Common.Traits var rs = self.Trait(); var body = self.Trait(); - buildComplete = !self.Info.Traits.Contains(); // always render instantly for units + buildComplete = !self.Info.HasTraitInfo(); // always render instantly for units overlay = new Animation(self.World, rs.GetImage(self)); diff --git a/OpenRA.Mods.Common/Traits/Render/WithDockingOverlay.cs b/OpenRA.Mods.Common/Traits/Render/WithDockingOverlay.cs index a650248977..a6ba429239 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithDockingOverlay.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithDockingOverlay.cs @@ -46,7 +46,7 @@ namespace OpenRA.Mods.Common.Traits var rs = self.Trait(); var body = self.Trait(); - buildComplete = !self.Info.Traits.Contains(); // always render instantly for units + buildComplete = !self.Info.HasTraitInfo(); // always render instantly for units var overlay = new Animation(self.World, rs.GetImage(self)); overlay.Play(info.Sequence); diff --git a/OpenRA.Mods.Common/Traits/Render/WithIdleOverlay.cs b/OpenRA.Mods.Common/Traits/Render/WithIdleOverlay.cs index d0fa673e3e..7551e5da45 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithIdleOverlay.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithIdleOverlay.cs @@ -68,7 +68,7 @@ namespace OpenRA.Mods.Common.Traits var rs = self.Trait(); var body = self.Trait(); - buildComplete = !self.Info.Traits.Contains(); // always render instantly for units + buildComplete = !self.Info.HasTraitInfo(); // always render instantly for units overlay = new Animation(self.World, rs.GetImage(self)); if (info.StartSequence != null) overlay.PlayThen(RenderSprites.NormalizeSequence(overlay, self.GetDamageState(), info.StartSequence), diff --git a/OpenRA.Mods.Common/Traits/Render/WithProductionOverlay.cs b/OpenRA.Mods.Common/Traits/Render/WithProductionOverlay.cs index 26000f049f..53a6b94b51 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithProductionOverlay.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithProductionOverlay.cs @@ -51,7 +51,7 @@ namespace OpenRA.Mods.Common.Traits var rs = self.Trait(); var body = self.Trait(); - buildComplete = !self.Info.Traits.Contains(); // always render instantly for units + buildComplete = !self.Info.HasTraitInfo(); // always render instantly for units production = self.Info.Traits.Get(); overlay = new Animation(self.World, rs.GetImage(self)); diff --git a/OpenRA.Mods.Common/Traits/Render/WithRepairOverlay.cs b/OpenRA.Mods.Common/Traits/Render/WithRepairOverlay.cs index 9a5355bdf9..0276d63150 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithRepairOverlay.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithRepairOverlay.cs @@ -45,7 +45,7 @@ namespace OpenRA.Mods.Common.Traits var rs = self.Trait(); var body = self.Trait(); - buildComplete = !self.Info.Traits.Contains(); // always render instantly for units + buildComplete = !self.Info.HasTraitInfo(); // always render instantly for units overlay = new Animation(self.World, rs.GetImage(self)); overlay.Play(info.Sequence); diff --git a/OpenRA.Mods.Common/Traits/Sound/AmbientSound.cs b/OpenRA.Mods.Common/Traits/Sound/AmbientSound.cs index 80f1a7e52f..2fd7b4cdaf 100644 --- a/OpenRA.Mods.Common/Traits/Sound/AmbientSound.cs +++ b/OpenRA.Mods.Common/Traits/Sound/AmbientSound.cs @@ -25,7 +25,7 @@ namespace OpenRA.Mods.Common.Traits { public AmbientSound(Actor self, AmbientSoundInfo info) { - if (self.Info.Traits.Contains()) + if (self.Info.HasTraitInfo()) Sound.PlayLooped(info.SoundFile, self.CenterPosition); else Sound.PlayLooped(info.SoundFile); diff --git a/OpenRA.Mods.Common/Traits/SupplyTruck.cs b/OpenRA.Mods.Common/Traits/SupplyTruck.cs index ae3ca5f03b..4e50156630 100644 --- a/OpenRA.Mods.Common/Traits/SupplyTruck.cs +++ b/OpenRA.Mods.Common/Traits/SupplyTruck.cs @@ -82,12 +82,12 @@ namespace OpenRA.Mods.Common.Traits public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor) { - return target.Info.Traits.Contains(); + return target.Info.HasTraitInfo(); } public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) { - return target.Info.Traits.Contains(); + return target.Info.HasTraitInfo(); } } } diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs b/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs index 1a93ecb8ff..908ae81489 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs @@ -78,7 +78,7 @@ namespace OpenRA.Mods.Common.Traits void ActorRemoved(Actor a) { - if (a.Owner != Self.Owner || !a.Info.Traits.Contains()) + if (a.Owner != Self.Owner || !a.Info.HasTraitInfo()) return; foreach (var t in a.TraitsImplementing()) @@ -119,7 +119,7 @@ namespace OpenRA.Mods.Common.Traits public IEnumerable GetPowersForActor(Actor a) { - if (a.Owner != Self.Owner || !a.Info.Traits.Contains()) + if (a.Owner != Self.Owner || !a.Info.HasTraitInfo()) return NoInstances; return a.TraitsImplementing() diff --git a/OpenRA.Mods.Common/Traits/Targetable.cs b/OpenRA.Mods.Common/Traits/Targetable.cs index ff7397bcfc..ca2d0c55e3 100644 --- a/OpenRA.Mods.Common/Traits/Targetable.cs +++ b/OpenRA.Mods.Common/Traits/Targetable.cs @@ -40,7 +40,7 @@ namespace OpenRA.Mods.Common.Traits { if (IsTraitDisabled) return false; - if (cloak == null || (!viewer.IsDead && viewer.Info.Traits.Contains())) + if (cloak == null || (!viewer.IsDead && viewer.Info.HasTraitInfo())) return true; return cloak.IsVisible(self, viewer.Owner); diff --git a/OpenRA.Mods.Common/Traits/Transforms.cs b/OpenRA.Mods.Common/Traits/Transforms.cs index 739cb293f7..2eefdbf77b 100644 --- a/OpenRA.Mods.Common/Traits/Transforms.cs +++ b/OpenRA.Mods.Common/Traits/Transforms.cs @@ -109,10 +109,10 @@ namespace OpenRA.Mods.Common.Traits if (!queued) self.CancelActivity(); - if (self.Info.Traits.Contains()) + if (self.Info.HasTraitInfo()) self.QueueActivity(new Turn(self, info.Facing)); - if (self.Info.Traits.Contains()) + if (self.Info.HasTraitInfo()) self.QueueActivity(new HeliLand(self, true)); foreach (var nt in self.TraitsImplementing()) diff --git a/OpenRA.Mods.Common/Traits/World/DomainIndex.cs b/OpenRA.Mods.Common/Traits/World/DomainIndex.cs index a998bcccfc..b348e427d0 100644 --- a/OpenRA.Mods.Common/Traits/World/DomainIndex.cs +++ b/OpenRA.Mods.Common/Traits/World/DomainIndex.cs @@ -28,7 +28,7 @@ namespace OpenRA.Mods.Common.Traits { domainIndexes = new Dictionary(); var movementClasses = - world.Map.Rules.Actors.Where(ai => ai.Value.Traits.Contains()) + world.Map.Rules.Actors.Where(ai => ai.Value.HasTraitInfo()) .Select(ai => (uint)ai.Value.Traits.Get().GetMovementClass(world.TileSet)).Distinct(); foreach (var mc in movementClasses) diff --git a/OpenRA.Mods.Common/TraitsInterfaces.cs b/OpenRA.Mods.Common/TraitsInterfaces.cs index a508234b20..eba8970756 100644 --- a/OpenRA.Mods.Common/TraitsInterfaces.cs +++ b/OpenRA.Mods.Common/TraitsInterfaces.cs @@ -45,8 +45,8 @@ namespace OpenRA.Mods.Common.Traits public interface INotifyCharging { void Charging(Actor self, Target target); } public interface INotifyChat { bool OnChat(string from, string message); } public interface INotifyParachuteLanded { void OnLanded(); } - public interface IRenderActorPreviewInfo { IEnumerable RenderPreview(ActorPreviewInitializer init); } - public interface ICruiseAltitudeInfo { WDist GetCruiseAltitude(); } + public interface IRenderActorPreviewInfo : ITraitInfo { IEnumerable RenderPreview(ActorPreviewInitializer init); } + public interface ICruiseAltitudeInfo : ITraitInfo { WDist GetCruiseAltitude(); } public interface IUpgradable { diff --git a/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorSelectorLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorSelectorLogic.cs index 8b2330c5ef..59b9455d6b 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorSelectorLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorSelectorLogic.cs @@ -92,10 +92,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic foreach (var a in actors) { var actor = a; - if (actor.Traits.Contains()) // bridge layer takes care about that automatically + if (actor.HasTraitInfo()) // bridge layer takes care about that automatically continue; - if (!actor.Traits.Contains()) + if (!actor.HasTraitInfo()) continue; var filter = actor.Traits.GetOrDefault(); diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs index 1640d5df00..22738ad709 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ObserverStatsLogic.cs @@ -245,7 +245,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic .Sum(a => a.Info.Traits.WithInterface().First().Cost); var harvesters = template.Get("HARVESTERS"); - harvesters.GetText = () => world.Actors.Count(a => a.Owner == player && !a.IsDead && a.Info.Traits.Contains()).ToString(); + harvesters.GetText = () => world.Actors.Count(a => a.Owner == player && !a.IsDead && a.Info.HasTraitInfo()).ToString(); return template; } @@ -280,7 +280,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic { return ScrollItemWidget.Setup(template, () => false, () => { - var playerBase = world.Actors.FirstOrDefault(a => !a.IsDead && a.Info.Traits.Contains() && a.Owner == player); + var playerBase = world.Actors.FirstOrDefault(a => !a.IsDead && a.Info.HasTraitInfo() && a.Owner == player); if (playerBase != null) worldRenderer.Viewport.Center(playerBase.CenterPosition); }); diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ProductionTooltipLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ProductionTooltipLogic.cs index 13f05dceaa..1b0b575c2d 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ProductionTooltipLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ProductionTooltipLogic.cs @@ -113,7 +113,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic static string ActorName(Ruleset rules, string a) { ActorInfo ai; - if (rules.Actors.TryGetValue(a.ToLowerInvariant(), out ai) && ai.Traits.Contains()) + if (rules.Actors.TryGetValue(a.ToLowerInvariant(), out ai) && ai.HasTraitInfo()) return ai.Traits.Get().Name; return a; diff --git a/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs b/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs index 5fad243947..07441be01f 100644 --- a/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs @@ -197,7 +197,7 @@ namespace OpenRA.Mods.Common.Widgets { var actor = World.Map.Rules.Actors[icon.Name]; - if (item != null && item.Done && actor.Traits.Contains()) + if (item != null && item.Done && actor.HasTraitInfo()) { World.OrderGenerator = new PlaceBuildingOrderGenerator(CurrentQueue, icon.Name); return true; diff --git a/OpenRA.Mods.Common/Widgets/ProductionTabsWidget.cs b/OpenRA.Mods.Common/Widgets/ProductionTabsWidget.cs index 135540d336..1ab187b29e 100644 --- a/OpenRA.Mods.Common/Widgets/ProductionTabsWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ProductionTabsWidget.cs @@ -198,7 +198,7 @@ namespace OpenRA.Mods.Common.Widgets // Is added to world.ActorAdded by the SidebarLogic handler public void ActorChanged(Actor a) { - if (a.Info.Traits.Contains()) + if (a.Info.HasTraitInfo()) { var allQueues = a.World.ActorsWithTrait() .Where(p => p.Actor.Owner == p.Actor.World.LocalPlayer && p.Actor.IsInWorld && p.Trait.Enabled) diff --git a/OpenRA.Mods.Common/Widgets/ViewportControllerWidget.cs b/OpenRA.Mods.Common/Widgets/ViewportControllerWidget.cs index e3d5f31122..407d4c411b 100644 --- a/OpenRA.Mods.Common/Widgets/ViewportControllerWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ViewportControllerWidget.cs @@ -106,7 +106,7 @@ namespace OpenRA.Mods.Common.Widgets } var underCursor = world.ScreenMap.ActorsAt(worldRenderer.Viewport.ViewToWorldPx(Viewport.LastMousePos)) - .Where(a => !world.FogObscures(a) && a.Info.Traits.Contains()) + .Where(a => !world.FogObscures(a) && a.Info.HasTraitInfo()) .WithHighestSelectionPriority(); if (underCursor != null) diff --git a/OpenRA.Mods.Common/Widgets/WorldCommandWidget.cs b/OpenRA.Mods.Common/Widgets/WorldCommandWidget.cs index a3b48bfdb4..a91c994f8f 100644 --- a/OpenRA.Mods.Common/Widgets/WorldCommandWidget.cs +++ b/OpenRA.Mods.Common/Widgets/WorldCommandWidget.cs @@ -177,7 +177,7 @@ namespace OpenRA.Mods.Common.Widgets bool PerformGuard() { var actors = world.Selection.Actors - .Where(a => !a.Disposed && a.Owner == world.LocalPlayer && a.Info.Traits.Contains()); + .Where(a => !a.Disposed && a.Owner == world.LocalPlayer && a.Info.HasTraitInfo()); if (actors.Any()) world.OrderGenerator = new GuardOrderGenerator(actors); @@ -197,7 +197,7 @@ namespace OpenRA.Mods.Common.Widgets { var building = world.ActorsWithTrait() .Select(b => b.Actor) - .FirstOrDefault(a => a.Owner == world.LocalPlayer && a.Info.Traits.Contains()); + .FirstOrDefault(a => a.Owner == world.LocalPlayer && a.Info.HasTraitInfo()); // No buildings left if (building == null) @@ -223,7 +223,7 @@ namespace OpenRA.Mods.Common.Widgets bool CycleProductionBuildings() { var facilities = world.ActorsWithTrait() - .Where(a => a.Actor.Owner == world.LocalPlayer && !a.Actor.Info.Traits.Contains()) + .Where(a => a.Actor.Owner == world.LocalPlayer && !a.Actor.Info.HasTraitInfo()) .OrderBy(f => f.Actor.Info.Traits.Get().Produces.First()) .Select(b => b.Actor) .ToList(); diff --git a/OpenRA.Mods.D2k/Activities/SwallowActor.cs b/OpenRA.Mods.D2k/Activities/SwallowActor.cs index 389a6536bd..a6720d9745 100644 --- a/OpenRA.Mods.D2k/Activities/SwallowActor.cs +++ b/OpenRA.Mods.D2k/Activities/SwallowActor.cs @@ -79,7 +79,7 @@ namespace OpenRA.Mods.D2k.Activities actor1.Dispose(); // Harvester insurance - if (!actor1.Info.Traits.Contains()) + if (!actor1.Info.HasTraitInfo()) return; var insurance = actor1.Owner.PlayerActor.TraitOrDefault(); diff --git a/OpenRA.Mods.D2k/Traits/Carryable.cs b/OpenRA.Mods.D2k/Traits/Carryable.cs index cad10371eb..e484a3e928 100644 --- a/OpenRA.Mods.D2k/Traits/Carryable.cs +++ b/OpenRA.Mods.D2k/Traits/Carryable.cs @@ -117,7 +117,7 @@ namespace OpenRA.Mods.D2k.Traits { // HACK: Harvesters need special treatment to avoid getting stuck on resource fields, // so if a Harvester's afterLandActivity is not DeliverResources, queue a new FindResources activity - var findResources = self.Info.Traits.Contains() && !(afterLandActivity is DeliverResources); + var findResources = self.Info.HasTraitInfo() && !(afterLandActivity is DeliverResources); if (findResources) self.QueueActivity(new FindResources(self)); else diff --git a/OpenRA.Mods.D2k/Traits/Render/WithDeliveryOverlay.cs b/OpenRA.Mods.D2k/Traits/Render/WithDeliveryOverlay.cs index cd86d62c42..d11e2e1bad 100644 --- a/OpenRA.Mods.D2k/Traits/Render/WithDeliveryOverlay.cs +++ b/OpenRA.Mods.D2k/Traits/Render/WithDeliveryOverlay.cs @@ -49,7 +49,7 @@ namespace OpenRA.Mods.D2k.Traits var body = self.Trait(); // always render instantly for units - buildComplete = !self.Info.Traits.Contains(); + buildComplete = !self.Info.HasTraitInfo(); var overlay = new Animation(self.World, rs.GetImage(self)); overlay.Play(info.Sequence); diff --git a/OpenRA.Mods.D2k/Traits/Sandworm.cs b/OpenRA.Mods.D2k/Traits/Sandworm.cs index ce8c0d2e5c..56ba0fff57 100644 --- a/OpenRA.Mods.D2k/Traits/Sandworm.cs +++ b/OpenRA.Mods.D2k/Traits/Sandworm.cs @@ -99,7 +99,7 @@ namespace OpenRA.Mods.D2k.Traits targetCountdown = Info.TargetRescanInterval; // If close enough, we don't care about other actors. - var target = self.World.FindActorsInCircle(self.CenterPosition, Info.IgnoreNoiseAttackRange).FirstOrDefault(x => x.Info.Traits.Contains()); + var target = self.World.FindActorsInCircle(self.CenterPosition, Info.IgnoreNoiseAttackRange).FirstOrDefault(x => x.Info.HasTraitInfo()); if (target != null) { self.CancelActivity(); @@ -109,7 +109,7 @@ namespace OpenRA.Mods.D2k.Traits Func isValidTarget = a => { - if (!a.Info.Traits.Contains()) + if (!a.Info.HasTraitInfo()) return false; return mobile.CanEnterCell(a.Location, null, false); diff --git a/OpenRA.Mods.RA/Activities/Infiltrate.cs b/OpenRA.Mods.RA/Activities/Infiltrate.cs index 1f7c23fad8..8edc101ee4 100644 --- a/OpenRA.Mods.RA/Activities/Infiltrate.cs +++ b/OpenRA.Mods.RA/Activities/Infiltrate.cs @@ -50,7 +50,7 @@ namespace OpenRA.Mods.RA.Activities self.Dispose(); - if (target.Info.Traits.Contains()) + if (target.Info.HasTraitInfo()) Sound.PlayToPlayer(self.Owner, "bldginf1.aud"); } } diff --git a/OpenRA.Mods.RA/Traits/Buildings/ClonesProducedUnits.cs b/OpenRA.Mods.RA/Traits/Buildings/ClonesProducedUnits.cs index f8abd6b7cf..69a27be08b 100644 --- a/OpenRA.Mods.RA/Traits/Buildings/ClonesProducedUnits.cs +++ b/OpenRA.Mods.RA/Traits/Buildings/ClonesProducedUnits.cs @@ -41,7 +41,7 @@ namespace OpenRA.Mods.RA.Traits public void UnitProducedByOther(Actor self, Actor producer, Actor produced) { // No recursive cloning! - if (producer.Owner != self.Owner || producer.Info.Traits.Contains()) + if (producer.Owner != self.Owner || producer.Info.HasTraitInfo()) return; var ci = produced.Info.Traits.GetOrDefault(); diff --git a/OpenRA.Mods.RA/Traits/Chronoshiftable.cs b/OpenRA.Mods.RA/Traits/Chronoshiftable.cs index f5c4a5774b..43d9318084 100644 --- a/OpenRA.Mods.RA/Traits/Chronoshiftable.cs +++ b/OpenRA.Mods.RA/Traits/Chronoshiftable.cs @@ -64,7 +64,7 @@ namespace OpenRA.Mods.RA.Traits public virtual bool CanChronoshiftTo(Actor self, CPos targetLocation) { // TODO: Allow enemy units to be chronoshifted into bad terrain to kill them - return self.Info.Traits.Contains() && self.Trait().CanEnterCell(targetLocation); + return self.Info.HasTraitInfo() && self.Trait().CanEnterCell(targetLocation); } public virtual bool Teleport(Actor self, CPos targetLocation, int duration, bool killCargo, Actor chronosphere) diff --git a/OpenRA.Mods.RA/Traits/Mine.cs b/OpenRA.Mods.RA/Traits/Mine.cs index 068fdcc293..849e5236eb 100644 --- a/OpenRA.Mods.RA/Traits/Mine.cs +++ b/OpenRA.Mods.RA/Traits/Mine.cs @@ -39,7 +39,7 @@ namespace OpenRA.Mods.RA.Traits public void OnCrush(Actor crusher) { - if (crusher.Info.Traits.Contains() || (self.Owner.Stances[crusher.Owner] == Stance.Ally && info.AvoidFriendly)) + if (crusher.Info.HasTraitInfo() || (self.Owner.Stances[crusher.Owner] == Stance.Ally && info.AvoidFriendly)) return; var mobile = crusher.TraitOrDefault(); diff --git a/OpenRA.Mods.RA/Traits/Minelayer.cs b/OpenRA.Mods.RA/Traits/Minelayer.cs index 02be6e3bef..d29d2f8cda 100644 --- a/OpenRA.Mods.RA/Traits/Minelayer.cs +++ b/OpenRA.Mods.RA/Traits/Minelayer.cs @@ -154,7 +154,7 @@ namespace OpenRA.Mods.RA.Traits var underCursor = world.ScreenMap.ActorsAt(mi) .Where(a => !world.FogObscures(a)) - .MaxByOrDefault(a => a.Info.Traits.Contains() + .MaxByOrDefault(a => a.Info.HasTraitInfo() ? a.Info.Traits.Get().Priority : int.MinValue); if (mi.Button == Game.Settings.Game.MouseButtonPreference.Action && underCursor == null) diff --git a/OpenRA.Mods.RA/Traits/SupportPowers/ChronoshiftPower.cs b/OpenRA.Mods.RA/Traits/SupportPowers/ChronoshiftPower.cs index 0c7ebdf689..43f4e623b8 100644 --- a/OpenRA.Mods.RA/Traits/SupportPowers/ChronoshiftPower.cs +++ b/OpenRA.Mods.RA/Traits/SupportPowers/ChronoshiftPower.cs @@ -64,7 +64,7 @@ namespace OpenRA.Mods.RA.Traits foreach (var t in tiles) units.UnionWith(Self.World.ActorMap.GetUnitsAt(t)); - return units.Where(a => a.Info.Traits.Contains() && + return units.Where(a => a.Info.HasTraitInfo() && !a.TraitsImplementing().Any(condition => condition.PreventsTeleport(a))); } From 6970959ef11359cd006d2355b1ce0c46428c92b0 Mon Sep 17 00:00:00 2001 From: atlimit8 Date: Sun, 2 Aug 2015 18:31:57 -0500 Subject: [PATCH 3/4] .Trait[OrDefault] => .Info.Traits.Get[OrDefault] where applicable --- OpenRA.Mods.Common/AI/AttackOrFleeFuzzy.cs | 2 +- .../Activities/Air/HeliReturn.cs | 12 +++----- .../Activities/DeliverResources.cs | 4 +-- .../Activities/SpriteHarvesterDockSequence.cs | 8 ++--- .../Scripting/Global/ReinforcementsGlobal.cs | 4 +-- OpenRA.Mods.Common/Traits/Buildings/Bridge.cs | 6 ++-- .../Traits/Buildings/BuildingInfluence.cs | 8 ++--- OpenRA.Mods.Common/Traits/Capturable.cs | 4 +-- .../Traits/CombatDebugOverlay.cs | 14 ++++----- .../Traits/ExternalCapturable.cs | 4 +-- OpenRA.Mods.Common/Traits/Harvester.cs | 30 +++++++++---------- OpenRA.Mods.Common/Traits/ProximityCaptor.cs | 15 ++-------- .../Traits/ProximityCapturable.cs | 4 +-- .../Traits/Render/WithDockingAnimation.cs | 14 ++------- .../LoadIngamePlayerOrObserverUILogic.cs | 4 +-- OpenRA.Mods.D2k/Traits/Carryall.cs | 3 +- 16 files changed, 55 insertions(+), 81 deletions(-) diff --git a/OpenRA.Mods.Common/AI/AttackOrFleeFuzzy.cs b/OpenRA.Mods.Common/AI/AttackOrFleeFuzzy.cs index a102996dbb..2a0553fab6 100644 --- a/OpenRA.Mods.Common/AI/AttackOrFleeFuzzy.cs +++ b/OpenRA.Mods.Common/AI/AttackOrFleeFuzzy.cs @@ -208,7 +208,7 @@ namespace OpenRA.Mods.Common.AI protected float RelativeSpeed(IEnumerable own, IEnumerable enemy) { - return RelativeValue(own, enemy, 100, Average, (Actor a) => a.Trait().Info.Speed); + return RelativeValue(own, enemy, 100, Average, (Actor a) => a.Info.Traits.Get().Speed); } protected static float RelativeValue(IEnumerable own, IEnumerable enemy, float normalizeByValue, diff --git a/OpenRA.Mods.Common/Activities/Air/HeliReturn.cs b/OpenRA.Mods.Common/Activities/Air/HeliReturn.cs index 24a0c7896d..27cb96e534 100644 --- a/OpenRA.Mods.Common/Activities/Air/HeliReturn.cs +++ b/OpenRA.Mods.Common/Activities/Air/HeliReturn.cs @@ -17,20 +17,16 @@ namespace OpenRA.Mods.Common.Activities { public class HeliReturn : Activity { - readonly AircraftInfo aircraftInfo; readonly Helicopter heli; - readonly HelicopterInfo heliInfo; public HeliReturn(Actor self) { - aircraftInfo = self.Info.Traits.Get(); heli = self.Trait(); - heliInfo = self.Info.Traits.Get(); } - public static Actor ChooseHelipad(Actor self) + public Actor ChooseHelipad(Actor self) { - var rearmBuildings = self.Info.Traits.Get().RearmBuildings; + var rearmBuildings = heli.Info.RearmBuildings; return self.World.Actors.Where(a => a.Owner == self.Owner).FirstOrDefault( a => rearmBuildings.Contains(a.Info.Name) && !Reservable.IsReserved(a)); } @@ -41,11 +37,11 @@ namespace OpenRA.Mods.Common.Activities return NextActivity; var dest = ChooseHelipad(self); - var initialFacing = aircraftInfo.InitialFacing; + var initialFacing = heli.Info.InitialFacing; if (dest == null) { - var rearmBuildings = heliInfo.RearmBuildings; + var rearmBuildings = heli.Info.RearmBuildings; var nearestHpad = self.World.ActorsWithTrait() .Where(a => a.Actor.Owner == self.Owner && rearmBuildings.Contains(a.Actor.Info.Name)) .Select(a => a.Actor) diff --git a/OpenRA.Mods.Common/Activities/DeliverResources.cs b/OpenRA.Mods.Common/Activities/DeliverResources.cs index 5983ba1190..bffbddee68 100644 --- a/OpenRA.Mods.Common/Activities/DeliverResources.cs +++ b/OpenRA.Mods.Common/Activities/DeliverResources.cs @@ -21,7 +21,6 @@ namespace OpenRA.Mods.Common.Activities readonly IMove movement; readonly Harvester harv; - readonly HarvesterInfo harvInfo; bool isDocking; int chosenTicks; @@ -30,7 +29,6 @@ namespace OpenRA.Mods.Common.Activities { movement = self.Trait(); harv = self.Trait(); - harvInfo = self.Info.Traits.Get(); } public override Activity Tick(Actor self) @@ -57,7 +55,7 @@ namespace OpenRA.Mods.Common.Activities // No refineries exist; check again after delay defined in Harvester. if (harv.LinkedProc == null) - return Util.SequenceActivities(new Wait(harvInfo.SearchForDeliveryBuildingDelay), this); + return Util.SequenceActivities(new Wait(harv.Info.SearchForDeliveryBuildingDelay), this); var proc = harv.LinkedProc; var iao = proc.Trait(); diff --git a/OpenRA.Mods.Common/Activities/SpriteHarvesterDockSequence.cs b/OpenRA.Mods.Common/Activities/SpriteHarvesterDockSequence.cs index 89da5f73bf..ddf4773e3f 100644 --- a/OpenRA.Mods.Common/Activities/SpriteHarvesterDockSequence.cs +++ b/OpenRA.Mods.Common/Activities/SpriteHarvesterDockSequence.cs @@ -16,13 +16,13 @@ namespace OpenRA.Mods.Common.Activities public class SpriteHarvesterDockSequence : HarvesterDockSequence { readonly WithSpriteBody wsb; - readonly WithDockingAnimation wda; + readonly WithDockingAnimationInfo wda; public SpriteHarvesterDockSequence(Actor self, Actor refinery, int dockAngle, bool isDragRequired, WVec dragOffset, int dragLength) : base(self, refinery, dockAngle, isDragRequired, dragOffset, dragLength) { wsb = self.Trait(); - wda = self.Trait(); + wda = self.Info.Traits.Get(); } public override Activity OnStateDock(Actor self) @@ -30,14 +30,14 @@ namespace OpenRA.Mods.Common.Activities foreach (var trait in self.TraitsImplementing()) trait.Docked(); - wsb.PlayCustomAnimation(self, wda.Info.DockSequence, () => wsb.PlayCustomAnimationRepeating(self, wda.Info.DockLoopSequence)); + wsb.PlayCustomAnimation(self, wda.DockSequence, () => wsb.PlayCustomAnimationRepeating(self, wda.DockLoopSequence)); dockingState = State.Loop; return this; } public override Activity OnStateUndock(Actor self) { - wsb.PlayCustomAnimationBackwards(self, wda.Info.DockSequence, + wsb.PlayCustomAnimationBackwards(self, wda.DockSequence, () => { dockingState = State.Complete; diff --git a/OpenRA.Mods.Common/Scripting/Global/ReinforcementsGlobal.cs b/OpenRA.Mods.Common/Scripting/Global/ReinforcementsGlobal.cs index 9472e0315f..c8bf726376 100644 --- a/OpenRA.Mods.Common/Scripting/Global/ReinforcementsGlobal.cs +++ b/OpenRA.Mods.Common/Scripting/Global/ReinforcementsGlobal.cs @@ -137,10 +137,10 @@ namespace OpenRA.Mods.Common.Scripting } else { - var heli = transport.TraitOrDefault(); + var heli = transport.Info.Traits.GetOrDefault(); if (heli != null) { - transport.QueueActivity(new Turn(transport, heli.Info.InitialFacing)); + transport.QueueActivity(new Turn(transport, heli.InitialFacing)); transport.QueueActivity(new HeliLand(transport, true)); transport.QueueActivity(new Wait(15)); } diff --git a/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs b/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs index d3318755c9..23df972704 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs @@ -70,7 +70,7 @@ namespace OpenRA.Mods.Common.Traits class Bridge : IRender, INotifyDamageStateChanged { - readonly Building building; + readonly BuildingInfo building; readonly Bridge[] neighbours = new Bridge[2]; readonly BridgeHut[] huts = new BridgeHut[2]; // Huts before this / first & after this / last readonly Health health; @@ -93,7 +93,7 @@ namespace OpenRA.Mods.Common.Traits this.info = info; type = self.Info.Name; isDangling = new Lazy(() => huts[0] == huts[1] && (neighbours[0] == null || neighbours[1] == null)); - building = self.Trait(); + building = self.Info.Traits.Get(); } public Bridge Neighbour(int direction) { return neighbours[direction]; } @@ -173,7 +173,7 @@ namespace OpenRA.Mods.Common.Traits IRenderable[] TemplateRenderables(WorldRenderer wr, PaletteReference palette, ushort template) { - var offset = FootprintUtils.CenterOffset(self.World, building.Info).Y + 1024; + var offset = FootprintUtils.CenterOffset(self.World, building).Y + 1024; return footprint.Select(c => (IRenderable)(new SpriteRenderable( wr.Theater.TileSprite(new TerrainTile(template, c.Value)), diff --git a/OpenRA.Mods.Common/Traits/Buildings/BuildingInfluence.cs b/OpenRA.Mods.Common/Traits/Buildings/BuildingInfluence.cs index e4419943c2..b15743b5eb 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/BuildingInfluence.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/BuildingInfluence.cs @@ -31,22 +31,22 @@ namespace OpenRA.Mods.Common.Traits world.ActorAdded += a => { - var b = a.TraitOrDefault(); + var b = a.Info.Traits.GetOrDefault(); if (b == null) return; - foreach (var u in FootprintUtils.Tiles(map.Rules, a.Info.Name, b.Info, a.Location)) + foreach (var u in FootprintUtils.Tiles(map.Rules, a.Info.Name, b, a.Location)) if (influence.Contains(u) && influence[u] == null) influence[u] = a; }; world.ActorRemoved += a => { - var b = a.TraitOrDefault(); + var b = a.Info.Traits.GetOrDefault(); if (b == null) return; - foreach (var u in FootprintUtils.Tiles(map.Rules, a.Info.Name, b.Info, a.Location)) + foreach (var u in FootprintUtils.Tiles(map.Rules, a.Info.Name, b, a.Location)) if (influence.Contains(u) && influence[u] == a) influence[u] = null; }; diff --git a/OpenRA.Mods.Common/Traits/Capturable.cs b/OpenRA.Mods.Common/Traits/Capturable.cs index 85f5af6fb6..c45634b2ac 100644 --- a/OpenRA.Mods.Common/Traits/Capturable.cs +++ b/OpenRA.Mods.Common/Traits/Capturable.cs @@ -29,7 +29,7 @@ namespace OpenRA.Mods.Common.Traits public bool CanBeTargetedBy(Actor captor, Player owner) { - var c = captor.TraitOrDefault(); + var c = captor.Info.Traits.GetOrDefault(); if (c == null) return false; @@ -43,7 +43,7 @@ namespace OpenRA.Mods.Common.Traits if (playerRelationship == Stance.Neutral && !AllowNeutral) return false; - if (!c.Info.CaptureTypes.Contains(Type)) + if (!c.CaptureTypes.Contains(Type)) return false; return true; diff --git a/OpenRA.Mods.Common/Traits/CombatDebugOverlay.cs b/OpenRA.Mods.Common/Traits/CombatDebugOverlay.cs index d02d943d1d..22d8333ba6 100644 --- a/OpenRA.Mods.Common/Traits/CombatDebugOverlay.cs +++ b/OpenRA.Mods.Common/Traits/CombatDebugOverlay.cs @@ -26,15 +26,15 @@ namespace OpenRA.Mods.Common.Traits { readonly DeveloperMode devMode; + readonly HealthInfo healthInfo; Lazy attack; Lazy coords; - Lazy health; public CombatDebugOverlay(Actor self) { + healthInfo = self.Info.Traits.GetOrDefault(); attack = Exts.Lazy(() => self.TraitOrDefault()); coords = Exts.Lazy(() => self.Trait()); - health = Exts.Lazy(() => self.TraitOrDefault()); var localPlayer = self.World.LocalPlayer; devMode = localPlayer != null ? localPlayer.PlayerActor.Trait() : null; @@ -45,8 +45,8 @@ namespace OpenRA.Mods.Common.Traits if (devMode == null || !devMode.ShowCombatGeometry) return; - if (health.Value != null) - wr.DrawRangeCircle(self.CenterPosition, health.Value.Info.Radius, Color.Red); + if (healthInfo != null) + wr.DrawRangeCircle(self.CenterPosition, healthInfo.Radius, Color.Red); // No armaments to draw if (attack.Value == null) @@ -96,11 +96,11 @@ namespace OpenRA.Mods.Common.Traits if (devMode == null || !devMode.ShowCombatGeometry || e.Damage == 0) return; - var health = self.TraitOrDefault(); - if (health == null) + if (healthInfo == null) return; - var damageText = "{0} ({1}%)".F(-e.Damage, e.Damage * 100 / health.MaxHP); + var maxHP = healthInfo.HP > 0 ? healthInfo.HP : 1; + var damageText = "{0} ({1}%)".F(-e.Damage, e.Damage * 100 / maxHP); self.World.AddFrameEndTask(w => w.Add(new FloatingText(self.CenterPosition, e.Attacker.Owner.Color.RGB, damageText, 30))); } diff --git a/OpenRA.Mods.Common/Traits/ExternalCapturable.cs b/OpenRA.Mods.Common/Traits/ExternalCapturable.cs index f046deaecd..fa85fb4194 100644 --- a/OpenRA.Mods.Common/Traits/ExternalCapturable.cs +++ b/OpenRA.Mods.Common/Traits/ExternalCapturable.cs @@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.Traits public bool CanBeTargetedBy(Actor captor, Player owner) { - var c = captor.TraitOrDefault(); + var c = captor.Info.Traits.GetOrDefault(); if (c == null) return false; @@ -40,7 +40,7 @@ namespace OpenRA.Mods.Common.Traits if (playerRelationship == Stance.Neutral && !AllowNeutral) return false; - if (!c.Info.CaptureTypes.Contains(Type)) + if (!c.CaptureTypes.Contains(Type)) return false; return true; diff --git a/OpenRA.Mods.Common/Traits/Harvester.cs b/OpenRA.Mods.Common/Traits/Harvester.cs index dbb356706f..ffaf79a2f6 100644 --- a/OpenRA.Mods.Common/Traits/Harvester.cs +++ b/OpenRA.Mods.Common/Traits/Harvester.cs @@ -67,7 +67,7 @@ namespace OpenRA.Mods.Common.Traits IExplodeModifier, IOrderVoice, ISpeedModifier, ISync, INotifyCreated, INotifyResourceClaimLost, INotifyIdle, INotifyBlockingMove, INotifyBuildComplete { - readonly HarvesterInfo info; + public readonly HarvesterInfo Info; readonly Mobile mobile; Dictionary contents = new Dictionary(); bool idleSmart = true; @@ -92,20 +92,20 @@ namespace OpenRA.Mods.Common.Traits public Harvester(Actor self, HarvesterInfo info) { - this.info = info; + Info = info; mobile = self.Trait(); self.QueueActivity(new CallFunc(() => ChooseNewProc(self, null))); } public void Created(Actor self) { - if (info.SearchOnCreation) + if (Info.SearchOnCreation) self.QueueActivity(new FindResources(self)); } public void BuildingComplete(Actor self) { - if (info.SearchOnCreation) + if (Info.SearchOnCreation) self.QueueActivity(new FindResources(self)); } @@ -151,8 +151,8 @@ namespace OpenRA.Mods.Common.Traits bool IsAcceptableProcType(Actor proc) { - return info.DeliveryBuildings.Count == 0 || - info.DeliveryBuildings.Contains(proc.Info.Name); + return Info.DeliveryBuildings.Count == 0 || + Info.DeliveryBuildings.Contains(proc.Info.Name); } public Actor ClosestProc(Actor self, Actor ignore) @@ -192,9 +192,9 @@ namespace OpenRA.Mods.Common.Traits return null; } - public bool IsFull { get { return contents.Values.Sum() == info.Capacity; } } + public bool IsFull { get { return contents.Values.Sum() == Info.Capacity; } } public bool IsEmpty { get { return contents.Values.Sum() == 0; } } - public int Fullness { get { return contents.Values.Sum() * 100 / info.Capacity; } } + public int Fullness { get { return contents.Values.Sum() * 100 / Info.Capacity; } } public void AcceptResource(ResourceType type) { @@ -212,7 +212,7 @@ namespace OpenRA.Mods.Common.Traits if (self.Location == deliveryLoc) { // Get out of the way: - var unblockCell = LastHarvestedCell ?? (deliveryLoc + info.UnblockCell); + var unblockCell = LastHarvestedCell ?? (deliveryLoc + Info.UnblockCell); var moveTo = mobile.NearestMoveableCell(unblockCell, 1, 5); self.QueueActivity(mobile.MoveTo(moveTo, 1)); self.SetTargetLine(Target.FromCell(self.World, moveTo), Color.Gray, false); @@ -287,7 +287,7 @@ namespace OpenRA.Mods.Common.Traits if (--contents[type] == 0) contents.Remove(type); - currentUnloadTicks = info.UnloadTicksPerBale; + currentUnloadTicks = Info.UnloadTicksPerBale; } return contents.Count == 0; @@ -318,10 +318,10 @@ namespace OpenRA.Mods.Common.Traits public string VoicePhraseForOrder(Actor self, Order order) { if (order.OrderString == "Harvest") - return info.HarvestVoice; + return Info.HarvestVoice; if (order.OrderString == "Deliver" && !IsEmpty) - return info.DeliverVoice; + return Info.DeliverVoice; return null; } @@ -421,7 +421,7 @@ namespace OpenRA.Mods.Common.Traits PipType GetPipAt(int i) { - var n = i * info.Capacity / info.PipCount; + var n = i * Info.Capacity / Info.PipCount; foreach (var rt in contents) if (n < rt.Value) @@ -434,7 +434,7 @@ namespace OpenRA.Mods.Common.Traits public IEnumerable GetPips(Actor self) { - var numPips = info.PipCount; + var numPips = Info.PipCount; for (var i = 0; i < numPips; i++) yield return GetPipAt(i); @@ -444,7 +444,7 @@ namespace OpenRA.Mods.Common.Traits public int GetSpeedModifier() { - return 100 - (100 - info.FullyLoadedSpeed) * contents.Values.Sum() / info.Capacity; + return 100 - (100 - Info.FullyLoadedSpeed) * contents.Values.Sum() / Info.Capacity; } class HarvestOrderTargeter : IOrderTargeter diff --git a/OpenRA.Mods.Common/Traits/ProximityCaptor.cs b/OpenRA.Mods.Common/Traits/ProximityCaptor.cs index 8e8cafb294..92f39b3487 100644 --- a/OpenRA.Mods.Common/Traits/ProximityCaptor.cs +++ b/OpenRA.Mods.Common/Traits/ProximityCaptor.cs @@ -15,22 +15,11 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { [Desc("Actor can capture ProximityCapturable actors.")] - public class ProximityCaptorInfo : ITraitInfo + public class ProximityCaptorInfo : TraitInfo { [FieldLoader.Require] public readonly HashSet Types = new HashSet(); - public object Create(ActorInitializer init) { return new ProximityCaptor(this); } } - public class ProximityCaptor - { - public readonly ProximityCaptorInfo Info; - - public ProximityCaptor(ProximityCaptorInfo info) { Info = info; } - - public bool HasAny(IEnumerable typesList) - { - return Info.Types.Overlaps(typesList); - } - } + public class ProximityCaptor { } } diff --git a/OpenRA.Mods.Common/Traits/ProximityCapturable.cs b/OpenRA.Mods.Common/Traits/ProximityCapturable.cs index 96ce392d61..eed7608fe2 100644 --- a/OpenRA.Mods.Common/Traits/ProximityCapturable.cs +++ b/OpenRA.Mods.Common/Traits/ProximityCapturable.cs @@ -105,8 +105,8 @@ namespace OpenRA.Mods.Common.Traits bool CanBeCapturedBy(Actor a) { - var pc = a.TraitOrDefault(); - return pc != null && pc.HasAny(Info.CaptorTypes); + var pc = a.Info.Traits.GetOrDefault(); + return pc != null && pc.Types.Overlaps(Info.CaptorTypes); } IEnumerable UnitsInRange() diff --git a/OpenRA.Mods.Common/Traits/Render/WithDockingAnimation.cs b/OpenRA.Mods.Common/Traits/Render/WithDockingAnimation.cs index 252b4a53d2..d77bd3b5ee 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithDockingAnimation.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithDockingAnimation.cs @@ -12,24 +12,14 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { - public class WithDockingAnimationInfo : ITraitInfo, Requires, Requires + public class WithDockingAnimationInfo : TraitInfo, Requires, Requires { [Desc("Displayed when docking to refinery.")] [SequenceReference] public readonly string DockSequence = "dock"; [Desc("Looped while unloading at refinery.")] [SequenceReference] public readonly string DockLoopSequence = "dock-loop"; - - public object Create(ActorInitializer init) { return new WithDockingAnimation(init, this); } } - public class WithDockingAnimation - { - public readonly WithDockingAnimationInfo Info; - - public WithDockingAnimation(ActorInitializer init, WithDockingAnimationInfo info) - { - Info = info; - } - } + public class WithDockingAnimation { } } diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/LoadIngamePlayerOrObserverUILogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/LoadIngamePlayerOrObserverUILogic.cs index 660f676516..012bb9a144 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/LoadIngamePlayerOrObserverUILogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/LoadIngamePlayerOrObserverUILogic.cs @@ -32,7 +32,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic { var playerWidgets = Game.LoadWidget(world, "PLAYER_WIDGETS", playerRoot, new WidgetArgs()); var sidebarTicker = playerWidgets.Get("SIDEBAR_TICKER"); - var objectives = world.LocalPlayer.PlayerActor.TraitOrDefault(); + var objectives = world.LocalPlayer.PlayerActor.Info.Traits.GetOrDefault(); sidebarTicker.OnTick = () => { @@ -40,7 +40,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic if (world.LocalPlayer.WinState != WinState.Undefined && !loadingObserverWidgets) { loadingObserverWidgets = true; - Game.RunAfterDelay(objectives != null ? objectives.Info.GameOverDelay : 0, () => + Game.RunAfterDelay(objectives != null ? objectives.GameOverDelay : 0, () => { playerRoot.RemoveChildren(); Game.LoadWidget(world, "OBSERVER_WIDGETS", playerRoot, new WidgetArgs()); diff --git a/OpenRA.Mods.D2k/Traits/Carryall.cs b/OpenRA.Mods.D2k/Traits/Carryall.cs index c4324a3607..07a6663e0b 100644 --- a/OpenRA.Mods.D2k/Traits/Carryall.cs +++ b/OpenRA.Mods.D2k/Traits/Carryall.cs @@ -50,7 +50,8 @@ namespace OpenRA.Mods.D2k.Traits IsBusy = false; IsCarrying = false; - carryHeight = self.Trait().Info.LandAltitude; + var helicopter = self.Info.Traits.GetOrDefault(); + carryHeight = helicopter != null ? helicopter.LandAltitude : WDist.Zero; } public void OnBecomingIdle(Actor self) From 09984683a79f688a924b64fea4c16588abd2e075 Mon Sep 17 00:00:00 2001 From: atlimit8 Date: Mon, 3 Aug 2015 16:07:33 -0500 Subject: [PATCH 4/4] Add ActorInfo.TraitInfo[OrDefault]() requiring ITraitIfo types --- OpenRA.Game/Actor.cs | 4 ++-- OpenRA.Game/GameRules/ActorInfo.cs | 2 ++ OpenRA.Game/SelectableExts.cs | 4 ++-- OpenRA.Game/Selection.cs | 2 +- OpenRA.Game/Traits/TraitsInterfaces.cs | 2 +- .../Traits/Buildings/ProductionAirdrop.cs | 2 +- OpenRA.Mods.Common/AI/AttackOrFleeFuzzy.cs | 2 +- OpenRA.Mods.Common/AI/HackyAI.cs | 14 +++++++------- OpenRA.Mods.Common/AI/SupportPowerDecision.cs | 2 +- OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs | 4 ++-- OpenRA.Mods.Common/Activities/CaptureActor.cs | 2 +- .../Activities/ExternalCaptureActor.cs | 2 +- OpenRA.Mods.Common/Activities/FindResources.cs | 4 ++-- OpenRA.Mods.Common/Activities/HarvestResource.cs | 2 +- OpenRA.Mods.Common/Activities/Parachute.cs | 2 +- OpenRA.Mods.Common/Activities/Repair.cs | 4 ++-- OpenRA.Mods.Common/Activities/Sell.cs | 2 +- .../Activities/SpriteHarvesterDockSequence.cs | 2 +- .../EditorBrushes/EditorActorBrush.cs | 6 +++--- OpenRA.Mods.Common/Lint/CheckDefaultVisibility.cs | 4 ++-- OpenRA.Mods.Common/Lint/CheckRevealFootprint.cs | 2 +- .../Lint/LintBuildablePrerequisites.cs | 2 +- .../Orders/PlaceBuildingOrderGenerator.cs | 10 +++++----- OpenRA.Mods.Common/Scripting/Global/ActorGlobal.cs | 2 +- .../Scripting/Global/ReinforcementsGlobal.cs | 4 ++-- .../Scripting/Properties/CaptureProperties.cs | 8 ++++---- .../Scripting/Properties/DemolitionProperties.cs | 2 +- .../Scripting/Properties/ProductionProperties.cs | 4 ++-- OpenRA.Mods.Common/Traits/Air/Aircraft.cs | 2 +- OpenRA.Mods.Common/Traits/BodyOrientation.cs | 2 +- OpenRA.Mods.Common/Traits/Buildings/Bib.cs | 4 ++-- OpenRA.Mods.Common/Traits/Buildings/Bridge.cs | 2 +- OpenRA.Mods.Common/Traits/Buildings/Building.cs | 4 ++-- .../Traits/Buildings/BuildingInfluence.cs | 4 ++-- .../Traits/Buildings/BuildingUtils.cs | 4 ++-- .../Traits/Buildings/FootprintUtils.cs | 6 +++--- .../Traits/Buildings/PrimaryBuilding.cs | 4 ++-- OpenRA.Mods.Common/Traits/Capturable.cs | 2 +- OpenRA.Mods.Common/Traits/Captures.cs | 6 +++--- OpenRA.Mods.Common/Traits/Cargo.cs | 4 ++-- OpenRA.Mods.Common/Traits/CombatDebugOverlay.cs | 2 +- OpenRA.Mods.Common/Traits/Crates/Crate.cs | 2 +- .../Traits/Crates/DuplicateUnitCrateAction.cs | 2 +- .../Traits/Crates/GiveUnitCrateAction.cs | 2 +- OpenRA.Mods.Common/Traits/CustomBuildTimeValue.cs | 4 ++-- OpenRA.Mods.Common/Traits/CustomSellValue.cs | 4 ++-- OpenRA.Mods.Common/Traits/EmitInfantryOnSell.cs | 6 +++--- OpenRA.Mods.Common/Traits/ExternalCapturable.cs | 2 +- OpenRA.Mods.Common/Traits/ExternalCaptures.cs | 4 ++-- OpenRA.Mods.Common/Traits/GainsExperience.cs | 2 +- OpenRA.Mods.Common/Traits/GivesBounty.cs | 4 ++-- OpenRA.Mods.Common/Traits/GivesExperience.cs | 2 +- OpenRA.Mods.Common/Traits/Guard.cs | 2 +- OpenRA.Mods.Common/Traits/Harvester.cs | 4 ++-- OpenRA.Mods.Common/Traits/Passenger.cs | 2 +- .../Traits/Player/ClassicProductionQueue.cs | 4 ++-- OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs | 8 ++++---- .../Traits/Player/PlayerStatistics.cs | 2 +- .../Traits/Player/ProductionQueue.cs | 8 ++++---- OpenRA.Mods.Common/Traits/Player/TechTree.cs | 4 ++-- OpenRA.Mods.Common/Traits/Production.cs | 6 +++--- OpenRA.Mods.Common/Traits/ProvidesRadar.cs | 2 +- OpenRA.Mods.Common/Traits/ProximityCapturable.cs | 2 +- .../Traits/QuantizeFacingsFromSequence.cs | 2 +- OpenRA.Mods.Common/Traits/Render/ProductionBar.cs | 2 +- .../Traits/Render/RenderRangeCircle.cs | 2 +- OpenRA.Mods.Common/Traits/Render/RenderSprites.cs | 4 ++-- OpenRA.Mods.Common/Traits/Render/RenderVoxels.cs | 6 +++--- OpenRA.Mods.Common/Traits/Render/WithBarrel.cs | 2 +- .../Traits/Render/WithBuildingExplosion.cs | 2 +- .../Traits/Render/WithFacingSpriteBody.cs | 2 +- .../Traits/Render/WithIdleOverlay.cs | 2 +- .../Traits/Render/WithInfantryBody.cs | 2 +- OpenRA.Mods.Common/Traits/Render/WithParachute.cs | 2 +- .../Traits/Render/WithProductionDoorOverlay.cs | 4 ++-- .../Traits/Render/WithProductionOverlay.cs | 2 +- OpenRA.Mods.Common/Traits/Render/WithRotor.cs | 2 +- OpenRA.Mods.Common/Traits/Render/WithTurret.cs | 4 ++-- .../Traits/Render/WithVoxelBarrel.cs | 2 +- OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs | 4 ++-- .../Traits/Render/WithVoxelTurret.cs | 2 +- .../Traits/Render/WithWallSpriteBody.cs | 2 +- .../Traits/SupportPowers/AirstrikePower.cs | 2 +- OpenRA.Mods.Common/Traits/Transforms.cs | 2 +- .../Traits/VeteranProductionIconOverlay.cs | 2 +- OpenRA.Mods.Common/Traits/World/BridgeLayer.cs | 2 +- OpenRA.Mods.Common/Traits/World/CrateSpawner.cs | 2 +- OpenRA.Mods.Common/Traits/World/DomainIndex.cs | 2 +- .../Traits/World/EditorActorPreview.cs | 6 +++--- OpenRA.Mods.Common/Traits/World/PathFinder.cs | 4 ++-- OpenRA.Mods.Common/Traits/World/SpawnMPUnits.cs | 2 +- .../UtilityCommands/RemapShpCommand.cs | 4 ++-- OpenRA.Mods.Common/Warheads/CreateEffectWarhead.cs | 2 +- .../Warheads/HealthPercentageDamageWarhead.cs | 2 +- OpenRA.Mods.Common/Warheads/SpreadDamageWarhead.cs | 2 +- .../Widgets/Logic/Editor/ActorSelectorLogic.cs | 4 ++-- .../Ingame/LoadIngamePlayerOrObserverUILogic.cs | 2 +- .../Widgets/Logic/Ingame/ProductionTooltipLogic.cs | 8 ++++---- .../Widgets/Logic/Lobby/LobbyLogic.cs | 4 ++-- .../Widgets/ObserverProductionIconsWidget.cs | 6 +++--- .../Widgets/ProductionPaletteWidget.cs | 8 ++++---- OpenRA.Mods.Common/Widgets/WorldCommandWidget.cs | 4 ++-- .../Traits/Buildings/FreeActorWithDelivery.cs | 2 +- .../Traits/Buildings/ProductionFromMapEdge.cs | 2 +- OpenRA.Mods.D2k/Traits/Carryall.cs | 2 +- OpenRA.Mods.RA/Activities/LayMines.cs | 2 +- .../Traits/Buildings/ClonesProducedUnits.cs | 2 +- OpenRA.Mods.RA/Traits/Disguise.cs | 2 +- OpenRA.Mods.RA/Traits/Minelayer.cs | 6 +++--- OpenRA.Mods.RA/Traits/Render/RenderJammerCircle.cs | 8 ++++---- OpenRA.Mods.RA/Traits/Render/RenderShroudCircle.cs | 4 ++-- .../Traits/SupportPowers/ParatroopersPower.cs | 2 +- .../Traits/Render/WithVoxelUnloadBody.cs | 4 ++-- .../Traits/Render/WithVoxelWalkerBody.cs | 2 +- OpenRA.Mods.TS/Traits/Render/WithVoxelWaterBody.cs | 4 ++-- 115 files changed, 195 insertions(+), 193 deletions(-) diff --git a/OpenRA.Game/Actor.cs b/OpenRA.Game/Actor.cs index d2b82a414e..c7605549bc 100644 --- a/OpenRA.Game/Actor.cs +++ b/OpenRA.Game/Actor.cs @@ -103,7 +103,7 @@ namespace OpenRA bounds = Exts.Lazy(() => { - var si = Info.Traits.GetOrDefault(); + var si = Info.TraitInfoOrDefault(); var size = (si != null && si.Bounds != null) ? new int2(si.Bounds[0], si.Bounds[1]) : TraitsImplementing().Select(x => x.SelectionSize(this)).FirstOrDefault(); @@ -116,7 +116,7 @@ namespace OpenRA visualBounds = Exts.Lazy(() => { - var sd = Info.Traits.GetOrDefault(); + var sd = Info.TraitInfoOrDefault(); if (sd == null || sd.SelectionBoxBounds == null) return bounds.Value; diff --git a/OpenRA.Game/GameRules/ActorInfo.cs b/OpenRA.Game/GameRules/ActorInfo.cs index b09140e4e0..c260a9e3ba 100644 --- a/OpenRA.Game/GameRules/ActorInfo.cs +++ b/OpenRA.Game/GameRules/ActorInfo.cs @@ -185,5 +185,7 @@ namespace OpenRA } public bool HasTraitInfo() where T : ITraitInfo { return Traits.Contains(); } + public T TraitInfo() where T : ITraitInfo { return Traits.Get(); } + public T TraitInfoOrDefault() where T : ITraitInfo { return Traits.GetOrDefault(); } } } diff --git a/OpenRA.Game/SelectableExts.cs b/OpenRA.Game/SelectableExts.cs index d762485870..dcc01788dc 100644 --- a/OpenRA.Game/SelectableExts.cs +++ b/OpenRA.Game/SelectableExts.cs @@ -18,7 +18,7 @@ namespace OpenRA.Traits { public static int SelectionPriority(this ActorInfo a) { - var selectableInfo = a.Traits.GetOrDefault(); + var selectableInfo = a.TraitInfoOrDefault(); return selectableInfo != null ? selectableInfo.Priority : int.MinValue; } @@ -26,7 +26,7 @@ namespace OpenRA.Traits public static int SelectionPriority(this Actor a) { - var basePriority = a.Info.Traits.Get().Priority; + var basePriority = a.Info.TraitInfo().Priority; var lp = a.World.LocalPlayer; if (a.Owner == lp || lp == null) diff --git a/OpenRA.Game/Selection.cs b/OpenRA.Game/Selection.cs index 3c8be43f42..516fdacea1 100644 --- a/OpenRA.Game/Selection.cs +++ b/OpenRA.Game/Selection.cs @@ -75,7 +75,7 @@ namespace OpenRA if (actor.Owner != world.LocalPlayer || !actor.IsInWorld) continue; - var selectable = actor.Info.Traits.GetOrDefault(); + var selectable = actor.Info.TraitInfoOrDefault(); if (selectable == null || !actor.HasVoice(selectable.Voice)) continue; diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 82c22d2964..6fc8a5a684 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -115,7 +115,7 @@ namespace OpenRA.Traits public interface ISeedableResource { void Seed(Actor self); } - public interface ISelectionDecorationsInfo + public interface ISelectionDecorationsInfo : ITraitInfo { int[] SelectionBoxBounds { get; } } diff --git a/OpenRA.Mods.Cnc/Traits/Buildings/ProductionAirdrop.cs b/OpenRA.Mods.Cnc/Traits/Buildings/ProductionAirdrop.cs index 49d25c9ce6..f8e38556fc 100644 --- a/OpenRA.Mods.Cnc/Traits/Buildings/ProductionAirdrop.cs +++ b/OpenRA.Mods.Cnc/Traits/Buildings/ProductionAirdrop.cs @@ -55,7 +55,7 @@ namespace OpenRA.Mods.Cnc.Traits if (!self.IsInWorld || self.IsDead) return; - var altitude = self.World.Map.Rules.Actors[actorType].Traits.Get().CruiseAltitude; + var altitude = self.World.Map.Rules.Actors[actorType].TraitInfo().CruiseAltitude; var actor = w.CreateActor(actorType, new TypeDictionary { new CenterPositionInit(w.Map.CenterOfCell(startPos) + new WVec(WDist.Zero, WDist.Zero, altitude)), diff --git a/OpenRA.Mods.Common/AI/AttackOrFleeFuzzy.cs b/OpenRA.Mods.Common/AI/AttackOrFleeFuzzy.cs index 2a0553fab6..34978edbc4 100644 --- a/OpenRA.Mods.Common/AI/AttackOrFleeFuzzy.cs +++ b/OpenRA.Mods.Common/AI/AttackOrFleeFuzzy.cs @@ -208,7 +208,7 @@ namespace OpenRA.Mods.Common.AI protected float RelativeSpeed(IEnumerable own, IEnumerable enemy) { - return RelativeValue(own, enemy, 100, Average, (Actor a) => a.Info.Traits.Get().Speed); + return RelativeValue(own, enemy, 100, Average, (Actor a) => a.Info.TraitInfo().Speed); } protected static float RelativeValue(IEnumerable own, IEnumerable enemy, float normalizeByValue, diff --git a/OpenRA.Mods.Common/AI/HackyAI.cs b/OpenRA.Mods.Common/AI/HackyAI.cs index fbbb79ef71..35c9720e2f 100644 --- a/OpenRA.Mods.Common/AI/HackyAI.cs +++ b/OpenRA.Mods.Common/AI/HackyAI.cs @@ -433,7 +433,7 @@ namespace OpenRA.Mods.Common.AI // For mods like RA (number of building must match the number of aircraft) bool HasAdequateAirUnitReloadBuildings(ActorInfo actorInfo) { - var aircraftInfo = actorInfo.Traits.GetOrDefault(); + var aircraftInfo = actorInfo.TraitInfoOrDefault(); if (aircraftInfo == null) return true; @@ -453,7 +453,7 @@ namespace OpenRA.Mods.Common.AI CPos defenseCenter; public CPos? ChooseBuildLocation(string actorType, bool distanceToBaseIsImportant, BuildingType type) { - var bi = Map.Rules.Actors[actorType].Traits.GetOrDefault(); + var bi = Map.Rules.Actors[actorType].TraitInfoOrDefault(); if (bi == null) return null; @@ -657,8 +657,8 @@ namespace OpenRA.Mods.Common.AI CPos FindNextResource(Actor self) { - var harvInfo = self.Info.Traits.Get(); - var mobileInfo = self.Info.Traits.Get(); + var harvInfo = self.Info.TraitInfo(); + var mobileInfo = self.Info.TraitInfo(); var passable = (uint)mobileInfo.GetMovementClass(World.TileSet); var path = pathfinder.FindPath( @@ -807,7 +807,7 @@ namespace OpenRA.Mods.Common.AI { var buildings = self.World.ActorsWithTrait() .Where(rp => rp.Actor.Owner == Player && - !IsRallyPointValid(rp.Trait.Location, rp.Actor.Info.Traits.GetOrDefault())).ToArray(); + !IsRallyPointValid(rp.Trait.Location, rp.Actor.Info.TraitInfoOrDefault())).ToArray(); foreach (var a in buildings) QueueOrder(new Order("SetRallyPoint", a.Actor, false) { TargetLocation = ChooseRallyLocationNear(a.Actor), SuppressVisualFeedback = true }); @@ -817,7 +817,7 @@ namespace OpenRA.Mods.Common.AI CPos ChooseRallyLocationNear(Actor producer) { var possibleRallyPoints = Map.FindTilesInCircle(producer.Location, Info.RallyPointScanRadius) - .Where(c => IsRallyPointValid(c, producer.Info.Traits.GetOrDefault())); + .Where(c => IsRallyPointValid(c, producer.Info.TraitInfoOrDefault())); if (!possibleRallyPoints.Any()) { @@ -863,7 +863,7 @@ namespace OpenRA.Mods.Common.AI if (mcv.IsMoving()) continue; - var factType = mcv.Info.Traits.Get().IntoActor; + var factType = mcv.Info.TraitInfo().IntoActor; var desiredLocation = ChooseBuildLocation(factType, false, BuildingType.Building); if (desiredLocation == null) continue; diff --git a/OpenRA.Mods.Common/AI/SupportPowerDecision.cs b/OpenRA.Mods.Common/AI/SupportPowerDecision.cs index 454b14f26b..c1fc4921f8 100644 --- a/OpenRA.Mods.Common/AI/SupportPowerDecision.cs +++ b/OpenRA.Mods.Common/AI/SupportPowerDecision.cs @@ -134,7 +134,7 @@ namespace OpenRA.Mods.Common.AI switch (TargetMetric) { case DecisionMetric.Value: - var valueInfo = a.Info.Traits.GetOrDefault(); + var valueInfo = a.Info.TraitInfoOrDefault(); return (valueInfo != null) ? valueInfo.Cost * Attractiveness : 0; case DecisionMetric.Health: diff --git a/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs b/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs index 7f828a6b74..fc47f318d9 100644 --- a/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs +++ b/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs @@ -28,12 +28,12 @@ namespace OpenRA.Mods.Common.Activities { this.dest = dest; plane = self.Trait(); - planeInfo = self.Info.Traits.Get(); + planeInfo = self.Info.TraitInfo(); } public static Actor ChooseAirfield(Actor self, bool unreservedOnly) { - var rearmBuildings = self.Info.Traits.Get().RearmBuildings; + var rearmBuildings = self.Info.TraitInfo().RearmBuildings; return self.World.ActorsWithTrait() .Where(a => a.Actor.Owner == self.Owner) .Where(a => rearmBuildings.Contains(a.Actor.Info.Name) diff --git a/OpenRA.Mods.Common/Activities/CaptureActor.cs b/OpenRA.Mods.Common/Activities/CaptureActor.cs index 970cc707ae..f1ca1aaef7 100644 --- a/OpenRA.Mods.Common/Activities/CaptureActor.cs +++ b/OpenRA.Mods.Common/Activities/CaptureActor.cs @@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.Activities { actor = target; building = actor.TraitOrDefault(); - capturesInfo = self.Info.Traits.Get(); + capturesInfo = self.Info.TraitInfo(); capturable = target.Trait(); health = actor.Trait(); } diff --git a/OpenRA.Mods.Common/Activities/ExternalCaptureActor.cs b/OpenRA.Mods.Common/Activities/ExternalCaptureActor.cs index 059f53fb5d..49b747b9c1 100644 --- a/OpenRA.Mods.Common/Activities/ExternalCaptureActor.cs +++ b/OpenRA.Mods.Common/Activities/ExternalCaptureActor.cs @@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.Activities { this.target = target; capturable = target.Actor.Trait(); - capturesInfo = self.Info.Traits.Get(); + capturesInfo = self.Info.TraitInfo(); mobile = self.Trait(); } diff --git a/OpenRA.Mods.Common/Activities/FindResources.cs b/OpenRA.Mods.Common/Activities/FindResources.cs index a173de2a8c..9d30fe01d7 100644 --- a/OpenRA.Mods.Common/Activities/FindResources.cs +++ b/OpenRA.Mods.Common/Activities/FindResources.cs @@ -34,9 +34,9 @@ namespace OpenRA.Mods.Common.Activities public FindResources(Actor self) { harv = self.Trait(); - harvInfo = self.Info.Traits.Get(); + harvInfo = self.Info.TraitInfo(); mobile = self.Trait(); - mobileInfo = self.Info.Traits.Get(); + mobileInfo = self.Info.TraitInfo(); resLayer = self.World.WorldActor.Trait(); territory = self.World.WorldActor.TraitOrDefault(); pathFinder = self.World.WorldActor.Trait(); diff --git a/OpenRA.Mods.Common/Activities/HarvestResource.cs b/OpenRA.Mods.Common/Activities/HarvestResource.cs index 71bed722f3..e65941369d 100644 --- a/OpenRA.Mods.Common/Activities/HarvestResource.cs +++ b/OpenRA.Mods.Common/Activities/HarvestResource.cs @@ -25,7 +25,7 @@ namespace OpenRA.Mods.Common.Activities public HarvestResource(Actor self) { harv = self.Trait(); - harvInfo = self.Info.Traits.Get(); + harvInfo = self.Info.TraitInfo(); facing = self.Trait(); territory = self.World.WorldActor.TraitOrDefault(); resLayer = self.World.WorldActor.Trait(); diff --git a/OpenRA.Mods.Common/Activities/Parachute.cs b/OpenRA.Mods.Common/Activities/Parachute.cs index 17d45a5744..e32e43be79 100644 --- a/OpenRA.Mods.Common/Activities/Parachute.cs +++ b/OpenRA.Mods.Common/Activities/Parachute.cs @@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Activities pos = self.TraitOrDefault(); // Parachutable trait is a prerequisite for running this activity - para = self.Info.Traits.Get(); + para = self.Info.TraitInfo(); fallVector = new WVec(0, 0, para.FallRate); this.dropPosition = dropPosition; } diff --git a/OpenRA.Mods.Common/Activities/Repair.cs b/OpenRA.Mods.Common/Activities/Repair.cs index e9d2393ab1..a7df43ff9c 100644 --- a/OpenRA.Mods.Common/Activities/Repair.cs +++ b/OpenRA.Mods.Common/Activities/Repair.cs @@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.Activities public Repair(Actor host) { this.host = host; - repairsUnits = host.Info.Traits.Get(); + repairsUnits = host.Info.TraitInfo(); } public override Activity Tick(Actor self) @@ -45,7 +45,7 @@ namespace OpenRA.Mods.Common.Activities if (remainingTicks == 0) { - var unitCost = self.Info.Traits.Get().Cost; + var unitCost = self.Info.TraitInfo().Cost; var hpToRepair = repairsUnits.HpPerStep; var cost = Math.Max(1, (hpToRepair * unitCost * repairsUnits.ValuePercentage) / (health.MaxHP * 100)); diff --git a/OpenRA.Mods.Common/Activities/Sell.cs b/OpenRA.Mods.Common/Activities/Sell.cs index 7397b0f7e2..5079208737 100644 --- a/OpenRA.Mods.Common/Activities/Sell.cs +++ b/OpenRA.Mods.Common/Activities/Sell.cs @@ -24,7 +24,7 @@ namespace OpenRA.Mods.Common.Activities public Sell(Actor self) { health = self.TraitOrDefault(); - sellableInfo = self.Info.Traits.Get(); + sellableInfo = self.Info.TraitInfo(); playerResources = self.Owner.PlayerActor.Trait(); } diff --git a/OpenRA.Mods.Common/Activities/SpriteHarvesterDockSequence.cs b/OpenRA.Mods.Common/Activities/SpriteHarvesterDockSequence.cs index ddf4773e3f..ab5550bafb 100644 --- a/OpenRA.Mods.Common/Activities/SpriteHarvesterDockSequence.cs +++ b/OpenRA.Mods.Common/Activities/SpriteHarvesterDockSequence.cs @@ -22,7 +22,7 @@ namespace OpenRA.Mods.Common.Activities : base(self, refinery, dockAngle, isDragRequired, dragOffset, dragLength) { wsb = self.Trait(); - wda = self.Info.Traits.Get(); + wda = self.Info.TraitInfo(); } public override Activity OnStateDock(Actor self) diff --git a/OpenRA.Mods.Common/EditorBrushes/EditorActorBrush.cs b/OpenRA.Mods.Common/EditorBrushes/EditorActorBrush.cs index 0ff3237969..fc7c7b483c 100644 --- a/OpenRA.Mods.Common/EditorBrushes/EditorActorBrush.cs +++ b/OpenRA.Mods.Common/EditorBrushes/EditorActorBrush.cs @@ -54,7 +54,7 @@ namespace OpenRA.Mods.Common.Widgets preview.GetScale = () => worldRenderer.Viewport.Zoom; preview.IsVisible = () => editorWidget.CurrentBrush == this; - var buildingInfo = actor.Traits.GetOrDefault(); + var buildingInfo = actor.TraitInfoOrDefault(); if (buildingInfo != null) { locationOffset = -FootprintUtils.AdjustForBuildingSize(buildingInfo); @@ -68,7 +68,7 @@ namespace OpenRA.Mods.Common.Widgets td.Add(new FactionInit(owner.Faction)); preview.SetPreview(actor, td); - var ios = actor.Traits.GetOrDefault(); + var ios = actor.TraitInfoOrDefault(); if (ios != null) footprint = ios.OccupiedCells(actor, CPos.Zero) .Select(c => c.Key - CPos.Zero) @@ -106,7 +106,7 @@ namespace OpenRA.Mods.Common.Widgets cell += locationOffset; newActorReference.Add(new LocationInit(cell)); - var ios = Actor.Traits.GetOrDefault(); + var ios = Actor.TraitInfoOrDefault(); if (ios != null && ios.SharesCell) { var subcell = editorLayer.FreeSubCellAt(cell); diff --git a/OpenRA.Mods.Common/Lint/CheckDefaultVisibility.cs b/OpenRA.Mods.Common/Lint/CheckDefaultVisibility.cs index 5752f4f019..4323c6df24 100644 --- a/OpenRA.Mods.Common/Lint/CheckDefaultVisibility.cs +++ b/OpenRA.Mods.Common/Lint/CheckDefaultVisibility.cs @@ -33,10 +33,10 @@ namespace OpenRA.Mods.Common.Lint emitError("Actor type `{0}` defines multiple default visibility types!".F(actorInfo.Key)); else { - var vis = actorInfo.Value.Traits.GetOrDefault(); + var vis = actorInfo.Value.TraitInfoOrDefault(); if (vis != null && vis.Type == VisibilityType.Footprint) { - var ios = actorInfo.Value.Traits.GetOrDefault(); + var ios = actorInfo.Value.TraitInfoOrDefault(); if (ios == null) emitError("Actor type `{0}` defines VisibilityType.Footprint in `{1}` but has no IOccupySpace traits!".F(actorInfo.Key, vis.GetType())); else if (!ios.OccupiedCells(actorInfo.Value, CPos.Zero).Any()) diff --git a/OpenRA.Mods.Common/Lint/CheckRevealFootprint.cs b/OpenRA.Mods.Common/Lint/CheckRevealFootprint.cs index 16147b33c4..39115677d2 100644 --- a/OpenRA.Mods.Common/Lint/CheckRevealFootprint.cs +++ b/OpenRA.Mods.Common/Lint/CheckRevealFootprint.cs @@ -25,7 +25,7 @@ namespace OpenRA.Mods.Common.Lint if (actorInfo.Key.StartsWith("^")) continue; - var ios = actorInfo.Value.Traits.GetOrDefault(); + var ios = actorInfo.Value.TraitInfoOrDefault(); foreach (var rsi in actorInfo.Value.Traits.WithInterface()) { if (rsi.Type == VisibilityType.CenterPosition) diff --git a/OpenRA.Mods.Common/Lint/LintBuildablePrerequisites.cs b/OpenRA.Mods.Common/Lint/LintBuildablePrerequisites.cs index a2e15a0d88..e655e5dade 100644 --- a/OpenRA.Mods.Common/Lint/LintBuildablePrerequisites.cs +++ b/OpenRA.Mods.Common/Lint/LintBuildablePrerequisites.cs @@ -34,7 +34,7 @@ namespace OpenRA.Mods.Common.Lint // TODO: this check is case insensitive while the real check in-game is not foreach (var i in rules.Actors) { - var bi = i.Value.Traits.GetOrDefault(); + var bi = i.Value.TraitInfoOrDefault(); if (bi != null) foreach (var prereq in bi.Prerequisites) if (!prereq.StartsWith("~disabled")) diff --git a/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs b/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs index 8609b0c7f7..fdc0240b8a 100644 --- a/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs +++ b/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs @@ -35,7 +35,7 @@ namespace OpenRA.Mods.Common.Orders public PlaceBuildingOrderGenerator(ProductionQueue queue, string name) { producer = queue.Actor; - placeBuildingInfo = producer.Owner.PlayerActor.Info.Traits.Get(); + placeBuildingInfo = producer.Owner.PlayerActor.Info.TraitInfo(); building = name; // Clear selection if using Left-Click Orders @@ -46,9 +46,9 @@ namespace OpenRA.Mods.Common.Orders var tileset = producer.World.TileSet.Id.ToLowerInvariant(); var info = map.Rules.Actors[building]; - buildingInfo = info.Traits.Get(); + buildingInfo = info.TraitInfo(); - var buildableInfo = info.Traits.Get(); + var buildableInfo = info.TraitInfo(); var mostLikelyProducer = queue.MostLikelyProducer(); faction = buildableInfo.ForceFaction ?? (mostLikelyProducer.Trait != null ? mostLikelyProducer.Trait.Faction : producer.Owner.Faction.InternalName); @@ -81,7 +81,7 @@ namespace OpenRA.Mods.Common.Orders var orderType = "PlaceBuilding"; var topLeft = xy - FootprintUtils.AdjustForBuildingSize(buildingInfo); - var plugInfo = world.Map.Rules.Actors[building].Traits.GetOrDefault(); + var plugInfo = world.Map.Rules.Actors[building].TraitInfoOrDefault(); if (plugInfo != null) { orderType = "PlacePlug"; @@ -148,7 +148,7 @@ namespace OpenRA.Mods.Common.Orders var cells = new Dictionary(); - var plugInfo = rules.Actors[building].Traits.GetOrDefault(); + var plugInfo = rules.Actors[building].TraitInfoOrDefault(); if (plugInfo != null) { if (buildingInfo.Dimensions.X != 1 || buildingInfo.Dimensions.Y != 1) diff --git a/OpenRA.Mods.Common/Scripting/Global/ActorGlobal.cs b/OpenRA.Mods.Common/Scripting/Global/ActorGlobal.cs index b1e91dd812..56da1f3bd1 100644 --- a/OpenRA.Mods.Common/Scripting/Global/ActorGlobal.cs +++ b/OpenRA.Mods.Common/Scripting/Global/ActorGlobal.cs @@ -76,7 +76,7 @@ namespace OpenRA.Mods.Common.Scripting if (!Context.World.Map.Rules.Actors.TryGetValue(type, out ai)) throw new LuaException("Unknown actor type '{0}'".F(type)); - var pi = ai.Traits.GetOrDefault(); + var pi = ai.TraitInfoOrDefault(); return pi != null ? pi.GetCruiseAltitude().Length : 0; } } diff --git a/OpenRA.Mods.Common/Scripting/Global/ReinforcementsGlobal.cs b/OpenRA.Mods.Common/Scripting/Global/ReinforcementsGlobal.cs index c8bf726376..934c2fca76 100644 --- a/OpenRA.Mods.Common/Scripting/Global/ReinforcementsGlobal.cs +++ b/OpenRA.Mods.Common/Scripting/Global/ReinforcementsGlobal.cs @@ -39,7 +39,7 @@ namespace OpenRA.Mods.Common.Scripting if (entryLocation.HasValue) { - var pi = ai.Traits.GetOrDefault(); + var pi = ai.TraitInfoOrDefault(); initDict.Add(new CenterPositionInit(owner.World.Map.CenterOfCell(entryLocation.Value) + new WVec(0, 0, pi != null ? pi.CruiseAltitude.Length : 0))); initDict.Add(new LocationInit(entryLocation.Value)); } @@ -137,7 +137,7 @@ namespace OpenRA.Mods.Common.Scripting } else { - var heli = transport.Info.Traits.GetOrDefault(); + var heli = transport.Info.TraitInfoOrDefault(); if (heli != null) { transport.QueueActivity(new Turn(transport, heli.InitialFacing)); diff --git a/OpenRA.Mods.Common/Scripting/Properties/CaptureProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/CaptureProperties.cs index 66328f0c15..732c274fab 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/CaptureProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/CaptureProperties.cs @@ -26,15 +26,15 @@ namespace OpenRA.Mods.Common.Scripting public CaptureProperties(ScriptContext context, Actor self) : base(context, self) { - normalInfo = Self.Info.Traits.GetOrDefault(); - externalInfo = Self.Info.Traits.GetOrDefault(); + normalInfo = Self.Info.TraitInfoOrDefault(); + externalInfo = Self.Info.TraitInfoOrDefault(); } [Desc("Captures the target actor.")] public void Capture(Actor target) { - var normalCapturable = target.Info.Traits.GetOrDefault(); - var externalCapturable = target.Info.Traits.GetOrDefault(); + var normalCapturable = target.Info.TraitInfoOrDefault(); + var externalCapturable = target.Info.TraitInfoOrDefault(); if (normalInfo != null && normalCapturable != null && normalInfo.CaptureTypes.Contains(normalCapturable.Type)) Self.QueueActivity(new CaptureActor(Self, target)); diff --git a/OpenRA.Mods.Common/Scripting/Properties/DemolitionProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/DemolitionProperties.cs index 83255303ff..93c7c176f7 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/DemolitionProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/DemolitionProperties.cs @@ -27,7 +27,7 @@ namespace OpenRA.Mods.Common.Scripting public DemolitionProperties(ScriptContext context, Actor self) : base(context, self) { - info = Self.Info.Traits.Get(); + info = Self.Info.TraitInfo(); } [ScriptActorPropertyActivity] diff --git a/OpenRA.Mods.Common/Scripting/Properties/ProductionProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/ProductionProperties.cs index a71775d62d..e1d7734798 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/ProductionProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/ProductionProperties.cs @@ -160,7 +160,7 @@ namespace OpenRA.Mods.Common.Scripting BuildableInfo GetBuildableInfo(string actorType) { var ri = Self.World.Map.Rules.Actors[actorType]; - var bi = ri.Traits.GetOrDefault(); + var bi = ri.TraitInfoOrDefault(); if (bi == null) throw new LuaException("Actor of type {0} cannot be produced".F(actorType)); @@ -267,7 +267,7 @@ namespace OpenRA.Mods.Common.Scripting BuildableInfo GetBuildableInfo(string actorType) { var ri = Player.World.Map.Rules.Actors[actorType]; - var bi = ri.Traits.GetOrDefault(); + var bi = ri.TraitInfoOrDefault(); if (bi == null) throw new LuaException("Actor of type {0} cannot be produced".F(actorType)); diff --git a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs index 477cc294b9..8c2bb032fa 100644 --- a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs @@ -158,7 +158,7 @@ namespace OpenRA.Mods.Common.Traits return WVec.Zero; return self.World.FindActorsInCircle(self.CenterPosition, info.IdealSeparation) - .Where(a => !a.IsDead && a.Info.HasTraitInfo() && a.Info.Traits.Get().CruiseAltitude == info.CruiseAltitude) + .Where(a => !a.IsDead && a.Info.HasTraitInfo() && a.Info.TraitInfo().CruiseAltitude == info.CruiseAltitude) .Select(GetRepulsionForce) .Aggregate(WVec.Zero, (a, b) => a + b); } diff --git a/OpenRA.Mods.Common/Traits/BodyOrientation.cs b/OpenRA.Mods.Common/Traits/BodyOrientation.cs index 5a9becc660..b72253060d 100644 --- a/OpenRA.Mods.Common/Traits/BodyOrientation.cs +++ b/OpenRA.Mods.Common/Traits/BodyOrientation.cs @@ -72,7 +72,7 @@ namespace OpenRA.Mods.Common.Traits if (info.QuantizedFacings >= 0) return info.QuantizedFacings; - var qboi = self.Info.Traits.GetOrDefault(); + var qboi = self.Info.TraitInfoOrDefault(); // If a sprite actor has neither custom QuantizedFacings nor a trait implementing IQuantizeBodyOrientationInfo, throw if (qboi == null) diff --git a/OpenRA.Mods.Common/Traits/Buildings/Bib.cs b/OpenRA.Mods.Common/Traits/Buildings/Bib.cs index d29e100c77..4ec09d3bfb 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Bib.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Bib.cs @@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Traits if (Palette != null) p = init.WorldRenderer.Palette(Palette); - var bi = init.Actor.Traits.Get(); + var bi = init.Actor.TraitInfo(); var width = bi.Dimensions.X; var bibOffset = bi.Dimensions.Y - 1; @@ -75,7 +75,7 @@ namespace OpenRA.Mods.Common.Traits { this.info = info; rs = self.Trait(); - bi = self.Info.Traits.Get(); + bi = self.Info.TraitInfo(); } public void AddedToWorld(Actor self) diff --git a/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs b/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs index 23df972704..1566ed636b 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Bridge.cs @@ -93,7 +93,7 @@ namespace OpenRA.Mods.Common.Traits this.info = info; type = self.Info.Name; isDangling = new Lazy(() => huts[0] == huts[1] && (neighbours[0] == null || neighbours[1] == null)); - building = self.Info.Traits.Get(); + building = self.Info.TraitInfo(); } public Bridge Neighbour(int direction) { return neighbours[direction]; } diff --git a/OpenRA.Mods.Common/Traits/Buildings/Building.cs b/OpenRA.Mods.Common/Traits/Buildings/Building.cs index c32883543b..7e4238cad5 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Building.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Building.cs @@ -64,8 +64,8 @@ namespace OpenRA.Mods.Common.Traits return false; var buildingMaxBounds = Dimensions; - var buildingTraits = world.Map.Rules.Actors[buildingName].Traits; - if (buildingTraits.Contains() && !buildingTraits.Get().HasMinibib) + var bibInfo = world.Map.Rules.Actors[buildingName].TraitInfoOrDefault(); + if (bibInfo != null && !bibInfo.HasMinibib) buildingMaxBounds += new CVec(0, 1); var scanStart = world.Map.Clamp(topLeft - new CVec(Adjacent, Adjacent)); diff --git a/OpenRA.Mods.Common/Traits/Buildings/BuildingInfluence.cs b/OpenRA.Mods.Common/Traits/Buildings/BuildingInfluence.cs index b15743b5eb..be15a686f5 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/BuildingInfluence.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/BuildingInfluence.cs @@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Traits world.ActorAdded += a => { - var b = a.Info.Traits.GetOrDefault(); + var b = a.Info.TraitInfoOrDefault(); if (b == null) return; @@ -42,7 +42,7 @@ namespace OpenRA.Mods.Common.Traits world.ActorRemoved += a => { - var b = a.Info.Traits.GetOrDefault(); + var b = a.Info.TraitInfoOrDefault(); if (b == null) return; diff --git a/OpenRA.Mods.Common/Traits/Buildings/BuildingUtils.cs b/OpenRA.Mods.Common/Traits/Buildings/BuildingUtils.cs index 77ce4cc319..b47f724e25 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/BuildingUtils.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/BuildingUtils.cs @@ -50,7 +50,7 @@ namespace OpenRA.Mods.Common.Traits public static IEnumerable GetLineBuildCells(World world, CPos location, string name, BuildingInfo bi) { - var lbi = world.Map.Rules.Actors[name].Traits.Get(); + var lbi = world.Map.Rules.Actors[name].TraitInfo(); var topLeft = location; // 1x1 assumption! if (world.IsCellBuildable(topLeft, bi)) @@ -74,7 +74,7 @@ namespace OpenRA.Mods.Common.Traits // Cell contains an actor. Is it the type we want? if (world.ActorsWithTrait().Any(a => (a.Actor.Location == cell && - a.Actor.Info.Traits.Get() + a.Actor.Info.TraitInfo() .Types.Overlaps(lbi.NodeTypes)))) dirs[d] = i; // Cell contains actor of correct type else diff --git a/OpenRA.Mods.Common/Traits/Buildings/FootprintUtils.cs b/OpenRA.Mods.Common/Traits/Buildings/FootprintUtils.cs index 4b890f681c..c369b8ea38 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/FootprintUtils.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/FootprintUtils.cs @@ -22,8 +22,8 @@ namespace OpenRA.Mods.Common.Traits var footprint = buildingInfo.Footprint.Where(x => !char.IsWhiteSpace(x)); - var buildingTraits = rules.Actors[name].Traits; - if (buildingTraits.Contains() && !buildingTraits.Get().HasMinibib) + var bibInfo = rules.Actors[name].TraitInfoOrDefault(); + if (bibInfo != null && !bibInfo.HasMinibib) { dim += new CVec(0, 1); footprint = footprint.Concat(new char[dim.X]); @@ -34,7 +34,7 @@ namespace OpenRA.Mods.Common.Traits public static IEnumerable Tiles(Actor a) { - return Tiles(a.World.Map.Rules, a.Info.Name, a.Info.Traits.Get(), a.Location); + return Tiles(a.World.Map.Rules, a.Info.Name, a.Info.TraitInfo(), a.Location); } public static IEnumerable UnpathableTiles(string name, BuildingInfo buildingInfo, CPos position) diff --git a/OpenRA.Mods.Common/Traits/Buildings/PrimaryBuilding.cs b/OpenRA.Mods.Common/Traits/Buildings/PrimaryBuilding.cs index 0d4c6ef787..9782c46da6 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/PrimaryBuilding.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/PrimaryBuilding.cs @@ -66,7 +66,7 @@ namespace OpenRA.Mods.Common.Traits // TODO: THIS IS SHIT // Cancel existing primaries - foreach (var p in self.Info.Traits.Get().Produces) + foreach (var p in self.Info.TraitInfo().Produces) { var productionType = p; // benign closure hazard foreach (var b in self.World @@ -74,7 +74,7 @@ namespace OpenRA.Mods.Common.Traits .Where(a => a.Actor.Owner == self.Owner && a.Trait.IsPrimary && - a.Actor.Info.Traits.Get().Produces.Contains(productionType))) + a.Actor.Info.TraitInfo().Produces.Contains(productionType))) b.Trait.SetPrimaryProducer(b.Actor, false); } diff --git a/OpenRA.Mods.Common/Traits/Capturable.cs b/OpenRA.Mods.Common/Traits/Capturable.cs index c45634b2ac..7076b72060 100644 --- a/OpenRA.Mods.Common/Traits/Capturable.cs +++ b/OpenRA.Mods.Common/Traits/Capturable.cs @@ -29,7 +29,7 @@ namespace OpenRA.Mods.Common.Traits public bool CanBeTargetedBy(Actor captor, Player owner) { - var c = captor.Info.Traits.GetOrDefault(); + var c = captor.Info.TraitInfoOrDefault(); if (c == null) return false; diff --git a/OpenRA.Mods.Common/Traits/Captures.cs b/OpenRA.Mods.Common/Traits/Captures.cs index ab14a52c27..405ca663b4 100644 --- a/OpenRA.Mods.Common/Traits/Captures.cs +++ b/OpenRA.Mods.Common/Traits/Captures.cs @@ -92,7 +92,7 @@ namespace OpenRA.Mods.Common.Traits public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor) { - var c = target.Info.Traits.GetOrDefault(); + var c = target.Info.TraitInfoOrDefault(); if (c == null || !c.CanBeTargetedBy(self, target.Owner)) { cursor = "enter-blocked"; @@ -109,14 +109,14 @@ namespace OpenRA.Mods.Common.Traits public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) { - var c = target.Info.Traits.GetOrDefault(); + var c = target.Info.TraitInfoOrDefault(); if (c == null || !c.CanBeTargetedBy(self, target.Owner)) { cursor = "enter-blocked"; return false; } - var health = target.Info.Traits.GetOrDefault(); + var health = target.Info.TraitInfoOrDefault(); var lowEnoughHealth = target.HP <= c.CaptureThreshold * health.HP; cursor = !sabotage || lowEnoughHealth || target.Owner.NonCombatant diff --git a/OpenRA.Mods.Common/Traits/Cargo.cs b/OpenRA.Mods.Common/Traits/Cargo.cs index af02efe391..437a844fd2 100644 --- a/OpenRA.Mods.Common/Traits/Cargo.cs +++ b/OpenRA.Mods.Common/Traits/Cargo.cs @@ -119,7 +119,7 @@ namespace OpenRA.Mods.Common.Traits helicopter = self.TraitOrDefault(); } - static int GetWeight(Actor a) { return a.Info.Traits.Get().Weight; } + static int GetWeight(Actor a) { return a.Info.TraitInfo().Weight; } public IEnumerable Orders { @@ -268,7 +268,7 @@ namespace OpenRA.Mods.Common.Traits foreach (var c in cargo) { - var pi = c.Info.Traits.Get(); + var pi = c.Info.TraitInfo(); if (n < pi.Weight) return pi.PipType; else diff --git a/OpenRA.Mods.Common/Traits/CombatDebugOverlay.cs b/OpenRA.Mods.Common/Traits/CombatDebugOverlay.cs index 22d8333ba6..5f9e256b9b 100644 --- a/OpenRA.Mods.Common/Traits/CombatDebugOverlay.cs +++ b/OpenRA.Mods.Common/Traits/CombatDebugOverlay.cs @@ -32,7 +32,7 @@ namespace OpenRA.Mods.Common.Traits public CombatDebugOverlay(Actor self) { - healthInfo = self.Info.Traits.GetOrDefault(); + healthInfo = self.Info.TraitInfoOrDefault(); attack = Exts.Lazy(() => self.TraitOrDefault()); coords = Exts.Lazy(() => self.Trait()); diff --git a/OpenRA.Mods.Common/Traits/Crates/Crate.cs b/OpenRA.Mods.Common/Traits/Crates/Crate.cs index f21cb545b5..76c3ecf91e 100644 --- a/OpenRA.Mods.Common/Traits/Crates/Crate.cs +++ b/OpenRA.Mods.Common/Traits/Crates/Crate.cs @@ -100,7 +100,7 @@ namespace OpenRA.Mods.Common.Traits var collector = landedOn.FirstOrDefault(a => { // Mobile is (currently) the only trait that supports crushing - var mi = a.Info.Traits.GetOrDefault(); + var mi = a.Info.TraitInfoOrDefault(); if (mi == null) return false; diff --git a/OpenRA.Mods.Common/Traits/Crates/DuplicateUnitCrateAction.cs b/OpenRA.Mods.Common/Traits/Crates/DuplicateUnitCrateAction.cs index f882fc4a6b..66c5343746 100644 --- a/OpenRA.Mods.Common/Traits/Crates/DuplicateUnitCrateAction.cs +++ b/OpenRA.Mods.Common/Traits/Crates/DuplicateUnitCrateAction.cs @@ -90,7 +90,7 @@ namespace OpenRA.Mods.Common.Traits // Restrict duplicate count to a maximum value if (info.MaxDuplicateValue > 0) { - var vi = collector.Info.Traits.GetOrDefault(); + var vi = collector.Info.TraitInfoOrDefault(); if (vi != null && vi.Cost > 0) duplicates = Math.Min(duplicates, info.MaxDuplicateValue / vi.Cost); } diff --git a/OpenRA.Mods.Common/Traits/Crates/GiveUnitCrateAction.cs b/OpenRA.Mods.Common/Traits/Crates/GiveUnitCrateAction.cs index a838c284ad..244be9ac19 100644 --- a/OpenRA.Mods.Common/Traits/Crates/GiveUnitCrateAction.cs +++ b/OpenRA.Mods.Common/Traits/Crates/GiveUnitCrateAction.cs @@ -93,7 +93,7 @@ namespace OpenRA.Mods.Common.Traits IEnumerable GetSuitableCells(CPos near, string unitName) { - var mi = self.World.Map.Rules.Actors[unitName].Traits.Get(); + var mi = self.World.Map.Rules.Actors[unitName].TraitInfo(); for (var i = -1; i < 2; i++) for (var j = -1; j < 2; j++) diff --git a/OpenRA.Mods.Common/Traits/CustomBuildTimeValue.cs b/OpenRA.Mods.Common/Traits/CustomBuildTimeValue.cs index 9c01a4bd5f..138e2916df 100644 --- a/OpenRA.Mods.Common/Traits/CustomBuildTimeValue.cs +++ b/OpenRA.Mods.Common/Traits/CustomBuildTimeValue.cs @@ -26,11 +26,11 @@ namespace OpenRA.Mods.Common.Traits { public static int GetBuildTime(this ActorInfo a) { - var csv = a.Traits.GetOrDefault(); + var csv = a.TraitInfoOrDefault(); if (csv != null) return csv.Value; - var cost = a.HasTraitInfo() ? a.Traits.Get().Cost : 0; + var cost = a.HasTraitInfo() ? a.TraitInfo().Cost : 0; var time = cost * (25 * 60) /* frames per min */ / 1000; diff --git a/OpenRA.Mods.Common/Traits/CustomSellValue.cs b/OpenRA.Mods.Common/Traits/CustomSellValue.cs index 67a12d8692..3fe3a5ab7d 100644 --- a/OpenRA.Mods.Common/Traits/CustomSellValue.cs +++ b/OpenRA.Mods.Common/Traits/CustomSellValue.cs @@ -25,10 +25,10 @@ namespace OpenRA.Mods.Common.Traits { public static int GetSellValue(this Actor a) { - var csv = a.Info.Traits.GetOrDefault(); + var csv = a.Info.TraitInfoOrDefault(); if (csv != null) return csv.Value; - var valued = a.Info.Traits.GetOrDefault(); + var valued = a.Info.TraitInfoOrDefault(); if (valued != null) return valued.Cost; return 0; diff --git a/OpenRA.Mods.Common/Traits/EmitInfantryOnSell.cs b/OpenRA.Mods.Common/Traits/EmitInfantryOnSell.cs index dcb9dba8ee..3fe899f86a 100644 --- a/OpenRA.Mods.Common/Traits/EmitInfantryOnSell.cs +++ b/OpenRA.Mods.Common/Traits/EmitInfantryOnSell.cs @@ -51,8 +51,8 @@ namespace OpenRA.Mods.Common.Traits if (!correctFaction) return; - var csv = self.Info.Traits.GetOrDefault(); - var valued = self.Info.Traits.GetOrDefault(); + var csv = self.Info.TraitInfoOrDefault(); + var valued = self.Info.TraitInfoOrDefault(); var cost = csv != null ? csv.Value : (valued != null ? valued.Cost : 0); var health = self.TraitOrDefault(); @@ -62,7 +62,7 @@ namespace OpenRA.Mods.Common.Traits dudesValue /= 100; var eligibleLocations = FootprintUtils.Tiles(self).ToList(); - var actorTypes = info.ActorTypes.Select(a => new { Name = a, Cost = self.World.Map.Rules.Actors[a].Traits.Get().Cost }).ToList(); + var actorTypes = info.ActorTypes.Select(a => new { Name = a, Cost = self.World.Map.Rules.Actors[a].TraitInfo().Cost }).ToList(); while (eligibleLocations.Count > 0 && actorTypes.Any(a => a.Cost <= dudesValue)) { diff --git a/OpenRA.Mods.Common/Traits/ExternalCapturable.cs b/OpenRA.Mods.Common/Traits/ExternalCapturable.cs index fa85fb4194..ccc4fc8741 100644 --- a/OpenRA.Mods.Common/Traits/ExternalCapturable.cs +++ b/OpenRA.Mods.Common/Traits/ExternalCapturable.cs @@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.Traits public bool CanBeTargetedBy(Actor captor, Player owner) { - var c = captor.Info.Traits.GetOrDefault(); + var c = captor.Info.TraitInfoOrDefault(); if (c == null) return false; diff --git a/OpenRA.Mods.Common/Traits/ExternalCaptures.cs b/OpenRA.Mods.Common/Traits/ExternalCaptures.cs index 9a3a9aa938..481dd80842 100644 --- a/OpenRA.Mods.Common/Traits/ExternalCaptures.cs +++ b/OpenRA.Mods.Common/Traits/ExternalCaptures.cs @@ -75,7 +75,7 @@ namespace OpenRA.Mods.Common.Traits if (frozen == null) return false; - var ci = frozen.Info.Traits.GetOrDefault(); + var ci = frozen.Info.TraitInfoOrDefault(); return ci != null && ci.CanBeTargetedBy(self, frozen.Owner); } @@ -121,7 +121,7 @@ namespace OpenRA.Mods.Common.Traits public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor) { - var c = target.Info.Traits.GetOrDefault(); + var c = target.Info.TraitInfoOrDefault(); var canTargetActor = c != null && c.CanBeTargetedBy(self, target.Owner); cursor = canTargetActor ? "ability" : "move-blocked"; diff --git a/OpenRA.Mods.Common/Traits/GainsExperience.cs b/OpenRA.Mods.Common/Traits/GainsExperience.cs index f1865ce280..4be061c769 100644 --- a/OpenRA.Mods.Common/Traits/GainsExperience.cs +++ b/OpenRA.Mods.Common/Traits/GainsExperience.cs @@ -55,7 +55,7 @@ namespace OpenRA.Mods.Common.Traits MaxLevel = info.Upgrades.Count; - var cost = self.Info.Traits.Get().Cost; + var cost = self.Info.TraitInfo().Cost; foreach (var kv in info.Upgrades) nextLevel.Add(Pair.New(kv.Key * cost, kv.Value)); diff --git a/OpenRA.Mods.Common/Traits/GivesBounty.cs b/OpenRA.Mods.Common/Traits/GivesBounty.cs index efce9fb063..8231f8239e 100644 --- a/OpenRA.Mods.Common/Traits/GivesBounty.cs +++ b/OpenRA.Mods.Common/Traits/GivesBounty.cs @@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Traits static int GetMultiplier(Actor self) { // returns 100's as 1, so as to keep accuracy for longer. - var info = self.Info.Traits.Get(); + var info = self.Info.TraitInfo(); var gainsExp = self.TraitOrDefault(); if (gainsExp == null) return 100; @@ -42,7 +42,7 @@ namespace OpenRA.Mods.Common.Traits public void Killed(Actor self, AttackInfo e) { - var info = self.Info.Traits.Get(); + var info = self.Info.TraitInfo(); if (e.Attacker == null || e.Attacker.Disposed) return; diff --git a/OpenRA.Mods.Common/Traits/GivesExperience.cs b/OpenRA.Mods.Common/Traits/GivesExperience.cs index 5d77d45655..42e741af9d 100644 --- a/OpenRA.Mods.Common/Traits/GivesExperience.cs +++ b/OpenRA.Mods.Common/Traits/GivesExperience.cs @@ -39,7 +39,7 @@ namespace OpenRA.Mods.Common.Traits if (e.Attacker == null || e.Attacker.Disposed || (!info.FriendlyFire && e.Attacker.Owner.Stances[self.Owner] == Stance.Ally)) return; - var valued = self.Info.Traits.GetOrDefault(); + var valued = self.Info.TraitInfoOrDefault(); // Default experience is 100 times our value var exp = info.Experience >= 0 diff --git a/OpenRA.Mods.Common/Traits/Guard.cs b/OpenRA.Mods.Common/Traits/Guard.cs index 99cb0454b7..0fc7182232 100644 --- a/OpenRA.Mods.Common/Traits/Guard.cs +++ b/OpenRA.Mods.Common/Traits/Guard.cs @@ -49,7 +49,7 @@ namespace OpenRA.Mods.Common.Traits { self.SetTargetLine(target, Color.Yellow); - var range = WDist.FromCells(target.Actor.Info.Traits.Get().Range); + var range = WDist.FromCells(target.Actor.Info.TraitInfo().Range); self.QueueActivity(false, new AttackMoveActivity(self, self.Trait().MoveFollow(self, target, WDist.Zero, range))); } diff --git a/OpenRA.Mods.Common/Traits/Harvester.cs b/OpenRA.Mods.Common/Traits/Harvester.cs index ffaf79a2f6..72b7685982 100644 --- a/OpenRA.Mods.Common/Traits/Harvester.cs +++ b/OpenRA.Mods.Common/Traits/Harvester.cs @@ -168,7 +168,7 @@ namespace OpenRA.Mods.Common.Traits // Start a search from each refinery's delivery location: List path; - var mi = self.Info.Traits.Get(); + var mi = self.Info.TraitInfo(); using (var search = PathSearch.FromPoints(self.World, mi, self, refs.Values.Select(r => r.Location), self.Location, false) .WithCustomCost(loc => { @@ -469,7 +469,7 @@ namespace OpenRA.Mods.Common.Traits return false; var res = self.World.WorldActor.Trait().GetRenderedResource(location); - var info = self.Info.Traits.Get(); + var info = self.Info.TraitInfo(); if (res == null || !info.Resources.Contains(res.Info.Name)) return false; diff --git a/OpenRA.Mods.Common/Traits/Passenger.cs b/OpenRA.Mods.Common/Traits/Passenger.cs index 0c0a5efb1b..3f48b2a837 100644 --- a/OpenRA.Mods.Common/Traits/Passenger.cs +++ b/OpenRA.Mods.Common/Traits/Passenger.cs @@ -138,7 +138,7 @@ namespace OpenRA.Mods.Common.Traits bool IsCorrectCargoType(Actor target) { - var ci = target.Info.Traits.Get(); + var ci = target.Info.TraitInfo(); return ci.Types.Contains(Info.CargoType); } diff --git a/OpenRA.Mods.Common/Traits/Player/ClassicProductionQueue.cs b/OpenRA.Mods.Common/Traits/Player/ClassicProductionQueue.cs index d43bbfc17d..23b4c88073 100644 --- a/OpenRA.Mods.Common/Traits/Player/ClassicProductionQueue.cs +++ b/OpenRA.Mods.Common/Traits/Player/ClassicProductionQueue.cs @@ -88,7 +88,7 @@ namespace OpenRA.Mods.Common.Traits { // Find a production structure to build this actor var ai = self.World.Map.Rules.Actors[name]; - var bi = ai.Traits.GetOrDefault(); + var bi = ai.TraitInfoOrDefault(); // Some units may request a specific production type, which is ignored if the AllTech cheat is enabled var type = bi == null || developerMode.AllTech ? Info.Type : bi.BuildAtProductionType ?? Info.Type; @@ -120,7 +120,7 @@ namespace OpenRA.Mods.Common.Traits public override int GetBuildTime(string unitString) { var ai = self.World.Map.Rules.Actors[unitString]; - var bi = ai.Traits.GetOrDefault(); + var bi = ai.TraitInfoOrDefault(); if (bi == null) return 0; diff --git a/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs b/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs index e3689bfdca..0e64eab782 100644 --- a/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs +++ b/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs @@ -33,7 +33,7 @@ namespace OpenRA.Mods.Common.Traits public IEnumerable Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition) { - if (!ai.Traits.Get().RequiresBaseProvider) + if (!ai.TraitInfo().RequiresBaseProvider) yield break; foreach (var a in w.ActorsWithTrait()) @@ -75,9 +75,9 @@ namespace OpenRA.Mods.Common.Traits var producer = queue.MostLikelyProducer(); var faction = producer.Trait != null ? producer.Trait.Faction : self.Owner.Faction.InternalName; - var buildingInfo = unit.Traits.Get(); + var buildingInfo = unit.TraitInfo(); - var buildableInfo = unit.Traits.GetOrDefault(); + var buildableInfo = unit.TraitInfoOrDefault(); if (buildableInfo != null && buildableInfo.ForceFaction != null) faction = buildableInfo.ForceFaction; @@ -106,7 +106,7 @@ namespace OpenRA.Mods.Common.Traits if (host == null) return; - var plugInfo = unit.Traits.GetOrDefault(); + var plugInfo = unit.TraitInfoOrDefault(); if (plugInfo == null) return; diff --git a/OpenRA.Mods.Common/Traits/Player/PlayerStatistics.cs b/OpenRA.Mods.Common/Traits/Player/PlayerStatistics.cs index bdc75261d3..76035ea867 100644 --- a/OpenRA.Mods.Common/Traits/Player/PlayerStatistics.cs +++ b/OpenRA.Mods.Common/Traits/Player/PlayerStatistics.cs @@ -120,7 +120,7 @@ namespace OpenRA.Mods.Common.Traits if (self.Info.HasTraitInfo()) { - var cost = self.Info.Traits.Get().Cost; + var cost = self.Info.TraitInfo().Cost; attackerStats.KillsCost += cost; defenderStats.DeathsCost += cost; } diff --git a/OpenRA.Mods.Common/Traits/Player/ProductionQueue.cs b/OpenRA.Mods.Common/Traits/Player/ProductionQueue.cs index e4ed86e53c..31e2be4740 100644 --- a/OpenRA.Mods.Common/Traits/Player/ProductionQueue.cs +++ b/OpenRA.Mods.Common/Traits/Player/ProductionQueue.cs @@ -155,7 +155,7 @@ namespace OpenRA.Mods.Common.Traits foreach (var a in AllBuildables(Info.Type)) { - var bi = a.Traits.Get(); + var bi = a.TraitInfo(); produceable.Add(a, new ProductionState()); ttc.Add(a.Name, bi.Prerequisites, bi.BuildLimit, this); @@ -168,7 +168,7 @@ namespace OpenRA.Mods.Common.Traits .Where(x => x.Name[0] != '^' && x.HasTraitInfo() && - x.Traits.Get().Queue.Contains(category)); + x.TraitInfo().Queue.Contains(category)); } public void PrerequisitesAvailable(string key) @@ -250,11 +250,11 @@ namespace OpenRA.Mods.Common.Traits case "StartProduction": { var unit = self.World.Map.Rules.Actors[order.TargetString]; - var bi = unit.Traits.Get(); + var bi = unit.TraitInfo(); if (!bi.Queue.Contains(Info.Type)) return; /* Not built by this queue */ - var cost = unit.HasTraitInfo() ? unit.Traits.Get().Cost : 0; + var cost = unit.HasTraitInfo() ? unit.TraitInfo().Cost : 0; var time = GetBuildTime(order.TargetString); if (BuildableItems().All(b => b.Name != order.TargetString)) diff --git a/OpenRA.Mods.Common/Traits/Player/TechTree.cs b/OpenRA.Mods.Common/Traits/Player/TechTree.cs index 5aabaf5021..5a471cc168 100644 --- a/OpenRA.Mods.Common/Traits/Player/TechTree.cs +++ b/OpenRA.Mods.Common/Traits/Player/TechTree.cs @@ -35,7 +35,7 @@ namespace OpenRA.Mods.Common.Traits public void ActorChanged(Actor a) { - var bi = a.Info.Traits.GetOrDefault(); + var bi = a.Info.TraitInfoOrDefault(); if (a.Owner == player && (a.Info.HasTraitInfo() || (bi != null && bi.BuildLimit > 0))) Update(); } @@ -98,7 +98,7 @@ namespace OpenRA.Mods.Common.Traits a.Actor.IsInWorld && !a.Actor.IsDead && !ret.ContainsKey(a.Actor.Info.Name) && - a.Actor.Info.Traits.Get().BuildLimit > 0) + a.Actor.Info.TraitInfo().BuildLimit > 0) .Do(b => ret[b.Actor.Info.Name].Add(b.Actor)); return ret; diff --git a/OpenRA.Mods.Common/Traits/Production.cs b/OpenRA.Mods.Common/Traits/Production.cs index 1be4fd1c8f..ae43f493ec 100644 --- a/OpenRA.Mods.Common/Traits/Production.cs +++ b/OpenRA.Mods.Common/Traits/Production.cs @@ -51,7 +51,7 @@ namespace OpenRA.Mods.Common.Traits var exitLocation = CPos.Zero; var target = Target.Invalid; - var bi = producee.Traits.GetOrDefault(); + var bi = producee.TraitInfoOrDefault(); if (bi != null && bi.ForceFaction != null) factionVariant = bi.ForceFaction; @@ -66,7 +66,7 @@ namespace OpenRA.Mods.Common.Traits var spawn = self.CenterPosition + exitinfo.SpawnOffset; var to = self.World.Map.CenterOfCell(exit); - var fi = producee.Traits.GetOrDefault(); + var fi = producee.TraitInfoOrDefault(); var initialFacing = exitinfo.Facing < 0 ? Util.GetFacing(to - spawn, fi == null ? 0 : fi.GetInitialFacing()) : exitinfo.Facing; exitLocation = rp.Value != null ? rp.Value.Location : exit; @@ -133,7 +133,7 @@ namespace OpenRA.Mods.Common.Traits static bool CanUseExit(Actor self, ActorInfo producee, ExitInfo s) { - var mobileInfo = producee.Traits.GetOrDefault(); + var mobileInfo = producee.TraitInfoOrDefault(); self.NotifyBlocker(self.Location + s.ExitCell); diff --git a/OpenRA.Mods.Common/Traits/ProvidesRadar.cs b/OpenRA.Mods.Common/Traits/ProvidesRadar.cs index 2d03f7542e..0dc88c22a5 100644 --- a/OpenRA.Mods.Common/Traits/ProvidesRadar.cs +++ b/OpenRA.Mods.Common/Traits/ProvidesRadar.cs @@ -28,7 +28,7 @@ namespace OpenRA.Mods.Common.Traits if (self.IsDisabled()) return false; var isJammed = self.World.ActorsWithTrait().Any(a => a.Actor.Owner.Stances[self.Owner] != Stance.Ally - && (self.Location - a.Actor.Location).Length <= a.Actor.Info.Traits.Get().Range); + && (self.Location - a.Actor.Location).Length <= a.Actor.Info.TraitInfo().Range); return !isJammed; } diff --git a/OpenRA.Mods.Common/Traits/ProximityCapturable.cs b/OpenRA.Mods.Common/Traits/ProximityCapturable.cs index eed7608fe2..0f0dd960cc 100644 --- a/OpenRA.Mods.Common/Traits/ProximityCapturable.cs +++ b/OpenRA.Mods.Common/Traits/ProximityCapturable.cs @@ -105,7 +105,7 @@ namespace OpenRA.Mods.Common.Traits bool CanBeCapturedBy(Actor a) { - var pc = a.Info.Traits.GetOrDefault(); + var pc = a.Info.TraitInfoOrDefault(); return pc != null && pc.Types.Overlaps(Info.CaptorTypes); } diff --git a/OpenRA.Mods.Common/Traits/QuantizeFacingsFromSequence.cs b/OpenRA.Mods.Common/Traits/QuantizeFacingsFromSequence.cs index 93c10dab09..59ee4e502d 100644 --- a/OpenRA.Mods.Common/Traits/QuantizeFacingsFromSequence.cs +++ b/OpenRA.Mods.Common/Traits/QuantizeFacingsFromSequence.cs @@ -28,7 +28,7 @@ namespace OpenRA.Mods.Common.Traits if (string.IsNullOrEmpty(Sequence)) throw new InvalidOperationException("Actor " + ai.Name + " is missing sequence to quantize facings from."); - var rsi = ai.Traits.Get(); + var rsi = ai.TraitInfo(); return sequenceProvider.GetSequence(rsi.GetImage(ai, sequenceProvider, race), Sequence).Facings; } diff --git a/OpenRA.Mods.Common/Traits/Render/ProductionBar.cs b/OpenRA.Mods.Common/Traits/Render/ProductionBar.cs index 0ed003b441..9375ea7954 100644 --- a/OpenRA.Mods.Common/Traits/Render/ProductionBar.cs +++ b/OpenRA.Mods.Common/Traits/Render/ProductionBar.cs @@ -43,7 +43,7 @@ namespace OpenRA.Mods.Common.Traits { if (queue == null) { - var type = info.ProductionType ?? self.Trait().Info.Produces.First(); + var type = info.ProductionType ?? self.Info.TraitInfo().Produces.First(); // Per-actor queue // Note: this includes disabled queues, as each bar must bind to exactly one queue. diff --git a/OpenRA.Mods.Common/Traits/Render/RenderRangeCircle.cs b/OpenRA.Mods.Common/Traits/Render/RenderRangeCircle.cs index bf205f39b8..6b8c5fcdfe 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderRangeCircle.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderRangeCircle.cs @@ -46,7 +46,7 @@ namespace OpenRA.Mods.Common.Traits foreach (var a in w.ActorsWithTrait()) if (a.Actor.Owner.IsAlliedWith(w.RenderPlayer)) - if (a.Actor.Info.Traits.Get().RangeCircleType == RangeCircleType) + if (a.Actor.Info.TraitInfo().RangeCircleType == RangeCircleType) foreach (var r in a.Trait.RenderAfterWorld(wr)) yield return r; } diff --git a/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs b/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs index 2a0d9b7f3e..be6c683d39 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs @@ -52,14 +52,14 @@ namespace OpenRA.Mods.Common.Traits var palette = init.WorldRenderer.Palette(Palette ?? PlayerPalette + ownerName); var facings = 0; - var body = init.Actor.Traits.GetOrDefault(); + var body = init.Actor.TraitInfoOrDefault(); if (body != null) { facings = body.QuantizedFacings; if (facings == -1) { - var qbo = init.Actor.Traits.GetOrDefault(); + var qbo = init.Actor.TraitInfoOrDefault(); facings = qbo != null ? qbo.QuantizedBodyFacings(init.Actor, sequenceProvider, faction) : 1; } } diff --git a/OpenRA.Mods.Common/Traits/Render/RenderVoxels.cs b/OpenRA.Mods.Common/Traits/Render/RenderVoxels.cs index 5f436e0602..b34d3a1c70 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderVoxels.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderVoxels.cs @@ -47,17 +47,17 @@ namespace OpenRA.Mods.Common.Traits public virtual IEnumerable RenderPreview(ActorPreviewInitializer init) { - var body = init.Actor.Traits.Get(); + var body = init.Actor.TraitInfo(); var faction = init.Get(); var ownerName = init.Get().PlayerName; var sequenceProvider = init.World.Map.SequenceProvider; var image = Image ?? init.Actor.Name; var facings = body.QuantizedFacings == -1 ? - init.Actor.Traits.Get().QuantizedBodyFacings(init.Actor, sequenceProvider, faction) : + init.Actor.TraitInfo().QuantizedBodyFacings(init.Actor, sequenceProvider, faction) : body.QuantizedFacings; var palette = init.WorldRenderer.Palette(Palette ?? PlayerPalette + ownerName); - var ifacing = init.Actor.Traits.GetOrDefault(); + var ifacing = init.Actor.TraitInfoOrDefault(); var facing = ifacing != null ? init.Contains() ? init.Get() : ifacing.GetInitialFacing() : 0; var orientation = WRot.FromFacing(facing); var components = init.Actor.Traits.WithInterface() diff --git a/OpenRA.Mods.Common/Traits/Render/WithBarrel.cs b/OpenRA.Mods.Common/Traits/Render/WithBarrel.cs index 14e25f0a1d..b81684e30d 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithBarrel.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithBarrel.cs @@ -36,7 +36,7 @@ namespace OpenRA.Mods.Common.Traits if (UpgradeMinEnabledLevel > 0) yield break; - var body = init.Actor.Traits.Get(); + var body = init.Actor.TraitInfo(); var armament = init.Actor.Traits.WithInterface() .First(a => a.Name == Armament); var t = init.Actor.Traits.WithInterface() diff --git a/OpenRA.Mods.Common/Traits/Render/WithBuildingExplosion.cs b/OpenRA.Mods.Common/Traits/Render/WithBuildingExplosion.cs index 07f282c6c1..f4ad19dbf8 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithBuildingExplosion.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithBuildingExplosion.cs @@ -41,7 +41,7 @@ namespace OpenRA.Mods.Common.Traits public WithBuildingExplosion(Actor self, WithBuildingExplosionInfo info) { this.info = info; - buildingInfo = self.Info.Traits.Get(); + buildingInfo = self.Info.TraitInfo(); } public void Killed(Actor self, AttackInfo e) diff --git a/OpenRA.Mods.Common/Traits/Render/WithFacingSpriteBody.cs b/OpenRA.Mods.Common/Traits/Render/WithFacingSpriteBody.cs index e8e158cdfe..d82cb75f52 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithFacingSpriteBody.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithFacingSpriteBody.cs @@ -22,7 +22,7 @@ namespace OpenRA.Mods.Common.Traits public override IEnumerable RenderPreviewSprites(ActorPreviewInitializer init, RenderSpritesInfo rs, string image, int facings, PaletteReference p) { - var ifacing = init.Actor.Traits.GetOrDefault(); + var ifacing = init.Actor.TraitInfoOrDefault(); var facing = ifacing != null ? init.Contains() ? init.Get() : ifacing.GetInitialFacing() : 0; var anim = new Animation(init.World, image, () => facing); diff --git a/OpenRA.Mods.Common/Traits/Render/WithIdleOverlay.cs b/OpenRA.Mods.Common/Traits/Render/WithIdleOverlay.cs index 7551e5da45..f5e3795534 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithIdleOverlay.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithIdleOverlay.cs @@ -46,7 +46,7 @@ namespace OpenRA.Mods.Common.Traits if (Palette != null) p = init.WorldRenderer.Palette(Palette); - var body = init.Actor.Traits.Get(); + var body = init.Actor.TraitInfo(); var facing = init.Contains() ? init.Get() : 0; var anim = new Animation(init.World, image, () => facing); anim.PlayRepeating(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence)); diff --git a/OpenRA.Mods.Common/Traits/Render/WithInfantryBody.cs b/OpenRA.Mods.Common/Traits/Render/WithInfantryBody.cs index 23d97a0b7b..e05f144020 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithInfantryBody.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithInfantryBody.cs @@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Traits public IEnumerable RenderPreviewSprites(ActorPreviewInitializer init, RenderSpritesInfo rs, string image, int facings, PaletteReference p) { var facing = 0; - var ifacing = init.Actor.Traits.GetOrDefault(); + var ifacing = init.Actor.TraitInfoOrDefault(); if (ifacing != null) facing = init.Contains() ? init.Get() : ifacing.GetInitialFacing(); diff --git a/OpenRA.Mods.Common/Traits/Render/WithParachute.cs b/OpenRA.Mods.Common/Traits/Render/WithParachute.cs index 2b8c205f32..bd43a7f7a0 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithParachute.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithParachute.cs @@ -69,7 +69,7 @@ namespace OpenRA.Mods.Common.Traits var anim = new Animation(init.World, image); anim.PlayThen(OpeningSequence, () => anim.PlayRepeating(Sequence)); - var body = init.Actor.Traits.Get(); + var body = init.Actor.TraitInfo(); var facing = init.Contains() ? init.Get() : 0; var orientation = body.QuantizeOrientation(new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(facing)), facings); var offset = body.LocalToWorld(Offset.Rotate(orientation)); diff --git a/OpenRA.Mods.Common/Traits/Render/WithProductionDoorOverlay.cs b/OpenRA.Mods.Common/Traits/Render/WithProductionDoorOverlay.cs index d5b61f8bc0..73484d9351 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithProductionDoorOverlay.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithProductionDoorOverlay.cs @@ -28,7 +28,7 @@ namespace OpenRA.Mods.Common.Traits var anim = new Animation(init.World, image, () => 0); anim.PlayFetchIndex(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence), () => 0); - var bi = init.Actor.Traits.Get(); + var bi = init.Actor.TraitInfo(); var offset = FootprintUtils.CenterOffset(init.World, bi).Y + 512; // Additional 512 units move from center -> top of cell yield return new SpriteActorPreview(anim, WVec.Zero, offset, p, rs.Scale); } @@ -50,7 +50,7 @@ namespace OpenRA.Mods.Common.Traits door.PlayFetchDirection(RenderSprites.NormalizeSequence(door, self.GetDamageState(), info.Sequence), () => desiredFrame - door.CurrentFrame); - var buildingInfo = self.Info.Traits.Get(); + var buildingInfo = self.Info.TraitInfo(); var offset = FootprintUtils.CenterOffset(self.World, buildingInfo).Y + 512; renderSprites.Add(new AnimationWithOffset(door, null, () => !buildComplete, offset)); diff --git a/OpenRA.Mods.Common/Traits/Render/WithProductionOverlay.cs b/OpenRA.Mods.Common/Traits/Render/WithProductionOverlay.cs index 53a6b94b51..aafc89a6fc 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithProductionOverlay.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithProductionOverlay.cs @@ -52,7 +52,7 @@ namespace OpenRA.Mods.Common.Traits var body = self.Trait(); buildComplete = !self.Info.HasTraitInfo(); // always render instantly for units - production = self.Info.Traits.Get(); + production = self.Info.TraitInfo(); overlay = new Animation(self.World, rs.GetImage(self)); overlay.PlayRepeating(info.Sequence); diff --git a/OpenRA.Mods.Common/Traits/Render/WithRotor.cs b/OpenRA.Mods.Common/Traits/Render/WithRotor.cs index 281648737a..6c1bfbf32e 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithRotor.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithRotor.cs @@ -32,7 +32,7 @@ namespace OpenRA.Mods.Common.Traits public IEnumerable RenderPreviewSprites(ActorPreviewInitializer init, RenderSpritesInfo rs, string image, int facings, PaletteReference p) { - var body = init.Actor.Traits.Get(); + var body = init.Actor.TraitInfo(); var facing = init.Contains() ? init.Get() : 0; var anim = new Animation(init.World, image, () => facing); anim.PlayRepeating(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence)); diff --git a/OpenRA.Mods.Common/Traits/Render/WithTurret.cs b/OpenRA.Mods.Common/Traits/Render/WithTurret.cs index 8dc9df6692..a198e33f6f 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithTurret.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithTurret.cs @@ -39,11 +39,11 @@ namespace OpenRA.Mods.Common.Traits if (UpgradeMinEnabledLevel > 0) yield break; - var body = init.Actor.Traits.Get(); + var body = init.Actor.TraitInfo(); var t = init.Actor.Traits.WithInterface() .First(tt => tt.Turret == Turret); - var ifacing = init.Actor.Traits.GetOrDefault(); + var ifacing = init.Actor.TraitInfoOrDefault(); var bodyFacing = ifacing != null ? init.Contains() ? init.Get() : ifacing.GetInitialFacing() : 0; var turretFacing = init.Contains() ? init.Get() : t.InitialFacing; diff --git a/OpenRA.Mods.Common/Traits/Render/WithVoxelBarrel.cs b/OpenRA.Mods.Common/Traits/Render/WithVoxelBarrel.cs index 071c1db511..a9994d0d11 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithVoxelBarrel.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithVoxelBarrel.cs @@ -34,7 +34,7 @@ namespace OpenRA.Mods.Common.Traits if (UpgradeMinEnabledLevel > 0) yield break; - var body = init.Actor.Traits.Get(); + var body = init.Actor.TraitInfo(); var armament = init.Actor.Traits.WithInterface() .First(a => a.Name == Armament); var t = init.Actor.Traits.WithInterface() diff --git a/OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs b/OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs index 692811dd79..97f75f80cd 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs @@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.Traits public IEnumerable RenderPreviewVoxels(ActorPreviewInitializer init, RenderVoxelsInfo rv, string image, WRot orientation, int facings, PaletteReference p) { - var body = init.Actor.Traits.Get(); + var body = init.Actor.TraitInfo(); var voxel = VoxelProvider.GetVoxel(image, "idle"); var bodyOrientation = new[] { body.QuantizeOrientation(orientation, facings) }; yield return new VoxelAnimation(voxel, () => WVec.Zero, @@ -51,7 +51,7 @@ namespace OpenRA.Mods.Common.Traits () => IsTraitDisabled, () => 0)); // Selection size - var rvi = self.Info.Traits.Get(); + var rvi = self.Info.TraitInfo(); var s = (int)(rvi.Scale * voxel.Size.Aggregate(Math.Max)); size = new int2(s, s); } diff --git a/OpenRA.Mods.Common/Traits/Render/WithVoxelTurret.cs b/OpenRA.Mods.Common/Traits/Render/WithVoxelTurret.cs index ea9f9e7617..83e6e39ab8 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithVoxelTurret.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithVoxelTurret.cs @@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Traits if (UpgradeMinEnabledLevel > 0) yield break; - var body = init.Actor.Traits.Get(); + var body = init.Actor.TraitInfo(); var t = init.Actor.Traits.WithInterface() .First(tt => tt.Turret == Turret); diff --git a/OpenRA.Mods.Common/Traits/Render/WithWallSpriteBody.cs b/OpenRA.Mods.Common/Traits/Render/WithWallSpriteBody.cs index 8976ef6742..c8da9c1200 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithWallSpriteBody.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithWallSpriteBody.cs @@ -39,7 +39,7 @@ namespace OpenRA.Mods.Common.Traits var haveNeighbour = false; foreach (var n in kv.Value) { - var rb = init.World.Map.Rules.Actors[n].Traits.GetOrDefault(); + var rb = init.World.Map.Rules.Actors[n].TraitInfoOrDefault(); if (rb != null && rb.Type == Type) { haveNeighbour = true; diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/AirstrikePower.cs b/OpenRA.Mods.Common/Traits/SupportPowers/AirstrikePower.cs index 67c17bebdd..50f85624a3 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/AirstrikePower.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/AirstrikePower.cs @@ -61,7 +61,7 @@ namespace OpenRA.Mods.Common.Traits if (randomize) attackFacing = Util.QuantizeFacing(self.World.SharedRandom.Next(256), info.QuantizedFacings) * (256 / info.QuantizedFacings); - var altitude = self.World.Map.Rules.Actors[info.UnitType].Traits.Get().CruiseAltitude.Length; + var altitude = self.World.Map.Rules.Actors[info.UnitType].TraitInfo().CruiseAltitude.Length; var attackRotation = WRot.FromFacing(attackFacing); var delta = new WVec(0, -1024, 0).Rotate(attackRotation); target = target + new WVec(0, 0, altitude); diff --git a/OpenRA.Mods.Common/Traits/Transforms.cs b/OpenRA.Mods.Common/Traits/Transforms.cs index 2eefdbf77b..eadf7309a7 100644 --- a/OpenRA.Mods.Common/Traits/Transforms.cs +++ b/OpenRA.Mods.Common/Traits/Transforms.cs @@ -61,7 +61,7 @@ namespace OpenRA.Mods.Common.Traits { self = init.Self; this.info = info; - buildingInfo = self.World.Map.Rules.Actors[info.IntoActor].Traits.GetOrDefault(); + buildingInfo = self.World.Map.Rules.Actors[info.IntoActor].TraitInfoOrDefault(); faction = init.Contains() ? init.Get() : self.Owner.Faction.InternalName; } diff --git a/OpenRA.Mods.Common/Traits/VeteranProductionIconOverlay.cs b/OpenRA.Mods.Common/Traits/VeteranProductionIconOverlay.cs index ec283cc8a7..b08b9d2da1 100644 --- a/OpenRA.Mods.Common/Traits/VeteranProductionIconOverlay.cs +++ b/OpenRA.Mods.Common/Traits/VeteranProductionIconOverlay.cs @@ -70,7 +70,7 @@ namespace OpenRA.Mods.Common.Traits foreach (var a in self.World.Map.Rules.Actors.Values) { - var uwc = a.Traits.GetOrDefault(); + var uwc = a.TraitInfoOrDefault(); if (uwc != null) ttc.Add(MakeKey(a.Name), uwc.Prerequisites, 0, this); } diff --git a/OpenRA.Mods.Common/Traits/World/BridgeLayer.cs b/OpenRA.Mods.Common/Traits/World/BridgeLayer.cs index f42e7f5853..ee038c4196 100644 --- a/OpenRA.Mods.Common/Traits/World/BridgeLayer.cs +++ b/OpenRA.Mods.Common/Traits/World/BridgeLayer.cs @@ -43,7 +43,7 @@ namespace OpenRA.Mods.Common.Traits // Build a list of templates that should be overlayed with bridges foreach (var bridge in info.Bridges) { - var bi = w.Map.Rules.Actors[bridge].Traits.Get(); + var bi = w.Map.Rules.Actors[bridge].TraitInfo(); foreach (var template in bi.Templates) bridgeTypes.Add(template.First, Pair.New(bridge, template.Second)); } diff --git a/OpenRA.Mods.Common/Traits/World/CrateSpawner.cs b/OpenRA.Mods.Common/Traits/World/CrateSpawner.cs index 175d2e43cd..52e71fd7d3 100644 --- a/OpenRA.Mods.Common/Traits/World/CrateSpawner.cs +++ b/OpenRA.Mods.Common/Traits/World/CrateSpawner.cs @@ -107,7 +107,7 @@ namespace OpenRA.Mods.Common.Traits var dropFacing = Util.QuantizeFacing(self.World.SharedRandom.Next(256), info.QuantizedFacings) * (256 / info.QuantizedFacings); var delta = new WVec(0, -1024, 0).Rotate(WRot.FromFacing(dropFacing)); - var altitude = self.World.Map.Rules.Actors[info.DeliveryAircraft].Traits.Get().CruiseAltitude.Length; + var altitude = self.World.Map.Rules.Actors[info.DeliveryAircraft].TraitInfo().CruiseAltitude.Length; var target = self.World.Map.CenterOfCell(p) + new WVec(0, 0, altitude); var startEdge = target - (self.World.Map.DistanceToEdge(target, -delta) + info.Cordon).Length * delta / 1024; var finishEdge = target + (self.World.Map.DistanceToEdge(target, delta) + info.Cordon).Length * delta / 1024; diff --git a/OpenRA.Mods.Common/Traits/World/DomainIndex.cs b/OpenRA.Mods.Common/Traits/World/DomainIndex.cs index b348e427d0..4cc34717e9 100644 --- a/OpenRA.Mods.Common/Traits/World/DomainIndex.cs +++ b/OpenRA.Mods.Common/Traits/World/DomainIndex.cs @@ -29,7 +29,7 @@ namespace OpenRA.Mods.Common.Traits domainIndexes = new Dictionary(); var movementClasses = world.Map.Rules.Actors.Where(ai => ai.Value.HasTraitInfo()) - .Select(ai => (uint)ai.Value.Traits.Get().GetMovementClass(world.TileSet)).Distinct(); + .Select(ai => (uint)ai.Value.TraitInfo().GetMovementClass(world.TileSet)).Distinct(); foreach (var mc in movementClasses) domainIndexes[mc] = new MovementClassDomainIndex(world, mc); diff --git a/OpenRA.Mods.Common/Traits/World/EditorActorPreview.cs b/OpenRA.Mods.Common/Traits/World/EditorActorPreview.cs index 279687484f..ba5f760954 100644 --- a/OpenRA.Mods.Common/Traits/World/EditorActorPreview.cs +++ b/OpenRA.Mods.Common/Traits/World/EditorActorPreview.cs @@ -56,7 +56,7 @@ namespace OpenRA.Mods.Common.Traits CenterPosition = PreviewPosition(world, actor.InitDict); var location = actor.InitDict.Get().Value(worldRenderer.World); - var ios = Info.Traits.GetOrDefault(); + var ios = Info.TraitInfoOrDefault(); var subCellInit = actor.InitDict.GetOrDefault(); var subCell = subCellInit != null ? subCellInit.Value(worldRenderer.World) : SubCell.Any; @@ -69,7 +69,7 @@ namespace OpenRA.Mods.Common.Traits Footprint = new ReadOnlyDictionary(footprint); } - var tooltip = Info.Traits.GetOrDefault(); + var tooltip = Info.TraitInfoOrDefault(); Tooltip = tooltip == null ? ID + ": " + Info.Name : ID + ": " + tooltip.Name + " (" + Info.Name + ")"; GeneratePreviews(); @@ -143,7 +143,7 @@ namespace OpenRA.Mods.Common.Traits var subCellInit = actor.InitDict.GetOrDefault(); var subCell = subCellInit != null ? subCellInit.Value(worldRenderer.World) : SubCell.Any; - var buildingInfo = Info.Traits.GetOrDefault(); + var buildingInfo = Info.TraitInfoOrDefault(); if (buildingInfo != null) offset = FootprintUtils.CenterOffset(world, buildingInfo); diff --git a/OpenRA.Mods.Common/Traits/World/PathFinder.cs b/OpenRA.Mods.Common/Traits/World/PathFinder.cs index 55dae83a6d..38ee07c3e5 100644 --- a/OpenRA.Mods.Common/Traits/World/PathFinder.cs +++ b/OpenRA.Mods.Common/Traits/World/PathFinder.cs @@ -61,7 +61,7 @@ namespace OpenRA.Mods.Common.Traits public List FindUnitPath(CPos source, CPos target, Actor self) { - var mi = self.Info.Traits.Get(); + var mi = self.Info.TraitInfo(); // If a water-land transition is required, bail early var domainIndex = world.WorldActor.TraitOrDefault(); @@ -84,7 +84,7 @@ namespace OpenRA.Mods.Common.Traits public List FindUnitPathToRange(CPos source, SubCell srcSub, WPos target, WDist range, Actor self) { - var mi = self.Info.Traits.Get(); + var mi = self.Info.TraitInfo(); var targetCell = world.Map.CellContaining(target); // Correct for SubCell offset diff --git a/OpenRA.Mods.Common/Traits/World/SpawnMPUnits.cs b/OpenRA.Mods.Common/Traits/World/SpawnMPUnits.cs index 4e85827e8f..138e19ce66 100644 --- a/OpenRA.Mods.Common/Traits/World/SpawnMPUnits.cs +++ b/OpenRA.Mods.Common/Traits/World/SpawnMPUnits.cs @@ -55,7 +55,7 @@ namespace OpenRA.Mods.Common.Traits foreach (var s in unitGroup.SupportActors) { - var mi = w.Map.Rules.Actors[s.ToLowerInvariant()].Traits.Get(); + var mi = w.Map.Rules.Actors[s.ToLowerInvariant()].TraitInfo(); var validCells = supportSpawnCells.Where(c => mi.CanEnterCell(w, null, c)); if (!validCells.Any()) throw new InvalidOperationException("No cells available to spawn starting unit {0}".F(s)); diff --git a/OpenRA.Mods.Common/UtilityCommands/RemapShpCommand.cs b/OpenRA.Mods.Common/UtilityCommands/RemapShpCommand.cs index ebde509782..8bacd27b6b 100644 --- a/OpenRA.Mods.Common/UtilityCommands/RemapShpCommand.cs +++ b/OpenRA.Mods.Common/UtilityCommands/RemapShpCommand.cs @@ -40,14 +40,14 @@ namespace OpenRA.Mods.Common.UtilityCommands Game.ModData = new ModData(srcMod); GlobalFileSystem.LoadFromManifest(Game.ModData.Manifest); var srcRules = Game.ModData.RulesetCache.Load(); - var srcPaletteInfo = srcRules.Actors["player"].Traits.Get(); + var srcPaletteInfo = srcRules.Actors["player"].TraitInfo(); var srcRemapIndex = srcPaletteInfo.RemapIndex; var destMod = args[2].Split(':')[0]; Game.ModData = new ModData(destMod); GlobalFileSystem.LoadFromManifest(Game.ModData.Manifest); var destRules = Game.ModData.RulesetCache.Load(); - var destPaletteInfo = destRules.Actors["player"].Traits.Get(); + var destPaletteInfo = destRules.Actors["player"].TraitInfo(); var destRemapIndex = destPaletteInfo.RemapIndex; var shadowIndex = new int[] { }; diff --git a/OpenRA.Mods.Common/Warheads/CreateEffectWarhead.cs b/OpenRA.Mods.Common/Warheads/CreateEffectWarhead.cs index 84cf2e9bef..48d4c26ce8 100644 --- a/OpenRA.Mods.Common/Warheads/CreateEffectWarhead.cs +++ b/OpenRA.Mods.Common/Warheads/CreateEffectWarhead.cs @@ -62,7 +62,7 @@ namespace OpenRA.Mods.Common.Warheads { foreach (var unit in world.ActorMap.GetUnitsAt(cell)) { - var healthInfo = unit.Info.Traits.GetOrDefault(); + var healthInfo = unit.Info.TraitInfoOrDefault(); if (healthInfo == null) continue; diff --git a/OpenRA.Mods.Common/Warheads/HealthPercentageDamageWarhead.cs b/OpenRA.Mods.Common/Warheads/HealthPercentageDamageWarhead.cs index 62d252d849..92bba3a1db 100644 --- a/OpenRA.Mods.Common/Warheads/HealthPercentageDamageWarhead.cs +++ b/OpenRA.Mods.Common/Warheads/HealthPercentageDamageWarhead.cs @@ -33,7 +33,7 @@ namespace OpenRA.Mods.Common.Warheads public override void DoImpact(Actor victim, Actor firedBy, IEnumerable damageModifiers) { - var healthInfo = victim.Info.Traits.GetOrDefault(); + var healthInfo = victim.Info.TraitInfoOrDefault(); if (healthInfo == null) return; diff --git a/OpenRA.Mods.Common/Warheads/SpreadDamageWarhead.cs b/OpenRA.Mods.Common/Warheads/SpreadDamageWarhead.cs index 148c9bae04..53c3946f1d 100644 --- a/OpenRA.Mods.Common/Warheads/SpreadDamageWarhead.cs +++ b/OpenRA.Mods.Common/Warheads/SpreadDamageWarhead.cs @@ -54,7 +54,7 @@ namespace OpenRA.Mods.Common.Warheads continue; var localModifiers = damageModifiers; - var healthInfo = victim.Info.Traits.GetOrDefault(); + var healthInfo = victim.Info.TraitInfoOrDefault(); if (healthInfo != null) { var distance = Math.Max(0, (victim.CenterPosition - pos).Length - healthInfo.Radius.Length); diff --git a/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorSelectorLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorSelectorLogic.cs index 59b9455d6b..94ea4be834 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorSelectorLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Editor/ActorSelectorLogic.cs @@ -98,7 +98,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic if (!actor.HasTraitInfo()) continue; - var filter = actor.Traits.GetOrDefault(); + var filter = actor.TraitInfoOrDefault(); if (filter != null) { if (filter.ExcludeTilesets != null && filter.ExcludeTilesets.Contains(world.TileSet.Id)) @@ -136,7 +136,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic item.Bounds.Height = preview.Bounds.Height + 2 * preview.Bounds.Y; item.IsVisible = () => true; - var tooltip = actor.Traits.GetOrDefault(); + var tooltip = actor.TraitInfoOrDefault(); item.GetTooltipText = () => tooltip == null ? actor.Name : tooltip.Name + " (" + actor.Name + ")"; panel.AddChild(item); diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/LoadIngamePlayerOrObserverUILogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/LoadIngamePlayerOrObserverUILogic.cs index 012bb9a144..de3b9101dd 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/LoadIngamePlayerOrObserverUILogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/LoadIngamePlayerOrObserverUILogic.cs @@ -32,7 +32,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic { var playerWidgets = Game.LoadWidget(world, "PLAYER_WIDGETS", playerRoot, new WidgetArgs()); var sidebarTicker = playerWidgets.Get("SIDEBAR_TICKER"); - var objectives = world.LocalPlayer.PlayerActor.Info.Traits.GetOrDefault(); + var objectives = world.LocalPlayer.PlayerActor.Info.TraitInfoOrDefault(); sidebarTicker.OnTick = () => { diff --git a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ProductionTooltipLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ProductionTooltipLogic.cs index 1b0b575c2d..34945e9926 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Ingame/ProductionTooltipLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Ingame/ProductionTooltipLogic.cs @@ -54,9 +54,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic if (actor == null || actor == lastActor) return; - var tooltip = actor.Traits.Get(); - var buildable = actor.Traits.Get(); - var cost = actor.Traits.Get().Cost; + var tooltip = actor.TraitInfo(); + var buildable = actor.TraitInfo(); + var cost = actor.TraitInfo().Cost; nameLabel.GetText = () => tooltip.Name; @@ -114,7 +114,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic { ActorInfo ai; if (rules.Actors.TryGetValue(a.ToLowerInvariant(), out ai) && ai.HasTraitInfo()) - return ai.Traits.Get().Name; + return ai.TraitInfo().Name; return a; } diff --git a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs index db5a852100..6f807e8e35 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs @@ -438,7 +438,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic Map.Map.Options.StartingCash.HasValue ? "Not Available" : "${0}".F(orderManager.LobbyInfo.GlobalSettings.StartingCash); startingCash.OnMouseDown = _ => { - var options = modRules.Actors["player"].Traits.Get().SelectableCash.Select(c => new DropDownOption + var options = modRules.Actors["player"].TraitInfo().SelectableCash.Select(c => new DropDownOption { Title = "${0}".F(c), IsSelected = () => orderManager.LobbyInfo.GlobalSettings.StartingCash == c, @@ -689,7 +689,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic orderManager.IssueOrder(Order.Command("state {0}".F(Session.ClientState.NotReady))); // Restore default starting cash if the last map set it to something invalid - var pri = modRules.Actors["player"].Traits.Get(); + var pri = modRules.Actors["player"].TraitInfo(); if (!Map.Map.Options.StartingCash.HasValue && !pri.SelectableCash.Contains(orderManager.LobbyInfo.GlobalSettings.StartingCash)) orderManager.IssueOrder(Order.Command("startingcash {0}".F(pri.DefaultCash))); } diff --git a/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs b/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs index 8acaa27032..70c6c3e447 100644 --- a/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs @@ -72,10 +72,10 @@ namespace OpenRA.Mods.Common.Widgets if (actor == null) continue; - var rsi = actor.Traits.Get(); + var rsi = actor.TraitInfo(); var icon = new Animation(world, rsi.GetImage(actor, world.Map.SequenceProvider, faction)); - icon.Play(actor.Traits.Get().Icon); - var bi = actor.Traits.Get(); + icon.Play(actor.TraitInfo().Icon); + var bi = actor.TraitInfo(); var location = new float2(RenderBounds.Location) + new float2(queue.i * (IconWidth + IconSpacing), 0); WidgetUtils.DrawSHPCentered(icon.Image, location + 0.5f * iconSize, worldRenderer.Palette(bi.IconPalette), 0.5f); diff --git a/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs b/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs index 07441be01f..31aafa8b79 100644 --- a/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs @@ -143,7 +143,7 @@ namespace OpenRA.Mods.Common.Widgets if (CurrentQueue == null) return Enumerable.Empty(); - return CurrentQueue.AllItems().OrderBy(a => a.Traits.Get().BuildPaletteOrder); + return CurrentQueue.AllItems().OrderBy(a => a.TraitInfo().BuildPaletteOrder); } } @@ -319,11 +319,11 @@ namespace OpenRA.Mods.Common.Widgets var y = DisplayedIconCount / Columns; var rect = new Rectangle(rb.X + x * (IconSize.X + IconMargin.X), rb.Y + y * (IconSize.Y + IconMargin.Y), IconSize.X, IconSize.Y); - var rsi = item.Traits.Get(); + var rsi = item.TraitInfo(); var icon = new Animation(World, rsi.GetImage(item, World.Map.SequenceProvider, faction)); - icon.Play(item.Traits.Get().Icon); + icon.Play(item.TraitInfo().Icon); - var bi = item.Traits.Get(); + var bi = item.TraitInfo(); var pi = new ProductionIcon() { diff --git a/OpenRA.Mods.Common/Widgets/WorldCommandWidget.cs b/OpenRA.Mods.Common/Widgets/WorldCommandWidget.cs index a91c994f8f..fb6c682c92 100644 --- a/OpenRA.Mods.Common/Widgets/WorldCommandWidget.cs +++ b/OpenRA.Mods.Common/Widgets/WorldCommandWidget.cs @@ -150,7 +150,7 @@ namespace OpenRA.Mods.Common.Widgets if (actor.First == null) return true; - var ati = actor.First.Info.Traits.GetOrDefault(); + var ati = actor.First.Info.TraitInfoOrDefault(); if (ati == null || !ati.EnableStances) return false; @@ -224,7 +224,7 @@ namespace OpenRA.Mods.Common.Widgets { var facilities = world.ActorsWithTrait() .Where(a => a.Actor.Owner == world.LocalPlayer && !a.Actor.Info.HasTraitInfo()) - .OrderBy(f => f.Actor.Info.Traits.Get().Produces.First()) + .OrderBy(f => f.Actor.Info.TraitInfo().Produces.First()) .Select(b => b.Actor) .ToList(); diff --git a/OpenRA.Mods.D2k/Traits/Buildings/FreeActorWithDelivery.cs b/OpenRA.Mods.D2k/Traits/Buildings/FreeActorWithDelivery.cs index 97aa9f7aa8..c1551ea723 100644 --- a/OpenRA.Mods.D2k/Traits/Buildings/FreeActorWithDelivery.cs +++ b/OpenRA.Mods.D2k/Traits/Buildings/FreeActorWithDelivery.cs @@ -81,7 +81,7 @@ namespace OpenRA.Mods.D2k.Traits var initialFacing = self.World.Map.FacingBetween(location, self.Location, 0); // If aircraft, spawn at cruise altitude - var aircraftInfo = self.World.Map.Rules.Actors[deliveringActorName.ToLower()].Traits.GetOrDefault(); + var aircraftInfo = self.World.Map.Rules.Actors[deliveringActorName.ToLower()].TraitInfoOrDefault(); if (aircraftInfo != null) spawn += new WVec(0, 0, aircraftInfo.CruiseAltitude.Length); diff --git a/OpenRA.Mods.D2k/Traits/Buildings/ProductionFromMapEdge.cs b/OpenRA.Mods.D2k/Traits/Buildings/ProductionFromMapEdge.cs index 43990e4deb..e7e8f35b44 100644 --- a/OpenRA.Mods.D2k/Traits/Buildings/ProductionFromMapEdge.cs +++ b/OpenRA.Mods.D2k/Traits/Buildings/ProductionFromMapEdge.cs @@ -33,7 +33,7 @@ namespace OpenRA.Mods.D2k.Traits var pos = self.World.Map.CenterOfCell(location); // If aircraft, spawn at cruise altitude - var aircraftInfo = producee.Traits.GetOrDefault(); + var aircraftInfo = producee.TraitInfoOrDefault(); if (aircraftInfo != null) pos += new WVec(0, 0, aircraftInfo.CruiseAltitude.Length); diff --git a/OpenRA.Mods.D2k/Traits/Carryall.cs b/OpenRA.Mods.D2k/Traits/Carryall.cs index 07a6663e0b..adc02c0113 100644 --- a/OpenRA.Mods.D2k/Traits/Carryall.cs +++ b/OpenRA.Mods.D2k/Traits/Carryall.cs @@ -50,7 +50,7 @@ namespace OpenRA.Mods.D2k.Traits IsBusy = false; IsCarrying = false; - var helicopter = self.Info.Traits.GetOrDefault(); + var helicopter = self.Info.TraitInfoOrDefault(); carryHeight = helicopter != null ? helicopter.LandAltitude : WDist.Zero; } diff --git a/OpenRA.Mods.RA/Activities/LayMines.cs b/OpenRA.Mods.RA/Activities/LayMines.cs index 64446c68c9..1c26a4bc2d 100644 --- a/OpenRA.Mods.RA/Activities/LayMines.cs +++ b/OpenRA.Mods.RA/Activities/LayMines.cs @@ -32,7 +32,7 @@ namespace OpenRA.Mods.RA.Activities public LayMines(Actor self) { minelayer = self.TraitOrDefault(); - info = self.Info.Traits.Get(); + info = self.Info.TraitInfo(); ammoPools = self.TraitsImplementing().ToArray(); movement = self.Trait(); rearmBuildings = info.RearmBuildings; diff --git a/OpenRA.Mods.RA/Traits/Buildings/ClonesProducedUnits.cs b/OpenRA.Mods.RA/Traits/Buildings/ClonesProducedUnits.cs index 69a27be08b..9634a8a93f 100644 --- a/OpenRA.Mods.RA/Traits/Buildings/ClonesProducedUnits.cs +++ b/OpenRA.Mods.RA/Traits/Buildings/ClonesProducedUnits.cs @@ -44,7 +44,7 @@ namespace OpenRA.Mods.RA.Traits if (producer.Owner != self.Owner || producer.Info.HasTraitInfo()) return; - var ci = produced.Info.Traits.GetOrDefault(); + var ci = produced.Info.TraitInfoOrDefault(); if (ci == null || !info.CloneableTypes.Overlaps(ci.Types)) return; diff --git a/OpenRA.Mods.RA/Traits/Disguise.cs b/OpenRA.Mods.RA/Traits/Disguise.cs index 96e814e4c1..a4f9dc53e8 100644 --- a/OpenRA.Mods.RA/Traits/Disguise.cs +++ b/OpenRA.Mods.RA/Traits/Disguise.cs @@ -167,7 +167,7 @@ namespace OpenRA.Mods.RA.Traits var oldDisguiseSetting = Disguised; var oldEffectiveOwner = AsPlayer; - var renderSprites = actorInfo.Traits.GetOrDefault(); + var renderSprites = actorInfo.TraitInfoOrDefault(); AsSprite = renderSprites == null ? null : renderSprites.GetImage(actorInfo, self.World.Map.SequenceProvider, newOwner.Faction.InternalName); AsPlayer = newOwner; AsTooltipInfo = actorInfo.Traits.WithInterface().FirstOrDefault(); diff --git a/OpenRA.Mods.RA/Traits/Minelayer.cs b/OpenRA.Mods.RA/Traits/Minelayer.cs index d29d2f8cda..f35ec224cc 100644 --- a/OpenRA.Mods.RA/Traits/Minelayer.cs +++ b/OpenRA.Mods.RA/Traits/Minelayer.cs @@ -88,7 +88,7 @@ namespace OpenRA.Mods.RA.Traits var movement = self.Trait(); Minefield = GetMinefieldCells(minefieldStart, order.TargetLocation, - self.Info.Traits.Get().MinefieldDepth) + self.Info.TraitInfo().MinefieldDepth) .Where(p => movement.CanEnterCell(p, null, false)).ToArray(); self.CancelActivity(); @@ -155,7 +155,7 @@ namespace OpenRA.Mods.RA.Traits var underCursor = world.ScreenMap.ActorsAt(mi) .Where(a => !world.FogObscures(a)) .MaxByOrDefault(a => a.Info.HasTraitInfo() - ? a.Info.Traits.Get().Priority : int.MinValue); + ? a.Info.TraitInfo().Priority : int.MinValue); if (mi.Button == Game.Settings.Game.MouseButtonPreference.Action && underCursor == null) { @@ -179,7 +179,7 @@ namespace OpenRA.Mods.RA.Traits var movement = minelayer.Trait(); var minefield = GetMinefieldCells(minefieldStart, lastMousePos, - minelayer.Info.Traits.Get().MinefieldDepth); + minelayer.Info.TraitInfo().MinefieldDepth); var pal = wr.Palette("terrain"); foreach (var c in minefield) diff --git a/OpenRA.Mods.RA/Traits/Render/RenderJammerCircle.cs b/OpenRA.Mods.RA/Traits/Render/RenderJammerCircle.cs index ac263cf3d5..1ab16ae834 100644 --- a/OpenRA.Mods.RA/Traits/Render/RenderJammerCircle.cs +++ b/OpenRA.Mods.RA/Traits/Render/RenderJammerCircle.cs @@ -22,7 +22,7 @@ namespace OpenRA.Mods.RA.Traits { public IEnumerable Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition) { - var jamsMissiles = ai.Traits.GetOrDefault(); + var jamsMissiles = ai.TraitInfoOrDefault(); if (jamsMissiles != null) { yield return new RangeCircleRenderable( @@ -33,7 +33,7 @@ namespace OpenRA.Mods.RA.Traits Color.FromArgb(96, Color.Black)); } - var jamsRadar = ai.Traits.GetOrDefault(); + var jamsRadar = ai.TraitInfoOrDefault(); if (jamsRadar != null) { yield return new RangeCircleRenderable( @@ -64,7 +64,7 @@ namespace OpenRA.Mods.RA.Traits if (!self.Owner.IsAlliedWith(self.World.RenderPlayer)) yield break; - var jamsMissiles = self.Info.Traits.GetOrDefault(); + var jamsMissiles = self.Info.TraitInfoOrDefault(); if (jamsMissiles != null) { yield return new RangeCircleRenderable( @@ -75,7 +75,7 @@ namespace OpenRA.Mods.RA.Traits Color.FromArgb(96, Color.Black)); } - var jamsRadar = self.Info.Traits.GetOrDefault(); + var jamsRadar = self.Info.TraitInfoOrDefault(); if (jamsRadar != null) { yield return new RangeCircleRenderable( diff --git a/OpenRA.Mods.RA/Traits/Render/RenderShroudCircle.cs b/OpenRA.Mods.RA/Traits/Render/RenderShroudCircle.cs index 2cb961ca14..abb04806c1 100644 --- a/OpenRA.Mods.RA/Traits/Render/RenderShroudCircle.cs +++ b/OpenRA.Mods.RA/Traits/Render/RenderShroudCircle.cs @@ -23,7 +23,7 @@ namespace OpenRA.Mods.RA.Traits { yield return new RangeCircleRenderable( centerPosition, - ai.Traits.Get().Range, + ai.TraitInfo().Range, 0, Color.FromArgb(128, Color.Cyan), Color.FromArgb(96, Color.Black)); @@ -50,7 +50,7 @@ namespace OpenRA.Mods.RA.Traits yield return new RangeCircleRenderable( self.CenterPosition, - self.Info.Traits.Get().Range, + self.Info.TraitInfo().Range, 0, Color.FromArgb(128, Color.Cyan), Color.FromArgb(96, Color.Black)); diff --git a/OpenRA.Mods.RA/Traits/SupportPowers/ParatroopersPower.cs b/OpenRA.Mods.RA/Traits/SupportPowers/ParatroopersPower.cs index 8b627d488a..b75097118e 100644 --- a/OpenRA.Mods.RA/Traits/SupportPowers/ParatroopersPower.cs +++ b/OpenRA.Mods.RA/Traits/SupportPowers/ParatroopersPower.cs @@ -72,7 +72,7 @@ namespace OpenRA.Mods.RA.Traits if (randomize) dropFacing = Util.QuantizeFacing(self.World.SharedRandom.Next(256), info.QuantizedFacings) * (256 / info.QuantizedFacings); - var altitude = self.World.Map.Rules.Actors[info.UnitType].Traits.Get().CruiseAltitude.Length; + var altitude = self.World.Map.Rules.Actors[info.UnitType].TraitInfo().CruiseAltitude.Length; var dropRotation = WRot.FromFacing(dropFacing); var delta = new WVec(0, -1024, 0).Rotate(dropRotation); target = target + new WVec(0, 0, altitude); diff --git a/OpenRA.Mods.TS/Traits/Render/WithVoxelUnloadBody.cs b/OpenRA.Mods.TS/Traits/Render/WithVoxelUnloadBody.cs index e56e89da71..efd6756191 100644 --- a/OpenRA.Mods.TS/Traits/Render/WithVoxelUnloadBody.cs +++ b/OpenRA.Mods.TS/Traits/Render/WithVoxelUnloadBody.cs @@ -30,7 +30,7 @@ namespace OpenRA.Mods.TS.Traits public IEnumerable RenderPreviewVoxels(ActorPreviewInitializer init, RenderVoxelsInfo rv, string image, WRot orientation, int facings, PaletteReference p) { - var body = init.Actor.Traits.Get(); + var body = init.Actor.TraitInfo(); var voxel = VoxelProvider.GetVoxel(image, "idle"); yield return new VoxelAnimation(voxel, () => WVec.Zero, () => new[] { body.QuantizeOrientation(orientation, facings) }, @@ -56,7 +56,7 @@ namespace OpenRA.Mods.TS.Traits () => 0)); // Selection size - var rvi = self.Info.Traits.Get(); + var rvi = self.Info.TraitInfo(); var s = (int)(rvi.Scale * idleVoxel.Size.Aggregate(Math.Max)); size = new int2(s, s); diff --git a/OpenRA.Mods.TS/Traits/Render/WithVoxelWalkerBody.cs b/OpenRA.Mods.TS/Traits/Render/WithVoxelWalkerBody.cs index 68415e9127..b92f31d624 100644 --- a/OpenRA.Mods.TS/Traits/Render/WithVoxelWalkerBody.cs +++ b/OpenRA.Mods.TS/Traits/Render/WithVoxelWalkerBody.cs @@ -44,7 +44,7 @@ namespace OpenRA.Mods.TS.Traits () => false, () => frame)); // Selection size - var rvi = self.Info.Traits.Get(); + var rvi = self.Info.TraitInfo(); var s = (int)(rvi.Scale * voxel.Size.Aggregate(Math.Max)); size = new int2(s, s); } diff --git a/OpenRA.Mods.TS/Traits/Render/WithVoxelWaterBody.cs b/OpenRA.Mods.TS/Traits/Render/WithVoxelWaterBody.cs index bb5893eb18..c9d59a650a 100644 --- a/OpenRA.Mods.TS/Traits/Render/WithVoxelWaterBody.cs +++ b/OpenRA.Mods.TS/Traits/Render/WithVoxelWaterBody.cs @@ -35,7 +35,7 @@ namespace OpenRA.Mods.TS.Traits sequence = onWater ? WaterSequence : LandSequence; } - var body = init.Actor.Traits.Get(); + var body = init.Actor.TraitInfo(); var voxel = VoxelProvider.GetVoxel(image, sequence); yield return new VoxelAnimation(voxel, () => WVec.Zero, () => new[] { body.QuantizeOrientation(orientation, facings) }, @@ -64,7 +64,7 @@ namespace OpenRA.Mods.TS.Traits () => 0)); // Selection size - var rvi = self.Info.Traits.Get(); + var rvi = self.Info.TraitInfo(); var s = (int)(rvi.Scale * landVoxel.Size.Aggregate(Math.Max)); size = new int2(s, s);