wangguan
2020-10-27 bac1e673b54b1e5f773c4bd098e1b4fe8981c62e
Assets/Scripts/TowerDefense/Agents/HomeBaseAttacker.cs
@@ -1,4 +1,5 @@
using ActionGameFramework.Health;
using KTGMGemClient;
using ActionGameFramework.Health;
using Core.Health;
using Core.Utilities;
using TowerDefense.Level;
@@ -8,59 +9,59 @@
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)
@@ -71,81 +72,100 @@
                            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;
        }
    }
}