using System;
using System.Collections.Generic;
using CombatCore.SerializationTimeLine;
using CombatLibrary.CombatLibrary.CombatCore;
using CombatLibrary.CombatLibrary.CombatCore.CustomizeTimeLogic.FxLogic;
using Common.Utility.CombatEvent;
using Excel2Json;
using Fort23.Common;
using Fort23.UTool;
using GameLogic.Combat.CombatTool;
using GameLogic.Combat.Hero;
using GameLogic.CombatScenesTool;
using UnityEngine;
using Utility;
using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface;
using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventLogic;
namespace GameLogic.Combat.Skill
{
public abstract class SkillBasic : IDisposable, ITimeLineTriggerEntity, ITimeLineEndSing, ITimeLineTargetEntity,
ITimeLineTriggerEvent, ITimeLineAlertTargetEnter
{
public int skillGuid;
public int UseCount;
///
/// 普攻是否是近战
///
public bool isMelee;
///
/// 是否被激活
///
public bool isActive = true;
///
/// 是否使用中
///
private bool isUse;
public CombatHeroEntity CombatHeroEntity
{
get { return _combatHeroEntity; }
}
///
/// 当前激活技能的TimeLine数据
///
protected List currUseAllTimeLineLogic = new List();
private CombatHeroEntity _combatHeroEntity;
private Map>
_triggerCallBack =
new Map>();
public SkillConfig SelfSkillConfig;
///
/// 武器专属机技能配置
///
public SkillConfig WeaponSkillConfig;
///
/// 释放技能的时候当前焦点的目标
///
public CombatHeroEntity currFocusTarget;
///
/// 激活的timelinegoup名字
///
public string ActiveTimeLineGroupName;
private System.Action finishCallBack;
///
/// 完成时 是否是要完成的timeGroupName
///
protected string _finishTimeLineGroupName;
protected BetterList _enterAlertTarget = new BetterList();
protected BetterList _currUseSkillTarget = new BetterList();
protected bool _isEarlyWarning;
///
/// 是否使用技能目标里的缓存池子
///
protected bool _useSkillTargetPool = true;
public TriggerData triggerData
{
get
{
_triggerData.Source = this;
return _triggerData;
}
}
private TriggerData _triggerData;
///
/// 技能cd
///
public float SkillCd
{
get { return _skillCd; }
set { _skillCd = value; }
}
private float _skillCd;
public float SkillMaxCd;
// protected HarmType _harmType;
private CombatParticleSystemPool _earlyWarningFx;
private CombatHeroEntity _earlyWarningFristHero;
public T This()
{
return (T)(object)this;
}
public void InitSkill(CombatHeroEntity combatHeroEntity)
{
_combatHeroEntity = combatHeroEntity;
ProInitSkill();
}
public virtual void ActiveLimitSkill()
{
isActive = true;
}
///
/// 开始游戏
///
public void StartGame()
{
// InitSpecialWeapon();
if (SelfSkillConfig.SkillType == 4 || SelfSkillConfig.SkillType == 5)
{
UseSkill();
}
ProStartGame();
}
public void InitSkillConfig(SkillConfig skillConfig)
{
SkillMaxCd = 1;
_skillCd = SkillMaxCd;
SelfSkillConfig = skillConfig;
UseCount = skillConfig.SkillType * 100000;
skillGuid = skillConfig.ID;
// LogTool.Log("初始化技能"+skillConfig.scriptName);
}
///
/// 设置激活的TimeLine名字
///
public void SetActiveTimeLineGroupName(string groupName)
{
ActiveTimeLineGroupName = groupName;
}
public virtual bool IsCanUse()
{
return true;
}
private bool IsWeaponIsSpecial
{
get { return WeaponSkillConfig.ID > 0; }
}
protected virtual void EarlyWarning()
{
}
public HarmReturnInfo Harm(CombatHeroEntity source, CombatHeroHitPoint target, long att, AttType attType,
TriggerData triggerData, HarmType harmType = HarmType.Null)
{
return CombatCalculateTool.Instance.Harm(source, target, att, attType, triggerData,
harmType);
}
// public HarmReturnInfo Recover(CombatHeroEntity source, CombatHeroHitPoint target, long att,
// AttType attType, HarmType harmType)
// {
// return CombatCalculateTool.Instance.Recover(source, target, att, attType, harmType, triggerData);
// }
public void SetSkillFinishCallBack(System.Action finishCallBack)
{
this.finishCallBack = finishCallBack;
}
///
/// 开始使用技能
///
public void UseSkill()
{
_enterAlertTarget.Clear();
UseCount++;
_triggerData = new TriggerData();
isUse = true;
_triggerData.TriggerGuid = UseCount;
_currUseSkillTarget.Clear();
currUseAllTimeLineLogic.Clear();
// CombatEventManager.Instance.Dispatch(CombatEventType.HeroUseSkill, new HeroUseSkillEventData()
// {
// CombatHeroEntity = CombatHeroEntity,
// SkillBasic = this
// });
ProUseSkill();
}
public void Dispose()
{
currUseAllTimeLineLogic.Clear();
ProDispose();
_combatHeroEntity = null;
}
public void ReduceCd(float time)
{
if (!isActive || !IsCanReduceCd())
{
return;
}
_skillCd -= time;
}
protected virtual bool IsCanReduceCd()
{
return true;
}
public SpecialDotInfo GetSpecialDotInfo(string specialDotName)
{
return _combatHeroEntity.GetSpecialDotInfo(specialDotName);
}
public T GetILifetCycleHitPoint(string hitPoinName, bool isStandType, bool isIgnoreHind)
where T : ILifetCycleHitPoint
{
return _combatHeroEntity.GetILifetCycleHitPoint(hitPoinName, isStandType, isIgnoreHind);
}
public T GetMainHotPoin(bool isIgnoreHind) where T : ILifetCycleHitPoint
{
throw new NotImplementedException();
}
public void CloseLoopFx(IGObjectPoolInterface objectPoolInterface)
{
}
///
/// 添加trigger监听事件
///
///
///
protected void AddTriggerCallBack(string groupName,
System.Action callBack)
{
if (!_triggerCallBack.ContainsKey(groupName))
{
_triggerCallBack.Add(groupName, callBack);
}
}
///
/// 移除trigger添加事件
///
///
///
protected void RemoveTriggerCallBack(string groupName,
System.Action callBack)
{
if (_triggerCallBack.ContainsKey(groupName))
{
_triggerCallBack.Remove(groupName);
}
}
///
/// 激活timeLine数据
///
/// 组
/// 传递给timeLine的目标
/// 透传消息
/// 自定义坐标
/// timeLine完成回调
public TimeLineEventLogicGroupBasic ActivationTimeLineData(string groupName,
BetterList currTarget = null,
Vector3[] customizePos = null, System.Action finishCallBack = null, float startTime = default,
object extraData = null)
{
bool isNoAnim = false;
if (groupName.Contains("noAnim"))
{
groupName = groupName.Replace("noAnim", "");
isNoAnim = true;
}
TimeLineEventLogicGroupBasic timeLineEventLogicGroup =
_combatHeroEntity.combatHeroTimeLineControl.TimeLineData
.GetTimeLineEventLogicGroup(groupName, null);
try
{
timeLineEventLogicGroup.extraData = extraData;
timeLineEventLogicGroup.SetCombatInfo(_combatHeroEntity, this, currTarget, triggerData, customizePos);
timeLineEventLogicGroup.TimeLineUpdateEnd = finishCallBack;
timeLineEventLogicGroup.timeLineTime = startTime;
_combatHeroEntity.combatHeroTimeLineControl.AddEventLogicGroup(timeLineEventLogicGroup);
currUseAllTimeLineLogic.Add(timeLineEventLogicGroup);
}
catch (Exception e)
{
LogTool.Error(e);
}
return timeLineEventLogicGroup;
}
///
/// 打断技能
///
public void BreakSkill()
{
// CombatEventManager.Instance.Dispatch(CombatEventType.BreakSkill, new CombatEventDefaultData()
// {
// datas = new object[2] { _combatHeroEntity, this }
// });
for (int i = 0; i < currUseAllTimeLineLogic.Count; i++)
{
currUseAllTimeLineLogic[i].BreakTimeLine();
}
currUseAllTimeLineLogic.Clear();
SkillPlayFinish();
ProBreakSkill();
}
///
/// 技能timeLine的完成标志。表示当前TimeLine播放完成
///
/// 那一个组的完成了
public void TimeLineEndSing(string groupName)
{
ProTimeLineEndSing(groupName);
}
///
/// 技能更新
///
///
public void CombatUpdate(float time)
{
ProCombatUpdate(time);
}
///
/// 技能播放完成
///
public void SkillPlayFinish()
{
if (!isUse)
{
return;
}
isUse = false;
// CombatEventManager.Instance.Dispatch(CombatEventType.SkillFinish, new HeroUseSkillEventData()
// {
// CombatHeroEntity = CombatHeroEntity,
// SkillBasic = this
// });
ProSkillPlayFinish();
finishCallBack?.Invoke();
finishCallBack = null;
_isEarlyWarning = false;
_earlyWarningFristHero = null;
if (_earlyWarningFx != null)
{
GObjectPool.Instance.Recycle(_earlyWarningFx);
_earlyWarningFx = null;
}
}
///
/// timeLine和子弹碰撞后会调用
///
/// 触发类型,默认没用
/// 时间线上配置的数据(默认null)
/// 目标对象(敌人)
/// 触发的额外数据——透传数据
public void TimeLineTrigger(string groupName, ILifetCycleHitPoint targetEntity,
ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
{
if (targetEntity == null)
{
return;
}
if (_triggerCallBack.ContainsKey(groupName))
{
_triggerCallBack[groupName]?.Invoke(groupName,
targetEntity != null ? targetEntity.This() : null, timelineFxLogic,
triggerData);
}
else
{
ProDefaultTimeLineTrigger(groupName,
targetEntity != null ? targetEntity.This() : null, timelineFxLogic,
triggerData);
}
}
public ILifetCycleHitPoint[] GetTineLineTargetEntity(TimeLineEventLogicBasic timeLineEventLogicBasic)
{
// BetterList point = CombatListPool.Instance.Get();
if (_useSkillTargetPool)
{
if (_currUseSkillTarget != null && _currUseSkillTarget.Count > 0)
{
return _currUseSkillTarget.ToArray();
}
}
_currUseSkillTarget.Clear();
ILifetCycleHitPoint[] allHit = ProGetTineLineTargetEntity(timeLineEventLogicBasic);
_currUseSkillTarget.AddRange(allHit);
return _currUseSkillTarget.ToArray();
}
public ILifetCycleHitPoint[] FilterTarget(TimeLineEventLogicBasic timeLineEventLogicBasic,
FXTargetType fixtarget, ILifetCycleHitPoint[] target)
{
if ((int)fixtarget == 1)
{
return target;
}
// BetterList point = CombatListPool.Instance.Get();
// bool myEnemy = _combatHeroEntity.CombatHeroDataComponent.CurrCombatHeroInfo.IsEnemy;
// for (int i = 0; i < target.Count; i++)
// {
// bool targetEnemy = target[i].This().CombatHeroEntity.CombatHeroDataComponent
// .CurrCombatHeroInfo.IsEnemy;
// if (fixtarget.HasFlag(FXTargetType.Enemy) && targetEnemy != myEnemy)
// {
// point.Add(target[i]);
// }
//
// if (fixtarget.HasFlag(FXTargetType.Teammate) && targetEnemy == myEnemy)
// {
// point.Add(target[i]);
// }
//
// if (fixtarget.HasFlag(FXTargetType.Oneself) &&
// target[i].This().CombatHeroEntity == _combatHeroEntity)
// {
// point.Add(target[i]);
// }
// }
return target;
}
public ILifetCycleHitPoint[] FilterTargetForCombat(TimeLineEventLogicBasic timeLineEventLogicBasic,
FXTargetType fixtarget,
ILifetCycleHitPoint[] target)
{
return target;
}
protected abstract void ProInitSkill();
protected abstract void ProUseSkill();
protected virtual ILifetCycleHitPoint[] ProGetTineLineTargetEntity(
TimeLineEventLogicBasic timeLineEventLogicBasic)
{
return null;
}
///
/// 默认的触发器
///
///
///
///
///
///
protected virtual void ProDefaultTimeLineTrigger(string groupName, CombatHeroHitPoint targetEntity,
ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
{
}
protected virtual void ProSkillPlayFinish()
{
}
protected virtual void ProDispose()
{
}
///
///
///
///
protected virtual void ProTimeLineEndSing(string groupName)
{
if (string.IsNullOrEmpty(_finishTimeLineGroupName))
{
SkillPlayFinish();
}
else if (_finishTimeLineGroupName == groupName)
{
SkillPlayFinish();
}
}
protected virtual void ProCombatUpdate(float time)
{
}
///
/// 技能被打断
///
protected virtual void ProBreakSkill()
{
}
protected virtual void ProStartGame()
{
}
public void TimelineFxLogicInit(string groupName, ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
{
ProTimelineFxLogicInit(groupName, timelineFxLogic, triggerData);
}
///
/// 实例化出的特效逻辑初始化
///
///
///
protected virtual void ProTimelineFxLogicInit(string groupName, ITimelineFxLogic timelineFxLogic,
TriggerData triggerData)
{
}
public void TimeLineTriggerGround(string groupName, ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
{
ProTimeLineTriggerGround(groupName, timelineFxLogic, triggerData);
}
///
/// 触碰地面
///
///
///
protected virtual void ProTimeLineTriggerGround(string groupName, ITimelineFxLogic timelineFxLogic,
TriggerData triggerData)
{
}
public void InitAlert(TimeLineAlertSeriailztion timeLineAlertSeriailztion,GameObject gameObject)
{
CombatAlertManager.Instance.AddAlert(gameObject, _combatHeroEntity);
}
public void LeaveAlert(TimeLineAlertSeriailztion timeLineAlertSeriailztion,GameObject gameObject)
{
CombatAlertManager.Instance.RemoveAlert(gameObject);
}
public void Enter(TimeLineAlertSeriailztion timeLineAlertSeriailztion, Collider collider,GameObject gameObject)
{
HeroEntityMono heroEntityMono = collider.gameObject.GetComponent();
if (heroEntityMono == null)
{
return;
}
CombatHeroEntity target = heroEntityMono.combatHeroEntity;
if ( timeLineAlertSeriailztion.isFindEnemy&& target.IsEnemy==_combatHeroEntity.IsEnemy ||
timeLineAlertSeriailztion.isFindMyHero&& target.IsEnemy!=_combatHeroEntity.IsEnemy )
{
return;
}
if (_enterAlertTarget.Contains(target))
{
return;
}
_enterAlertTarget.Add(target);
if (timeLineAlertSeriailztion.alertType == TimeLineAlertSeriailztion.TimeLineAlertType.Dangerous)
{
AlertTriggerEventData alertTriggerEventData = AlertTriggerEventData.Create();
alertTriggerEventData.combatHeroEntity = target;
alertTriggerEventData.attackEntity = _combatHeroEntity;
alertTriggerEventData.collider = collider;
alertTriggerEventData.triggerObject= gameObject;
alertTriggerEventData.isTrigger = true;
CombatEventManager.Instance.Dispatch(CombatEventType.AlertTrigger, alertTriggerEventData);
}
}
public void Leave(TimeLineAlertSeriailztion timeLineAlertSeriailztion, Collider collider,GameObject gameObject)
{
HeroEntityMono heroEntityMono = collider.gameObject.GetComponent();
if (heroEntityMono == null)
{
return;
}
CombatHeroEntity target = heroEntityMono.combatHeroEntity;
if (target.IsEnemy == CombatHeroEntity.IsEnemy)
{
return;
}
if (!_enterAlertTarget.Contains(target))
{
return;
}
_enterAlertTarget.Remove(target);
if (timeLineAlertSeriailztion.alertType == TimeLineAlertSeriailztion.TimeLineAlertType.Dangerous)
{
AlertTriggerEventData alertTriggerEventData = AlertTriggerEventData.Create();
alertTriggerEventData.combatHeroEntity = target;
alertTriggerEventData.attackEntity = _combatHeroEntity;
alertTriggerEventData.collider = collider;
alertTriggerEventData.isTrigger = false;
alertTriggerEventData.triggerObject= gameObject;
CombatEventManager.Instance.Dispatch(CombatEventType.AlertTrigger, alertTriggerEventData);
}
}
}
}