chenxin
2020-11-19 95ed512ab8ec6ae3fc5bb827cb0e3fe98adc44d3
Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs
@@ -3,7 +3,6 @@
using ActionGameFramework.Audio;
using ActionGameFramework.Health;
using Core.Health;
using TowerDefense.Agents;
using TowerDefense.Targetting;
using TowerDefense.Towers;
using TowerDefense.Towers.Projectiles;
@@ -54,12 +53,16 @@
        /// </summary>
        public int maxAttackNum = 1;
        /// <summary>
        /// The fire rate in fires-per-second
        /// </summary>
        public float fireRate;
        [SerializeField]
        private float projectileFireRate = 1;
        public float FireRate
        {
            get { return 1 / GetFireDuration(); }
        }
        /// <summary>
        /// 是否木属性数据
@@ -101,6 +104,8 @@
        /// </summary>
        protected float m_FireTimer;
        protected float freezeBreathTimer;
        /// <summary>
        /// Reference to the current tracked enemy
        /// </summary>
@@ -114,11 +119,46 @@
        protected float fillBulletTime = 0.0f;
        /// <summary>
        /// 充能时间
        /// 火精灵充能时间
        /// </summary>
        protected float energyCalTime = 0;
        protected float fInEnergy = 0;
        protected float fBackupTimer = 0.0f;
        /// <summary>
        /// 水精灵的充能时间
        /// </summary>
        protected float freezeBreathCallTime = 0;
        protected float inFreezeBreath;
        protected float freezeBreathBackTimer = 0;
        private int towerAttributeId;
        /// <summary>
        /// 火精灵技能固定攻击倍速
        /// </summary>
        /// <value></value>
        protected float fireSpeed { get; set; } = 5f;
        /// <summary>
        /// 火精灵攻击最终攻击倍速,里面计算了buff增加的倍速
        /// </summary>
        /// <value></value>
        public float finalFireSpeed
        {
            get
            {
                FireRateAdd fireRateAdd = (FireRateAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.FireRateAdd);
                float rateAdd = fireRateAdd.GetFireSpeedAdd(towerPtr.attributeId);
                return rateAdd > 1 ? rateAdd : fireSpeed;
            }
        }
        /// <summary>
        /// Gets the search rate from the targetter
        /// </summary>
@@ -258,7 +298,14 @@
        bool fireState = false;
        protected void updateTowerSkillData()
        {
            //
            HandleBullet();
            HandleEnergy();
            HandleFreezeBreath();
        }
        // 处理木精灵装填子弹
        private void HandleBullet()
        {
            // 预留出来装填子弹的时间.
            if (fillBulletTime > 0)
            {
@@ -266,7 +313,7 @@
                if (fillBulletTime <= 0.3f)
                {
                    if (towerPtr && towerPtr.bulletCtl)
                        towerPtr.bulletCtl.resetToMaxBullet();
                        towerPtr.bulletCtl.ResetToMaxBullet();
                }
                if (fillBulletTime <= 0)
@@ -274,14 +321,17 @@
                    fillBulletTime = 0;
                }
            }
        }
            //
        // 处理火精灵充能
        private void HandleEnergy()
        {
            // 充能时间的处理
            if (towerPtr && towerPtr.energyCtl)
            {
                if (this.fInEnergy <= 0)
                if (fInEnergy <= 0)
                {
                    this.energyCalTime += Time.deltaTime;
                    energyCalTime += Time.deltaTime;
                    float process = energyCalTime % 11.0f;
                    int proint = (int)Math.Floor(process);
                    proint += towerPtr.uiProOffset;
@@ -289,11 +339,11 @@
                    if (proint == 10)
                    {
                        fireState = true;
                        fInEnergy = 5.0f;
                        fInEnergy = finalFireSpeed;
                        myTower.SetFireMatSpeed(true);//设置了火宝石快速攻击
                        // 设置多倍攻击速度
                        fBackupTimer = m_FireTimer;
                        m_FireTimer = m_FireTimer / 3.0f;
                        m_FireTimer = m_FireTimer / finalFireSpeed;
                        towerPtr.uiProOffset = 0;
                        towerPtr.PlayEnergyEffect(true);
@@ -309,7 +359,7 @@
                        fireState = false;
                        EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.FireTowerChargeEnd);
                        fInEnergy = 0.0f;
                        this.energyCalTime = 0.0f;
                        energyCalTime = 0.0f;
                        towerPtr.energyCtl.SetEnergyProgress(0);
                        // 恢复正常攻击速度 
@@ -319,7 +369,71 @@
                    }
                }
            }
        }
        // 处理水精灵的充能
        private void HandleFreezeBreath()
        {
            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)
                {
                    freezeBreathCallTime += Time.deltaTime;
                    float process = freezeBreathCallTime % (FreezeBreath.ChargeTime + 1);
                    int processInt = (int)Mathf.Floor(process);
                    processInt += towerPtr.FreezeBreathProgressOffset;
                    towerPtr.FreezeBreathCtrl.SetProgress(process);
                    if (processInt == (int)Mathf.Floor(FreezeBreath.ChargeTime))
                    {
                        inFreezeBreath = towerPtr.FreezeBreathCtrl.SkillTime;
                        towerPtr.FreezeBreathProgressOffset = 0;
                        towerPtr.PlayFreezeBreathEffect(true);
                        towerPtr.FreezeBreathCtrl.ReleaseCount = 1;
                        towerPtr.FreezeBreathCtrl.PlayFreezeEffect(waveLineID);
                        towerPtr.FreezeBreathCtrl.ReleaseFreeze(waveLineID, finalDamage, damager.alignmentProvider);
                    }
                }
                else
                {
                    inFreezeBreath -= Time.deltaTime;
                    int time = Mathf.FloorToInt(towerPtr.FreezeBreathCtrl.EffectTime / (towerPtr.FreezeBreathCtrl.DamageCount - 1) * 10);
                    int interval = Mathf.FloorToInt(inFreezeBreath * 10);
                    int offset = Mathf.FloorToInt(towerPtr.FreezeBreathCtrl.SkillTime * 10) - Mathf.FloorToInt(towerPtr.FreezeBreathCtrl.EffectTime * 10);
                    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);
                    }
                    if (inFreezeBreath <= 0)
                    {
                        inFreezeBreath = 0;
                        freezeBreathCallTime = 0;
                        towerPtr.FreezeBreathCtrl.SetProgress(0);
                        towerPtr.PlayFreezeBreathEffect(false);
                    }
                }
            }
        }
@@ -348,6 +462,18 @@
            {
                towerPtr.PlayEnergyEffect(false, false);
            }
            if (towerPtr && towerPtr.FreezeBreathCtrl)
                towerPtr.PlayFreezeBreathEffect(false, false);
        }
        /// <summary>
        /// 获取子弹发射时间间隔
        /// </summary>
        public float GetFireDuration()
        {
            DecreaseTowerAttackCD endlessBuff = (DecreaseTowerAttackCD)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.DecreaseTowerAttackCD);
            return endlessBuff.GetDecreaseCD(towerPtr.attributeId, 1 / projectileFireRate);
        }
        /// <summary>
@@ -361,21 +487,28 @@
            updateTowerSkillData();
            m_FireTimer -= Time.deltaTime;
            m_TrackingEnemy = targetter.GetTarget(waveLineID, bWoodAffector);
            if (trackingEnemy == null)
                m_TrackingEnemy = targetter.GetTarget(waveLineID, bWoodAffector);
            if (trackingEnemy != null)
            if (m_TrackingEnemy != null && m_FireTimer < 0)
            {
                // m_FireTimer = 1 / fireRate;
                m_FireTimer = GetFireDuration();
                if (fInEnergy > 0)
                    m_FireTimer /= finalFireSpeed;
                towerLevel.FireSpeed = fInEnergy > 0 ? finalFireSpeed : 1f;
                if (towerPtr && towerPtr.bulletCtl != null)
                {
                    m_FireTimer = m_FireTimer / 5f;
                    towerLevel.FireSpeed = 5f;
                    int bnum = towerPtr.bulletCtl.GetCtlProgress();
                    if (bnum == 0) return;
                }
                else
                    towerLevel.FireSpeed = 1f;
                if (towerPtr && towerPtr.FreezeBreathCtrl != null)
                {
                    // 冷冻气息期间不攻击
                    if (inFreezeBreath > 0.0001f) return;
                }
                towerLevel.ChangeState(TowerActionState.Attack);
            }
@@ -390,7 +523,7 @@
            // 不再处理多子弹攻击,确保只有一个弹道
            isMultiAttack = false;
            m_TrackingEnemy = targetter.GetTarget(waveLineID, bWoodAffector);
            GameObject go = damagerProjectile.gameObject;
            if (m_TrackingEnemy == null || fillBulletTime > 0) return;
@@ -399,11 +532,13 @@
            if (towerPtr && (towerPtr.bulletCtl != null))
            {
                int bnum = towerPtr.bulletCtl.decBullet();
                //
                if (bnum == 0)
                // 暴击子弹的数量,如果获得相应buff可能会修改暴击子弹数量
                int critBulletNum = towerPtr.bulletCtl.CritBulletNum;
                if (bnum < critBulletNum)
                {
                    //damagerProjectile.damageMulti = 10.0f;
                    fillBulletTime = 2.0f;
                    if (bnum == 0)
                        fillBulletTime = 2.0f;
                    //这里需要替换特效
                    var poolable = Core.Utilities.Poolable.TryGetPoolable<Core.Utilities.Poolable>(woodProjectile_SP);
@@ -412,11 +547,10 @@
                    tmpDamager.damageMulti = 10.0f;
                    tmpDamager.damage = damagerProjectile.damage;
                }
            }
            else
            {
                if (this.towerPtr)
                if (towerPtr)
                    towerPtr.setTowerState(true);
            }
@@ -424,7 +558,7 @@
            {
                List<Targetable> enemies = towerTargetter.GetAllTargets();
                if ((enemies != null) && (Targetter.bSearchTarget))
                    m_Launcher.Launch(enemies, projectile, projectilePoints, this.maxAttackNum);
                    m_Launcher.Launch(enemies, projectile, projectilePoints, maxAttackNum);
            }
            else
            {