Esempio n. 1
0
/** 
 * 添加一个旁观玩家到房间中
 *
 * @param pPlayer 要添加的玩家
 * @param roomIndex 玩家要进入的房间的索引
 * @param chairIndex 玩家要进入的房间的椅子的索引
 */
bool RoomManager::AddLookOnPlayer(Player *pPlayer,int roomIndex,int chairIndex)
{
	if(pPlayer == NULL ||
		m_RoomList.empty()) 
		return false;

	// 首先检测玩家当前的状态,如果玩家处于准备,等待,游戏中,掉线等状态时说明玩家已经在房间中,不能进入新的房间
	if(pPlayer->GetState() != PLAYERSTATE_NORAML)
		return false;

	// 玩家要进入指定房间,指定的座位
	Room *pRoom = GetRoomById(roomIndex);
	if(pRoom == NULL) return false;

	// 如果房间已满或者房间状态处于游戏中的话,是进不了房间的
	if(/*pRoom->IsFull() ||*/
		pRoom->GetRoomState() != ROOMSTATE_GAMING)
		return false;

	// 检测房间中指定索引的玩家是否存在,如果存在是不能加入房间的
	if(!pRoom->GetPlayer(chairIndex))
		return false;

	// 更新一下房间中的用户
	pRoom->UpdateOnlinePlayers();

	pPlayer->SetRoomId(pRoom->GetID());
	pPlayer->SetRoomIndex(pRoom->AddLookOnPlayer(pPlayer,chairIndex));
	pPlayer->SetLookOn(true);

	return true;
}
Esempio n. 2
0
/**
 * 添加一个玩家到房间中
 *
 * @param pPlayer 要添加的玩家
 * @param roomIndex 玩家要进入的房间的索引
 * @param chairIndex 玩家要进入的房间的椅子的索引
 */
bool RoomManager::AddPlayer(Player *pPlayer,int roomIndex,int chairIndex)
{
	if(pPlayer == NULL ||
		m_RoomList.empty()) 
		return false;

	// 首先检测玩家当前的状态,如果玩家处于准备,等待,游戏中,掉线等状态时说明玩家已经在房间中,不能进入新的房间
	if(pPlayer->GetState() != PLAYERSTATE_NORAML)
		return false;

	// 如果roomIndex等于-1,chairIndex等于-1表示当前玩家不需要排队进入房间
	if(roomIndex == -1 && chairIndex == -1)
	{
		// 第一遍搜索当前房间中已经存在玩家在那里等待的房间
		bool state = false;

		m_RoomLock.Acquire();
		std::list<Room*>::iterator iter = m_RoomList.begin();
		for(;iter != m_RoomList.end();iter++)
		{
			if((*iter))
			{
				//(*iter)->UpdateAllPlayers();
				// 如果玩家不能满足房间要求的最少金币值,就不能进入房间
				if((*iter)->GetLastMoney() > pPlayer->GetMoney()) continue;
				
				// 如果当前不是百人房间,那么房间状态必须不在游戏状态下
				if(CMolServerDlg::getSingleton().GetServerSet()->TableCount > 1)
				{
					if((*iter)->GetRoomState() == ROOMSTATE_GAMING)
					{
						state = false;
						continue;
					}
				}

				if(!(*iter)->IsFull() &&
					(*iter)->GetPlayerCount() > 0)
				{				
					// 更新一下房间中的用户
					(*iter)->UpdateOnlinePlayers();

					if(pPlayer == NULL) 
					{
						state = false;
						break;
					}

					//char str[1024];
					//sprintf(str,"玩家%d进入房间%d,ID为%d,房间中人数:%d",pPlayer->GetConnectID(),(*iter)->GetID(),pPlayer->GetRoomIndex(),(*iter)->GetPlayerCount());
					//LOG_ERRORR(str);

					pPlayer->SetRoomId((*iter)->GetID());
					int playerIndex = (*iter)->AddPlayer(pPlayer);
					pPlayer->SetRoomIndex(playerIndex);		

					state = true;
					break;
				}
			}
		}	
		m_RoomLock.Release();

		if(state) return state;

		// 第二遍搜索当前房间中没有坐满的房间或者空房间
		state = false;

		m_RoomLock.Acquire();
		iter = m_RoomList.begin();
		for(;iter != m_RoomList.end();iter++)
		{
			if((*iter))
			{
				//(*iter)->UpdateAllPlayers();
				// 如果玩家不能满足房间要求的最少金币值,就不能进入房间
				if((*iter)->GetLastMoney() > pPlayer->GetMoney()) continue;
				
				// 如果当前不是百人房间,那么房间状态必须不在游戏状态下
				if(CMolServerDlg::getSingleton().GetServerSet()->TableCount > 1)
				{
					if((*iter)->GetRoomState() == ROOMSTATE_GAMING)
					{
						state = false;
						continue;
					}
				}				

				if(!(*iter)->IsFull())
				{			
					// 更新一下房间中的用户
					(*iter)->UpdateOnlinePlayers();

					if(pPlayer == NULL) 
					{
						state = false;
						break;
					}

					pPlayer->SetRoomId((*iter)->GetID());
					int playerIndex = (*iter)->AddPlayer(pPlayer);
					pPlayer->SetRoomIndex(playerIndex);		

					state = true;
					break;
				}
			}
		}	
		m_RoomLock.Release();

		return state;
	}
	else
	{
		// 玩家要进入指定房间,指定的座位
		Room *pRoom = GetRoomById(roomIndex);
		if(pRoom == NULL) return false;

		// 如果房间已满或者房间状态处于游戏中的话,是进不了房间的
		if(pRoom->IsFull() ||
			pRoom->GetRoomState() == ROOMSTATE_GAMING)
			return false;

		// 检测房间中指定索引的玩家是否存在,如果存在是不能加入房间的
		if(pRoom->GetPlayer(chairIndex))
			return false;

		// 更新一下房间中的用户
		pRoom->UpdateOnlinePlayers();

		pPlayer->SetRoomId(pRoom->GetID());
		int playerIndex = pRoom->AddPlayer(pPlayer,chairIndex);
		pPlayer->SetRoomIndex(playerIndex);		

		return true;
	}

	return true;
}