public LosWeaponFiringSolutionEventArgs(LosWeaponFiringSolution firingSolution) { FiringSolution = firingSolution; }
private void OnWeaponAimed(LosWeaponFiringSolution firingSolution) { if (weaponAimed != null) { weaponAimed(this, new LosWeaponFiringSolutionEventArgs(firingSolution)); } }
/// <summary> /// Aims this LOS Weapon using the provided firing solution. /// </summary> /// <param name="firingSolution">The firing solution.</param> public void AimAt(LosWeaponFiringSolution firingSolution) { WeaponMount.TraverseTo(firingSolution); }
public void HandleWeaponAimed(LosWeaponFiringSolution firingSolution) { OnWeaponAimed(firingSolution); }
private void HandleTraverseCompleted(LosWeaponFiringSolution firingSolution) { Weapon.HandleWeaponAimed(firingSolution); }
/// <summary> /// Traverses the mount to point at the target defined by the provided firing solution. /// </summary> /// <param name="firingSolution">The firing solution.</param> public void TraverseTo(LosWeaponFiringSolution firingSolution) { D.Assert(!_gameMgr.IsPaused, "Not allowed to create a Job while paused."); D.Assert(Weapon.IsOperational); D.AssertNull(_traverseJob, DebugName); //D.Log(ShowDebugLog, "{0} received Traverse to aim at {1}.", DebugName, firingSolution.EnemyTarget.DebugName); Quaternion reqdHubRotation = firingSolution.TurretRotation; Quaternion reqdBarrelElevation = firingSolution.TurretElevation; string jobName = "{0}.TraverseJob".Inject(DebugName); _traverseJob = _jobMgr.StartGameplayJob(ExecuteTraverse(reqdHubRotation, reqdBarrelElevation), jobName, isPausable: true, jobCompleted: (jobWasKilled) => { if (jobWasKilled) { // 12.12.16 An AssertNull(_jobRef) here can fail as the reference can refer to a new Job, created // right after the old one was killed due to the 1 frame delay in execution of jobCompleted(). My attempts at allowing // the AssertNull to occur failed. I believe this is OK as _jobRef is nulled from KillXXXJob() and, if // the reference is replaced by a new Job, then the old Job is no longer referenced which is the objective. Jobs Kill()ed // centrally by JobManager won't null the reference, but this only occurs during scene transitions. } else { _traverseJob = null; HandleTraverseCompleted(firingSolution); } }); }
/// <summary> /// Tries to develop a firing solution from this WeaponMount to the provided target. If successful, returns <c>true</c> and provides the /// firing solution, otherwise <c>false</c>. /// </summary> /// <param name="enemyTarget">The enemy target.</param> /// <param name="firingSolution"></param> /// <returns></returns> public override bool TryGetFiringSolution(IElementAttackable enemyTarget, out WeaponFiringSolution firingSolution) { D.Assert(enemyTarget.IsOperational); D.Assert(enemyTarget.IsAttackByAllowed(Weapon.Owner)); firingSolution = null; if (!ConfirmInRangeForLaunch(enemyTarget)) { //D.Log(ShowDebugLog, "{0}: Target {1} is out of range.", DebugName, enemyTarget.DebugName); return false; } Vector3 targetPosition = enemyTarget.Position; Quaternion reqdHubRotation, reqdBarrelElevation; bool canTraverseToTarget = TryCalcTraverse(targetPosition, out reqdHubRotation, out reqdBarrelElevation); if (!canTraverseToTarget) { //D.Log(ShowDebugLog, "{0}: Target {1} is out of traverse range.", DebugName, enemyTarget.DebugName); return false; } bool isLosClear = CheckLineOfSight(enemyTarget); if (!isLosClear) { return false; } firingSolution = new LosWeaponFiringSolution(Weapon, enemyTarget, reqdHubRotation, reqdBarrelElevation); return true; }
private void HandleLosWeaponAimed(LosWeaponFiringSolution firingSolution) { var target = firingSolution.EnemyTarget; var losWeapon = firingSolution.Weapon; D.Assert(losWeapon.IsOperational); // weapon should not have completed aiming if it lost operation if (target.IsOperational && target.IsAttackByAllowed(Owner) && losWeapon.ConfirmInRangeForLaunch(target)) { LaunchOrdnance(losWeapon, target); } else { // target moved out of range, died or changed diplomatic during aiming process losWeapon.HandleElementDeclinedToFire(); } losWeapon.weaponAimed -= LosWeaponAimedEventHandler; }