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

📄 userlist.cpp

📁 魔域源代码需要的可以学习一下真么这么麻烦啊
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// UserList.cpp: implementation of the CUserList class.
//
//////////////////////////////////////////////////////////////////////
#include "MessagePort.h"
#include "common.h"
#include "NetMsg.h"
#include "I_mydb.h"
#include "protocol.h"
#include "inifile.h"
#include "MsgFee_A.h"
using namespace world_kernel;
#include "AllMsg.h"
#include "supermanlist.h"
#include "UserList.h"
#include "MessageBoard.h"
#include "WorldKernel.h"

const int	SECS_PER_GAMEHOUR		= 300;			// send CMsgTime to all user
const int	NEWBIE_ATTR_POINT		= 10;			// 新建角色属性点总和
//////////////////////////////////////////////////////////////////////
void CPlayer::OnTimer(time_t tCurr)
{
	if(IsAgent())
		return;

	if(m_nLevel < LOGIN_FREE_LEVEL)
	{
		m_tPoint	= time(NULL);
		if (m_tTick.ToNextTime(POINTFEE_SECS))
			GameWorld()->SendFee(m_idAccount, CMsgFee_A::FEE_TICK);
		return;
	}

	// account server
	if(GameWorld()->IsAccountLoginOK() && time(NULL) > m_tPoint + POINTFEE_DELAY_SECS)
	{
		m_tPoint += POINTFEE_SECS;

		GameWorld()->SendFee(m_idAccount, CMsgFee_A::FEE_POINT);
	}
}

bool CPlayer::SendMsg(CNetMsg* pMsg)
{
	if(IsAgent())
		return GameWorld()->SendNpcMsg(GetID(), pMsg);
	else
		return GameWorld()->SendClientMsg(idSocket, pMsg);
}


MYHEAP_IMPLEMENTATION(CUserList,s_heap)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CUserList::CUserList()
{
	m_nPlayerAmount		= 0;
	m_nMaxPlayerAmount	= 0;
	m_nHour				= 6;		// start server in 8 am.
	m_setAgent			= AGENT_SET::CreateNew(true);
}

//////////////////////////////////////////////////////////////////////
CUserList::~CUserList()
{

}

//////////////////////////////////////////////////////////////////////
bool CUserList::Create(ISocket* pSocket, IDatabase* pDb)
{
	CHECKF(pSocket);
	m_pSocket	= pSocket;

	m_pSupermanSet = CSupermanList::CreateNew();
	CHECKF(m_pSupermanSet && m_pSupermanSet->Create(pDb));

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CUserList::LoginUser(LPCTSTR szAccount, LPCTSTR szPassword, SOCKET_ID idSocket)	// 仅用于非帐号服务器启动
{
#ifdef	ACCOUNT_ENABLE
	return false;
#endif
	bool	bRet = false;
	SQLBUF	szSQL;
	sprintf(szSQL, "SELECT id, name, account_id, recordmap_id FROM %s WHERE account='%s' && password='%s'", _TBL_USER, szAccount, szPassword);
	IRecordset*	pRes = GameWorld()->GetDatabase()->CreateNewRecordset(szSQL);		//VVVVVVVVVVVVVVVVVVVVVVVV
	if(pRes)
	{
		OBJID	idUser	= pRes->LoadDWord("id");
		NAMESTR	szName = "无";
		pRes->LoadString(szName, "name", _MAX_NAMESIZE);
		OBJID	idAccount	= pRes->LoadDWord("account_id");
		OBJID	idMap	= pRes->LoadDWord("recordmap_id");
		PROCESS_ID	idProcess	= MapList()->GetMapProcessID(idMap);
		ASSERT (idProcess != PROCESS_NONE);
		int		nLevel	= 0;		// 未帐号服务器登录,不需要等级
		CreateUser(idProcess, idUser, szName, idAccount, idSocket, nLevel, szAccount);

		bRet = true;
		pRes->Release();;		//AAAAAAAAAAAAAAAAAAAAAAAAAA

		GameWorld()->SendFee(idAccount, CMsgFee_A::FEE_BEGIN);
	}

	{
		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 bRet;
}

//////////////////////////////////////////////////////////////////////
// enum { LOGIN_OK, LOGIN_NEW, LOGIN_BAN };
int CUserList::LoginUser(OBJID idAccount, SOCKET_ID idSocket, LPCTSTR szInfo)
{
	int	nRet = LOGIN_NEW;
	SQLBUF	szSQL;
	sprintf(szSQL, "SELECT id, name, account_id, recordmap_id, level FROM %s WHERE account_id='%u'", _TBL_USER, idAccount);
	IRecordset*	pRes = GameWorld()->GetDatabase()->CreateNewRecordset(szSQL);		//VVVVVVVVVVVVVVVVVVVVVVVV
	if(pRes)
	{
		OBJID	idUser	= pRes->LoadDWord("id");
		NAMESTR	szName = "无";
		pRes->LoadString(szName, "name", _MAX_NAMESIZE);
		OBJID	idAccount	= pRes->LoadDWord("account_id");
		OBJID	idMap	= pRes->LoadDWord("recordmap_id");
		PROCESS_ID	idProcess	= MapList()->GetMapProcessID(idMap);
		int		nLevel	= pRes->LoadInt("level");

		if(!(strcmp(szInfo, FLAG_NO_POINT) == 0 && nLevel >= LOGIN_FREE_LEVEL)
				&& CreateUser(idProcess, idUser, szName, idAccount, idSocket, nLevel, szInfo))
		{
			nRet = LOGIN_OK;
			GameWorld()->SendFee(idAccount, CMsgFee_A::FEE_BEGIN);
		}
		else
		{
			nRet = LOGIN_BAN;
			GameWorld()->SendFee(idAccount, CMsgFee_A::FEE_OFFLINE);
		}
		pRes->Release();		//AAAAAAAAAAAAAAAAAAAAAAAAAA

	}

	return nRet;
}

//////////////////////////////////////////////////////////////////////
bool CUserList::LoginAgent(OBJID idAgent)
{
	int	nRet = LOGIN_NEW;
	SQLBUF	szSQL;
	sprintf(szSQL, "SELECT id, name, recordmap_id, level FROM %s WHERE id=%u && account_id=0", _TBL_USER, idAgent);
	IRecordset*	pRes = GameWorld()->GetDatabase()->CreateNewRecordset(szSQL);		//VVVVVVVVVVVVVVVVVVVVVVVV
	if(pRes)
	{
		OBJID	idUser	= pRes->LoadDWord("id");
		NAMESTR	szName = "无";
		pRes->LoadString(szName, "name", _MAX_NAMESIZE);
		OBJID	idAccount	= ID_NONE;
		SOCKET_ID	idSocket	= SOCKET_NONE;
		OBJID	idMap	= pRes->LoadDWord("recordmap_id");
		PROCESS_ID	idProcess	= MapList()->GetMapProcessID(idMap);
		int		nLevel	= pRes->LoadInt("level");

		pRes->Release();		//AAAAAAAAAAAAAAAAAAAAAAAAAA

		if(CreateAgent(idProcess, idAgent, szName))
			return true;
	}

	return false;
}

//////////////////////////////////////////////////////////////////////
bool CUserList::LogoutUser(SOCKET_ID idSocket)		// return false: no this user
{
	if(!( idSocket != SOCKET_NONE && idSocket < m_setUser.size() && m_setUser[idSocket] ))
		return false;

	// account server
	CPlayer* pPlayer = m_setUser[idSocket];
	CHECKF(pPlayer);
	GameWorld()->SendFee(pPlayer->m_idAccount, CMsgFee_A::FEE_END);
	int	tCurr = time(NULL);
	if(tCurr > pPlayer->m_tPoint + POINTFEE_SECS)
	{
		LOGWARNING("玩家[%s][%u]退出时有[%d]个点没有成功上传!", 
				pPlayer->szName, pPlayer->GetID(), (tCurr - pPlayer->m_tPoint) / POINTFEE_SECS);
	}

	// gm ?
	if (pPlayer->IsGM())
	{
		vector<OBJID>::iterator iter;
		for (iter = m_setGm.begin(); iter != m_setGm.end(); iter++)
		{
			if (pPlayer->GetID() == *iter)
			{
				m_setGm.erase(iter);
				break;
			}
		}
	}

	{ // stat
		m_nPlayerAmount--;
		extern struct STAT_STRUCT	g_stat;
		InterlockedExchange(&g_stat.nAllPlayers, m_nPlayerAmount);
		InterlockedIncrement(&g_stat.nLogoutPlayers);
	}
	{
		SAFE_DELETE(m_setUser[idSocket]);
		m_setUser[idSocket] = NULL;
		return true;
	}
}

//////////////////////////////////////////////////////////////////////
bool CUserList::KickOutAccount(OBJID idAccount, LPCTSTR szText)		// return false: 不在线
{
	CHECKF(szText);

	CPlayer* pPlayer = GetPlayerByAccountID(idAccount);
	if(!pPlayer)
		return false;
	LOGDEBUG("DEBUG:世界核心踢出帐号[%u],SOCKET_ID[%d]", idAccount, pPlayer->idSocket);

	{
		CMsgTalk	msg;
		if(msg.Create(SYSTEM_NAME, ALLUSERS_NAME, (char*)szText, NULL, _COLOR_WHITE, _TXTATR_REGISTER))
			pPlayer->SendMsg(&msg);
	}
	return GameWorld()->GetSocketInterface()->CloseSocket(pPlayer->idSocket);
}

//////////////////////////////////////////////////////////////////////
bool CUserList::KickOutSocket(SOCKET_ID idSocket)		// return false: 不在线
{
	LOGDEBUG("DEBUG:世界核心踢出SOCKET_ID[%d]", idSocket);
	return GameWorld()->GetSocketInterface()->CloseSocket(idSocket);
}

//////////////////////////////////////////////////////////////////////
void CUserList::OnTimer(time_t tCurr)
{
	for(int i = 0; i < m_setUser.size(); i++)
	{
		if(m_setUser[i])
			m_setUser[i]->OnTimer(tCurr);
	}

	if(m_tHour.ToNextTick(SECS_PER_GAMEHOUR))
	{
		m_nHour = (++m_nHour) % 24;
/*
		CMsgTime	msg;
		IF_OK(msg.Create(m_nHour))
		{
			for(int i = 0; i < m_setUser.size(); i++)
			{
				if(m_setUser[i])
					GameWorld()->SendClientMsg(i, &msg);
			}
		}
*/
	}
}

//////////////////////////////////////////////////////////////////////
void CUserList::SendTimeToSocket(SOCKET_ID idSocket)
{
/*	CMsgTime	msg;
	IF_OK(msg.Create(m_nHour))
		GameWorld()->SendClientMsg(idSocket, &msg);
*/
}

//////////////////////////////////////////////////////////////////////
void CUserList::LogoutAllUser()

⌨️ 快捷键说明

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