SkillBasic.cs 24 KB

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