CombatHeroSkillControl.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  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. public float skillQueueTime = 5f;
  30. // private BetterList<SkillBasic> _skillQueue = new BetterList<SkillBasic>();
  31. private int _currUseQueueIndex = 0;
  32. public float allMagic = 500;
  33. protected float addMaicSpeed = 5000;
  34. public float addChongNeng;
  35. public bool isKuoLiQuanKai;
  36. protected float qiankaiTime;
  37. protected override async CTask ProInit()
  38. {
  39. // NormalAttSpeedScale = 2;
  40. CTaskAwaitBuffer cTaskAwaitBuffer = new CTaskAwaitBuffer();
  41. List<int> skillId = _combatHeroEntity.CurrCombatHeroInfo.unLockSkills;
  42. if (skillId != null)
  43. {
  44. for (int i = 0; i < skillId.Count; i++)
  45. {
  46. SkillConfig skillConfig = ConfigComponent.Instance.Get<SkillConfig>(skillId[i]);
  47. SkillBasic skillBasic = AddSkill(skillConfig);
  48. if (skillBasic == null)
  49. {
  50. continue;
  51. }
  52. _skillQueue.Add(skillBasic);
  53. if (!string.IsNullOrEmpty(skillConfig.scriptName))
  54. {
  55. cTaskAwaitBuffer.AddTask(AssetBundleLoadManager.Instance.LoadAssetAsyncTask<TextAsset>(
  56. skillConfig.timelineName + ".txt",
  57. delegate(AssetHandle handle)
  58. {
  59. if (handle != null)
  60. {
  61. TextAsset textAsset = handle.AssetObject<TextAsset>();
  62. TimeLienData timeLienData = JsonManager.FromJson<TimeLienData>(textAsset.text);
  63. timeLienData.DeserializeData();
  64. handle.Release();
  65. _combatHeroEntity.combatHeroTimeLineControl.AddTimeLienData(timeLienData);
  66. }
  67. }));
  68. }
  69. }
  70. }
  71. await cTaskAwaitBuffer.WaitAll();
  72. for (int i = 0; i < _skillQueue.Count; i++)
  73. {
  74. _skillQueue[i].angle -= i * 25;
  75. }
  76. CombatEventManager.Instance.Dispatch(CombatEventType.ExercisesAlter, null);
  77. }
  78. public void UpdateSkill(List<int> skillIDs)
  79. {
  80. for (int i = 0; i < skillIDs.Count; i++)
  81. {
  82. SkillConfig skillConfig = ConfigComponent.Instance.Get<SkillConfig>(skillIDs[i]);
  83. // SkillConfig skillConfig = skillIDs[i];
  84. SkillBasic skillBasic = GetSkillBasic(skillConfig.IDGroup);
  85. if (skillBasic == null)
  86. {
  87. AddSkill(skillConfig);
  88. }
  89. else
  90. {
  91. skillBasic.InitSkillConfig(skillConfig);
  92. skillBasic.InitSkill(_combatHeroEntity);
  93. }
  94. }
  95. }
  96. public void AddCommandSkill(SkillBasic skill)
  97. {
  98. SkillCommands.Add(skill);
  99. }
  100. public void RemoveCommandSkill(SkillBasic skill)
  101. {
  102. SkillCommands.Remove(skill);
  103. }
  104. public void ClearCommandSkill()
  105. {
  106. SkillCommands.Clear();
  107. }
  108. public void UseSkill(SkillBasic skill)
  109. {
  110. CombatUseSkillEventData combatUseSkillEventData = CombatUseSkillEventData.Create();
  111. combatUseSkillEventData.useSkill = skill;
  112. CombatEventManager.Instance.Dispatch(CombatEventType.UseSkill, combatUseSkillEventData);
  113. currUseSkill = skill;
  114. skill.UseSkill();
  115. if (skill.SelfSkillConfig.SkillType == 1)
  116. {
  117. SetNormalAttCd();
  118. }
  119. }
  120. /// <summary>
  121. /// 判断是否有技能可释放
  122. /// </summary>
  123. /// <returns></returns>
  124. public SkillBasic CanReleaseSkill()
  125. {
  126. // if (_combatHeroEntity.IsControl())
  127. // {
  128. // return null;
  129. // }
  130. if (!_combatHeroEntity.IsEnemy && _combatHeroEntity.CombatAIBasic.currFocusTarget is BannerHero)
  131. {
  132. return null;
  133. }
  134. SkillBasic skillBasic = null;
  135. for (int i = 0; i < SkillCommands.size; i++)
  136. {
  137. skillBasic = SkillCommands[i];
  138. break;
  139. }
  140. return skillBasic;
  141. }
  142. public void StartPolling()
  143. {
  144. for (int i = 0; i < _skillQueue.size; i++)
  145. {
  146. SkillBasic skillBasic = allSkill[i];
  147. skillBasic.PollingInitBefore(_skillQueue);
  148. }
  149. for (int i = 0; i < _skillQueue.size; i++)
  150. {
  151. SkillBasic skillBasic = allSkill[i];
  152. skillBasic.PollingInit(_skillQueue);
  153. }
  154. _currUseQueueIndex = 0;
  155. }
  156. protected override void ProUpdate(float t)
  157. {
  158. if (CombatController.currActiveCombat.IsFightState)
  159. {
  160. float speed = _combatHeroEntity.CurrCombatHeroInfo.attSpeed.Value * (isKuoLiQuanKai ? 3 : 1f);
  161. for (int i = 0; i < _skillQueue.Count; i++)
  162. {
  163. SkillBasic skillBasic = _skillQueue[i];
  164. skillBasic.angle += 1 * speed;
  165. float jd = skillBasic.angle % 360;
  166. if (jd > skillBasic.useAngle && skillBasic.angle > skillBasic.lasetAngle)
  167. {
  168. skillBasic.lasetAngle += 360;
  169. if (allMagic > 30)
  170. {
  171. allMagic -= 30;
  172. skillBasic.useCount++;
  173. if (!isKuoLiQuanKai)
  174. {
  175. addChongNeng += 10;
  176. if (addChongNeng >= 150)
  177. {
  178. isKuoLiQuanKai = true;
  179. }
  180. }
  181. if (skillBasic.WuXingType.HasFlag(WuXingType.Gold))
  182. {
  183. int odds = Random.Range(0, 100);
  184. if (odds < 50)
  185. {
  186. _combatHeroEntity.CurrCombatHeroInfo.Water_Injury -= Random.Range(2, 5);
  187. if (_combatHeroEntity.CurrCombatHeroInfo.Water_Injury < 0)
  188. {
  189. _combatHeroEntity.CurrCombatHeroInfo.Water_Injury = 0;
  190. }
  191. }
  192. }
  193. if (skillBasic.WuXingType.HasFlag(WuXingType.Wood))
  194. {
  195. int odds = Random.Range(0, 100);
  196. if (odds < 50)
  197. {
  198. _combatHeroEntity.CurrCombatHeroInfo.Fire_Injury -= Random.Range(2, 5);
  199. if (_combatHeroEntity.CurrCombatHeroInfo.Fire_Injury < 0)
  200. {
  201. _combatHeroEntity.CurrCombatHeroInfo.Fire_Injury = 0;
  202. }
  203. }
  204. }
  205. if (skillBasic.WuXingType.HasFlag(WuXingType.Water))
  206. {
  207. int odds = Random.Range(0, 100);
  208. if (odds < 50)
  209. {
  210. _combatHeroEntity.CurrCombatHeroInfo.Wood_Injury -= Random.Range(2, 5);
  211. if (_combatHeroEntity.CurrCombatHeroInfo.Wood_Injury < 0)
  212. {
  213. _combatHeroEntity.CurrCombatHeroInfo.Wood_Injury = 0;
  214. }
  215. }
  216. }
  217. if (skillBasic.WuXingType.HasFlag(WuXingType.Fire))
  218. {
  219. int odds = Random.Range(0, 100);
  220. if (odds < 50)
  221. {
  222. _combatHeroEntity.CurrCombatHeroInfo.Earth_Injury -= Random.Range(2, 5);
  223. if (_combatHeroEntity.CurrCombatHeroInfo.Earth_Injury < 0)
  224. {
  225. _combatHeroEntity.CurrCombatHeroInfo.Earth_Injury = 0;
  226. }
  227. }
  228. }
  229. if (skillBasic.WuXingType.HasFlag(WuXingType.Earth))
  230. {
  231. int odds = Random.Range(0, 100);
  232. if (odds < 50)
  233. {
  234. _combatHeroEntity.CurrCombatHeroInfo.Metal_Injury -= Random.Range(2, 5);
  235. if (_combatHeroEntity.CurrCombatHeroInfo.Metal_Injury < 0)
  236. {
  237. _combatHeroEntity.CurrCombatHeroInfo.Metal_Injury = 0;
  238. }
  239. }
  240. }
  241. AddCommandSkill(skillBasic);
  242. AddUseGongFaEventData addUseGongFaEventData = AddUseGongFaEventData.Create();
  243. addUseGongFaEventData.SkillBasic = skillBasic;
  244. CombatEventManager.Instance.Dispatch(CombatEventType.AddUseGongFa, addUseGongFaEventData);
  245. // Debug.Log("旋转一圈");
  246. }
  247. }
  248. }
  249. }
  250. if (isKuoLiQuanKai)
  251. {
  252. qiankaiTime += t;
  253. if (qiankaiTime > 3)
  254. {
  255. isKuoLiQuanKai = false;
  256. qiankaiTime = 0;
  257. addChongNeng = 0;
  258. }
  259. }
  260. allMagic += t * addMaicSpeed;
  261. if (allMagic > 500)
  262. {
  263. allMagic = 500;
  264. }
  265. // if (currUseSkill == null && SkillCommands.Count <= 0)
  266. // {
  267. // while (_currUseQueueIndex < _skillQueue.Count && SkillCommands.Count <= 0)
  268. // {
  269. // SkillBasic skillBasic = _skillQueue[_currUseQueueIndex];
  270. // if (skillBasic.SelfSkillConfig.SkillType == 1)
  271. // {
  272. // if (skillBasic.IsCanUse())
  273. // {
  274. // AddCommandSkill(skillBasic);
  275. // }
  276. // }
  277. //
  278. // _currUseQueueIndex++;
  279. // }
  280. // }
  281. // if (_currUseQueueIndex >= _skillQueue.Count)
  282. // {
  283. // StartPolling();
  284. // }
  285. }
  286. public void SetNormalAttCd()
  287. {
  288. // if (NormalAttack == null)
  289. // {
  290. // return;
  291. // }
  292. //
  293. // string timeLineName = "attack";
  294. // float maxTime = _combatHeroEntity.combatHeroTimeLineControl.TimeLineData.GetTimeLineEventLogicGroupForTime(
  295. // timeLineName, null);
  296. // float attackSpeed = _combatHeroEntity.CurrCombatHeroInfo.attSpeed.Value;
  297. // float cd = 1.0f / attackSpeed;
  298. // float attSpeed = (float)1;
  299. // if (cd < maxTime)
  300. // {
  301. // attSpeed = maxTime / cd;
  302. // }
  303. //
  304. // NormalAttSpeedScale = attSpeed;
  305. // // Debug.Log(NormalAttSpeedScale);
  306. // NormalAttCd = cd;
  307. }
  308. public virtual void Dispose()
  309. {
  310. _combatHeroEntity = null;
  311. currUseSkill = null;
  312. }
  313. public virtual void ProDormancyObj()
  314. {
  315. for (int i = 0; i < allSkill.size; i++)
  316. {
  317. SkillBasic skillBasic = allSkill[i];
  318. CObjectPool.Instance.Recycle(skillBasic);
  319. }
  320. allSkill.Clear();
  321. SkillCommands.Clear();
  322. }
  323. }
  324. }