Add ActorInfo.TraitInfo[OrDefault]<T>() requiring ITraitIfo types

This commit is contained in:
atlimit8
2015-08-03 16:07:33 -05:00
parent 6970959ef1
commit 09984683a7
115 changed files with 195 additions and 193 deletions

View File

@@ -103,7 +103,7 @@ namespace OpenRA
bounds = Exts.Lazy(() => bounds = Exts.Lazy(() =>
{ {
var si = Info.Traits.GetOrDefault<SelectableInfo>(); var si = Info.TraitInfoOrDefault<SelectableInfo>();
var size = (si != null && si.Bounds != null) ? new int2(si.Bounds[0], si.Bounds[1]) : var size = (si != null && si.Bounds != null) ? new int2(si.Bounds[0], si.Bounds[1]) :
TraitsImplementing<IAutoSelectionSize>().Select(x => x.SelectionSize(this)).FirstOrDefault(); TraitsImplementing<IAutoSelectionSize>().Select(x => x.SelectionSize(this)).FirstOrDefault();
@@ -116,7 +116,7 @@ namespace OpenRA
visualBounds = Exts.Lazy(() => visualBounds = Exts.Lazy(() =>
{ {
var sd = Info.Traits.GetOrDefault<ISelectionDecorationsInfo>(); var sd = Info.TraitInfoOrDefault<ISelectionDecorationsInfo>();
if (sd == null || sd.SelectionBoxBounds == null) if (sd == null || sd.SelectionBoxBounds == null)
return bounds.Value; return bounds.Value;

View File

@@ -185,5 +185,7 @@ namespace OpenRA
} }
public bool HasTraitInfo<T>() where T : ITraitInfo { return Traits.Contains<T>(); } public bool HasTraitInfo<T>() where T : ITraitInfo { return Traits.Contains<T>(); }
public T TraitInfo<T>() where T : ITraitInfo { return Traits.Get<T>(); }
public T TraitInfoOrDefault<T>() where T : ITraitInfo { return Traits.GetOrDefault<T>(); }
} }
} }

View File

@@ -18,7 +18,7 @@ namespace OpenRA.Traits
{ {
public static int SelectionPriority(this ActorInfo a) public static int SelectionPriority(this ActorInfo a)
{ {
var selectableInfo = a.Traits.GetOrDefault<SelectableInfo>(); var selectableInfo = a.TraitInfoOrDefault<SelectableInfo>();
return selectableInfo != null ? selectableInfo.Priority : int.MinValue; return selectableInfo != null ? selectableInfo.Priority : int.MinValue;
} }
@@ -26,7 +26,7 @@ namespace OpenRA.Traits
public static int SelectionPriority(this Actor a) public static int SelectionPriority(this Actor a)
{ {
var basePriority = a.Info.Traits.Get<SelectableInfo>().Priority; var basePriority = a.Info.TraitInfo<SelectableInfo>().Priority;
var lp = a.World.LocalPlayer; var lp = a.World.LocalPlayer;
if (a.Owner == lp || lp == null) if (a.Owner == lp || lp == null)

View File

@@ -75,7 +75,7 @@ namespace OpenRA
if (actor.Owner != world.LocalPlayer || !actor.IsInWorld) if (actor.Owner != world.LocalPlayer || !actor.IsInWorld)
continue; continue;
var selectable = actor.Info.Traits.GetOrDefault<SelectableInfo>(); var selectable = actor.Info.TraitInfoOrDefault<SelectableInfo>();
if (selectable == null || !actor.HasVoice(selectable.Voice)) if (selectable == null || !actor.HasVoice(selectable.Voice))
continue; continue;

View File

@@ -115,7 +115,7 @@ namespace OpenRA.Traits
public interface ISeedableResource { void Seed(Actor self); } public interface ISeedableResource { void Seed(Actor self); }
public interface ISelectionDecorationsInfo public interface ISelectionDecorationsInfo : ITraitInfo
{ {
int[] SelectionBoxBounds { get; } int[] SelectionBoxBounds { get; }
} }

View File

@@ -55,7 +55,7 @@ namespace OpenRA.Mods.Cnc.Traits
if (!self.IsInWorld || self.IsDead) if (!self.IsInWorld || self.IsDead)
return; return;
var altitude = self.World.Map.Rules.Actors[actorType].Traits.Get<PlaneInfo>().CruiseAltitude; var altitude = self.World.Map.Rules.Actors[actorType].TraitInfo<PlaneInfo>().CruiseAltitude;
var actor = w.CreateActor(actorType, new TypeDictionary var actor = w.CreateActor(actorType, new TypeDictionary
{ {
new CenterPositionInit(w.Map.CenterOfCell(startPos) + new WVec(WDist.Zero, WDist.Zero, altitude)), new CenterPositionInit(w.Map.CenterOfCell(startPos) + new WVec(WDist.Zero, WDist.Zero, altitude)),

View File

@@ -208,7 +208,7 @@ namespace OpenRA.Mods.Common.AI
protected float RelativeSpeed(IEnumerable<Actor> own, IEnumerable<Actor> enemy) protected float RelativeSpeed(IEnumerable<Actor> own, IEnumerable<Actor> enemy)
{ {
return RelativeValue(own, enemy, 100, Average<MobileInfo>, (Actor a) => a.Info.Traits.Get<MobileInfo>().Speed); return RelativeValue(own, enemy, 100, Average<MobileInfo>, (Actor a) => a.Info.TraitInfo<MobileInfo>().Speed);
} }
protected static float RelativeValue(IEnumerable<Actor> own, IEnumerable<Actor> enemy, float normalizeByValue, protected static float RelativeValue(IEnumerable<Actor> own, IEnumerable<Actor> enemy, float normalizeByValue,

View File

@@ -433,7 +433,7 @@ namespace OpenRA.Mods.Common.AI
// For mods like RA (number of building must match the number of aircraft) // For mods like RA (number of building must match the number of aircraft)
bool HasAdequateAirUnitReloadBuildings(ActorInfo actorInfo) bool HasAdequateAirUnitReloadBuildings(ActorInfo actorInfo)
{ {
var aircraftInfo = actorInfo.Traits.GetOrDefault<AircraftInfo>(); var aircraftInfo = actorInfo.TraitInfoOrDefault<AircraftInfo>();
if (aircraftInfo == null) if (aircraftInfo == null)
return true; return true;
@@ -453,7 +453,7 @@ namespace OpenRA.Mods.Common.AI
CPos defenseCenter; CPos defenseCenter;
public CPos? ChooseBuildLocation(string actorType, bool distanceToBaseIsImportant, BuildingType type) public CPos? ChooseBuildLocation(string actorType, bool distanceToBaseIsImportant, BuildingType type)
{ {
var bi = Map.Rules.Actors[actorType].Traits.GetOrDefault<BuildingInfo>(); var bi = Map.Rules.Actors[actorType].TraitInfoOrDefault<BuildingInfo>();
if (bi == null) if (bi == null)
return null; return null;
@@ -657,8 +657,8 @@ namespace OpenRA.Mods.Common.AI
CPos FindNextResource(Actor self) CPos FindNextResource(Actor self)
{ {
var harvInfo = self.Info.Traits.Get<HarvesterInfo>(); var harvInfo = self.Info.TraitInfo<HarvesterInfo>();
var mobileInfo = self.Info.Traits.Get<MobileInfo>(); var mobileInfo = self.Info.TraitInfo<MobileInfo>();
var passable = (uint)mobileInfo.GetMovementClass(World.TileSet); var passable = (uint)mobileInfo.GetMovementClass(World.TileSet);
var path = pathfinder.FindPath( var path = pathfinder.FindPath(
@@ -807,7 +807,7 @@ namespace OpenRA.Mods.Common.AI
{ {
var buildings = self.World.ActorsWithTrait<RallyPoint>() var buildings = self.World.ActorsWithTrait<RallyPoint>()
.Where(rp => rp.Actor.Owner == Player && .Where(rp => rp.Actor.Owner == Player &&
!IsRallyPointValid(rp.Trait.Location, rp.Actor.Info.Traits.GetOrDefault<BuildingInfo>())).ToArray(); !IsRallyPointValid(rp.Trait.Location, rp.Actor.Info.TraitInfoOrDefault<BuildingInfo>())).ToArray();
foreach (var a in buildings) foreach (var a in buildings)
QueueOrder(new Order("SetRallyPoint", a.Actor, false) { TargetLocation = ChooseRallyLocationNear(a.Actor), SuppressVisualFeedback = true }); 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) CPos ChooseRallyLocationNear(Actor producer)
{ {
var possibleRallyPoints = Map.FindTilesInCircle(producer.Location, Info.RallyPointScanRadius) var possibleRallyPoints = Map.FindTilesInCircle(producer.Location, Info.RallyPointScanRadius)
.Where(c => IsRallyPointValid(c, producer.Info.Traits.GetOrDefault<BuildingInfo>())); .Where(c => IsRallyPointValid(c, producer.Info.TraitInfoOrDefault<BuildingInfo>()));
if (!possibleRallyPoints.Any()) if (!possibleRallyPoints.Any())
{ {
@@ -863,7 +863,7 @@ namespace OpenRA.Mods.Common.AI
if (mcv.IsMoving()) if (mcv.IsMoving())
continue; continue;
var factType = mcv.Info.Traits.Get<TransformsInfo>().IntoActor; var factType = mcv.Info.TraitInfo<TransformsInfo>().IntoActor;
var desiredLocation = ChooseBuildLocation(factType, false, BuildingType.Building); var desiredLocation = ChooseBuildLocation(factType, false, BuildingType.Building);
if (desiredLocation == null) if (desiredLocation == null)
continue; continue;

View File

@@ -134,7 +134,7 @@ namespace OpenRA.Mods.Common.AI
switch (TargetMetric) switch (TargetMetric)
{ {
case DecisionMetric.Value: case DecisionMetric.Value:
var valueInfo = a.Info.Traits.GetOrDefault<ValuedInfo>(); var valueInfo = a.Info.TraitInfoOrDefault<ValuedInfo>();
return (valueInfo != null) ? valueInfo.Cost * Attractiveness : 0; return (valueInfo != null) ? valueInfo.Cost * Attractiveness : 0;
case DecisionMetric.Health: case DecisionMetric.Health:

View File

@@ -28,12 +28,12 @@ namespace OpenRA.Mods.Common.Activities
{ {
this.dest = dest; this.dest = dest;
plane = self.Trait<Plane>(); plane = self.Trait<Plane>();
planeInfo = self.Info.Traits.Get<PlaneInfo>(); planeInfo = self.Info.TraitInfo<PlaneInfo>();
} }
public static Actor ChooseAirfield(Actor self, bool unreservedOnly) public static Actor ChooseAirfield(Actor self, bool unreservedOnly)
{ {
var rearmBuildings = self.Info.Traits.Get<PlaneInfo>().RearmBuildings; var rearmBuildings = self.Info.TraitInfo<PlaneInfo>().RearmBuildings;
return self.World.ActorsWithTrait<Reservable>() return self.World.ActorsWithTrait<Reservable>()
.Where(a => a.Actor.Owner == self.Owner) .Where(a => a.Actor.Owner == self.Owner)
.Where(a => rearmBuildings.Contains(a.Actor.Info.Name) .Where(a => rearmBuildings.Contains(a.Actor.Info.Name)

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.Activities
{ {
actor = target; actor = target;
building = actor.TraitOrDefault<Building>(); building = actor.TraitOrDefault<Building>();
capturesInfo = self.Info.Traits.Get<CapturesInfo>(); capturesInfo = self.Info.TraitInfo<CapturesInfo>();
capturable = target.Trait<Capturable>(); capturable = target.Trait<Capturable>();
health = actor.Trait<Health>(); health = actor.Trait<Health>();
} }

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.Activities
{ {
this.target = target; this.target = target;
capturable = target.Actor.Trait<ExternalCapturable>(); capturable = target.Actor.Trait<ExternalCapturable>();
capturesInfo = self.Info.Traits.Get<ExternalCapturesInfo>(); capturesInfo = self.Info.TraitInfo<ExternalCapturesInfo>();
mobile = self.Trait<Mobile>(); mobile = self.Trait<Mobile>();
} }

View File

@@ -34,9 +34,9 @@ namespace OpenRA.Mods.Common.Activities
public FindResources(Actor self) public FindResources(Actor self)
{ {
harv = self.Trait<Harvester>(); harv = self.Trait<Harvester>();
harvInfo = self.Info.Traits.Get<HarvesterInfo>(); harvInfo = self.Info.TraitInfo<HarvesterInfo>();
mobile = self.Trait<Mobile>(); mobile = self.Trait<Mobile>();
mobileInfo = self.Info.Traits.Get<MobileInfo>(); mobileInfo = self.Info.TraitInfo<MobileInfo>();
resLayer = self.World.WorldActor.Trait<ResourceLayer>(); resLayer = self.World.WorldActor.Trait<ResourceLayer>();
territory = self.World.WorldActor.TraitOrDefault<ResourceClaimLayer>(); territory = self.World.WorldActor.TraitOrDefault<ResourceClaimLayer>();
pathFinder = self.World.WorldActor.Trait<IPathFinder>(); pathFinder = self.World.WorldActor.Trait<IPathFinder>();

View File

@@ -25,7 +25,7 @@ namespace OpenRA.Mods.Common.Activities
public HarvestResource(Actor self) public HarvestResource(Actor self)
{ {
harv = self.Trait<Harvester>(); harv = self.Trait<Harvester>();
harvInfo = self.Info.Traits.Get<HarvesterInfo>(); harvInfo = self.Info.TraitInfo<HarvesterInfo>();
facing = self.Trait<IFacing>(); facing = self.Trait<IFacing>();
territory = self.World.WorldActor.TraitOrDefault<ResourceClaimLayer>(); territory = self.World.WorldActor.TraitOrDefault<ResourceClaimLayer>();
resLayer = self.World.WorldActor.Trait<ResourceLayer>(); resLayer = self.World.WorldActor.Trait<ResourceLayer>();

View File

@@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Activities
pos = self.TraitOrDefault<IPositionable>(); pos = self.TraitOrDefault<IPositionable>();
// Parachutable trait is a prerequisite for running this activity // Parachutable trait is a prerequisite for running this activity
para = self.Info.Traits.Get<ParachutableInfo>(); para = self.Info.TraitInfo<ParachutableInfo>();
fallVector = new WVec(0, 0, para.FallRate); fallVector = new WVec(0, 0, para.FallRate);
this.dropPosition = dropPosition; this.dropPosition = dropPosition;
} }

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.Activities
public Repair(Actor host) public Repair(Actor host)
{ {
this.host = host; this.host = host;
repairsUnits = host.Info.Traits.Get<RepairsUnitsInfo>(); repairsUnits = host.Info.TraitInfo<RepairsUnitsInfo>();
} }
public override Activity Tick(Actor self) public override Activity Tick(Actor self)
@@ -45,7 +45,7 @@ namespace OpenRA.Mods.Common.Activities
if (remainingTicks == 0) if (remainingTicks == 0)
{ {
var unitCost = self.Info.Traits.Get<ValuedInfo>().Cost; var unitCost = self.Info.TraitInfo<ValuedInfo>().Cost;
var hpToRepair = repairsUnits.HpPerStep; var hpToRepair = repairsUnits.HpPerStep;
var cost = Math.Max(1, (hpToRepair * unitCost * repairsUnits.ValuePercentage) / (health.MaxHP * 100)); var cost = Math.Max(1, (hpToRepair * unitCost * repairsUnits.ValuePercentage) / (health.MaxHP * 100));

View File

@@ -24,7 +24,7 @@ namespace OpenRA.Mods.Common.Activities
public Sell(Actor self) public Sell(Actor self)
{ {
health = self.TraitOrDefault<Health>(); health = self.TraitOrDefault<Health>();
sellableInfo = self.Info.Traits.Get<SellableInfo>(); sellableInfo = self.Info.TraitInfo<SellableInfo>();
playerResources = self.Owner.PlayerActor.Trait<PlayerResources>(); playerResources = self.Owner.PlayerActor.Trait<PlayerResources>();
} }

View File

@@ -22,7 +22,7 @@ namespace OpenRA.Mods.Common.Activities
: base(self, refinery, dockAngle, isDragRequired, dragOffset, dragLength) : base(self, refinery, dockAngle, isDragRequired, dragOffset, dragLength)
{ {
wsb = self.Trait<WithSpriteBody>(); wsb = self.Trait<WithSpriteBody>();
wda = self.Info.Traits.Get<WithDockingAnimationInfo>(); wda = self.Info.TraitInfo<WithDockingAnimationInfo>();
} }
public override Activity OnStateDock(Actor self) public override Activity OnStateDock(Actor self)

View File

@@ -54,7 +54,7 @@ namespace OpenRA.Mods.Common.Widgets
preview.GetScale = () => worldRenderer.Viewport.Zoom; preview.GetScale = () => worldRenderer.Viewport.Zoom;
preview.IsVisible = () => editorWidget.CurrentBrush == this; preview.IsVisible = () => editorWidget.CurrentBrush == this;
var buildingInfo = actor.Traits.GetOrDefault<BuildingInfo>(); var buildingInfo = actor.TraitInfoOrDefault<BuildingInfo>();
if (buildingInfo != null) if (buildingInfo != null)
{ {
locationOffset = -FootprintUtils.AdjustForBuildingSize(buildingInfo); locationOffset = -FootprintUtils.AdjustForBuildingSize(buildingInfo);
@@ -68,7 +68,7 @@ namespace OpenRA.Mods.Common.Widgets
td.Add(new FactionInit(owner.Faction)); td.Add(new FactionInit(owner.Faction));
preview.SetPreview(actor, td); preview.SetPreview(actor, td);
var ios = actor.Traits.GetOrDefault<IOccupySpaceInfo>(); var ios = actor.TraitInfoOrDefault<IOccupySpaceInfo>();
if (ios != null) if (ios != null)
footprint = ios.OccupiedCells(actor, CPos.Zero) footprint = ios.OccupiedCells(actor, CPos.Zero)
.Select(c => c.Key - CPos.Zero) .Select(c => c.Key - CPos.Zero)
@@ -106,7 +106,7 @@ namespace OpenRA.Mods.Common.Widgets
cell += locationOffset; cell += locationOffset;
newActorReference.Add(new LocationInit(cell)); newActorReference.Add(new LocationInit(cell));
var ios = Actor.Traits.GetOrDefault<IOccupySpaceInfo>(); var ios = Actor.TraitInfoOrDefault<IOccupySpaceInfo>();
if (ios != null && ios.SharesCell) if (ios != null && ios.SharesCell)
{ {
var subcell = editorLayer.FreeSubCellAt(cell); var subcell = editorLayer.FreeSubCellAt(cell);

View File

@@ -33,10 +33,10 @@ namespace OpenRA.Mods.Common.Lint
emitError("Actor type `{0}` defines multiple default visibility types!".F(actorInfo.Key)); emitError("Actor type `{0}` defines multiple default visibility types!".F(actorInfo.Key));
else else
{ {
var vis = actorInfo.Value.Traits.GetOrDefault<HiddenUnderShroudInfo>(); var vis = actorInfo.Value.TraitInfoOrDefault<HiddenUnderShroudInfo>();
if (vis != null && vis.Type == VisibilityType.Footprint) if (vis != null && vis.Type == VisibilityType.Footprint)
{ {
var ios = actorInfo.Value.Traits.GetOrDefault<IOccupySpaceInfo>(); var ios = actorInfo.Value.TraitInfoOrDefault<IOccupySpaceInfo>();
if (ios == null) if (ios == null)
emitError("Actor type `{0}` defines VisibilityType.Footprint in `{1}` but has no IOccupySpace traits!".F(actorInfo.Key, vis.GetType())); 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()) else if (!ios.OccupiedCells(actorInfo.Value, CPos.Zero).Any())

View File

@@ -25,7 +25,7 @@ namespace OpenRA.Mods.Common.Lint
if (actorInfo.Key.StartsWith("^")) if (actorInfo.Key.StartsWith("^"))
continue; continue;
var ios = actorInfo.Value.Traits.GetOrDefault<IOccupySpaceInfo>(); var ios = actorInfo.Value.TraitInfoOrDefault<IOccupySpaceInfo>();
foreach (var rsi in actorInfo.Value.Traits.WithInterface<RevealsShroudInfo>()) foreach (var rsi in actorInfo.Value.Traits.WithInterface<RevealsShroudInfo>())
{ {
if (rsi.Type == VisibilityType.CenterPosition) if (rsi.Type == VisibilityType.CenterPosition)

View File

@@ -34,7 +34,7 @@ namespace OpenRA.Mods.Common.Lint
// TODO: this check is case insensitive while the real check in-game is not // TODO: this check is case insensitive while the real check in-game is not
foreach (var i in rules.Actors) foreach (var i in rules.Actors)
{ {
var bi = i.Value.Traits.GetOrDefault<BuildableInfo>(); var bi = i.Value.TraitInfoOrDefault<BuildableInfo>();
if (bi != null) if (bi != null)
foreach (var prereq in bi.Prerequisites) foreach (var prereq in bi.Prerequisites)
if (!prereq.StartsWith("~disabled")) if (!prereq.StartsWith("~disabled"))

View File

@@ -35,7 +35,7 @@ namespace OpenRA.Mods.Common.Orders
public PlaceBuildingOrderGenerator(ProductionQueue queue, string name) public PlaceBuildingOrderGenerator(ProductionQueue queue, string name)
{ {
producer = queue.Actor; producer = queue.Actor;
placeBuildingInfo = producer.Owner.PlayerActor.Info.Traits.Get<PlaceBuildingInfo>(); placeBuildingInfo = producer.Owner.PlayerActor.Info.TraitInfo<PlaceBuildingInfo>();
building = name; building = name;
// Clear selection if using Left-Click Orders // Clear selection if using Left-Click Orders
@@ -46,9 +46,9 @@ namespace OpenRA.Mods.Common.Orders
var tileset = producer.World.TileSet.Id.ToLowerInvariant(); var tileset = producer.World.TileSet.Id.ToLowerInvariant();
var info = map.Rules.Actors[building]; var info = map.Rules.Actors[building];
buildingInfo = info.Traits.Get<BuildingInfo>(); buildingInfo = info.TraitInfo<BuildingInfo>();
var buildableInfo = info.Traits.Get<BuildableInfo>(); var buildableInfo = info.TraitInfo<BuildableInfo>();
var mostLikelyProducer = queue.MostLikelyProducer(); var mostLikelyProducer = queue.MostLikelyProducer();
faction = buildableInfo.ForceFaction faction = buildableInfo.ForceFaction
?? (mostLikelyProducer.Trait != null ? mostLikelyProducer.Trait.Faction : producer.Owner.Faction.InternalName); ?? (mostLikelyProducer.Trait != null ? mostLikelyProducer.Trait.Faction : producer.Owner.Faction.InternalName);
@@ -81,7 +81,7 @@ namespace OpenRA.Mods.Common.Orders
var orderType = "PlaceBuilding"; var orderType = "PlaceBuilding";
var topLeft = xy - FootprintUtils.AdjustForBuildingSize(buildingInfo); var topLeft = xy - FootprintUtils.AdjustForBuildingSize(buildingInfo);
var plugInfo = world.Map.Rules.Actors[building].Traits.GetOrDefault<PlugInfo>(); var plugInfo = world.Map.Rules.Actors[building].TraitInfoOrDefault<PlugInfo>();
if (plugInfo != null) if (plugInfo != null)
{ {
orderType = "PlacePlug"; orderType = "PlacePlug";
@@ -148,7 +148,7 @@ namespace OpenRA.Mods.Common.Orders
var cells = new Dictionary<CPos, bool>(); var cells = new Dictionary<CPos, bool>();
var plugInfo = rules.Actors[building].Traits.GetOrDefault<PlugInfo>(); var plugInfo = rules.Actors[building].TraitInfoOrDefault<PlugInfo>();
if (plugInfo != null) if (plugInfo != null)
{ {
if (buildingInfo.Dimensions.X != 1 || buildingInfo.Dimensions.Y != 1) if (buildingInfo.Dimensions.X != 1 || buildingInfo.Dimensions.Y != 1)

View File

@@ -76,7 +76,7 @@ namespace OpenRA.Mods.Common.Scripting
if (!Context.World.Map.Rules.Actors.TryGetValue(type, out ai)) if (!Context.World.Map.Rules.Actors.TryGetValue(type, out ai))
throw new LuaException("Unknown actor type '{0}'".F(type)); throw new LuaException("Unknown actor type '{0}'".F(type));
var pi = ai.Traits.GetOrDefault<ICruiseAltitudeInfo>(); var pi = ai.TraitInfoOrDefault<ICruiseAltitudeInfo>();
return pi != null ? pi.GetCruiseAltitude().Length : 0; return pi != null ? pi.GetCruiseAltitude().Length : 0;
} }
} }

View File

@@ -39,7 +39,7 @@ namespace OpenRA.Mods.Common.Scripting
if (entryLocation.HasValue) if (entryLocation.HasValue)
{ {
var pi = ai.Traits.GetOrDefault<AircraftInfo>(); var pi = ai.TraitInfoOrDefault<AircraftInfo>();
initDict.Add(new CenterPositionInit(owner.World.Map.CenterOfCell(entryLocation.Value) + new WVec(0, 0, pi != null ? pi.CruiseAltitude.Length : 0))); 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)); initDict.Add(new LocationInit(entryLocation.Value));
} }
@@ -137,7 +137,7 @@ namespace OpenRA.Mods.Common.Scripting
} }
else else
{ {
var heli = transport.Info.Traits.GetOrDefault<HelicopterInfo>(); var heli = transport.Info.TraitInfoOrDefault<HelicopterInfo>();
if (heli != null) if (heli != null)
{ {
transport.QueueActivity(new Turn(transport, heli.InitialFacing)); transport.QueueActivity(new Turn(transport, heli.InitialFacing));

View File

@@ -26,15 +26,15 @@ namespace OpenRA.Mods.Common.Scripting
public CaptureProperties(ScriptContext context, Actor self) public CaptureProperties(ScriptContext context, Actor self)
: base(context, self) : base(context, self)
{ {
normalInfo = Self.Info.Traits.GetOrDefault<CapturesInfo>(); normalInfo = Self.Info.TraitInfoOrDefault<CapturesInfo>();
externalInfo = Self.Info.Traits.GetOrDefault<ExternalCapturesInfo>(); externalInfo = Self.Info.TraitInfoOrDefault<ExternalCapturesInfo>();
} }
[Desc("Captures the target actor.")] [Desc("Captures the target actor.")]
public void Capture(Actor target) public void Capture(Actor target)
{ {
var normalCapturable = target.Info.Traits.GetOrDefault<CapturableInfo>(); var normalCapturable = target.Info.TraitInfoOrDefault<CapturableInfo>();
var externalCapturable = target.Info.Traits.GetOrDefault<ExternalCapturableInfo>(); var externalCapturable = target.Info.TraitInfoOrDefault<ExternalCapturableInfo>();
if (normalInfo != null && normalCapturable != null && normalInfo.CaptureTypes.Contains(normalCapturable.Type)) if (normalInfo != null && normalCapturable != null && normalInfo.CaptureTypes.Contains(normalCapturable.Type))
Self.QueueActivity(new CaptureActor(Self, target)); Self.QueueActivity(new CaptureActor(Self, target));

View File

@@ -27,7 +27,7 @@ namespace OpenRA.Mods.Common.Scripting
public DemolitionProperties(ScriptContext context, Actor self) public DemolitionProperties(ScriptContext context, Actor self)
: base(context, self) : base(context, self)
{ {
info = Self.Info.Traits.Get<C4DemolitionInfo>(); info = Self.Info.TraitInfo<C4DemolitionInfo>();
} }
[ScriptActorPropertyActivity] [ScriptActorPropertyActivity]

View File

@@ -160,7 +160,7 @@ namespace OpenRA.Mods.Common.Scripting
BuildableInfo GetBuildableInfo(string actorType) BuildableInfo GetBuildableInfo(string actorType)
{ {
var ri = Self.World.Map.Rules.Actors[actorType]; var ri = Self.World.Map.Rules.Actors[actorType];
var bi = ri.Traits.GetOrDefault<BuildableInfo>(); var bi = ri.TraitInfoOrDefault<BuildableInfo>();
if (bi == null) if (bi == null)
throw new LuaException("Actor of type {0} cannot be produced".F(actorType)); 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) BuildableInfo GetBuildableInfo(string actorType)
{ {
var ri = Player.World.Map.Rules.Actors[actorType]; var ri = Player.World.Map.Rules.Actors[actorType];
var bi = ri.Traits.GetOrDefault<BuildableInfo>(); var bi = ri.TraitInfoOrDefault<BuildableInfo>();
if (bi == null) if (bi == null)
throw new LuaException("Actor of type {0} cannot be produced".F(actorType)); throw new LuaException("Actor of type {0} cannot be produced".F(actorType));

View File

@@ -158,7 +158,7 @@ namespace OpenRA.Mods.Common.Traits
return WVec.Zero; return WVec.Zero;
return self.World.FindActorsInCircle(self.CenterPosition, info.IdealSeparation) return self.World.FindActorsInCircle(self.CenterPosition, info.IdealSeparation)
.Where(a => !a.IsDead && a.Info.HasTraitInfo<AircraftInfo>() && a.Info.Traits.Get<AircraftInfo>().CruiseAltitude == info.CruiseAltitude) .Where(a => !a.IsDead && a.Info.HasTraitInfo<AircraftInfo>() && a.Info.TraitInfo<AircraftInfo>().CruiseAltitude == info.CruiseAltitude)
.Select(GetRepulsionForce) .Select(GetRepulsionForce)
.Aggregate(WVec.Zero, (a, b) => a + b); .Aggregate(WVec.Zero, (a, b) => a + b);
} }

View File

@@ -72,7 +72,7 @@ namespace OpenRA.Mods.Common.Traits
if (info.QuantizedFacings >= 0) if (info.QuantizedFacings >= 0)
return info.QuantizedFacings; return info.QuantizedFacings;
var qboi = self.Info.Traits.GetOrDefault<IQuantizeBodyOrientationInfo>(); var qboi = self.Info.TraitInfoOrDefault<IQuantizeBodyOrientationInfo>();
// If a sprite actor has neither custom QuantizedFacings nor a trait implementing IQuantizeBodyOrientationInfo, throw // If a sprite actor has neither custom QuantizedFacings nor a trait implementing IQuantizeBodyOrientationInfo, throw
if (qboi == null) if (qboi == null)

View File

@@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Traits
if (Palette != null) if (Palette != null)
p = init.WorldRenderer.Palette(Palette); p = init.WorldRenderer.Palette(Palette);
var bi = init.Actor.Traits.Get<BuildingInfo>(); var bi = init.Actor.TraitInfo<BuildingInfo>();
var width = bi.Dimensions.X; var width = bi.Dimensions.X;
var bibOffset = bi.Dimensions.Y - 1; var bibOffset = bi.Dimensions.Y - 1;
@@ -75,7 +75,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
this.info = info; this.info = info;
rs = self.Trait<RenderSprites>(); rs = self.Trait<RenderSprites>();
bi = self.Info.Traits.Get<BuildingInfo>(); bi = self.Info.TraitInfo<BuildingInfo>();
} }
public void AddedToWorld(Actor self) public void AddedToWorld(Actor self)

View File

@@ -93,7 +93,7 @@ namespace OpenRA.Mods.Common.Traits
this.info = info; this.info = info;
type = self.Info.Name; type = self.Info.Name;
isDangling = new Lazy<bool>(() => huts[0] == huts[1] && (neighbours[0] == null || neighbours[1] == null)); isDangling = new Lazy<bool>(() => huts[0] == huts[1] && (neighbours[0] == null || neighbours[1] == null));
building = self.Info.Traits.Get<BuildingInfo>(); building = self.Info.TraitInfo<BuildingInfo>();
} }
public Bridge Neighbour(int direction) { return neighbours[direction]; } public Bridge Neighbour(int direction) { return neighbours[direction]; }

View File

@@ -64,8 +64,8 @@ namespace OpenRA.Mods.Common.Traits
return false; return false;
var buildingMaxBounds = Dimensions; var buildingMaxBounds = Dimensions;
var buildingTraits = world.Map.Rules.Actors[buildingName].Traits; var bibInfo = world.Map.Rules.Actors[buildingName].TraitInfoOrDefault<BibInfo>();
if (buildingTraits.Contains<BibInfo>() && !buildingTraits.Get<BibInfo>().HasMinibib) if (bibInfo != null && !bibInfo.HasMinibib)
buildingMaxBounds += new CVec(0, 1); buildingMaxBounds += new CVec(0, 1);
var scanStart = world.Map.Clamp(topLeft - new CVec(Adjacent, Adjacent)); var scanStart = world.Map.Clamp(topLeft - new CVec(Adjacent, Adjacent));

View File

@@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Traits
world.ActorAdded += a => world.ActorAdded += a =>
{ {
var b = a.Info.Traits.GetOrDefault<BuildingInfo>(); var b = a.Info.TraitInfoOrDefault<BuildingInfo>();
if (b == null) if (b == null)
return; return;
@@ -42,7 +42,7 @@ namespace OpenRA.Mods.Common.Traits
world.ActorRemoved += a => world.ActorRemoved += a =>
{ {
var b = a.Info.Traits.GetOrDefault<BuildingInfo>(); var b = a.Info.TraitInfoOrDefault<BuildingInfo>();
if (b == null) if (b == null)
return; return;

View File

@@ -50,7 +50,7 @@ namespace OpenRA.Mods.Common.Traits
public static IEnumerable<CPos> GetLineBuildCells(World world, CPos location, string name, BuildingInfo bi) public static IEnumerable<CPos> GetLineBuildCells(World world, CPos location, string name, BuildingInfo bi)
{ {
var lbi = world.Map.Rules.Actors[name].Traits.Get<LineBuildInfo>(); var lbi = world.Map.Rules.Actors[name].TraitInfo<LineBuildInfo>();
var topLeft = location; // 1x1 assumption! var topLeft = location; // 1x1 assumption!
if (world.IsCellBuildable(topLeft, bi)) if (world.IsCellBuildable(topLeft, bi))
@@ -74,7 +74,7 @@ namespace OpenRA.Mods.Common.Traits
// Cell contains an actor. Is it the type we want? // Cell contains an actor. Is it the type we want?
if (world.ActorsWithTrait<LineBuildNode>().Any(a => if (world.ActorsWithTrait<LineBuildNode>().Any(a =>
(a.Actor.Location == cell && (a.Actor.Location == cell &&
a.Actor.Info.Traits.Get<LineBuildNodeInfo>() a.Actor.Info.TraitInfo<LineBuildNodeInfo>()
.Types.Overlaps(lbi.NodeTypes)))) .Types.Overlaps(lbi.NodeTypes))))
dirs[d] = i; // Cell contains actor of correct type dirs[d] = i; // Cell contains actor of correct type
else else

View File

@@ -22,8 +22,8 @@ namespace OpenRA.Mods.Common.Traits
var footprint = buildingInfo.Footprint.Where(x => !char.IsWhiteSpace(x)); var footprint = buildingInfo.Footprint.Where(x => !char.IsWhiteSpace(x));
var buildingTraits = rules.Actors[name].Traits; var bibInfo = rules.Actors[name].TraitInfoOrDefault<BibInfo>();
if (buildingTraits.Contains<BibInfo>() && !buildingTraits.Get<BibInfo>().HasMinibib) if (bibInfo != null && !bibInfo.HasMinibib)
{ {
dim += new CVec(0, 1); dim += new CVec(0, 1);
footprint = footprint.Concat(new char[dim.X]); footprint = footprint.Concat(new char[dim.X]);
@@ -34,7 +34,7 @@ namespace OpenRA.Mods.Common.Traits
public static IEnumerable<CPos> Tiles(Actor a) public static IEnumerable<CPos> Tiles(Actor a)
{ {
return Tiles(a.World.Map.Rules, a.Info.Name, a.Info.Traits.Get<BuildingInfo>(), a.Location); return Tiles(a.World.Map.Rules, a.Info.Name, a.Info.TraitInfo<BuildingInfo>(), a.Location);
} }
public static IEnumerable<CPos> UnpathableTiles(string name, BuildingInfo buildingInfo, CPos position) public static IEnumerable<CPos> UnpathableTiles(string name, BuildingInfo buildingInfo, CPos position)

View File

@@ -66,7 +66,7 @@ namespace OpenRA.Mods.Common.Traits
// TODO: THIS IS SHIT // TODO: THIS IS SHIT
// Cancel existing primaries // Cancel existing primaries
foreach (var p in self.Info.Traits.Get<ProductionInfo>().Produces) foreach (var p in self.Info.TraitInfo<ProductionInfo>().Produces)
{ {
var productionType = p; // benign closure hazard var productionType = p; // benign closure hazard
foreach (var b in self.World foreach (var b in self.World
@@ -74,7 +74,7 @@ namespace OpenRA.Mods.Common.Traits
.Where(a => .Where(a =>
a.Actor.Owner == self.Owner && a.Actor.Owner == self.Owner &&
a.Trait.IsPrimary && a.Trait.IsPrimary &&
a.Actor.Info.Traits.Get<ProductionInfo>().Produces.Contains(productionType))) a.Actor.Info.TraitInfo<ProductionInfo>().Produces.Contains(productionType)))
b.Trait.SetPrimaryProducer(b.Actor, false); b.Trait.SetPrimaryProducer(b.Actor, false);
} }

View File

@@ -29,7 +29,7 @@ namespace OpenRA.Mods.Common.Traits
public bool CanBeTargetedBy(Actor captor, Player owner) public bool CanBeTargetedBy(Actor captor, Player owner)
{ {
var c = captor.Info.Traits.GetOrDefault<CapturesInfo>(); var c = captor.Info.TraitInfoOrDefault<CapturesInfo>();
if (c == null) if (c == null)
return false; return false;

View File

@@ -92,7 +92,7 @@ namespace OpenRA.Mods.Common.Traits
public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor) public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor)
{ {
var c = target.Info.Traits.GetOrDefault<CapturableInfo>(); var c = target.Info.TraitInfoOrDefault<CapturableInfo>();
if (c == null || !c.CanBeTargetedBy(self, target.Owner)) if (c == null || !c.CanBeTargetedBy(self, target.Owner))
{ {
cursor = "enter-blocked"; 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) public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor)
{ {
var c = target.Info.Traits.GetOrDefault<CapturableInfo>(); var c = target.Info.TraitInfoOrDefault<CapturableInfo>();
if (c == null || !c.CanBeTargetedBy(self, target.Owner)) if (c == null || !c.CanBeTargetedBy(self, target.Owner))
{ {
cursor = "enter-blocked"; cursor = "enter-blocked";
return false; return false;
} }
var health = target.Info.Traits.GetOrDefault<HealthInfo>(); var health = target.Info.TraitInfoOrDefault<HealthInfo>();
var lowEnoughHealth = target.HP <= c.CaptureThreshold * health.HP; var lowEnoughHealth = target.HP <= c.CaptureThreshold * health.HP;
cursor = !sabotage || lowEnoughHealth || target.Owner.NonCombatant cursor = !sabotage || lowEnoughHealth || target.Owner.NonCombatant

View File

@@ -119,7 +119,7 @@ namespace OpenRA.Mods.Common.Traits
helicopter = self.TraitOrDefault<Helicopter>(); helicopter = self.TraitOrDefault<Helicopter>();
} }
static int GetWeight(Actor a) { return a.Info.Traits.Get<PassengerInfo>().Weight; } static int GetWeight(Actor a) { return a.Info.TraitInfo<PassengerInfo>().Weight; }
public IEnumerable<IOrderTargeter> Orders public IEnumerable<IOrderTargeter> Orders
{ {
@@ -268,7 +268,7 @@ namespace OpenRA.Mods.Common.Traits
foreach (var c in cargo) foreach (var c in cargo)
{ {
var pi = c.Info.Traits.Get<PassengerInfo>(); var pi = c.Info.TraitInfo<PassengerInfo>();
if (n < pi.Weight) if (n < pi.Weight)
return pi.PipType; return pi.PipType;
else else

View File

@@ -32,7 +32,7 @@ namespace OpenRA.Mods.Common.Traits
public CombatDebugOverlay(Actor self) public CombatDebugOverlay(Actor self)
{ {
healthInfo = self.Info.Traits.GetOrDefault<HealthInfo>(); healthInfo = self.Info.TraitInfoOrDefault<HealthInfo>();
attack = Exts.Lazy(() => self.TraitOrDefault<AttackBase>()); attack = Exts.Lazy(() => self.TraitOrDefault<AttackBase>());
coords = Exts.Lazy(() => self.Trait<BodyOrientation>()); coords = Exts.Lazy(() => self.Trait<BodyOrientation>());

View File

@@ -100,7 +100,7 @@ namespace OpenRA.Mods.Common.Traits
var collector = landedOn.FirstOrDefault(a => var collector = landedOn.FirstOrDefault(a =>
{ {
// Mobile is (currently) the only trait that supports crushing // Mobile is (currently) the only trait that supports crushing
var mi = a.Info.Traits.GetOrDefault<MobileInfo>(); var mi = a.Info.TraitInfoOrDefault<MobileInfo>();
if (mi == null) if (mi == null)
return false; return false;

View File

@@ -90,7 +90,7 @@ namespace OpenRA.Mods.Common.Traits
// Restrict duplicate count to a maximum value // Restrict duplicate count to a maximum value
if (info.MaxDuplicateValue > 0) if (info.MaxDuplicateValue > 0)
{ {
var vi = collector.Info.Traits.GetOrDefault<ValuedInfo>(); var vi = collector.Info.TraitInfoOrDefault<ValuedInfo>();
if (vi != null && vi.Cost > 0) if (vi != null && vi.Cost > 0)
duplicates = Math.Min(duplicates, info.MaxDuplicateValue / vi.Cost); duplicates = Math.Min(duplicates, info.MaxDuplicateValue / vi.Cost);
} }

View File

@@ -93,7 +93,7 @@ namespace OpenRA.Mods.Common.Traits
IEnumerable<CPos> GetSuitableCells(CPos near, string unitName) IEnumerable<CPos> GetSuitableCells(CPos near, string unitName)
{ {
var mi = self.World.Map.Rules.Actors[unitName].Traits.Get<MobileInfo>(); var mi = self.World.Map.Rules.Actors[unitName].TraitInfo<MobileInfo>();
for (var i = -1; i < 2; i++) for (var i = -1; i < 2; i++)
for (var j = -1; j < 2; j++) for (var j = -1; j < 2; j++)

View File

@@ -26,11 +26,11 @@ namespace OpenRA.Mods.Common.Traits
{ {
public static int GetBuildTime(this ActorInfo a) public static int GetBuildTime(this ActorInfo a)
{ {
var csv = a.Traits.GetOrDefault<CustomBuildTimeValueInfo>(); var csv = a.TraitInfoOrDefault<CustomBuildTimeValueInfo>();
if (csv != null) if (csv != null)
return csv.Value; return csv.Value;
var cost = a.HasTraitInfo<ValuedInfo>() ? a.Traits.Get<ValuedInfo>().Cost : 0; var cost = a.HasTraitInfo<ValuedInfo>() ? a.TraitInfo<ValuedInfo>().Cost : 0;
var time = cost var time = cost
* (25 * 60) /* frames per min */ * (25 * 60) /* frames per min */
/ 1000; / 1000;

View File

@@ -25,10 +25,10 @@ namespace OpenRA.Mods.Common.Traits
{ {
public static int GetSellValue(this Actor a) public static int GetSellValue(this Actor a)
{ {
var csv = a.Info.Traits.GetOrDefault<CustomSellValueInfo>(); var csv = a.Info.TraitInfoOrDefault<CustomSellValueInfo>();
if (csv != null) return csv.Value; if (csv != null) return csv.Value;
var valued = a.Info.Traits.GetOrDefault<ValuedInfo>(); var valued = a.Info.TraitInfoOrDefault<ValuedInfo>();
if (valued != null) return valued.Cost; if (valued != null) return valued.Cost;
return 0; return 0;

View File

@@ -51,8 +51,8 @@ namespace OpenRA.Mods.Common.Traits
if (!correctFaction) if (!correctFaction)
return; return;
var csv = self.Info.Traits.GetOrDefault<CustomSellValueInfo>(); var csv = self.Info.TraitInfoOrDefault<CustomSellValueInfo>();
var valued = self.Info.Traits.GetOrDefault<ValuedInfo>(); var valued = self.Info.TraitInfoOrDefault<ValuedInfo>();
var cost = csv != null ? csv.Value : (valued != null ? valued.Cost : 0); var cost = csv != null ? csv.Value : (valued != null ? valued.Cost : 0);
var health = self.TraitOrDefault<Health>(); var health = self.TraitOrDefault<Health>();
@@ -62,7 +62,7 @@ namespace OpenRA.Mods.Common.Traits
dudesValue /= 100; dudesValue /= 100;
var eligibleLocations = FootprintUtils.Tiles(self).ToList(); var eligibleLocations = FootprintUtils.Tiles(self).ToList();
var actorTypes = info.ActorTypes.Select(a => new { Name = a, Cost = self.World.Map.Rules.Actors[a].Traits.Get<ValuedInfo>().Cost }).ToList(); var actorTypes = info.ActorTypes.Select(a => new { Name = a, Cost = self.World.Map.Rules.Actors[a].TraitInfo<ValuedInfo>().Cost }).ToList();
while (eligibleLocations.Count > 0 && actorTypes.Any(a => a.Cost <= dudesValue)) while (eligibleLocations.Count > 0 && actorTypes.Any(a => a.Cost <= dudesValue))
{ {

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.Traits
public bool CanBeTargetedBy(Actor captor, Player owner) public bool CanBeTargetedBy(Actor captor, Player owner)
{ {
var c = captor.Info.Traits.GetOrDefault<ExternalCapturesInfo>(); var c = captor.Info.TraitInfoOrDefault<ExternalCapturesInfo>();
if (c == null) if (c == null)
return false; return false;

View File

@@ -75,7 +75,7 @@ namespace OpenRA.Mods.Common.Traits
if (frozen == null) if (frozen == null)
return false; return false;
var ci = frozen.Info.Traits.GetOrDefault<ExternalCapturableInfo>(); var ci = frozen.Info.TraitInfoOrDefault<ExternalCapturableInfo>();
return ci != null && ci.CanBeTargetedBy(self, frozen.Owner); 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) public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor)
{ {
var c = target.Info.Traits.GetOrDefault<ExternalCapturableInfo>(); var c = target.Info.TraitInfoOrDefault<ExternalCapturableInfo>();
var canTargetActor = c != null && c.CanBeTargetedBy(self, target.Owner); var canTargetActor = c != null && c.CanBeTargetedBy(self, target.Owner);
cursor = canTargetActor ? "ability" : "move-blocked"; cursor = canTargetActor ? "ability" : "move-blocked";

View File

@@ -55,7 +55,7 @@ namespace OpenRA.Mods.Common.Traits
MaxLevel = info.Upgrades.Count; MaxLevel = info.Upgrades.Count;
var cost = self.Info.Traits.Get<ValuedInfo>().Cost; var cost = self.Info.TraitInfo<ValuedInfo>().Cost;
foreach (var kv in info.Upgrades) foreach (var kv in info.Upgrades)
nextLevel.Add(Pair.New(kv.Key * cost, kv.Value)); nextLevel.Add(Pair.New(kv.Key * cost, kv.Value));

View File

@@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Traits
static int GetMultiplier(Actor self) static int GetMultiplier(Actor self)
{ {
// returns 100's as 1, so as to keep accuracy for longer. // returns 100's as 1, so as to keep accuracy for longer.
var info = self.Info.Traits.Get<GivesBountyInfo>(); var info = self.Info.TraitInfo<GivesBountyInfo>();
var gainsExp = self.TraitOrDefault<GainsExperience>(); var gainsExp = self.TraitOrDefault<GainsExperience>();
if (gainsExp == null) if (gainsExp == null)
return 100; return 100;
@@ -42,7 +42,7 @@ namespace OpenRA.Mods.Common.Traits
public void Killed(Actor self, AttackInfo e) public void Killed(Actor self, AttackInfo e)
{ {
var info = self.Info.Traits.Get<GivesBountyInfo>(); var info = self.Info.TraitInfo<GivesBountyInfo>();
if (e.Attacker == null || e.Attacker.Disposed) return; if (e.Attacker == null || e.Attacker.Disposed) return;

View File

@@ -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)) if (e.Attacker == null || e.Attacker.Disposed || (!info.FriendlyFire && e.Attacker.Owner.Stances[self.Owner] == Stance.Ally))
return; return;
var valued = self.Info.Traits.GetOrDefault<ValuedInfo>(); var valued = self.Info.TraitInfoOrDefault<ValuedInfo>();
// Default experience is 100 times our value // Default experience is 100 times our value
var exp = info.Experience >= 0 var exp = info.Experience >= 0

View File

@@ -49,7 +49,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
self.SetTargetLine(target, Color.Yellow); self.SetTargetLine(target, Color.Yellow);
var range = WDist.FromCells(target.Actor.Info.Traits.Get<GuardableInfo>().Range); var range = WDist.FromCells(target.Actor.Info.TraitInfo<GuardableInfo>().Range);
self.QueueActivity(false, new AttackMoveActivity(self, self.Trait<IMove>().MoveFollow(self, target, WDist.Zero, range))); self.QueueActivity(false, new AttackMoveActivity(self, self.Trait<IMove>().MoveFollow(self, target, WDist.Zero, range)));
} }

View File

@@ -168,7 +168,7 @@ namespace OpenRA.Mods.Common.Traits
// Start a search from each refinery's delivery location: // Start a search from each refinery's delivery location:
List<CPos> path; List<CPos> path;
var mi = self.Info.Traits.Get<MobileInfo>(); var mi = self.Info.TraitInfo<MobileInfo>();
using (var search = PathSearch.FromPoints(self.World, mi, self, refs.Values.Select(r => r.Location), self.Location, false) using (var search = PathSearch.FromPoints(self.World, mi, self, refs.Values.Select(r => r.Location), self.Location, false)
.WithCustomCost(loc => .WithCustomCost(loc =>
{ {
@@ -469,7 +469,7 @@ namespace OpenRA.Mods.Common.Traits
return false; return false;
var res = self.World.WorldActor.Trait<ResourceLayer>().GetRenderedResource(location); var res = self.World.WorldActor.Trait<ResourceLayer>().GetRenderedResource(location);
var info = self.Info.Traits.Get<HarvesterInfo>(); var info = self.Info.TraitInfo<HarvesterInfo>();
if (res == null || !info.Resources.Contains(res.Info.Name)) if (res == null || !info.Resources.Contains(res.Info.Name))
return false; return false;

View File

@@ -138,7 +138,7 @@ namespace OpenRA.Mods.Common.Traits
bool IsCorrectCargoType(Actor target) bool IsCorrectCargoType(Actor target)
{ {
var ci = target.Info.Traits.Get<CargoInfo>(); var ci = target.Info.TraitInfo<CargoInfo>();
return ci.Types.Contains(Info.CargoType); return ci.Types.Contains(Info.CargoType);
} }

View File

@@ -88,7 +88,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
// Find a production structure to build this actor // Find a production structure to build this actor
var ai = self.World.Map.Rules.Actors[name]; var ai = self.World.Map.Rules.Actors[name];
var bi = ai.Traits.GetOrDefault<BuildableInfo>(); var bi = ai.TraitInfoOrDefault<BuildableInfo>();
// Some units may request a specific production type, which is ignored if the AllTech cheat is enabled // 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; 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) public override int GetBuildTime(string unitString)
{ {
var ai = self.World.Map.Rules.Actors[unitString]; var ai = self.World.Map.Rules.Actors[unitString];
var bi = ai.Traits.GetOrDefault<BuildableInfo>(); var bi = ai.TraitInfoOrDefault<BuildableInfo>();
if (bi == null) if (bi == null)
return 0; return 0;

View File

@@ -33,7 +33,7 @@ namespace OpenRA.Mods.Common.Traits
public IEnumerable<IRenderable> Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition) public IEnumerable<IRenderable> Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
{ {
if (!ai.Traits.Get<BuildingInfo>().RequiresBaseProvider) if (!ai.TraitInfo<BuildingInfo>().RequiresBaseProvider)
yield break; yield break;
foreach (var a in w.ActorsWithTrait<BaseProvider>()) foreach (var a in w.ActorsWithTrait<BaseProvider>())
@@ -75,9 +75,9 @@ namespace OpenRA.Mods.Common.Traits
var producer = queue.MostLikelyProducer(); var producer = queue.MostLikelyProducer();
var faction = producer.Trait != null ? producer.Trait.Faction : self.Owner.Faction.InternalName; var faction = producer.Trait != null ? producer.Trait.Faction : self.Owner.Faction.InternalName;
var buildingInfo = unit.Traits.Get<BuildingInfo>(); var buildingInfo = unit.TraitInfo<BuildingInfo>();
var buildableInfo = unit.Traits.GetOrDefault<BuildableInfo>(); var buildableInfo = unit.TraitInfoOrDefault<BuildableInfo>();
if (buildableInfo != null && buildableInfo.ForceFaction != null) if (buildableInfo != null && buildableInfo.ForceFaction != null)
faction = buildableInfo.ForceFaction; faction = buildableInfo.ForceFaction;
@@ -106,7 +106,7 @@ namespace OpenRA.Mods.Common.Traits
if (host == null) if (host == null)
return; return;
var plugInfo = unit.Traits.GetOrDefault<PlugInfo>(); var plugInfo = unit.TraitInfoOrDefault<PlugInfo>();
if (plugInfo == null) if (plugInfo == null)
return; return;

View File

@@ -120,7 +120,7 @@ namespace OpenRA.Mods.Common.Traits
if (self.Info.HasTraitInfo<ValuedInfo>()) if (self.Info.HasTraitInfo<ValuedInfo>())
{ {
var cost = self.Info.Traits.Get<ValuedInfo>().Cost; var cost = self.Info.TraitInfo<ValuedInfo>().Cost;
attackerStats.KillsCost += cost; attackerStats.KillsCost += cost;
defenderStats.DeathsCost += cost; defenderStats.DeathsCost += cost;
} }

View File

@@ -155,7 +155,7 @@ namespace OpenRA.Mods.Common.Traits
foreach (var a in AllBuildables(Info.Type)) foreach (var a in AllBuildables(Info.Type))
{ {
var bi = a.Traits.Get<BuildableInfo>(); var bi = a.TraitInfo<BuildableInfo>();
produceable.Add(a, new ProductionState()); produceable.Add(a, new ProductionState());
ttc.Add(a.Name, bi.Prerequisites, bi.BuildLimit, this); ttc.Add(a.Name, bi.Prerequisites, bi.BuildLimit, this);
@@ -168,7 +168,7 @@ namespace OpenRA.Mods.Common.Traits
.Where(x => .Where(x =>
x.Name[0] != '^' && x.Name[0] != '^' &&
x.HasTraitInfo<BuildableInfo>() && x.HasTraitInfo<BuildableInfo>() &&
x.Traits.Get<BuildableInfo>().Queue.Contains(category)); x.TraitInfo<BuildableInfo>().Queue.Contains(category));
} }
public void PrerequisitesAvailable(string key) public void PrerequisitesAvailable(string key)
@@ -250,11 +250,11 @@ namespace OpenRA.Mods.Common.Traits
case "StartProduction": case "StartProduction":
{ {
var unit = self.World.Map.Rules.Actors[order.TargetString]; var unit = self.World.Map.Rules.Actors[order.TargetString];
var bi = unit.Traits.Get<BuildableInfo>(); var bi = unit.TraitInfo<BuildableInfo>();
if (!bi.Queue.Contains(Info.Type)) if (!bi.Queue.Contains(Info.Type))
return; /* Not built by this queue */ return; /* Not built by this queue */
var cost = unit.HasTraitInfo<ValuedInfo>() ? unit.Traits.Get<ValuedInfo>().Cost : 0; var cost = unit.HasTraitInfo<ValuedInfo>() ? unit.TraitInfo<ValuedInfo>().Cost : 0;
var time = GetBuildTime(order.TargetString); var time = GetBuildTime(order.TargetString);
if (BuildableItems().All(b => b.Name != order.TargetString)) if (BuildableItems().All(b => b.Name != order.TargetString))

View File

@@ -35,7 +35,7 @@ namespace OpenRA.Mods.Common.Traits
public void ActorChanged(Actor a) public void ActorChanged(Actor a)
{ {
var bi = a.Info.Traits.GetOrDefault<BuildableInfo>(); var bi = a.Info.TraitInfoOrDefault<BuildableInfo>();
if (a.Owner == player && (a.Info.HasTraitInfo<ITechTreePrerequisiteInfo>() || (bi != null && bi.BuildLimit > 0))) if (a.Owner == player && (a.Info.HasTraitInfo<ITechTreePrerequisiteInfo>() || (bi != null && bi.BuildLimit > 0)))
Update(); Update();
} }
@@ -98,7 +98,7 @@ namespace OpenRA.Mods.Common.Traits
a.Actor.IsInWorld && a.Actor.IsInWorld &&
!a.Actor.IsDead && !a.Actor.IsDead &&
!ret.ContainsKey(a.Actor.Info.Name) && !ret.ContainsKey(a.Actor.Info.Name) &&
a.Actor.Info.Traits.Get<BuildableInfo>().BuildLimit > 0) a.Actor.Info.TraitInfo<BuildableInfo>().BuildLimit > 0)
.Do(b => ret[b.Actor.Info.Name].Add(b.Actor)); .Do(b => ret[b.Actor.Info.Name].Add(b.Actor));
return ret; return ret;

View File

@@ -51,7 +51,7 @@ namespace OpenRA.Mods.Common.Traits
var exitLocation = CPos.Zero; var exitLocation = CPos.Zero;
var target = Target.Invalid; var target = Target.Invalid;
var bi = producee.Traits.GetOrDefault<BuildableInfo>(); var bi = producee.TraitInfoOrDefault<BuildableInfo>();
if (bi != null && bi.ForceFaction != null) if (bi != null && bi.ForceFaction != null)
factionVariant = bi.ForceFaction; factionVariant = bi.ForceFaction;
@@ -66,7 +66,7 @@ namespace OpenRA.Mods.Common.Traits
var spawn = self.CenterPosition + exitinfo.SpawnOffset; var spawn = self.CenterPosition + exitinfo.SpawnOffset;
var to = self.World.Map.CenterOfCell(exit); var to = self.World.Map.CenterOfCell(exit);
var fi = producee.Traits.GetOrDefault<IFacingInfo>(); var fi = producee.TraitInfoOrDefault<IFacingInfo>();
var initialFacing = exitinfo.Facing < 0 ? Util.GetFacing(to - spawn, fi == null ? 0 : fi.GetInitialFacing()) : exitinfo.Facing; var initialFacing = exitinfo.Facing < 0 ? Util.GetFacing(to - spawn, fi == null ? 0 : fi.GetInitialFacing()) : exitinfo.Facing;
exitLocation = rp.Value != null ? rp.Value.Location : exit; 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) static bool CanUseExit(Actor self, ActorInfo producee, ExitInfo s)
{ {
var mobileInfo = producee.Traits.GetOrDefault<MobileInfo>(); var mobileInfo = producee.TraitInfoOrDefault<MobileInfo>();
self.NotifyBlocker(self.Location + s.ExitCell); self.NotifyBlocker(self.Location + s.ExitCell);

View File

@@ -28,7 +28,7 @@ namespace OpenRA.Mods.Common.Traits
if (self.IsDisabled()) return false; if (self.IsDisabled()) return false;
var isJammed = self.World.ActorsWithTrait<JamsRadar>().Any(a => a.Actor.Owner.Stances[self.Owner] != Stance.Ally var isJammed = self.World.ActorsWithTrait<JamsRadar>().Any(a => a.Actor.Owner.Stances[self.Owner] != Stance.Ally
&& (self.Location - a.Actor.Location).Length <= a.Actor.Info.Traits.Get<JamsRadarInfo>().Range); && (self.Location - a.Actor.Location).Length <= a.Actor.Info.TraitInfo<JamsRadarInfo>().Range);
return !isJammed; return !isJammed;
} }

View File

@@ -105,7 +105,7 @@ namespace OpenRA.Mods.Common.Traits
bool CanBeCapturedBy(Actor a) bool CanBeCapturedBy(Actor a)
{ {
var pc = a.Info.Traits.GetOrDefault<ProximityCaptorInfo>(); var pc = a.Info.TraitInfoOrDefault<ProximityCaptorInfo>();
return pc != null && pc.Types.Overlaps(Info.CaptorTypes); return pc != null && pc.Types.Overlaps(Info.CaptorTypes);
} }

View File

@@ -28,7 +28,7 @@ namespace OpenRA.Mods.Common.Traits
if (string.IsNullOrEmpty(Sequence)) if (string.IsNullOrEmpty(Sequence))
throw new InvalidOperationException("Actor " + ai.Name + " is missing sequence to quantize facings from."); throw new InvalidOperationException("Actor " + ai.Name + " is missing sequence to quantize facings from.");
var rsi = ai.Traits.Get<RenderSpritesInfo>(); var rsi = ai.TraitInfo<RenderSpritesInfo>();
return sequenceProvider.GetSequence(rsi.GetImage(ai, sequenceProvider, race), Sequence).Facings; return sequenceProvider.GetSequence(rsi.GetImage(ai, sequenceProvider, race), Sequence).Facings;
} }

View File

@@ -43,7 +43,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
if (queue == null) if (queue == null)
{ {
var type = info.ProductionType ?? self.Trait<Production>().Info.Produces.First(); var type = info.ProductionType ?? self.Info.TraitInfo<ProductionInfo>().Produces.First();
// Per-actor queue // Per-actor queue
// Note: this includes disabled queues, as each bar must bind to exactly one queue. // Note: this includes disabled queues, as each bar must bind to exactly one queue.

View File

@@ -46,7 +46,7 @@ namespace OpenRA.Mods.Common.Traits
foreach (var a in w.ActorsWithTrait<RenderRangeCircle>()) foreach (var a in w.ActorsWithTrait<RenderRangeCircle>())
if (a.Actor.Owner.IsAlliedWith(w.RenderPlayer)) if (a.Actor.Owner.IsAlliedWith(w.RenderPlayer))
if (a.Actor.Info.Traits.Get<RenderRangeCircleInfo>().RangeCircleType == RangeCircleType) if (a.Actor.Info.TraitInfo<RenderRangeCircleInfo>().RangeCircleType == RangeCircleType)
foreach (var r in a.Trait.RenderAfterWorld(wr)) foreach (var r in a.Trait.RenderAfterWorld(wr))
yield return r; yield return r;
} }

View File

@@ -52,14 +52,14 @@ namespace OpenRA.Mods.Common.Traits
var palette = init.WorldRenderer.Palette(Palette ?? PlayerPalette + ownerName); var palette = init.WorldRenderer.Palette(Palette ?? PlayerPalette + ownerName);
var facings = 0; var facings = 0;
var body = init.Actor.Traits.GetOrDefault<BodyOrientationInfo>(); var body = init.Actor.TraitInfoOrDefault<BodyOrientationInfo>();
if (body != null) if (body != null)
{ {
facings = body.QuantizedFacings; facings = body.QuantizedFacings;
if (facings == -1) if (facings == -1)
{ {
var qbo = init.Actor.Traits.GetOrDefault<IQuantizeBodyOrientationInfo>(); var qbo = init.Actor.TraitInfoOrDefault<IQuantizeBodyOrientationInfo>();
facings = qbo != null ? qbo.QuantizedBodyFacings(init.Actor, sequenceProvider, faction) : 1; facings = qbo != null ? qbo.QuantizedBodyFacings(init.Actor, sequenceProvider, faction) : 1;
} }
} }

View File

@@ -47,17 +47,17 @@ namespace OpenRA.Mods.Common.Traits
public virtual IEnumerable<IActorPreview> RenderPreview(ActorPreviewInitializer init) public virtual IEnumerable<IActorPreview> RenderPreview(ActorPreviewInitializer init)
{ {
var body = init.Actor.Traits.Get<BodyOrientationInfo>(); var body = init.Actor.TraitInfo<BodyOrientationInfo>();
var faction = init.Get<FactionInit, string>(); var faction = init.Get<FactionInit, string>();
var ownerName = init.Get<OwnerInit>().PlayerName; var ownerName = init.Get<OwnerInit>().PlayerName;
var sequenceProvider = init.World.Map.SequenceProvider; var sequenceProvider = init.World.Map.SequenceProvider;
var image = Image ?? init.Actor.Name; var image = Image ?? init.Actor.Name;
var facings = body.QuantizedFacings == -1 ? var facings = body.QuantizedFacings == -1 ?
init.Actor.Traits.Get<IQuantizeBodyOrientationInfo>().QuantizedBodyFacings(init.Actor, sequenceProvider, faction) : init.Actor.TraitInfo<IQuantizeBodyOrientationInfo>().QuantizedBodyFacings(init.Actor, sequenceProvider, faction) :
body.QuantizedFacings; body.QuantizedFacings;
var palette = init.WorldRenderer.Palette(Palette ?? PlayerPalette + ownerName); var palette = init.WorldRenderer.Palette(Palette ?? PlayerPalette + ownerName);
var ifacing = init.Actor.Traits.GetOrDefault<IFacingInfo>(); var ifacing = init.Actor.TraitInfoOrDefault<IFacingInfo>();
var facing = ifacing != null ? init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : ifacing.GetInitialFacing() : 0; var facing = ifacing != null ? init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : ifacing.GetInitialFacing() : 0;
var orientation = WRot.FromFacing(facing); var orientation = WRot.FromFacing(facing);
var components = init.Actor.Traits.WithInterface<IRenderActorPreviewVoxelsInfo>() var components = init.Actor.Traits.WithInterface<IRenderActorPreviewVoxelsInfo>()

View File

@@ -36,7 +36,7 @@ namespace OpenRA.Mods.Common.Traits
if (UpgradeMinEnabledLevel > 0) if (UpgradeMinEnabledLevel > 0)
yield break; yield break;
var body = init.Actor.Traits.Get<BodyOrientationInfo>(); var body = init.Actor.TraitInfo<BodyOrientationInfo>();
var armament = init.Actor.Traits.WithInterface<ArmamentInfo>() var armament = init.Actor.Traits.WithInterface<ArmamentInfo>()
.First(a => a.Name == Armament); .First(a => a.Name == Armament);
var t = init.Actor.Traits.WithInterface<TurretedInfo>() var t = init.Actor.Traits.WithInterface<TurretedInfo>()

View File

@@ -41,7 +41,7 @@ namespace OpenRA.Mods.Common.Traits
public WithBuildingExplosion(Actor self, WithBuildingExplosionInfo info) public WithBuildingExplosion(Actor self, WithBuildingExplosionInfo info)
{ {
this.info = info; this.info = info;
buildingInfo = self.Info.Traits.Get<BuildingInfo>(); buildingInfo = self.Info.TraitInfo<BuildingInfo>();
} }
public void Killed(Actor self, AttackInfo e) public void Killed(Actor self, AttackInfo e)

View File

@@ -22,7 +22,7 @@ namespace OpenRA.Mods.Common.Traits
public override IEnumerable<IActorPreview> RenderPreviewSprites(ActorPreviewInitializer init, RenderSpritesInfo rs, string image, int facings, PaletteReference p) public override IEnumerable<IActorPreview> RenderPreviewSprites(ActorPreviewInitializer init, RenderSpritesInfo rs, string image, int facings, PaletteReference p)
{ {
var ifacing = init.Actor.Traits.GetOrDefault<IFacingInfo>(); var ifacing = init.Actor.TraitInfoOrDefault<IFacingInfo>();
var facing = ifacing != null ? init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : ifacing.GetInitialFacing() : 0; var facing = ifacing != null ? init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : ifacing.GetInitialFacing() : 0;
var anim = new Animation(init.World, image, () => facing); var anim = new Animation(init.World, image, () => facing);

View File

@@ -46,7 +46,7 @@ namespace OpenRA.Mods.Common.Traits
if (Palette != null) if (Palette != null)
p = init.WorldRenderer.Palette(Palette); p = init.WorldRenderer.Palette(Palette);
var body = init.Actor.Traits.Get<BodyOrientationInfo>(); var body = init.Actor.TraitInfo<BodyOrientationInfo>();
var facing = init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : 0; var facing = init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : 0;
var anim = new Animation(init.World, image, () => facing); var anim = new Animation(init.World, image, () => facing);
anim.PlayRepeating(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence)); anim.PlayRepeating(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence));

View File

@@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Traits
public IEnumerable<IActorPreview> RenderPreviewSprites(ActorPreviewInitializer init, RenderSpritesInfo rs, string image, int facings, PaletteReference p) public IEnumerable<IActorPreview> RenderPreviewSprites(ActorPreviewInitializer init, RenderSpritesInfo rs, string image, int facings, PaletteReference p)
{ {
var facing = 0; var facing = 0;
var ifacing = init.Actor.Traits.GetOrDefault<IFacingInfo>(); var ifacing = init.Actor.TraitInfoOrDefault<IFacingInfo>();
if (ifacing != null) if (ifacing != null)
facing = init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : ifacing.GetInitialFacing(); facing = init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : ifacing.GetInitialFacing();

View File

@@ -69,7 +69,7 @@ namespace OpenRA.Mods.Common.Traits
var anim = new Animation(init.World, image); var anim = new Animation(init.World, image);
anim.PlayThen(OpeningSequence, () => anim.PlayRepeating(Sequence)); anim.PlayThen(OpeningSequence, () => anim.PlayRepeating(Sequence));
var body = init.Actor.Traits.Get<BodyOrientationInfo>(); var body = init.Actor.TraitInfo<BodyOrientationInfo>();
var facing = init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : 0; var facing = init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : 0;
var orientation = body.QuantizeOrientation(new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(facing)), facings); var orientation = body.QuantizeOrientation(new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(facing)), facings);
var offset = body.LocalToWorld(Offset.Rotate(orientation)); var offset = body.LocalToWorld(Offset.Rotate(orientation));

View File

@@ -28,7 +28,7 @@ namespace OpenRA.Mods.Common.Traits
var anim = new Animation(init.World, image, () => 0); var anim = new Animation(init.World, image, () => 0);
anim.PlayFetchIndex(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence), () => 0); anim.PlayFetchIndex(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence), () => 0);
var bi = init.Actor.Traits.Get<BuildingInfo>(); var bi = init.Actor.TraitInfo<BuildingInfo>();
var offset = FootprintUtils.CenterOffset(init.World, bi).Y + 512; // Additional 512 units move from center -> top of cell 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); 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), door.PlayFetchDirection(RenderSprites.NormalizeSequence(door, self.GetDamageState(), info.Sequence),
() => desiredFrame - door.CurrentFrame); () => desiredFrame - door.CurrentFrame);
var buildingInfo = self.Info.Traits.Get<BuildingInfo>(); var buildingInfo = self.Info.TraitInfo<BuildingInfo>();
var offset = FootprintUtils.CenterOffset(self.World, buildingInfo).Y + 512; var offset = FootprintUtils.CenterOffset(self.World, buildingInfo).Y + 512;
renderSprites.Add(new AnimationWithOffset(door, null, () => !buildComplete, offset)); renderSprites.Add(new AnimationWithOffset(door, null, () => !buildComplete, offset));

View File

@@ -52,7 +52,7 @@ namespace OpenRA.Mods.Common.Traits
var body = self.Trait<BodyOrientation>(); var body = self.Trait<BodyOrientation>();
buildComplete = !self.Info.HasTraitInfo<BuildingInfo>(); // always render instantly for units buildComplete = !self.Info.HasTraitInfo<BuildingInfo>(); // always render instantly for units
production = self.Info.Traits.Get<ProductionInfo>(); production = self.Info.TraitInfo<ProductionInfo>();
overlay = new Animation(self.World, rs.GetImage(self)); overlay = new Animation(self.World, rs.GetImage(self));
overlay.PlayRepeating(info.Sequence); overlay.PlayRepeating(info.Sequence);

View File

@@ -32,7 +32,7 @@ namespace OpenRA.Mods.Common.Traits
public IEnumerable<IActorPreview> RenderPreviewSprites(ActorPreviewInitializer init, RenderSpritesInfo rs, string image, int facings, PaletteReference p) public IEnumerable<IActorPreview> RenderPreviewSprites(ActorPreviewInitializer init, RenderSpritesInfo rs, string image, int facings, PaletteReference p)
{ {
var body = init.Actor.Traits.Get<BodyOrientationInfo>(); var body = init.Actor.TraitInfo<BodyOrientationInfo>();
var facing = init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : 0; var facing = init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : 0;
var anim = new Animation(init.World, image, () => facing); var anim = new Animation(init.World, image, () => facing);
anim.PlayRepeating(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence)); anim.PlayRepeating(RenderSprites.NormalizeSequence(anim, init.GetDamageState(), Sequence));

View File

@@ -39,11 +39,11 @@ namespace OpenRA.Mods.Common.Traits
if (UpgradeMinEnabledLevel > 0) if (UpgradeMinEnabledLevel > 0)
yield break; yield break;
var body = init.Actor.Traits.Get<BodyOrientationInfo>(); var body = init.Actor.TraitInfo<BodyOrientationInfo>();
var t = init.Actor.Traits.WithInterface<TurretedInfo>() var t = init.Actor.Traits.WithInterface<TurretedInfo>()
.First(tt => tt.Turret == Turret); .First(tt => tt.Turret == Turret);
var ifacing = init.Actor.Traits.GetOrDefault<IFacingInfo>(); var ifacing = init.Actor.TraitInfoOrDefault<IFacingInfo>();
var bodyFacing = ifacing != null ? init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : ifacing.GetInitialFacing() : 0; var bodyFacing = ifacing != null ? init.Contains<FacingInit>() ? init.Get<FacingInit, int>() : ifacing.GetInitialFacing() : 0;
var turretFacing = init.Contains<TurretFacingInit>() ? init.Get<TurretFacingInit, int>() : t.InitialFacing; var turretFacing = init.Contains<TurretFacingInit>() ? init.Get<TurretFacingInit, int>() : t.InitialFacing;

View File

@@ -34,7 +34,7 @@ namespace OpenRA.Mods.Common.Traits
if (UpgradeMinEnabledLevel > 0) if (UpgradeMinEnabledLevel > 0)
yield break; yield break;
var body = init.Actor.Traits.Get<BodyOrientationInfo>(); var body = init.Actor.TraitInfo<BodyOrientationInfo>();
var armament = init.Actor.Traits.WithInterface<ArmamentInfo>() var armament = init.Actor.Traits.WithInterface<ArmamentInfo>()
.First(a => a.Name == Armament); .First(a => a.Name == Armament);
var t = init.Actor.Traits.WithInterface<TurretedInfo>() var t = init.Actor.Traits.WithInterface<TurretedInfo>()

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Mods.Common.Traits
public IEnumerable<VoxelAnimation> RenderPreviewVoxels(ActorPreviewInitializer init, RenderVoxelsInfo rv, string image, WRot orientation, int facings, PaletteReference p) public IEnumerable<VoxelAnimation> RenderPreviewVoxels(ActorPreviewInitializer init, RenderVoxelsInfo rv, string image, WRot orientation, int facings, PaletteReference p)
{ {
var body = init.Actor.Traits.Get<BodyOrientationInfo>(); var body = init.Actor.TraitInfo<BodyOrientationInfo>();
var voxel = VoxelProvider.GetVoxel(image, "idle"); var voxel = VoxelProvider.GetVoxel(image, "idle");
var bodyOrientation = new[] { body.QuantizeOrientation(orientation, facings) }; var bodyOrientation = new[] { body.QuantizeOrientation(orientation, facings) };
yield return new VoxelAnimation(voxel, () => WVec.Zero, yield return new VoxelAnimation(voxel, () => WVec.Zero,
@@ -51,7 +51,7 @@ namespace OpenRA.Mods.Common.Traits
() => IsTraitDisabled, () => 0)); () => IsTraitDisabled, () => 0));
// Selection size // Selection size
var rvi = self.Info.Traits.Get<RenderVoxelsInfo>(); var rvi = self.Info.TraitInfo<RenderVoxelsInfo>();
var s = (int)(rvi.Scale * voxel.Size.Aggregate(Math.Max)); var s = (int)(rvi.Scale * voxel.Size.Aggregate(Math.Max));
size = new int2(s, s); size = new int2(s, s);
} }

View File

@@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Traits
if (UpgradeMinEnabledLevel > 0) if (UpgradeMinEnabledLevel > 0)
yield break; yield break;
var body = init.Actor.Traits.Get<BodyOrientationInfo>(); var body = init.Actor.TraitInfo<BodyOrientationInfo>();
var t = init.Actor.Traits.WithInterface<TurretedInfo>() var t = init.Actor.Traits.WithInterface<TurretedInfo>()
.First(tt => tt.Turret == Turret); .First(tt => tt.Turret == Turret);

View File

@@ -39,7 +39,7 @@ namespace OpenRA.Mods.Common.Traits
var haveNeighbour = false; var haveNeighbour = false;
foreach (var n in kv.Value) foreach (var n in kv.Value)
{ {
var rb = init.World.Map.Rules.Actors[n].Traits.GetOrDefault<WithWallSpriteBodyInfo>(); var rb = init.World.Map.Rules.Actors[n].TraitInfoOrDefault<WithWallSpriteBodyInfo>();
if (rb != null && rb.Type == Type) if (rb != null && rb.Type == Type)
{ {
haveNeighbour = true; haveNeighbour = true;

View File

@@ -61,7 +61,7 @@ namespace OpenRA.Mods.Common.Traits
if (randomize) if (randomize)
attackFacing = Util.QuantizeFacing(self.World.SharedRandom.Next(256), info.QuantizedFacings) * (256 / info.QuantizedFacings); attackFacing = Util.QuantizeFacing(self.World.SharedRandom.Next(256), info.QuantizedFacings) * (256 / info.QuantizedFacings);
var altitude = self.World.Map.Rules.Actors[info.UnitType].Traits.Get<PlaneInfo>().CruiseAltitude.Length; var altitude = self.World.Map.Rules.Actors[info.UnitType].TraitInfo<PlaneInfo>().CruiseAltitude.Length;
var attackRotation = WRot.FromFacing(attackFacing); var attackRotation = WRot.FromFacing(attackFacing);
var delta = new WVec(0, -1024, 0).Rotate(attackRotation); var delta = new WVec(0, -1024, 0).Rotate(attackRotation);
target = target + new WVec(0, 0, altitude); target = target + new WVec(0, 0, altitude);

View File

@@ -61,7 +61,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
self = init.Self; self = init.Self;
this.info = info; this.info = info;
buildingInfo = self.World.Map.Rules.Actors[info.IntoActor].Traits.GetOrDefault<BuildingInfo>(); buildingInfo = self.World.Map.Rules.Actors[info.IntoActor].TraitInfoOrDefault<BuildingInfo>();
faction = init.Contains<FactionInit>() ? init.Get<FactionInit, string>() : self.Owner.Faction.InternalName; faction = init.Contains<FactionInit>() ? init.Get<FactionInit, string>() : self.Owner.Faction.InternalName;
} }

View File

@@ -70,7 +70,7 @@ namespace OpenRA.Mods.Common.Traits
foreach (var a in self.World.Map.Rules.Actors.Values) foreach (var a in self.World.Map.Rules.Actors.Values)
{ {
var uwc = a.Traits.GetOrDefault<ProducibleWithLevelInfo>(); var uwc = a.TraitInfoOrDefault<ProducibleWithLevelInfo>();
if (uwc != null) if (uwc != null)
ttc.Add(MakeKey(a.Name), uwc.Prerequisites, 0, this); ttc.Add(MakeKey(a.Name), uwc.Prerequisites, 0, this);
} }

View File

@@ -43,7 +43,7 @@ namespace OpenRA.Mods.Common.Traits
// Build a list of templates that should be overlayed with bridges // Build a list of templates that should be overlayed with bridges
foreach (var bridge in info.Bridges) foreach (var bridge in info.Bridges)
{ {
var bi = w.Map.Rules.Actors[bridge].Traits.Get<BridgeInfo>(); var bi = w.Map.Rules.Actors[bridge].TraitInfo<BridgeInfo>();
foreach (var template in bi.Templates) foreach (var template in bi.Templates)
bridgeTypes.Add(template.First, Pair.New(bridge, template.Second)); bridgeTypes.Add(template.First, Pair.New(bridge, template.Second));
} }

View File

@@ -107,7 +107,7 @@ namespace OpenRA.Mods.Common.Traits
var dropFacing = Util.QuantizeFacing(self.World.SharedRandom.Next(256), info.QuantizedFacings) * (256 / info.QuantizedFacings); 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 delta = new WVec(0, -1024, 0).Rotate(WRot.FromFacing(dropFacing));
var altitude = self.World.Map.Rules.Actors[info.DeliveryAircraft].Traits.Get<PlaneInfo>().CruiseAltitude.Length; var altitude = self.World.Map.Rules.Actors[info.DeliveryAircraft].TraitInfo<PlaneInfo>().CruiseAltitude.Length;
var target = self.World.Map.CenterOfCell(p) + new WVec(0, 0, altitude); 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 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; var finishEdge = target + (self.World.Map.DistanceToEdge(target, delta) + info.Cordon).Length * delta / 1024;

View File

@@ -29,7 +29,7 @@ namespace OpenRA.Mods.Common.Traits
domainIndexes = new Dictionary<uint, MovementClassDomainIndex>(); domainIndexes = new Dictionary<uint, MovementClassDomainIndex>();
var movementClasses = var movementClasses =
world.Map.Rules.Actors.Where(ai => ai.Value.HasTraitInfo<MobileInfo>()) world.Map.Rules.Actors.Where(ai => ai.Value.HasTraitInfo<MobileInfo>())
.Select(ai => (uint)ai.Value.Traits.Get<MobileInfo>().GetMovementClass(world.TileSet)).Distinct(); .Select(ai => (uint)ai.Value.TraitInfo<MobileInfo>().GetMovementClass(world.TileSet)).Distinct();
foreach (var mc in movementClasses) foreach (var mc in movementClasses)
domainIndexes[mc] = new MovementClassDomainIndex(world, mc); domainIndexes[mc] = new MovementClassDomainIndex(world, mc);

View File

@@ -56,7 +56,7 @@ namespace OpenRA.Mods.Common.Traits
CenterPosition = PreviewPosition(world, actor.InitDict); CenterPosition = PreviewPosition(world, actor.InitDict);
var location = actor.InitDict.Get<LocationInit>().Value(worldRenderer.World); var location = actor.InitDict.Get<LocationInit>().Value(worldRenderer.World);
var ios = Info.Traits.GetOrDefault<IOccupySpaceInfo>(); var ios = Info.TraitInfoOrDefault<IOccupySpaceInfo>();
var subCellInit = actor.InitDict.GetOrDefault<SubCellInit>(); var subCellInit = actor.InitDict.GetOrDefault<SubCellInit>();
var subCell = subCellInit != null ? subCellInit.Value(worldRenderer.World) : SubCell.Any; var subCell = subCellInit != null ? subCellInit.Value(worldRenderer.World) : SubCell.Any;
@@ -69,7 +69,7 @@ namespace OpenRA.Mods.Common.Traits
Footprint = new ReadOnlyDictionary<CPos, SubCell>(footprint); Footprint = new ReadOnlyDictionary<CPos, SubCell>(footprint);
} }
var tooltip = Info.Traits.GetOrDefault<TooltipInfo>(); var tooltip = Info.TraitInfoOrDefault<TooltipInfo>();
Tooltip = tooltip == null ? ID + ": " + Info.Name : ID + ": " + tooltip.Name + " (" + Info.Name + ")"; Tooltip = tooltip == null ? ID + ": " + Info.Name : ID + ": " + tooltip.Name + " (" + Info.Name + ")";
GeneratePreviews(); GeneratePreviews();
@@ -143,7 +143,7 @@ namespace OpenRA.Mods.Common.Traits
var subCellInit = actor.InitDict.GetOrDefault<SubCellInit>(); var subCellInit = actor.InitDict.GetOrDefault<SubCellInit>();
var subCell = subCellInit != null ? subCellInit.Value(worldRenderer.World) : SubCell.Any; var subCell = subCellInit != null ? subCellInit.Value(worldRenderer.World) : SubCell.Any;
var buildingInfo = Info.Traits.GetOrDefault<BuildingInfo>(); var buildingInfo = Info.TraitInfoOrDefault<BuildingInfo>();
if (buildingInfo != null) if (buildingInfo != null)
offset = FootprintUtils.CenterOffset(world, buildingInfo); offset = FootprintUtils.CenterOffset(world, buildingInfo);

View File

@@ -61,7 +61,7 @@ namespace OpenRA.Mods.Common.Traits
public List<CPos> FindUnitPath(CPos source, CPos target, Actor self) public List<CPos> FindUnitPath(CPos source, CPos target, Actor self)
{ {
var mi = self.Info.Traits.Get<MobileInfo>(); var mi = self.Info.TraitInfo<MobileInfo>();
// If a water-land transition is required, bail early // If a water-land transition is required, bail early
var domainIndex = world.WorldActor.TraitOrDefault<DomainIndex>(); var domainIndex = world.WorldActor.TraitOrDefault<DomainIndex>();
@@ -84,7 +84,7 @@ namespace OpenRA.Mods.Common.Traits
public List<CPos> FindUnitPathToRange(CPos source, SubCell srcSub, WPos target, WDist range, Actor self) public List<CPos> FindUnitPathToRange(CPos source, SubCell srcSub, WPos target, WDist range, Actor self)
{ {
var mi = self.Info.Traits.Get<MobileInfo>(); var mi = self.Info.TraitInfo<MobileInfo>();
var targetCell = world.Map.CellContaining(target); var targetCell = world.Map.CellContaining(target);
// Correct for SubCell offset // Correct for SubCell offset

View File

@@ -55,7 +55,7 @@ namespace OpenRA.Mods.Common.Traits
foreach (var s in unitGroup.SupportActors) foreach (var s in unitGroup.SupportActors)
{ {
var mi = w.Map.Rules.Actors[s.ToLowerInvariant()].Traits.Get<MobileInfo>(); var mi = w.Map.Rules.Actors[s.ToLowerInvariant()].TraitInfo<MobileInfo>();
var validCells = supportSpawnCells.Where(c => mi.CanEnterCell(w, null, c)); var validCells = supportSpawnCells.Where(c => mi.CanEnterCell(w, null, c));
if (!validCells.Any()) if (!validCells.Any())
throw new InvalidOperationException("No cells available to spawn starting unit {0}".F(s)); throw new InvalidOperationException("No cells available to spawn starting unit {0}".F(s));

View File

@@ -40,14 +40,14 @@ namespace OpenRA.Mods.Common.UtilityCommands
Game.ModData = new ModData(srcMod); Game.ModData = new ModData(srcMod);
GlobalFileSystem.LoadFromManifest(Game.ModData.Manifest); GlobalFileSystem.LoadFromManifest(Game.ModData.Manifest);
var srcRules = Game.ModData.RulesetCache.Load(); var srcRules = Game.ModData.RulesetCache.Load();
var srcPaletteInfo = srcRules.Actors["player"].Traits.Get<PlayerColorPaletteInfo>(); var srcPaletteInfo = srcRules.Actors["player"].TraitInfo<PlayerColorPaletteInfo>();
var srcRemapIndex = srcPaletteInfo.RemapIndex; var srcRemapIndex = srcPaletteInfo.RemapIndex;
var destMod = args[2].Split(':')[0]; var destMod = args[2].Split(':')[0];
Game.ModData = new ModData(destMod); Game.ModData = new ModData(destMod);
GlobalFileSystem.LoadFromManifest(Game.ModData.Manifest); GlobalFileSystem.LoadFromManifest(Game.ModData.Manifest);
var destRules = Game.ModData.RulesetCache.Load(); var destRules = Game.ModData.RulesetCache.Load();
var destPaletteInfo = destRules.Actors["player"].Traits.Get<PlayerColorPaletteInfo>(); var destPaletteInfo = destRules.Actors["player"].TraitInfo<PlayerColorPaletteInfo>();
var destRemapIndex = destPaletteInfo.RemapIndex; var destRemapIndex = destPaletteInfo.RemapIndex;
var shadowIndex = new int[] { }; var shadowIndex = new int[] { };

View File

@@ -62,7 +62,7 @@ namespace OpenRA.Mods.Common.Warheads
{ {
foreach (var unit in world.ActorMap.GetUnitsAt(cell)) foreach (var unit in world.ActorMap.GetUnitsAt(cell))
{ {
var healthInfo = unit.Info.Traits.GetOrDefault<HealthInfo>(); var healthInfo = unit.Info.TraitInfoOrDefault<HealthInfo>();
if (healthInfo == null) if (healthInfo == null)
continue; continue;

View File

@@ -33,7 +33,7 @@ namespace OpenRA.Mods.Common.Warheads
public override void DoImpact(Actor victim, Actor firedBy, IEnumerable<int> damageModifiers) public override void DoImpact(Actor victim, Actor firedBy, IEnumerable<int> damageModifiers)
{ {
var healthInfo = victim.Info.Traits.GetOrDefault<HealthInfo>(); var healthInfo = victim.Info.TraitInfoOrDefault<HealthInfo>();
if (healthInfo == null) if (healthInfo == null)
return; return;

View File

@@ -54,7 +54,7 @@ namespace OpenRA.Mods.Common.Warheads
continue; continue;
var localModifiers = damageModifiers; var localModifiers = damageModifiers;
var healthInfo = victim.Info.Traits.GetOrDefault<HealthInfo>(); var healthInfo = victim.Info.TraitInfoOrDefault<HealthInfo>();
if (healthInfo != null) if (healthInfo != null)
{ {
var distance = Math.Max(0, (victim.CenterPosition - pos).Length - healthInfo.Radius.Length); var distance = Math.Max(0, (victim.CenterPosition - pos).Length - healthInfo.Radius.Length);

View File

@@ -98,7 +98,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
if (!actor.HasTraitInfo<IRenderActorPreviewInfo>()) if (!actor.HasTraitInfo<IRenderActorPreviewInfo>())
continue; continue;
var filter = actor.Traits.GetOrDefault<EditorTilesetFilterInfo>(); var filter = actor.TraitInfoOrDefault<EditorTilesetFilterInfo>();
if (filter != null) if (filter != null)
{ {
if (filter.ExcludeTilesets != null && filter.ExcludeTilesets.Contains(world.TileSet.Id)) 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.Bounds.Height = preview.Bounds.Height + 2 * preview.Bounds.Y;
item.IsVisible = () => true; item.IsVisible = () => true;
var tooltip = actor.Traits.GetOrDefault<TooltipInfo>(); var tooltip = actor.TraitInfoOrDefault<TooltipInfo>();
item.GetTooltipText = () => tooltip == null ? actor.Name : tooltip.Name + " (" + actor.Name + ")"; item.GetTooltipText = () => tooltip == null ? actor.Name : tooltip.Name + " (" + actor.Name + ")";
panel.AddChild(item); panel.AddChild(item);

View File

@@ -32,7 +32,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{ {
var playerWidgets = Game.LoadWidget(world, "PLAYER_WIDGETS", playerRoot, new WidgetArgs()); var playerWidgets = Game.LoadWidget(world, "PLAYER_WIDGETS", playerRoot, new WidgetArgs());
var sidebarTicker = playerWidgets.Get<LogicTickerWidget>("SIDEBAR_TICKER"); var sidebarTicker = playerWidgets.Get<LogicTickerWidget>("SIDEBAR_TICKER");
var objectives = world.LocalPlayer.PlayerActor.Info.Traits.GetOrDefault<MissionObjectivesInfo>(); var objectives = world.LocalPlayer.PlayerActor.Info.TraitInfoOrDefault<MissionObjectivesInfo>();
sidebarTicker.OnTick = () => sidebarTicker.OnTick = () =>
{ {

View File

@@ -54,9 +54,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic
if (actor == null || actor == lastActor) if (actor == null || actor == lastActor)
return; return;
var tooltip = actor.Traits.Get<TooltipInfo>(); var tooltip = actor.TraitInfo<TooltipInfo>();
var buildable = actor.Traits.Get<BuildableInfo>(); var buildable = actor.TraitInfo<BuildableInfo>();
var cost = actor.Traits.Get<ValuedInfo>().Cost; var cost = actor.TraitInfo<ValuedInfo>().Cost;
nameLabel.GetText = () => tooltip.Name; nameLabel.GetText = () => tooltip.Name;
@@ -114,7 +114,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{ {
ActorInfo ai; ActorInfo ai;
if (rules.Actors.TryGetValue(a.ToLowerInvariant(), out ai) && ai.HasTraitInfo<TooltipInfo>()) if (rules.Actors.TryGetValue(a.ToLowerInvariant(), out ai) && ai.HasTraitInfo<TooltipInfo>())
return ai.Traits.Get<TooltipInfo>().Name; return ai.TraitInfo<TooltipInfo>().Name;
return a; return a;
} }

View File

@@ -438,7 +438,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
Map.Map.Options.StartingCash.HasValue ? "Not Available" : "${0}".F(orderManager.LobbyInfo.GlobalSettings.StartingCash); Map.Map.Options.StartingCash.HasValue ? "Not Available" : "${0}".F(orderManager.LobbyInfo.GlobalSettings.StartingCash);
startingCash.OnMouseDown = _ => startingCash.OnMouseDown = _ =>
{ {
var options = modRules.Actors["player"].Traits.Get<PlayerResourcesInfo>().SelectableCash.Select(c => new DropDownOption var options = modRules.Actors["player"].TraitInfo<PlayerResourcesInfo>().SelectableCash.Select(c => new DropDownOption
{ {
Title = "${0}".F(c), Title = "${0}".F(c),
IsSelected = () => orderManager.LobbyInfo.GlobalSettings.StartingCash == 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))); orderManager.IssueOrder(Order.Command("state {0}".F(Session.ClientState.NotReady)));
// Restore default starting cash if the last map set it to something invalid // Restore default starting cash if the last map set it to something invalid
var pri = modRules.Actors["player"].Traits.Get<PlayerResourcesInfo>(); var pri = modRules.Actors["player"].TraitInfo<PlayerResourcesInfo>();
if (!Map.Map.Options.StartingCash.HasValue && !pri.SelectableCash.Contains(orderManager.LobbyInfo.GlobalSettings.StartingCash)) if (!Map.Map.Options.StartingCash.HasValue && !pri.SelectableCash.Contains(orderManager.LobbyInfo.GlobalSettings.StartingCash))
orderManager.IssueOrder(Order.Command("startingcash {0}".F(pri.DefaultCash))); orderManager.IssueOrder(Order.Command("startingcash {0}".F(pri.DefaultCash)));
} }

View File

@@ -72,10 +72,10 @@ namespace OpenRA.Mods.Common.Widgets
if (actor == null) if (actor == null)
continue; continue;
var rsi = actor.Traits.Get<RenderSpritesInfo>(); var rsi = actor.TraitInfo<RenderSpritesInfo>();
var icon = new Animation(world, rsi.GetImage(actor, world.Map.SequenceProvider, faction)); var icon = new Animation(world, rsi.GetImage(actor, world.Map.SequenceProvider, faction));
icon.Play(actor.Traits.Get<TooltipInfo>().Icon); icon.Play(actor.TraitInfo<TooltipInfo>().Icon);
var bi = actor.Traits.Get<BuildableInfo>(); var bi = actor.TraitInfo<BuildableInfo>();
var location = new float2(RenderBounds.Location) + new float2(queue.i * (IconWidth + IconSpacing), 0); 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); WidgetUtils.DrawSHPCentered(icon.Image, location + 0.5f * iconSize, worldRenderer.Palette(bi.IconPalette), 0.5f);

Some files were not shown because too many files have changed in this diff Show More