📄 room.cpp
字号:
#include "stdafx.h"
#include "LobbyServer.h"
#include "msgHandler.h"
#include "user.h"
#include "room.h"
char *log_roomstate[] = {"STATE_CLOSE",
"STATE_WAITING",
"STATE_RUNNING",
"STATE_PLAYING"};
CRoom::CRoom()
{
m_nUserIdx = NULL;
m_pAuthIndex = NULL;
m_pAuthCode = NULL;
}
CRoom::~CRoom()
{
SAFE_DELETE_ARRAY(m_nUserIdx);
SAFE_DELETE_ARRAY(m_pAuthIndex);
SAFE_DELETE_ARRAY(m_pAuthCode);
}
void CRoom::Init(short iChannel, short nIndex)
{
m_nIndex = nIndex;
m_nUserCnt = 0;
m_nPcCnt = 0;
m_nState = STATE_CLOSE;
m_iChannel = iChannel;
m_nUserIdx = new short[g_cLobbyServer.m_cConfig.cfg_maxplayer];
int i=g_cLobbyServer.m_cConfig.cfg_maxplayer;
while(i--) m_nUserIdx[i] = -1;
}
char *CRoom::GetStateLog()
{
return log_roomstate[m_nState];
}
BOOL CRoom::IsEmpty()
{
return (m_nUserCnt == 0);
}
BOOL CRoom::IsOpen()
{
return (m_nState == STATE_CLOSE);
}
BOOL CRoom::IsJoin()
{
if(m_nUserCnt == 0 || m_nUserCnt >= m_nUserLimit)
return FALSE;
return TRUE;
}
BOOL CRoom::IsQuickJoin(int nMode)
{
//甸绢哎 荐 乐绰规, 傍俺规, 评技泼, 霸烙葛靛 眉农
if(!IsJoin() || m_szPwd[0] ||
// nMode != MODE_NONE &&
nMode != m_nMode)
return FALSE;
return TRUE;
}
void CRoom::Open(char **pInfoPack)
{
net_data(pInfoPack, &m_nUserLimit, 1);
net_data(pInfoPack, &m_nMode, 1);
net_data(pInfoPack, &m_nRepairCnt, 1);
net_data(pInfoPack, &m_nMap, 1);
net_data(pInfoPack, &m_dwPlayTime, 1);
net_data(pInfoPack, m_szTitle, LEN_TITLE+1);
net_data(pInfoPack, m_szPwd, 1);
if(m_szPwd[0])
net_data(pInfoPack, m_szPwd, m_szPwd[0]);
//檬扁拳
m_iCapSlot = 0;
m_nState = STATE_WAITING;
m_nUserCnt = 0;
m_nPcCnt = 0;
#ifdef _DBG_GAMELOGIC
_printf("CHANNLE%d ROOM%d:%s [ROOMOPEN] %s\n", m_iChannel, m_nIndex, m_szTitle, log_mode[m_nMode]);
#endif
}
BOOL CRoom::Join(short nUserIndex)
{
CUser *pUser = (CUser *)g_cLobbyServer.GetClient(nUserIndex);
int i=0;
while(i < g_cLobbyServer.m_cConfig.cfg_maxplayer)
{
if(m_nUserIdx[i] < 0)
{
m_nUserIdx[i] = pUser->m_nIndex;
pUser->m_iRoom = m_nIndex;
pUser->m_iRoomSlot = (short)i;
pUser->m_nTeam = TEAM_NONE;
pUser->m_nReady = READY_OFF;
pUser->m_nState = CClient::STATE_JOINROOM;
++m_nUserCnt;
SetTeam();
return TRUE;
}
++i;
}
return FALSE;
}
BOOL CRoom::Out(short nUserIndex, BOOL bBlock)
{
if(m_nUserCnt <= 0)
{
_printf("**********************************exception************************************\n");
_log("ROOM%d CountError[UserCnt=%d] CRoom::Out()", m_nIndex, m_nUserCnt);
return FALSE;
}
CUser *pUser = (CUser *)g_cLobbyServer.GetClient(nUserIndex);
if(!pUser)
{
_printf("**********************************exception************************************\n");
_log("PC%d IndexError[user == NULL] CRoom::Out()", nUserIndex);
return FALSE;
}
if(pUser->m_nState != CClient::STATE_ROOM)
{
_printf("**********************************exception************************************\n");
_log("PC%d StateError[state != STATE_ROOM] CRoom::Out() > 泅犁 蜡历惑怕[%s]", pUser->m_nIndex, pUser->GetStateLog());
return FALSE;
}
if(m_nUserIdx[pUser->m_iRoomSlot] != pUser->m_nIndex)
{
_printf("**********************************exception************************************\n");
_log("PC%d IndexError[lobby_userindex != %d] CRoom::Out() > ROOM%d 浇吩牢郸胶[%d]", pUser->m_nIndex, m_nUserIdx[pUser->m_iRoomSlot], m_nIndex, pUser->m_iRoomSlot);
return FALSE;
}
--m_nUserCnt;
--m_nPcCnt;
#ifdef _DBG_GAMELOGIC
_printf("CHANNLE%d ROOM%d:%s [ROOMOUT] count:%d(%d)/%d\n", m_iChannel, m_nIndex, pUser->m_szNick, m_nPcCnt, m_nUserCnt, m_nUserLimit);
#endif
if(IsEmpty())
{
Close();
}
else
{
if(m_nPcCnt) //规俊 甸绢客 乐绰 蜡历啊 乐促
{
//唱埃仇捞 规厘捞促
if(m_iCapSlot == pUser->m_iRoomSlot)
{
int i=0;
while(i < g_cLobbyServer.m_cConfig.cfg_maxplayer)
{
if(m_nUserIdx[i] >= 0 && m_iCapSlot != i &&
g_cLobbyServer.m_cpUser[m_nUserIdx[i]].m_nState >= CClient::STATE_ROOM)
{
m_iCapSlot = (short)i; //规俊 措扁窍绊 乐绰 蜡历吝俊 茄疙捞 规厘捞伙
break;
}
++i;
}
}
//鞍篮规 糕滚甸俊霸 唱埃蜡历沥焊 傈价
lsc_member_delete(pUser->m_nIndex, FALSE);
}
else //规俊 甸绢坷妨 窍绰 蜡历父 乐促
{
//唱埃仇捞 规厘捞绊, 规俊 甸绢客 乐绰 荤恩捞 绝促
if(m_iCapSlot == pUser->m_iRoomSlot)
{
int i=0;
while(i < g_cLobbyServer.m_cConfig.cfg_maxplayer)
{
if(m_nUserIdx[i] >= 0 && m_iCapSlot != i &&
g_cLobbyServer.m_cpUser[m_nUserIdx[i]].m_nState >= CClient::STATE_JOINROOM)
{
m_iCapSlot = (short)i; //规俊 甸绢坷妨绊 霖厚吝牢 蜡历吝 茄疙捞 规厘
break;
}
++i;
}
}
}
}
m_nUserIdx[pUser->m_iRoomSlot] = -1;
pUser->m_iRoomSlot = -1;
pUser->m_iRoom = -1;
pUser->m_nState = CClient::STATE_BACKLOBBY; //捞贰具 促矫 'CLS_LOBBY_IN' 阑 罐阑 荐 乐促
//唱哎赤籍俊霸 唱啊档 亮促绊 傈价
void *ioc = net_message(M_LOBBYSERVER, LSC_ROOM_OUT, 0);
if(ioc)
{
net_packet(ioc, (bool *)&bBlock, 1);
if(!net_send(pUser->m_nIndex, ioc))
net_disconnect(pUser->m_nIndex, false);
}
return TRUE;
}
BOOL CRoom::Quit(short nUserIndex)
{
if(m_nUserCnt <= 0)
{
_printf("**********************************exception************************************\n");
_log("ROOM%d CountError[UserCnt=%d] CRoom::Quit()", m_nIndex, m_nUserCnt);
return FALSE;
}
CUser *pUser = (CUser *)g_cLobbyServer.GetClient(nUserIndex);
if(!pUser)
{
_printf("**********************************exception************************************\n");
_log("PC%d IndexError[user == NULL] CRoom::Quit()", nUserIndex);
return FALSE;
}
if(pUser->m_nState < CClient::STATE_JOINROOM)
{
_printf("**********************************exception************************************\n");
_log("PC%d StateError[state < STATE_JOINROOM] CRoom::Quit() > 泅犁 蜡历惑怕[%s]", pUser->m_nIndex, pUser->GetStateLog());
return FALSE;
}
if(m_nUserIdx[pUser->m_iRoomSlot] != pUser->m_nIndex)
{
_printf("**********************************exception************************************\n");
_log("PC%d IndexError[lobby_userindex != %d] CRoom::Quit() > ROOM%d 浇吩牢郸胶[%d]", pUser->m_nIndex, m_nUserIdx[pUser->m_iRoomSlot], m_nIndex, pUser->m_iRoomSlot);
return FALSE;
}
--m_nUserCnt;
if(pUser->m_nState != CClient::STATE_JOINROOM)
--m_nPcCnt;
#ifdef _DBG_GAMELOGIC
_printf("CHANNLE%d ROOM%d:%s [ROOMQUIT] count:%d(%d)/%d\n", m_iChannel, m_nIndex, pUser->m_szNick, m_nPcCnt, m_nUserCnt, m_nUserLimit);
#endif
if(IsEmpty())
{
Close();
}
else
{
//霸烙吝 唱艾阑锭
if(m_nState >= STATE_RUNNING)
{
//唱埃仇捞 规厘捞促
if(m_iCapSlot == pUser->m_iRoomSlot)
{
int i=0;
while(i < g_cLobbyServer.m_cConfig.cfg_maxplayer)
{
if(m_nUserIdx[i] >= 0 && m_iCapSlot != i &&
g_cLobbyServer.m_cpUser[m_nUserIdx[i]].m_nState >= CClient::STATE_JOINGAME)
{
m_iCapSlot = (short)i; //敲饭捞吝牢 蜡历吝 茄疙阑 规厘栏肺 伙绰促
break;
}
++i;
}
}
}
if(m_nPcCnt) //规俊 甸绢客 乐绰 蜡历啊 乐促
{
//唱埃仇捞 规厘捞绊, 霸烙吝牢 蜡历吝俊 规厘且 荤恩捞 绝芭唱 规捞 酒流 措扁吝捞促
if(m_iCapSlot == pUser->m_iRoomSlot)
{
int i=0;
while(i < g_cLobbyServer.m_cConfig.cfg_maxplayer)
{
if(m_nUserIdx[i] >= 0 && m_iCapSlot != i &&
g_cLobbyServer.m_cpUser[m_nUserIdx[i]].m_nState >= CClient::STATE_ROOM)
{
m_iCapSlot = (short)i; //规俊 措扁窍绊 乐绰 蜡历吝俊 茄疙捞 规厘捞伙
break;
}
++i;
}
}
//唱埃仇捞 STATE_JOINROOM捞搁 酒流 糕滚俊 加秦乐瘤 臼篮芭具
if(pUser->m_nState != CClient::STATE_JOINROOM)
{
//鞍篮规 糕滚甸俊霸 唱埃蜡历沥焊 傈价
lsc_member_delete(pUser->m_nIndex, FALSE);
}
}
else //规俊 甸绢坷妨 窍绰 蜡历父 乐促
{
//唱埃仇捞 规厘捞绊, 规俊 甸绢客 乐绰 荤恩捞 绝促
if(m_iCapSlot == pUser->m_iRoomSlot)
{
int i=0;
while(i < g_cLobbyServer.m_cConfig.cfg_maxplayer)
{
if(m_nUserIdx[i] >= 0 && m_iCapSlot != i &&
g_cLobbyServer.m_cpUser[m_nUserIdx[i]].m_nState >= CClient::STATE_JOINROOM)
{
m_iCapSlot = (short)i; //规俊 甸绢坷妨绊 霖厚吝牢 蜡历吝 茄疙捞 规厘
break;
}
++i;
}
}
}
}
m_nUserIdx[pUser->m_iRoomSlot] = -1;
return TRUE;
}
void CRoom::Close()
{
m_nState = STATE_CLOSE;
lsc_room_delete(m_iChannel, m_nIndex);
#ifdef _DBG_GAMELOGIC
_printf("CHANNLE%d ROOM%d:%s [ROOMCLOSE] %s\n", m_iChannel, m_nIndex, m_szTitle, log_mode[m_nMode]);
#endif
}
void CRoom::SendAll(void *ioc)
{
CUser *pClient;
int i=0;
while(i < g_cLobbyServer.m_cConfig.cfg_maxplayer)
{
if(m_nUserIdx[i] >= 0)
{
pClient = g_cLobbyServer.m_cpUser + m_nUserIdx[i];
if(pClient->m_nState == CClient::STATE_ROOM || pClient->m_nState == CClient::STATE_GAME)
{
if(!net_broadcast(pClient->m_nIndex, ioc))
net_disconnect(pClient->m_nIndex, false);
}
}
++i;
}
net_endcast(ioc);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -