예제 #1
0
        /// <summary>
        /// 查找目标。
        /// </summary>
        private void FindTarget()
        {
            PlayerObj player = CoreEntry.gActorMgr.MainPlayer;

            if (player == null)
            {
                return;
            }

            //有任务在身时,判断任务位置
            Vector3 selfpos = player.transform.position;
            int     mid     = 0;

            LogMgr.LogAI("AutoAIFindTarget.FindTarget");
            if (TaskMgr.RunTaskType != 0 && !IsInDungeon())
            {
                mid = TaskMgr.Instance.GetCurTargetMonsterId();
                if (mid != 0)
                {
                    const float RESET_DISTANCE = 5;             //重新回到任务点距离
                    Vector3     pos            = TaskMgr.Instance.goPos;
                    float       x = selfpos.x - pos.x;
                    float       z = selfpos.z - pos.z;
                    if (x * x + z * z >= RESET_DISTANCE * RESET_DISTANCE)
                    {
                        LogMgr.LogAI("AutoAIFindTarget.FindTarget 离开任务目标位置太远,重新回去");
                        m_TargetPosition = pos;
                        m_IsHaveTarget   = true;
                        return;
                    }
                }
            }

            int      mapid = MapMgr.Instance.EnterMapId;
            LuaTable cfg   = ConfigManager.Instance.Map.GetMapConfig(mapid);
            ActorObj actor = player.FindTarget(cfg.Get <int>("autoFightRange"), mapid);

            if (actor != null)
            {
                //如果选择的不是当前怪物则忽略
                if (mid != 0 && actor is MonsterObj)
                {
                    MonsterObj monster = actor as MonsterObj;
                    if (monster.ConfigID != mid)
                    {
                        return;
                    }
                }

                m_TargetPosition = actor.transform.position;
                m_IsHaveTarget   = true;
                return;
            }

            if (MapMgr.Instance.CurMapType == MapMgr.MapType.Map_CrossServer)
            {
                return;
            }


            //向服务器查询位置
            if (WildQuery || IsInDungeon())
            {
                //加载查询列表
                if (m_QueryList.Count <= 0)
                {
                    m_QueryList  = GetSortedEntList(player.transform.position);
                    m_QueryIndex = 0;
                }

                //开始查询
                if (m_QueryList.Count > 0)
                {
                    Vector3 pos = m_QueryList[m_QueryIndex];
                    m_QueryIndex       = (m_QueryIndex + 1) % m_QueryList.Count;
                    m_IsRequestPositon = true;
                    m_QueryWaitCount   = 5;
                    NetLogicGame.Instance.SendQueryMonsterByPosition((int)(pos.x * 1000), (int)(pos.z * 1000));
                    LogMgr.LogAI("AutoAIFindTarget.FindTarget RequestPositon:{0}", pos);
                }
                else
                {
                    LogMgr.LogAI("AutoAIFindTarget.FindTarget The QueryList is empty!");
                }
            }
            else
            {
                LogMgr.LogAI("AutoAIFindTarget.FindTarget Can not find target.");
            }
        }