2023-10-19 15:00:19 +08:00
|
|
|
|
using System.Text;
|
2024-06-12 16:11:27 +08:00
|
|
|
|
using Framework;
|
2023-10-31 14:53:52 +08:00
|
|
|
|
using Gameplay.Effect;
|
2023-10-19 15:00:19 +08:00
|
|
|
|
using Gameplay.Pool;
|
2023-12-13 16:20:41 +08:00
|
|
|
|
using Gameplay.Unit;
|
2023-11-16 15:40:50 +08:00
|
|
|
|
using UnityEngine;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
|
|
|
|
|
namespace Gameplay.Buff
|
|
|
|
|
|
{
|
|
|
|
|
|
using cfg.BuffCfg;
|
|
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
public class BaseBuff: IPoolData
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// buff被挂载的对象
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public GameUnit owner;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2023-10-19 15:00:19 +08:00
|
|
|
|
/// buff的创建者
|
2023-08-22 19:08:45 +08:00
|
|
|
|
/// </summary>
|
2023-10-19 15:00:19 +08:00
|
|
|
|
public GameUnit creator { get; private set; }
|
2024-05-17 12:24:55 +08:00
|
|
|
|
public uint creatorId
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
if (creator == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
return creator.GetID();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
|
|
|
|
|
public EBuffType buffType
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
|
|
|
|
|
return configData.BuffType;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-03-20 15:08:15 +08:00
|
|
|
|
private bool _existNeedRemove = false;
|
2025-02-26 15:33:23 +08:00
|
|
|
|
private bool _extNeedRemove
|
|
|
|
|
|
{
|
|
|
|
|
|
get;
|
|
|
|
|
|
set;
|
|
|
|
|
|
} = false;
|
2024-03-26 12:31:23 +08:00
|
|
|
|
|
|
|
|
|
|
private int _createCellIndex;
|
2024-03-20 15:08:15 +08:00
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
public bool needRemove
|
|
|
|
|
|
{
|
|
|
|
|
|
get
|
|
|
|
|
|
{
|
2024-03-20 15:08:15 +08:00
|
|
|
|
var existNeedRemove = _GetExistNeedRemove();
|
|
|
|
|
|
if (existNeedRemove)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2024-03-20 15:08:15 +08:00
|
|
|
|
return true;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2024-03-20 15:08:15 +08:00
|
|
|
|
return _GetExtNeedRemove();
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-07-19 15:34:09 +08:00
|
|
|
|
public float maxExistTime
|
|
|
|
|
|
{
|
|
|
|
|
|
get;
|
|
|
|
|
|
private set;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
public DataBuff configData;
|
|
|
|
|
|
public BuffRuntimeData runtimeData;
|
|
|
|
|
|
|
|
|
|
|
|
private float _remainTriggerTime;
|
|
|
|
|
|
|
2023-10-31 14:53:52 +08:00
|
|
|
|
private EffectPlayingData _existEffectData;
|
|
|
|
|
|
|
2023-11-15 13:07:17 +08:00
|
|
|
|
public bool isParamOverride;
|
|
|
|
|
|
private float[] _overrideParams;
|
|
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
public virtual void Ctor(GameUnit creator,
|
|
|
|
|
|
DataBuff configData)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
this.creator = creator;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
this.configData = configData;
|
2023-11-15 13:07:17 +08:00
|
|
|
|
isParamOverride = false;
|
2024-03-20 15:08:15 +08:00
|
|
|
|
_existNeedRemove = false;
|
2024-03-20 15:28:01 +08:00
|
|
|
|
_extNeedRemove = false;
|
2023-10-19 15:00:19 +08:00
|
|
|
|
if (runtimeData == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
runtimeData = new BuffRuntimeData();
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
runtimeData.Reset();
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
if (configData.TriggerType == ETriggerType.ON_LOOP)
|
|
|
|
|
|
{
|
|
|
|
|
|
_remainTriggerTime = configData.TiggerUnitTime;
|
|
|
|
|
|
}
|
2024-07-19 15:34:09 +08:00
|
|
|
|
|
|
|
|
|
|
if (this.configData.ExistType == EExistType.During)
|
|
|
|
|
|
{
|
|
|
|
|
|
maxExistTime = this.configData.MaxExistTime;
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2023-10-19 15:00:19 +08:00
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
public void Init()
|
|
|
|
|
|
{
|
2024-03-26 12:31:23 +08:00
|
|
|
|
_createCellIndex = owner.transData.cellIndex;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
_OnInit();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected virtual void _OnInit()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
2023-11-10 15:46:23 +08:00
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2024-07-19 15:34:09 +08:00
|
|
|
|
|
|
|
|
|
|
public void ForceSetExistTime(float time)
|
|
|
|
|
|
{
|
|
|
|
|
|
maxExistTime = time;
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
2023-11-15 16:09:10 +08:00
|
|
|
|
public void Trigger()
|
|
|
|
|
|
{
|
|
|
|
|
|
_OnTrigger();
|
|
|
|
|
|
|
|
|
|
|
|
if (configData.ExistType == EExistType.Once)
|
|
|
|
|
|
{
|
2024-03-20 15:08:15 +08:00
|
|
|
|
_existNeedRemove = true;
|
2023-11-15 16:09:10 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
protected virtual void _OnTrigger()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-15 13:07:17 +08:00
|
|
|
|
public void OverrideFloatParams(params float[] overrideParams)
|
|
|
|
|
|
{
|
|
|
|
|
|
isParamOverride = true;
|
|
|
|
|
|
_overrideParams = overrideParams;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
public void TriggerAdd()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (configData.TriggerType == ETriggerType.ON_ADD)
|
|
|
|
|
|
{
|
2023-11-15 16:09:10 +08:00
|
|
|
|
Trigger();
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2023-11-15 16:09:10 +08:00
|
|
|
|
_OnAdd();
|
2023-10-31 14:53:52 +08:00
|
|
|
|
|
|
|
|
|
|
if (configData.ExistType == EExistType.During ||
|
|
|
|
|
|
configData.ExistType == EExistType.Allways)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (configData.ExistEffectId != 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
var ownerTrans = owner.Node.transform;
|
|
|
|
|
|
_existEffectData = EffectManager.instance.PlayEffectById(configData.ExistEffectId,
|
|
|
|
|
|
ownerTrans.position, ownerTrans.rotation, ownerTrans);
|
|
|
|
|
|
_existEffectData.autoDestroy = false;
|
|
|
|
|
|
}
|
2024-06-12 16:11:27 +08:00
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(configData.BuffDisplayIcon))
|
|
|
|
|
|
{
|
2024-06-12 19:28:20 +08:00
|
|
|
|
EventManager.Instance.Send(EventManager.EventName.INFIGHT_BUFF_ADDICON, this);
|
2023-10-31 14:53:52 +08:00
|
|
|
|
}
|
2024-06-12 19:09:10 +08:00
|
|
|
|
|
2024-09-09 19:22:22 +08:00
|
|
|
|
if (owner.debugShowInfo != null && owner.debugShowInfo.cacheConfigId != 0 && configData.BuffEffectType == EBuffEffectType.PositiveBuff)
|
2024-06-12 19:09:10 +08:00
|
|
|
|
{
|
|
|
|
|
|
EventManager.Instance.Send(EventManager.EventName.INFIGHT_AUDIO_GET_P_BUFF, owner.debugShowInfo.cacheConfigId);
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
protected virtual void _OnAdd()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected virtual void _OnRemove()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
|
|
|
|
|
public void TriggerRemove()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (configData.TriggerType == ETriggerType.ON_REMOVE)
|
|
|
|
|
|
{
|
2023-11-15 16:09:10 +08:00
|
|
|
|
Trigger();
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2024-06-12 16:11:27 +08:00
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(configData.BuffDisplayIcon))
|
|
|
|
|
|
{
|
|
|
|
|
|
EventManager.Instance.Send(EventManager.EventName.INFIGHT_BUFF_REMOVEICON, this);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-15 16:09:10 +08:00
|
|
|
|
_OnRemove();
|
2023-10-31 14:53:52 +08:00
|
|
|
|
|
|
|
|
|
|
if (_existEffectData != null)
|
|
|
|
|
|
{
|
2024-01-02 15:11:37 +08:00
|
|
|
|
_existEffectData.Destroy();
|
2023-10-31 14:53:52 +08:00
|
|
|
|
_existEffectData = null;
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void LogicUpdate(float dt)
|
|
|
|
|
|
{
|
2025-02-11 19:19:18 +08:00
|
|
|
|
if (!owner.statusData.isOnFloor)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 不再地面上,不执行update逻辑
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2023-10-19 15:00:19 +08:00
|
|
|
|
|
2025-02-11 19:19:18 +08:00
|
|
|
|
runtimeData.passTime += dt;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
if (configData.TriggerType == ETriggerType.ON_LOOP)
|
|
|
|
|
|
{
|
|
|
|
|
|
_remainTriggerTime -= dt;
|
|
|
|
|
|
if (_remainTriggerTime <= 0)
|
|
|
|
|
|
{
|
2023-11-15 16:09:10 +08:00
|
|
|
|
Trigger();
|
2023-08-22 19:08:45 +08:00
|
|
|
|
_remainTriggerTime += configData.TiggerUnitTime;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-10-31 19:33:19 +08:00
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
_OnLogicUpdate(dt);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-09 16:15:48 +08:00
|
|
|
|
public void RefreshDuring()
|
|
|
|
|
|
{
|
|
|
|
|
|
runtimeData.passTime = 0;
|
|
|
|
|
|
}
|
2023-11-15 16:09:10 +08:00
|
|
|
|
|
|
|
|
|
|
public void SpecialTrigger(ETriggerType triggerType)
|
2023-10-31 19:33:19 +08:00
|
|
|
|
{
|
2023-11-15 16:09:10 +08:00
|
|
|
|
if (configData.TriggerType == triggerType)
|
2023-10-31 19:33:19 +08:00
|
|
|
|
{
|
2023-11-15 16:09:10 +08:00
|
|
|
|
Trigger();
|
2023-10-31 19:33:19 +08:00
|
|
|
|
}
|
2025-02-26 15:33:23 +08:00
|
|
|
|
|
|
|
|
|
|
if (triggerType == ETriggerType.ON_AFTER_RELOAD)
|
|
|
|
|
|
{
|
|
|
|
|
|
_TriggerExitOnAfterReload();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-03-14 19:21:12 +08:00
|
|
|
|
if (triggerType == ETriggerType.ON_CELLINDEX_CHANGE)
|
|
|
|
|
|
{
|
|
|
|
|
|
_TriggerExitOnCellIndexChange();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-31 19:33:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-03-14 19:21:12 +08:00
|
|
|
|
private void _TriggerExitOnCellIndexChange()
|
2024-03-26 12:31:23 +08:00
|
|
|
|
{
|
|
|
|
|
|
if (configData.ExExitType == EExitType.CellIndexChange)
|
|
|
|
|
|
{
|
|
|
|
|
|
var newCellIndex = owner.transData.cellIndex;
|
|
|
|
|
|
if (newCellIndex != _createCellIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
_extNeedRemove = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-07-17 15:56:35 +08:00
|
|
|
|
public void TriggerOnTakeDamage()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (configData.ExExitType == EExitType.OnTakeDamage)
|
|
|
|
|
|
{
|
|
|
|
|
|
_extNeedRemove = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-02-26 15:33:23 +08:00
|
|
|
|
|
|
|
|
|
|
public void _TriggerExitOnAfterReload()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (configData.ExExitType == EExitType.AfterOwnerReload)
|
|
|
|
|
|
{
|
|
|
|
|
|
_extNeedRemove = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-07-17 15:56:35 +08:00
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
protected virtual void _OnLogicUpdate(float dt)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override string ToString()
|
|
|
|
|
|
{
|
|
|
|
|
|
var sb = new StringBuilder();
|
|
|
|
|
|
sb.AppendLine("ID:" + configData.ID);
|
|
|
|
|
|
sb.AppendLine("Name:" + configData.Name);
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
public void OnGet()
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
public void OnReturn()
|
|
|
|
|
|
{
|
2024-03-20 15:08:15 +08:00
|
|
|
|
_existNeedRemove = false;
|
2023-10-19 15:00:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-07-09 19:26:04 +08:00
|
|
|
|
protected float[] _TryGetFloatParams()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (isParamOverride)
|
|
|
|
|
|
{
|
|
|
|
|
|
return _overrideParams;
|
|
|
|
|
|
}
|
|
|
|
|
|
return configData.FloatParams.ToArray();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-01-04 13:39:37 +08:00
|
|
|
|
protected float _TryGetFloatParam(int index, float defaultValue = 0)
|
2023-10-19 15:00:19 +08:00
|
|
|
|
{
|
2023-11-15 13:07:17 +08:00
|
|
|
|
if (isParamOverride)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 使用覆写的
|
|
|
|
|
|
if (_overrideParams.Length > index)
|
|
|
|
|
|
{
|
|
|
|
|
|
return _overrideParams[index];
|
|
|
|
|
|
}
|
2024-01-04 13:39:37 +08:00
|
|
|
|
return defaultValue;
|
2023-11-15 13:07:17 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 使用配置的
|
2023-10-19 15:00:19 +08:00
|
|
|
|
if (configData.FloatParams.Count > index)
|
|
|
|
|
|
{
|
|
|
|
|
|
return configData.FloatParams[index];
|
|
|
|
|
|
}
|
2024-01-04 13:39:37 +08:00
|
|
|
|
return defaultValue;
|
2023-10-19 15:00:19 +08:00
|
|
|
|
}
|
2023-11-16 15:40:50 +08:00
|
|
|
|
|
|
|
|
|
|
protected int _TryGetIntParam(int index)
|
|
|
|
|
|
{
|
|
|
|
|
|
var fValue = _TryGetFloatParam(index);
|
|
|
|
|
|
return Mathf.RoundToInt(fValue);
|
|
|
|
|
|
}
|
2024-03-20 15:08:15 +08:00
|
|
|
|
|
|
|
|
|
|
private bool _GetExistNeedRemove()
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (configData.ExistType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case EExistType.Once:
|
2024-05-20 14:01:15 +08:00
|
|
|
|
// 如果存在时间大于0,那么超过时间就移除
|
2024-07-19 15:34:09 +08:00
|
|
|
|
if (maxExistTime > 0)
|
2024-05-20 14:01:15 +08:00
|
|
|
|
{
|
2024-07-19 15:34:09 +08:00
|
|
|
|
if (runtimeData.passTime >= maxExistTime)
|
2024-05-20 14:01:15 +08:00
|
|
|
|
{
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// 否则,只要被触发过就移除
|
2024-03-20 15:08:15 +08:00
|
|
|
|
return _existNeedRemove;
|
|
|
|
|
|
case EExistType.During:
|
2024-07-19 15:34:09 +08:00
|
|
|
|
return runtimeData.passTime >= maxExistTime;
|
2024-03-20 15:08:15 +08:00
|
|
|
|
case EExistType.Allways:
|
|
|
|
|
|
return false;
|
|
|
|
|
|
default:
|
|
|
|
|
|
DebugUtil.LogError("暂未处理的buff existType:{0}",configData.ExistType);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private bool _GetExtNeedRemove()
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (configData.ExExitType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case EExitType.None:
|
|
|
|
|
|
return false;
|
|
|
|
|
|
case EExitType.CreaterOutFight:
|
|
|
|
|
|
if (creator == null || creator.isDisposed)
|
|
|
|
|
|
{
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return GameUnitManager.instance.infightUnits.Contains(creator.GetID());
|
2024-07-17 18:31:55 +08:00
|
|
|
|
case EExitType.OnTakeDamage:
|
|
|
|
|
|
return _extNeedRemove;
|
2025-02-19 16:35:23 +08:00
|
|
|
|
case EExitType.CreaterOutVehicle:
|
|
|
|
|
|
if (creator == null
|
|
|
|
|
|
|| creator.statusData.isDead
|
|
|
|
|
|
|| !creator.statusData.isOnVehicle)
|
|
|
|
|
|
{
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
2025-02-26 15:33:23 +08:00
|
|
|
|
case EExitType.AfterOwnerReload:
|
|
|
|
|
|
return _extNeedRemove;
|
2025-04-08 19:17:45 +08:00
|
|
|
|
case EExitType.CellIndexChange:
|
|
|
|
|
|
return _extNeedRemove;
|
2024-03-20 15:08:15 +08:00
|
|
|
|
default:
|
|
|
|
|
|
DebugUtil.LogError("暂未处理的buff extExitType:{0}",configData.ExExitType);
|
|
|
|
|
|
return _extNeedRemove;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|