using Core.Utilities; using System.Collections.Generic; using UnityEngine; namespace KTGMGemClient { /// /// 无尽模式buff管理器 /// public class EndlessBuffManager : Singleton { /// /// 玩家拥有的buff列表 /// public List BuffList; /// /// buff处理类实例列表 /// private List instanceList; private void Start() { BuffList = new List(); // 新增buff,需要把实例添加进来 instanceList = new List() { // 攻击力增加的buff没有什么需要处理的,如果需要新写个类继承EndlessBuff即可 new EndlessBuff(), new GoldAdd(), new ObtainTower(), new DecreaseTowerAttackCD(), new CritProbabilityAdd(), new CritDamageAdd(), new CritBulletAdd(), new SlowDown(), new FireRateAdd(), new SkillLevelUp(), new DecreaseWoodChargeTime(), new FrostProbabilityAdd(), new FrostDamageAdd(), new FrostTimeAdd() }; } /// /// 玩家获得一个buff /// public void AddBuff(EndlessBuffConfig buff) { Debug.Log($"--- 获得buff:id {buff.Config.id}, name:{buff.Config.name} description:{buff.Config.brief} ---"); ++buff.SelectCount; // 有出现次数限制的 if (buff.Config.get_times > 0 && buff.SelectCount >= buff.Config.get_times) EndlessBuffData.RemoveFromBuffPool(buff.Config.id); BuffList.Add(buff); EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.PlayBuffPS, buff.Config.get_buff); EndlessBuff endlessBuff = GetBuffInstanceByType((EndlessBuffEffectType)buff.Config.buff_effect[0]); if (endlessBuff != null) { endlessBuff.BuffList.Add(buff); endlessBuff.Handle(); // 如果是一次性生效的buff,直接移除掉 if (buff.LifeCycleType == EndlessBuffLifeCycleType.Once) { endlessBuff.BuffList.Remove(buff); RemoveBuff(buff); } } } /// /// 直接从buff列表中移除某一个buff /// /// public void RemoveBuff(EndlessBuffConfig buff) { BuffList.Remove(buff); EndlessBuff endlessBuff = GetBuffInstanceByType((EndlessBuffEffectType)buff.Config.buff_effect[0]); endlessBuff?.LoseEffect(); } /// /// 更新buff列表,以波为单位,一个波次结束后调用此方法去更新buff列表 /// 这个方法主要是处理buff的生命周期,把无效的移除掉 /// /// 一次更新的波数,默认以一波为一个节点去更新 public void UpdateBuffList(int waves = 1) { int len = BuffList.Count; for (int i = 0; i < len; ++i) { if (BuffList[i].LifeCycleType == EndlessBuffLifeCycleType.LimitedWave) { BuffList[i].TackEffectWaves += waves; if (BuffList[i].TackEffectWaves >= BuffList[i].TotalEffectWaves) { // 超过波次数量限制,移除掉 RemoveBuff(BuffList[i]); len = BuffList.Count; } } } EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessBuffRefresh); } /// /// 根据buff效果类型获得buff列表数据 /// /// buff效果类型 /// 宝石技能id public List GetBuffListByEffectType(EndlessBuffEffectType type, int id) { List ret = new List(); // 暂且先这么处理吧 如果1:火 2:水 3:木 int attributeId = (int)Mathf.Floor(id / 100f); for (int i = 0; i < BuffList.Count; ++i) { if (BuffList[i].EffectType == type) { bool isWork = false; switch (BuffList[i].UseTarget) { case EndlessBuffUseTarget.All: isWork = true; break; case EndlessBuffUseTarget.Element: isWork = attributeId == BuffList[i].Config.target_type[1]; break; case EndlessBuffUseTarget.Designated: isWork = id == BuffList[i].Config.target_type[1]; break; } if (isWork) ret.Add(BuffList[i]); } } return ret; } /// /// 根据buff类型获得buff处理类实例 /// /// /// public EndlessBuff GetBuffInstanceByType(EndlessBuffEffectType type) { int tmp = (int)type - 1; if ((int)type - 1 >= instanceList.Count) return null; return instanceList[(int)type - 1]; } /// /// 处理PVE无尽模式buff增加的伤害 /// /// public float ProcessEndlessBuffAttack(float finalDamage, int elfId) { List list = EndlessBuffManager.instance.GetBuffListByEffectType(EndlessBuffEffectType.AttackAdd, elfId); if (list.Count == 0) return 0; float ratio = 0; float add = 0; for (int i = 0; i < list.Count; ++i) { ratio += list[i].Config.buff_effect[1]; add += list[i].Config.buff_effect[2]; } return finalDamage * (ratio / 100f) + add; } } }