MagicWeaponCombatSence.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. using System.Collections.Generic;
  2. using Common.Utility.CombatEvent;
  3. using Fort23.Core;
  4. using GameLogic.Combat.Hero;
  5. using GameLogic.Combat.Hero.State;
  6. using UnityEngine;
  7. using Utility;
  8. namespace GameLogic.Combat.CombatTool
  9. {
  10. /// <summary>
  11. /// 法宝战斗场景
  12. /// </summary>
  13. public class MagicWeaponCombatSence
  14. {
  15. private BetterList<CombatMagicWeaponEntity> _enemyMagicWeaponList = new BetterList<CombatMagicWeaponEntity>();
  16. private BetterList<CombatMagicWeaponEntity> _playerMagicWeaponList = new BetterList<CombatMagicWeaponEntity>();
  17. /// <summary>
  18. /// 战斗包围盒 minX miny maxx maxy
  19. /// </summary>
  20. public Vector4 combatBox;
  21. /// <summary>
  22. /// 我方法宝入场点
  23. /// </summary>
  24. public Vector3 myEnterCombatPos;
  25. /// <summary>
  26. /// 地方法宝入场点
  27. /// </summary>
  28. public Vector3 enemyEnterCombatPos;
  29. private Map<int, MagicWeaponCollisionInfo> magicWeaponCollisionInfoList =
  30. new Map<int, MagicWeaponCollisionInfo>();
  31. private int MagicWeaponCollisionID;
  32. public void CloseSecene()
  33. {
  34. for (magicWeaponCollisionInfoList.Begin(); magicWeaponCollisionInfoList.Next();)
  35. {
  36. magicWeaponCollisionInfoList.Value.Dispose();
  37. }
  38. magicWeaponCollisionInfoList.Clear();
  39. for (int i = 0; i < _enemyMagicWeaponList.Count; i++)
  40. {
  41. _enemyMagicWeaponList[i].CombatAIBasic.ChangeState(CombatHeroStateType.XiuMian);
  42. }
  43. for (int i = 0; i < _playerMagicWeaponList.Count; i++)
  44. {
  45. _playerMagicWeaponList[i].CombatAIBasic.ChangeState(CombatHeroStateType.XiuMian);
  46. }
  47. _playerMagicWeaponList.Clear();
  48. _enemyMagicWeaponList.Clear();
  49. }
  50. public void Init()
  51. {
  52. CombatEventManager.Instance.AddEventListener(CombatEventType.MagicWeaponDie, MagicWeaponDie);
  53. CombatEventManager.Instance.AddEventListener(CombatEventType.HeroDie, HeroDie);
  54. }
  55. private void HeroDie(IEventData iEventData)
  56. {
  57. HeroDieEventData heroDieEventData = iEventData as HeroDieEventData;
  58. CombatMagicWeaponEntity combatMagicWeaponEntity =
  59. heroDieEventData.combatHeroEntity as CombatMagicWeaponEntity;
  60. if (combatMagicWeaponEntity != null)
  61. {
  62. return;
  63. }
  64. if (heroDieEventData.combatHeroEntity.IsEnemy)
  65. {
  66. for (int i = 0; i < _enemyMagicWeaponList.Count; i++)
  67. {
  68. if (_enemyMagicWeaponList[i].RootMagicWeaponControl.combatHeroEntity ==
  69. heroDieEventData.combatHeroEntity)
  70. {
  71. _enemyMagicWeaponList.RemoveAt(i);
  72. i--;
  73. }
  74. }
  75. }
  76. else
  77. {
  78. for (int i = 0; i < _playerMagicWeaponList.Count; i++)
  79. {
  80. if (_playerMagicWeaponList[i].RootMagicWeaponControl.combatHeroEntity ==
  81. heroDieEventData.combatHeroEntity)
  82. {
  83. _playerMagicWeaponList.RemoveAt(i);
  84. i--;
  85. }
  86. }
  87. }
  88. }
  89. private void MagicWeaponDie(IEventData iEventData)
  90. {
  91. HeroDieEventData heroDieEventData = iEventData as HeroDieEventData;
  92. CombatMagicWeaponEntity combatMagicWeaponEntity =
  93. heroDieEventData.combatHeroEntity as CombatMagicWeaponEntity;
  94. _enemyMagicWeaponList.Remove(combatMagicWeaponEntity);
  95. _playerMagicWeaponList.Remove(combatMagicWeaponEntity);
  96. RemoveCollisionMagicWeapon(combatMagicWeaponEntity.MagicWeaponCollisionId);
  97. }
  98. public void SetMagicWeaponCombatSence(Vector3 myHeroPos, Vector3 fangXiang)
  99. {
  100. myEnterCombatPos = myHeroPos + fangXiang * 2 + new Vector3(0, 10, 0);
  101. enemyEnterCombatPos = myHeroPos + fangXiang * 18 + new Vector3(0, 10, 0);
  102. }
  103. /// <summary>
  104. /// 将法宝添加导战斗场景
  105. /// </summary>
  106. /// <param name="combatMagicWeaponEntity"></param>
  107. public void AddMagicWeaponToSence(CombatMagicWeaponEntity combatMagicWeaponEntity)
  108. {
  109. if (combatMagicWeaponEntity.IsEnemy)
  110. {
  111. _enemyMagicWeaponList.Add(combatMagicWeaponEntity);
  112. combatMagicWeaponEntity.useIndex = _enemyMagicWeaponList.Count;
  113. }
  114. else
  115. {
  116. _playerMagicWeaponList.Add(combatMagicWeaponEntity);
  117. combatMagicWeaponEntity.useIndex = _playerMagicWeaponList.Count;
  118. }
  119. FindCollidingTarget(combatMagicWeaponEntity);
  120. combatMagicWeaponEntity.CombatAIBasic.ChangeState(CombatHeroStateType.Active);
  121. }
  122. public void TriggerMagicWeapon(CombatMagicWeaponEntity a, CombatMagicWeaponEntity b)
  123. {
  124. }
  125. public void Update(float t)
  126. {
  127. // for (int i = 0; i < _enemyMagicWeaponList.Count; i++)
  128. // {
  129. // _enemyMagicWeaponList[i].Update(t);
  130. // }
  131. //
  132. // for (int i = 0; i < _playerMagicWeaponList.Count; i++)
  133. // {
  134. // _playerMagicWeaponList[i].Update(t);
  135. // }
  136. for (magicWeaponCollisionInfoList.Begin(); magicWeaponCollisionInfoList.Next();)
  137. {
  138. magicWeaponCollisionInfoList.Value.Update(t);
  139. }
  140. }
  141. public MagicWeaponCollisionInfo FindMagicWeaponCollisionInfo(int id)
  142. {
  143. if (magicWeaponCollisionInfoList.TryGetValue(id, out var info))
  144. {
  145. return info;
  146. }
  147. return null;
  148. }
  149. private void FindCollidingTarget(CombatMagicWeaponEntity combatMagicWeaponEntity)
  150. {
  151. if (combatMagicWeaponEntity.isMagicWeaponTreasureBook)
  152. {
  153. return;
  154. }
  155. bool isEnemy = combatMagicWeaponEntity.IsEnemy;
  156. BetterList<CombatMagicWeaponEntity> magicWeaponList =
  157. isEnemy ? _playerMagicWeaponList : _enemyMagicWeaponList;
  158. if (magicWeaponList == null)
  159. {
  160. return;
  161. }
  162. List<CombatMagicWeaponEntity> nullTarget = new List<CombatMagicWeaponEntity>();
  163. for (int i = 0; i < magicWeaponList.Count; i++)
  164. {
  165. if (magicWeaponList[i].CombatAIBasic.stateControl.CurrStateName != CombatHeroStateType.idle &&
  166. magicWeaponList[i].CombatAIBasic.stateControl.CurrStateName != CombatHeroStateType.Active)
  167. {
  168. continue;
  169. }
  170. // if (magicWeaponList[i].CollidingTarget == combatMagicWeaponEntity)
  171. // {
  172. // return magicWeaponList[i];
  173. // }
  174. if (magicWeaponList[i].isMagicWeaponTreasureBook)
  175. {
  176. continue;
  177. }
  178. if (magicWeaponList[i].MagicWeaponCollisionId < 0)
  179. {
  180. nullTarget.Add(magicWeaponList[i]);
  181. }
  182. }
  183. if (nullTarget.Count > 0)
  184. {
  185. int index = CombatCalculateTool.Instance.GetOdd(0, nullTarget.Count);
  186. CombatMagicWeaponEntity target = nullTarget[index];
  187. MagicWeaponCollisionInfo magicWeaponCollisionInfo =
  188. CObjectPool.Instance.Fetch<MagicWeaponCollisionInfo>();
  189. magicWeaponCollisionInfo.Init(combatMagicWeaponEntity, target, MagicWeaponCollisionID);
  190. magicWeaponCollisionInfoList.Add(MagicWeaponCollisionID, magicWeaponCollisionInfo);
  191. MagicWeaponCollisionID++;
  192. }
  193. return;
  194. }
  195. public void RemoveCollisionMagicWeapon(int id)
  196. {
  197. magicWeaponCollisionInfoList.Remove(id, out var collisionInfo);
  198. if (collisionInfo != null)
  199. {
  200. collisionInfo.Finish();
  201. CObjectPool.Instance.Recycle(collisionInfo);
  202. }
  203. }
  204. public void RemoveCollisionMagicWeapon(MagicWeaponCollisionInfo collisionInfo)
  205. {
  206. magicWeaponCollisionInfoList.Remove(collisionInfo.id);
  207. collisionInfo.Finish();
  208. CObjectPool.Instance.Recycle(collisionInfo);
  209. }
  210. }
  211. }