2023-10-19 15:00:19 +08:00
|
|
|
|
using System.Collections.Generic;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
using cfg.BuffCfg;
|
2024-06-12 19:09:10 +08:00
|
|
|
|
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
|
|
|
|
}
|
2024-08-13 12:12:44 +08:00
|
|
|
|
|
|
|
|
|
|
public bool HasBuffGroup(int groupId)
|
|
|
|
|
|
{
|
|
|
|
|
|
return _groupMap.ContainsKey(groupId);
|
|
|
|
|
|
}
|
2023-11-09 16:15:48 +08:00
|
|
|
|
|
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-11-09 16:15:48 +08:00
|
|
|
|
|
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-11-09 16:15:48 +08:00
|
|
|
|
|
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
|
|
|
|
|
2024-01-17 14:09:16 +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);
|
2024-01-17 14:09:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
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");
|
2023-12-26 13:00:53 +08:00
|
|
|
|
// 需要把buff返回池
|
|
|
|
|
|
BuffManager.ReturnBuff(buff);
|
2023-11-16 14:15:30 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-12-26 13:00:53 +08:00
|
|
|
|
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;
|
2023-11-09 16:15:48 +08:00
|
|
|
|
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
|
|
|
|
// 判断强度
|
2024-08-02 16:17:56 +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;
|
2023-11-09 16:15:48 +08:00
|
|
|
|
case EBuffRepeatType.RefreshTime:
|
2024-07-09 18:09:24 +08:00
|
|
|
|
{
|
2023-11-09 16:15:48 +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))
|
2023-11-09 16:15:48 +08:00
|
|
|
|
{
|
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)
|
2023-11-09 16:15:48 +08:00
|
|
|
|
{
|
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;
|
2023-11-09 16:15:48 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2024-07-09 18:09:24 +08:00
|
|
|
|
}
|
2023-11-09 16:15:48 +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
|
2023-11-09 16:15:48 +08:00
|
|
|
|
{
|
|
|
|
|
|
_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-11-09 16:15:48 +08:00
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-01-08 14:54:24 +08:00
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-12 19:09:10 +08:00
|
|
|
|
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);
|
2024-06-12 19:09:10 +08:00
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
|
2024-03-26 12:31:23 +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
|
|
|
|
}
|
|
|
|
|
|
}
|