using System.Collections.Generic;
using CombatLibrary.CombatLibrary.CombatCore.CustomizeTimeLogic.FxLogic;
using Common.Combat.FxAILogic;
using Core.Triiger;
using Fort23.Core;
using GameLogic.Combat.CombatTool;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;
using UnityEngine;
using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface;
namespace GameLogic.Combat.Skill.MagicSkill
{
public class S3401FxMove : CObject
{
public Vector3 endPos;
public FxAILogicBasic fxAILogicBasic;
public float moveSpeed = 8;
private System.Action finishCallBack;
private bool isUpdate;
private float moveTime;
public void InitActive(Vector3 endPos, System.Action finishCallBack)
{
this.endPos = endPos;
moveTime = 0;
this.finishCallBack = finishCallBack;
isUpdate = true;
}
public override void ActiveObj()
{
}
public override void DormancyObj()
{
fxAILogicBasic = null;
isUpdate = false;
}
public bool Update(float t)
{
if (!isUpdate)
{
return false;
}
Vector3 pos = fxAILogicBasic.gameObject.transform.position;
Vector3 dir = endPos - pos;
float distance = dir.magnitude;
float addT = 1.0f / (distance / moveSpeed);
moveTime += t * addT;
Vector3 d = Vector3.Lerp(pos, endPos, moveTime);
fxAILogicBasic.gameObject.transform.position = d;
if (moveTime >= 1)
{
fxAILogicBasic.Dispose();
finishCallBack?.Invoke();
isUpdate = false;
CObjectPool.Instance.Recycle(this);
return false;
}
return true;
}
}
///
/// 宝塔在英雄的头顶前往位置旋转,形成一个扇形区域,敌人的功法如果进入这个扇形区域有很大的概率被法宝吸收
///(飞到玩家头顶持续施法)
/// 100%吸收,切吸收后临时增加玩家对于吸收功法的灵根
///
public class S3401 : MagicSkillBasic, ITriggerEntity
{
private List _currTriggerFx = new List();
private float _currTime;
private bool _isUpdae;
private IUnRegister _unRegister;
protected override void ProMagicUseSkill()
{
TimeLineEventLogicGroupBasic timeLineEventLogicGroupBasic = ActivationTimeLineData("sk1_xiaoshi");
timeLineEventLogicGroupBasic.TimeLineUpdateEnd = delegate()
{
Transform root = CombatMagicWeaponEntity.RootMagicWeaponControl.combatHeroEntity.GameObject.transform;
Vector3 pos = root.TransformPoint(new Vector3(0, 4, 4));
Quaternion quaternion = Quaternion.Euler(120, 0, 0);
CombatHeroEntity.GameObject.transform.rotation = root.rotation * quaternion;
// Vector3 d = root.rotation * _dir;
CombatHeroEntity.GameObject.transform.position = pos;
TimeLineEventLogicGroupBasic sk1_show = ActivationTimeLineData("sk1_show");
sk1_show.TimeLineUpdateEnd = ShowFinish;
};
}
protected void ShowFinish()
{
ActivationTimeLineData("sk1");
SpecialDotInfo specialDotInfo =
CombatMagicWeaponEntity.GetSpecialDotInfo("sk1");
_unRegister = specialDotInfo.targetTran.gameObject.OnTriggerEnterEvent(this, OnTriggerExitEvent);
_isUpdae = true;
}
protected override void MagicSkillUpdate(float time)
{
for (int i = 0; i < _currTriggerFx.Count; i++)
{
S3401FxMove fxMove = _currTriggerFx[i];
bool isUpdate = fxMove.Update(time);
if (!isUpdate)
{
_currTriggerFx.RemoveAt(i);
i--;
}
}
if (!_isUpdae)
{
return;
}
_currTime += time;
if (_currTime > effectValue[1])
{
_isUpdae = false;
SkillPlayFinish();
}
}
protected override void ProSkillPlayFinish()
{
_isUpdae = false;
_unRegister.UnRegister();
CombatHeroEntity.CloseLoopFx();
}
protected override void ProBreakMagicSkill()
{
_isUpdae = false;
SkillPlayFinish();
}
private void OnTriggerExitEvent(Collider collider, ITriggerEntity triggerEntity)
{
if (triggerEntity == null)
{
return;
}
FxAILogicBasic fxAILogicBasic = triggerEntity as FxAILogicBasic;
if (fxAILogicBasic != null && fxAILogicBasic.CombatHeroEntity.IsEnemy != CombatHeroEntity.IsEnemy)
{
if (!fxAILogicBasic.isInit)
{
return;
}
int odds = CombatCalculateTool.Instance.GetOdd(0, 100);
if (odds < effectValue[0])
{
fxAILogicBasic.isNotMove = true;
S3401FxMove fxMove = CObjectPool.Instance.Fetch();
fxMove.fxAILogicBasic = fxAILogicBasic;
fxMove.InitActive(CombatHeroEntity.dotPos, null);
_currTriggerFx.Add(fxMove);
}
}
}
public string tag { get; }
}
}