From 3ff709247a18476b484a5a0446ee47f1b68de05c Mon Sep 17 00:00:00 2001
From: chenxin <chenxin6991@163.com>
Date: Tue, 24 Nov 2020 18:08:10 +0800
Subject: [PATCH] 新增buff  玉米精灵蓄力时间减少 玉米精灵强化子弹蓄力,瞄准 修复了购买按钮文字显示出错问题

---
 Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs |  161 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 158 insertions(+), 3 deletions(-)

diff --git a/Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs b/Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs
index efd9efd..8794fc0 100644
--- a/Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs
+++ b/Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs
@@ -8,6 +8,8 @@
 using TowerDefense.Towers.Projectiles;
 using UnityEngine;
 using KTGMGemClient;
+using TowerDefense.Agents;
+using TowerDefense.Level;
 
 namespace TowerDefense.Affectors
 {
@@ -143,6 +145,32 @@
         /// </summary>
         /// <value></value>
         protected float fireSpeed { get; set; } = 5f;
+
+        /// <summary>
+        /// 木属性精灵蓄力时间
+        /// </summary>
+        protected float woodChargeTime { get; set; } = 1.5f;
+
+        protected float woodRemainChargeTime { get; set; }
+
+        /// <summary>
+        /// 蓄力特效时间
+        /// </summary>
+        protected float woodChargeEffectTime { get; set; }
+
+        /// <summary>
+        /// 木属性精灵蓄力特效
+        /// </summary>
+        public GameObject WoodChargeEffect;
+
+        private GameObject woodChargeEffect;
+
+        public Transform WoodChargeTransform;
+
+        /// <summary>
+        /// 木属性正在瞄准的Agent
+        /// </summary>
+        protected Agent woodAimAgent;
 
         /// <summary>
         /// 火精灵攻击最终攻击倍速,里面计算了buff增加的倍速
@@ -308,6 +336,22 @@
         // 处理木精灵装填子弹
         private void HandleBullet()
         {
+            if (woodRemainChargeTime > 0f)
+                woodRemainChargeTime -= Time.deltaTime;
+
+            if (woodChargeEffectTime > 0f)
+            {
+                woodChargeEffectTime -= Time.deltaTime;
+                UpdateWoodAim();
+
+                if (woodChargeEffectTime <= 0 && woodChargeEffect != null)
+                {
+                    CancelWoodAim();
+                    Destroy(woodChargeEffect);
+                    woodChargeEffect = null;
+                }
+            }
+
             // 预留出来装填子弹的时间.
             if (fillBulletTime > 0)
             {
@@ -323,6 +367,95 @@
                     fillBulletTime = 0;
                 }
             }
+        }
+
+        /// <summary>
+        /// 更新木属性瞄准
+        /// </summary>
+        private void UpdateWoodAim()
+        {
+            // 离得最近的 Agent
+            Agent agent = GetMinDistanceAgent();
+
+            if (agent != null)
+            {
+                // 还没有瞄准目标,直接分配
+                if (woodAimAgent == null)
+                {
+                    woodAimAgent = agent;
+
+                    if (agent.WoodAimCount == 0)
+                        agent.WoodAimEffect.Play();
+
+                    ++agent.WoodAimCount;
+                }
+                // 有小怪走到之前瞄准目标的前面 或者 之前瞄准的目标死亡,切换瞄准目标
+                else if (woodAimAgent.Id != agent.Id)
+                {
+                    if (woodAimAgent.WoodAimCount > 0)
+                    {
+                        --woodAimAgent.WoodAimCount;
+
+                        if (woodAimAgent.WoodAimCount == 0)
+                        {
+                            woodAimAgent.WoodAimEffect.Stop();
+                            woodAimAgent.WoodAimEffect.Clear();
+                        }
+                    }
+
+                    if (agent.WoodAimCount == 0)
+                        agent.WoodAimEffect.Play();
+
+                    ++agent.WoodAimCount;
+                }
+            }
+        }
+
+        /// <summary>
+        /// 获取距离终点最近的Agent
+        /// </summary>
+        /// <returns></returns>
+        private Agent GetMinDistanceAgent()
+        {
+            Agent ret = null;
+            float minDistance = -1f;
+
+            WaveLineAgentInsMgr[] waveLineAgentIns = AgentInsManager.instance.GetWaveLineList();
+            WaveLineAgentInsMgr waveLineAgentInsMgr = waveLineAgentIns[waveLineID];
+            List<Agent> agents = waveLineAgentInsMgr.listAgent;
+            Vector3 endPos = EndlessLevelManager.instance.GetHomeBasePosition(waveLineID + 1);
+
+            for (int i = 0; i < agents.Count; ++i)
+            {
+                float distance = Mathf.Abs(agents[i].transform.position.z - endPos.z);
+
+                if (minDistance < 0 || distance < minDistance)
+                {
+                    minDistance = distance;
+                    ret = agents[i];
+                }
+            }
+
+            return ret;
+        }
+
+        /// <summary>
+        /// 取消木属性瞄准
+        /// </summary>
+        private void CancelWoodAim()
+        {
+            if (woodAimAgent != null && woodAimAgent.WoodAimCount > 0)
+            {
+                --woodAimAgent.WoodAimCount;
+
+                if (woodAimAgent.WoodAimCount == 0)
+                {
+                    woodAimAgent.WoodAimEffect.Stop();
+                    woodAimAgent.WoodAimEffect.Clear();
+                }
+            }
+
+            woodAimAgent = null;
         }
 
         // 处理火精灵充能
@@ -504,7 +637,9 @@
                 if (towerPtr && towerPtr.bulletCtl != null)
                 {
                     int bnum = towerPtr.bulletCtl.GetCtlProgress();
-                    if (bnum == 0) return;
+
+                    // 蓄力时间内不攻击
+                    if (bnum == 0 || woodRemainChargeTime > 0f) return;
                 }
 
                 if (towerPtr && towerPtr.FreezeBreathCtrl != null)
@@ -531,8 +666,10 @@
 
             if (m_TrackingEnemy == null || fillBulletTime > 0) return;
 
+            go.GetComponent<Damager>().IsEnhancedBullet = false;
+
             // 处理子弹充能相关的内容
-            if (towerPtr && (towerPtr.bulletCtl != null))
+            if (towerPtr && towerPtr.bulletCtl != null)
             {
                 int bnum = towerPtr.bulletCtl.decBullet();
                 // 暴击子弹的数量,如果获得相应buff可能会修改暴击子弹数量
@@ -541,7 +678,8 @@
                 if (bnum < critBulletNum)
                 {
                     if (bnum == 0)
-                        fillBulletTime = 2.0f;
+                        // 不需要装填时间
+                        fillBulletTime = 0.1f;
 
                     //这里需要替换特效
                     var poolable = Core.Utilities.Poolable.TryGetPoolable<Core.Utilities.Poolable>(woodProjectile_SP);
@@ -549,6 +687,23 @@
                     Damager tmpDamager = go.GetComponent<Damager>();
                     tmpDamager.damageMulti = 10.0f;
                     tmpDamager.damage = damagerProjectile.damage;
+                    tmpDamager.IsEnhancedBullet = true;
+                }
+
+                // 下一颗子弹是强化子弹,然后直接蓄力
+                if (bnum - 1 >= 0 && bnum - 1 < critBulletNum)
+                {
+                    woodRemainChargeTime = woodChargeTime;
+                    DecreaseWoodChargeTime decreaseWoodChargeTime = (DecreaseWoodChargeTime)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.DecreaseWoodChargeTime);
+
+                    if (decreaseWoodChargeTime != null)
+                        woodRemainChargeTime = decreaseWoodChargeTime.GetWoodChargeTime(woodChargeTime);
+
+                    woodChargeEffectTime = woodRemainChargeTime + 0.5f / towerLevel.ActionAnimator.speed;
+                    woodChargeEffect = Instantiate(WoodChargeEffect);
+                    woodChargeEffect.transform.SetPositionAndRotation(WoodChargeTransform.position, WoodChargeTransform.rotation);
+                    ParticleSystem ps = woodChargeEffect.transform.GetChild(0).GetComponent<ParticleSystem>();
+                    ps.Play();
                 }
             }
             else

--
Gitblit v1.9.1