AI.BaseAI.Run C# (CSharp) Метод

Run() публичный Метод

public Run ( ) : void
Результат void
        public virtual void Run()
        {
            if (SelObj.IsDie()) return; //自身实体已死亡
            if (SelObj.IsLock())  //自身被锁定
            {
                if (findlist != null)
                    findlist.Clear();
                return;
            }
            //攻击的对方被锁定,攻击不了
            if (TargetObj != null && TargetObj.IsLock()) return;
            //目标已死亡切换目标
            if (TargetObj != null && TargetObj.IsDie())
            {
                SetAttackTarget(null);
            }
            //目标是幻兽- 并且在休息状态
            if(TargetObj != null && TargetObj.type == OBJECTTYPE.EUDEMON &&
                (TargetObj as EudemonObject).GetState() != EUDEMONSTATE.BATTLE)
            {
                SetAttackTarget(null);
            }
            //空闲状态走路
            if (nState == BaseAI.STATE_IDLE && mAiInfo.bIdle_Move)
            {
                if (System.Environment.TickCount - SelObj.GetLastWalkTime() > SelObj.GetWalkTime() && !SelObj.IsDie())
                {
                    //二分之一的几率不走路
                    if (IRandom.Random(1, 4) > 2)
                    {
                        //增加判断- 优化服务端运行效率- 视野里有玩家才走
                        bool bWalk = false;
                        foreach (RefreshObject obj in SelObj.GetVisibleList().Values)
                        {
                            if (obj.obj.type == OBJECTTYPE.PLAYER)
                            {
                                bWalk = true;
                                break;
                            }
                        }
                        if (bWalk)
                        {
                            byte dir = 0; short x = 0; short y = 0;
                            if (DIR.Random_Walk(SelObj, ref dir, ref x, ref y))
                            {
                                SelObj.Walk(dir, x, y);
                            }
                        }

                    }
                }
            }
            //玩家意外掉线
            if (TargetObj != null && TargetObj.type == OBJECTTYPE.PLAYER &&
                TargetObj.GetGameSession() == null)
            {
                SetAttackTarget(null);

            }
            //主动怪物- 遍历视野范围内的玩家- 找到最近的那一个开始攻击他
            ActiveAttackPlay();

            //受伤了..反击
            if ((TargetObj != null) &&
                (nState == BaseAI.INJURED || nState == BaseAI.ATTACK ||
                nState == BaseAI.FOLLOW))
            {
                if (!SelObj.CanPK(TargetObj))
                {
                    SetAttackTarget(null);
                    return;
                }
                //目标角色死亡了或者已经不在可视范围内
                if (TargetObj.IsDie() || !SelObj.GetPoint().CheckVisualDistance(TargetObj.GetCurrentX(),
                    TargetObj.GetCurrentY(),mAiInfo.nRange))
                {
                    TargetObj = null;
                    nState = BaseAI.STATE_IDLE;
                    if (findlist != null) findlist.Clear();
                }

                if (TargetObj != null &&
                    System.Environment.TickCount - mnLastMoveTick > mAiInfo.nMove_Speed &&
                    mAiInfo.bMove)
                {
                    //与目标差距太大-- 就跟随
                    if (Math.Abs(TargetObj.GetCurrentX() - SelObj.GetCurrentX()) > mAiInfo.nAttack_Range ||
                        Math.Abs(TargetObj.GetCurrentY() - SelObj.GetCurrentY()) > mAiInfo.nAttack_Range)
                    {
                        if (findlist != null && findlist.Count > 0)
                        {
                            MapServer.FindPoint point = findlist[findlist.Count - 1];
                            findlist.RemoveAt(findlist.Count - 1);
                            if (point.x == SelObj.GetCurrentX() && point.y == SelObj.GetCurrentY()) return;
                            byte dir = DIR.GetDirByPos(SelObj.GetCurrentX(), SelObj.GetCurrentY(), point.x, point.y);
                         //   Console.WriteLine("当前怪物坐标:"+SelObj.GetCurrentX().ToString()+"y:"+SelObj.GetCurrentY().ToString() + "目的坐标:"+point.x.ToString() + "y:" + point.y.ToString() + "方向:" + dir.ToString()+"\n");
                            if (findlist.Count == 0)
                            {
                                nState = BaseAI.ATTACK;

                            //    Console.Write("------------------------------------------------------------\n");
                            }
                            SelObj.Walk(dir,point.x,point.y);

                        }else this.FollowTarget();

                        mnLastMoveTick = System.Environment.TickCount ;
                       // Console.WriteLine((System.Environment.TickCount - mnLastMoveTick).ToString());
                        return;
                    }

                }
                //攻击目标
                if(TargetObj != null &&
                    System.Environment.TickCount - mnLastAttackTick > mAiInfo.nAttack_Speed)
                {
                    //在攻击范围内
                    if(Math.Abs(TargetObj.GetCurrentX() - SelObj.GetCurrentX()) <= mAiInfo.nAttack_Range &&
                        Math.Abs(TargetObj.GetCurrentY() - SelObj.GetCurrentY()) <= mAiInfo.nAttack_Range)
                    {
                        NetMsg.MsgMonsterAttackInfo msg = new NetMsg.MsgMonsterAttackInfo();
                        msg.Create(null, null);
                        msg.monsterid = SelObj.GetTypeId();
                        msg.roleid = TargetObj.GetTypeId(); ;
                        msg.role_x = TargetObj.GetCurrentX();
                        msg.role_y = TargetObj.GetCurrentY();
                        msg.injuredvalue = BattleSystem.AdjustDamage(SelObj, TargetObj); ;
                        byte[] buff = msg.GetBuffer();
                        //广播
                        (SelObj as MonsterObject).BrocatBuffer(buff);
                        //GameStruct.Action act = new GameStruct.Action(GameStruct.Action.ATTACK, buff);
                        //SelObj.PushAction(act);

                        //反馈角色被攻击--减血3
                        NetMsg.MsgAttackInfo info = new NetMsg.MsgAttackInfo();
                        info.tag = 21;
                        TargetObj.Injured(SelObj, msg.injuredvalue, info);
                        mnLastAttackTick = System.Environment.TickCount;
                    }
                }

            }
        }