void ITick.Tick(Actor self) { for (var i = 0; i < delayedActions.Count; i++) { var x = delayedActions[i]; if (--x.First <= 0) { x.Second(); } delayedActions[i] = x; } delayedActions.RemoveAll(a => a.First <= 0); if (IsTraitDisabled) { return; } if (--fireDelay < 0) { if (ammoPool != null && !ammoPool.TakeAmmo(self, 1)) { return; } var localoffset = body != null ? body.LocalToWorld(info.LocalOffset.Rotate(body.QuantizeOrientation(self, self.Orientation))) : info.LocalOffset; weapon.Impact(Target.FromPos(self.CenterPosition + localoffset), self, self.TraitsImplementing <IFirepowerModifier>().Select(a => a.GetFirepowerModifier()).ToArray()); if (weapon.Report != null && weapon.Report.Any()) { Game.Sound.Play(SoundType.World, weapon.Report.Random(self.World.SharedRandom), self.CenterPosition); } if (burst == weapon.Burst && weapon.StartBurstReport != null && weapon.StartBurstReport.Any()) { Game.Sound.Play(SoundType.World, weapon.StartBurstReport.Random(self.World.SharedRandom), self.CenterPosition); } if (--burst > 0) { if (weapon.BurstDelays.Length == 1) { fireDelay = weapon.BurstDelays[0]; } else { fireDelay = weapon.BurstDelays[weapon.Burst - (burst + 1)]; } } else { var modifiers = self.TraitsImplementing <IReloadModifier>() .Select(m => m.GetReloadModifier()); fireDelay = Util.ApplyPercentageModifiers(weapon.ReloadDelay, modifiers); burst = weapon.Burst; if (weapon.AfterFireSound != null && weapon.AfterFireSound.Any()) { ScheduleDelayedAction(weapon.AfterFireSoundDelay, () => Game.Sound.Play(SoundType.World, weapon.AfterFireSound.Random(self.World.SharedRandom), self.CenterPosition)); } } } }
void ITick.Tick(Actor self) { for (var i = 0; i < delayedActions.Count; i++) { var x = delayedActions[i]; if (--x.First <= 0) { x.Second(); } delayedActions[i] = x; } delayedActions.RemoveAll(a => a.First <= 0); if (IsTraitDisabled) { return; } if (--fireDelay + Info.InitialDelay < 0) { if (ammoPool != null && !ammoPool.TakeAmmo(self, 1)) { return; } var localoffset = body != null ? body.LocalToWorld(info.LocalOffset.Rotate(body.QuantizeOrientation(self, self.Orientation))) : info.LocalOffset; var args = new WarheadArgs { Weapon = weapon, DamageModifiers = self.TraitsImplementing <IFirepowerModifier>().Select(a => a.GetFirepowerModifier()).ToArray(), Source = self.CenterPosition, SourceActor = self, WeaponTarget = Target.FromPos(self.CenterPosition + localoffset) }; weapon.Impact(Target.FromPos(self.CenterPosition + localoffset), args); if (weapon.Report != null && weapon.Report.Any()) { Game.Sound.Play(SoundType.World, weapon.Report.Random(self.World.SharedRandom), self.CenterPosition); } if (burst == weapon.Burst && weapon.StartBurstReport != null && weapon.StartBurstReport.Any()) { Game.Sound.Play(SoundType.World, weapon.StartBurstReport.Random(self.World.SharedRandom), self.CenterPosition); } if (--burst > 0) { if (weapon.BurstDelays.Length == 1) { fireDelay = weapon.BurstDelays[0]; } else { fireDelay = weapon.BurstDelays[weapon.Burst - (burst + 1)]; } } else { // here the cost of all passengers and their passengers is calculated var summedCost = 0; foreach (var p in self.TraitOrDefault <Cargo>().Passengers) { summedCost += p.Info.TraitInfos <ValuedInfo>().First().Cost; if (p.TraitOrDefault <Cargo>() != null) { foreach (var p2 in p.TraitOrDefault <Cargo>().Passengers) { summedCost += p2.Info.TraitInfos <ValuedInfo>().First().Cost; } } } var modifiers = self.TraitsImplementing <IReloadModifier>() .Select(m => m.GetReloadModifier()); fireDelay = Util.ApplyPercentageModifiers(weapon.ReloadDelay, modifiers); burst = weapon.Burst; fireDelay *= summedCost / 200; // Here is the factor which determines how fast units are spawned, higher = faster //Game.Debug(String.Join("; ", fireDelay )); if (weapon.AfterFireSound != null && weapon.AfterFireSound.Any()) { ScheduleDelayedAction(weapon.AfterFireSoundDelay, () => { Game.Sound.Play(SoundType.World, weapon.AfterFireSound.Random(self.World.SharedRandom), self.CenterPosition); }); } } } }