using System; using System.Collections.Generic; using CombatCore.SerializationTimeLine; using CombatLibrary.CombatLibrary.CombatCore; using CombatLibrary.CombatLibrary.CombatCore.CustomizeTimeLogic.FxLogic; using Common.Combat.FxAILogic; using Common.Utility.CombatEvent; using Excel2Json; using Fort23.Common; using Fort23.Core; using Fort23.UTool; using GameLogic.Combat.CombatTool; using GameLogic.Combat.Hero; using GameLogic.Combat.Skill.IntensifierEffect; using GameLogic.CombatScenesTool; using GameLogic.Hero; using GameLogic.Player; using UnityEngine; using Utility; using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface; using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventLogic; using Random = UnityEngine.Random; namespace GameLogic.Combat.Skill { public abstract class SkillBasic : CObject, ITimeLineTriggerEntity, ITimeLineEndSing, ITimeLineTargetEntity, ITimeLineTriggerEvent, ITimeLineAlertTargetEnter { public int skillGuid; public int UseCount; /// /// 是否被激活 /// public bool isActive = true; /// /// 是否使用中 /// private bool isUse; public CombatHeroEntity CombatHeroEntity { get { return _combatHeroEntity; } } /// /// 转盘中的下表 /// public int index; private bool _isDis; // public float angle = 180; // public float useAngle; // public float lasetAngle = 360; public int useCount; /// /// 当前激活技能的TimeLine数据 /// protected List currUseAllTimeLineLogic = new List(); private CombatHeroEntity _combatHeroEntity; private Map> _triggerCallBack = new Map>(); public SkillConfig SelfSkillConfig; // public SkillIntensifierData SkillIntensifierData; /// /// 释放技能的时候当前焦点的目标 /// public CombatHeroEntity currFocusTarget; private SkillFeaturesData SkillFeaturesData; /// /// 激活的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 WuXingType wuXingType; 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; private CombatParticleSystemPool _earlyWarningFx; private CombatHeroEntity _earlyWarningFristHero; public T This() { return (T)(object)this; } // public void public void IntensifyingEffect(float bl) { if (SelfSkillConfig.intensifierIndex == null) { return; } float[] effectValue = SelfSkillConfig.effectValue; float[] newEffectValue = new float[effectValue.Length]; for (int i = 0; i < SelfSkillConfig.intensifierIndex.Length; i++) { int index = SelfSkillConfig.intensifierIndex[i]; if (index >= effectValue.Length) { continue; } newEffectValue[index] = effectValue[index] * (1 + (bl * 0.01f)); } SelfSkillConfig.effectValue = newEffectValue; } public SkillFeaturesData GetSkillFeaturesData() { SkillFeaturesData skillFeaturesData = SkillFeaturesData.CapyFeaturesData(); skillFeaturesData.hp = (long)(skillFeaturesData.hp * CombatHeroEntity.CurrCombatHeroInfo.GetWuXingShuXing(wuXingType)); skillFeaturesData.maxHp = skillFeaturesData.hp; return skillFeaturesData; } public override void ActiveObj() { } /// /// 激活技能,准备使用技能 /// public void ActiveSkill() { ProActiveSkill(); } protected virtual void ProActiveSkill() { } public void Replace() { ProReplace(); } protected virtual void ProReplace() { } /// /// 轮询的初始化 /// public void PollingInit(BetterList skillQueue) { ProPollingnInit(skillQueue); } protected virtual void ProPollingnInit(BetterList skillQueue) { } /// /// 休眠 /// public override void DormancyObj() { Dispose(); _enterAlertTarget.Clear(); _currUseSkillTarget.Clear(); _triggerCallBack.Clear(); _earlyWarningFx = null; _earlyWarningFristHero = null; _finishTimeLineGroupName = null; _earlyWarningFx = null; _isEarlyWarning = false; _triggerData = new TriggerData(); _useSkillTargetPool = true; isUse = false; _combatHeroEntity = null; SkillMaxCd = 0; currUseAllTimeLineLogic.Clear(); finishCallBack = null; _isDis = false; } public virtual void ActiveLimitSkill() { isActive = true; } /// /// 开始游戏 /// public void StartGame() { // InitSpecialWeapon(); if (SelfSkillConfig.SkillType == 4 || SelfSkillConfig.SkillType == 5) { UseSkill(); } ProStartGame(); } public void InitSkillConfig(CombatHeroEntity combatHeroEntity, SkillInfo skillInfo) { _combatHeroEntity = combatHeroEntity; SelfSkillConfig = skillInfo.skillConfig; SkillMaxCd = SelfSkillConfig.cd; _skillCd = SkillMaxCd; wuXingType = (WuXingType)SelfSkillConfig.attribute; SkillFeaturesData = new SkillFeaturesData(); SkillFeaturesData.isEnemy = combatHeroEntity.IsEnemy; SkillFeaturesData.WuXingType = wuXingType; SkillFeaturesData.hp = skillInfo.qiangDu; UseCount = SelfSkillConfig.SkillType * 100000; skillGuid = SelfSkillConfig.ID; // if (SkillIntensifierData == null) // { // SkillIntensifierData = new SkillIntensifierData(); // } ProInitSkillConfig(); ProInitSkill(); // LogTool.Log("初始化技能"+skillConfig.scriptName); } protected virtual void ProInitSkillConfig() { } /// /// 设置激活的TimeLine名字 /// public void SetActiveTimeLineGroupName(string groupName) { ActiveTimeLineGroupName = groupName; } public virtual bool IsCanUse() { return true; } public HarmReturnInfo Harm(CombatHeroEntity source, CombatHeroHitPoint target, long att, AttType attType, TriggerData triggerData, HarmType harmType = HarmType.Null) { if (target == null || target.combatHeroEntity == null) { return null; } return CombatCalculateTool.Instance.Harm(source, target, att, attType, triggerData, wuXingType, 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() { // BetterList currIntensifierEffectBasicList = // SkillIntensifierData.currIntensifierEffectBasicList; // for (int i = 0; i < currIntensifierEffectBasicList.Count; i++) // { // currIntensifierEffectBasicList[i].IntensifierSkillUseBefore(this); // } SkillCd = SkillMaxCd; _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 override void Dispose() { if (_isDis) { return; } _isDis = true; 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, string timeLineName = null, BetterList currTarget = null, Vector3[] customizePos = null, System.Action finishCallBack = null, float startTime = default, object extraData = null, int indexCount = 0) { bool isNoAnim = false; if (groupName.Contains("noAnim")) { groupName = groupName.Replace("noAnim", ""); isNoAnim = true; } TimeLineEventLogicGroupBasic timeLineEventLogicGroup = _combatHeroEntity.combatHeroTimeLineControl .GetTimeLineEventLogicGroup(timeLineName, groupName); try { if (timeLineEventLogicGroup != null) { timeLineEventLogicGroup.extraData = extraData; timeLineEventLogicGroup.SetCombatInfo(_combatHeroEntity, this, currTarget, triggerData, customizePos, indexCount); 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++) { if (currUseAllTimeLineLogic[i] != null && currUseAllTimeLineLogic[i].CastEntity != CombatHeroEntity) { LogTool.Log("对象以移交"); } else { currUseAllTimeLineLogic[i].BreakTimeLine(CombatHeroEntity); _combatHeroEntity.combatHeroTimeLineControl.RemoveEventLogicGroup(currUseAllTimeLineLogic[i]); } } 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; finishCallBack?.Invoke(this); ProSkillPlayFinish(); finishCallBack = null; _isEarlyWarning = false; _earlyWarningFristHero = null; if (_earlyWarningFx != null) { GObjectPool.Instance.Recycle(_earlyWarningFx); _earlyWarningFx = null; } // BetterList currIntensifierEffectBasicList = // SkillIntensifierData.currIntensifierEffectBasicList; // for (int i = 0; i < currIntensifierEffectBasicList.Count; i++) // { // currIntensifierEffectBasicList[i].IntensifierSkillTimelineFxLogicUseFinish(this); // } } /// /// timeLine和子弹碰撞后会调用 /// /// 触发类型,默认没用 /// 时间线上配置的数据(默认null) /// 目标对象(敌人) /// 触发的额外数据——透传数据 public void TimeLineTrigger(string groupName, ILifetCycleHitPoint targetEntity, ITimelineFxLogic timelineFxLogic, TriggerData triggerData) { if (targetEntity == null || _isDis) { 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 virtual void ProInitSkill() { } protected abstract void ProUseSkill(); protected virtual ILifetCycleHitPoint[] ProGetTineLineTargetEntity( TimeLineEventLogicBasic timeLineEventLogicBasic) { if (CombatHeroEntity.CombatAIBasic.currFocusTarget == null) { return null; } if (CombatHeroEntity.CombatAIBasic.currFocusTarget is BannerHero) { return null; } ILifetCycleHitPoint lifetCycleHitPoint = CombatHeroEntity.CombatAIBasic.currFocusTarget .GetThis() .GetMainHotPoin(); if (lifetCycleHitPoint == null) { return null; } return new[] { lifetCycleHitPoint }; } /// /// 默认的触发器 /// /// /// /// /// /// 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); TimelineFxLogicInitEventData eventData = TimelineFxLogicInitEventData.Create(); eventData.SkillBasic = this; eventData.timelineFxLogic = timelineFxLogic as FxAILogicBasic; CombatEventManager.Instance.Dispatch(CombatEventType.TimelineFxLogicInit, eventData); } /// /// 实例化出的特效逻辑初始化 /// /// /// 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) { _enterAlertTarget.Clear(); 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); } ProHeroEnter(timeLineAlertSeriailztion, target); } protected virtual void ProHeroEnter(TimeLineAlertSeriailztion timeLineAlertSeriailztion, CombatHeroEntity target) { } public void Leave(TimeLineAlertSeriailztion timeLineAlertSeriailztion, Collider collider, GameObject gameObject) { HeroEntityMono heroEntityMono = collider.gameObject.GetComponent(); if (heroEntityMono == null || CombatHeroEntity == 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); } ProHeroLeave(timeLineAlertSeriailztion, target); } protected virtual void ProHeroLeave(TimeLineAlertSeriailztion timeLineAlertSeriailztion, CombatHeroEntity target) { } } }