private AiData_Npc_BossHulun GetAiData(NpcInfo npc) { AiData_Npc_BossHulun data = npc.GetAiStateInfo().AiDatas.GetData <AiData_Npc_BossHulun>(); if (null == data) { data = new AiData_Npc_BossHulun(); npc.GetAiStateInfo().AiDatas.AddData(data); } return(data); }
private void PursuitHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (npc.IsDead()) { npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); return; } NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_Npc_BossHulun data = GetAiData(npc); if (null != data) { CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target); if (null != target) { if (npc.IsUnderControl()) { data.ControlTime += deltaTime; if (data.ControlTime > m_MaxControlTime && npc.CanDisControl()) { NotifyNpcAddImpact(npc, m_SuperArmorImpactId); data.ControlTime = 0; NotifyNpcSkill(npc, 380308); } } float dist = (float)npc.GetActualProperty().AttackRange; float distGoHome = (float)npc.GohomeRange; Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); float powDist = Geometry.DistanceSquare(srcPos, targetPos); float powDistToHome = Geometry.DistanceSquare(srcPos, info.HomePos); // 遇敌是播放特效, 逗留两秒。 if (data.WaitTime <= m_ResponseTime) { if (!data.HasMeetEnemy) { NotifyNpcMeetEnemy(npc, Animation_Type.AT_Attack); data.HasMeetEnemy = true; } TrySeeTarget(npc, target); data.WaitTime += deltaTime; return; } if (npc.GetSkillStateInfo().IsSkillActivated()) { SkillInfo curSkill = npc.GetSkillStateInfo().GetCurSkillInfo(); if (null != curSkill && curSkill.SkillId == data.ChaseTargetSkill) { NotifyNpcRun(npc); AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, deltaTime, true, this); data.IsUsingChaseSkill = true; } return; } else if (data.IsUsingChaseSkill) { npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); data.IsUsingChaseSkill = false; } if (1 == data.CurStage) { if (npc.Hp < npc.GetActualProperty().HpMax *data.StageTwoLimit) { data.CurStage = 2; NotifyNpcSkill(npc, data.EnterStageTwoSkill); data.CurSkillCombo = null; data.CurSkillComboIndex = 0; return; } else { if (null == data.CurSkillCombo) { data.CurSkillCombo = data.m_StageOneSkillCombo; data.CurSkillComboIndex = 0; } } } else if (2 == data.CurStage) { if (npc.Hp < npc.GetActualProperty().HpMax *data.StageThreeLimit) { data.CurStage = 3; NotifyNpcSkill(npc, data.EnterStageTwoSkill); data.CurSkillCombo = null; data.CurSkillComboIndex = 0; return; } else { if (null == data.CurSkillCombo) { data.CurSkillCombo = data.m_StageTwoSkillCombo; data.CurSkillComboIndex = 0; } } } else if (3 == data.CurStage) { if (null == data.CurSkillCombo) { data.CurSkillCombo = data.m_StageThreeSkillCombo; data.CurSkillComboIndex = 0; } } if (null != data.CurSkillCombo) { if (data.CurSkillCombo.Length > data.CurSkillComboIndex) { if (TryCastSkill(npc, data.CurSkillCombo[data.CurSkillComboIndex], target)) { data.CurSkillComboIndex = data.CurSkillComboIndex + 1; return; } } else { data.CurSkillCombo = null; data.CurSkillComboIndex = 0; } } // 大于攻击距离 跑向目标 info.Time += deltaTime; if (info.Time > m_IntervalTime) { NotifyNpcRun(npc); info.Time = 0; AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this); } } else { NotifyNpcTargetChange(npc); npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); info.Time = 0; ChangeToState(npc, (int)AiStateId.Idle); } } }