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); } } } }