CombatHeroSkillControl.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. using System.Collections.Generic;
  2. using Common.Utility.CombatEvent;
  3. using Excel2Json;
  4. using Fort23.Core;
  5. using Fort23.Mono;
  6. using Fort23.UTool;
  7. using GameLogic.Combat.CombatTool;
  8. using GameLogic.Combat.Skill;
  9. using GameLogic.Player;
  10. using UnityEngine;
  11. namespace GameLogic.Combat.Hero
  12. {
  13. public class CombatHeroSkillControl : CombatHeroSkillControlBasic
  14. {
  15. /// <summary>
  16. /// 技能指令,0表示没有技能;
  17. /// </summary>
  18. private BetterList<SkillBasic> SkillCommands = new BetterList<SkillBasic>();
  19. public int useSkillCount
  20. {
  21. get { return SkillCommands.size; }
  22. }
  23. /// <summary>
  24. /// 当前能使用的技能
  25. /// </summary>
  26. public SkillBasic currUseSkill;
  27. // public float NormalAttSpeedScale;
  28. public BetterList<SkillBasic> _skillQueue = new BetterList<SkillBasic>();
  29. protected override async CTask ProInit()
  30. {
  31. if (_combatHeroEntity.IsEnemy)
  32. {
  33. await SetNewSkill(_combatHeroEntity.CurrCombatHeroInfo.unLockSkills.ToArray());
  34. }
  35. else
  36. {
  37. await SetNewSkill(PlayerManager.Instance.useSkillId);
  38. }
  39. // NormalAttSpeedScale = 2;
  40. // CTaskAwaitBuffer cTaskAwaitBuffer = new CTaskAwaitBuffer();
  41. //
  42. // List<int> skillId = _combatHeroEntity.CurrCombatHeroInfo.unLockSkills;
  43. // if (skillId != null)
  44. // {
  45. // for (int i = 0; i < skillId.Count; i++)
  46. // {
  47. // SkillConfig skillConfig = ConfigComponent.Instance.Get<SkillConfig>(skillId[i]);
  48. // SkillBasic skillBasic = AddSkill(skillConfig);
  49. // if (skillBasic == null)
  50. // {
  51. // continue;
  52. // }
  53. //
  54. // skillBasic.index = i;
  55. // _skillQueue.Add(skillBasic);
  56. // if (!string.IsNullOrEmpty(skillConfig.scriptName))
  57. // {
  58. // cTaskAwaitBuffer.AddTask(AssetBundleLoadManager.Instance.LoadAssetAsyncTask<TextAsset>(
  59. // skillConfig.timelineName + ".txt",
  60. // delegate(AssetHandle handle)
  61. // {
  62. // if (handle != null)
  63. // {
  64. // TextAsset textAsset = handle.AssetObject<TextAsset>();
  65. // TimeLienData timeLienData = JsonManager.FromJson<TimeLienData>(textAsset.text);
  66. // timeLienData.DeserializeData();
  67. // handle.Release();
  68. // _combatHeroEntity.combatHeroTimeLineControl.AddTimeLienData(timeLienData);
  69. // }
  70. // }));
  71. // }
  72. // }
  73. // }
  74. //
  75. // await cTaskAwaitBuffer.WaitAll();
  76. // for (int i = 0; i < _skillQueue.Count; i++)
  77. // {
  78. // SkillBasic skillBasic = _skillQueue[i];
  79. // skillBasic.ActiveSkill();
  80. // skillBasic.angle -= i * 36;
  81. // }
  82. //
  83. // CombatEventManager.Instance.Dispatch(CombatEventType.ExercisesAlter, null);
  84. }
  85. public override async CTask SetNewSkill(int[] allSkill)
  86. {
  87. CTaskAwaitBuffer cTaskAwaitBuffer = new CTaskAwaitBuffer();
  88. _skillQueue.Clear();
  89. int[] skillId = allSkill;
  90. int indexCount = 0;
  91. if (skillId != null)
  92. {
  93. for (int i = 0; i < skillId.Length; i++)
  94. {
  95. int id = skillId[i];
  96. if (id == 0)
  97. {
  98. continue;
  99. }
  100. SkillConfig skillConfig = ConfigComponent.Instance.Get<SkillConfig>(id);
  101. SkillBasic skillBasic = AddSkill(skillConfig);
  102. if (skillBasic == null)
  103. {
  104. continue;
  105. }
  106. skillBasic.index = indexCount;
  107. indexCount++;
  108. skillBasic.angle = i * 36;
  109. _skillQueue.Add(skillBasic);
  110. if (!string.IsNullOrEmpty(skillConfig.scriptName))
  111. {
  112. cTaskAwaitBuffer.AddTask(AssetBundleLoadManager.Instance.LoadAssetAsyncTask<TextAsset>(
  113. skillConfig.timelineName + ".txt",
  114. delegate(AssetHandle handle)
  115. {
  116. if (handle != null)
  117. {
  118. TextAsset textAsset = handle.AssetObject<TextAsset>();
  119. TimeLienData timeLienData = JsonManager.FromJson<TimeLienData>(textAsset.text);
  120. timeLienData.DeserializeData();
  121. handle.Release();
  122. _combatHeroEntity.combatHeroTimeLineControl.AddTimeLienData(timeLienData);
  123. }
  124. }));
  125. }
  126. }
  127. }
  128. await cTaskAwaitBuffer.WaitAll();
  129. for (int i = 0; i < _skillQueue.Count; i++)
  130. {
  131. SkillBasic skillBasic = _skillQueue[i];
  132. skillBasic.ActiveSkill();
  133. }
  134. CombatEventManager.Instance.Dispatch(CombatEventType.ExercisesAlter, null);
  135. }
  136. public SkillBasic GetSkillQueueForIndex(int index)
  137. {
  138. if (index < 0 || index >= _skillQueue.Count)
  139. {
  140. return null;
  141. }
  142. return _skillQueue[index];
  143. }
  144. public void UpdateSkill(List<int> skillIDs)
  145. {
  146. for (int i = 0; i < skillIDs.Count; i++)
  147. {
  148. SkillConfig skillConfig = ConfigComponent.Instance.Get<SkillConfig>(skillIDs[i]);
  149. // SkillConfig skillConfig = skillIDs[i];
  150. SkillBasic skillBasic = GetSkillBasic(skillConfig.IDGroup);
  151. if (skillBasic == null)
  152. {
  153. AddSkill(skillConfig);
  154. }
  155. else
  156. {
  157. skillBasic.InitSkillConfig(skillConfig);
  158. skillBasic.InitSkill(_combatHeroEntity);
  159. }
  160. }
  161. }
  162. public void AddCommandSkill(SkillBasic skill)
  163. {
  164. SkillCommands.Add(skill);
  165. }
  166. public void RemoveCommandSkill(SkillBasic skill)
  167. {
  168. SkillCommands.Remove(skill);
  169. }
  170. public void ClearCommandSkill()
  171. {
  172. SkillCommands.Clear();
  173. }
  174. public void UseSkill(SkillBasic skill)
  175. {
  176. CombatUseSkillEventData combatUseSkillEventData = CombatUseSkillEventData.Create();
  177. combatUseSkillEventData.useSkill = skill;
  178. CombatEventManager.Instance.Dispatch(CombatEventType.UseSkill, combatUseSkillEventData);
  179. currUseSkill = skill;
  180. skill.UseSkill();
  181. if (skill.SelfSkillConfig.SkillType == 1)
  182. {
  183. SetNormalAttCd();
  184. }
  185. }
  186. /// <summary>
  187. /// 判断是否有技能可释放
  188. /// </summary>
  189. /// <returns></returns>
  190. public SkillBasic CanReleaseSkill()
  191. {
  192. // if (_combatHeroEntity.IsControl())
  193. // {
  194. // return null;
  195. // }
  196. if (!_combatHeroEntity.IsEnemy && _combatHeroEntity.CombatAIBasic.currFocusTarget is BannerHero)
  197. {
  198. return null;
  199. }
  200. SkillBasic skillBasic = null;
  201. for (int i = 0; i < SkillCommands.size; i++)
  202. {
  203. skillBasic = SkillCommands[i];
  204. break;
  205. }
  206. return skillBasic;
  207. }
  208. protected override void ProUpdate(float t)
  209. {
  210. if (CombatController.currActiveCombat.IsFightState)
  211. {
  212. float speed = _combatHeroEntity.CurrCombatHeroInfo.GetAttSpeed;
  213. for (int i = 0; i < _skillQueue.Count; i++)
  214. {
  215. SkillBasic skillBasic = _skillQueue[i];
  216. skillBasic.angle += 1 * speed;
  217. if (skillBasic.SelfSkillConfig.SkillType == 2)
  218. {
  219. continue;
  220. }
  221. float jd = skillBasic.angle % 360;
  222. if (jd > skillBasic.useAngle && skillBasic.angle > skillBasic.lasetAngle)
  223. {
  224. skillBasic.lasetAngle += 360;
  225. // if (allMagic > 30)
  226. // {
  227. // allMagic -= 30;
  228. // skillBasic.useCount++;
  229. // if (!isKuoLiQuanKai)
  230. // {
  231. // addChongNeng += 10;
  232. // if (addChongNeng >= 150)
  233. // {
  234. // isKuoLiQuanKai = true;
  235. // }
  236. // }
  237. if (skillBasic.wuXingType.HasFlag(WuXingType.Gold))
  238. {
  239. int odds = Random.Range(0, 100);
  240. if (odds < 50)
  241. {
  242. _combatHeroEntity.CurrCombatHeroInfo.Water_Injury -= Random.Range(2, 5);
  243. if (_combatHeroEntity.CurrCombatHeroInfo.Water_Injury < 0)
  244. {
  245. _combatHeroEntity.CurrCombatHeroInfo.Water_Injury = 0;
  246. }
  247. }
  248. }
  249. if (skillBasic.wuXingType.HasFlag(WuXingType.Wood))
  250. {
  251. int odds = Random.Range(0, 100);
  252. if (odds < 50)
  253. {
  254. _combatHeroEntity.CurrCombatHeroInfo.Fire_Injury -= Random.Range(2, 5);
  255. if (_combatHeroEntity.CurrCombatHeroInfo.Fire_Injury < 0)
  256. {
  257. _combatHeroEntity.CurrCombatHeroInfo.Fire_Injury = 0;
  258. }
  259. }
  260. }
  261. if (skillBasic.wuXingType.HasFlag(WuXingType.Water))
  262. {
  263. int odds = Random.Range(0, 100);
  264. if (odds < 50)
  265. {
  266. _combatHeroEntity.CurrCombatHeroInfo.Wood_Injury -= Random.Range(2, 5);
  267. if (_combatHeroEntity.CurrCombatHeroInfo.Wood_Injury < 0)
  268. {
  269. _combatHeroEntity.CurrCombatHeroInfo.Wood_Injury = 0;
  270. }
  271. }
  272. }
  273. if (skillBasic.wuXingType.HasFlag(WuXingType.Fire))
  274. {
  275. int odds = Random.Range(0, 100);
  276. if (odds < 50)
  277. {
  278. _combatHeroEntity.CurrCombatHeroInfo.Earth_Injury -= Random.Range(2, 5);
  279. if (_combatHeroEntity.CurrCombatHeroInfo.Earth_Injury < 0)
  280. {
  281. _combatHeroEntity.CurrCombatHeroInfo.Earth_Injury = 0;
  282. }
  283. }
  284. }
  285. if (skillBasic.wuXingType.HasFlag(WuXingType.Earth))
  286. {
  287. int odds = Random.Range(0, 100);
  288. if (odds < 50)
  289. {
  290. _combatHeroEntity.CurrCombatHeroInfo.Metal_Injury -= Random.Range(2, 5);
  291. if (_combatHeroEntity.CurrCombatHeroInfo.Metal_Injury < 0)
  292. {
  293. _combatHeroEntity.CurrCombatHeroInfo.Metal_Injury = 0;
  294. }
  295. }
  296. }
  297. AddCommandSkill(skillBasic);
  298. AddUseGongFaEventData addUseGongFaEventData = AddUseGongFaEventData.Create();
  299. addUseGongFaEventData.SkillBasic = skillBasic;
  300. CombatEventManager.Instance.Dispatch(CombatEventType.AddUseGongFa, addUseGongFaEventData);
  301. // Debug.Log("旋转一圈");
  302. // }
  303. }
  304. }
  305. }
  306. // if (isKuoLiQuanKai)
  307. // {
  308. // qiankaiTime += t;
  309. // if (qiankaiTime > 3)
  310. // {
  311. // isKuoLiQuanKai = false;
  312. // qiankaiTime = 0;
  313. // addChongNeng = 0;
  314. // }
  315. // }
  316. // allMagic += t * addMaicSpeed;
  317. // if (allMagic > 500)
  318. // {
  319. // allMagic = 500;
  320. // }
  321. // if (currUseSkill == null && SkillCommands.Count <= 0)
  322. // {
  323. // while (_currUseQueueIndex < _skillQueue.Count && SkillCommands.Count <= 0)
  324. // {
  325. // SkillBasic skillBasic = _skillQueue[_currUseQueueIndex];
  326. // if (skillBasic.SelfSkillConfig.SkillType == 1)
  327. // {
  328. // if (skillBasic.IsCanUse())
  329. // {
  330. // AddCommandSkill(skillBasic);
  331. // }
  332. // }
  333. //
  334. // _currUseQueueIndex++;
  335. // }
  336. // }
  337. // if (_currUseQueueIndex >= _skillQueue.Count)
  338. // {
  339. // StartPolling();
  340. // }
  341. }
  342. public void SetNormalAttCd()
  343. {
  344. // if (NormalAttack == null)
  345. // {
  346. // return;
  347. // }
  348. //
  349. // string timeLineName = "attack";
  350. // float maxTime = _combatHeroEntity.combatHeroTimeLineControl.TimeLineData.GetTimeLineEventLogicGroupForTime(
  351. // timeLineName, null);
  352. // float attackSpeed = _combatHeroEntity.CurrCombatHeroInfo.attSpeed.Value;
  353. // float cd = 1.0f / attackSpeed;
  354. // float attSpeed = (float)1;
  355. // if (cd < maxTime)
  356. // {
  357. // attSpeed = maxTime / cd;
  358. // }
  359. //
  360. // NormalAttSpeedScale = attSpeed;
  361. // // Debug.Log(NormalAttSpeedScale);
  362. // NormalAttCd = cd;
  363. }
  364. public virtual void Dispose()
  365. {
  366. _combatHeroEntity = null;
  367. currUseSkill = null;
  368. }
  369. public virtual void ProDormancyObj()
  370. {
  371. for (int i = 0; i < allSkill.size; i++)
  372. {
  373. SkillBasic skillBasic = allSkill[i];
  374. CObjectPool.Instance.Recycle(skillBasic);
  375. }
  376. allSkill.Clear();
  377. SkillCommands.Clear();
  378. }
  379. }
  380. }