/** * 添加一个旁观玩家到房间中 * * @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; }
/** * 改变一个玩家的游戏房间 * * @param pPlayer 要改变游戏房间的玩家 */ bool RoomManager::ChangeGameRoom(Player *pPlayer) { if(pPlayer == NULL || m_RoomList.empty()) return false; // 首先检测玩家当前的状态,如果玩家处于准备,等待,游戏中,掉线等状态时说明玩家已经在房间中,不能进入新的房间 if(pPlayer->GetState() != PLAYERSTATE_NORAML) return false; // 得到原来玩家所在的房间 Room *pSrcRoom = GetRoomById(pPlayer->GetRoomId()); if(pSrcRoom == NULL || pSrcRoom->GetRoomState() != ROOMSTATE_WAITING) return false; // 向房间中其它用户发送用户离开消息 CMolMessageOut out(IDD_MESSAGE_FRAME); out.writeShort(IDD_MESSAGE_LEAVE_ROOM); out.writeShort(pPlayer->GetID()); ServerPlayerManager.SendMsgToEveryone(out); // 先处理用户在原来房间中离开消息 pSrcRoom->OnProcessLeaveRoomMsg(pPlayer->GetRoomIndex()); // 第一遍搜索当前房间中已经存在玩家在那里等待的房间 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(!(*iter)->IsFull() && (*iter)->GetPlayerCount() > 0 && (*iter)->GetRoomState() != ROOMSTATE_GAMING) { // 找一个与原来不一样的房间 if(pSrcRoom->GetID() != (*iter)->GetID()) { //PlayerState oldstate = pPlayer->GetState(); // 设置玩家状态为改变房间状态,这样可以防止服务器将玩家强行掉线 //pPlayer->SetState(PLAYERSTATE_CHANGEROOM); // 先从原来的房间中删除这个玩家 pSrcRoom->ClearPlayer(pPlayer); // 更新一下房间中的用户 (*iter)->UpdateOnlinePlayers(); pPlayer->SetRoomId((*iter)->GetID()); //pPlayer->SetState(oldstate); 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(!(*iter)->IsFull() && (*iter)->GetRoomState() != ROOMSTATE_GAMING) { // 找一个与原来不一样的房间 if(pSrcRoom->GetID() != (*iter)->GetID()) { //PlayerState oldstate = pPlayer->GetState(); // 设置玩家状态为改变房间状态,这样可以防止服务器将玩家强行掉线 //pPlayer->SetState(PLAYERSTATE_CHANGEROOM); // 先从原来的房间中删除这个玩家 pSrcRoom->ClearPlayer(pPlayer); // 更新一下房间中的用户 (*iter)->UpdateOnlinePlayers(); if(pPlayer == NULL) { state = false; break; } pPlayer->SetRoomId((*iter)->GetID()); //pPlayer->SetState(oldstate); int playerIndex = (*iter)->AddPlayer(pPlayer); pPlayer->SetRoomIndex(playerIndex); state = true; break; } } } } m_RoomLock.Release(); return state; }
/** * 添加一个玩家到房间中 * * @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; }