using FL.Battle.Components;
using System;
using UnityEngine;
using XGame.Database;
using XGame.Framework.Asyncs;
using XGame.Framework.Interfaces;
using XGame.Framework.Time;
namespace FL.Battle.Buffs
{
public class Buff : IBuff, IReference, IDisposable
{
protected IBuffListener Listener { get; private set; }
protected IBuffsContext Context { get; private set; }
public BuffTable Table { get; private set; }
public int TableId => Table.Id;
public long EntityId { get; private set; }
public long OwnerId => Context.Entity.EntityId;
public int Duration => Table.EndureTime;
private int _layers;
///
/// 叠加层数
///
public int Layers
{
get => _layers;
set
{
//var last = _layers;
_layers = Mathf.Clamp(value, 1, LayerLimit);
(_dieTimer as IReset)?.Reset();
//if (last != _layers)
// OnLayerChanged();
}
}
///
/// 叠加层数上限
///
public virtual int LayerLimit => Table.AddUp;
public EBuffType BuffType => (EBuffType)Table.BuffType;
///
/// buff结束定时器
///
private ITimer _dieTimer;
public EElementType ElementType => Table.Element;
public string IconName => Table.Icon;
private IAsync _vfxLoadAsync;
private GameObject _vfxGo;
public virtual bool IsShowIcon => true;
public void Init(BuffTable table, long entityId, IBuffsContext context, IBuffListener listener)
{
Table = table;
EntityId = entityId;
Context = context;
Listener = listener;
_layers = 1;
_dieTimer = context.Time.AddDelayTimer(Duration, () =>
{
Listener?.OnCompleted(TableId);
});
LoadBuffVfx();
OnInited();
}
void IDisposable.Dispose()
{
InnerDispose();
}
void IReference.Clear()
{
InnerDispose();
}
private void InnerDispose()
{
OnDispose();
_dieTimer?.Cancel();
_dieTimer = null;
UnloadBuffVfx();
Table = null;
Context = null;
Listener = null;
}
protected virtual void OnInited()
{
}
protected virtual void OnDispose()
{
}
//protected virtual void OnLayerChanged()
//{
//}
///
/// 加载buff配套特效
///
private void LoadBuffVfx()
{
var vfxName = Table.BuffEffect;
if (string.IsNullOrEmpty(vfxName))
return;
var loadAsync = Context.Asset.LoadAsync(vfxName);
_vfxLoadAsync = loadAsync;
loadAsync.On(_ =>
{
_vfxLoadAsync = null;
var go = loadAsync.Result;
if (go == null)
return;
go.transform.SetParent(Context.OwnerTr, false);
if (BuffType == EBuffType.Freeze)
{ // 冰冻特效根据模型大小缩放
go.transform.localScale = Vector3.one * Context.Entity.Attr.Radius * 2;
}
go.SetActive(true);
_vfxGo = go;
});
}
///
/// 释放特效
///
private void UnloadBuffVfx()
{
_vfxLoadAsync?.RemoveAll();
_vfxLoadAsync = null;
if (_vfxGo != null)
{
Context.Asset.Recycle(_vfxGo);
_vfxGo = null;
}
}
}
}