using System;
using CombatLibrary.CombatLibrary.CombatCore.CustomizeTimeLogic.FxLogic;
using Core.Triiger;
using Fort23.Common;
using Fort23.Core;
using Fort23.UTool;
using GameLogic.Combat.CombatTool;
using GameLogic.Combat.Skill;
#if !COMBAT_SERVER
using UnityEngine;
#endif
using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface;
using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventLogic;
namespace Common.Combat.FxAILogic
{
public abstract class FxAILogicBasic : MonoBehaviour, IDisposable, ITimelineFxLogic, ITriggerEntity
{
private TimeLineEventParticleLogicBasic _timeLineEventParticleLogicBasic;
private ILifetCycleHitPoint _attTarget;
public SkillFeaturesData SkillFeaturesData;
[Header("延迟时间发射")] public float delayTime;
[Header("多目标时延迟")] public float multipleTargetDelayTime;
[Header("碰撞时的特效")] public string hitFxName;
[Header("碰撞音效")] public string hitAudioName;
public ILifetCycleHitPoint AttTarget
{
get { return _attTarget; }
}
public CombatHeroEntity CombatHeroEntity
{
get { return _combatHeroEntity; }
}
private CombatHeroEntity _combatHeroEntity;
public TimeLineEventParticleLogicBasic TimeLineEventParticleLogicBasic
{
get { return _timeLineEventParticleLogicBasic; }
}
public IGObjectPoolInterface ObjectPoolInterface;
public bool isPenetrate;
[Header("是否使用自定义目标结束点")] public bool isUseCustomTargetEndPos;
[Header("结束点的下标")] public int customTargetEndPosIndex;
///
/// 开始点
///
protected Vector3 startPos;
public float size=1;
public Vector3 CurrPos
{
get { return _currPos; }
}
///
/// 当前Obj的位置
///
protected Vector3 _currPos;
protected Vector3 rotation;
protected SpecialDotInfo specialDotInfo;
protected float currTime;
public TriggerData triggerData;
protected bool isNotCanTriggerGround;
protected bool _isUpdateBasic;
private float _currDelayTime;
private float _currAllDelayTime;
public void Init(Vector3 startPos,
TimeLineEventParticleLogicBasic timeLineEventParticleLogicBasic, ILifetCycleHitPoint attTarget,
SpecialDotInfo specialDotInfo = null)
{
if (timeLineEventParticleLogicBasic.castEntity == null)
{
Dispose();
return;
}
size = 1;
_currAllDelayTime= delayTime+timeLineEventParticleLogicBasic.indexCount*multipleTargetDelayTime;
_currDelayTime = 0;
_currPos = startPos;
this.startPos = startPos;
this._timeLineEventParticleLogicBasic = timeLineEventParticleLogicBasic;
this._attTarget = attTarget;
_combatHeroEntity = timeLineEventParticleLogicBasic.castEntity.This();
this.specialDotInfo = specialDotInfo;
ITimeLineTriggerEvent trigger =
timeLineEventParticleLogicBasic.ITimeLineTriggerEntity as ITimeLineTriggerEvent;
if (trigger != null)
{
trigger.TimelineFxLogicInit(timeLineEventParticleLogicBasic.timeLinePlayFxSerializtion.groupName, this,
triggerData);
SkillBasic skillBasic = trigger as SkillBasic;
SkillFeaturesData = skillBasic.GetSkillFeaturesData();
}
triggerData = timeLineEventParticleLogicBasic.extraData;
triggerData.TrggerObject = this;
currTime = 0;
_isUpdateBasic = true;
ObjectPoolInterface.own.transform.localScale = Vector3.one * size;
ProInit();
}
public void SetAIMonoObj(IGObjectPoolInterface poolInterface)
{
this.ObjectPoolInterface = poolInterface;
}
// private void Detection()
// {
// if (_updateCount % 2 != 0)
// {
// return;
// }
//
// ProDetection();
// }
//
// protected virtual void ProDetection()
// {
// }
public void PlayHit()
{
FinishHit(CurrPos,hitFxName);
}
protected void FinishHit(Vector3 pos, string hitFxName)
{
if (!string.IsNullOrEmpty(hitFxName))
{
CombatController.currActiveCombat.GameTimeLineParticleFactory.CreateParticle(hitFxName,
pos, null, false, null, null);
}
}
protected void Hit(string fxName, Vector3 startPos, ILifetCycleHitPoint fxTarget, bool isRotate,
SpecialDotInfo targetSpecialDotInfo)
{
if (string.IsNullOrEmpty(fxName))
{
return;
}
TimeLineFxParticleTool.Instance.TimeLineFxParticleFactory.CreateParticle(fxName, startPos, fxTarget,
isRotate,
targetSpecialDotInfo, delegate(ParticleSystemPool pool)
{
#if !COMBAT_SERVER
// if (ObjectPoolInterface != null&&pool.own!=null)
// {
// FxColorAlter colorAlter = ObjectPoolInterface.own.GetComponent();
// if (colorAlter != null)
// {
// FxColorAlter colorAlter2 = pool.own.GetComponent();
// if (colorAlter2 == null)
// {
// colorAlter2 = pool.own.AddComponent();
// }
//
// colorAlter2.AlterColor(colorAlter.currValue);
// }
// }
#endif
});
}
public void CombatUpdate(float time)
{
if (!_isUpdateBasic)
{
return;
}
_currDelayTime+=time;
if (_currDelayTime < _currAllDelayTime)
{
return;
}
ProCombatUpdate(time);
if (_timeLineEventParticleLogicBasic == null)
{
return;
}
// Detection();
UnityRenderUpdate(time);
}
public void UnityRenderUpdate(float time)
{
ProUnityRenderUpdate(time);
}
public void Dispose()
{
if (_timeLineEventParticleLogicBasic == null)
{
return;
}
GObjectPool.Instance.Recycle(ObjectPoolInterface);
CombatController.currActiveCombat.GameTimeLineParticleFactory.RemoveFxAILogicBasic(this);
ProDispose();
// timeLineEventParticleLogicBasic?.Dispose();
ObjectPoolInterface = null;
_timeLineEventParticleLogicBasic = null;
_attTarget = null;
ObjectPoolInterface = null;
// _fxAiDataBasic = null;
_isUpdateBasic = false;
// UnityRenderUpdateComponent.Instance.RemoveICombatUpdate(this);
// CombatFactoryTool.Instance.Recycle(scName, this);
}
protected virtual void ProInit()
{
}
protected virtual void ProCombatUpdate(float time)
{
}
protected virtual void ProUnityRenderUpdate(float time)
{
}
protected virtual void ProDispose()
{
}
}
}