using System.Collections.Generic; using Common.Utility.CombatEvent; using Fort23.Core; using GameLogic.Combat.Hero; using GameLogic.Combat.Hero.State; using UnityEngine; using Utility; namespace GameLogic.Combat.CombatTool { /// /// 法宝战斗场景 /// public class MagicWeaponCombatSence { private BetterList _enemyMagicWeaponList = new BetterList(); private BetterList _playerMagicWeaponList = new BetterList(); /// /// 战斗包围盒 minX miny maxx maxy /// public Vector4 combatBox; /// /// 我方法宝入场点 /// public Vector3 myEnterCombatPos; /// /// 地方法宝入场点 /// public Vector3 enemyEnterCombatPos; private Map magicWeaponCollisionInfoList = new Map(); private int MagicWeaponCollisionID; public void CloseSecene() { magicWeaponCollisionInfoList.Clear(); for (int i = 0; i < _enemyMagicWeaponList.Count; i++) { _enemyMagicWeaponList[i].CombatAIBasic.ChangeState(CombatHeroStateType.XiuMian); } for (int i = 0; i < _playerMagicWeaponList.Count; i++) { _playerMagicWeaponList[i].CombatAIBasic.ChangeState(CombatHeroStateType.XiuMian); } _playerMagicWeaponList.Clear(); _enemyMagicWeaponList.Clear(); } public void Init() { CombatEventManager.Instance.AddEventListener(CombatEventType.MagicWeaponDie, MagicWeaponDie); } private void MagicWeaponDie(IEventData iEventData) { HeroDieEventData heroDieEventData = iEventData as HeroDieEventData; CombatMagicWeaponEntity combatMagicWeaponEntity = heroDieEventData.combatHeroEntity as CombatMagicWeaponEntity; _enemyMagicWeaponList.Remove(combatMagicWeaponEntity); _playerMagicWeaponList.Remove(combatMagicWeaponEntity); RemoveCollisionMagicWeapon(combatMagicWeaponEntity.MagicWeaponCollisionId); } public void SetMagicWeaponCombatSence(Vector3 myHeroPos, Vector3 fangXiang) { myEnterCombatPos = myHeroPos + fangXiang * 2 + new Vector3(0, 10, 0); enemyEnterCombatPos = myHeroPos + fangXiang * 18 + new Vector3(0, 10, 0); } /// /// 将法宝添加导战斗场景 /// /// public void AddMagicWeaponToSence(CombatMagicWeaponEntity combatMagicWeaponEntity) { if (combatMagicWeaponEntity.IsEnemy) { _enemyMagicWeaponList.Add(combatMagicWeaponEntity); combatMagicWeaponEntity.useIndex = _enemyMagicWeaponList.Count; } else { _playerMagicWeaponList.Add(combatMagicWeaponEntity); combatMagicWeaponEntity.useIndex = _playerMagicWeaponList.Count; } FindCollidingTarget(combatMagicWeaponEntity); combatMagicWeaponEntity.CombatAIBasic.ChangeState(CombatHeroStateType.Active); } public void TriggerMagicWeapon(CombatMagicWeaponEntity a, CombatMagicWeaponEntity b) { } public void Update(float t) { // for (int i = 0; i < _enemyMagicWeaponList.Count; i++) // { // _enemyMagicWeaponList[i].Update(t); // } // // for (int i = 0; i < _playerMagicWeaponList.Count; i++) // { // _playerMagicWeaponList[i].Update(t); // } for (magicWeaponCollisionInfoList.Begin(); magicWeaponCollisionInfoList.Next();) { magicWeaponCollisionInfoList.Value.Update(t); } } public MagicWeaponCollisionInfo FindMagicWeaponCollisionInfo(int id) { if (magicWeaponCollisionInfoList.TryGetValue(id, out var info)) { return info; } return null; } private void FindCollidingTarget(CombatMagicWeaponEntity combatMagicWeaponEntity) { bool isEnemy = combatMagicWeaponEntity.IsEnemy; BetterList magicWeaponList = isEnemy ? _playerMagicWeaponList : _enemyMagicWeaponList; if (magicWeaponList == null) { return; } List nullTarget = new List(); for (int i = 0; i < magicWeaponList.Count; i++) { if (magicWeaponList[i].CombatAIBasic.stateControl.CurrStateName != CombatHeroStateType.idle && magicWeaponList[i].CombatAIBasic.stateControl.CurrStateName != CombatHeroStateType.Active) { continue; } // if (magicWeaponList[i].CollidingTarget == combatMagicWeaponEntity) // { // return magicWeaponList[i]; // } if (magicWeaponList[i].MagicWeaponCollisionId < 0) { nullTarget.Add(magicWeaponList[i]); } } if (nullTarget.Count > 0) { int index = CombatCalculateTool.Instance.GetOdd(0, nullTarget.Count); CombatMagicWeaponEntity target = nullTarget[index]; MagicWeaponCollisionInfo magicWeaponCollisionInfo = CObjectPool.Instance.Fetch(); magicWeaponCollisionInfo.Init(combatMagicWeaponEntity, target, MagicWeaponCollisionID); magicWeaponCollisionInfoList.Add(MagicWeaponCollisionID, magicWeaponCollisionInfo); MagicWeaponCollisionID++; } return; } public void RemoveCollisionMagicWeapon(int id) { magicWeaponCollisionInfoList.Remove(id, out var collisionInfo); if (collisionInfo != null) { collisionInfo.Finish(); CObjectPool.Instance.Recycle(collisionInfo); } } public void RemoveCollisionMagicWeapon(MagicWeaponCollisionInfo collisionInfo) { magicWeaponCollisionInfoList.Remove(collisionInfo.id); collisionInfo.Finish(); CObjectPool.Instance.Recycle(collisionInfo); } } }