/// <summary>
        /// 通知别人自己的移动
        /// </summary>
        private static void NotifyOthersMyMoving(IObject obj, String pathString, int nSrcGridX, int nSrcGridY, int nDestGridX, int nDestGridY, Dircetions direction)
        {
            if (obj is Monster)
            {
                Monster monster = obj as Monster;
                if (null != monster)
                {
                    monster.Direction = (int)direction;
                    monster.Action    = GActions.Walk;

                    GameMap gameMap  = GameManager.MapMgr.DictMaps[monster.MonsterZoneNode.MapCode];
                    int     fromPosX = gameMap.MapGridWidth * nSrcGridX + gameMap.MapGridWidth / 2;
                    int     fromPosY = gameMap.MapGridHeight * nSrcGridY + gameMap.MapGridHeight / 2;
                    int     toPosX   = gameMap.MapGridWidth * nDestGridX + gameMap.MapGridWidth / 2;
                    int     toPosY   = gameMap.MapGridHeight * nDestGridY + gameMap.MapGridHeight / 2;

                    string zipPathString = DataHelper.ZipStringToBase64(pathString);
                    GameManager.ClientMgr.NotifyOthersToMoving(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, monster, monster.MonsterZoneNode.MapCode, monster.CopyMapID, monster.RoleID, Global.GetMonsterStartMoveTicks(monster), fromPosX, fromPosY, (int)GActions.Walk, toPosX, toPosY, (int)TCPGameServerCmds.CMD_SPR_MOVE, monster.MoveSpeed, zipPathString);
                }
            }
        }
Exemple #2
0
        /// <summary>
        /// 向某个方向移动2个格子位置
        /// 移动可能失败,失败原因 1.相关位置不可走 2.相关位置已经有其他角色或者怪物
        /// </summary>
        /// <param name="nDir"></param>
        /// <returns></returns>
        public static Boolean RunTo(IObject obj, Dircetions nDir, IObject target)
        {
            Point grid   = obj.CurrentGrid;
            int   nCurrX = (int)grid.X;
            int   nCurrY = (int)grid.Y;

            int nX = nCurrX, nY = nCurrY;
            int nWalk = Global.MovingNeedStepPerGrid;

            String pathStr = String.Format("{0}_{1}", nCurrX, nCurrY);

            //不考虑坐骑速度
            for (int i = 0; i < nWalk; i++)
            {
                switch (nDir)
                {
                case Dircetions.DR_UP:
                    nY++;
                    break;

                case Dircetions.DR_UPRIGHT:
                    nX++;
                    nY++;
                    break;

                case Dircetions.DR_RIGHT:
                    nX++;
                    break;

                case Dircetions.DR_DOWNRIGHT:
                    nX++;
                    nY--;
                    break;

                case Dircetions.DR_DOWN:
                    nY--;
                    break;

                case Dircetions.DR_DOWNLEFT:
                    nX--;
                    nY--;
                    break;

                case Dircetions.DR_LEFT:
                    nX--;
                    break;

                case Dircetions.DR_UPLEFT:
                    nX--;
                    nY++;
                    break;
                }

                if (!CanMove(obj, nX, nY))
                {
                    // SysConOut.WriteLine(String.Format("* ***************不能移动***************ID = {0}***********", (obj is Monster ? (obj as Monster).RoleID : ((obj as GameClient).ClientData.RoleID))));
                    return(false);
                }

                // pathStr += String.Format("|{0}_{1}", nX, nY);
            }
            Point targetGrid   = target.CurrentGrid;
            int   nTargetCurrX = (int)targetGrid.X;
            int   nTargetCurrY = (int)targetGrid.Y;

            if (nX == nTargetCurrX && nTargetCurrY == nY)
            {
                return(false);
            }
            pathStr = "";
            return(RunXY(obj, nX, nY, nDir, pathStr, target));
        }
        /// <summary>
        /// 向某个方向移动2个格子位置
        /// 移动可能失败,失败原因 1.相关位置不可走 2.相关位置已经有其他角色或者怪物
        /// </summary>
        /// <param name="nDir"></param>
        /// <returns></returns>
        public static Boolean RunTo(IObject obj, Dircetions nDir)
        {
            Point grid   = obj.CurrentGrid;
            int   nCurrX = (int)grid.X;
            int   nCurrY = (int)grid.Y;

            int nX = nCurrX, nY = nCurrY;
            int nWalk = 2;

            String pathStr = String.Format("{0}_{1}", nCurrX, nCurrY);;

            //不考虑坐骑速度
            for (int i = 0; i < nWalk; i++)
            {
                switch (nDir)
                {
                case Dircetions.DR_UP:
                    nY++;
                    break;

                case Dircetions.DR_UPRIGHT:
                    nX++;
                    nY++;
                    break;

                case Dircetions.DR_RIGHT:
                    nX++;
                    break;

                case Dircetions.DR_DOWNRIGHT:
                    nX++;
                    nY--;
                    break;

                case Dircetions.DR_DOWN:
                    nY--;
                    break;

                case Dircetions.DR_DOWNLEFT:
                    nX--;
                    nY--;
                    break;

                case Dircetions.DR_LEFT:
                    nX--;
                    break;

                case Dircetions.DR_UPLEFT:
                    nX--;
                    nY++;
                    break;
                }

                if (!CanMove(obj, nX, nY))
                {
                    return(false);
                }

                pathStr += String.Format("|{0}_{1}", nX, nY);
            }

            return(RunXY(obj, nX, nY, nDir, pathStr));
        }
Exemple #4
0
        public static Boolean WalkToStep(IObject obj, Dircetions nDir, int nStep, IObject targetObj)
        {
            Point grid   = obj.CurrentGrid;
            int   nCurrX = (int)grid.X;
            int   nCurrY = (int)grid.Y;

            int nX = nCurrX, nY = nCurrY;

            String pathStr = String.Format("{0}_{1}", nCurrX, nCurrY);;

            //不考虑坐骑速度
            for (int i = 0; i < nStep; i++)
            {
                switch (nDir)
                {
                case Dircetions.DR_UP:
                    nY++;
                    break;

                case Dircetions.DR_UPRIGHT:
                    nX++;
                    nY++;
                    break;

                case Dircetions.DR_RIGHT:
                    nX++;
                    break;

                case Dircetions.DR_DOWNRIGHT:
                    nX++;
                    nY--;
                    break;

                case Dircetions.DR_DOWN:
                    nY--;
                    break;

                case Dircetions.DR_DOWNLEFT:
                    nX--;
                    nY--;
                    break;

                case Dircetions.DR_LEFT:
                    nX--;
                    break;

                case Dircetions.DR_UPLEFT:
                    nX--;
                    nY++;
                    break;
                }
            }
            if (!CanMove(obj, nX, nY))
            {
                return(false);
            }
            Point targetGrid   = targetObj.CurrentGrid;
            int   nTargetCurrX = (int)targetGrid.X;
            int   nTargetCurrY = (int)targetGrid.Y;

            pathStr = "";
            return(RunXY(obj, nX, nY, nDir, pathStr, targetObj));
        }