NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Buff/UnitBuffManager.cs

542 lines
16 KiB
C#
Raw Normal View History

2023-10-19 15:00:19 +08:00
using System.Collections.Generic;
2023-08-22 19:08:45 +08:00
using cfg.BuffCfg;
using Framework;
2024-07-18 13:48:01 +08:00
using Gameplay.Area;
2023-12-13 16:20:41 +08:00
using Gameplay.Unit;
2023-08-22 19:08:45 +08:00
namespace Gameplay.Buff
{
public class UnitBuffManager
{
2023-10-19 15:00:19 +08:00
public readonly GameUnit owner;
2023-08-22 19:08:45 +08:00
2023-10-19 15:00:19 +08:00
public readonly List<BaseBuff> totalBuffList;
2024-07-09 18:09:24 +08:00
private readonly Dictionary<int, BaseBuff> _groupMap;
2023-10-19 15:00:19 +08:00
private readonly List<BaseBuff> _needRemoveList;
2023-08-22 19:08:45 +08:00
2024-07-23 17:56:16 +08:00
public List<int> avoidBuffIds;
2023-08-22 19:08:45 +08:00
public UnitBuffManager(GameUnit owner)
{
this.owner = owner;
totalBuffList = new List<BaseBuff>();
2024-07-09 18:09:24 +08:00
_groupMap = new Dictionary<int, BaseBuff>();
2023-08-22 19:08:45 +08:00
_needRemoveList = new List<BaseBuff>();
2024-07-23 17:56:16 +08:00
avoidBuffIds = new List<int>();
2023-08-22 19:08:45 +08:00
}
public bool HasBuffGroup(int groupId)
{
return _groupMap.ContainsKey(groupId);
}
2023-08-22 19:08:45 +08:00
public void AddBuffByIds(List<int> buffIds)
{
for (var i = 0; i < buffIds.Count; ++i)
{
var buffId = buffIds[i];
AddBuffById(buffId);
}
}
public void AddBuffById(int buffId)
{
2023-10-19 15:00:19 +08:00
var addBuff = BuffManager.instance.CreateBuffById(owner, buffId);
2023-08-22 19:08:45 +08:00
AddBuff(addBuff);
}
2023-12-13 14:11:09 +08:00
public void AddBuffById(int buffId, GameUnit creator)
{
var addBuff = BuffManager.instance.CreateBuffById(creator, buffId);
AddBuff(addBuff);
}
2023-08-22 19:08:45 +08:00
public void RemoveBuffByIds(List<int> buffIds)
{
for (var i = 0; i < buffIds.Count; ++i)
{
var buffId = buffIds[i];
RemoveBuffById(buffId);
}
}
2023-10-19 15:00:19 +08:00
public bool CheckHasBuffType(EBuffType buffType)
{
for (var i = 0; i < totalBuffList.Count; ++i)
{
var buff = totalBuffList[i];
if (buff.configData.BuffType == buffType)
{
return true;
}
}
return false;
}
public bool CheckHasBuffTypeExcept(EBuffType buffType,
BaseBuff exceptBuff)
{
for (var i = 0; i < totalBuffList.Count; ++i)
{
var buff = totalBuffList[i];
if (buff == exceptBuff)
{
continue;
}
if (buff.configData.BuffType == buffType)
{
return true;
}
}
return false;
}
public List<BaseBuff> GetBuffsByType(EBuffType buffType)
{
var findList = new List<BaseBuff>();
for (var i = 0; i < totalBuffList.Count; ++i)
{
var buff = totalBuffList[i];
if (buff.configData.BuffType == buffType)
{
findList.Add(buff);
}
}
return findList;
}
2024-03-22 14:25:27 +08:00
public BaseBuff GetBuffByType(EBuffType buffType)
{
for (var i = 0; i < totalBuffList.Count; ++i)
{
var buff = totalBuffList[i];
if (buff.configData.BuffType == buffType)
{
return buff;
}
}
return null;
}
2023-08-22 19:08:45 +08:00
public void RemoveBuff(BaseBuff buff)
{
var isInList = totalBuffList.Contains(buff);
if (!isInList)
{
return;
}
2024-07-09 16:05:34 +08:00
AddNeedRemoveBuff(buff);
}
2023-08-22 19:08:45 +08:00
public void RemoveBuffById(int buffId)
{
var findBuff = totalBuffList.Find(buff => buff.configData.ID == buffId);
if (findBuff == null)
{
return;
}
2024-07-09 16:05:34 +08:00
AddNeedRemoveBuff(findBuff);
2023-08-22 19:08:45 +08:00
}
public void AddBuff(BaseBuff buff)
{
2024-07-23 17:56:16 +08:00
2023-08-22 19:08:45 +08:00
if (buff == null)
{
DebugUtil.LogError("buff为空");
return;
}
2024-07-23 17:56:16 +08:00
if (avoidBuffIds.Contains(buff.configData.ID))
{
// 需要把buff返回池
BuffManager.ReturnBuff(buff);
return;
}
2023-11-16 14:15:30 +08:00
if (buff.configData.BuffEffectType == EBuffEffectType.NegativeBuff)
{
// 负面buff
var randomValue = UnityEngine.Random.Range(0, 1f);
var ignoreRate = owner.fightData.ignoreDebuffRate;
if (randomValue < ignoreRate)
{
// 免疫
DebugUtil.Log("触发免疫debuff");
// 需要把buff返回池
BuffManager.ReturnBuff(buff);
2023-11-16 14:15:30 +08:00
return;
}
}
if (!buff.configData.CanTriggerOnDead && owner.statusData.isDead)
{
// 不可添加
// 需要把buff返回池
BuffManager.ReturnBuff(buff);
return;
}
2024-07-09 18:09:24 +08:00
2023-08-22 19:08:45 +08:00
var repeatType = buff.configData.RepeatType;
var noAdd = false;
2023-08-22 19:08:45 +08:00
switch (repeatType)
{
case EBuffRepeatType.None:
// 不做处理
break;
case EBuffRepeatType.Replace:
2024-07-09 18:09:24 +08:00
{
2023-08-22 19:08:45 +08:00
// 找到旧的,全部删除
2024-07-09 18:09:24 +08:00
if (_groupMap.TryGetValue(buff.configData.GroupId, out var oldBuff))
2023-08-22 19:08:45 +08:00
{
2024-07-09 18:09:24 +08:00
// 判断强度
if (oldBuff.configData.Level == buff.configData.Level)
{
noAdd = true;
// 刷新持续时间
oldBuff.RefreshDuring();
}
else if (oldBuff.configData.Level > buff.configData.Level)
2024-07-09 18:09:24 +08:00
{
// 新的buff强度不够,不添加
noAdd = true;
}
else
2023-08-22 19:08:45 +08:00
{
2024-08-02 16:06:25 +08:00
AddNeedRemoveBuff(oldBuff, true);
2023-08-22 19:08:45 +08:00
}
}
2024-07-09 18:09:24 +08:00
}
2023-08-22 19:08:45 +08:00
break;
case EBuffRepeatType.RefreshTime:
2024-07-09 18:09:24 +08:00
{
// 找到旧的,刷新持续时间
2024-07-09 18:09:24 +08:00
if (_groupMap.TryGetValue(buff.configData.GroupId, out var oldBuff))
{
oldBuff.RefreshDuring();
noAdd = true;
}
}
break;
case EBuffRepeatType.Merge:
{
if (_groupMap.TryGetValue(buff.configData.GroupId, out var oldBuff))
{
2024-07-09 18:09:24 +08:00
AddNeedRemoveBuff(oldBuff);
var combineLevel = oldBuff.configData.Level + buff.configData.Level;
var searchBuffConfig = GroupBuffManager.instance.SearchBuff(buff.configData.GroupId, combineLevel);
if (searchBuffConfig == null)
{
2024-07-09 18:09:24 +08:00
DebugUtil.LogError("合并buff失败找不到对应的buff配置");
noAdd = true;
}
else
{
// 替换新的buff
var newBuff = BuffManager.instance.CreateBuffByConfig(owner, searchBuffConfig);
// 需要把buff返回池
BuffManager.ReturnBuff(buff);
buff = newBuff;
}
}
2024-07-09 18:09:24 +08:00
}
break;
2023-08-22 19:08:45 +08:00
default:
2023-10-19 15:00:19 +08:00
DebugUtil.LogError("暂未处理的repeatType:{0}", repeatType);
2023-08-22 19:08:45 +08:00
break;
}
2023-11-28 13:58:36 +08:00
if (noAdd)
{
// 需要把buff返回池
BuffManager.ReturnBuff(buff);
}
else
{
_AddBuff(buff);
}
2023-08-22 19:08:45 +08:00
}
2024-07-18 18:50:13 +08:00
public void TriggerOnAddDebuff()
{
_DebuffCountChanged();
}
public void TriggerOnRemoveDebuff()
{
_DebuffCountChanged();
}
private void _DebuffCountChanged()
{
var getBuff = GetBuffByType(EBuffType.DownScaleOnDebuff);
if (getBuff == null) return;
var buff = getBuff as BuffSetBeHitScaleOnDebuffChange;
if (buff == null)
{
DebugUtil.LogError("BuffSetBeHitScaleOnDebuffChange类型错误");
return;
}
var nowDebuffCount = GetDebuffCount();
var oldDebuffCount = buff.oldDebuffCount;
var oldChangeValue = buff.GetBeHitScale(oldDebuffCount);
owner.fightData.beDamageScale -= oldChangeValue;
var newChangeValue = buff.GetBeHitScale(nowDebuffCount);
owner.fightData.beDamageScale += newChangeValue;
buff.oldDebuffCount = nowDebuffCount;
}
2024-03-08 14:52:31 +08:00
public bool CheckHasAnyDebuff()
{
for (var i = 0; i < totalBuffList.Count; ++i)
{
var buff = totalBuffList[i];
if (buff.configData.BuffEffectType == EBuffEffectType.NegativeBuff)
{
return true;
}
}
return false;
}
2023-08-22 19:08:45 +08:00
2024-07-18 14:36:15 +08:00
public int GetDebuffCount()
{
var count = 0;
for (int i = 0; i < totalBuffList.Count; i++)
{
var buff = totalBuffList[i];
if (buff.configData.BuffEffectType == EBuffEffectType.NegativeBuff)
{
count++;
}
}
return count;
}
2023-08-22 19:08:45 +08:00
private void _AddBuff(BaseBuff buff)
{
// owner.Log("增加buff:" + buff);
buff.owner = owner;
// 这里会调用buff的OnInit方法
buff.Init();
buff.TriggerAdd();
totalBuffList.Add(buff);
2024-07-09 16:05:34 +08:00
if (buff.configData.GroupId != 0)
2023-08-22 19:08:45 +08:00
{
2024-07-09 18:09:24 +08:00
_groupMap[buff.configData.GroupId] = buff;
2023-08-22 19:08:45 +08:00
}
2024-07-09 16:05:34 +08:00
2024-07-18 18:50:13 +08:00
if (buff.configData.BuffEffectType == EBuffEffectType.NegativeBuff)
{
// 负面buff
owner.buffManager.TriggerOnAddDebuff();
}
2023-08-22 19:08:45 +08:00
}
private void _RemoveBuff(BaseBuff buff)
{
var index = totalBuffList.IndexOf(buff);
if (index < 0)
{
return;
}
buff.TriggerRemove();
totalBuffList.RemoveAt(index);
2024-07-18 18:50:13 +08:00
if (buff.configData.BuffEffectType == EBuffEffectType.NegativeBuff)
{
// 负面buff
owner.buffManager.TriggerOnRemoveDebuff();
}
2023-10-19 15:00:19 +08:00
BuffManager.ReturnBuff(buff);
2024-07-09 16:05:34 +08:00
if (buff.configData.GroupId != 0)
{
2024-07-09 18:09:24 +08:00
if (_groupMap.TryGetValue(buff.configData.GroupId, out var oldBuff) && oldBuff == buff)
2024-07-09 16:05:34 +08:00
{
2024-07-09 18:09:24 +08:00
// 移除
_groupMap.Remove(buff.configData.GroupId);
2024-07-09 16:05:34 +08:00
}
}
2023-08-22 19:08:45 +08:00
}
2024-08-02 16:06:25 +08:00
public void AddNeedRemoveBuff(BaseBuff buff, bool imdRemove = false)
2023-10-24 13:20:13 +08:00
{
2024-08-02 16:06:25 +08:00
if (imdRemove)
{
_RemoveBuff(buff);
return;
}
2023-10-24 13:20:13 +08:00
if (_needRemoveList.Contains(buff))
{
return;
}
_needRemoveList.Add(buff);
}
2024-08-02 16:06:25 +08:00
public void UpdateOnlyRemoveAdd()
{
if (_needRemoveList.Count > 0)
{
for (var i = 0; i < _needRemoveList.Count; ++i)
{
var buff = _needRemoveList[i];
_RemoveBuff(buff);
}
_needRemoveList.Clear();
}
}
2023-08-22 19:08:45 +08:00
public void LogicUpdate(float dt)
{
2024-08-02 16:06:25 +08:00
2023-08-22 19:08:45 +08:00
for (var i = 0; i < totalBuffList.Count; ++i)
{
2024-08-02 16:06:25 +08:00
if (i >= totalBuffList.Count) break; // 防止在循环中删除buff导致越界
2023-08-22 19:08:45 +08:00
var buff = totalBuffList[i];
2024-08-02 16:06:25 +08:00
if (buff.needRemove)
{
_RemoveBuff(buff);
i--;
continue;
}
2023-08-22 19:08:45 +08:00
buff.LogicUpdate(dt);
if (buff.needRemove)
{
2024-08-02 16:06:25 +08:00
_RemoveBuff(buff);
i--;
2023-08-22 19:08:45 +08:00
}
2024-08-02 16:06:25 +08:00
2023-08-22 19:08:45 +08:00
}
if (_needRemoveList.Count > 0)
{
for (var i = 0; i < _needRemoveList.Count; ++i)
{
var buff = _needRemoveList[i];
_RemoveBuff(buff);
}
_needRemoveList.Clear();
}
2023-08-22 19:08:45 +08:00
}
2023-10-31 19:33:19 +08:00
public void TriggerReload()
2023-11-15 16:09:10 +08:00
{
_InnerTrigger(ETriggerType.ON_RELOAD);
}
public void TriggerNormalAttack()
{
_InnerTrigger(ETriggerType.ON_NORMAL_ATTACK);
}
2023-11-15 16:09:10 +08:00
public void TriggerEnterBattle()
{
_InnerTrigger(ETriggerType.ON_ENTER_BATTLE);
}
public void TriggerExitBattle()
{
_InnerTrigger(ETriggerType.ON_EXIT_BATTLE);
}
public void TriggerKillUnit(GameUnit unit)
2024-03-22 15:30:51 +08:00
{
2024-03-22 15:53:29 +08:00
_InnerTrigger(ETriggerType.ON_KILL_UNIT);
if (owner.debugShowInfo.cacheConfigId != 0)
{
EventManager.Instance.Send(EventManager.EventName.INFIGHT_AUDIO_KILL_ENEMY, owner.debugShowInfo.cacheConfigId);
}
if (unit.debugShowInfo.cacheConfigId != 0)
{
EventManager.Instance.Send(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_DEAD, unit.debugShowInfo.cacheConfigId);
}
2024-03-22 15:30:51 +08:00
}
public void TriggerCellIndexChange()
{
_InnerTrigger(ETriggerType.ON_CELLINDEX_CHANGE);
// 触发buff的特殊事件
for (int i = 0; i < totalBuffList.Count; i++)
{
var buff = totalBuffList[i];
if (buff.needRemove) continue;
buff.TriggerCellIndexChange();
}
}
2024-07-18 13:48:01 +08:00
public void TriggerFriendRetreat(GameUnit friendUnit)
{
var getBuff = GetBuffByType(EBuffType.AddOnFriendRetreat);
if (getBuff == null) return;
var buff = getBuff as BuffAddBuffOnFriendRetreat;
if (buff == null)
{
DebugUtil.LogError("BuffAddBuffOnFriendRetreat类型错误");
return;
}
var checkRange = buff.checkRange;
var distance = AreaManager.instance.GetDistance(friendUnit.transData.cellIndex, owner.transData.cellIndex);
if (distance <= checkRange)
{
AddBuffByIds(buff.buffIds);
}
}
2024-05-20 14:01:15 +08:00
public void TriggerOnRetreat()
{
_InnerTrigger(ETriggerType.ON_RETREAT);
2024-07-18 13:48:01 +08:00
// 触发buff的特殊事件
var allUnits = GameUnitManager.instance.infightUnits.unitList;
for (int i = 0; i < allUnits.Count; i++)
{
var unit = allUnits[i];
if (unit == owner) continue;
if (unit.commonData.troopId == owner.commonData.troopId)
{
unit.buffManager.TriggerFriendRetreat(owner);
}
}
2024-05-20 14:01:15 +08:00
}
2024-07-17 15:56:35 +08:00
public void TriggerOnTakeDamage()
{
_InnerTrigger(ETriggerType.ON_TAKEDAMAGE);
// 触发buff的特殊事件
for (int i = 0; i < totalBuffList.Count; i++)
{
var buff = totalBuffList[i];
if (buff.needRemove) continue;
buff.TriggerOnTakeDamage();
}
}
2023-11-15 16:09:10 +08:00
private void _InnerTrigger(ETriggerType triggerType)
2023-10-31 19:33:19 +08:00
{
for (int i = 0; i < totalBuffList.Count; i++)
{
var buff = totalBuffList[i];
if (buff.needRemove) continue;
2023-11-15 16:09:10 +08:00
buff.SpecialTrigger(triggerType);
2023-10-31 19:33:19 +08:00
}
}
2023-11-15 16:09:10 +08:00
2023-08-22 19:08:45 +08:00
}
}