public override void DoAttack(Actor self, Target target) { if (!CanAttack(self, target)) { return; } var arm = Armaments.FirstOrDefault(); if (arm == null) { return; } if (!Combat.IsInRange(self.CenterLocation, arm.Weapon.Range, target)) { return; } var move = self.TraitOrDefault <IMove>(); var facing = self.TraitOrDefault <IFacing>(); foreach (var a in Armaments) { a.CheckFire(self, this, move, facing, target); } if (target.Actor != null) { target.Actor.ChangeOwner(self.Owner); } }
public override void DoAttack(Actor self, Target target) { if (!CanAttack(self, target)) { return; } var weapon = Weapons[0].Info; if (!Combat.IsInRange(self.CenterLocation, weapon.Range, target)) { return; } var move = self.TraitOrDefault <IMove>(); var facing = self.TraitOrDefault <IFacing>(); foreach (var w in Weapons) { w.CheckFire(self, this, move, facing, target); } if (target.Actor != null) { target.Actor.ChangeOwner(self.Owner); } }
public Actor ScanForTarget(Actor self, Actor currentTarget) { var range = Info.ScanRadius > 0 ? Info.ScanRadius : attack.GetMaximumRange(); if (self.IsIdle || currentTarget == null || !Combat.IsInRange(self.CenterLocation, range, currentTarget)) { if (nextScanTime <= 0) { return(ChooseTarget(self, range)); } } return(currentTarget); }
public override void DoAttack(Actor self, Target target) { if (!CanAttack(self, target)) { return; } var weapon = Weapons[0].Info; if (!Combat.IsInRange(self.CenterLocation, weapon.Range, target)) { return; } self.CancelActivity(); self.QueueActivity(new Leap(self, target)); }
public void Tick(Actor self) { var info = self.Info.Traits.Get <CarpetBombInfo>(); if (!Combat.IsInRange(self.CenterLocation, info.Range, Target * Game.CellSize)) { return; } var limitedAmmo = self.TraitOrDefault <LimitedAmmo>(); if (limitedAmmo != null && !limitedAmmo.HasAmmo()) { return; } if (--dropDelay <= 0) { var weapon = Rules.Weapons[info.Weapon.ToLowerInvariant()]; dropDelay = weapon.ROF; var args = new ProjectileArgs { srcAltitude = self.Trait <IMove>().Altitude, destAltitude = 0, src = self.CenterLocation, dest = self.CenterLocation, facing = self.Trait <IFacing>().Facing, firedBy = self, weapon = weapon }; self.World.Add(args.weapon.Projectile.Create(args)); if (!string.IsNullOrEmpty(args.weapon.Report)) { Sound.Play(args.weapon.Report + ".aud", self.CenterLocation); } } }
public override void DoAttack(Actor self, Target target) { if (!CanAttack(self, target)) { return; } var a = ChooseArmamentForTarget(target); if (a == null) { return; } if (!Combat.IsInRange(self.CenterLocation, a.Weapon.Range, target)) { return; } self.CancelActivity(); self.QueueActivity(new Leap(self, target)); }
public void CheckFire(Actor self, AttackBase attack, IMove move, IFacing facing, Target target) { if (FireDelay > 0) { return; } var limitedAmmo = self.TraitOrDefault <LimitedAmmo>(); if (limitedAmmo != null && !limitedAmmo.HasAmmo()) { return; } if (!Combat.IsInRange(self.CenterLocation, Info.Range, target)) { return; } if (Combat.IsInRange(self.CenterLocation, Info.MinRange, target)) { return; } if (!IsValidAgainst(self.World, target)) { return; } var barrel = Barrels[Burst % Barrels.Length]; var destMove = target.IsActor ? target.Actor.TraitOrDefault <IMove>() : null; var turreted = self.TraitOrDefault <Turreted>(); var args = new ProjectileArgs { weapon = Info, firedBy = self, target = target, src = (self.CenterLocation + Combat.GetBarrelPosition(self, facing, Turret, barrel)), srcAltitude = move != null ? move.Altitude : 0, dest = target.CenterLocation, destAltitude = destMove != null ? destMove.Altitude : 0, facing = barrel.Facing + (turreted != null ? turreted.turretFacing : facing != null ? facing.Facing : Util.GetFacing(target.CenterLocation - self.CenterLocation, 0)), firepowerModifier = self.TraitsImplementing <IFirepowerModifier>() .Select(a => a.GetFirepowerModifier()) .Product() }; attack.ScheduleDelayedAction(attack.FireDelay(self, target, self.Info.Traits.Get <AttackBaseInfo>()), () => { if (args.weapon.Projectile != null) { var projectile = args.weapon.Projectile.Create(args); if (projectile != null) { self.World.Add(projectile); } if (!string.IsNullOrEmpty(args.weapon.Report)) { Sound.Play(args.weapon.Report + ".aud", self.CenterLocation); } } }); foreach (var na in self.TraitsImplementing <INotifyAttack>()) { na.Attacking(self, target); } FiredShot(); }
public void ResolveOrder(Actor self, Order order) { if (order.OrderString == "PlaceBuilding" || order.OrderString == "LineBuild") { self.World.AddFrameEndTask(w => { var prevItems = GetNumBuildables(self.Owner); // Find the queue with the target actor var queue = w.ActorsWithTrait <ProductionQueue>() .Where(p => p.Actor.Owner == self.Owner && p.Trait.CurrentItem() != null && p.Trait.CurrentItem().Item == order.TargetString && p.Trait.CurrentItem().RemainingTime == 0) .Select(p => p.Trait) .FirstOrDefault(); if (queue == null) { return; } var unit = Rules.Info[order.TargetString]; var buildingInfo = unit.Traits.Get <BuildingInfo>(); if (order.OrderString == "LineBuild") { bool playSounds = true; foreach (var t in BuildingUtils.GetLineBuildCells(w, order.TargetLocation, order.TargetString, buildingInfo)) { var building = w.CreateActor(order.TargetString, new TypeDictionary { new LocationInit(t), new OwnerInit(order.Player), }); if (playSounds) { foreach (var s in buildingInfo.BuildSounds) { Sound.PlayToPlayer(order.Player, s, building.CenterLocation); } } playSounds = false; } } else { if (!self.World.CanPlaceBuilding(order.TargetString, buildingInfo, order.TargetLocation, null)) { return; } var building = w.CreateActor(order.TargetString, new TypeDictionary { new LocationInit(order.TargetLocation), new OwnerInit(order.Player), }); foreach (var s in buildingInfo.BuildSounds) { Sound.PlayToPlayer(order.Player, s, building.CenterLocation); } } PlayBuildAnim(self, unit); queue.FinishProduction(); if (buildingInfo.RequiresBaseProvider) { var center = buildingInfo.CenterLocation(order.TargetLocation); foreach (var bp in w.ActorsWithTrait <BaseProvider>()) { if (bp.Actor.Owner.Stances[self.Owner] != Stance.Ally || !bp.Trait.Ready()) { continue; } if (Combat.IsInRange(center, bp.Trait.Info.Range, bp.Actor.CenterLocation)) { bp.Trait.BeginCooldown(); break; } } } if (GetNumBuildables(self.Owner) > prevItems) { w.Add(new DelayedAction(10, () => Sound.PlayNotification(order.Player, "Speech", "NewOptions", order.Player.Country.Race))); } }); } }
// Note: facing is only used by the legacy positioning code // The world coordinate model uses Actor.Orientation public void CheckFire(Actor self, AttackBase attack, IMove move, IFacing facing, Target target) { if (FireDelay > 0) { return; } var limitedAmmo = self.TraitOrDefault <LimitedAmmo>(); if (limitedAmmo != null && !limitedAmmo.HasAmmo()) { return; } if (!Combat.IsInRange(self.CenterLocation, Weapon.Range, target)) { return; } if (Combat.IsInRange(self.CenterLocation, Weapon.MinRange, target)) { return; } if (!IsValidAgainst(self.World, target)) { return; } var barrel = Barrels[Burst % Barrels.Length]; var destMove = target.IsActor ? target.Actor.TraitOrDefault <IMove>() : null; var muzzlePosition = self.CenterPosition + MuzzleOffset(self, barrel); var legacyMuzzlePosition = PPos.FromWPos(muzzlePosition); var legacyMuzzleAltitude = Game.CellSize * muzzlePosition.Z / 1024; var legacyFacing = MuzzleOrientation(self, barrel).Yaw.Angle / 4; var args = new ProjectileArgs { weapon = Weapon, firedBy = self, target = target, src = legacyMuzzlePosition, srcAltitude = legacyMuzzleAltitude, dest = target.CenterLocation, destAltitude = destMove != null ? destMove.Altitude : 0, facing = legacyFacing, firepowerModifier = self.TraitsImplementing <IFirepowerModifier>() .Select(a => a.GetFirepowerModifier()) .Product() }; attack.ScheduleDelayedAction(Info.FireDelay, () => { if (args.weapon.Projectile != null) { var projectile = args.weapon.Projectile.Create(args); if (projectile != null) { self.World.Add(projectile); } if (args.weapon.Report != null && args.weapon.Report.Any()) { Sound.Play(args.weapon.Report.Random(self.World.SharedRandom) + ".aud", self.CenterLocation); } } }); foreach (var na in self.TraitsImplementing <INotifyAttack>()) { na.Attacking(self, target); } Recoil = Info.Recoil; if (--Burst > 0) { FireDelay = Weapon.BurstDelay; } else { FireDelay = Weapon.ROF; Burst = Weapon.Burst; } }