using Common.Utility.CombatEvent;
using Core.State;
using Fort23.Core;
using GameLogic.Combat.CombatState;
using GameLogic.Combat.CombatTool;
using GameLogic.Combat.Hero.State;
using GameLogic.Combat.Hero.SubStatus;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;
using UnityEngine;
namespace GameLogic.Combat.Hero
{
public class CombatHeroAi : CombatAIBasic
{
// public NavMeshObstacle NavMeshObstacle;
protected CombatHeroEntity _combatHeroEntity
{
get { return _showBaiscEntity as CombatHeroEntity; }
}
protected float _r = 5;
public bool isAlert;
///
/// 当前聚焦的目标
///
public override IHero currFocusTarget
{
get { return _currFocusTarget; }
set
{
CombatHeroTargetAlterEventData combatHeroTargetAlterEventData = CombatHeroTargetAlterEventData.Create();
combatHeroTargetAlterEventData.combatHeroEntity = _combatHeroEntity;
combatHeroTargetAlterEventData.targetCombatHeroEntity = value;
combatHeroTargetAlterEventData.lasetCombatHeroEntity = _currFocusTarget;
CombatEventManager.Instance.Dispatch(CombatEventType.TargetAlter, combatHeroTargetAlterEventData);
_currFocusTarget = value;
}
}
private BetterList _areaList = new BetterList();
private BetterList _HindAreaList = new BetterList();
private float _t;
public GameObject[] AreaList
{
get { return _areaList.ToArray(); }
}
protected override void ProInit()
{
CombatEventManager.Instance.AddEventListener(CombatEventType.AlertTrigger, AlertTrigger);
}
protected void AlertTrigger(IEventData iEventData)
{
AlertTriggerEventData alertTriggerEventData = iEventData as AlertTriggerEventData;
if (alertTriggerEventData.combatHeroEntity == _combatHeroEntity)
{
if (alertTriggerEventData.isTrigger && !_areaList.Contains(alertTriggerEventData.triggerObject))
{
_areaList.Add(alertTriggerEventData.triggerObject);
}
else if (!alertTriggerEventData.isTrigger)
{
_areaList.Remove(alertTriggerEventData.triggerObject);
_HindAreaList.Remove(alertTriggerEventData.triggerObject);
}
}
}
protected override void ProInitState()
{
stateControl.AddState(CombatHeroStateType.idle, new CombatHeroIdleState(_combatHeroEntity));
stateControl.AddState(CombatHeroStateType.move, new CombatHeroMoveState(_combatHeroEntity));
stateControl.AddState(CombatHeroStateType.att, new CombatHeroAttState(_combatHeroEntity));
stateControl.AddState(CombatHeroStateType.dile, new CombatHeroDieState(_combatHeroEntity));
stateControl.AddState(CombatHeroStateType.rolling, new CombatHeroRollingState(_combatHeroEntity));
stateControl.AddState(CombatHeroStateType.followMove, new CombatHeroFollowMoveState(_combatHeroEntity));
stateControl.AddState(CombatHeroStateType.followIdle, new CombatHeroFollowIdleState(_combatHeroEntity));
stateControl.AddState(CombatHeroStateType.NullState, new CombatHeroNullState(_combatHeroEntity));
stateControl.AddState(CombatHeroStateType.Active, new CombatHeroActiveState(_combatHeroEntity));
stateControl.AddState(CombatHeroStateType.XiuMian, new CombatHeroXiuMianState(_combatHeroEntity));
stateControl.AddState(CombatHeroStateType.Resurrection, new CombatResurrectionState(_combatHeroEntity));
stateControl.AddState(CombatHeroStateType.PickUp, new CombatHeroPickUpState(_combatHeroEntity));
stateControl.AddState(CombatHeroStateType.Flight, new CombatHeroFlightState(_combatHeroEntity));
stateControl.AddState(CombatHeroStateType.Disappear, new CombatHeroDisappearState(_combatHeroEntity));
}
public override void Update(float t)
{
if (CombatController.currActiveCombat.isStopAi)
{
if (stateControl.CurrStateName.Equals(CombatHeroStateType.move))
{
stateControl.ChangeState(CombatHeroStateType.idle);
}
return;
}
for (int i = 0; i < _areaList.Count; i++)
{
if (!_areaList[i].activeSelf)
{
_HindAreaList.Remove(_areaList[i]);
_areaList.RemoveAt(i);
i--;
}
}
for (int i = 0; i < _subStatusList.Count; i++)
{
SubStatusBasic subStatusBasic = _subStatusList[i];
string s = subStatusBasic.IsGetStateName();
if (!string.IsNullOrEmpty(s))
{
stateControl.ChangeState(s);
}
_subStatusList[i].Update(t);
}
if (CombatController.currActiveCombat.IsFightState)
{
if (currFocusTarget == null || currFocusTarget.isDie ||
(currFocusTarget is BannerHero && !_combatHeroEntity.IsEnemy))
{
CombatHeroEntity[] allHero =
CombatController.currActiveCombat.CombatHeroController.GetHero(!_combatHeroEntity.IsEnemy);
IHero minDistanceHero = FindMinDixtance(allHero);
currFocusTarget = minDistanceHero;
if (!_combatHeroEntity.IsEnemy && currFocusTarget == null)
{
currFocusTarget = CombatController.currActiveCombat.CombatTypeBasic.currBannerHero;
}
}
}
else
{
currFocusTarget = null;
}
stateControl.Update(t);
if (currFocusTarget != null && CurrState != null && CurrState.IsUpdateLockTarget() &&
!_combatHeroEntity.isDie && !isAlert)
{
Vector3 nextPos = currFocusTarget.dotPos;
Vector3 p = nextPos - _combatHeroEntity.dotPos;
if (p.sqrMagnitude > 0.00001)
{
_combatHeroEntity.combatHeroGameObject.rotation = Quaternion.Lerp(
_combatHeroEntity.combatHeroGameObject.rotation, Quaternion.LookRotation(p.normalized),
0.5f);
}
}
ProUpdate();
if (currFocusTarget != null)
{
_combatHeroEntity.GameObject.transform.rotation =
Quaternion.LookRotation(currFocusTarget.dotPos - _combatHeroEntity.dotPos);
}
}
protected IHero FindMinDixtance(CombatHeroEntity[] allHero)
{
IHero minDistanceHero = null;
if (allHero == null)
{
return null;
}
float minDistance = float.MaxValue;
for (int i = 0; i < allHero.Length; i++)
{
CombatHeroEntity hero = allHero[i];
if (hero.GetMainHotPoin() == null)
{
continue;
}
float distance = Vector3.SqrMagnitude(hero.combatHeroGameObject.position -
_combatHeroEntity.combatHeroGameObject.position);
if (distance < minDistance)
{
// if (!_combatHeroEntity.IsEnemy || distance < _combatHeroEntity.CurrCombatHeroInfo.maxDisTo + 100)
{
minDistance = distance;
minDistanceHero = hero;
}
}
}
return minDistanceHero;
}
protected override void ProDispose()
{
CombatEventManager.Instance.RemoveEventListener(CombatEventType.AlertTrigger, AlertTrigger);
}
}
}