/// <summary> // 开始动作 /// </summary> public static void StartAction(DelayAction action) { DelayActionType nActionID = action.m_DelayActionType; switch (nActionID) { case DelayActionType.DA_BLINK: { // 闪现 int nParams = action.m_Params[0]; // 距离 GameClient client = action.m_Client; int nRadius = nParams * 100; // 半径 GameMap gameMap = GameManager.MapMgr.DictMaps[client.ClientData.MapCode]; // 取得地图信息 int nDirection = client.ClientData.RoleDirection; // 玩家朝向 Point pClientGrid = client.CurrentGrid; // 玩家所在的格子 int nGridNum = nRadius / gameMap.MapGridWidth; // 取得半径长度包含的格子数量 int nTmp = nGridNum; // 根据当前所在的格子列表、半径 取得范围内的格子数量 //int nGridWidthNum = nRadius / gameMap.MapGridWidth; //int nGridHeightNum = nRadius / gameMap.MapGridHeight; //List<Point> lPointsList = Global.GetGridPointByRadius((int)pClientGrid.X, (int)pClientGrid.Y, nGridWidthNum, nGridHeightNum); // 格子列表 //int nGridNum = lPointsList.Count; // 根据朝向、当前所在格子、将要行进的格子数量 取得前方的格子列表 List <Point> lMovePointsList = Global.GetGridPointByDirection(nDirection, (int)pClientGrid.X, (int)pClientGrid.Y, nGridNum); // 玩家、怪的阻挡设置 将影响能不能到达有人物或者怪的格子 byte holdBitSet = 0; holdBitSet |= (byte)ForceHoldBitSets.HoldRole; holdBitSet |= (byte)ForceHoldBitSets.HoldMonster; for (int i = 0; i < lMovePointsList.Count; i++) { if (Global.InObsByGridXY(client.ObjectType, client.ClientData.MapCode, (int)lMovePointsList[i].X, (int)lMovePointsList[i].Y, 0, holdBitSet)) { break; } else { --nGridNum; } } if (nGridNum < nTmp) { pClientGrid = lMovePointsList[nTmp - nGridNum - 1]; } Point canMovePoint = pClientGrid; if (!Global.CanQueueMoveObject(client, nDirection, (int)pClientGrid.X, (int)pClientGrid.Y, nGridNum, nGridNum, holdBitSet, out canMovePoint, false)) { Point clientMoveTo = new Point(canMovePoint.X * gameMap.MapGridWidth + gameMap.MapGridWidth / 2, canMovePoint.Y * gameMap.MapGridHeight + gameMap.MapGridHeight / 2); GameManager.ClientMgr.ChangePosition(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, client, (int)clientMoveTo.X, (int)clientMoveTo.Y, client.ClientData.RoleDirection, (int)TCPGameServerCmds.CMD_SPR_CHANGEPOS, 3); } else { Point clientMoveTo = new Point(lMovePointsList[lMovePointsList.Count - 1].X * gameMap.MapGridWidth + gameMap.MapGridWidth / 2, lMovePointsList[lMovePointsList.Count - 1].Y * gameMap.MapGridHeight + gameMap.MapGridHeight / 2); GameManager.ClientMgr.ChangePosition(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, client, (int)clientMoveTo.X, (int)clientMoveTo.Y, client.ClientData.RoleDirection, (int)TCPGameServerCmds.CMD_SPR_CHANGEPOS, 3); } List <Object> objsList = Global.GetAll9Clients(client); string strcmd = string.Format("{0}", client.ClientData.RoleID); GameManager.ClientMgr.SendToClients(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, null, objsList, strcmd, (int)TCPGameServerCmds.CMD_SPR_ENDBLINK); RemoveDelayAction(action); } break; default: break; } }