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);