/// <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); } } }
/// <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)); }
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)); }