⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 room.cpp

📁 国外网游源码....除工具源码缺少之外,其余程序都全...至于,什么游戏,因为国内还没有,所以找不到测试
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -