SkillBasic.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807
  1. using System;
  2. using System.Collections.Generic;
  3. using CombatCore.SerializationTimeLine;
  4. using CombatLibrary.CombatLibrary.CombatCore;
  5. using CombatLibrary.CombatLibrary.CombatCore.CustomizeTimeLogic.FxLogic;
  6. using Common.Utility.CombatEvent;
  7. using Excel2Json;
  8. using Fort23.Common;
  9. using Fort23.Core;
  10. using Fort23.UTool;
  11. using GameLogic.Combat.CombatTool;
  12. using GameLogic.Combat.Hero;
  13. using GameLogic.Combat.Skill.IntensifierEffect;
  14. using GameLogic.CombatScenesTool;
  15. using UnityEngine;
  16. using Utility;
  17. using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface;
  18. using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventLogic;
  19. namespace GameLogic.Combat.Skill
  20. {
  21. public abstract class SkillBasic : CObject, ITimeLineTriggerEntity, ITimeLineEndSing, ITimeLineTargetEntity,
  22. ITimeLineTriggerEvent, ITimeLineAlertTargetEnter
  23. {
  24. public int skillGuid;
  25. public int UseCount;
  26. /// <summary>
  27. /// 是否被激活
  28. /// </summary>
  29. public bool isActive = true;
  30. /// <summary>
  31. /// 是否使用中
  32. /// </summary>
  33. private bool isUse;
  34. public CombatHeroEntity CombatHeroEntity
  35. {
  36. get { return _combatHeroEntity; }
  37. }
  38. private bool _isDis;
  39. /// <summary>
  40. /// 当前激活技能的TimeLine数据
  41. /// </summary>
  42. protected List<TimeLineEventLogicGroupBasic> currUseAllTimeLineLogic = new List<TimeLineEventLogicGroupBasic>();
  43. private CombatHeroEntity _combatHeroEntity;
  44. private Map<string, System.Action<string, CombatHeroHitPoint, ITimelineFxLogic, TriggerData>>
  45. _triggerCallBack =
  46. new Map<string, Action<string, CombatHeroHitPoint, ITimelineFxLogic, TriggerData>>();
  47. public SkillConfig SelfSkillConfig;
  48. public SkillIntensifierData SkillIntensifierData;
  49. /// <summary>
  50. /// 释放技能的时候当前焦点的目标
  51. /// </summary>
  52. public CombatHeroEntity currFocusTarget;
  53. private SkillFeaturesData SkillFeaturesData;
  54. /// <summary>
  55. /// 激活的timelinegoup名字
  56. /// </summary>
  57. public string ActiveTimeLineGroupName;
  58. private System.Action<SkillBasic> finishCallBack;
  59. /// <summary>
  60. /// 完成时 是否是要完成的timeGroupName
  61. /// </summary>
  62. protected string _finishTimeLineGroupName;
  63. protected BetterList<CombatHeroEntity> _enterAlertTarget = new BetterList<CombatHeroEntity>();
  64. protected BetterList<ILifetCycleHitPoint> _currUseSkillTarget = new BetterList<ILifetCycleHitPoint>();
  65. protected bool _isEarlyWarning;
  66. /// <summary>
  67. /// 是否使用技能目标里的缓存池子
  68. /// </summary>
  69. protected bool _useSkillTargetPool = true;
  70. public TriggerData triggerData
  71. {
  72. get
  73. {
  74. _triggerData.Source = this;
  75. return _triggerData;
  76. }
  77. }
  78. private TriggerData _triggerData;
  79. /// <summary>
  80. /// 技能cd
  81. /// </summary>
  82. public float SkillCd
  83. {
  84. get { return _skillCd; }
  85. set { _skillCd = value; }
  86. }
  87. private float _skillCd;
  88. public float SkillMaxCd;
  89. private CombatParticleSystemPool _earlyWarningFx;
  90. private CombatHeroEntity _earlyWarningFristHero;
  91. public T This<T>()
  92. {
  93. return (T)(object)this;
  94. }
  95. public void InitSkill(CombatHeroEntity combatHeroEntity)
  96. {
  97. SkillFeaturesData = new SkillFeaturesData();
  98. SkillFeaturesData.SkillFeaturesType = SkillFeaturesType.Earth;
  99. SkillFeaturesData.hp = 100;
  100. _combatHeroEntity = combatHeroEntity;
  101. ProInitSkill();
  102. }
  103. public SkillFeaturesData GetSkillFeaturesData()
  104. {
  105. return SkillFeaturesData.CapyFeaturesData();
  106. }
  107. public override void ActiveObj()
  108. {
  109. }
  110. /// <summary>
  111. /// 激活技能,准备使用技能
  112. /// </summary>
  113. public void ActiveSkill()
  114. {
  115. }
  116. protected void ProActiveSkill()
  117. {
  118. }
  119. /// <summary>
  120. /// 轮询前的初始化
  121. /// </summary>
  122. public void PollingInitBefore(BetterList<SkillBasic> skillQueue)
  123. {
  124. SkillIntensifierData.DormancyObj();
  125. ProPollingnInitBefore(skillQueue);
  126. }
  127. protected virtual void ProPollingnInitBefore(BetterList<SkillBasic> skillQueue)
  128. {
  129. }
  130. /// <summary>
  131. /// 轮询的初始化
  132. /// </summary>
  133. public void PollingInit(BetterList<SkillBasic> skillQueue)
  134. {
  135. ProPollingnInit(skillQueue);
  136. }
  137. protected virtual void ProPollingnInit(BetterList<SkillBasic> skillQueue)
  138. {
  139. }
  140. /// <summary>
  141. /// 休眠
  142. /// </summary>
  143. public override void DormancyObj()
  144. {
  145. Dispose();
  146. _enterAlertTarget.Clear();
  147. _currUseSkillTarget.Clear();
  148. _triggerCallBack.Clear();
  149. _earlyWarningFx = null;
  150. _earlyWarningFristHero = null;
  151. _finishTimeLineGroupName = null;
  152. _earlyWarningFx = null;
  153. _isEarlyWarning = false;
  154. _triggerData = new TriggerData();
  155. _useSkillTargetPool = true;
  156. isUse = false;
  157. _combatHeroEntity = null;
  158. SkillMaxCd = 0;
  159. currUseAllTimeLineLogic.Clear();
  160. finishCallBack = null;
  161. _isDis = false;
  162. }
  163. public virtual void ActiveLimitSkill()
  164. {
  165. isActive = true;
  166. }
  167. /// <summary>
  168. /// 开始游戏
  169. /// </summary>
  170. public void StartGame()
  171. {
  172. // InitSpecialWeapon();
  173. if (SelfSkillConfig.SkillType == 4 || SelfSkillConfig.SkillType == 5)
  174. {
  175. UseSkill();
  176. }
  177. ProStartGame();
  178. }
  179. public void InitSkillConfig(SkillConfig skillConfig)
  180. {
  181. SkillMaxCd = skillConfig.cd;
  182. _skillCd = SkillMaxCd;
  183. SelfSkillConfig = skillConfig;
  184. UseCount = skillConfig.SkillType * 100000;
  185. skillGuid = skillConfig.ID;
  186. if (SkillIntensifierData == null)
  187. {
  188. SkillIntensifierData = new SkillIntensifierData();
  189. }
  190. ProInitSkillConfig();
  191. // LogTool.Log("初始化技能"+skillConfig.scriptName);
  192. }
  193. protected virtual void ProInitSkillConfig()
  194. {
  195. }
  196. /// <summary>
  197. /// 设置激活的TimeLine名字
  198. /// </summary>
  199. public void SetActiveTimeLineGroupName(string groupName)
  200. {
  201. ActiveTimeLineGroupName = groupName;
  202. }
  203. public virtual bool IsCanUse()
  204. {
  205. return true;
  206. }
  207. public HarmReturnInfo Harm(CombatHeroEntity source, CombatHeroHitPoint target, long att, AttType attType,
  208. TriggerData triggerData, HarmType harmType = HarmType.Null)
  209. {
  210. if (target == null || target.combatHeroEntity == null)
  211. {
  212. return null;
  213. }
  214. return CombatCalculateTool.Instance.Harm(source, target, att, attType, triggerData,
  215. harmType);
  216. }
  217. public HarmReturnInfo Recover(CombatHeroEntity source, CombatHeroHitPoint target, long att,
  218. AttType attType, HarmType harmType)
  219. {
  220. return CombatCalculateTool.Instance.Recover(source, target, att, attType, harmType, triggerData);
  221. }
  222. public void SetSkillFinishCallBack(System.Action<SkillBasic> finishCallBack)
  223. {
  224. this.finishCallBack = finishCallBack;
  225. }
  226. /// <summary>
  227. /// 开始使用技能
  228. /// </summary>
  229. public void UseSkill()
  230. {
  231. BetterList<IntensifierEffectBasic> currIntensifierEffectBasicList=SkillIntensifierData.currIntensifierEffectBasicList;
  232. for (int i = 0; i < currIntensifierEffectBasicList.Count; i++)
  233. {
  234. currIntensifierEffectBasicList[i].IntensifierSkillUseBefore(this);
  235. }
  236. SkillCd = SkillMaxCd;
  237. _enterAlertTarget.Clear();
  238. UseCount++;
  239. _triggerData = new TriggerData();
  240. isUse = true;
  241. _triggerData.TriggerGuid = UseCount;
  242. _currUseSkillTarget.Clear();
  243. currUseAllTimeLineLogic.Clear();
  244. // CombatEventManager.Instance.Dispatch(CombatEventType.HeroUseSkill, new HeroUseSkillEventData()
  245. // {
  246. // CombatHeroEntity = CombatHeroEntity,
  247. // SkillBasic = this
  248. // });
  249. ProUseSkill();
  250. }
  251. public override void Dispose()
  252. {
  253. if (_isDis)
  254. {
  255. return;
  256. }
  257. _isDis = true;
  258. currUseAllTimeLineLogic.Clear();
  259. ProDispose();
  260. _combatHeroEntity = null;
  261. }
  262. public void ReduceCd(float time)
  263. {
  264. if (!isActive || !IsCanReduceCd())
  265. {
  266. return;
  267. }
  268. _skillCd -= time;
  269. }
  270. protected virtual bool IsCanReduceCd()
  271. {
  272. return true;
  273. }
  274. public SpecialDotInfo GetSpecialDotInfo(string specialDotName)
  275. {
  276. return _combatHeroEntity.GetSpecialDotInfo(specialDotName);
  277. }
  278. public T GetILifetCycleHitPoint<T>(string hitPoinName, bool isStandType, bool isIgnoreHind)
  279. where T : ILifetCycleHitPoint
  280. {
  281. return _combatHeroEntity.GetILifetCycleHitPoint<T>(hitPoinName, isStandType, isIgnoreHind);
  282. }
  283. public T GetMainHotPoin<T>(bool isIgnoreHind) where T : ILifetCycleHitPoint
  284. {
  285. throw new NotImplementedException();
  286. }
  287. public void CloseLoopFx(IGObjectPoolInterface objectPoolInterface)
  288. {
  289. }
  290. /// <summary>
  291. /// 添加trigger监听事件
  292. /// </summary>
  293. /// <param name="groupName"></param>
  294. /// <param name="callBack"></param>
  295. protected void AddTriggerCallBack(string groupName,
  296. System.Action<string, CombatHeroHitPoint, ITimelineFxLogic, TriggerData> callBack)
  297. {
  298. if (!_triggerCallBack.ContainsKey(groupName))
  299. {
  300. _triggerCallBack.Add(groupName, callBack);
  301. }
  302. }
  303. /// <summary>
  304. /// 移除trigger添加事件
  305. /// </summary>
  306. /// <param name="groupName"></param>
  307. /// <param name="callBack"></param>
  308. protected void RemoveTriggerCallBack(string groupName,
  309. System.Action<string, TimeLineTriggerType, object, ITimelineFxLogic, object> callBack)
  310. {
  311. if (_triggerCallBack.ContainsKey(groupName))
  312. {
  313. _triggerCallBack.Remove(groupName);
  314. }
  315. }
  316. /// <summary>
  317. /// 激活timeLine数据
  318. /// </summary>
  319. /// <param name="groupName">组</param>
  320. /// <param name="currTarget">传递给timeLine的目标</param>
  321. /// <param name="extraData">透传消息</param>
  322. /// <param name="customizePos">自定义坐标</param>
  323. /// <param name="finishCallBack">timeLine完成回调</param>
  324. public TimeLineEventLogicGroupBasic ActivationTimeLineData(string groupName, string timeLineName = null,
  325. BetterList<ILifetCycleHitPoint> currTarget = null,
  326. Vector3[] customizePos = null, System.Action finishCallBack = null, float startTime = default,
  327. object extraData = null)
  328. {
  329. bool isNoAnim = false;
  330. if (groupName.Contains("noAnim"))
  331. {
  332. groupName = groupName.Replace("noAnim", "");
  333. isNoAnim = true;
  334. }
  335. TimeLineEventLogicGroupBasic timeLineEventLogicGroup =
  336. _combatHeroEntity.combatHeroTimeLineControl
  337. .GetTimeLineEventLogicGroup<TimeLineEventLogicGroupBasic>(timeLineName, groupName);
  338. try
  339. {
  340. if (timeLineEventLogicGroup != null)
  341. {
  342. timeLineEventLogicGroup.extraData = extraData;
  343. timeLineEventLogicGroup.SetCombatInfo(_combatHeroEntity, this, currTarget, triggerData,
  344. customizePos);
  345. timeLineEventLogicGroup.TimeLineUpdateEnd = finishCallBack;
  346. timeLineEventLogicGroup.timeLineTime = startTime;
  347. _combatHeroEntity.combatHeroTimeLineControl.AddEventLogicGroup(timeLineEventLogicGroup);
  348. currUseAllTimeLineLogic.Add(timeLineEventLogicGroup);
  349. }
  350. }
  351. catch (Exception e)
  352. {
  353. LogTool.Error(e);
  354. }
  355. return timeLineEventLogicGroup;
  356. }
  357. /// <summary>
  358. /// 打断技能
  359. /// </summary>
  360. public void BreakSkill()
  361. {
  362. // CombatEventManager.Instance.Dispatch(CombatEventType.BreakSkill, new CombatEventDefaultData()
  363. // {
  364. // datas = new object[2] { _combatHeroEntity, this }
  365. // });
  366. for (int i = 0; i < currUseAllTimeLineLogic.Count; i++)
  367. {
  368. if (currUseAllTimeLineLogic[i] != null && currUseAllTimeLineLogic[i].CastEntity != CombatHeroEntity)
  369. {
  370. LogTool.Log("对象以移交");
  371. }
  372. else
  373. {
  374. currUseAllTimeLineLogic[i].BreakTimeLine(CombatHeroEntity);
  375. _combatHeroEntity.combatHeroTimeLineControl.RemoveEventLogicGroup(currUseAllTimeLineLogic[i]);
  376. }
  377. }
  378. currUseAllTimeLineLogic.Clear();
  379. SkillPlayFinish();
  380. ProBreakSkill();
  381. }
  382. /// <summary>
  383. /// 技能timeLine的完成标志。表示当前TimeLine播放完成
  384. /// </summary>
  385. /// <param name="groupName">那一个组的完成了</param>
  386. public void TimeLineEndSing(string groupName)
  387. {
  388. ProTimeLineEndSing(groupName);
  389. }
  390. /// <summary>
  391. /// 技能更新
  392. /// </summary>
  393. /// <param name="time"></param>
  394. public void CombatUpdate(float time)
  395. {
  396. ProCombatUpdate(time);
  397. }
  398. /// <summary>
  399. /// 技能播放完成
  400. /// </summary>
  401. public void SkillPlayFinish()
  402. {
  403. if (!isUse)
  404. {
  405. return;
  406. }
  407. isUse = false;
  408. finishCallBack?.Invoke(this);
  409. ProSkillPlayFinish();
  410. finishCallBack = null;
  411. _isEarlyWarning = false;
  412. _earlyWarningFristHero = null;
  413. if (_earlyWarningFx != null)
  414. {
  415. GObjectPool.Instance.Recycle(_earlyWarningFx);
  416. _earlyWarningFx = null;
  417. }
  418. BetterList<IntensifierEffectBasic> currIntensifierEffectBasicList=SkillIntensifierData.currIntensifierEffectBasicList;
  419. for (int i = 0; i < currIntensifierEffectBasicList.Count; i++)
  420. {
  421. currIntensifierEffectBasicList[i].IntensifierSkillTimelineFxLogicUseFinish(this);
  422. }
  423. }
  424. /// <summary>
  425. /// timeLine和子弹碰撞后会调用
  426. /// </summary>
  427. /// <param name="timeLineTriggerType">触发类型,默认没用</param>
  428. /// <param name="timeLineData">时间线上配置的数据(默认null)</param>
  429. /// <param name="targetEntity">目标对象(敌人)</param>
  430. /// <param name="triggerData">触发的额外数据——透传数据</param>
  431. public void TimeLineTrigger(string groupName, ILifetCycleHitPoint targetEntity,
  432. ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
  433. {
  434. if (targetEntity == null || _isDis)
  435. {
  436. return;
  437. }
  438. if (_triggerCallBack.ContainsKey(groupName))
  439. {
  440. _triggerCallBack[groupName]?.Invoke(groupName,
  441. targetEntity != null ? targetEntity.This<CombatHeroHitPoint>() : null, timelineFxLogic,
  442. triggerData);
  443. }
  444. else
  445. {
  446. ProDefaultTimeLineTrigger(groupName,
  447. targetEntity != null ? targetEntity.This<CombatHeroHitPoint>() : null, timelineFxLogic,
  448. triggerData);
  449. }
  450. }
  451. public ILifetCycleHitPoint[] GetTineLineTargetEntity(TimeLineEventLogicBasic timeLineEventLogicBasic)
  452. {
  453. // BetterList<ILifetCycleHitPoint> point = CombatListPool<ILifetCycleHitPoint>.Instance.Get();
  454. if (_useSkillTargetPool)
  455. {
  456. if (_currUseSkillTarget != null && _currUseSkillTarget.Count > 0)
  457. {
  458. return _currUseSkillTarget.ToArray();
  459. }
  460. }
  461. _currUseSkillTarget.Clear();
  462. ILifetCycleHitPoint[] allHit = ProGetTineLineTargetEntity(timeLineEventLogicBasic);
  463. _currUseSkillTarget.AddRange(allHit);
  464. return _currUseSkillTarget.ToArray();
  465. }
  466. public ILifetCycleHitPoint[] FilterTarget(TimeLineEventLogicBasic timeLineEventLogicBasic,
  467. FXTargetType fixtarget, ILifetCycleHitPoint[] target)
  468. {
  469. if ((int)fixtarget == 1)
  470. {
  471. return target;
  472. }
  473. // BetterList<ILifetCycleHitPoint> point = CombatListPool<ILifetCycleHitPoint>.Instance.Get();
  474. // bool myEnemy = _combatHeroEntity.CombatHeroDataComponent.CurrCombatHeroInfo.IsEnemy;
  475. // for (int i = 0; i < target.Count; i++)
  476. // {
  477. // bool targetEnemy = target[i].This<CombatHeroEntityHitPoint>().CombatHeroEntity.CombatHeroDataComponent
  478. // .CurrCombatHeroInfo.IsEnemy;
  479. // if (fixtarget.HasFlag(FXTargetType.Enemy) && targetEnemy != myEnemy)
  480. // {
  481. // point.Add(target[i]);
  482. // }
  483. //
  484. // if (fixtarget.HasFlag(FXTargetType.Teammate) && targetEnemy == myEnemy)
  485. // {
  486. // point.Add(target[i]);
  487. // }
  488. //
  489. // if (fixtarget.HasFlag(FXTargetType.Oneself) &&
  490. // target[i].This<CombatHeroEntityHitPoint>().CombatHeroEntity == _combatHeroEntity)
  491. // {
  492. // point.Add(target[i]);
  493. // }
  494. // }
  495. return target;
  496. }
  497. public ILifetCycleHitPoint[] FilterTargetForCombat(TimeLineEventLogicBasic timeLineEventLogicBasic,
  498. FXTargetType fixtarget,
  499. ILifetCycleHitPoint[] target)
  500. {
  501. return target;
  502. }
  503. protected virtual void ProInitSkill()
  504. {
  505. }
  506. protected abstract void ProUseSkill();
  507. protected virtual ILifetCycleHitPoint[] ProGetTineLineTargetEntity(
  508. TimeLineEventLogicBasic timeLineEventLogicBasic)
  509. {
  510. if (CombatHeroEntity.CombatAIBasic.currFocusTarget == null)
  511. {
  512. return null;
  513. }
  514. if (CombatHeroEntity.CombatAIBasic.currFocusTarget is BannerHero)
  515. {
  516. return null;
  517. }
  518. ILifetCycleHitPoint lifetCycleHitPoint = CombatHeroEntity.CombatAIBasic.currFocusTarget
  519. .GetThis<CombatHeroEntity>()
  520. .GetMainHotPoin<ILifetCycleHitPoint>();
  521. if (lifetCycleHitPoint == null)
  522. {
  523. return null;
  524. }
  525. return new[] { lifetCycleHitPoint };
  526. }
  527. /// <summary>
  528. /// 默认的触发器
  529. /// </summary>
  530. /// <param name="groupName"></param>
  531. /// <param name="timeLineTriggerType"></param>
  532. /// <param name="timeLineData"></param>
  533. /// <param name="targetEntity"></param>
  534. /// <param name="triggerData"></param>
  535. protected virtual void ProDefaultTimeLineTrigger(string groupName, CombatHeroHitPoint targetEntity,
  536. ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
  537. {
  538. }
  539. protected virtual void ProSkillPlayFinish()
  540. {
  541. }
  542. protected virtual void ProDispose()
  543. {
  544. }
  545. /// <summary>
  546. ///
  547. /// </summary>
  548. /// <param name="groupName"></param>
  549. protected virtual void ProTimeLineEndSing(string groupName)
  550. {
  551. if (string.IsNullOrEmpty(_finishTimeLineGroupName))
  552. {
  553. SkillPlayFinish();
  554. }
  555. else if (_finishTimeLineGroupName == groupName)
  556. {
  557. SkillPlayFinish();
  558. }
  559. }
  560. protected virtual void ProCombatUpdate(float time)
  561. {
  562. }
  563. /// <summary>
  564. /// 技能被打断
  565. /// </summary>
  566. protected virtual void ProBreakSkill()
  567. {
  568. }
  569. protected virtual void ProStartGame()
  570. {
  571. }
  572. public void TimelineFxLogicInit(string groupName, ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
  573. {
  574. ProTimelineFxLogicInit(groupName, timelineFxLogic, triggerData);
  575. BetterList<IntensifierEffectBasic> currIntensifierEffectBasicList=SkillIntensifierData.currIntensifierEffectBasicList;
  576. for (int i = 0; i < currIntensifierEffectBasicList.Count; i++)
  577. {
  578. currIntensifierEffectBasicList[i].IntensifierSkillTimelineFxLogicInitBefore(this,groupName, timelineFxLogic, triggerData);
  579. }
  580. }
  581. /// <summary>
  582. /// 实例化出的特效逻辑初始化
  583. /// </summary>
  584. /// <param name="groupName"></param>
  585. /// <param name="timelineFxLogic"></param>
  586. protected virtual void ProTimelineFxLogicInit(string groupName, ITimelineFxLogic timelineFxLogic,
  587. TriggerData triggerData)
  588. {
  589. }
  590. public void TimeLineTriggerGround(string groupName, ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
  591. {
  592. ProTimeLineTriggerGround(groupName, timelineFxLogic, triggerData);
  593. }
  594. /// <summary>
  595. /// 触碰地面
  596. /// </summary>
  597. /// <param name="groupName"></param>
  598. /// <param name="timelineFxLogic"></param>
  599. protected virtual void ProTimeLineTriggerGround(string groupName, ITimelineFxLogic timelineFxLogic,
  600. TriggerData triggerData)
  601. {
  602. }
  603. public void InitAlert(TimeLineAlertSeriailztion timeLineAlertSeriailztion, GameObject gameObject)
  604. {
  605. CombatAlertManager.Instance.AddAlert(gameObject, _combatHeroEntity);
  606. }
  607. public void LeaveAlert(TimeLineAlertSeriailztion timeLineAlertSeriailztion, GameObject gameObject)
  608. {
  609. _enterAlertTarget.Clear();
  610. CombatAlertManager.Instance.RemoveAlert(gameObject);
  611. }
  612. public void Enter(TimeLineAlertSeriailztion timeLineAlertSeriailztion, Collider collider, GameObject gameObject)
  613. {
  614. HeroEntityMono heroEntityMono = collider.gameObject.GetComponent<HeroEntityMono>();
  615. if (heroEntityMono == null)
  616. {
  617. return;
  618. }
  619. CombatHeroEntity target = heroEntityMono.combatHeroEntity;
  620. if (timeLineAlertSeriailztion.isFindEnemy && target.IsEnemy == _combatHeroEntity.IsEnemy ||
  621. timeLineAlertSeriailztion.isFindMyHero && target.IsEnemy != _combatHeroEntity.IsEnemy)
  622. {
  623. return;
  624. }
  625. if (_enterAlertTarget.Contains(target))
  626. {
  627. return;
  628. }
  629. _enterAlertTarget.Add(target);
  630. if (timeLineAlertSeriailztion.alertType == TimeLineAlertSeriailztion.TimeLineAlertType.Dangerous)
  631. {
  632. AlertTriggerEventData alertTriggerEventData = AlertTriggerEventData.Create();
  633. alertTriggerEventData.combatHeroEntity = target;
  634. alertTriggerEventData.attackEntity = _combatHeroEntity;
  635. alertTriggerEventData.collider = collider;
  636. alertTriggerEventData.triggerObject = gameObject;
  637. alertTriggerEventData.isTrigger = true;
  638. CombatEventManager.Instance.Dispatch(CombatEventType.AlertTrigger, alertTriggerEventData);
  639. }
  640. ProHeroEnter(timeLineAlertSeriailztion, target);
  641. }
  642. protected virtual void ProHeroEnter(TimeLineAlertSeriailztion timeLineAlertSeriailztion,
  643. CombatHeroEntity target)
  644. {
  645. }
  646. public void Leave(TimeLineAlertSeriailztion timeLineAlertSeriailztion, Collider collider, GameObject gameObject)
  647. {
  648. HeroEntityMono heroEntityMono = collider.gameObject.GetComponent<HeroEntityMono>();
  649. if (heroEntityMono == null || CombatHeroEntity == null)
  650. {
  651. return;
  652. }
  653. CombatHeroEntity target = heroEntityMono.combatHeroEntity;
  654. if (target.IsEnemy == CombatHeroEntity.IsEnemy)
  655. {
  656. return;
  657. }
  658. if (!_enterAlertTarget.Contains(target))
  659. {
  660. return;
  661. }
  662. _enterAlertTarget.Remove(target);
  663. if (timeLineAlertSeriailztion.alertType == TimeLineAlertSeriailztion.TimeLineAlertType.Dangerous)
  664. {
  665. AlertTriggerEventData alertTriggerEventData = AlertTriggerEventData.Create();
  666. alertTriggerEventData.combatHeroEntity = target;
  667. alertTriggerEventData.attackEntity = _combatHeroEntity;
  668. alertTriggerEventData.collider = collider;
  669. alertTriggerEventData.isTrigger = false;
  670. alertTriggerEventData.triggerObject = gameObject;
  671. CombatEventManager.Instance.Dispatch(CombatEventType.AlertTrigger, alertTriggerEventData);
  672. }
  673. ProHeroLeave(timeLineAlertSeriailztion, target);
  674. }
  675. protected virtual void ProHeroLeave(TimeLineAlertSeriailztion timeLineAlertSeriailztion,
  676. CombatHeroEntity target)
  677. {
  678. }
  679. }
  680. }