SkillBasic.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  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 Excel2Json;
  7. using Fort23.Common;
  8. using Fort23.UTool;
  9. using GameLogic.Combat.CombatTool;
  10. using GameLogic.Combat.Hero;
  11. using UnityEngine;
  12. using Utility;
  13. using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface;
  14. using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventLogic;
  15. namespace GameLogic.Combat.Skill
  16. {
  17. public abstract class SkillBasic : IDisposable, ITimeLineTriggerEntity, ITimeLineEndSing, ITimeLineTargetEntity,
  18. ITimeLineTriggerEvent
  19. {
  20. public int skillGuid;
  21. public int UseCount;
  22. /// <summary>
  23. /// 普攻是否是近战
  24. /// </summary>
  25. public bool isMelee;
  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. /// <summary>
  39. /// 当前激活技能的TimeLine数据
  40. /// </summary>
  41. protected List<TimeLineEventLogicGroupBasic> currUseAllTimeLineLogic = new List<TimeLineEventLogicGroupBasic>();
  42. private CombatHeroEntity _combatHeroEntity;
  43. private Map<string, System.Action<string, CombatHeroHitPoint, ITimelineFxLogic, TriggerData>>
  44. _triggerCallBack =
  45. new Map<string, Action<string, CombatHeroHitPoint, ITimelineFxLogic, TriggerData>>();
  46. public SkillConfig SelfSkillConfig;
  47. /// <summary>
  48. /// 武器专属机技能配置
  49. /// </summary>
  50. public SkillConfig WeaponSkillConfig;
  51. /// <summary>
  52. /// 释放技能的时候当前焦点的目标
  53. /// </summary>
  54. public CombatHeroEntity currFocusTarget;
  55. /// <summary>
  56. /// 激活的timelinegoup名字
  57. /// </summary>
  58. public string ActiveTimeLineGroupName;
  59. private System.Action finishCallBack;
  60. /// <summary>
  61. /// 完成时 是否是要完成的timeGroupName
  62. /// </summary>
  63. protected string _finishTimeLineGroupName;
  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. // protected HarmType _harmType;
  90. private CombatParticleSystemPool _earlyWarningFx;
  91. private CombatHeroEntity _earlyWarningFristHero;
  92. public T This<T>()
  93. {
  94. return (T)(object)this;
  95. }
  96. public void InitSkill(CombatHeroEntity combatHeroEntity)
  97. {
  98. _combatHeroEntity = combatHeroEntity;
  99. ProInitSkill();
  100. }
  101. public virtual void ActiveLimitSkill()
  102. {
  103. isActive = true;
  104. }
  105. /// <summary>
  106. /// 开始游戏
  107. /// </summary>
  108. public void StartGame()
  109. {
  110. // InitSpecialWeapon();
  111. if (SelfSkillConfig.SkillType == 4 || SelfSkillConfig.SkillType == 5)
  112. {
  113. UseSkill();
  114. }
  115. ProStartGame();
  116. }
  117. public void InitSkillConfig(SkillConfig skillConfig)
  118. {
  119. SkillMaxCd = 1;
  120. _skillCd = SkillMaxCd;
  121. SelfSkillConfig = skillConfig;
  122. UseCount = skillConfig.SkillType * 100000;
  123. skillGuid = skillConfig.ID;
  124. // LogTool.Log("初始化技能"+skillConfig.scriptName);
  125. }
  126. /// <summary>
  127. /// 设置激活的TimeLine名字
  128. /// </summary>
  129. public void SetActiveTimeLineGroupName(string groupName)
  130. {
  131. ActiveTimeLineGroupName = groupName;
  132. }
  133. public virtual bool IsCanUse()
  134. {
  135. return true;
  136. }
  137. private bool IsWeaponIsSpecial
  138. {
  139. get { return WeaponSkillConfig.ID > 0; }
  140. }
  141. protected virtual void EarlyWarning()
  142. {
  143. }
  144. public HarmReturnInfo Harm(CombatHeroEntity source, CombatHeroHitPoint target, long att, AttType attType,
  145. TriggerData triggerData, HarmType harmType = HarmType.Null)
  146. {
  147. return CombatCalculateTool.Instance.Harm(source, target, att, attType, triggerData,
  148. harmType );
  149. }
  150. // public HarmReturnInfo Recover(CombatHeroEntity source, CombatHeroHitPoint target, long att,
  151. // AttType attType, HarmType harmType)
  152. // {
  153. // return CombatCalculateTool.Instance.Recover(source, target, att, attType, harmType, triggerData);
  154. // }
  155. public void SetSkillFinishCallBack(System.Action finishCallBack)
  156. {
  157. this.finishCallBack = finishCallBack;
  158. }
  159. /// <summary>
  160. /// 开始使用技能
  161. /// </summary>
  162. public void UseSkill()
  163. {
  164. UseCount++;
  165. _triggerData = new TriggerData();
  166. isUse = true;
  167. _triggerData.TriggerGuid = UseCount;
  168. _currUseSkillTarget.Clear();
  169. currUseAllTimeLineLogic.Clear();
  170. // CombatEventManager.Instance.Dispatch(CombatEventType.HeroUseSkill, new HeroUseSkillEventData()
  171. // {
  172. // CombatHeroEntity = CombatHeroEntity,
  173. // SkillBasic = this
  174. // });
  175. ProUseSkill();
  176. }
  177. public void Dispose()
  178. {
  179. currUseAllTimeLineLogic.Clear();
  180. ProDispose();
  181. _combatHeroEntity = null;
  182. }
  183. public void ReduceCd(float time)
  184. {
  185. if (!isActive || !IsCanReduceCd())
  186. {
  187. return;
  188. }
  189. _skillCd -= time;
  190. }
  191. protected virtual bool IsCanReduceCd()
  192. {
  193. return true;
  194. }
  195. public SpecialDotInfo GetSpecialDotInfo(string specialDotName)
  196. {
  197. return _combatHeroEntity.GetSpecialDotInfo(specialDotName);
  198. }
  199. public T GetILifetCycleHitPoint<T>(string hitPoinName, bool isStandType, bool isIgnoreHind)
  200. where T : ILifetCycleHitPoint
  201. {
  202. return _combatHeroEntity.GetILifetCycleHitPoint<T>(hitPoinName, isStandType, isIgnoreHind);
  203. }
  204. public T GetMainHotPoin<T>(bool isIgnoreHind) where T : ILifetCycleHitPoint
  205. {
  206. throw new NotImplementedException();
  207. }
  208. public void CloseLoopFx(IGObjectPoolInterface objectPoolInterface)
  209. {
  210. }
  211. /// <summary>
  212. /// 添加trigger监听事件
  213. /// </summary>
  214. /// <param name="groupName"></param>
  215. /// <param name="callBack"></param>
  216. protected void AddTriggerCallBack(string groupName,
  217. System.Action<string, ILifetCycleHitPoint, ITimelineFxLogic, TriggerData> callBack)
  218. {
  219. if (!_triggerCallBack.ContainsKey(groupName))
  220. {
  221. _triggerCallBack.Add(groupName, callBack);
  222. }
  223. }
  224. /// <summary>
  225. /// 移除trigger添加事件
  226. /// </summary>
  227. /// <param name="groupName"></param>
  228. /// <param name="callBack"></param>
  229. protected void RemoveTriggerCallBack(string groupName,
  230. System.Action<string, TimeLineTriggerType, object, ITimelineFxLogic, object> callBack)
  231. {
  232. if (_triggerCallBack.ContainsKey(groupName))
  233. {
  234. _triggerCallBack.Remove(groupName);
  235. }
  236. }
  237. /// <summary>
  238. /// 激活timeLine数据
  239. /// </summary>
  240. /// <param name="groupName">组</param>
  241. /// <param name="currTarget">传递给timeLine的目标</param>
  242. /// <param name="extraData">透传消息</param>
  243. /// <param name="customizePos">自定义坐标</param>
  244. /// <param name="finishCallBack">timeLine完成回调</param>
  245. public TimeLineEventLogicGroupBasic ActivationTimeLineData(string groupName,
  246. BetterList<ILifetCycleHitPoint> currTarget = null,
  247. Vector3[] customizePos = null, System.Action finishCallBack = null, float startTime = default,
  248. object extraData = null)
  249. {
  250. bool isNoAnim = false;
  251. if (groupName.Contains("noAnim"))
  252. {
  253. groupName = groupName.Replace("noAnim", "");
  254. isNoAnim = true;
  255. }
  256. TimeLineEventLogicGroupBasic timeLineEventLogicGroup =
  257. _combatHeroEntity.combatHeroTimeLineControl.TimeLineData
  258. .GetTimeLineEventLogicGroup<TimeLineEventLogicGroupBasic>(groupName, null);
  259. try
  260. {
  261. timeLineEventLogicGroup.extraData = extraData;
  262. timeLineEventLogicGroup.SetCombatInfo(_combatHeroEntity, this, currTarget, triggerData, customizePos);
  263. timeLineEventLogicGroup.TimeLineUpdateEnd = finishCallBack;
  264. timeLineEventLogicGroup.timeLineTime = startTime;
  265. _combatHeroEntity.combatHeroTimeLineControl.AddEventLogicGroup(timeLineEventLogicGroup);
  266. currUseAllTimeLineLogic.Add(timeLineEventLogicGroup);
  267. }
  268. catch (Exception e)
  269. {
  270. LogTool.Error(e);
  271. }
  272. return timeLineEventLogicGroup;
  273. }
  274. /// <summary>
  275. /// 打断技能
  276. /// </summary>
  277. public void BreakSkill()
  278. {
  279. // CombatEventManager.Instance.Dispatch(CombatEventType.BreakSkill, new CombatEventDefaultData()
  280. // {
  281. // datas = new object[2] { _combatHeroEntity, this }
  282. // });
  283. for (int i = 0; i < currUseAllTimeLineLogic.Count; i++)
  284. {
  285. currUseAllTimeLineLogic[i].BreakTimeLine();
  286. }
  287. currUseAllTimeLineLogic.Clear();
  288. SkillPlayFinish();
  289. ProBreakSkill();
  290. }
  291. /// <summary>
  292. /// 技能timeLine的完成标志。表示当前TimeLine播放完成
  293. /// </summary>
  294. /// <param name="groupName">那一个组的完成了</param>
  295. public void TimeLineEndSing(string groupName)
  296. {
  297. ProTimeLineEndSing(groupName);
  298. }
  299. /// <summary>
  300. /// 技能更新
  301. /// </summary>
  302. /// <param name="time"></param>
  303. public void CombatUpdate(float time)
  304. {
  305. ProCombatUpdate(time);
  306. }
  307. /// <summary>
  308. /// 技能播放完成
  309. /// </summary>
  310. public void SkillPlayFinish()
  311. {
  312. if (!isUse)
  313. {
  314. return;
  315. }
  316. isUse = false;
  317. // CombatEventManager.Instance.Dispatch(CombatEventType.SkillFinish, new HeroUseSkillEventData()
  318. // {
  319. // CombatHeroEntity = CombatHeroEntity,
  320. // SkillBasic = this
  321. // });
  322. ProSkillPlayFinish();
  323. finishCallBack?.Invoke();
  324. finishCallBack = null;
  325. _isEarlyWarning = false;
  326. _earlyWarningFristHero = null;
  327. if (_earlyWarningFx != null)
  328. {
  329. GObjectPool.Instance.Recycle(_earlyWarningFx);
  330. _earlyWarningFx = null;
  331. }
  332. }
  333. /// <summary>
  334. /// timeLine和子弹碰撞后会调用
  335. /// </summary>
  336. /// <param name="timeLineTriggerType">触发类型,默认没用</param>
  337. /// <param name="timeLineData">时间线上配置的数据(默认null)</param>
  338. /// <param name="targetEntity">目标对象(敌人)</param>
  339. /// <param name="triggerData">触发的额外数据——透传数据</param>
  340. public void TimeLineTrigger(string groupName, ILifetCycleHitPoint targetEntity,
  341. ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
  342. {
  343. if (targetEntity == null)
  344. {
  345. return;
  346. }
  347. if (_triggerCallBack.ContainsKey(groupName))
  348. {
  349. _triggerCallBack[groupName]?.Invoke(groupName,
  350. targetEntity != null ? targetEntity.This<CombatHeroHitPoint>() : null, timelineFxLogic,
  351. triggerData);
  352. }
  353. else
  354. {
  355. ProDefaultTimeLineTrigger(groupName,
  356. targetEntity != null ? targetEntity.This<CombatHeroHitPoint>() : null, timelineFxLogic,
  357. triggerData);
  358. }
  359. }
  360. public ILifetCycleHitPoint[] GetTineLineTargetEntity(TimeLineEventLogicBasic timeLineEventLogicBasic)
  361. {
  362. // BetterList<ILifetCycleHitPoint> point = CombatListPool<ILifetCycleHitPoint>.Instance.Get();
  363. if (_useSkillTargetPool)
  364. {
  365. if (_currUseSkillTarget != null && _currUseSkillTarget.Count > 0)
  366. {
  367. return _currUseSkillTarget.ToArray();
  368. }
  369. }
  370. _currUseSkillTarget.Clear();
  371. ILifetCycleHitPoint[] allHit = ProGetTineLineTargetEntity(timeLineEventLogicBasic);
  372. _currUseSkillTarget.AddRange(allHit);
  373. return _currUseSkillTarget.ToArray();
  374. }
  375. public ILifetCycleHitPoint[] FilterTarget(TimeLineEventLogicBasic timeLineEventLogicBasic,
  376. FXTargetType fixtarget, ILifetCycleHitPoint[] target)
  377. {
  378. if ((int)fixtarget == 1)
  379. {
  380. return target;
  381. }
  382. // BetterList<ILifetCycleHitPoint> point = CombatListPool<ILifetCycleHitPoint>.Instance.Get();
  383. // bool myEnemy = _combatHeroEntity.CombatHeroDataComponent.CurrCombatHeroInfo.IsEnemy;
  384. // for (int i = 0; i < target.Count; i++)
  385. // {
  386. // bool targetEnemy = target[i].This<CombatHeroEntityHitPoint>().CombatHeroEntity.CombatHeroDataComponent
  387. // .CurrCombatHeroInfo.IsEnemy;
  388. // if (fixtarget.HasFlag(FXTargetType.Enemy) && targetEnemy != myEnemy)
  389. // {
  390. // point.Add(target[i]);
  391. // }
  392. //
  393. // if (fixtarget.HasFlag(FXTargetType.Teammate) && targetEnemy == myEnemy)
  394. // {
  395. // point.Add(target[i]);
  396. // }
  397. //
  398. // if (fixtarget.HasFlag(FXTargetType.Oneself) &&
  399. // target[i].This<CombatHeroEntityHitPoint>().CombatHeroEntity == _combatHeroEntity)
  400. // {
  401. // point.Add(target[i]);
  402. // }
  403. // }
  404. return target;
  405. }
  406. public ILifetCycleHitPoint[] FilterTargetForCombat(TimeLineEventLogicBasic timeLineEventLogicBasic,
  407. FXTargetType fixtarget,
  408. ILifetCycleHitPoint[] target)
  409. {
  410. return target;
  411. }
  412. protected abstract void ProInitSkill();
  413. protected abstract void ProUseSkill();
  414. protected virtual ILifetCycleHitPoint[] ProGetTineLineTargetEntity(
  415. TimeLineEventLogicBasic timeLineEventLogicBasic)
  416. {
  417. return null;
  418. }
  419. /// <summary>
  420. /// 默认的触发器
  421. /// </summary>
  422. /// <param name="groupName"></param>
  423. /// <param name="timeLineTriggerType"></param>
  424. /// <param name="timeLineData"></param>
  425. /// <param name="targetEntity"></param>
  426. /// <param name="triggerData"></param>
  427. protected virtual void ProDefaultTimeLineTrigger(string groupName, CombatHeroHitPoint targetEntity,
  428. ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
  429. {
  430. }
  431. protected virtual void ProSkillPlayFinish()
  432. {
  433. }
  434. protected virtual void ProDispose()
  435. {
  436. }
  437. /// <summary>
  438. ///
  439. /// </summary>
  440. /// <param name="groupName"></param>
  441. protected virtual void ProTimeLineEndSing(string groupName)
  442. {
  443. if (string.IsNullOrEmpty(_finishTimeLineGroupName))
  444. {
  445. SkillPlayFinish();
  446. }
  447. else if (_finishTimeLineGroupName == groupName)
  448. {
  449. SkillPlayFinish();
  450. }
  451. }
  452. protected virtual void ProCombatUpdate(float time)
  453. {
  454. }
  455. /// <summary>
  456. /// 技能被打断
  457. /// </summary>
  458. protected virtual void ProBreakSkill()
  459. {
  460. }
  461. protected virtual void ProStartGame()
  462. {
  463. }
  464. public void TimelineFxLogicInit(string groupName, ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
  465. {
  466. ProTimelineFxLogicInit(groupName, timelineFxLogic, triggerData);
  467. }
  468. /// <summary>
  469. /// 实例化出的特效逻辑初始化
  470. /// </summary>
  471. /// <param name="groupName"></param>
  472. /// <param name="timelineFxLogic"></param>
  473. protected virtual void ProTimelineFxLogicInit(string groupName, ITimelineFxLogic timelineFxLogic,
  474. TriggerData triggerData)
  475. {
  476. }
  477. public void TimeLineTriggerGround(string groupName, ITimelineFxLogic timelineFxLogic, TriggerData triggerData)
  478. {
  479. ProTimeLineTriggerGround(groupName, timelineFxLogic, triggerData);
  480. }
  481. /// <summary>
  482. /// 触碰地面
  483. /// </summary>
  484. /// <param name="groupName"></param>
  485. /// <param name="timelineFxLogic"></param>
  486. protected virtual void ProTimeLineTriggerGround(string groupName, ITimelineFxLogic timelineFxLogic,
  487. TriggerData triggerData)
  488. {
  489. }
  490. }
  491. }