Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cache trait look-ups in Armament #13527

Merged
merged 3 commits into from Jun 22, 2017
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
33 changes: 21 additions & 12 deletions OpenRA.Mods.Common/Traits/Armament.cs
Expand Up @@ -107,7 +107,14 @@ public class Armament : ConditionalTrait<ArmamentInfo>, ITick, IExplodeModifier
Turreted turret;
AmmoPool ammoPool;
BodyOrientation coords;
INotifyBurstComplete[] notifyBurstComplete;
INotifyAttack[] notifyAttacks;

IEnumerable<int> rangeModifiers;
IEnumerable<int> reloadModifiers;
IEnumerable<int> damageModifiers;
IEnumerable<int> inaccuracyModifiers;

List<Pair<int, Action>> delayedActions = new List<Pair<int, Action>>();

public WDist Recoil;
Expand Down Expand Up @@ -141,15 +148,21 @@ public Armament(Actor self, ArmamentInfo info)

public virtual WDist MaxRange()
{
return new WDist(Util.ApplyPercentageModifiers(Weapon.Range.Length, rangeModifiers));
return new WDist(Util.ApplyPercentageModifiers(Weapon.Range.Length, rangeModifiers.ToArray()));
}

protected override void Created(Actor self)
{
turret = self.TraitsImplementing<Turreted>().FirstOrDefault(t => t.Name == Info.Turret);
ammoPool = self.TraitsImplementing<AmmoPool>().FirstOrDefault(la => la.Info.Name == Info.AmmoPoolName);
coords = self.Trait<BodyOrientation>();
notifyBurstComplete = self.TraitsImplementing<INotifyBurstComplete>().ToArray();
notifyAttacks = self.TraitsImplementing<INotifyAttack>().ToArray();

rangeModifiers = self.TraitsImplementing<IRangeModifier>().ToArray().Select(m => m.GetRangeModifier());
reloadModifiers = self.TraitsImplementing<IReloadModifier>().ToArray().Select(m => m.GetReloadModifier());
damageModifiers = self.TraitsImplementing<IFirepowerModifier>().ToArray().Select(m => m.GetFirepowerModifier());
inaccuracyModifiers = self.TraitsImplementing<IInaccuracyModifier>().ToArray().Select(m => m.GetInaccuracyModifier());

base.Created(self);
}
Expand Down Expand Up @@ -224,14 +237,11 @@ public virtual Barrel CheckFire(Actor self, IFacing facing, Target target)
Weapon = Weapon,
Facing = legacyFacing,

DamageModifiers = self.TraitsImplementing<IFirepowerModifier>()
.Select(a => a.GetFirepowerModifier()).ToArray(),
DamageModifiers = damageModifiers.ToArray(),

InaccuracyModifiers = self.TraitsImplementing<IInaccuracyModifier>()
.Select(a => a.GetInaccuracyModifier()).ToArray(),
InaccuracyModifiers = inaccuracyModifiers.ToArray(),

RangeModifiers = self.TraitsImplementing<IRangeModifier>()
.Select(a => a.GetRangeModifier()).ToArray(),
RangeModifiers = rangeModifiers.ToArray(),

Source = muzzlePosition(),
CurrentSource = muzzlePosition,
Expand All @@ -240,7 +250,7 @@ public virtual Barrel CheckFire(Actor self, IFacing facing, Target target)
GuidedTarget = target
};

foreach (var na in self.TraitsImplementing<INotifyAttack>())
foreach (var na in notifyAttacks)
na.PreparingAttack(self, target, this, barrel);

ScheduleDelayedAction(Info.FireDelay, () =>
Expand All @@ -257,7 +267,7 @@ public virtual Barrel CheckFire(Actor self, IFacing facing, Target target)
if (Burst == args.Weapon.Burst && args.Weapon.StartBurstReport != null && args.Weapon.StartBurstReport.Any())
Game.Sound.Play(SoundType.World, args.Weapon.StartBurstReport.Random(self.World.SharedRandom), self.CenterPosition);

foreach (var na in self.TraitsImplementing<INotifyAttack>())
foreach (var na in notifyAttacks)
na.Attacking(self, target, this, barrel);

Recoil = Info.Recoil;
Expand All @@ -268,8 +278,7 @@ public virtual Barrel CheckFire(Actor self, IFacing facing, Target target)
FireDelay = Weapon.BurstDelay;
else
{
var modifiers = self.TraitsImplementing<IReloadModifier>()
.Select(m => m.GetReloadModifier());
var modifiers = reloadModifiers.ToArray();
FireDelay = Util.ApplyPercentageModifiers(Weapon.ReloadDelay, modifiers);
Burst = Weapon.Burst;

Expand All @@ -281,7 +290,7 @@ public virtual Barrel CheckFire(Actor self, IFacing facing, Target target)
});
}

foreach (var nbc in self.TraitsImplementing<INotifyBurstComplete>())
foreach (var nbc in notifyBurstComplete)
nbc.FiredBurst(self, target, this);
}

Expand Down