From 01a178da6b8dd0ba4a1b44d6d09f907e943a5d12 Mon Sep 17 00:00:00 2001
From: chenxin <chenxin6991@163.com>
Date: Fri, 25 Dec 2020 10:48:45 +0800
Subject: [PATCH] 修改火范围攻击打4个木

---
 Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs |  206 ++++++++++++++-------------------------------------
 1 files changed, 56 insertions(+), 150 deletions(-)

diff --git a/Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs b/Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs
index 0ac6408..bdad9c7 100644
--- a/Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs
+++ b/Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs
@@ -31,9 +31,6 @@
         /// 木塔最后一击是特殊攻击,需要替换projectile
         /// </summary>
         public GameObject woodProjectile_SP;
-        // 
-        protected GameObject projectile1;
-        protected GameObject projectile2;
 
         /// <summary>
         /// The list of points to launch the projectiles from
@@ -46,25 +43,9 @@
         public Transform epicenter;
 
         /// <summary>
-        /// Configuration for when the tower does splash damage
-        /// </summary>
-        public bool isMultiAttack;
-
-        /// <summary>
         /// 如果是多目标攻击,最多攻击目标
         /// </summary>
         public int maxAttackNum = 1;
-
-        /// <summary>
-        /// The fire rate in fires-per-second
-        /// </summary>
-        [SerializeField]
-        private float projectileFireRate = 1;
-
-        public float FireRate
-        {
-            get { return 1 / GetFireDuration(); }
-        }
 
         /// <summary>
         /// 是否木属性数据
@@ -161,9 +142,7 @@
         /// <summary>
         /// 木属性精灵蓄力特效
         /// </summary>
-        public GameObject WoodChargeEffect;
-
-        private GameObject woodChargeEffect;
+        public ParticleSystem WoodChargeEffect;
 
         public Transform WoodChargeTransform;
 
@@ -184,7 +163,7 @@
                 float rateAdd = 0;
 
                 if (fireRateAdd != null)
-                    rateAdd = fireRateAdd.GetFireSpeedAdd(towerPtr.attributeId);
+                    rateAdd = fireRateAdd.GetFireSpeedAdd(towerPtr.ElfId);
                 return rateAdd > 1 ? rateAdd : fireSpeed;
             }
         }
@@ -253,35 +232,41 @@
             towerTargetter.alignment = affectorAlignment;
             towerTargetter.acquiredTarget += OnAcquiredTarget;
             // towerTargetter.lostTarget += OnLostTarget;
-            GetAudioEnum();
 
             myTower = transform.parent.GetComponent<TowerLevel>();
+            GetAudioEnum();
 
         }
         private AudioEnum audioEnum;//当前音乐的种类
+        bool isWoodAudio;
 
         void GetAudioEnum()
         {
-            if (transform.parent.name.StartsWith("GrowUpTower"))
+            //小怪身上也有这个脚本,塔的名字做了更改,所以判断条件需要变成transform.parent.parent
+            if (transform.parent.parent != null)
             {
-                //火元素
-                audioEnum = AudioEnum.FireTAttack;
+                if (transform.parent.parent.name.StartsWith("GrowUpTower"))
+                {
+                    //火元素
+                    audioEnum = AudioEnum.FireTAttack;
+                }
+                else if (transform.parent.parent.name.StartsWith("BlinkTower"))
+                {
+                    //木元素
+                    audioEnum = AudioEnum.WoodTAttack;
+                }
+                else if (transform.parent.parent.name.StartsWith("CopyCatTower"))
+                {
+                    //水元素
+                    audioEnum = AudioEnum.WaterTAttack;
+                }
             }
-            else if (transform.parent.name.StartsWith("BlinkTower"))
-            {
-                //木元素
-                audioEnum = AudioEnum.WoodTAttack;
-            }
-            else if (transform.parent.name.StartsWith("CopyCatTower"))
-            {
-                //水元素
-                audioEnum = AudioEnum.WaterTAttack;
-            }
+
         }
 
         void OnDestroy()
         {
-            towerTargetter.acquiredTarget -= OnAcquiredTarget;
+            // towerTargetter.acquiredTarget -= OnAcquiredTarget;
             // towerTargetter.lostTarget -= OnLostTarget;
         }
 
@@ -305,17 +290,6 @@
             get { return projectile == null ? null : projectile.GetComponent<Damager>(); }
         }
 
-
-        /// <summary>
-        /// Returns the total projectile damage 
-        /// </summary>
-        public float GetProjectileDamage()
-        {
-            var splash = projectile.GetComponent<SplashDamager>();
-            float splashDamage = splash != null ? splash.damage : 0;
-            return damagerProjectile.finalDamage + splashDamage;
-        }
-
         /// <summary>
         /// Initialise the RepeatingTimer
         /// </summary>
@@ -328,9 +302,12 @@
         bool fireState = false;
         protected void updateTowerSkillData()
         {
-            HandleBullet();
-            HandleEnergy();
-            HandleFreezeBreath();
+            if (towerLevel != null && towerLevel.ParentTower != null && towerLevel.ParentTower.ElfId == 301)
+                HandleBullet();
+            if (towerLevel != null && towerLevel.ParentTower != null && towerLevel.ParentTower.ElfId == 101)
+                HandleEnergy();
+            if (towerLevel != null && towerLevel.ParentTower != null && towerLevel.ParentTower.ElfId == 201)
+                HandleFreezeBreath();
         }
 
         // 处理木精灵装填子弹
@@ -344,12 +321,11 @@
                 woodChargeEffectTime -= Time.deltaTime;
                 UpdateWoodAim();
 
-                if (woodChargeEffectTime <= 0 && woodChargeEffect != null)
+                if (woodChargeEffectTime <= 0)
                 {
                     towerPtr.IsWoodCharge = false;
                     CancelWoodAim();
-                    Destroy(woodChargeEffect);
-                    woodChargeEffect = null;
+                    WoodChargeEffect.Stop();
                 }
             }
 
@@ -376,7 +352,7 @@
         private void UpdateWoodAim()
         {
             // 离得最近的 Agent
-            Agent agent = GetMinDistanceAgent();
+            Agent agent = AgentInsManager.instance.GetMinDisAgent(waveLineID, false);
 
             if (agent != null)
             {
@@ -411,34 +387,6 @@
                     ++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>
@@ -477,7 +425,6 @@
                     {
                         fireState = true;
                         fInEnergy = finalFireSpeed;
-                        myTower.SetFireMatSpeed(true);//设置了火宝石快速攻击
                         // 设置多倍攻击速度
                         fBackupTimer = m_FireTimer;
                         m_FireTimer = m_FireTimer / finalFireSpeed;
@@ -491,10 +438,8 @@
                     fInEnergy -= Time.deltaTime;
                     if (fInEnergy <= 0)
                     {
-                        myTower.SetFireMatSpeed(false);//恢复了火宝石攻击速度
-
                         fireState = false;
-                        EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.FireTowerChargeEnd);
+                        //EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.FireTowerChargeEnd);
                         fInEnergy = 0.0f;
                         energyCalTime = 0.0f;
                         towerPtr.energyCtl.SetEnergyProgress(0);
@@ -515,22 +460,6 @@
             if (towerPtr && towerPtr.FreezeBreathCtrl)
             {
                 Damager damager = projectile.gameObject.GetComponent<Damager>();
-                float finalDamage = damager.damage;
-
-                List<EndlessBuffConfig> list = EndlessBuffManager.instance.GetBuffListByEffectType(EndlessBuffEffectType.AttackAdd, towerPtr.attributeId);
-                float ratio = 0;
-                float add = 0;
-
-                if (list.Count > 0)
-                {
-                    for (int i = 0; i < list.Count; ++i)
-                    {
-                        ratio += list[i].Config.buff_effect[1];
-                        add += list[i].Config.buff_effect[2];
-                    }
-                }
-
-                finalDamage += (ratio / 100f) * finalDamage + add;
 
                 if (inFreezeBreath <= 0)
                 {
@@ -547,7 +476,7 @@
                         towerPtr.PlayFreezeBreathEffect(true);
                         towerPtr.FreezeBreathCtrl.ReleaseCount = 1;
                         towerPtr.FreezeBreathCtrl.PlayFreezeEffect(waveLineID);
-                        towerPtr.FreezeBreathCtrl.ReleaseFreeze(waveLineID, finalDamage, damager.alignmentProvider);
+                        towerPtr.FreezeBreathCtrl.ReleaseFreeze(waveLineID, towerPtr, damager.alignmentProvider);
                     }
                 }
                 else
@@ -560,7 +489,7 @@
                     if (interval == time * (towerPtr.FreezeBreathCtrl.DamageCount - towerPtr.FreezeBreathCtrl.ReleaseCount - 1) + offset && towerPtr.FreezeBreathCtrl.ReleaseCount < towerPtr.FreezeBreathCtrl.DamageCount)
                     {
                         ++towerPtr.FreezeBreathCtrl.ReleaseCount;
-                        towerPtr.FreezeBreathCtrl.ReleaseFreeze(waveLineID, finalDamage, damager.alignmentProvider);
+                        towerPtr.FreezeBreathCtrl.ReleaseFreeze(waveLineID, towerPtr, damager.alignmentProvider);
                     }
 
                     if (inFreezeBreath <= 0)
@@ -583,8 +512,6 @@
             {
                 if (fireState)
                 {
-                    myTower.SetFireMatSpeed(true);//设置了火宝石快速攻击
-
                     towerPtr.PlayEnergyEffect(true);
                 }
             }
@@ -609,21 +536,11 @@
         }
 
         /// <summary>
-        /// 获取子弹发射时间间隔
-        /// </summary>
-        public float GetFireDuration()
-        {
-            DecreaseTowerAttackCD endlessBuff = (DecreaseTowerAttackCD)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.DecreaseTowerAttackCD);
-
-            return endlessBuff != null ? endlessBuff.GetDecreaseCD(towerPtr.attributeId, 1 / projectileFireRate) : 1 / projectileFireRate;
-        }
-
-        /// <summary>
         /// Update the timers
         /// </summary>
         protected virtual void Update()
         {
-            if (m_Launcher == null) return;
+            if (m_Launcher == null || towerPtr != null && !towerPtr.CanAttack) return;
 
             // 处理当前Affector所在Tower对应的技能
             updateTowerSkillData();
@@ -633,7 +550,7 @@
 
             if (m_TrackingEnemy != null && m_FireTimer < 0)
             {
-                m_FireTimer = GetFireDuration();
+                m_FireTimer = towerLevel.GetFireRate();
 
                 if (fInEnergy > 0)
                     m_FireTimer /= finalFireSpeed;
@@ -664,15 +581,14 @@
         /// </summary>
         public virtual void FireProjectile()
         {
-            // 不再处理多子弹攻击,确保只有一个弹道
-            isMultiAttack = false;
             m_TrackingEnemy = targetter.GetTarget(waveLineID, bWoodAffector);
-
-            GameObject go = damagerProjectile.gameObject;
+            GameObject go = projectile;
 
             if (m_TrackingEnemy == null || fillBulletTime > 0) return;
 
-            go.GetComponent<Damager>().IsEnhancedBullet = false;
+            Damager goDamager = go.GetComponent<Damager>();
+            goDamager.IsEnhancedBullet = false;
+            goDamager.TowerPtr = towerPtr;
 
             // 处理子弹充能相关的内容
             if (towerPtr && towerPtr.bulletCtl != null)
@@ -690,10 +606,13 @@
                     //这里需要替换特效
                     var poolable = Core.Utilities.Poolable.TryGetPoolable<Core.Utilities.Poolable>(woodProjectile_SP);
                     go = poolable.gameObject;
+                    //go = Instantiate(woodProjectile_SP);
                     Damager tmpDamager = go.GetComponent<Damager>();
                     tmpDamager.damageMulti = 10.0f;
                     tmpDamager.damage = damagerProjectile.damage;
                     tmpDamager.IsEnhancedBullet = true;
+                    tmpDamager.TowerPtr = towerPtr;
+                    isWoodAudio = true;
                 }
 
                 // 下一颗子弹是强化子弹,然后直接蓄力
@@ -707,38 +626,25 @@
                         woodRemainChargeTime = decreaseWoodChargeTime.GetWoodChargeTime(woodChargeTime);
 
                     woodChargeEffectTime = woodRemainChargeTime + 0.5f / towerLevel.ActionAnimator.speed;
-                    woodChargeEffect = Instantiate(WoodChargeEffect);
-                    woodChargeEffect.transform.SetParent(gameObject.transform);
-                    woodChargeEffect.transform.SetPositionAndRotation(WoodChargeTransform.position, WoodChargeTransform.rotation);
-                    ParticleSystem ps = woodChargeEffect.transform.GetChild(0).GetComponent<ParticleSystem>();
-                    ps.Play();
+                    WoodChargeEffect.Play();
                 }
-            }
-            else
-            {
-                if (towerPtr)
-                    towerPtr.setTowerState(true);
             }
 
-            if (isMultiAttack)
+            if (Targetter.bSearchTarget)
             {
-                List<Targetable> enemies = towerTargetter.GetAllTargets();
-                if ((enemies != null) && (Targetter.bSearchTarget))
-                    m_Launcher.Launch(enemies, projectile, projectilePoints, maxAttackNum);
-            }
-            else
-            {
-                if (Targetter.bSearchTarget)
+                m_Launcher.Launch(m_TrackingEnemy, go, projectilePoints);
+                if (AudioSourceManager.Ins)
                 {
-                    m_Launcher.Launch(m_TrackingEnemy, go, projectilePoints);
-                    if (AudioSourceManager.Ins)
+                    if (isWoodAudio)
+                    {
+                        isWoodAudio = false;
+                        AudioSourceManager.Ins.Play(AudioEnum.WoodSkill);
+                    }
+                    else
+                    {
                         AudioSourceManager.Ins.Play(audioEnum);
+                    }
                 }
-            }
-            if (randomAudioSource != null)
-            {
-                if (Targetter.bSearchTarget)
-                    randomAudioSource.PlayRandomClip();
             }
         }
 

--
Gitblit v1.9.1