using UnityEngine;
|
|
public class AI_BossFMT : SampleAI
|
{
|
public AI_BossFMT(GA_NpcClientFightBoss owner, Vector3 bornPosition)
|
: base(owner, bornPosition)
|
{
|
BornPos = bornPosition;
|
|
m_SleepTime = 2f;
|
}
|
|
protected override void OnUpdate()
|
{
|
base.OnUpdate();
|
|
m_Owner.SelectTarget = PlayerDatas.Instance.hero;
|
|
if (m_Owner.SelectTarget == null)
|
{
|
return;
|
}
|
|
// 攻击间隔中
|
if (Time.time - m_LastAttackTime
|
< (1f / m_Owner.ActorInfo.atkSpeed) * .8f)
|
{
|
return;
|
}
|
|
Skill _skill = m_Owner.SkillMgr.CurCastSkill;
|
|
// 判断主角当前是否有技能尚未释放完毕
|
if (_skill != null)
|
{
|
if (!_skill.SkillCompelete)
|
{
|
return;
|
}
|
|
if (m_Owner.SkillMgr.DoingPrepareSkill)
|
{
|
return;
|
}
|
}
|
|
_skill = m_Owner.SkillMgr.Get(10016);
|
|
// 判断技能范围, 不在可释放范围需要移动至目标
|
float _compareDist = .5f + m_Owner.NpcConfig.ModelRadius;
|
float _compareDistSqrt = _compareDist * _compareDist;
|
|
// 计算当前和目标的距离
|
float _currentDistSqrt = MathUtility.DistanceSqrtXZ(m_Owner.Pos, m_Owner.SelectTarget.Pos);
|
// 比较距离
|
if (_currentDistSqrt >= _compareDistSqrt)
|
{
|
// 移动至目标
|
m_Owner.MoveToTarget(m_Owner.SelectTarget, _compareDist);
|
|
return;
|
}
|
|
Vector3 _forward = MathUtility.ForwardXZ(m_Owner.SelectTarget.Pos, m_Owner.Pos);
|
m_Owner.destForward = m_Owner.Forward = _forward;
|
|
m_Owner.Play(GAStaticDefine.State_Attack1Hash);
|
m_Owner.SkillMgr.CastSkill(m_Owner.ServerInstID, _skill.id);
|
|
ulong hurtValue = 0;
|
byte attackType = 0;
|
|
AttackHandler.CalculateDamage(m_Owner, m_Owner.SelectTarget as GActorFight,
|
_skill,
|
0,
|
ref hurtValue, ref attackType);
|
|
|
if (ClientDungeonStageUtility.isClientDungeon)
|
{
|
// hurtValue = int(dMaxHP*0.01*(1+atkSkillPer/10000.0))
|
hurtValue = (ulong)Mathf.Ceil(PlayerDatas.Instance.extersion.MaxHP * .01f * (1 + m_Owner.NpcConfig.PoisionAtk * Constants.F_DELTA));
|
if (m_Owner.SelectTarget.ActorInfo.Hp <= hurtValue)
|
{
|
hurtValue = 0;
|
}
|
if (hurtValue != 0)
|
{
|
if (!ArenaManager.isArenaPK)
|
{
|
var _p = new CB40E_tagCMRoleLostHP();
|
_p.LostHP = (uint)(hurtValue % Constants.ExpPointValue);
|
_p.LostHPEx = (uint)(hurtValue / Constants.ExpPointValue);
|
GameNetSystem.Instance.SendInfo(_p);
|
}
|
}
|
}
|
|
AttackHandler.HurtObjs _hurtObject = new AttackHandler.HurtObjs
|
{
|
AttackType = attackType,
|
clientInstID = m_Owner.SelectTarget.ClientInstID,
|
CurHP = m_Owner.SelectTarget.ActorInfo.Hp,
|
HurtHP = hurtValue,
|
RealHurtHP = hurtValue,
|
ObjID = m_Owner.SelectTarget.ServerInstID,
|
ObjType = (byte)m_Owner.SelectTarget.ActorType
|
};
|
|
_skill.hurtClientList.Add(_hurtObject);
|
|
m_Owner.StartCantAtkedRotate();
|
|
m_LastAttackTime = Time.time;
|
}
|
|
|
}
|