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);
}
}
}