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