CombatHeroController.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. using System;
  2. using System.Collections.Generic;
  3. using Common.Utility.CombatEvent;
  4. using Core.Utility;
  5. using Excel2Json;
  6. using Fort23.Core;
  7. using Fort23.UTool;
  8. using GameLogic.Combat.Hero;
  9. using UnityEngine;
  10. using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface;
  11. namespace GameLogic.Combat.CombatTool
  12. {
  13. public class CombatHeroController : IDisposable
  14. {
  15. private BetterList<CombatHeroEntity> myHero = new BetterList<CombatHeroEntity>();
  16. private BetterList<CombatHeroEntity> enemyHero = new BetterList<CombatHeroEntity>();
  17. private BetterList<ILifetCycleHitPoint> myHeroHitPoint = new BetterList<ILifetCycleHitPoint>();
  18. private BetterList<ILifetCycleHitPoint> enemyHeroHitPoint = new BetterList<ILifetCycleHitPoint>();
  19. protected CombatController combatController;
  20. private BetterList<CombatHeroEntity> heroDie = new BetterList<CombatHeroEntity>();
  21. private BetterList<CombatHeroEntity> heroDispose = new BetterList<CombatHeroEntity>();
  22. // public CombatHeroEntity playerHeroEntity;
  23. public Vector3[] followMovePos = new Vector3[]
  24. {
  25. new Vector3(0, 0, 0),
  26. new Vector3(-1.5f, 0, -1f),
  27. new Vector3(1.5f, 0, -1f),
  28. new Vector3(0, 0, -2.5f),
  29. };
  30. public CombatHeroEntity followTarget;
  31. public async CTask Init(CombatController combatController)
  32. {
  33. this.combatController = combatController;
  34. CombatEventManager.Instance.AddEventListener(CombatEventType.UseSkill, CombatUseSkillEventData);
  35. CombatHeroInfo combatHeroInfo = new CombatHeroInfo();
  36. combatHeroInfo.attack = (EncryptionLong)10;
  37. }
  38. public void RemoveDieHero(CombatHeroEntity combatHeroEntity)
  39. {
  40. heroDie.Remove(combatHeroEntity);
  41. if (!heroDispose.Contains(combatHeroEntity))
  42. {
  43. combatHeroEntity.DisTime = 0;
  44. heroDispose.Add(combatHeroEntity);
  45. }
  46. }
  47. public async CTask<SummonCombatHeroEntity> SummonHero(CombatHeroInfo combatHeroInfo,
  48. CombatHeroEntity ownerEntity, Vector3 pos, float time, System.Action<SummonCombatHeroEntity> summonCallBack)
  49. {
  50. SummonCombatHeroEntity summonCombatHeroEntity = new SummonCombatHeroEntity();
  51. summonCombatHeroEntity.IsEnemy = ownerEntity.IsEnemy;
  52. summonCombatHeroEntity.ownerEntity = ownerEntity;
  53. summonCombatHeroEntity.Time = time;
  54. summonCombatHeroEntity.isCreateHeroHp = true;
  55. await summonCombatHeroEntity.Init(new CombatHeroAi(), combatHeroInfo, pos,
  56. delegate(CombatHeroEntity entity)
  57. {
  58. CombatController.currActiveCombat.CombatHeroController.AddHero(entity);
  59. summonCallBack?.Invoke(summonCombatHeroEntity);
  60. });
  61. return summonCombatHeroEntity;
  62. }
  63. /// <summary>
  64. /// 复活死亡的英雄
  65. /// </summary>
  66. public void ResurrectionDieHero(CombatHeroEntity combatHeroEntity)
  67. {
  68. if (!combatHeroEntity.isDie)
  69. {
  70. return;
  71. }
  72. if (combatHeroEntity.heroDieNodeId !=
  73. CombatController.currActiveCombat.CombatTypeBasic.allWinNodeCount)
  74. {
  75. Vector3 pos = CombatController.currActiveCombat.CombatTypeBasic.currBannerHero.dotPos;
  76. if (CombatController.currActiveCombat.CombatHeroController.followTarget != null)
  77. {
  78. pos = CombatController.currActiveCombat.CombatHeroController.followTarget.dotPos +
  79. new Vector3(1, 0, 0);
  80. }
  81. combatHeroEntity.combatHeroGameObject.SetPosition(pos);
  82. }
  83. heroDie.Remove(combatHeroEntity);
  84. combatHeroEntity.CurrCombatHeroInfo.hp = combatHeroEntity.MaxCombatHeroInfo.hp;
  85. AddHero(combatHeroEntity);
  86. combatHeroEntity.HeroResurrection();
  87. }
  88. public void Update(float t)
  89. {
  90. for (int i = 0; i < myHero.Count; i++)
  91. {
  92. myHero[i].Update(t);
  93. }
  94. for (int i = 0; i < enemyHero.Count; i++)
  95. {
  96. enemyHero[i].Update(t);
  97. }
  98. for (int i = 0; i < heroDie.Count; i++)
  99. {
  100. heroDie[i].Update(t);
  101. }
  102. }
  103. public void LateUpdate(float t)
  104. {
  105. for (int i = 0; i < heroDispose.Count; i++)
  106. {
  107. CombatHeroEntity combatHeroEntity = heroDispose[i];
  108. combatHeroEntity.Dispose();
  109. combatHeroEntity.DisTime += t;
  110. if (combatHeroEntity.DisTime > 10)
  111. {
  112. CObjectPool.Instance.Recycle(combatHeroEntity);
  113. heroDispose.RemoveAt(i);
  114. i--;
  115. }
  116. }
  117. }
  118. public void AddHeroDie(CombatHeroEntity hero)
  119. {
  120. heroDie.Add(hero);
  121. }
  122. public void AddHero(CombatHeroEntity hero)
  123. {
  124. if (hero.IsEnemy)
  125. {
  126. enemyHero.Add(hero);
  127. }
  128. else
  129. {
  130. myHero.Add(hero);
  131. }
  132. }
  133. public void FindNumberMinHero()
  134. {
  135. int min = 9999;
  136. followTarget = null;
  137. for (int i = 0; i < myHero.Count; i++)
  138. {
  139. CombatHeroEntity c = myHero[i];
  140. if (c.number < min)
  141. {
  142. min = c.number;
  143. followTarget = c;
  144. }
  145. }
  146. }
  147. public void SetFollowTarget()
  148. {
  149. FindNumberMinHero();
  150. for (int i = 0; i < myHero.Count; i++)
  151. {
  152. CombatHeroEntity c = myHero[i];
  153. if (c != followTarget)
  154. {
  155. c.isFollowState = true;
  156. c.CombatAIBasic.ChangeState(CombatHeroStateType.followIdle);
  157. }
  158. }
  159. }
  160. public void SetHpToMaxHp()
  161. {
  162. for (int i = 0; i < myHero.Count; i++)
  163. {
  164. CombatHeroEntity c = myHero[i];
  165. if (c.isDie)
  166. {
  167. continue;
  168. }
  169. c.CurrCombatHeroInfo.hp = c.MaxCombatHeroInfo.hp;
  170. HeroHpUpdateEventData heroHpUpdateEventData = HeroHpUpdateEventData.Create();
  171. heroHpUpdateEventData.combatHeroEntity = c;
  172. CombatEventManager.Instance.Dispatch(CombatEventType.HeroHpUpdate, heroHpUpdateEventData);
  173. }
  174. }
  175. private void CombatUseSkillEventData(IEventData iEventData)
  176. {
  177. CombatUseSkillEventData combatUseSkillEventData = iEventData as CombatUseSkillEventData;
  178. if (combatUseSkillEventData.useSkill.SelfSkillConfig.SkillType == 1)
  179. {
  180. for (int i = 0; i < myHero.Count; i++)
  181. {
  182. CombatHeroEntity c = myHero[i];
  183. if (c.isFollowState)
  184. {
  185. c.isFollowState = false;
  186. c.CombatAIBasic.ChangeState(CombatHeroStateType.idle);
  187. }
  188. }
  189. }
  190. }
  191. public void RemoveHero(CombatHeroEntity hero)
  192. {
  193. if (hero.IsEnemy)
  194. {
  195. enemyHero.Remove(hero);
  196. }
  197. else
  198. {
  199. myHero.Remove(hero);
  200. }
  201. }
  202. public void AddHeroHitPoint(bool isEnemy, ILifetCycleHitPoint hitPoint)
  203. {
  204. if (isEnemy)
  205. {
  206. enemyHeroHitPoint.Add(hitPoint);
  207. }
  208. else
  209. {
  210. myHeroHitPoint.Add(hitPoint);
  211. }
  212. }
  213. public void RemoveHeroHitPoint(bool isEnemy, ILifetCycleHitPoint hitPoint)
  214. {
  215. if (isEnemy)
  216. {
  217. enemyHeroHitPoint.Remove(hitPoint);
  218. }
  219. else
  220. {
  221. myHeroHitPoint.Remove(hitPoint);
  222. }
  223. }
  224. public void Dispose()
  225. {
  226. for (int i = 0; i < myHero.Count; i++)
  227. {
  228. myHero[i].DisposeForOnetCombat();
  229. }
  230. for (int i = 0; i < enemyHero.Count; i++)
  231. {
  232. enemyHero[i].Dispose();
  233. }
  234. myHero.Clear();
  235. enemyHero.Clear();
  236. CombatEventManager.Instance.RemoveEventListener(CombatEventType.UseSkill, CombatUseSkillEventData);
  237. }
  238. public void CombatFinishDispose()
  239. {
  240. for (int i = 0; i < enemyHero.Count; i++)
  241. {
  242. enemyHero[i].Dispose();
  243. }
  244. enemyHero.Clear();
  245. CombatEventManager.Instance.RemoveEventListener(CombatEventType.UseSkill, CombatUseSkillEventData);
  246. }
  247. public Vector3 GetFollowPos(CombatHeroEntity combatHeroEntity)
  248. {
  249. int index = combatHeroEntity.number - followTarget.number;
  250. return followTarget.combatHeroGameObject.transform.TransformPoint((followMovePos[index]));
  251. // return followMovePos[index] + .dotPos;
  252. }
  253. public BetterList<CombatHeroEntity> GetHeroList(bool isEnemy)
  254. {
  255. if (isEnemy)
  256. {
  257. return enemyHero;
  258. }
  259. else
  260. {
  261. return myHero;
  262. }
  263. }
  264. public CombatHeroEntity[] GetHero(bool isEnemy)
  265. {
  266. if (isEnemy)
  267. {
  268. return enemyHero.ToArray();
  269. }
  270. else
  271. {
  272. return myHero.ToArray();
  273. }
  274. }
  275. public CombatHeroEntity GetHeroForId(int modelID)
  276. {
  277. if (myHero == null)
  278. {
  279. return null;
  280. }
  281. for (int i = 0; i < myHero.Count; i++)
  282. {
  283. if (myHero[i].CurrCombatHeroInfo.modelID == modelID)
  284. {
  285. return myHero[i];
  286. }
  287. }
  288. return null;
  289. }
  290. public CombatHeroEntity[] GetDieHero()
  291. {
  292. return heroDie.ToArray();
  293. }
  294. public ILifetCycleHitPoint[] GetHeroHitPoint(bool isEnemy)
  295. {
  296. if (isEnemy)
  297. {
  298. return enemyHeroHitPoint.ToArray();
  299. }
  300. else
  301. {
  302. return myHeroHitPoint.ToArray();
  303. }
  304. }
  305. }
  306. }