Esempio n. 1
0
        private void GoHomeHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (!CanAiControl(npc))
            {
                npc.GetMovementStateInfo().IsMoving = false;
                return;
            }
            ChangeToState(npc, (int)AiStateId.Idle);
            NpcAiStateInfo info = npc.GetAiStateInfo();

            info.Time += deltaTime;
            if (info.Time > m_IntervalTime)
            {
                info.Time = 0;
                AiData_Demo_Melee data = GetAiData(npc);
                if (null != data)
                {
                    Vector3 targetPos     = info.HomePos;
                    Vector3 srcPos        = npc.GetMovementStateInfo().GetPosition3D();
                    float   powDistToHome = Geometry.DistanceSquare(srcPos, info.HomePos);
                    if (powDistToHome <= 1)
                    {
                        npc.GetMovementStateInfo().IsMoving = false;
                        info.Time = 0;
                        ChangeToState(npc, (int)AiStateId.Idle);
                    }
                    else
                    {
                        AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, 100, true, this);
                    }
                }
            }
        }
        private void HandleRunAction(NpcInfo npc, CharacterInfo target, long deltaTime)
        {
            if (npc.GetSkillStateInfo().IsSkillActivated())
            {
                return;
            }
            NpcAiStateInfo         info = npc.GetAiStateInfo();
            AiData_Npc_ActionDrive data = GetAiData(npc);

            if (null != data && null != target)
            {
                Vector3      targetPos    = target.GetMovementStateInfo().GetPosition3D();
                AiActionInfo aiActionInfo = data.ActiveAction;
                if (null != aiActionInfo)
                {
                    info.Time += deltaTime;
                    if (info.Time > m_IntervalTime)
                    {
                        info.Time = 0;
                        NotifyNpcRun(npc);
                        AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this);
                    }
                }
                if ((!IsAiActionSatify(npc, target, aiActionInfo) && aiActionInfo.Config.CanInterrupt) || aiActionInfo.IsTimeOut(TimeUtility.GetServerMilliseconds()))
                {
                    data.ActiveAction          = null;
                    aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds();
                }
            }
        }
Esempio n. 3
0
 public void Execute(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
 {
     if (npc.GetAIEnable())
     {
         NpcAiStateInfo npcAi = npc.GetAiStateInfo();
         if (npcAi.CommandQueue.Count <= 0)
         {
             int curState = npcAi.CurState;
             if (curState > (int)AiStateId.Invalid && curState < (int)AiStateId.MaxNum)
             {
                 NpcAiStateHandler handler;
                 if (m_Handlers.TryGetValue(curState, out handler))
                 {
                     if (null != handler)
                     {
                         handler(npc, aiCmdDispatcher, deltaTime);
                     }
                 }
                 else
                 {
                     LogSystem.Error("Illegal ai state: " + curState + " npc:" + npc.GetId());
                 }
             }
             else
             {
                 OnStateLogicInit(npc, aiCmdDispatcher, deltaTime);
                 ChangeToState(npc, (int)AiStateId.Idle);
             }
         }
         ExecuteCommandQueue(npc, deltaTime);
     }
 }
        private AiActionInfo GetFitAiAction(NpcInfo npc)
        {
            NpcAiStateInfo         info = npc.GetAiStateInfo();
            AiData_Npc_ActionDrive data = GetAiData(npc);

            if (null != data)
            {
                CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target);
                if (null != target)
                {
                    Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D();
                    Vector3 srcPos    = npc.GetMovementStateInfo().GetPosition3D();
                    float   dist      = Geometry.Distance(srcPos, targetPos);

                    for (int i = 0; i < data.Actions.Count; i++)
                    {
                        if (IsAiActionSatify(npc, target, data.Actions[i]))
                        {
                            return(data.Actions[i]);
                        }
                    }

                    /*
                     * foreach(AiActionInfo aiActionInfo in data.Actions){
                     * if(IsAiActionSatify(npc, target, aiActionInfo)){
                     * return aiActionInfo;
                     * }
                     * }*/
                }
            }
            return(null);
        }
        private void HandleTauntAction(NpcInfo npc, CharacterInfo target, long deltaTime)
        {
            if (npc.GetSkillStateInfo().IsSkillActivated())
            {
                return;
            }
            NpcAiStateInfo         info = npc.GetAiStateInfo();
            AiData_Npc_ActionDrive data = GetAiData(npc);

            if (null != data && null != target)
            {
                Vector3      targetPos    = target.GetMovementStateInfo().GetPosition3D();
                AiActionInfo aiActionInfo = data.ActiveAction;
                if (null != aiActionInfo)
                {
                    npc.GetMovementStateInfo().IsMoving = false;
                    npc.IsTaunt = true;
                    TrySeeTarget(npc, target);
                }
                if ((!IsAiActionSatify(npc, target, aiActionInfo) && aiActionInfo.Config.CanInterrupt) || aiActionInfo.IsTimeOut(TimeUtility.GetServerMilliseconds()))
                {
                    npc.IsTaunt                = false;
                    data.ActiveAction          = null;
                    aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds();
                }
            }
        }
        private void ActionDriveHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (npc.IsDead())
            {
                npc.GetMovementStateInfo().IsMoving = false;
                return;
            }
            NpcAiStateInfo         info = npc.GetAiStateInfo();
            AiData_Npc_ActionDrive data = GetAiData(npc);

            if (null != data)
            {
                CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target);
                if (null != target)
                {
                    Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D();
                    Vector3 srcPos    = npc.GetMovementStateInfo().GetPosition3D();
                    float   dist      = Geometry.Distance(srcPos, targetPos);
                    if (data.LastGfxState != npc.GfxStateFlag)
                    {
                        if (data.LastGfxState == (int)GfxCharacterState_Type.KnockDown && npc.GfxStateFlag == (int)GfxCharacterState_Type.GetUp)
                        {
                            // 起身
                            OnEvent(npc, (int)AiEventEnum.GET_UP, target, deltaTime);
                        }
                        data.LastGfxState = npc.GfxStateFlag;
                    }
                    if (npc.IsUnderControl())
                    {
                        data.ControlTime += deltaTime;
                        if (data.ControlTime > data.MaxControlTime && npc.CanDisControl())
                        {
                            data.ControlTime = 0;
                            OnEvent(npc, (int)AiEventEnum.CONTROL_TIME_OVERFLOW, target, deltaTime);
                        }
                        return;
                    }
                    ExecAiAction(npc, target, deltaTime);
                }
                else
                {
                    if (null != data.ActiveAction)
                    {
                        AiActionInfo aiActionInfo         = data.ActiveAction;
                        AiActionForceStopDelegate handler = GetAiActionForceStopHandler(aiActionInfo.Config.AiActionType);
                        if (null != handler)
                        {
                            handler(npc, target);
                        }
                    }
                    else
                    {
                        npc.GetMovementStateInfo().IsMoving = false;
                    }
                    ChangeToState(npc, (int)AiStateId.Pursuit);
                }
            }
        }
Esempio n. 7
0
        protected override void OnStateLogicInit(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            NpcAiStateInfo info = npc.GetAiStateInfo();

            info.Time = 0;
            npc.GetMovementStateInfo().IsMoving = false;
            info.HomePos = npc.GetMovementStateInfo().GetPosition3D();
            info.Target  = 0;
        }
        private void PursuitHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (!CanAiControl(npc))
            {
                npc.GetMovementStateInfo().IsMoving = false;
                return;
            }
            NpcAiStateInfo         info = npc.GetAiStateInfo();
            AiData_Npc_ActionDrive data = GetAiData(npc);

            if (null != data)
            {
                CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target);
                if (null != target)
                {
                    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 <= npc.MeetEnemyStayTime)
                    {
                        if (!data.HasMeetEnemy)
                        {
                            NotifyNpcMeetEnemy(npc, Animation_Type.AT_Attack);
                            data.HasMeetEnemy = true;
                        }
                        TrySeeTarget(npc, target);
                        data.WaitTime += deltaTime;
                        return;
                    }
                    // 走向目标1.5秒
                    if (data.MeetEnemyWalkTime < npc.MeetEnemyWalkTime)
                    {
                        data.MeetEnemyWalkTime += deltaTime;
                        NotifyNpcWalk(npc);
                        info.Time += deltaTime;
                        if (info.Time > m_IntervalTime)
                        {
                            info.Time = 0;
                            AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this);
                        }
                        return;
                    }
                    ChangeToState(npc, (int)AiStateId.ActionDrive);
                }
                else
                {
                    ChangeToState(npc, (int)AiStateId.Idle);
                }
            }
        }
        protected override void OnStateLogicInit(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            NpcAiStateInfo info = npc.GetAiStateInfo();

            info.Time = 0;
            npc.GetMovementStateInfo().IsMoving = false;
            info.Target = 0;
            BlackBoard_SmallMouse blackBoradInfo = GetBlackBorad(npc);

            blackBoradInfo.AddAliveNpc(npc.GetId());
        }
Esempio n. 10
0
        private void IdleHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (!CanAiControl(npc))
            {
                npc.GetMovementStateInfo().IsMoving = false;
                return;
            }
            NpcAiStateInfo info = npc.GetAiStateInfo();

            info.Time += deltaTime;
            if (info.Time > 100)
            {
                info.Time = 0;
                if (GetAiData(npc).HasPatrolData)
                {
                    npc.GetMovementStateInfo().IsMoving = false;
                    ChangeToState(npc, (int)AiStateId.PatrolCommand);
                }
                else
                {
                    CharacterInfo target = null;
                    if (info.IsExternalTarget)
                    {
                        target = AiLogicUtility.GetSeeingLivingCharacterInfoHelper(npc, info.Target);
                        if (null == target)
                        {
                            target = AiLogicUtility.GetNearstTargetHelper(npc, CharacterRelation.RELATION_ENEMY);
                            if (null != target)
                            {
                                info.Target = target.GetId();
                            }
                        }
                    }
                    else
                    {
                        target = AiLogicUtility.GetNearstTargetHelper(npc, CharacterRelation.RELATION_ENEMY);
                        if (null != target)
                        {
                            info.Target = target.GetId();
                        }
                    }
                    if (null != target)
                    {
                        NotifyNpcTargetChange(npc);
                        npc.GetMovementStateInfo().IsMoving = false;
                        NotifyNpcMove(npc);
                        info.Time = 0;
                        ChangeToState(npc, (int)AiStateId.Pursuit);
                    }
                }
            }
        }
        private void NormalActionStartHandler(NpcInfo npc, CharacterInfo target)
        {
            NpcAiStateInfo         info = npc.GetAiStateInfo();
            AiData_Npc_ActionDrive data = GetAiData(npc);

            if (null != data && null != target)
            {
                AiActionInfo aiActionInfo = data.ActiveAction;
                if (null != aiActionInfo)
                {
                    //aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds();
                    aiActionInfo.StartTime = TimeUtility.GetServerMilliseconds();
                }
            }
        }
        private void PathFindingCommandHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            // Path has found.
            if (!npc.UnityPathFinding)
            {
                return;
            }

            if (npc.PathFindingFinished)
            {
                // npc.PathFindingFinished = false;
                NpcAiStateInfo info = npc.GetAiStateInfo();
                ChangeToState(npc, info.PreviousState);
            }
        }
Esempio n. 13
0
        protected virtual void OnStateLogicInit(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            NpcAiStateInfo info = npc.GetAiStateInfo();

            info.Time = 0;
            npc.GetMovementStateInfo().IsMoving = false;
            info.HomePos = npc.GetMovementStateInfo().GetPosition3D();
            info.Target  = 0;
            if (!string.IsNullOrEmpty(info.AiParam[0]))
            {
                if (int.Parse(info.AiParam[0]) == 1)
                {
                    AiLogicUtility.InitPatrolData(npc, this);
                }
            }
        }
Esempio n. 14
0
        private void ExecuteCommandQueue(NpcInfo npc, long deltaTime)
        {
            NpcAiStateInfo npcAi = npc.GetAiStateInfo();

            while (npcAi.CommandQueue.Count > 0)
            {
                IAiCommand cmd = npcAi.CommandQueue.Peek();
                if (cmd.Execute(deltaTime))
                {
                    npcAi.CommandQueue.Dequeue();
                }
                else
                {
                    break;
                }
            }
        }
Esempio n. 15
0
 public void UpdateTarget(NpcInfo npc)
 {
     if (npc.GetAIEnable())
     {
         NpcAiStateInfo npcAi   = npc.GetAiStateInfo();
         long           curTime = TimeUtility.GetServerMilliseconds();
         if (npcAi.Target > 0)
         {
             if (curTime > npcAi.LastChangeTargetTime + m_ChangeTargetCD && curTime > npc.GetCombatStatisticInfo().LastHitTime + m_MaxChaseTime)
             {
                 npcAi.Target = 0;
                 NotifyNpcTargetChange(npc);
                 npcAi.LastChangeTargetTime = curTime;
                 LogSystem.Debug("Npc {0} changed target", npc.GetId());
             }
         }
     }
 }
        private void NormalForceStopHandler(NpcInfo npc)
        {
            NpcAiStateInfo         info = npc.GetAiStateInfo();
            AiData_Npc_ActionDrive data = GetAiData(npc);

            if (null != data)
            {
                npc.GetMovementStateInfo().IsMoving = false;
                npc.IsTaunt = false;
                NotifyNpcRun(npc);
                AiActionInfo aiActionInfo = data.ActiveAction;
                if (null != aiActionInfo)
                {
                    data.ActiveAction          = null;
                    aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds();
                }
            }
        }
Esempio n. 17
0
        private void PursuitHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (!CanAiControl(npc))
            {
                npc.GetMovementStateInfo().IsMoving = false;
                return;
            }
            NpcAiStateInfo    info = npc.GetAiStateInfo();
            AiData_Demo_Melee data = GetAiData(npc);

            if (null != data)
            {
                CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target);
                if (null != target)
                {
                    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 (powDist < dist * dist)
                    {
                        npc.GetMovementStateInfo().IsMoving = false;
                        info.Time = 0;
                        data.Time = 0;
                        ChangeToState(npc, (int)AiStateId.Combat);
                        NotifyNpcMove(npc);
                    }
                    else
                    {
                        info.Time += deltaTime;
                        if (info.Time > m_IntervalTime)
                        {
                            info.Time = 0;
                            AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this);
                        }
                    }
                }
            }
        }
        private void HandleSelfImpactAction(NpcInfo npc, CharacterInfo target, long deltaTime)
        {
            if (npc.GetSkillStateInfo().IsSkillActivated())
            {
                return;
            }
            NpcAiStateInfo         info = npc.GetAiStateInfo();
            AiData_Npc_ActionDrive data = GetAiData(npc);

            if (null != data && null != target)
            {
                Vector3      targetPos    = target.GetMovementStateInfo().GetPosition3D();
                AiActionInfo aiActionInfo = data.ActiveAction;
                if (null != aiActionInfo && !String.IsNullOrEmpty(aiActionInfo.Config.ActionParam))
                {
                    NotifyNpcAddImpact(npc, int.Parse(aiActionInfo.Config.ActionParam));
                }
                data.ActiveAction          = null;
                aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds();
            }
        }
        private void ExecAiAction(NpcInfo npc, CharacterInfo target, long deltaTime)
        {
            NpcAiStateInfo         info = npc.GetAiStateInfo();
            AiData_Npc_ActionDrive data = GetAiData(npc);

            if (null != info && null != data)
            {
                if (null != data.ActiveAction)
                {
                    AiActionInfo            aiActionInfo = data.ActiveAction;
                    AiActionExcueteDelegate handler      = GetAiActionExcuteHandler(aiActionInfo.Config.AiActionType);
                    if (null != handler)
                    {
                        handler(npc, target, deltaTime);
                    }
                }
                else
                {
                    if (data.ActionStack.Count > 0)
                    {
                        data.ActiveAction = data.ActionStack.Pop();
                    }
                    else
                    {
                        data.ActiveAction = GetFitAiAction(npc);
                    }
                    if (null != data.ActiveAction)
                    {
                        AiActionInfo          aiActionInfo = data.ActiveAction;
                        AiActionStartDelegate handler      = GetAiActionStartHandler(aiActionInfo.Config.AiActionType);
                        if (null != handler)
                        {
                            handler(npc, target);
                        }
                    }
                }
            }
        }
Esempio n. 20
0
 public virtual void StartImpact(CharacterInfo obj, int impactId)
 {
     if (null != obj)
     {
         ImpactInfo impactInfo = obj.GetSkillStateInfo().GetImpactInfoById(impactId);
         if (null != impactInfo)
         {
             if (impactInfo.ConfigData.BreakSuperArmor)
             {
                 obj.SuperArmor = false;
             }
         }
         if (obj is NpcInfo)
         {
             NpcInfo        npcObj = obj as NpcInfo;
             NpcAiStateInfo aiInfo = npcObj.GetAiStateInfo();
             if (null != aiInfo && 0 == aiInfo.HateTarget)
             {
                 aiInfo.HateTarget = impactInfo.m_ImpactSenderId;
             }
         }
     }
 }
        private void HandleFleeAction(NpcInfo npc, CharacterInfo target, long deltaTime)
        {
            if (npc.GetSkillStateInfo().IsSkillActivated())
            {
                return;
            }
            NpcAiStateInfo         info = npc.GetAiStateInfo();
            AiData_Npc_ActionDrive data = GetAiData(npc);

            if (null != data && null != target)
            {
                Vector3      targetPos    = Vector3.Zero;
                AiActionInfo aiActionInfo = data.ActiveAction;
                if (null != aiActionInfo)
                {
                    float anglePlus = 0.0f;
                    float.TryParse(aiActionInfo.Config.ActionParam, out anglePlus);
                    if (GetEscapeTargetPos(npc, target, 3.0f, anglePlus, ref targetPos))
                    {
                        info.Time += deltaTime;
                        if (info.Time > m_IntervalTime)
                        {
                            info.Time = 0;
                            NotifyNpcRun(npc);
                            AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this);
                        }
                    }
                }
                if ((!IsAiActionSatify(npc, target, aiActionInfo) && aiActionInfo.Config.CanInterrupt) || aiActionInfo.IsTimeOut(TimeUtility.GetServerMilliseconds()))
                {
                    data.ActiveAction = null;
                    npc.GetMovementStateInfo().IsMoving = false;
                    NotifyNpcMove(npc);
                    aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds();
                }
            }
        }
        private void HandleStandAction(NpcInfo npc, CharacterInfo target, long delatTime)
        {
            if (npc.GetSkillStateInfo().IsSkillActivated())
            {
                return;
            }
            NpcAiStateInfo         info = npc.GetAiStateInfo();
            AiData_Npc_ActionDrive data = GetAiData(npc);

            if (null != data && null != target)
            {
                npc.GetMovementStateInfo().IsMoving = false;
                NotifyNpcMove(npc);
                AiActionInfo aiActionInfo = data.ActiveAction;
                if (null != aiActionInfo)
                {
                    if ((!IsAiActionSatify(npc, target, aiActionInfo) && aiActionInfo.Config.CanInterrupt) || aiActionInfo.IsTimeOut(TimeUtility.GetServerMilliseconds()))
                    {
                        data.ActiveAction          = null;
                        aiActionInfo.LastStartTime = TimeUtility.GetServerMilliseconds();
                    }
                }
            }
        }
Esempio n. 23
0
        public static void ExecObjMoveCommand(int objId, float x, float y, float z)
        {
            Vector3       pos  = new Vector3(x, y, z);
            CharacterInfo obj  = WorldSystem.Instance.GetCharacterById(objId);
            UserInfo      user = obj as UserInfo;

            if (null != user)
            {
                if (!user.UnityPathFinding)
                {
                    List <Vector3> waypoints = user.SpatialSystem.FindPath(user.GetMovementStateInfo().GetPosition3D(), pos, 1);
                    waypoints.Add(pos);
                    UserAiStateInfo       aiInfo = user.GetAiStateInfo();
                    AiData_ForMoveCommand data   = aiInfo.AiDatas.GetData <AiData_ForMoveCommand>();
                    if (null == data)
                    {
                        data = new AiData_ForMoveCommand(waypoints);
                        aiInfo.AiDatas.AddData(data);
                    }
                    data.WayPoints          = waypoints;
                    data.Index              = 0;
                    data.EstimateFinishTime = 0;
                    data.IsFinish           = false;
                    aiInfo.ChangeToState((int)AiStateId.MoveCommand);
                }
                else
                {
                    UserAiStateInfo       aiInfo = user.GetAiStateInfo();
                    AiData_ForMoveCommand data   = aiInfo.AiDatas.GetData <AiData_ForMoveCommand>();
                    if (null == data)
                    {
                        data = new AiData_ForMoveCommand(null);
                        aiInfo.AiDatas.AddData(data);
                    }

                    user.PathFindingFinished = false;
                    user.GetAiStateInfo().ChangeToState((int)AiStateId.PathFinding);
                    user.GetAiStateInfo().PreviousState = (int)AiStateId.MoveCommand;
                    GfxSystem.ForMoveCommandPathToTarget(user, pos);
                }
            }
            else
            {
                NpcInfo npc = obj as NpcInfo;
                if (null != npc)
                {
                    if (!npc.UnityPathFinding)
                    {
                        List <Vector3> waypoints = npc.SpatialSystem.FindPath(npc.GetMovementStateInfo().GetPosition3D(), pos, 1);
                        waypoints.Add(pos);
                        NpcAiStateInfo        aiInfo = npc.GetAiStateInfo();
                        AiData_ForMoveCommand data   = aiInfo.AiDatas.GetData <AiData_ForMoveCommand>();
                        if (null == data)
                        {
                            data = new AiData_ForMoveCommand(waypoints);
                            aiInfo.AiDatas.AddData(data);
                        }
                        data.WayPoints          = waypoints;
                        data.Index              = 0;
                        data.EstimateFinishTime = 0;
                        data.IsFinish           = false;
                        aiInfo.ChangeToState((int)AiStateId.MoveCommand);
                    }
                    else
                    {
                        NpcAiStateInfo        aiInfo = npc.GetAiStateInfo();
                        AiData_ForMoveCommand data   = aiInfo.AiDatas.GetData <AiData_ForMoveCommand>();
                        if (null == data)
                        {
                            data = new AiData_ForMoveCommand(null);
                            aiInfo.AiDatas.AddData(data);
                        }

                        npc.PathFindingFinished = false;
                        npc.GetAiStateInfo().ChangeToState((int)AiStateId.PathFinding);
                        npc.GetAiStateInfo().PreviousState = (int)AiStateId.MoveCommand;
                        GfxSystem.ForMoveCommandPathToTarget(npc, pos);
                    }
                }
            }
        }
        private void PursuitHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (!CanAiControl(npc))
            {
                npc.GetMovementStateInfo().IsMoving = false;
                return;
            }
            NpcAiStateInfo         info = npc.GetAiStateInfo();
            AiData_Npc_CommonMelee data = GetAiData(npc);

            if (null != data)
            {
                CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target);
                if (null != target)
                {
                    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 <= npc.MeetEnemyStayTime)
                    {
                        if (!data.HasMeetEnemy)
                        {
                            NotifyNpcMeetEnemy(npc, Animation_Type.AT_Attack);
                            data.HasMeetEnemy = true;
                        }
                        TrySeeTarget(npc, target);
                        data.WaitTime += deltaTime;
                        return;
                    }
                    // 走向目标1.5秒
                    if (data.MeetEnemyWalkTime < npc.MeetEnemyWalkTime)
                    {
                        data.MeetEnemyWalkTime += deltaTime;
                        NotifyNpcWalk(npc);
                        info.Time += deltaTime;
                        if (info.Time > m_IntervalTime)
                        {
                            info.Time = 0;
                            if (!npc.UnityPathFinding)
                            {
                                AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this);
                            }
                            else
                            {
                                if (!npc.PathFindingFinished)
                                {
                                    GfxSystem.NpcCommonMeleePathToTarget(npc, targetPos);
                                    ChangeToState(npc, (int)AiStateId.PathFinding);
                                }
                                else
                                {
                                    npc.PathFindingFinished = false;
                                    AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this);
                                }
                            }
                        }
                        return;
                    }

                    // 大于攻击距离 跑向目标
                    if (powDist > m_AttackRange * m_AttackRange && 0 == data.CurAiAction)
                    {
                        npc.IsTaunt = false;
                        NotifyNpcRun(npc);
                        info.Time += deltaTime;
                        if (info.Time > m_IntervalTime)
                        {
                            info.Time = 0;
                            if (!npc.UnityPathFinding)
                            {
                                AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this);
                            }
                            else
                            {
                                if (!npc.PathFindingFinished)
                                {
                                    GfxSystem.NpcCommonMeleePathToTarget(npc, targetPos);
                                    ChangeToState(npc, (int)AiStateId.PathFinding);
                                }
                                else
                                {
                                    npc.PathFindingFinished = false;
                                    AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this);
                                }
                            }
                        }
                    }
                    else
                    {
                        //小于攻击距离
                        if (data.CurAiAction == (int)AiAction.NONE)
                        {
                            npc.GetMovementStateInfo().IsMoving = false;
                            NotifyNpcMove(npc);
                            data.CurAiAction = (int)GetNextAction();
                        }
                        switch (data.CurAiAction)
                        {
                        case (int)AiAction.SKILL:
                            if (0 >= data.SkillToCast)
                            {
                                data.SkillToCast = GetCanCastSkillId(npc, (float)Math.Sqrt(powDist));
                            }
                            if (0 >= data.SkillToCast || !AiLogicUtility.CanCastSkill(npc, data.SkillToCast, target))
                            {
                                info.Time += deltaTime;
                                if (info.Time > m_IntervalTime)
                                {
                                    info.Time = 0;
                                    NotifyNpcRun(npc);
                                    if (!npc.UnityPathFinding)
                                    {
                                        AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this);
                                    }
                                    else
                                    {
                                        if (!npc.PathFindingFinished)
                                        {
                                            GfxSystem.NpcCommonMeleePathToTarget(npc, targetPos);
                                            ChangeToState(npc, (int)AiStateId.PathFinding);
                                        }
                                        else
                                        {
                                            npc.PathFindingFinished = false;
                                            AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this);
                                        }
                                    }
                                }
                            }
                            else
                            {
                                npc.GetMovementStateInfo().IsMoving = false;
                                NotifyNpcMove(npc);
                                if (TryCastSkill(npc, data.SkillToCast, target))
                                {
                                    data.CurAiAction = 0;
                                    data.SkillToCast = -1;
                                }
                            }
                            break;

                        case (int)AiAction.STAND:
                            data.ChaseStandTime += deltaTime;
                            TrySeeTarget(npc, target);
                            if (data.ChaseStandTime > m_ChaseWalkMaxTime)
                            {
                                data.ChaseStandTime = 0;
                                data.CurAiAction    = 0;
                            }
                            break;

                        case (int)AiAction.TAUNT:
                            npc.GetMovementStateInfo().IsMoving = false;
                            NotifyNpcMove(npc);
                            npc.IsTaunt     = true;
                            data.TauntTime += deltaTime;
                            TrySeeTarget(npc, target);
                            if (data.TauntTime > m_TauntTime)
                            {
                                npc.IsTaunt      = false;
                                data.TauntTime   = 0;
                                data.CurAiAction = 0;
                            }
                            break;

                        case (int)AiAction.WALK:
                            data.ChaseWalkTime += deltaTime;
                            info.Time          += deltaTime;
                            if (info.Time > m_IntervalTime)
                            {
                                info.Time = 0;
                                NotifyNpcWalk(npc);
                                if (!npc.UnityPathFinding)
                                {
                                    AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this);
                                }
                                else
                                {
                                    if (!npc.PathFindingFinished)
                                    {
                                        GfxSystem.NpcCommonMeleePathToTarget(npc, targetPos);
                                        ChangeToState(npc, (int)AiStateId.PathFinding);
                                    }
                                    else
                                    {
                                        npc.PathFindingFinished = false;
                                        AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this);
                                    }
                                }
                            }
                            if (data.ChaseWalkTime > m_ChaseStandMaxTime)
                            {
                                data.ChaseWalkTime = 0;
                                data.CurAiAction   = 0;
                            }
                            break;
                        }
                    }
                }
                else
                {
                    NotifyNpcTargetChange(npc);
                    npc.GetMovementStateInfo().IsMoving = false;
                    NotifyNpcMove(npc);
                    info.Time = 0;
                    ChangeToState(npc, (int)AiStateId.Idle);
                }
            }
        }
Esempio n. 25
0
        private void PursuitHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (npc.IsDead() ||
                npc.GetSkillStateInfo().IsSkillActivated())
            {
                npc.GetMovementStateInfo().IsMoving = false;
                NotifyNpcMove(npc);
                return;
            }
            NpcAiStateInfo info = npc.GetAiStateInfo();
            AiData_Npc_BossDevilWarrior 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() && AiLogicUtility.CanCastSkill(npc, data.DecontrolSkill, target))
                        {
                            NotifyNpcAddImpact(npc, m_DisControlImpact);
                            data.ControlTime = 0;
                            TryCastSkill(npc, data.DecontrolSkill, target, false);
                            data.CurSkillCombo      = data.DecontrolCombo;
                            data.CurSkillComboIndex = 0;
                        }
                        return;
                    }
                    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 (null != data.CurSkillCombo)
                    {
                        if (data.CurSkillCombo.Length > data.CurSkillComboIndex)
                        {
                            TryCastSkill(npc, data.CurSkillCombo[data.CurSkillComboIndex], target);
                            data.CurSkillComboIndex = data.CurSkillComboIndex + 1;
                        }
                        else
                        {
                            data.CurSkillCombo      = null;
                            data.CurSkillComboIndex = 0;
                        }
                    }
                    // 大于攻击距离 跑向目标
                    if (powDist > m_AttackRange * m_AttackRange)
                    {
                        if ((int)GfxCharacterState_Type.HitFly == target.GfxStateFlag)
                        {
                            if (TryCastSkill(npc, data.FlyRangeSkill, target))
                            {
                                return;
                            }
                        }
                        else
                        {
                            if (TryCastSkill(npc, data.RangeSkill, target))
                            {
                                return;
                            }
                        }
                        info.Time += deltaTime;
                        if (info.Time > m_IntervalTime)
                        {
                            NotifyNpcRun(npc);
                            info.Time = 0;
                            AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this);
                        }
                    }
                    else
                    {
                        if ((int)GfxCharacterState_Type.HitFly == target.GfxStateFlag)
                        {
                            if (TryCastSkill(npc, data.FlyMeeleSkill, target))
                            {
                                return;
                            }
                        }
                        else
                        {
                            if (TryCastSkill(npc, data.MeeleSkill, target))
                            {
                                return;
                            }
                        }
                    }
                }
                else
                {
                    NotifyNpcTargetChange(npc);
                    npc.GetMovementStateInfo().IsMoving = false;
                    NotifyNpcMove(npc);
                    info.Time = 0;
                    ChangeToState(npc, (int)AiStateId.Idle);
                }
            }
        }
        private void EscapeHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (!CanAiControl(npc))
            {
                npc.GetMovementStateInfo().IsMoving = false;
                return;
            }
            NpcAiStateInfo    info = npc.GetAiStateInfo();
            AiData_Npc_Bluelf data = GetAiData(npc);

            if (null != data)
            {
                data.EscapeTime += deltaTime;
                CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target);
                if (null != target)
                {
                    Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D();
                    Vector3 srcPos    = npc.GetMovementStateInfo().GetPosition3D();
                    float   powDist   = Geometry.DistanceSquare(srcPos, targetPos);
                    if (powDist < m_SafeRange * m_SafeRange)
                    {
                        Vector3 escapePos = Vector3.Zero;
                        if (AiLogicUtility.GetEscapeTargetPos(npc, target, 3.0f, ref escapePos))
                        {
                            info.Time += deltaTime;
                            if (info.Time > m_IntervalTime)
                            {
                                NotifyNpcRun(npc);
                                info.Time = 0;
                                AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, escapePos, m_IntervalTime, true, this);
                            }
                        }
                        else
                        {
                            LogSystem.Debug("Can't find WalkAble place");
                        }
                    }
                    else
                    {
                        TryCastSkill(npc, GetCanCastSkillId(npc, (float)Math.Sqrt(powDist)), target);
                        npc.GetMovementStateInfo().IsMoving = false;
                        NotifyNpcMove(npc);
                        info.Time       = 0;
                        data.EscapeTime = 0;
                        ChangeToState(npc, (int)AiStateId.Pursuit);
                    }
                }
                else
                {
                    NotifyNpcTargetChange(npc);
                    npc.GetMovementStateInfo().IsMoving = false;
                    NotifyNpcMove(npc);
                    info.Time = 0;
                    ChangeToState(npc, (int)AiStateId.Idle);
                }
                if (data.EscapeTime > m_MaxEscapeTime)
                {
                    data.EscapeTime = 0;
                    npc.GetMovementStateInfo().IsMoving = false;
                    NotifyNpcMove(npc);
                    info.Time = 0;
                    ChangeToState(npc, (int)AiStateId.Pursuit);
                }
            }
        }
Esempio n. 27
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_CommonBoss data = GetAiData(npc);

            if (null != data)
            {
                CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target);
                if (null != target)
                {
                    if (npc.GetSkillStateInfo().IsSkillActivated())
                    {
                        npc.GetMovementStateInfo().IsMoving = false;
                        NotifyNpcMove(npc);
                        data.LastUseSkillTime = TimeUtility.GetServerMilliseconds();
                        return;
                    }
                    if (npc.IsUnderControl())
                    {
                        data.ControlTime += deltaTime;
                        if (data.ControlTime >= m_MaxControlTime && npc.CanDisControl() && AiLogicUtility.CanCastSkill(npc, m_DisControlSkillId, target))
                        {
                            NotifyNpcAddImpact(npc, m_DisControlImpactId);
                            data.ControlTime = 0;
                            TryCastSkill(npc, m_DisControlSkillId, target, false);
                        }
                        return;
                    }
                    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;
                    }
                    int  skillId = GetCanCastSkillId(npc, (float)Math.Sqrt(powDist));
                    long curTime = TimeUtility.GetServerMilliseconds();
                    if (-1 != skillId && curTime - data.LastUseSkillTime > m_SkillInterval && AiLogicUtility.CanCastSkill(npc, skillId, target))
                    {
                        if (TryCastSkill(npc, skillId, target, true))
                        {
                            NotifyNpcAddImpact(npc, m_SuperArmorImpactId);
                        }
                    }
                    else
                    {
                        info.Time += deltaTime;
                        if (info.Time > m_IntervalTime)
                        {
                            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);
                }
            }
        }
Esempio n. 28
0
        private void IdleHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            NpcAiStateInfo info = npc.GetAiStateInfo();

            info.Time += deltaTime;
            if (info.Time > m_IntervalTime)
            {
                info.Time = 0;
                DropOutInfo dropInfo = npc.GetAiStateInfo().AiDatas.GetData <DropOutInfo>();
                if (null != dropInfo)
                {
                    if (npc.IsBorning)
                    {
                        Vector3 curPos = npc.GetMovementStateInfo().GetPosition3D();
                        if (dropInfo.BornTarget == Vector3.Zero)
                        {
                            double tempAngle = CrossEngineHelper.Random.NextFloat() * Math.PI;
                            float  length    = CrossEngineHelper.Random.NextFloat() * 3.0f;
                            dropInfo.BornTarget = curPos + new Vector3((float)Math.Cos(tempAngle), 0, (float)Math.Sin(tempAngle)) * length;
                            dropInfo.BornAngle  = (float)tempAngle;
                        }
                        //npc.GetMovementStateInfo().SetMoveDir(dropInfo.BornAngle);
                        //npc.GetMovementStateInfo().IsMoving = true;
                        //NotifyNpcWalk(npc);
                        return;
                    }
                    else
                    {
                        if (!dropInfo.IsBornOver)
                        {
                            npc.GetMovementStateInfo().IsMoving = false;
                            NotifyNpcMove(npc);
                        }
                    }
                }
                UserInfo target = null;
                target = AiLogicUtility.GetNearstTargetHelper(npc, CharacterRelation.RELATION_FRIEND, AiTargetType.USER) as UserInfo;
                if (null != target && !npc.NeedDelete)
                {
                    Vector3 srcPos    = npc.GetMovementStateInfo().GetPosition3D();
                    Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D();
                    float   dis       = Geometry.Distance(srcPos, targetPos);
                    float   angle     = Geometry.GetYAngle(new Vector2(srcPos.X, srcPos.Z), new Vector2(targetPos.X, targetPos.Z));
                    if (dis <= m_AttractRange && dis > m_PickUpRange)
                    {
                        // 吸取
                        float move = npc.GetActualProperty().MoveSpeed *m_IntervalTime / 1000;
                        npc.GetMovementStateInfo().SetMoveDir(angle);
                        //npc.GetMovementStateInfo().PositionY = targetPos.Y + (1 - dis / m_AttractRange) * m_Height;
                        //npc.GetMovementStateInfo().SetPosition2D(srcPos.X + move * (float)Math.Cos(angle), srcPos.Z + move * (float)Math.Sin(angle));
                        npc.GetMovementStateInfo().IsMoving = true;
                        NotifyNpcRun(npc);
                    }
                    else if (dis <= m_PickUpRange)
                    {
                        npc.GetMovementStateInfo().IsMoving = false;
                        NotifyNpcMove(npc);
                        string path = "";
                        if (null != dropInfo)
                        {
                            switch (dropInfo.DropType)
                            {
                            case DropOutType.GOLD:
                                target.Money += dropInfo.Value;
                                target.UserManager.FireGainMoneyEvent(target.GetId(), dropInfo.Value);
                                path = "ef_head";
                                break;

                            case DropOutType.HP:
                                int addHp = (int)(target.GetActualProperty().HpMax *dropInfo.Value / 100.0f);
                                if (target.GetActualProperty().HpMax > addHp + target.Hp)
                                {
                                    target.SetHp(Operate_Type.OT_Relative, addHp);
                                }
                                else
                                {
                                    target.SetHp(Operate_Type.OT_Absolute, target.GetActualProperty().HpMax);
                                }
                                target.UserManager.FireDamageEvent(target.GetId(), -1, false, false, addHp, 0);
                                path = "Bone_Root";
                                break;

                            case DropOutType.MP:
                                int addEnergy = (int)(target.GetActualProperty().EnergyMax *dropInfo.Value / 100.0f);
                                if (target.GetActualProperty().EnergyMax > addEnergy + target.Energy)
                                {
                                    target.SetEnergy(Operate_Type.OT_Relative, addEnergy);
                                }
                                else
                                {
                                    target.SetEnergy(Operate_Type.OT_Absolute, target.GetActualProperty().EnergyMax);
                                }
                                target.UserManager.FireDamageEvent(target.GetId(), -1, false, false, 0, addEnergy);
                                path = "Bone_Root";
                                break;

                            case DropOutType.MULT_GOLD:
                                target.Money += dropInfo.Value;
                                target.UserManager.FireGainMoneyEvent(target.GetId(), dropInfo.Value);
                                path = "ef_head";
                                break;
                            }
                            if (null != OnDropoutPlayEffect)
                            {
                                OnDropoutPlayEffect(target, npc, dropInfo.Particle, path, (int)dropInfo.DropType, dropInfo.Value);
                            }
                        }
                        npc.NeedDelete = true;
                    }
                }
            }
        }
Esempio n. 29
0
        private void PursuitHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (npc.IsDead() ||
                npc.GetSkillStateInfo().IsSkillActivated())
            {
                npc.GetMovementStateInfo().IsMoving = false;
                NotifyNpcMove(npc);
                return;
            }
            NpcAiStateInfo    info = npc.GetAiStateInfo();
            AiData_Npc_Bluelf data = GetAiData(npc);

            if (null != data)
            {
                if (npc.IsUnderControl())
                {
                    data.ControlTime += deltaTime;
                    if (data.ControlTime >= m_MaxControlTime && npc.CanDisControl())
                    {
                        NotifyNpcAddImpact(npc, m_SuperAmorImpact);
                        data.ControlTime = 0;
                    }
                    return;
                }
                CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target);
                if (null != target)
                {
                    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;
                    }
                    int randomNum = CrossEngineHelper.Random.Next(0, 10);
                    // 大于攻击距离 跑向目标
                    if (powDist > m_AttackRange * m_AttackRange && 0 == data.CurAiAction)
                    {
                        if (randomNum < 8)
                        {
                            TryCastSkill(npc, m_DisSkill, target);
                            return;
                        }
                        else if (randomNum < 9)
                        {
                            TryCastSkill(npc, m_CommonSkill, target);
                            return;
                        }
                        npc.IsTaunt = false;
                        NotifyNpcRun(npc);
                        info.Time += deltaTime;
                        if (info.Time > m_IntervalTime)
                        {
                            info.Time = 0;
                            AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this);
                        }
                    }
                    else
                    {
                        //小于攻击距离
                        if (data.CurAiAction == (int)AiAction.NONE)
                        {
                            if (randomNum < 7)
                            {
                                TryCastSkill(npc, m_CommonSkill, target);
                                return;
                            }
                            npc.GetMovementStateInfo().IsMoving = false;
                            NotifyNpcMove(npc);
                            data.CurAiAction = (int)GetNextAction();
                        }
                        switch (data.CurAiAction)
                        {
                        case (int)AiAction.SKILL:
                            int skillId = GetCanCastSkillId(npc, (float)Math.Sqrt(powDist));
                            if (-1 == skillId)
                            {
                                info.Time += deltaTime;
                                if (info.Time > m_IntervalTime)
                                {
                                    info.Time = 0;
                                    NotifyNpcRun(npc);
                                    AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this);
                                }
                            }
                            else
                            {
                                npc.GetMovementStateInfo().IsMoving = false;
                                NotifyNpcMove(npc);
                                if (TryCastSkill(npc, skillId, target))
                                {
                                    data.CurAiAction = 0;
                                }
                            }
                            break;

                        case (int)AiAction.STAND:
                            data.ChaseStandTime += deltaTime;
                            TrySeeTarget(npc, target);
                            if (data.ChaseStandTime > m_ChaseWalkMaxTime)
                            {
                                data.ChaseStandTime = 0;
                                data.CurAiAction    = 0;
                            }
                            break;

                        case (int)AiAction.TAUNT:
                            npc.GetMovementStateInfo().IsMoving = false;
                            NotifyNpcMove(npc);
                            npc.IsTaunt     = true;
                            data.TauntTime += deltaTime;
                            TrySeeTarget(npc, target);
                            if (data.TauntTime > m_TauntTime)
                            {
                                npc.IsTaunt      = false;
                                data.TauntTime   = 0;
                                data.CurAiAction = 0;
                            }
                            break;

                        case (int)AiAction.WALK:
                            data.ChaseWalkTime += deltaTime;
                            info.Time          += deltaTime;
                            if (info.Time > m_IntervalTime)
                            {
                                info.Time = 0;
                                NotifyNpcWalk(npc);
                                AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this);
                            }
                            if (data.ChaseWalkTime > m_ChaseWalkMaxTime)
                            {
                                data.ChaseWalkTime = 0;
                                data.CurAiAction   = 0;
                            }
                            break;
                        }
                    }
                }
                else
                {
                    NotifyNpcTargetChange(npc);
                    npc.GetMovementStateInfo().IsMoving = false;
                    NotifyNpcMove(npc);
                    info.Time = 0;
                    ChangeToState(npc, (int)AiStateId.Idle);
                }
            }
        }
Esempio n. 30
0
        private void CombatHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime)
        {
            if (!CanAiControl(npc))
            {
                npc.GetMovementStateInfo().IsMoving = false;
                return;
            }
            NpcAiStateInfo info = npc.GetAiStateInfo();

            info.Time += deltaTime;
            if (info.Time > m_IntervalTime)
            {
                AiData_Demo_Melee data = GetAiData(npc);
                if (null != data)
                {
                    data.Time += info.Time;
                    info.Time  = 0;
                    CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target);
                    //CharacterInfo target = AiLogicUtility.GetInterestestTargetHelper(npc, CharacterRelation.RELATION_ENEMY, AiTargetType.USER);
                    if (null != target)
                    {
                        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 (powDist < dist * dist)
                        {
                            float rps     = npc.GetActualProperty().Rps;
                            long  curTime = TimeUtility.GetServerMilliseconds();
                            float dir     = Geometry.GetYAngle(new Vector2(srcPos.X, srcPos.Z), new Vector2(targetPos.X, targetPos.Z));
                            NotifyNpcFace(npc, dir);
                            //if (rps > 0.001f && curTime - data.LastUseSkillTime > 1000 / rps) {
                            data.Time             = 0;
                            data.LastUseSkillTime = curTime;
                            List <SkillInfo> skillInfos = npc.GetSkillStateInfo().GetAllSkill();
                            if (skillInfos.Count > 0)
                            {
                                int index = CrossEngineHelper.Random.Next(skillInfos.Count);
                                if (null != skillInfos[index])
                                {
                                    NotifyNpcSkill(npc, skillInfos[index].SkillId);
                                }
                            }
                            //}
                        }
                        else
                        {
                            npc.GetMovementStateInfo().IsMoving = false;
                            NotifyNpcMove(npc);
                            info.Time = 0;
                            data.FoundPath.Clear();
                            ChangeToState(npc, (int)AiStateId.Pursuit);
                        }
                    }
                }
                else
                {
                    info.Time = 0;
                }
            }
        }