📄 userlist.cpp
字号:
// 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 + -