diff --git a/OpenRA.Mods.Cnc/Traits/Chronoshiftable.cs b/OpenRA.Mods.Cnc/Traits/Chronoshiftable.cs index cc0b10d09a..7f92aaf3f6 100644 --- a/OpenRA.Mods.Cnc/Traits/Chronoshiftable.cs +++ b/OpenRA.Mods.Cnc/Traits/Chronoshiftable.cs @@ -107,7 +107,7 @@ namespace OpenRA.Mods.Cnc.Traits protected override void Created(Actor self) { - iPositionable = self.TraitOrDefault(); + iPositionable = self.OccupiesSpace as IPositionable; base.Created(self); } diff --git a/OpenRA.Mods.Common/Activities/Parachute.cs b/OpenRA.Mods.Common/Activities/Parachute.cs index d276c68b39..8ed048f8d6 100644 --- a/OpenRA.Mods.Common/Activities/Parachute.cs +++ b/OpenRA.Mods.Common/Activities/Parachute.cs @@ -23,8 +23,7 @@ namespace OpenRA.Mods.Common.Activities public Parachute(Actor self) { - pos = self.TraitOrDefault(); - + pos = self.OccupiesSpace as IPositionable; fallVector = new WVec(0, 0, self.Info.TraitInfo().FallRate); IsInterruptible = false; } diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs index 75af478d3a..d6cadb1f33 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs @@ -94,7 +94,7 @@ namespace OpenRA.Mods.Common.Traits protected override void Created(Actor self) { facing = self.TraitOrDefault(); - positionable = self.TraitOrDefault(); + positionable = self.OccupiesSpace as IPositionable; notifyAiming = self.TraitsImplementing().ToArray(); getArmaments = InitializeGetArmaments(self); diff --git a/OpenRA.Mods.Common/Traits/Crates/DuplicateUnitCrateAction.cs b/OpenRA.Mods.Common/Traits/Crates/DuplicateUnitCrateAction.cs index fb812bd371..ab80cde475 100644 --- a/OpenRA.Mods.Common/Traits/Crates/DuplicateUnitCrateAction.cs +++ b/OpenRA.Mods.Common/Traits/Crates/DuplicateUnitCrateAction.cs @@ -65,8 +65,7 @@ namespace OpenRA.Mods.Common.Traits if (!info.ValidTargets.Overlaps(collector.GetEnabledTargetTypes())) return false; - var positionable = collector.TraitOrDefault(); - if (positionable == null) + if (collector.OccupiesSpace is not IPositionable positionable) return false; return collector.World.Map.FindTilesInCircle(collector.Location, info.MaxRadius) @@ -83,7 +82,7 @@ namespace OpenRA.Mods.Common.Traits public override void Activate(Actor collector) { - var positionable = collector.Trait(); + var positionable = collector.OccupiesSpace as IPositionable; var candidateCells = collector.World.Map.FindTilesInCircle(collector.Location, info.MaxRadius) .Where(c => positionable.CanEnterCell(c)).Shuffle(collector.World.SharedRandom) .ToArray(); diff --git a/OpenRA.Mods.Common/Traits/World/ActorMap.cs b/OpenRA.Mods.Common/Traits/World/ActorMap.cs index eb69987737..5356997454 100644 --- a/OpenRA.Mods.Common/Traits/World/ActorMap.cs +++ b/OpenRA.Mods.Common/Traits/World/ActorMap.cs @@ -355,8 +355,8 @@ namespace OpenRA.Mods.Common.Traits if (checkTransient) return true; - var pos = i.Actor.TraitOrDefault(); - if (pos == null || !pos.IsLeavingCell(a, i.SubCell)) + // PERF: Avoid trait lookup + if (i.Actor.OccupiesSpace is not IPositionable pos || !pos.IsLeavingCell(a, i.SubCell)) return true; } }