Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
                }
            }
        }