| | |
| | | using ActionGameFramework.Health; |
| | | using KTGMGemClient; |
| | | using ActionGameFramework.Health; |
| | | using Core.Health; |
| | | using Core.Utilities; |
| | | using TowerDefense.Level; |
| | |
| | | |
| | | namespace TowerDefense.Agents |
| | | { |
| | | /// <summary> |
| | | /// A component that attacks a home base when an agent reaches it |
| | | /// </summary> |
| | | [RequireComponent(typeof(Agent))] |
| | | public class HomeBaseAttacker : MonoBehaviour |
| | | { |
| | | /// <summary> |
| | | /// How long the agent charges for before it attacks |
| | | /// the home base |
| | | /// </summary> |
| | | public float homeBaseAttackChargeTime = 0.5f; |
| | | /// <summary> |
| | | /// A component that attacks a home base when an agent reaches it |
| | | /// </summary> |
| | | [RequireComponent(typeof(Agent))] |
| | | public class HomeBaseAttacker : MonoBehaviour |
| | | { |
| | | /// <summary> |
| | | /// How long the agent charges for before it attacks |
| | | /// the home base |
| | | /// </summary> |
| | | public float homeBaseAttackChargeTime = 0.5f; |
| | | |
| | | /// <summary> |
| | | /// Timer used to stall attack to the home base |
| | | /// </summary> |
| | | protected Timer m_HomeBaseAttackTimer; |
| | | /// <summary> |
| | | /// Timer used to stall attack to the home base |
| | | /// </summary> |
| | | protected Timer m_HomeBaseAttackTimer; |
| | | |
| | | /// <summary> |
| | | /// If the agent has reached the Player Home Base and is charging an attack |
| | | /// </summary> |
| | | protected bool m_IsChargingHomeBaseAttack; |
| | | |
| | | /// <summary> |
| | | /// The DamageableBehaviour on the home base |
| | | /// </summary> |
| | | protected DamageableBehaviour m_FinalDestinationDamageableBehaviour; |
| | | /// <summary> |
| | | /// If the agent has reached the Player Home Base and is charging an attack |
| | | /// </summary> |
| | | protected bool m_IsChargingHomeBaseAttack; |
| | | |
| | | /// <summary> |
| | | /// The agent component attached to this gameObject |
| | | /// </summary> |
| | | public Agent agent { get; protected set; } |
| | | /// <summary> |
| | | /// The DamageableBehaviour on the home base |
| | | /// </summary> |
| | | protected DamageableBehaviour m_FinalDestinationDamageableBehaviour; |
| | | |
| | | /// <summary> |
| | | /// Fired on completion of <see cref="m_HomeBaseAttackTimer"/> |
| | | /// Applies damage to the homebase |
| | | /// </summary> |
| | | protected void AttackHomeBase() |
| | | { |
| | | m_IsChargingHomeBaseAttack = false; |
| | | var damager = GetComponent<Damager>(); |
| | | if (damager != null) |
| | | { |
| | | m_FinalDestinationDamageableBehaviour.TakeDamage(damager.finalDamage, transform.position, agent.configuration.alignmentProvider); |
| | | /// <summary> |
| | | /// The agent component attached to this gameObject |
| | | /// </summary> |
| | | public Agent agent { get; protected set; } |
| | | |
| | | PlayerHomeBase homebase = m_FinalDestinationDamageableBehaviour.GetComponent<PlayerHomeBase>(); |
| | | if(homebase && (!homebase.isDead) ) |
| | | /// <summary> |
| | | /// Fired on completion of <see cref="m_HomeBaseAttackTimer"/> |
| | | /// Applies damage to the homebase |
| | | /// </summary> |
| | | protected void AttackHomeBase() |
| | | { |
| | | m_IsChargingHomeBaseAttack = false; |
| | | var damager = GetComponent<Damager>(); |
| | | if (damager != null) |
| | | { |
| | | m_FinalDestinationDamageableBehaviour.TakeDamage(damager.finalDamage, transform.position, agent.configuration.alignmentProvider); |
| | | |
| | | PlayerHomeBase homebase = m_FinalDestinationDamageableBehaviour.GetComponent<PlayerHomeBase>(); |
| | | if (homebase && (!homebase.isDead)) |
| | | { |
| | | // 显示塔位血条 |
| | | float hscale = homebase.healthVal / homebase.configuration.maxHealth; |
| | | if ( hscale < 1.0) |
| | | // 显示塔位血条 |
| | | float hscale = homebase.healthVal / homebase.configuration.maxHealth; |
| | | if (hscale < 1.0) |
| | | { |
| | | if (homebase.opponent) |
| | | OpponentMgr.instance.m_CurrentArea.setTowerPosHealth(homebase.homebaseIdx, hscale); |
| | | if (homebase.opponent) |
| | | OpponentMgr.instance.m_CurrentArea.setTowerPosHealth(homebase.homebaseIdx, hscale); |
| | | else |
| | | { |
| | | if (GameUI.instanceExists) |
| | |
| | | else if (EndlessGameUI.instanceExists) |
| | | { |
| | | if (EndlessGameUI.instance.selfTowerPlaceArea != null) |
| | | EndlessGameUI.instance.selfTowerPlaceArea.setTowerPosHealth(homebase.homebaseIdx, hscale); |
| | | { |
| | | if (GameConfig.IsNewbie) |
| | | { |
| | | if (GameConfig.TowerFirstTakeDamage) |
| | | { |
| | | GameConfig.TowerFirstTakeDamage = false; |
| | | EndlessGameUI.instance.selfTowerPlaceArea.setTowerPosHealth(homebase.homebaseIdx, hscale); |
| | | EndlessLevelManager.instance.StopSecondWave(); |
| | | } |
| | | else |
| | | { |
| | | if (GameConfig.TowerCanTakeDamage) |
| | | { |
| | | EndlessGameUI.instance.selfTowerPlaceArea.setTowerPosHealth(homebase.homebaseIdx, hscale); |
| | | } |
| | | } |
| | | } |
| | | else |
| | | EndlessGameUI.instance.selfTowerPlaceArea.setTowerPosHealth(homebase.homebaseIdx, hscale); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | | agent.Remove(); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// Ticks the attack timer |
| | | /// </summary> |
| | | protected virtual void Update () |
| | | { |
| | | // Update HomeBaseAttack Timer |
| | | if (m_IsChargingHomeBaseAttack) |
| | | { |
| | | m_HomeBaseAttackTimer.Tick(Time.deltaTime); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | agent.Remove(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// Caches the attached Agent and subscribes to the destinationReached event |
| | | /// </summary> |
| | | protected virtual void Awake() |
| | | { |
| | | agent = GetComponent<Agent>(); |
| | | agent.destinationReached += OnDestinationReached; |
| | | agent.died += OnDied; |
| | | } |
| | | /// <summary> |
| | | /// Ticks the attack timer |
| | | /// </summary> |
| | | protected virtual void Update() |
| | | { |
| | | // Update HomeBaseAttack Timer |
| | | if (m_IsChargingHomeBaseAttack) |
| | | { |
| | | m_HomeBaseAttackTimer.Tick(Time.deltaTime); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// Unsubscribes from the destinationReached event |
| | | /// </summary> |
| | | protected virtual void OnDestroy() |
| | | { |
| | | if (agent != null) |
| | | { |
| | | agent.destinationReached -= OnDestinationReached; |
| | | agent.died -= OnDied; |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// Caches the attached Agent and subscribes to the destinationReached event |
| | | /// </summary> |
| | | protected virtual void Awake() |
| | | { |
| | | agent = GetComponent<Agent>(); |
| | | agent.destinationReached += OnDestinationReached; |
| | | agent.died += OnDied; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// Stops the attack on the home base |
| | | /// </summary> |
| | | void OnDied(DamageableBehaviour damageableBehaviour) |
| | | { |
| | | m_IsChargingHomeBaseAttack = false; |
| | | } |
| | | /// <summary> |
| | | /// Unsubscribes from the destinationReached event |
| | | /// </summary> |
| | | protected virtual void OnDestroy() |
| | | { |
| | | if (agent != null) |
| | | { |
| | | agent.destinationReached -= OnDestinationReached; |
| | | agent.died -= OnDied; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// Fired then the agent reached its final node, |
| | | /// Starts the attack timer |
| | | /// </summary> |
| | | /// <param name="homeBase"></param> |
| | | void OnDestinationReached (Node homeBase) |
| | | { |
| | | if (agent.bInDeathState) return; |
| | | /// <summary> |
| | | /// Stops the attack on the home base |
| | | /// </summary> |
| | | void OnDied(DamageableBehaviour damageableBehaviour) |
| | | { |
| | | m_IsChargingHomeBaseAttack = false; |
| | | } |
| | | |
| | | m_FinalDestinationDamageableBehaviour = homeBase.GetComponent<DamageableBehaviour>(); |
| | | // start timer |
| | | if (m_HomeBaseAttackTimer == null) |
| | | { |
| | | m_HomeBaseAttackTimer = new Timer(homeBaseAttackChargeTime, AttackHomeBase); |
| | | //Debug.Log("HomeBase Timer 设置起来..."); |
| | | agent.PlayAttack(); |
| | | } |
| | | else |
| | | { |
| | | //m_HomeBaseAttackTimer.Reset(); |
| | | // Debug.Log("重复设置导致有可能怪物不会消失."); |
| | | } |
| | | m_IsChargingHomeBaseAttack = true; |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// Fired then the agent reached its final node, |
| | | /// Starts the attack timer |
| | | /// </summary> |
| | | /// <param name="homeBase"></param> |
| | | void OnDestinationReached(Node homeBase) |
| | | { |
| | | if (agent.bInDeathState) return; |
| | | |
| | | m_FinalDestinationDamageableBehaviour = homeBase.GetComponent<DamageableBehaviour>(); |
| | | // start timer |
| | | if (m_HomeBaseAttackTimer == null) |
| | | { |
| | | m_HomeBaseAttackTimer = new Timer(homeBaseAttackChargeTime, AttackHomeBase); |
| | | //Debug.Log("HomeBase Timer 设置起来..."); |
| | | agent.PlayAttack(); |
| | | } |
| | | else |
| | | { |
| | | //m_HomeBaseAttackTimer.Reset(); |
| | | // Debug.Log("重复设置导致有可能怪物不会消失."); |
| | | } |
| | | m_IsChargingHomeBaseAttack = true; |
| | | } |
| | | } |
| | | } |