【开发笔记】创胜系列增加游戏开局确认(自动准备和非自动准备)功能
【开发笔记】
只记录逻辑分析和注意的地方,其他简单的不做记录。
逻辑分析:
1。俱乐部设置增加开局确认数据保存到数据库
2。创建房间后发送发送的房间数据带上开局联盟设置的参数
3。进入联盟时查询房间列表时要带上参数
1 2两个问题好解决,需要注意的是第三个问题。第三个问题有两个地方,是分别是联盟和俱乐部,似乎是两种不同的请求。因为定制的俱乐部,联盟没去仔细看。代码猜测是联盟反向注册到协调服务器的时候带上参数,这种方式会比较简单,修改量比较少。
俱乐部却不是这里,俱乐部是全局的:
CGlobalInfoManager::CreateRoom
这个函数,最好的就是对这个函数传入的时候多添加一个参数进去,然后存储数据的时候一起保存起来,然后再进入俱乐部查询房间的地方为每个房间添加这个参数,前端 UI根据这个参数是否显示开局确认提示标志。
联盟查询房间列表是:
CAttemperEngineSink::OnTCPNetworkMainClubService
这个函数中的:
//查询现有房间
std::vector<tagRoomTableStatus*> vRoomTableStatus;
m_GlobalInfoManager.EnumRoomTable(vRoomTableStatus, 0, pEnterClub->dwClubID, 0);
for (WORD i = 0; i < vRoomTableStatus.size(); i++)
{
tagRoomTableStatus*pTableStatus = vRoomTableStatus[i];
ServerRoomInfo * pTableInfo = (ServerRoomInfo *)(szBuff + wHeadSize + pRoomInfo->wRoomCnt*wTagSize);
CopyServerRoomInfor(pTableInfo, pTableStatus);
pTableInfo->dwkaijuqr = pTableStatus->dwkaijuqr; //开局确认
for (int j = 0; j < MAX_CHAIR; j++)
{
if (pTableStatus->dwUserID[j] != 0) pTableInfo->byPlayerCnt++;
}
pRoomInfo->wRoomCnt++;
if ((pRoomInfo->wRoomCnt + 1) * wTagSize > 16000) break;
}这段代码可以看出是由:
m_GlobalInfoManager.EnumRoomTable
这个函数权举循环查询后将数据传入变量vRoomTableStatus这个的。而查看CopyServerRoomInfor函数可以看到代码中:
tagRoomTableStatus * CGlobalInfoManager::EnumRoomTable(std::vector<tagRoomTableStatus*> &vRoomTableStatus, DWORD dwUserID, DWORD dwClubID, DWORD dwLeagueID)
{
vRoomTableStatus.clear();
tagRoomTableStatus * pTableStatus = NULL;
for (auto it : m_MapRoomNum)
{
pTableStatus = it.second;
if (pTableStatus == NULL) break;
if (pTableStatus->dwApplyTime != 0) continue;
if (dwUserID != 0 && pTableStatus->dwPayUserID != dwUserID) continue;
if (dwLeagueID != 0) { if (pTableStatus->dwLeagueID != dwLeagueID) continue; }
else if (dwClubID != 0 && pTableStatus->dwClubID != dwClubID) continue;
vRoomTableStatus.push_back(pTableStatus);
}
return NULL;
}是循环的变量m_MapRoomNum。这里注意了,m_MapRoomNum这个变量全文件搜索有两个地方在存入数据,是不一样的。。。
由于是开发的俱乐部模式,所以用函数:
tagRoomTableStatus * CGlobalInfoManager::CreateRoom
这个函数传入变量新增个开局确认的变量就行,比如我的代码:
tagRoomTableStatus * CGlobalInfoManager::CreateRoom(DWORD dwUserID, DWORD dwPayUserID, WORD wKindID, DWORD dwClubID, DWORD dwLeagueID, DWORD dwServerRules, DWORD dwkaijuqr)
{
//新建房间号
DWORD dwRoomID = PRIME_ROOM;
if ( dwClubID != 0 ) dwRoomID = CLUB_ROOM;
if ( dwLeagueID != 0 ) dwRoomID = LEAGUE_ROOM;
dwRoomID = GetNewRoomNum( dwRoomID );
if ( dwRoomID == 0 || wKindID == 0 ) return NULL;
RoomTableStateArray * pArr = SearchRoomArr( wKindID );
if ( pArr == NULL ) return NULL;
BYTE byScoreRoom = 0;//房卡成绩
if ( dwServerRules & SERVER_RULES_SCORE ) byScoreRoom = 1;//房卡积分
if ( dwServerRules & SERVER_RULES_GOLD ) byScoreRoom = 2;//房卡金币
if (dwServerRules & GAME_GENRE_ROOM_GOLD) byScoreRoom = 3;//房卡积分
if (dwServerRules & SERVER_RULES_100SCORE) byScoreRoom = 4;//房卡积分
if (dwServerRules & SERVER_RULES_100GOLD) byScoreRoom = 5;//房卡金币
for ( int i = 0; i < pArr->GetCount(); i++ )
{
tagRoomTableStatus * pTableStatus = &pArr->GetAt( i );
if ( pTableStatus->dwRoomID != 0 ) continue; //过滤已开房间
if ( pTableStatus->byScoreServer != byScoreRoom ) continue;//过滤服务器类型
//初始化数据
pTableStatus->dwRoomID = dwRoomID;
pTableStatus->dwCreaterID = dwUserID;
pTableStatus->dwServerRules = dwServerRules;
pTableStatus->dwClubID = dwClubID;
pTableStatus->dwLeagueID = dwLeagueID;
pTableStatus->wProgress = 0;
pTableStatus->byPartID = 0;
pTableStatus->dwCreatTime = 0;
pTableStatus->dwApplyTime = ( DWORD ) time( NULL );
pTableStatus->lRoomCard = 0;
pTableStatus->wAndroidCnt = 0;
pTableStatus->dwkaijuqr = dwkaijuqr;
pTableStatus->byCardType = ( dwServerRules & SERVER_RULES_AA ) ? 1 : 0;
pTableStatus->dwPayUserID = /*pTableStatus->byCardType ? 0 :*/ dwPayUserID;
ZeroMemory( pTableStatus->dwRules, sizeof( pTableStatus->dwRules ) );
ZeroMemory( pTableStatus->dwUserID, sizeof( pTableStatus->dwUserID ) );
//房号索引
m_MapRoomNum[dwRoomID] = pTableStatus;
return pTableStatus;
}
return NULL;
}最厚一个参数就是开掘确认参数。而且这个函数的调用是在:
CAttemperEngineSink::OnDBPCCreatRoomRes
这个函数中。也就是在发送目标服务器的时候带上参数就行。
好了,其他就很简单了就不写了,只记录方便自己下次使用。确实你开发的时候遇到了,也没看懂那么可以留言,大家一起研究解决哈
如果是联盟的话可以关注这个函数:
tagRoomTableStatus * CGlobalInfoManager::UpdateRoom
这个函数是反向注册协调哪里传入应该。具体我没研究,因为用不到。反正我是最开始没注意,走了很多弯路哈哈

