Fetch actors directly in DropPodsPower.

Use direct dictionary lookups, rather than iterating the entire actors dictionary.
This commit is contained in:
RoosterDragon
2024-03-09 09:57:12 +00:00
committed by Gustas
parent 6e89bef657
commit 00a23e6c11

View File

@@ -91,18 +91,22 @@ namespace OpenRA.Mods.Cnc.Traits
this.info = info;
unitTypes = info.UnitTypes.Select(unit => unit.ToLowerInvariant()).ToArray();
foreach (var actorInfo in self.World.Map.Rules.Actors.Where(a => unitTypes.Contains(a.Key)))
foreach (var unitType in unitTypes)
{
var aircraftInfo = actorInfo.Value.TraitInfo<AircraftInfo>();
if (!self.World.Map.Rules.Actors.TryGetValue(unitType, out var actorInfo))
throw new NotImplementedException("No rules definition for unit " + unitType);
var aircraftInfo = actorInfo.TraitInfo<AircraftInfo>();
var altitude = aircraftInfo.CruiseAltitude.Length;
var delta =
new WVec(0, -altitude * aircraftInfo.Speed / actorInfo.Value.TraitInfo<FallsToEarthInfo>().Velocity.Length, 0)
new WVec(0, -altitude * aircraftInfo.Speed / actorInfo.TraitInfo<FallsToEarthInfo>().Velocity.Length, 0)
.Rotate(WRot.FromYaw(info.PodFacing));
// PERF: Cache constant values.
getLaunchLocation[actorInfo.Key] = pos => self.World.Map.CenterOfCell(pos) - delta + new WVec(0, 0, altitude);
landableTerrainTypes[actorInfo.Key] = aircraftInfo.LandableTerrainTypes;
getLaunchLocation[unitType] = pos => self.World.Map.CenterOfCell(pos) - delta + new WVec(0, 0, altitude);
landableTerrainTypes[unitType] = aircraftInfo.LandableTerrainTypes;
}
}