| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699 | 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;        /// <summary>        /// 普攻是否是近战        /// </summary>        public bool isMelee;        /// <summary>        /// 是否被激活        /// </summary>        public bool isActive = true;        /// <summary>        /// 是否使用中        /// </summary>        private bool isUse;        public CombatHeroEntity CombatHeroEntity        {            get { return _combatHeroEntity; }        }        /// <summary>        /// 当前激活技能的TimeLine数据        /// </summary>        protected List<TimeLineEventLogicGroupBasic> currUseAllTimeLineLogic = new List<TimeLineEventLogicGroupBasic>();        private CombatHeroEntity _combatHeroEntity;        private Map<string, System.Action<string, CombatHeroHitPoint, ITimelineFxLogic, TriggerData>>            _triggerCallBack =                new Map<string, Action<string, CombatHeroHitPoint, ITimelineFxLogic, TriggerData>>();        public SkillConfig SelfSkillConfig;        /// <summary>        /// 武器专属机技能配置        /// </summary>        public SkillConfig WeaponSkillConfig;        /// <summary>        /// 释放技能的时候当前焦点的目标        /// </summary>        public CombatHeroEntity currFocusTarget;        /// <summary>        /// 激活的timelinegoup名字        /// </summary>        public string ActiveTimeLineGroupName;        private System.Action finishCallBack;        /// <summary>        /// 完成时 是否是要完成的timeGroupName        /// </summary>        protected string _finishTimeLineGroupName;        protected BetterList<CombatHeroEntity> _enterAlertTarget = new BetterList<CombatHeroEntity>();        protected BetterList<ILifetCycleHitPoint> _currUseSkillTarget = new BetterList<ILifetCycleHitPoint>();        protected bool _isEarlyWarning;        /// <summary>        /// 是否使用技能目标里的缓存池子        /// </summary>        protected bool _useSkillTargetPool = true;        public TriggerData triggerData        {            get            {                _triggerData.Source = this;                return _triggerData;            }        }        private TriggerData _triggerData;        /// <summary>        /// 技能cd        /// </summary>        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<T>()        {            return (T)(object)this;        }        public void InitSkill(CombatHeroEntity combatHeroEntity)        {            _combatHeroEntity = combatHeroEntity;            ProInitSkill();        }        public virtual void ActiveLimitSkill()        {            isActive = true;        }        /// <summary>        /// 开始游戏        /// </summary>        public void StartGame()        {            //  InitSpecialWeapon();            if (SelfSkillConfig.SkillType == 4 || SelfSkillConfig.SkillType == 5)            {                UseSkill();            }            ProStartGame();        }        public void InitSkillConfig(SkillConfig skillConfig)        {            SkillMaxCd = skillConfig.cd;            _skillCd = SkillMaxCd;            SelfSkillConfig = skillConfig;            UseCount = skillConfig.SkillType * 100000;            skillGuid = skillConfig.ID;            // LogTool.Log("初始化技能"+skillConfig.scriptName);        }        /// <summary>        /// 设置激活的TimeLine名字        /// </summary>        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)        {            if (target == null || target.combatHeroEntity == null)            {                return  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;        }        /// <summary>        /// 开始使用技能        /// </summary>        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<T>(string hitPoinName, bool isStandType, bool isIgnoreHind)            where T : ILifetCycleHitPoint        {            return _combatHeroEntity.GetILifetCycleHitPoint<T>(hitPoinName, isStandType, isIgnoreHind);        }        public T GetMainHotPoin<T>(bool isIgnoreHind) where T : ILifetCycleHitPoint        {            throw new NotImplementedException();        }        public void CloseLoopFx(IGObjectPoolInterface objectPoolInterface)        {        }        /// <summary>        /// 添加trigger监听事件        /// </summary>        /// <param name="groupName"></param>        /// <param name="callBack"></param>        protected void AddTriggerCallBack(string groupName,            System.Action<string, CombatHeroHitPoint, ITimelineFxLogic, TriggerData> callBack)        {            if (!_triggerCallBack.ContainsKey(groupName))            {                _triggerCallBack.Add(groupName, callBack);            }        }        /// <summary>        /// 移除trigger添加事件        /// </summary>        /// <param name="groupName"></param>        /// <param name="callBack"></param>        protected void RemoveTriggerCallBack(string groupName,            System.Action<string, TimeLineTriggerType, object, ITimelineFxLogic, object> callBack)        {            if (_triggerCallBack.ContainsKey(groupName))            {                _triggerCallBack.Remove(groupName);            }        }        /// <summary>        /// 激活timeLine数据        /// </summary>        /// <param name="groupName">组</param>        /// <param name="currTarget">传递给timeLine的目标</param>        /// <param name="extraData">透传消息</param>        /// <param name="customizePos">自定义坐标</param>        /// <param name="finishCallBack">timeLine完成回调</param>        public TimeLineEventLogicGroupBasic ActivationTimeLineData(string groupName,            BetterList<ILifetCycleHitPoint> 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<TimeLineEventLogicGroupBasic>(groupName, null);            try            {                if (timeLineEventLogicGroup != null)                {                                        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;        }        /// <summary>        /// 打断技能        /// </summary>        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();                _combatHeroEntity.combatHeroTimeLineControl.RemoveEventLogicGroup(currUseAllTimeLineLogic[i]);            }            currUseAllTimeLineLogic.Clear();            SkillPlayFinish();            ProBreakSkill();        }        /// <summary>        /// 技能timeLine的完成标志。表示当前TimeLine播放完成        /// </summary>        /// <param name="groupName">那一个组的完成了</param>        public void TimeLineEndSing(string groupName)        {            ProTimeLineEndSing(groupName);        }        /// <summary>        /// 技能更新        /// </summary>        /// <param name="time"></param>        public void CombatUpdate(float time)        {            ProCombatUpdate(time);        }        /// <summary>        /// 技能播放完成        /// </summary>        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;            }        }        /// <summary>        /// timeLine和子弹碰撞后会调用        /// </summary>        /// <param name="timeLineTriggerType">触发类型,默认没用</param>        /// <param name="timeLineData">时间线上配置的数据(默认null)</param>        /// <param name="targetEntity">目标对象(敌人)</param>        /// <param name="triggerData">触发的额外数据——透传数据</param>        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<CombatHeroHitPoint>() : null, timelineFxLogic,                    triggerData);            }            else            {                ProDefaultTimeLineTrigger(groupName,                    targetEntity != null ? targetEntity.This<CombatHeroHitPoint>() : null, timelineFxLogic,                    triggerData);            }        }        public ILifetCycleHitPoint[] GetTineLineTargetEntity(TimeLineEventLogicBasic timeLineEventLogicBasic)        {            // BetterList<ILifetCycleHitPoint> point = CombatListPool<ILifetCycleHitPoint>.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<ILifetCycleHitPoint> point = CombatListPool<ILifetCycleHitPoint>.Instance.Get();            // bool myEnemy = _combatHeroEntity.CombatHeroDataComponent.CurrCombatHeroInfo.IsEnemy;            // for (int i = 0; i < target.Count; i++)            // {            //     bool targetEnemy = target[i].This<CombatHeroEntityHitPoint>().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<CombatHeroEntityHitPoint>().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)        {            if (CombatHeroEntity.CombatAIBasic.currFocusTarget is BannerHero)            {                return null;            }            return new[] {  CombatHeroEntity.CombatAIBasic.currFocusTarget.GetThis<CombatHeroEntity>()                .GetMainHotPoin<ILifetCycleHitPoint>() };        }        /// <summary>        /// 默认的触发器        /// </summary>        /// <param name="groupName"></param>        /// <param name="timeLineTriggerType"></param>        /// <param name="timeLineData"></param>        /// <param name="targetEntity"></param>        /// <param name="triggerData"></param>        protected virtual void ProDefaultTimeLineTrigger(string groupName, CombatHeroHitPoint targetEntity,            ITimelineFxLogic timelineFxLogic, TriggerData triggerData)        {        }        protected virtual void ProSkillPlayFinish()        {        }        protected virtual void ProDispose()        {        }        /// <summary>        ///         /// </summary>        /// <param name="groupName"></param>        protected virtual void ProTimeLineEndSing(string groupName)        {            if (string.IsNullOrEmpty(_finishTimeLineGroupName))            {                SkillPlayFinish();            }            else if (_finishTimeLineGroupName == groupName)            {                SkillPlayFinish();            }        }        protected virtual void ProCombatUpdate(float time)        {        }        /// <summary>        /// 技能被打断        /// </summary>        protected virtual void ProBreakSkill()        {        }        protected virtual void ProStartGame()        {        }        public void TimelineFxLogicInit(string groupName, ITimelineFxLogic timelineFxLogic, TriggerData triggerData)        {            ProTimelineFxLogicInit(groupName, timelineFxLogic, triggerData);        }        /// <summary>        /// 实例化出的特效逻辑初始化        /// </summary>        /// <param name="groupName"></param>        /// <param name="timelineFxLogic"></param>        protected virtual void ProTimelineFxLogicInit(string groupName, ITimelineFxLogic timelineFxLogic,            TriggerData triggerData)        {        }        public void TimeLineTriggerGround(string groupName, ITimelineFxLogic timelineFxLogic, TriggerData triggerData)        {            ProTimeLineTriggerGround(groupName, timelineFxLogic, triggerData);        }        /// <summary>        /// 触碰地面        /// </summary>        /// <param name="groupName"></param>        /// <param name="timelineFxLogic"></param>        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<HeroEntityMono>();            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<HeroEntityMono>();            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 )        {        }    }}
 |