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

📄 userlist.cpp

📁 魔域源代码需要的可以学习一下真么这么麻烦啊
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
}

//////////////////////////////////////////////////////////////////////
bool CUserList::CreateUser(PROCESS_ID idProcess, OBJID idUser, LPCTSTR szName, OBJID idAccount, SOCKET_ID idSocket, int nLevel, LPCTSTR szNotify)
{
	if(idSocket >= m_setUser.size())
		m_setUser.resize(idSocket + 1, NULL);		// +1 : 保证有m_setUser[idSocket]这个成员

	IF_NOT(!m_setUser[idSocket])
	{
		LOGERROR("玩家使用相同SOCKET登录,新玩家[%s][%u],SOCKET[%d],旧玩家[%s][%d]",
					szName, idUser, idSocket, m_setUser[idSocket]->szName, m_setUser[idSocket]->idUser);
		// gm ?
		if (m_setUser[idSocket]->IsGM())
		{
			vector<OBJID>::iterator iter;
			for (iter = m_setGm.begin(); iter != m_setGm.end(); iter++)
			{
				if (m_setUser[idSocket]->GetID() == *iter)
				{
					m_setGm.erase(iter);
					break;
				}
			}
		}
		KickOutSocket(idSocket);
		return false;
	}

	m_setUser[idSocket] = new CPlayer;
	if(!m_setUser[idSocket])
		return false;

	m_setUser[idSocket]->idUser		= idUser;
	SafeCopy(m_setUser[idSocket]->szName, szName, _MAX_NAMESIZE);
	m_setUser[idSocket]->idProcess	= idProcess;
	SafeCopy(m_setUser[idSocket]->szAccount, szNotify, _MAX_NAMESIZE);
	m_setUser[idSocket]->idSocket	= idSocket;
	m_setUser[idSocket]->m_idAccount	= idAccount;
	m_setUser[idSocket]->m_nLevel		= nLevel;
	SafeCopy(m_setUser[idSocket]->szNotify, szNotify, _MAX_NAMESIZE);

	m_setUser[idSocket]->m_tPoint	= time(NULL);

	// gm ?
	if (m_setUser[idSocket]->IsGM())
		m_setGm.push_back(m_setUser[idSocket]->GetID());

	{ // stat
		m_nPlayerAmount++;
		if(m_nMaxPlayerAmount < m_nPlayerAmount)
			m_nMaxPlayerAmount = m_nPlayerAmount;
		extern struct STAT_STRUCT	g_stat;
		InterlockedExchange(&g_stat.nAllPlayers, m_nPlayerAmount);
		InterlockedExchange(&g_stat.nMaxPlayers, m_nMaxPlayerAmount);
		InterlockedIncrement(&g_stat.nLoginPlayers);
	}
	return true;
}

//////////////////////////////////////////////////////////////////////
bool CUserList::CreateAgent(PROCESS_ID idProcess, OBJID idAgent, LPCTSTR szName)
{
	CPlayer* pAgent = new CPlayer;
	if(!pAgent)
		return false;

	pAgent->idUser			= idAgent;
	SafeCopy(pAgent->szName, szName, _MAX_NAMESIZE);
	pAgent->idProcess		= idProcess;
	pAgent->szAccount[0]	= 0;
	pAgent->idSocket		= SOCKET_NONE;
	pAgent->m_idAccount		= ID_NONE;
	pAgent->m_nLevel		= 0;
	pAgent->szNotify[0]		= 0;

	m_setAgent->AddObj(pAgent);

	return true;
}

//////////////////////////////////////////////////////////////////////
CPlayer* CUserList::GetPlayer(LPCTSTR szName)
{
	for(int i = 0; i < m_setUser.size(); i++)
	{
		if(m_setUser[i])
		{
			if(strcmp(m_setUser[i]->szName, szName) == 0)
				return m_setUser[i];
		}
	}

	AGENT_SET::Iterator pAgent = m_setAgent->NewEnum();
	while(pAgent.Next())
	{
		if(strcmp(pAgent->szName, szName) == 0)
			return pAgent;
	}

	return NULL;
}

//////////////////////////////////////////////////////////////////////
CPlayer* CUserList::GetPlayer(OBJID idUser)
{
	for(int i = 0; i < m_setUser.size(); i++)
	{
		if(m_setUser[i])
		{
			if(m_setUser[i]->idUser == idUser)
				return m_setUser[i];
		}
	}

	AGENT_SET::Iterator pAgent = m_setAgent->NewEnum();
	while(pAgent.Next())
	{
		if(pAgent->GetID() == idUser)
			return pAgent;
	}

	return NULL;
}

//////////////////////////////////////////////////////////////////////
CPlayer* CUserList::GetPlayerByAccount(LPCTSTR szAccount)
{
	for(int i = 0; i < m_setUser.size(); i++)
	{
		if(m_setUser[i])
		{
			if(strcmp(m_setUser[i]->szAccount, szAccount) == 0)
				return m_setUser[i];
		}
	}

	return NULL;
}

//////////////////////////////////////////////////////////////////////
CPlayer* CUserList::GetPlayerByAccountID(OBJID idAccount)
{
	for(int i = 0; i < m_setUser.size(); i++)
	{
		if(m_setUser[i])
		{
			if(m_setUser[i]->m_idAccount == idAccount)
				return m_setUser[i];
		}
	}

	return NULL;
}

//////////////////////////////////////////////////////////////////////
bool CUserList::CreateNewPlayer(LPCTSTR szAccount, LPCTSTR szName, LPCTSTR szPassword, 
						int unLook, int nData, OBJID idAccount, char cLength, char cFat)
{
	int idMap	= DEFAULT_LOGIN_MAPID;								// 缺省的登录点地图
	CMapSt* pMap = MapList()->GetMap(idMap);
	if(!pMap)
		return false;

	// default attribute
	int nProfession = nData;
	CHECKF(nProfession==10 || nProfession==20 || nProfession==30);

	int nForce	= 0;
	int nHealth	= 0;
	int nDex	= 0;
	int nSoul	= 0;
	if (nProfession == 20)	// 战
	{
		nForce	= 15;
		nHealth	= 10;
		nDex	= 1;
		nSoul	= 0;
	}
	else if (nProfession == 30)	// 异能者
	{
		nForce	= 15;
		nHealth	= 8;
		nDex	= 1;
		nSoul	= 3;
	}
	else //if (nProfession == 10)	// 魔
	{
		nForce	= 15;
		nHealth	= 5;
		nDex	= 2;
		nSoul	= 4;
	}
//	CHECKF(nForce + nHealth + nDex + nSoul == NEWBIE_ATTR_POINT);

	int nMaxLife = nHealth * 10;		// nHealth*10;
	int nMaxMana = nSoul * 20;			// nSoul*20;
	int nDefaultMoney = 0;

	// default icon
	int nSex = (unLook/1000)%10;
//	unLook = (unLook%10000)+10000;
	int nDefaultHair = 101;
	const int DEFAULT_ALLOT_POINT = 0;

	SQLBUF	szSQL;
	sprintf(szSQL, "INSERT %s SET account_id=%u,name='%s',lookface=%d,hair=%d,length=%d,fat=%d,life=%d,mana=%d,money=%u,recordmap_id=%u, recordx=%u, recordy=%u,force=%d,dexterity=%d,health=%d,soul=%d,profession=%d,additional_point=%d",
					_TBL_USER,
					idAccount, szName, unLook, nDefaultHair, cLength, cFat,
					nMaxLife, nMaxMana, nDefaultMoney,
					idMap, DEFAULT_LOGIN_POSX, DEFAULT_LOGIN_POSY,
					nForce, nDex, nHealth, nSoul, nProfession, DEFAULT_ALLOT_POINT);
	return GameWorld()->GetDatabase()->ExecuteSQL(szSQL);		// 不检查重名和重帐号,由UNI_KEY保证
}

//////////////////////////////////////////////////////////////////////
void CUserList::ChangeProcessID(SOCKET_ID idSocket, PROCESS_ID idProcess)
{
	CHECK(idProcess >= MSGPORT_MAPGROUP_FIRST && idProcess < GameWorld()->GetMsgPort()->GetSize());
	CHECK(idSocket >= 0 && idSocket < m_setUser.size());

	m_setUser[idSocket]->idProcess = idProcess;
}

//////////////////////////////////////////////////////////////////////
void CUserList::LoginToMapGroup(CPlayer* pPlayer)
{
	CHECK(pPlayer);

	// 转到地图组中进行登录。
	IMessagePort* pPort = GameWorld()->GetMsgPort();
	ST_LOGIN	cLogin;
	cLogin.idSocket	= pPlayer->idSocket;
	cLogin.idUser	= pPlayer->GetID();
	PROCESS_ID	idMapGroupProcess = pPlayer->GetProcessID();
	pPort->Send(idMapGroupProcess, MAPGROUP_LOGIN, STRUCT_TYPE(ST_LOGIN), &cLogin);
	// 转换PROCESS_ID,标志玩家进入了MAPGROUP。(@帐号服务器是在MsgConnect中)
	pPlayer->idProcess	= idMapGroupProcess;	// 已设置,无意义		// readme.txt(2-9)

	if(!pPlayer->IsAgent())
	{
		CMsgTalk	msg;
		if(msg.Create(SYSTEM_NAME, ALLUSERS_NAME, REPLAY_OK_STR, NULL, _COLOR_WHITE, _TXTATR_ENTRANCE))
			pPlayer->SendMsg(&msg);
	}
}

//////////////////////////////////////////////////////////////////////
void CUserList::BroadcastMsg(CNetMsg* pMsg, CPlayer* pExcludeSender/*=NULL*/)
{
	CHECK(pMsg);

	for(int i = 0; i < m_setUser.size(); i++)
	{
		CPlayer* pPlayer = m_setUser[i];
		if(pPlayer && (!pExcludeSender || pExcludeSender->GetID() != pPlayer->GetID()))
			pPlayer->SendMsg(pMsg);
	}

	AGENT_SET::Iterator pAgent = m_setAgent->NewEnum();
	while(pAgent.Next())
	{
		if(pAgent && (!pExcludeSender || pExcludeSender->GetID() != pAgent->GetID()))
		{
			pAgent->SendMsg(pMsg);
			return;		// only one msg
		}
	}
}

//////////////////////////////////////////////////////////////////////
void CUserList::BroadcastMsg(LPCTSTR szMsg, CPlayer* pExcludeSender/*=NULL*/, LPCTSTR pszEmotion, DWORD dwColor, int nAttribute)
{
	CHECK(szMsg);

	CMsgTalk	msg;
	if(msg.Create(SYSTEM_NAME, ALLUSERS_NAME, (char*)szMsg, (char*)pszEmotion, dwColor, nAttribute))
		BroadcastMsg(&msg, pExcludeSender);
}

//////////////////////////////////////////////////////////////////////
void CUserList::DelAllAgent()
{
	AGENT_SET::Iterator pAgent	= m_setAgent->NewEnum();
	while(pAgent.Next())
		m_setAgent->DelObj(pAgent);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -