Code:
// CSHandler.cpp : C/S Protocol Handler ÇÔ¼öÀÇ ±¸ÇöÀÔ´Ï´Ù.
#include "stdafx.h"
#include "TLoginSvr.h"
#include "TLoginSvrModule.h"
DWORD CTLoginSvrModule::OnCT_SERVICEMONITOR_ACK( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet )
{
DWORD dwSESSION;
DWORD dwTUSER;
DWORD dwTACTIVEUSER;
DWORD dwTick;
packet >> dwTick;
EnterCriticalSection(&m_csLI);
dwSESSION = DWORD(m_mapTSESSION.size());
dwTUSER = DWORD(m_mapTUSER.size());
dwTACTIVEUSER = DWORD(m_mapACTIVEUSER.size());
static DWORD tick = GetTickCount();
DWORD dwCurrent = GetTickCount();
if(dwCurrent - tick > 5000)
{
MAPTUSER::iterator it;
for(it=m_mapTSESSION.begin(); it!=m_mapTSESSION.end(); it++)
{
if((*it).second->m_bSessionType == SESSION_CLIENT &&
(*it).second->m_dwAcceptTick &&
dwCurrent - (*it).second->m_dwAcceptTick > 10000)
{
CloseSession((*it).second);
}
if((*it).second->m_bSessionType == SESSION_CLIENT &&
(*it).second->m_dwSendTick &&
dwCurrent - (*it).second->m_dwSendTick > 30000)
{
(*it).second->SendCS_HOTSEND_ACK();
}
}
tick = dwCurrent;
}
LeaveCriticalSection(&m_csLI);
pUser->SendCT_SERVICEMONITOR_REQ(
dwTick,
dwSESSION,
dwTUSER,
dwTACTIVEUSER);
return EC_NOERROR;
}
DWORD CTLoginSvrModule::OnCT_SERVICEDATACLEAR_ACK(CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
EnterCriticalSection(&m_csLI);
m_mapACTIVEUSER.clear();
MAPDWORD::iterator itA;
MAPTUSER::iterator itU;
for( itU = m_mapTUSER.begin(); itU != m_mapTUSER.end(); itU++)
{
itA = m_mapACTIVEUSER.find( (*itU).second->m_dwID );
if( itA == m_mapACTIVEUSER.end() )
m_mapACTIVEUSER.insert( MAPDWORD::value_type( (*itU).second->m_dwID, (*itU).second->m_dwID ) );
}
LeaveCriticalSection(&m_csLI);
return EC_NOERROR;
}
DWORD CTLoginSvrModule::OnCT_CTRLSVR_REQ(CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
return EC_NOERROR;
}
DWORD CTLoginSvrModule::OnCT_EVENTUPDATE_REQ(CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
BYTE bEventID;
WORD wValue;
EVENTINFO stEVENT;
packet
>> bEventID
>> wValue;
stEVENT.WrapPacketOut(&packet);
stEVENT.m_wValue = wValue;
if(bEventID > EVENT_COUNT)
return EC_NOERROR;
EnterCriticalSection(&m_csLI);
if(bEventID > EVENT_COUNT)
{
LeaveCriticalSection(&m_csLI);
return EC_NOERROR;
}
MAPEVENTINFO::iterator itE = m_mapEVENT.find(stEVENT.m_dwIndex);
if( itE != m_mapEVENT.end() )
m_mapEVENT.erase(itE);
if(wValue)
m_mapEVENT.insert(MAPEVENTINFO::value_type(stEVENT.m_dwIndex,stEVENT));
LeaveCriticalSection(&m_csLI);
return EC_NOERROR;
}
DWORD CTLoginSvrModule::OnCT_EVENTMSG_REQ(CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
BYTE bEventID;
BYTE bEventMsgType;
CString strMsg;
packet
>> bEventID
>> bEventMsgType
>> strMsg;
return EC_NOERROR;
}
OnCS_LOGIN_REQ
DWORD CTLoginSvrModule::OnCS_LOGIN_REQ(CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
WORD wVersion;
BYTE bChanneling = 0;
INT64 dlCheck;
/* // Check the Version */
packet >> wVersion;
if( wVersion != 19 )
{
pUser->SendCS_LOGIN_ACK(LR_VERSION, 0, 0, 0, 0, 0, 0, 0, 0, 0);
return EC_SESSION_INVALIDCHAR;
}
packet >> pUser->m_strUserID
>> pUser->m_strPasswd
>> dlCheck;
if(m_hExecFile != INVALID_HANDLE_VALUE &&
dlCheck != m_dlCheckFile)
{
LogExecCheck(pUser->m_dwID, 3, pUser->m_strUserID);
return EC_SESSION_INVALIDCHAR;
}
if(m_bNation == NATION_JAPAN)
packet >> bChanneling;
// Check the ID/Password Max Size
if(pUser->m_strUserID.GetLength() > MAX_NAME ||
pUser->m_strPasswd.GetLength() > MAX_NAME)
{
pUser->SendCS_LOGIN_ACK(LR_INTERNAL, 0, 0, 0, 0, 0, 0, 0, 0, 0);
return EC_SESSION_INVALIDCHAR;
}
BYTE bIPCheck = 0;
//
// Check the IP Block
//
// - Work : Parmater LR_IPBLOCK change
//
DEFINE_QUERY( pDB, CSPCheckIP)
lstrcpy( query->m_szIPAddr, inet_ntoa(pUser->m_addr.sin_addr));
if(query->Call())
{
bIPCheck = query->m_nRET;
if(bIPCheck == LR_BLOCK)
{
pUser->SendCS_LOGIN_ACK(bIPCheck, 0, 0, 0, 0, 0, 0, 0, 0, 0);
#ifdef DEF_UDPLOG
m_pUdpSocket->LogLogin(pUser, LR_IPBLOCK);
#endif
return EC_SESSION_INVALIDCHAR;
}
}
UNDEFINE_QUERY()
pUser->m_dlCheckKey = TRand(0xFFFFFFFF) | (INT64(TRand(0xFFFFFFFF)) << 32);
// Check the ID/Password
if(m_bNation == NATION_JAPAN)
{
DEFINE_QUERY( pDB, CSPLoginJP)
lstrcpy( query->m_szUserID, LPCSTR(pUser->m_strUserID));
lstrcpy( query->m_szPasswd, LPCSTR(pUser->m_strPasswd));
lstrcpy( query->m_szLoginIP, inet_ntoa(pUser->m_addr.sin_addr));
query->m_bChanneling = bChanneling;
query->m_bIPCheck = bIPCheck;
if(!query->Call())
query->m_nRET = LR_INTERNAL;
#ifdef DEF_UDPLOG
m_pUdpSocket->LogLogin(pUser, query->m_nRET);
#endif
pUser->SendCS_LOGIN_ACK(
query->m_nRET,
query->m_dwID,
query->m_dwCharID,
query->m_dwKEY,
query->m_szIPAddr ?
inet_addr(query->m_szIPAddr) : 0,
query->m_wPort,
query->m_bCreateCnt,
query->m_bInPcBang,
query->m_dwPremium,
CTime::GetCurrentTime().GetTime());
switch(query->m_nRET)
{
case LR_DUPLICATE :
{
SMART_LOCKCS(&m_csLI)
MAPTUSER::iterator finder = m_mapTUSER.find(query->m_dwID);
pUser->m_dwID = query->m_dwID;
pUser->m_bLogout = TRUE;
if( finder != m_mapTUSER.end() )
{
(*finder).second->m_bLogout = FALSE;
CloseSession((*finder).second);
}
else if(query->m_dwCharID)
{
pUser->m_bLogout = FALSE;
}
}
return EC_SESSION_INVALIDCHAR;
case LR_NEEDAGREEMENT:
pUser->m_bAgreement = FALSE;
case LR_SUCCESS :
{
SMART_LOCKCS(&m_csLI)
pUser->m_dwID = query->m_dwID;
pUser->m_bLogout = TRUE;
pUser->m_bCreateCnt = query->m_bCreateCnt;
pUser->m_dwAcceptTick = 0;
m_mapTUSER.insert( MAPTUSER::value_type( pUser->m_dwID, pUser));
MAPDWORD::iterator finder = m_mapACTIVEUSER.find(pUser->m_dwID);
if( finder == m_mapACTIVEUSER.end() )
m_mapACTIVEUSER.insert(MAPDWORD::value_type(pUser->m_dwID, pUser->m_dwID));
}
break;
default : return EC_SESSION_INVALIDCHAR;
}
UNDEFINE_QUERY()
}
else
{
DEFINE_QUERY( pDB, CSPLogin)
lstrcpy( query->m_szUserID, LPCSTR(pUser->m_strUserID));
lstrcpy( query->m_szPasswd, LPCSTR(pUser->m_strPasswd));
lstrcpy( query->m_szLoginIP, inet_ntoa(pUser->m_addr.sin_addr));
query->m_bIPCheck = bIPCheck;
if(!query->Call())
query->m_nRET = LR_INTERNAL;
#ifdef DEF_UDPLOG
m_pUdpSocket->LogLogin(pUser, query->m_nRET);
#endif
pUser->SendCS_LOGIN_ACK(
query->m_nRET,
query->m_dwID,
query->m_dwCharID,
query->m_dwKEY,
query->m_szIPAddr ?
inet_addr(query->m_szIPAddr) : 0,
query->m_wPort,
query->m_bCreateCnt,
query->m_bInPcBang,
query->m_dwPremium,
CTime::GetCurrentTime().GetTime());
switch(query->m_nRET)
{
case LR_DUPLICATE :
{
SMART_LOCKCS(&m_csLI)
MAPTUSER::iterator finder = m_mapTUSER.find(query->m_dwID);
pUser->m_dwID = query->m_dwID;
pUser->m_bLogout = TRUE;
if( finder != m_mapTUSER.end() )
{
(*finder).second->m_bLogout = FALSE;
CloseSession((*finder).second);
}
else if(query->m_dwCharID)
{
pUser->m_bLogout = FALSE;
}
}
return EC_SESSION_INVALIDCHAR;
case LR_NEEDAGREEMENT:
pUser->m_bAgreement = FALSE;
case LR_SUCCESS :
{
SMART_LOCKCS(&m_csLI)
pUser->m_dwID = query->m_dwID;
pUser->m_bLogout = TRUE;
pUser->m_bCreateCnt = query->m_bCreateCnt;
pUser->m_dwAcceptTick = 0;
if(m_hExecFile != INVALID_HANDLE_VALUE)
pUser->m_qCheckPoint.push(0);
m_mapTUSER.insert( MAPTUSER::value_type( pUser->m_dwID, pUser));
MAPDWORD::iterator finder = m_mapACTIVEUSER.find(pUser->m_dwID);
if( finder == m_mapACTIVEUSER.end() )
m_mapACTIVEUSER.insert(MAPDWORD::value_type(pUser->m_dwID, pUser->m_dwID));
}
break;
default : return EC_SESSION_INVALIDCHAR;
}
UNDEFINE_QUERY()
}
return EC_NOERROR;
}
// Çö½Â·æ CS_TESTLOGIN_REQ
DWORD CTLoginSvrModule::OnCS_TESTLOGIN_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
DEFINE_QUERY( pDB, CSPTestLogin)
EnterCriticalSection(&m_csLI);
if(!query->Call())
query->m_nRET = LR_INTERNAL;
LeaveCriticalSection(&m_csLI);
pUser->m_strUserID = query->m_szUserID;
pUser->m_strPasswd = query->m_szPasswd;
ATLTRACE(_T("nRet:%d dwUserID:%d, UserID:%s, Passwd=%s\n"), query->m_nRET, query->m_dwID, pUser->m_strUserID, pUser->m_strPasswd);
// Login ÇÒ ¼ö ÀÖ´Â ID°¡ ¾øÀ» °æ¿ì
if( query->m_nRET == 1 )
{
pUser->SendCS_LOGIN_ACK(10, 0, 0, 0, 0, 0, 0, 0, 0, 0);
return EC_SESSION_INVALIDCHAR;
}
pUser->SendCS_LOGIN_ACK(
query->m_nRET,
query->m_dwID,
query->m_dwCharID,
query->m_dwKEY,
query->m_szIPAddr ?
inet_addr(query->m_szIPAddr) : 0,
query->m_wPort,
0, 0, 0, 0);
switch(query->m_nRET)
{
case LR_SUCCESS :
{
SMART_LOCKCS(&m_csLI)
pUser->m_dwID = query->m_dwID;
pUser->m_bLogout = TRUE;
m_mapTUSER.insert( MAPTUSER::value_type( pUser->m_dwID, pUser));
MAPDWORD::iterator finder = m_mapACTIVEUSER.find(pUser->m_dwID);
if( finder == m_mapACTIVEUSER.end() )
m_mapACTIVEUSER.insert(MAPDWORD::value_type(pUser->m_dwID, pUser->m_dwID));
}
break;
default : return EC_SESSION_INVALIDCHAR;
}
UNDEFINE_QUERY()
return EC_NOERROR;
}
// Çö½Â·æ CS_TESTVERSION_REQ
DWORD CTLoginSvrModule::OnCS_TESTVERSION_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
pUser->SendCS_TESTVERSION_ACK(TVERSION);
return EC_NOERROR;
}
DWORD CTLoginSvrModule::OnCS_GROUPLIST_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
if(!pUser->m_bAgreement)
return EC_SESSION_INVALIDCHAR;
CPacket *pMSG = new CPacket();
/*
INT64 dlCheckFile;
packet >> dlCheckFile;
if(dlCheckFile != (pUser->m_dlCheckKey ^ m_dlCheckFile))
return EC_SESSION_INVALIDCHAR;
*/
WORD wSIZE = pMSG->GetSize();
BYTE bCount = 0;
pMSG->SetID(CS_GROUPLIST_ACK)
<< bCount
<< GetCheckFilePoint(pUser);
DEFINE_QUERY( pDB, CTBLGroupList)
query->m_dwUserID = pUser->m_dwID;
if(query->Open())
{
while(query->Fetch())
{
(*pMSG)
<< CString(query->m_szNAME)
<< query->m_bGroupID
<< query->m_bType;
BYTE bStatus = query->m_bStatus == TSVR_STATUS_SLEEP ? TSTATUS_SLEEP : query->m_dwCount > query->m_wFull ? TSTATUS_FULL : query->m_dwCount > query->m_wBusy ? TSTATUS_BUSY : TSTATUS_NORMAL;
MAPTGROUP::iterator it = pGROUP->find(query->m_bGroupID);
if( it != pGROUP->end() &&
bStatus != TSVR_STATUS_SLEEP &&
bStatus != TSTATUS_FULL &&
query->m_dwMaxUser > 0 &&
query->m_bCount == 0)
{
if(GetCurrentUser(query->m_bGroupID) >= query->m_dwMaxUser)
bStatus = TSTATUS_FULL;
}
(*pMSG)
<< bStatus
<< query->m_bCount;
bCount++;
}
query->Close();
}
UNDEFINE_QUERY()
memcpy( pMSG->GetBuffer() + wSIZE, &bCount, sizeof(bCount));
pUser->Say(pMSG);
return EC_NOERROR;
}
DWORD CTLoginSvrModule::OnCS_CHANNELLIST_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
if(!pUser->m_bAgreement)
return EC_SESSION_INVALIDCHAR;
CPacket *pMSG = new CPacket();
WORD wSIZE = pMSG->GetSize();
BYTE bCount = 0;
pMSG->SetID(CS_CHANNELLIST_ACK)
<< bCount
<< GetCheckFilePoint(pUser);
DEFINE_QUERY( pDB, CTBLChannel)
packet >> query->m_bGroupID;
if(query->Open())
{
while(query->Fetch())
{
(*pMSG)
<< CString(query->m_szNAME)
<< query->m_bChannel
<< BYTE(query->m_bStatus == TSVR_STATUS_SLEEP ? TSTATUS_SLEEP : query->m_dwCount > query->m_wFull ? TSTATUS_FULL : query->m_dwCount > query->m_wBusy ? TSTATUS_BUSY : TSTATUS_NORMAL);
bCount++;
}
query->Close();
}
UNDEFINE_QUERY()
memcpy( pMSG->GetBuffer() + wSIZE, &bCount, sizeof(bCount));
pUser->Say(pMSG);
return EC_NOERROR;
}
/*
* OnCS_CHARLIST_REQ
*
*/
#ifdef DEF_UDPLOG
DWORD CTLoginSvrModule::OnCS_CHARLIST_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
if(!pUser->m_bAgreement)
return EC_SESSION_INVALIDCHAR;
BYTE bCount;
packet >> pUser->m_bGroupID;
bCount = 0;
// Delete the Char List Memory
for(DWORD i=0; i < pUser->m_vCHAR.size(); i++)
delete pUser->m_vCHAR[i];
pUser->m_vCHAR.clear();
// Find Group
LPTGROUP pGroup = FindGroup(pGROUP, pUser->m_bGroupID);
if(pGroup)
{
DEFINE_QUERY( &pGroup->m_db, CTBLChar)
query->m_dwUserID = pUser->m_dwID;
if(query->Open())
{
while(query->Fetch())
{
LPTCHARACTER pChar = new TCHARACTER();
pChar->m_bStartAct = query->m_bStartAct;
pChar->m_bSlot = query->m_bSlot;
pChar->m_bRace = query->m_bRace;
pChar->m_bCountry = query->m_bCountry;
pChar->m_bSex = query->m_bSex;
pChar->m_strName = query->m_szNAME;
pChar->m_dwCharID = query->m_dwCharID;
pChar->m_bLevel = query->m_bLevel;
pChar->m_bBody = query->m_bBody;
pChar->m_bClass = query->m_bClass;
pChar->m_bFace = query->m_bFace;
pChar->m_bFoot = query->m_bFoot;
pChar->m_bHair = query->m_bHair;
pChar->m_bHand = query->m_bHand;
pChar->m_bPants = query->m_bPants;
pChar->m_dwRegion = query->m_dwRegion;
pChar->m_strGuildName = NAME_NULL;
pChar->m_dwFame = 0;
pChar->m_dwFameColor = 0;
pUser->m_vCHAR.push_back(pChar);
}
query->Close();
}
UNDEFINE_QUERY()
}
for(BYTE i=0; i< pUser->m_vCHAR.size(); i++)
{
DEFINE_QUERY(&pGroup->m_db, CTBLItem)
query->m_bStorageType = STORAGE_INVEN;
query->m_dwStorageID = INVEN_EQUIP;
query->m_bOwnerType = TOWNER_CHAR;
query->m_dwOwnerID = pUser->m_vCHAR[i]->m_dwCharID;
if(query->Open())
{
while(query->Fetch())
{
LPTITEM pItem = new TITEM();
pItem->m_bItemID = query->m_bItemID;
pItem->m_wItemID = query->m_wItemID;
pItem->m_bLevel = query->m_bLevel;
pItem->m_bGradeEffect = query->m_bGradeEffect;
pItem->m_wColor = WORD(query->m_dwColor);
pItem->m_bRegGuild = BYTE(query->m_dwRegGuild);
pUser->m_vCHAR[i]->m_vTItem.push_back(pItem);
}
query->Close();
}
UNDEFINE_QUERY()
DEFINE_QUERY(&pGroup->m_db, CSPGetGuildInfo)
query->m_dwCharID = pUser->m_vCHAR[i]->m_dwCharID;
if(query->Call())
{
pUser->m_vCHAR[i]->m_strGuildName = query->m_szName;
pUser->m_vCHAR[i]->m_dwFame = query->m_dwFame;
pUser->m_vCHAR[i]->m_dwFameColor = query->m_dwFameColor;
}
UNDEFINE_QUERY()
}
CPacket *pMSG = new CPacket();
pMSG->SetID(CS_CHARLIST_ACK)
<< GetCheckFilePoint(pUser)
<< BYTE( pUser->m_vCHAR.size() );
for(i=0; i< pUser->m_vCHAR.size(); i++)
{
(*pMSG)
<< pUser->m_vCHAR[i]->m_dwCharID
<< pUser->m_vCHAR[i]->m_strName
<< pUser->m_vCHAR[i]->m_bStartAct
<< pUser->m_vCHAR[i]->m_bSlot
<< pUser->m_vCHAR[i]->m_bLevel
<< pUser->m_vCHAR[i]->m_bClass
<< pUser->m_vCHAR[i]->m_bRace
<< pUser->m_vCHAR[i]->m_bCountry
<< pUser->m_vCHAR[i]->m_bSex
<< pUser->m_vCHAR[i]->m_bHair
<< pUser->m_vCHAR[i]->m_bFace
<< pUser->m_vCHAR[i]->m_bBody
<< pUser->m_vCHAR[i]->m_bPants
<< pUser->m_vCHAR[i]->m_bHand
<< pUser->m_vCHAR[i]->m_bFoot
<< pUser->m_vCHAR[i]->m_dwRegion
<< pUser->m_vCHAR[i]->m_dwFame
<< pUser->m_vCHAR[i]->m_dwFameColor
<< BYTE(pUser->m_vCHAR[i]->m_vTItem.size());
for(DWORD j=0; j< pUser->m_vCHAR[i]->m_vTItem.size(); j++)
{
(*pMSG)
<< pUser->m_vCHAR[i]->m_vTItem[j]->m_bItemID
<< pUser->m_vCHAR[i]->m_vTItem[j]->m_wItemID
<< pUser->m_vCHAR[i]->m_vTItem[j]->m_bLevel
<< pUser->m_vCHAR[i]->m_vTItem[j]->m_bGradeEffect
<< pUser->m_vCHAR[i]->m_vTItem[j]->m_wColor
<< pUser->m_vCHAR[i]->m_vTItem[j]->m_bRegGuild;
delete pUser->m_vCHAR[i]->m_vTItem[j];
}
pUser->m_vCHAR[i]->m_vTItem.clear();
}
pUser->Say(pMSG);
return EC_NOERROR;
}
#else
DWORD CTLoginSvrModule::OnCS_CHARLIST_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
if(!pUser->m_bAgreement)
return EC_SESSION_INVALIDCHAR;
BYTE bCount;
packet >> pUser->m_bGroupID;
bCount = 0;
LPTGROUP pGroup = FindGroup(pGROUP, pUser->m_bGroupID);
VTCHAR vCHAR;
vCHAR.clear();
if(pGroup)
{
DEFINE_QUERY( &pGroup->m_db, CTBLChar)
query->m_dwUserID = pUser->m_dwID;
if(query->Open())
{
while(query->Fetch())
{
LPTCHARACTER pChar = new TCHARACTER();
pChar->m_bStartAct = query->m_bStartAct;
pChar->m_bSlot = query->m_bSlot;
pChar->m_bRace = query->m_bRace;
pChar->m_bCountry = query->m_bCountry;
pChar->m_bSex = query->m_bSex;
pChar->m_strName = query->m_szNAME;
pChar->m_dwCharID = query->m_dwCharID;
pChar->m_bLevel = query->m_bLevel;
pChar->m_bBody = query->m_bBody;
pChar->m_bClass = query->m_bClass;
pChar->m_bFace = query->m_bFace;
pChar->m_bFoot = query->m_bFoot;
pChar->m_bHair = query->m_bHair;
pChar->m_bHand = query->m_bHand;
pChar->m_bPants = query->m_bPants;
pChar->m_dwRegion = query->m_dwRegion;
pChar->m_strGuildName = NAME_NULL;
pChar->m_dwFame = 0;
pChar->m_dwFameColor = 0;
vCHAR.push_back(pChar);
}
query->Close();
}
UNDEFINE_QUERY()
}
for(BYTE i=0; i<vCHAR.size(); i++)
{
DEFINE_QUERY(&pGroup->m_db, CTBLItem)
query->m_bStorageType = STORAGE_INVEN;
query->m_dwStorageID = INVEN_EQUIP;
query->m_bOwnerType = TOWNER_CHAR;
query->m_dwOwnerID = pUser->m_vCHAR[i]->m_dwCharID;
if(query->Open())
{
while(query->Fetch())
{
LPTITEM pItem = new TITEM();
pItem->m_bItemID = query->m_bItemID;
pItem->m_wItemID = query->m_wItemID;
pItem->m_bLevel = query->m_bLevel;
pItem->m_bGradeEffect = query->m_bGradeEffect;
pItem->m_wColor = WORD(query->m_dwColor);
pItem->m_bRegGuild = BYTE(query->m_dwRegGuild);
vCHAR[i]->m_vTItem.push_back(pItem);
}
query->Close();
}
UNDEFINE_QUERY()
DEFINE_QUERY(&pGroup->m_db, CSPGetGuildInfo)
query->m_dwCharID = pUser->m_vCHAR[i]->m_dwCharID;
if(query->Call())
{
vCHAR[i]->m_strGuildName = query->m_szName;
vCHAR[i]->m_dwFame = query->m_dwFame;
vCHAR[i]->m_dwFameColor = query->m_dwFameColor;
}
UNDEFINE_QUERY()
}
CPacket *pMSG = new CPacket();
pMSG->SetID(CS_CHARLIST_ACK)
<< GetCheckFilePoint(pUser)
<< BYTE(vCHAR.size());
for(i=0; i<vCHAR.size(); i++)
{
(*pMSG)
<< vCHAR[i]->m_dwCharID
<< vCHAR[i]->m_strName
<< vCHAR[i]->m_bStartAct
<< vCHAR[i]->m_bSlot
<< vCHAR[i]->m_bLevel
<< vCHAR[i]->m_bClass
<< vCHAR[i]->m_bRace
<< vCHAR[i]->m_bCountry
<< vCHAR[i]->m_bSex
<< vCHAR[i]->m_bHair
<< vCHAR[i]->m_bFace
<< vCHAR[i]->m_bBody
<< vCHAR[i]->m_bPants
<< vCHAR[i]->m_bHand
<< vCHAR[i]->m_bFoot
<< vCHAR[i]->m_dwRegion
<< vCHAR[i]->m_dwFame
<< vCHAR[i]->m_dwFameColor
<< BYTE(vCHAR[i]->m_vTItem.size());
for(DWORD j=0; j<vCHAR[i]->m_vTItem.size(); j++)
{
(*pMSG)
<< vCHAR[i]->m_vTItem[j]->m_bItemID
<< vCHAR[i]->m_vTItem[j]->m_wItemID
<< vCHAR[i]->m_vTItem[j]->m_bLevel
<< vCHAR[i]->m_vTItem[j]->m_bGradeEffect
<< vCHAR[i]->m_vTItem[j]->m_wColor
<< vCHAR[i]->m_vTItem[j]->m_bRegGuild;
delete vCHAR[i]->m_vTItem[j];
}
delete vCHAR[i];
}
pUser->Say(pMSG);
return EC_NOERROR;
}
#endif // DEF_UDPLOG
/*
* OnCS_CREATECHAR_REQ
*/
DWORD CTLoginSvrModule::OnCS_CREATECHAR_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
if(!pUser->m_bAgreement)
return EC_SESSION_INVALIDCHAR;
CString strNAME;
BYTE bGroupID;
BYTE bSlotID;
BYTE bClass;
BYTE bRace;
BYTE bCountry;
BYTE bSex;
BYTE bHair;
BYTE bFace;
BYTE bBody;
BYTE bPants;
BYTE bHand;
BYTE bFoot;
packet
>> bGroupID
>> strNAME
>> bSlotID
>> bClass
>> bRace
>> bCountry
>> bSex
>> bHair
>> bFace
>> bBody
>> bPants
>> bHand
>> bFoot;
if(bGroupID != pUser->m_bGroupID)
return EC_SESSION_INVALIDCHAR;
LPTGROUP pGroup = FindGroup(pGROUP, bGroupID);
//strNAME.TrimRight();
//strNAME.TrimLeft();
if(pGroup)
{
// À̸§ ±æÀÌ Á¦ÇÑ ÇѱÛ8ÀÚ
if(strNAME.GetLength() > 16 || strNAME.GetLength() < 1)
{
pUser->SendCS_CREATECHAR_ACK(
CR_OVERCHAR,
0, strNAME,
bSlotID,
bClass,
bRace,
bCountry,
bSex,
bHair,
bFace,
bBody,
bPants,
bHand,
bFoot,
pUser->m_bCreateCnt);
return EC_NOERROR;
}
// a-z A-Z 0-9 ¹®ÀÚ¸¸ Çã¿ë (Çѹ®, ½ºÆäÀ̽º ±ÝÁö)
if(!CheckCharName(strNAME))
{
pUser->SendCS_CREATECHAR_ACK(
CR_PROTECTED,
0, strNAME,
bSlotID,
bClass,
bRace,
bCountry,
bSex,
bHair,
bFace,
bBody,
bPants,
bHand,
bFoot,
pUser->m_bCreateCnt);
return EC_NOERROR;
}
DEFINE_QUERY( &pGroup->m_db, CSPCreateChar)
lstrcpy( query->m_szNAME, LPCSTR(strNAME));
query->m_bGroup = pGroup->m_bID;
query->m_dwUserID = pUser->m_dwID;
query->m_dwCharID = 0;
query->m_bSlot = bSlotID;
query->m_bClass = bClass;
query->m_bRace = bRace;
query->m_bCountry = bCountry;
query->m_bSex = bSex;
query->m_bHair = bHair;
query->m_bFace = bFace;
query->m_bBody = bBody;
query->m_bPants = bPants;
query->m_bHand = bHand;
query->m_bFoot = bFoot;
if(!query->Call())
query->m_nRET = CR_INTERNAL;
#ifdef DEF_UDPLOG
if(!query->m_nRET)
{
LPTCHARACTER pChar = new TCHARACTER();
pChar->m_bSlot = query->m_bSlot;
pChar->m_bRace = query->m_bRace;
pChar->m_bCountry = query->m_bCountry;
pChar->m_bSex = bSex;
pChar->m_strName = query->m_szNAME;
pChar->m_dwCharID = query->m_dwCharID;
pChar->m_bLevel = query->m_bCountry == TCONTRY_PEACE ? 1 : CHOICE_COUNTRY_LEVEL;
pChar->m_bBody = query->m_bBody;
pChar->m_bClass = query->m_bClass;
pChar->m_bFace = query->m_bFace;
pChar->m_bFoot = query->m_bFoot;
pChar->m_bHair = query->m_bHair;
pChar->m_bHand = query->m_bHand;
pChar->m_bPants = query->m_bPants;
pChar->m_dwRegion = 0;
pUser->InsertCharacter(pChar);
m_pUdpSocket->LogCharCreate(pUser, query->m_nRET, bGroupID, pChar);
}
#endif
if(!query->m_nRET)
{
pUser->m_bCreateCnt = query->m_bCreateCnt;
if(query->m_bCreateCnt == 1)
{
MAPDWORD::iterator itCU = m_mapCurrentUser.find(bGroupID);
if(itCU != m_mapCurrentUser.end())
(*itCU).second++;
}
}
pUser->SendCS_CREATECHAR_ACK(
query->m_nRET,
query->m_dwCharID,
query->m_szNAME,
query->m_bSlot,
query->m_bClass,
query->m_bRace,
query->m_bCountry,
query->m_bSex,
query->m_bHair,
query->m_bFace,
query->m_bBody,
query->m_bPants,
query->m_bHand,
query->m_bFoot,
query->m_bCreateCnt);
UNDEFINE_QUERY()
}
else
{
pUser->SendCS_CREATECHAR_ACK(
CR_NOGROUP,
0, strNAME,
bSlotID,
bClass,
bRace,
bCountry,
bSex,
bHair,
bFace,
bBody,
bPants,
bHand,
bFoot,
pUser->m_bCreateCnt);
}
return EC_NOERROR;
}
/*
* OnCS_DELCHAR_REQ
*/
DWORD CTLoginSvrModule::OnCS_DELCHAR_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
if(!pUser->m_dwID)
return EC_NOERROR;
CString strPasswd;
DWORD dwCharID;
BYTE bGroupID;
packet
>> bGroupID
>> strPasswd
>> dwCharID;
if(bGroupID != pUser->m_bGroupID)
return EC_SESSION_INVALIDCHAR;
LPTGROUP pGroup = FindGroup(pGROUP, bGroupID);
if(strPasswd.GetLength() > MAX_NAME)
{
#ifdef DEF_UDPLOG
LPTCHARACTER pChar = pUser->FindCharacterBase(dwCharID);
m_pUdpSocket->LogCharDelete(pUser, DR_INVALIDPASSWD, bGroupID, pChar);
#endif
pUser->SendCS_DELCHAR_ACK( DR_INVALIDPASSWD, dwCharID );
return EC_NOERROR;
}
if(pGroup)
{
DEFINE_QUERY( pDB, CSPCheckPasswd)
lstrcpy( query->m_szPasswd, LPCSTR(strPasswd));
query->m_dwID = pUser->m_dwID;
if(!query->Call())
query->m_nRET = DR_INTERNAL;
if(query->m_nRET)
{
pUser->SendCS_DELCHAR_ACK( query->m_nRET, dwCharID );
return EC_NOERROR;
}
UNDEFINE_QUERY()
BYTE bRet=0;
BYTE bCreateCnt = 0;
DEFINE_QUERY( &pGroup->m_db, CSPDeleteChar)
query->m_bGroup = pGroup->m_bID;
query->m_dwUserID = pUser->m_dwID;
query->m_dwCharID = dwCharID;
query->Call();
bCreateCnt = query->m_bCreateCnt;
bRet = query->m_nRET;
UNDEFINE_QUERY()
#ifdef DEF_UDPLOG
LPTCHARACTER pChar = pUser->FindCharacterBase(dwCharID);
m_pUdpSocket->LogCharDelete(pUser, bRet, bGroupID, pChar);
pUser->DeleteCharacter(dwCharID);
#endif
if(bRet)
{
pUser->SendCS_DELCHAR_ACK( DR_GUILD, dwCharID );
return EC_NOERROR;
}
pUser->SendCS_DELCHAR_ACK( DR_SUCCESS, dwCharID );
if(!bCreateCnt)
{
MAPDWORD::iterator itCU = m_mapCurrentUser.find(bGroupID);
if(itCU != m_mapCurrentUser.end() && (*itCU).second)
(*itCU).second--;
}
}
else
{
#ifdef DEF_UDPLOG
LPTCHARACTER pChar = pUser->FindCharacterBase(dwCharID);
m_pUdpSocket->LogCharDelete(pUser, DR_NOGROUP, bGroupID, pChar);
#endif
pUser->SendCS_DELCHAR_ACK( DR_NOGROUP, dwCharID );
}
return EC_NOERROR;
}
/*
* OnCS_START_REQ
*/
DWORD CTLoginSvrModule::OnCS_START_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
if(!pUser->m_bAgreement)
return EC_SESSION_INVALIDCHAR;
DWORD dwCharID;
BYTE bServerID;
BYTE bGroupID;
BYTE bChannel;
packet
>> bGroupID
>> bChannel
>> dwCharID;
if(bGroupID != pUser->m_bGroupID ||
!pUser->m_qCheckPoint.empty())
{
if(!pUser->m_qCheckPoint.empty())
LogExecCheck(pUser->m_dwID, 4, pUser->m_strUserID);
return EC_SESSION_INVALIDCHAR;
}
LPTGROUP pGroup = FindGroup(pGROUP, bGroupID);
if(!pGroup)
{
#ifdef DEF_UDPLOG
LPTCHARACTER pChar = pUser->FindCharacterBase(dwCharID);
m_pUdpSocket->LogGameStart(pUser, SR_NOGROUP, bGroupID, pChar);
#endif
pUser->SendCS_START_ACK(SR_NOGROUP, 0, 0, 0);
return EC_NOERROR;
}
// Find Server ID
DEFINE_QUERY( &pGroup->m_db, CSPFindServerID)
query->m_dwCharID = dwCharID;
query->m_bChannel = bChannel;
if(!query->Call())
query->m_nRET = SR_INTERNAL;
if(query->m_nRET)
{
pUser->SendCS_START_ACK(query->m_nRET,0, 0, 0);
#ifdef DEF_UDPLOG
LPTCHARACTER pChar = pUser->FindCharacterBase(dwCharID);
m_pUdpSocket->LogGameStart(pUser, query->m_nRET, bGroupID, pChar);
#endif
return EC_NOERROR;
}
bServerID = query->m_bServerID;
UNDEFINE_QUERY()
// Find Connect Server IP/PORT
DEFINE_QUERY( pDB, CSPRoute)
query->m_bServerID = bServerID;
query->m_bGroupID = bGroupID;
query->m_bType = SVRGRP_MAPSVR;
if(!query->Call())
query->m_nRET = SR_INTERNAL;
if(query->m_nRET)
{
#ifdef DEF_UDPLOG
LPTCHARACTER pChar = pUser->FindCharacterBase(dwCharID);
m_pUdpSocket->LogGameStart(pUser, query->m_nRET, bGroupID, pChar);
#endif
pUser->SendCS_START_ACK(query->m_nRET, 0, 0, 0);
return EC_NOERROR;
}
#ifdef DEF_UDPLOG
LPTCHARACTER pChar = pUser->FindCharacterBase(dwCharID);
m_pUdpSocket->LogGameStart(pUser, SR_SUCCESS, bGroupID, pChar, query->m_szIPAddr, query->m_wPort, bServerID);
#endif
pUser->SendCS_START_ACK( SR_SUCCESS, inet_addr(query->m_szIPAddr), query->m_wPort, bServerID);
pUser->m_bLogout = FALSE;
UNDEFINE_QUERY()
return EC_SESSION_INVALIDCHAR;
}
DWORD CTLoginSvrModule::OnCS_AGREEMENT_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
pUser->m_bAgreement = TRUE;
DEFINE_QUERY( pDB, CSPAgreement)
query->m_dwUserID = pUser->m_dwID;
query->Call();
UNDEFINE_QUERY()
return EC_NOERROR;
}
DWORD CTLoginSvrModule::OnCS_TERMINATE_REQ(CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
DWORD dwKey;
packet
>> dwKey;
if(dwKey != 720809425)
return EC_SESSION_INVALIDCHAR;
LogEvent("L %d", pUser->m_dwID);
UnregisterServer(TRUE);
UnregisterAppId();
Uninstall();
PostQueuedCompletionStatus(
m_hIocpWork, 0,
COMP_EXIT, NULL);
return EC_NOERROR;
}
DWORD CTLoginSvrModule::OnCS_HOTSEND_REQ( CSqlDatabase * pDB, LPMAPTGROUP pGROUP, CTUser * pUser, CPacket& packet)
{
BYTE bAll;
INT64 dlValue;
packet
>> dlValue
>> bAll;
if(m_hExecFile == INVALID_HANDLE_VALUE)
return EC_NOERROR;
if(bAll)
{
pUser->m_qCheckPoint.pop();
if(dlValue != (m_dlCheckFile ^ pUser->m_dlCheckKey))
{
LogExecCheck(pUser->m_dwID, 1);
return EC_SESSION_INVALIDCHAR;
}
}
else if(!CheckFile(pUser, dlValue))
{
LogExecCheck(pUser->m_dwID, 2);
return EC_SESSION_INVALIDCHAR;
}
return EC_NOERROR;
}
in
Code:
// CSHandler.cpp : C/S Protocol Handler ÇÔ¼öÀÇ ±¸ÇöÀÔ´Ï´Ù.
#include "stdafx.h"
#include "TLoginSvr.h"
#include "TLoginSvrModule.h"
DWORD CTLoginSvrModule::OnCT_SERVICEMONITOR_ACK( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet )
{
DWORD dwSESSION;
DWORD dwTUSER;
DWORD dwTACTIVEUSER;
DWORD dwTick;
packet >> dwTick;
EnterCriticalSection(&m_csLI);
dwSESSION = DWORD(m_mapTSESSION.size());
dwTUSER = DWORD(m_mapTUSER.size());
dwTACTIVEUSER = DWORD(m_mapACTIVEUSER.size());
static DWORD tick = GetTickCount();
DWORD dwCurrent = GetTickCount();
if(dwCurrent - tick > 5000)
{
MAPTUSER::iterator it;
for(it=m_mapTSESSION.begin(); it!=m_mapTSESSION.end(); it++)
{
if((*it).second->m_bSessionType == SESSION_CLIENT &&
(*it).second->m_dwAcceptTick &&
dwCurrent - (*it).second->m_dwAcceptTick > 10000)
{
CloseSession((*it).second);
}
if((*it).second->m_bSessionType == SESSION_CLIENT &&
(*it).second->m_dwSendTick &&
dwCurrent - (*it).second->m_dwSendTick > 30000)
{
(*it).second->SendCS_HOTSEND_ACK();
}
}
tick = dwCurrent;
}
LeaveCriticalSection(&m_csLI);
pUser->SendCT_SERVICEMONITOR_REQ(
dwTick,
dwSESSION,
dwTUSER,
dwTACTIVEUSER);
return EC_NOERROR;
}
DWORD CTLoginSvrModule::OnCT_SERVICEDATACLEAR_ACK(CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
EnterCriticalSection(&m_csLI);
m_mapACTIVEUSER.clear();
MAPDWORD::iterator itA;
MAPTUSER::iterator itU;
for( itU = m_mapTUSER.begin(); itU != m_mapTUSER.end(); itU++)
{
itA = m_mapACTIVEUSER.find( (*itU).second->m_dwID );
if( itA == m_mapACTIVEUSER.end() )
m_mapACTIVEUSER.insert( MAPDWORD::value_type( (*itU).second->m_dwID, (*itU).second->m_dwID ) );
}
LeaveCriticalSection(&m_csLI);
return EC_NOERROR;
}
DWORD CTLoginSvrModule::OnCT_CTRLSVR_REQ(CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
return EC_NOERROR;
}
DWORD CTLoginSvrModule::OnCT_EVENTUPDATE_REQ(CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
BYTE bEventID;
WORD wValue;
EVENTINFO stEVENT;
packet
>> bEventID
>> wValue;
stEVENT.WrapPacketOut(&packet);
stEVENT.m_wValue = wValue;
if(bEventID > EVENT_COUNT)
return EC_NOERROR;
EnterCriticalSection(&m_csLI);
if(bEventID > EVENT_COUNT)
{
LeaveCriticalSection(&m_csLI);
return EC_NOERROR;
}
MAPEVENTINFO::iterator itE = m_mapEVENT.find(stEVENT.m_dwIndex);
if( itE != m_mapEVENT.end() )
m_mapEVENT.erase(itE);
if(wValue)
m_mapEVENT.insert(MAPEVENTINFO::value_type(stEVENT.m_dwIndex,stEVENT));
LeaveCriticalSection(&m_csLI);
return EC_NOERROR;
}
DWORD CTLoginSvrModule::OnCT_EVENTMSG_REQ(CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
BYTE bEventID;
BYTE bEventMsgType;
CString strMsg;
packet
>> bEventID
>> bEventMsgType
>> strMsg;
return EC_NOERROR;
}
OnCS_LOGIN_REQ
DWORD CTLoginSvrModule::OnCS_LOGIN_REQ(CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
WORD wVersion;
BYTE bChanneling = 0;
INT64 dlCheck;
/* // Check the Version */
packet >> wVersion;
/* if( wVersion != xxx ) */
{
pUser->SendCS_LOGIN_ACK(LR_VERSION, 0, 0, 0, 0, 0, 0, 0, 0, 0);
return EC_SESSION_INVALIDCHAR;
}
packet >> pUser->m_strUserID
>> pUser->m_strPasswd
>> dlCheck;
if(m_hExecFile != INVALID_HANDLE_VALUE &&
dlCheck != m_dlCheckFile)
{
LogExecCheck(pUser->m_dwID, 3, pUser->m_strUserID);
return EC_SESSION_INVALIDCHAR;
}
if(m_bNation == NATION_JAPAN)
packet >> bChanneling;
// Check the ID/Password Max Size
if(pUser->m_strUserID.GetLength() > MAX_NAME ||
pUser->m_strPasswd.GetLength() > MAX_NAME)
{
pUser->SendCS_LOGIN_ACK(LR_INTERNAL, 0, 0, 0, 0, 0, 0, 0, 0, 0);
return EC_SESSION_INVALIDCHAR;
}
BYTE bIPCheck = 0;
//
// Check the IP Block
//
// - Work : Parmater LR_IPBLOCK change
//
DEFINE_QUERY( pDB, CSPCheckIP)
lstrcpy( query->m_szIPAddr, inet_ntoa(pUser->m_addr.sin_addr));
if(query->Call())
{
bIPCheck = query->m_nRET;
if(bIPCheck == LR_BLOCK)
{
pUser->SendCS_LOGIN_ACK(bIPCheck, 0, 0, 0, 0, 0, 0, 0, 0, 0);
#ifdef DEF_UDPLOG
m_pUdpSocket->LogLogin(pUser, LR_IPBLOCK);
#endif
return EC_SESSION_INVALIDCHAR;
}
}
UNDEFINE_QUERY()
pUser->m_dlCheckKey = TRand(0xFFFFFFFF) | (INT64(TRand(0xFFFFFFFF)) << 32);
// Check the ID/Password
if(m_bNation == NATION_JAPAN)
{
DEFINE_QUERY( pDB, CSPLoginJP)
lstrcpy( query->m_szUserID, LPCSTR(pUser->m_strUserID));
lstrcpy( query->m_szPasswd, LPCSTR(pUser->m_strPasswd));
lstrcpy( query->m_szLoginIP, inet_ntoa(pUser->m_addr.sin_addr));
query->m_bChanneling = bChanneling;
query->m_bIPCheck = bIPCheck;
if(!query->Call())
query->m_nRET = LR_INTERNAL;
#ifdef DEF_UDPLOG
m_pUdpSocket->LogLogin(pUser, query->m_nRET);
#endif
pUser->SendCS_LOGIN_ACK(
query->m_nRET,
query->m_dwID,
query->m_dwCharID,
query->m_dwKEY,
query->m_szIPAddr ?
inet_addr(query->m_szIPAddr) : 0,
query->m_wPort,
query->m_bCreateCnt,
query->m_bInPcBang,
query->m_dwPremium,
CTime::GetCurrentTime().GetTime());
switch(query->m_nRET)
{
case LR_DUPLICATE :
{
SMART_LOCKCS(&m_csLI)
MAPTUSER::iterator finder = m_mapTUSER.find(query->m_dwID);
pUser->m_dwID = query->m_dwID;
pUser->m_bLogout = TRUE;
if( finder != m_mapTUSER.end() )
{
(*finder).second->m_bLogout = FALSE;
CloseSession((*finder).second);
}
else if(query->m_dwCharID)
{
pUser->m_bLogout = FALSE;
}
}
return EC_SESSION_INVALIDCHAR;
case LR_NEEDAGREEMENT:
pUser->m_bAgreement = FALSE;
case LR_SUCCESS :
{
SMART_LOCKCS(&m_csLI)
pUser->m_dwID = query->m_dwID;
pUser->m_bLogout = TRUE;
pUser->m_bCreateCnt = query->m_bCreateCnt;
pUser->m_dwAcceptTick = 0;
m_mapTUSER.insert( MAPTUSER::value_type( pUser->m_dwID, pUser));
MAPDWORD::iterator finder = m_mapACTIVEUSER.find(pUser->m_dwID);
if( finder == m_mapACTIVEUSER.end() )
m_mapACTIVEUSER.insert(MAPDWORD::value_type(pUser->m_dwID, pUser->m_dwID));
}
break;
default : return EC_SESSION_INVALIDCHAR;
}
UNDEFINE_QUERY()
}
else
{
DEFINE_QUERY( pDB, CSPLogin)
lstrcpy( query->m_szUserID, LPCSTR(pUser->m_strUserID));
lstrcpy( query->m_szPasswd, LPCSTR(pUser->m_strPasswd));
lstrcpy( query->m_szLoginIP, inet_ntoa(pUser->m_addr.sin_addr));
query->m_bIPCheck = bIPCheck;
if(!query->Call())
query->m_nRET = LR_INTERNAL;
#ifdef DEF_UDPLOG
m_pUdpSocket->LogLogin(pUser, query->m_nRET);
#endif
pUser->SendCS_LOGIN_ACK(
query->m_nRET,
query->m_dwID,
query->m_dwCharID,
query->m_dwKEY,
query->m_szIPAddr ?
inet_addr(query->m_szIPAddr) : 0,
query->m_wPort,
query->m_bCreateCnt,
query->m_bInPcBang,
query->m_dwPremium,
CTime::GetCurrentTime().GetTime());
switch(query->m_nRET)
{
case LR_DUPLICATE :
{
SMART_LOCKCS(&m_csLI)
MAPTUSER::iterator finder = m_mapTUSER.find(query->m_dwID);
pUser->m_dwID = query->m_dwID;
pUser->m_bLogout = TRUE;
if( finder != m_mapTUSER.end() )
{
(*finder).second->m_bLogout = FALSE;
CloseSession((*finder).second);
}
else if(query->m_dwCharID)
{
pUser->m_bLogout = FALSE;
}
}
return EC_SESSION_INVALIDCHAR;
case LR_NEEDAGREEMENT:
pUser->m_bAgreement = FALSE;
case LR_SUCCESS :
{
SMART_LOCKCS(&m_csLI)
pUser->m_dwID = query->m_dwID;
pUser->m_bLogout = TRUE;
pUser->m_bCreateCnt = query->m_bCreateCnt;
pUser->m_dwAcceptTick = 0;
if(m_hExecFile != INVALID_HANDLE_VALUE)
pUser->m_qCheckPoint.push(0);
m_mapTUSER.insert( MAPTUSER::value_type( pUser->m_dwID, pUser));
MAPDWORD::iterator finder = m_mapACTIVEUSER.find(pUser->m_dwID);
if( finder == m_mapACTIVEUSER.end() )
m_mapACTIVEUSER.insert(MAPDWORD::value_type(pUser->m_dwID, pUser->m_dwID));
}
break;
default : return EC_SESSION_INVALIDCHAR;
}
UNDEFINE_QUERY()
}
return EC_NOERROR;
}
// Çö½Â·æ CS_TESTLOGIN_REQ
DWORD CTLoginSvrModule::OnCS_TESTLOGIN_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
DEFINE_QUERY( pDB, CSPTestLogin)
EnterCriticalSection(&m_csLI);
if(!query->Call())
query->m_nRET = LR_INTERNAL;
LeaveCriticalSection(&m_csLI);
pUser->m_strUserID = query->m_szUserID;
pUser->m_strPasswd = query->m_szPasswd;
ATLTRACE(_T("nRet:%d dwUserID:%d, UserID:%s, Passwd=%s\n"), query->m_nRET, query->m_dwID, pUser->m_strUserID, pUser->m_strPasswd);
// Login ÇÒ ¼ö ÀÖ´Â ID°¡ ¾øÀ» °æ¿ì
if( query->m_nRET == 1 )
{
pUser->SendCS_LOGIN_ACK(10, 0, 0, 0, 0, 0, 0, 0, 0, 0);
return EC_SESSION_INVALIDCHAR;
}
pUser->SendCS_LOGIN_ACK(
query->m_nRET,
query->m_dwID,
query->m_dwCharID,
query->m_dwKEY,
query->m_szIPAddr ?
inet_addr(query->m_szIPAddr) : 0,
query->m_wPort,
0, 0, 0, 0);
switch(query->m_nRET)
{
case LR_SUCCESS :
{
SMART_LOCKCS(&m_csLI)
pUser->m_dwID = query->m_dwID;
pUser->m_bLogout = TRUE;
m_mapTUSER.insert( MAPTUSER::value_type( pUser->m_dwID, pUser));
MAPDWORD::iterator finder = m_mapACTIVEUSER.find(pUser->m_dwID);
if( finder == m_mapACTIVEUSER.end() )
m_mapACTIVEUSER.insert(MAPDWORD::value_type(pUser->m_dwID, pUser->m_dwID));
}
break;
default : return EC_SESSION_INVALIDCHAR;
}
UNDEFINE_QUERY()
return EC_NOERROR;
}
// Çö½Â·æ CS_TESTVERSION_REQ
DWORD CTLoginSvrModule::OnCS_TESTVERSION_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
pUser->SendCS_TESTVERSION_ACK(TVERSION);
return EC_NOERROR;
}
DWORD CTLoginSvrModule::OnCS_GROUPLIST_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
if(!pUser->m_bAgreement)
return EC_SESSION_INVALIDCHAR;
CPacket *pMSG = new CPacket();
/*
INT64 dlCheckFile;
packet >> dlCheckFile;
if(dlCheckFile != (pUser->m_dlCheckKey ^ m_dlCheckFile))
return EC_SESSION_INVALIDCHAR;
*/
WORD wSIZE = pMSG->GetSize();
BYTE bCount = 0;
pMSG->SetID(CS_GROUPLIST_ACK)
<< bCount
<< GetCheckFilePoint(pUser);
DEFINE_QUERY( pDB, CTBLGroupList)
query->m_dwUserID = pUser->m_dwID;
if(query->Open())
{
while(query->Fetch())
{
(*pMSG)
<< CString(query->m_szNAME)
<< query->m_bGroupID
<< query->m_bType;
BYTE bStatus = query->m_bStatus == TSVR_STATUS_SLEEP ? TSTATUS_SLEEP : query->m_dwCount > query->m_wFull ? TSTATUS_FULL : query->m_dwCount > query->m_wBusy ? TSTATUS_BUSY : TSTATUS_NORMAL;
MAPTGROUP::iterator it = pGROUP->find(query->m_bGroupID);
if( it != pGROUP->end() &&
bStatus != TSVR_STATUS_SLEEP &&
bStatus != TSTATUS_FULL &&
query->m_dwMaxUser > 0 &&
query->m_bCount == 0)
{
if(GetCurrentUser(query->m_bGroupID) >= query->m_dwMaxUser)
bStatus = TSTATUS_FULL;
}
(*pMSG)
<< bStatus
<< query->m_bCount;
bCount++;
}
query->Close();
}
UNDEFINE_QUERY()
memcpy( pMSG->GetBuffer() + wSIZE, &bCount, sizeof(bCount));
pUser->Say(pMSG);
return EC_NOERROR;
}
DWORD CTLoginSvrModule::OnCS_CHANNELLIST_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
if(!pUser->m_bAgreement)
return EC_SESSION_INVALIDCHAR;
CPacket *pMSG = new CPacket();
WORD wSIZE = pMSG->GetSize();
BYTE bCount = 0;
pMSG->SetID(CS_CHANNELLIST_ACK)
<< bCount
<< GetCheckFilePoint(pUser);
DEFINE_QUERY( pDB, CTBLChannel)
packet >> query->m_bGroupID;
if(query->Open())
{
while(query->Fetch())
{
(*pMSG)
<< CString(query->m_szNAME)
<< query->m_bChannel
<< BYTE(query->m_bStatus == TSVR_STATUS_SLEEP ? TSTATUS_SLEEP : query->m_dwCount > query->m_wFull ? TSTATUS_FULL : query->m_dwCount > query->m_wBusy ? TSTATUS_BUSY : TSTATUS_NORMAL);
bCount++;
}
query->Close();
}
UNDEFINE_QUERY()
memcpy( pMSG->GetBuffer() + wSIZE, &bCount, sizeof(bCount));
pUser->Say(pMSG);
return EC_NOERROR;
}
/*
* OnCS_CHARLIST_REQ
*
*/
#ifdef DEF_UDPLOG
DWORD CTLoginSvrModule::OnCS_CHARLIST_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
if(!pUser->m_bAgreement)
return EC_SESSION_INVALIDCHAR;
BYTE bCount;
packet >> pUser->m_bGroupID;
bCount = 0;
// Delete the Char List Memory
for(DWORD i=0; i < pUser->m_vCHAR.size(); i++)
delete pUser->m_vCHAR[i];
pUser->m_vCHAR.clear();
// Find Group
LPTGROUP pGroup = FindGroup(pGROUP, pUser->m_bGroupID);
if(pGroup)
{
DEFINE_QUERY( &pGroup->m_db, CTBLChar)
query->m_dwUserID = pUser->m_dwID;
if(query->Open())
{
while(query->Fetch())
{
LPTCHARACTER pChar = new TCHARACTER();
pChar->m_bStartAct = query->m_bStartAct;
pChar->m_bSlot = query->m_bSlot;
pChar->m_bRace = query->m_bRace;
pChar->m_bCountry = query->m_bCountry;
pChar->m_bSex = query->m_bSex;
pChar->m_strName = query->m_szNAME;
pChar->m_dwCharID = query->m_dwCharID;
pChar->m_bLevel = query->m_bLevel;
pChar->m_bBody = query->m_bBody;
pChar->m_bClass = query->m_bClass;
pChar->m_bFace = query->m_bFace;
pChar->m_bFoot = query->m_bFoot;
pChar->m_bHair = query->m_bHair;
pChar->m_bHand = query->m_bHand;
pChar->m_bPants = query->m_bPants;
pChar->m_dwRegion = query->m_dwRegion;
pChar->m_strGuildName = NAME_NULL;
pChar->m_dwFame = 0;
pChar->m_dwFameColor = 0;
pUser->m_vCHAR.push_back(pChar);
}
query->Close();
}
UNDEFINE_QUERY()
}
for(BYTE i=0; i< pUser->m_vCHAR.size(); i++)
{
DEFINE_QUERY(&pGroup->m_db, CTBLItem)
query->m_bStorageType = STORAGE_INVEN;
query->m_dwStorageID = INVEN_EQUIP;
query->m_bOwnerType = TOWNER_CHAR;
query->m_dwOwnerID = pUser->m_vCHAR[i]->m_dwCharID;
if(query->Open())
{
while(query->Fetch())
{
LPTITEM pItem = new TITEM();
pItem->m_bItemID = query->m_bItemID;
pItem->m_wItemID = query->m_wItemID;
pItem->m_bLevel = query->m_bLevel;
pItem->m_bGradeEffect = query->m_bGradeEffect;
pItem->m_wColor = WORD(query->m_dwColor);
pItem->m_bRegGuild = BYTE(query->m_dwRegGuild);
pUser->m_vCHAR[i]->m_vTItem.push_back(pItem);
}
query->Close();
}
UNDEFINE_QUERY()
DEFINE_QUERY(&pGroup->m_db, CSPGetGuildInfo)
query->m_dwCharID = pUser->m_vCHAR[i]->m_dwCharID;
if(query->Call())
{
pUser->m_vCHAR[i]->m_strGuildName = query->m_szName;
pUser->m_vCHAR[i]->m_dwFame = query->m_dwFame;
pUser->m_vCHAR[i]->m_dwFameColor = query->m_dwFameColor;
}
UNDEFINE_QUERY()
}
CPacket *pMSG = new CPacket();
pMSG->SetID(CS_CHARLIST_ACK)
<< GetCheckFilePoint(pUser)
<< BYTE( pUser->m_vCHAR.size() );
for(i=0; i< pUser->m_vCHAR.size(); i++)
{
(*pMSG)
<< pUser->m_vCHAR[i]->m_dwCharID
<< pUser->m_vCHAR[i]->m_strName
<< pUser->m_vCHAR[i]->m_bStartAct
<< pUser->m_vCHAR[i]->m_bSlot
<< pUser->m_vCHAR[i]->m_bLevel
<< pUser->m_vCHAR[i]->m_bClass
<< pUser->m_vCHAR[i]->m_bRace
<< pUser->m_vCHAR[i]->m_bCountry
<< pUser->m_vCHAR[i]->m_bSex
<< pUser->m_vCHAR[i]->m_bHair
<< pUser->m_vCHAR[i]->m_bFace
<< pUser->m_vCHAR[i]->m_bBody
<< pUser->m_vCHAR[i]->m_bPants
<< pUser->m_vCHAR[i]->m_bHand
<< pUser->m_vCHAR[i]->m_bFoot
<< pUser->m_vCHAR[i]->m_dwRegion
<< pUser->m_vCHAR[i]->m_dwFame
<< pUser->m_vCHAR[i]->m_dwFameColor
<< BYTE(pUser->m_vCHAR[i]->m_vTItem.size());
for(DWORD j=0; j< pUser->m_vCHAR[i]->m_vTItem.size(); j++)
{
(*pMSG)
<< pUser->m_vCHAR[i]->m_vTItem[j]->m_bItemID
<< pUser->m_vCHAR[i]->m_vTItem[j]->m_wItemID
<< pUser->m_vCHAR[i]->m_vTItem[j]->m_bLevel
<< pUser->m_vCHAR[i]->m_vTItem[j]->m_bGradeEffect
<< pUser->m_vCHAR[i]->m_vTItem[j]->m_wColor
<< pUser->m_vCHAR[i]->m_vTItem[j]->m_bRegGuild;
delete pUser->m_vCHAR[i]->m_vTItem[j];
}
pUser->m_vCHAR[i]->m_vTItem.clear();
}
pUser->Say(pMSG);
return EC_NOERROR;
}
#else
DWORD CTLoginSvrModule::OnCS_CHARLIST_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
if(!pUser->m_bAgreement)
return EC_SESSION_INVALIDCHAR;
BYTE bCount;
packet >> pUser->m_bGroupID;
bCount = 0;
LPTGROUP pGroup = FindGroup(pGROUP, pUser->m_bGroupID);
VTCHAR vCHAR;
vCHAR.clear();
if(pGroup)
{
DEFINE_QUERY( &pGroup->m_db, CTBLChar)
query->m_dwUserID = pUser->m_dwID;
if(query->Open())
{
while(query->Fetch())
{
LPTCHARACTER pChar = new TCHARACTER();
pChar->m_bStartAct = query->m_bStartAct;
pChar->m_bSlot = query->m_bSlot;
pChar->m_bRace = query->m_bRace;
pChar->m_bCountry = query->m_bCountry;
pChar->m_bSex = query->m_bSex;
pChar->m_strName = query->m_szNAME;
pChar->m_dwCharID = query->m_dwCharID;
pChar->m_bLevel = query->m_bLevel;
pChar->m_bBody = query->m_bBody;
pChar->m_bClass = query->m_bClass;
pChar->m_bFace = query->m_bFace;
pChar->m_bFoot = query->m_bFoot;
pChar->m_bHair = query->m_bHair;
pChar->m_bHand = query->m_bHand;
pChar->m_bPants = query->m_bPants;
pChar->m_dwRegion = query->m_dwRegion;
pChar->m_strGuildName = NAME_NULL;
pChar->m_dwFame = 0;
pChar->m_dwFameColor = 0;
vCHAR.push_back(pChar);
}
query->Close();
}
UNDEFINE_QUERY()
}
for(BYTE i=0; i<vCHAR.size(); i++)
{
DEFINE_QUERY(&pGroup->m_db, CTBLItem)
query->m_bStorageType = STORAGE_INVEN;
query->m_dwStorageID = INVEN_EQUIP;
query->m_bOwnerType = TOWNER_CHAR;
query->m_dwOwnerID = pUser->m_vCHAR[i]->m_dwCharID;
if(query->Open())
{
while(query->Fetch())
{
LPTITEM pItem = new TITEM();
pItem->m_bItemID = query->m_bItemID;
pItem->m_wItemID = query->m_wItemID;
pItem->m_bLevel = query->m_bLevel;
pItem->m_bGradeEffect = query->m_bGradeEffect;
pItem->m_wColor = WORD(query->m_dwColor);
pItem->m_bRegGuild = BYTE(query->m_dwRegGuild);
vCHAR[i]->m_vTItem.push_back(pItem);
}
query->Close();
}
UNDEFINE_QUERY()
DEFINE_QUERY(&pGroup->m_db, CSPGetGuildInfo)
query->m_dwCharID = pUser->m_vCHAR[i]->m_dwCharID;
if(query->Call())
{
vCHAR[i]->m_strGuildName = query->m_szName;
vCHAR[i]->m_dwFame = query->m_dwFame;
vCHAR[i]->m_dwFameColor = query->m_dwFameColor;
}
UNDEFINE_QUERY()
}
CPacket *pMSG = new CPacket();
pMSG->SetID(CS_CHARLIST_ACK)
<< GetCheckFilePoint(pUser)
<< BYTE(vCHAR.size());
for(i=0; i<vCHAR.size(); i++)
{
(*pMSG)
<< vCHAR[i]->m_dwCharID
<< vCHAR[i]->m_strName
<< vCHAR[i]->m_bStartAct
<< vCHAR[i]->m_bSlot
<< vCHAR[i]->m_bLevel
<< vCHAR[i]->m_bClass
<< vCHAR[i]->m_bRace
<< vCHAR[i]->m_bCountry
<< vCHAR[i]->m_bSex
<< vCHAR[i]->m_bHair
<< vCHAR[i]->m_bFace
<< vCHAR[i]->m_bBody
<< vCHAR[i]->m_bPants
<< vCHAR[i]->m_bHand
<< vCHAR[i]->m_bFoot
<< vCHAR[i]->m_dwRegion
<< vCHAR[i]->m_dwFame
<< vCHAR[i]->m_dwFameColor
<< BYTE(vCHAR[i]->m_vTItem.size());
for(DWORD j=0; j<vCHAR[i]->m_vTItem.size(); j++)
{
(*pMSG)
<< vCHAR[i]->m_vTItem[j]->m_bItemID
<< vCHAR[i]->m_vTItem[j]->m_wItemID
<< vCHAR[i]->m_vTItem[j]->m_bLevel
<< vCHAR[i]->m_vTItem[j]->m_bGradeEffect
<< vCHAR[i]->m_vTItem[j]->m_wColor
<< vCHAR[i]->m_vTItem[j]->m_bRegGuild;
delete vCHAR[i]->m_vTItem[j];
}
delete vCHAR[i];
}
pUser->Say(pMSG);
return EC_NOERROR;
}
#endif // DEF_UDPLOG
/*
* OnCS_CREATECHAR_REQ
*/
DWORD CTLoginSvrModule::OnCS_CREATECHAR_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
if(!pUser->m_bAgreement)
return EC_SESSION_INVALIDCHAR;
CString strNAME;
BYTE bGroupID;
BYTE bSlotID;
BYTE bClass;
BYTE bRace;
BYTE bCountry;
BYTE bSex;
BYTE bHair;
BYTE bFace;
BYTE bBody;
BYTE bPants;
BYTE bHand;
BYTE bFoot;
packet
>> bGroupID
>> strNAME
>> bSlotID
>> bClass
>> bRace
>> bCountry
>> bSex
>> bHair
>> bFace
>> bBody
>> bPants
>> bHand
>> bFoot;
if(bGroupID != pUser->m_bGroupID)
return EC_SESSION_INVALIDCHAR;
LPTGROUP pGroup = FindGroup(pGROUP, bGroupID);
//strNAME.TrimRight();
//strNAME.TrimLeft();
if(pGroup)
{
// À̸§ ±æÀÌ Á¦ÇÑ ÇѱÛ8ÀÚ
if(strNAME.GetLength() > 16 || strNAME.GetLength() < 1)
{
pUser->SendCS_CREATECHAR_ACK(
CR_OVERCHAR,
0, strNAME,
bSlotID,
bClass,
bRace,
bCountry,
bSex,
bHair,
bFace,
bBody,
bPants,
bHand,
bFoot,
pUser->m_bCreateCnt);
return EC_NOERROR;
}
// a-z A-Z 0-9 ¹®ÀÚ¸¸ Çã¿ë (Çѹ®, ½ºÆäÀ̽º ±ÝÁö)
if(!CheckCharName(strNAME))
{
pUser->SendCS_CREATECHAR_ACK(
CR_PROTECTED,
0, strNAME,
bSlotID,
bClass,
bRace,
bCountry,
bSex,
bHair,
bFace,
bBody,
bPants,
bHand,
bFoot,
pUser->m_bCreateCnt);
return EC_NOERROR;
}
DEFINE_QUERY( &pGroup->m_db, CSPCreateChar)
lstrcpy( query->m_szNAME, LPCSTR(strNAME));
query->m_bGroup = pGroup->m_bID;
query->m_dwUserID = pUser->m_dwID;
query->m_dwCharID = 0;
query->m_bSlot = bSlotID;
query->m_bClass = bClass;
query->m_bRace = bRace;
query->m_bCountry = bCountry;
query->m_bSex = bSex;
query->m_bHair = bHair;
query->m_bFace = bFace;
query->m_bBody = bBody;
query->m_bPants = bPants;
query->m_bHand = bHand;
query->m_bFoot = bFoot;
if(!query->Call())
query->m_nRET = CR_INTERNAL;
#ifdef DEF_UDPLOG
if(!query->m_nRET)
{
LPTCHARACTER pChar = new TCHARACTER();
pChar->m_bSlot = query->m_bSlot;
pChar->m_bRace = query->m_bRace;
pChar->m_bCountry = query->m_bCountry;
pChar->m_bSex = bSex;
pChar->m_strName = query->m_szNAME;
pChar->m_dwCharID = query->m_dwCharID;
pChar->m_bLevel = query->m_bCountry == TCONTRY_PEACE ? 1 : CHOICE_COUNTRY_LEVEL;
pChar->m_bBody = query->m_bBody;
pChar->m_bClass = query->m_bClass;
pChar->m_bFace = query->m_bFace;
pChar->m_bFoot = query->m_bFoot;
pChar->m_bHair = query->m_bHair;
pChar->m_bHand = query->m_bHand;
pChar->m_bPants = query->m_bPants;
pChar->m_dwRegion = 0;
pUser->InsertCharacter(pChar);
m_pUdpSocket->LogCharCreate(pUser, query->m_nRET, bGroupID, pChar);
}
#endif
if(!query->m_nRET)
{
pUser->m_bCreateCnt = query->m_bCreateCnt;
if(query->m_bCreateCnt == 1)
{
MAPDWORD::iterator itCU = m_mapCurrentUser.find(bGroupID);
if(itCU != m_mapCurrentUser.end())
(*itCU).second++;
}
}
pUser->SendCS_CREATECHAR_ACK(
query->m_nRET,
query->m_dwCharID,
query->m_szNAME,
query->m_bSlot,
query->m_bClass,
query->m_bRace,
query->m_bCountry,
query->m_bSex,
query->m_bHair,
query->m_bFace,
query->m_bBody,
query->m_bPants,
query->m_bHand,
query->m_bFoot,
query->m_bCreateCnt);
UNDEFINE_QUERY()
}
else
{
pUser->SendCS_CREATECHAR_ACK(
CR_NOGROUP,
0, strNAME,
bSlotID,
bClass,
bRace,
bCountry,
bSex,
bHair,
bFace,
bBody,
bPants,
bHand,
bFoot,
pUser->m_bCreateCnt);
}
return EC_NOERROR;
}
/*
* OnCS_DELCHAR_REQ
*/
DWORD CTLoginSvrModule::OnCS_DELCHAR_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
if(!pUser->m_dwID)
return EC_NOERROR;
CString strPasswd;
DWORD dwCharID;
BYTE bGroupID;
packet
>> bGroupID
>> strPasswd
>> dwCharID;
if(bGroupID != pUser->m_bGroupID)
return EC_SESSION_INVALIDCHAR;
LPTGROUP pGroup = FindGroup(pGROUP, bGroupID);
if(strPasswd.GetLength() > MAX_NAME)
{
#ifdef DEF_UDPLOG
LPTCHARACTER pChar = pUser->FindCharacterBase(dwCharID);
m_pUdpSocket->LogCharDelete(pUser, DR_INVALIDPASSWD, bGroupID, pChar);
#endif
pUser->SendCS_DELCHAR_ACK( DR_INVALIDPASSWD, dwCharID );
return EC_NOERROR;
}
if(pGroup)
{
DEFINE_QUERY( pDB, CSPCheckPasswd)
lstrcpy( query->m_szPasswd, LPCSTR(strPasswd));
query->m_dwID = pUser->m_dwID;
if(!query->Call())
query->m_nRET = DR_INTERNAL;
if(query->m_nRET)
{
pUser->SendCS_DELCHAR_ACK( query->m_nRET, dwCharID );
return EC_NOERROR;
}
UNDEFINE_QUERY()
BYTE bRet=0;
BYTE bCreateCnt = 0;
DEFINE_QUERY( &pGroup->m_db, CSPDeleteChar)
query->m_bGroup = pGroup->m_bID;
query->m_dwUserID = pUser->m_dwID;
query->m_dwCharID = dwCharID;
query->Call();
bCreateCnt = query->m_bCreateCnt;
bRet = query->m_nRET;
UNDEFINE_QUERY()
#ifdef DEF_UDPLOG
LPTCHARACTER pChar = pUser->FindCharacterBase(dwCharID);
m_pUdpSocket->LogCharDelete(pUser, bRet, bGroupID, pChar);
pUser->DeleteCharacter(dwCharID);
#endif
if(bRet)
{
pUser->SendCS_DELCHAR_ACK( DR_GUILD, dwCharID );
return EC_NOERROR;
}
pUser->SendCS_DELCHAR_ACK( DR_SUCCESS, dwCharID );
if(!bCreateCnt)
{
MAPDWORD::iterator itCU = m_mapCurrentUser.find(bGroupID);
if(itCU != m_mapCurrentUser.end() && (*itCU).second)
(*itCU).second--;
}
}
else
{
#ifdef DEF_UDPLOG
LPTCHARACTER pChar = pUser->FindCharacterBase(dwCharID);
m_pUdpSocket->LogCharDelete(pUser, DR_NOGROUP, bGroupID, pChar);
#endif
pUser->SendCS_DELCHAR_ACK( DR_NOGROUP, dwCharID );
}
return EC_NOERROR;
}
/*
* OnCS_START_REQ
*/
DWORD CTLoginSvrModule::OnCS_START_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
if(!pUser->m_bAgreement)
return EC_SESSION_INVALIDCHAR;
DWORD dwCharID;
BYTE bServerID;
BYTE bGroupID;
BYTE bChannel;
packet
>> bGroupID
>> bChannel
>> dwCharID;
if(bGroupID != pUser->m_bGroupID ||
!pUser->m_qCheckPoint.empty())
{
if(!pUser->m_qCheckPoint.empty())
LogExecCheck(pUser->m_dwID, 4, pUser->m_strUserID);
return EC_SESSION_INVALIDCHAR;
}
LPTGROUP pGroup = FindGroup(pGROUP, bGroupID);
if(!pGroup)
{
#ifdef DEF_UDPLOG
LPTCHARACTER pChar = pUser->FindCharacterBase(dwCharID);
m_pUdpSocket->LogGameStart(pUser, SR_NOGROUP, bGroupID, pChar);
#endif
pUser->SendCS_START_ACK(SR_NOGROUP, 0, 0, 0);
return EC_NOERROR;
}
// Find Server ID
DEFINE_QUERY( &pGroup->m_db, CSPFindServerID)
query->m_dwCharID = dwCharID;
query->m_bChannel = bChannel;
if(!query->Call())
query->m_nRET = SR_INTERNAL;
if(query->m_nRET)
{
pUser->SendCS_START_ACK(query->m_nRET,0, 0, 0);
#ifdef DEF_UDPLOG
LPTCHARACTER pChar = pUser->FindCharacterBase(dwCharID);
m_pUdpSocket->LogGameStart(pUser, query->m_nRET, bGroupID, pChar);
#endif
return EC_NOERROR;
}
bServerID = query->m_bServerID;
UNDEFINE_QUERY()
// Find Connect Server IP/PORT
DEFINE_QUERY( pDB, CSPRoute)
query->m_bServerID = bServerID;
query->m_bGroupID = bGroupID;
query->m_bType = SVRGRP_MAPSVR;
if(!query->Call())
query->m_nRET = SR_INTERNAL;
if(query->m_nRET)
{
#ifdef DEF_UDPLOG
LPTCHARACTER pChar = pUser->FindCharacterBase(dwCharID);
m_pUdpSocket->LogGameStart(pUser, query->m_nRET, bGroupID, pChar);
#endif
pUser->SendCS_START_ACK(query->m_nRET, 0, 0, 0);
return EC_NOERROR;
}
#ifdef DEF_UDPLOG
LPTCHARACTER pChar = pUser->FindCharacterBase(dwCharID);
m_pUdpSocket->LogGameStart(pUser, SR_SUCCESS, bGroupID, pChar, query->m_szIPAddr, query->m_wPort, bServerID);
#endif
pUser->SendCS_START_ACK( SR_SUCCESS, inet_addr(query->m_szIPAddr), query->m_wPort, bServerID);
pUser->m_bLogout = FALSE;
UNDEFINE_QUERY()
return EC_SESSION_INVALIDCHAR;
}
DWORD CTLoginSvrModule::OnCS_AGREEMENT_REQ( CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
pUser->m_bAgreement = TRUE;
DEFINE_QUERY( pDB, CSPAgreement)
query->m_dwUserID = pUser->m_dwID;
query->Call();
UNDEFINE_QUERY()
return EC_NOERROR;
}
DWORD CTLoginSvrModule::OnCS_TERMINATE_REQ(CSqlDatabase *pDB, LPMAPTGROUP pGROUP, CTUser *pUser, CPacket& packet)
{
DWORD dwKey;
packet
>> dwKey;
if(dwKey != 720809425)
return EC_SESSION_INVALIDCHAR;
LogEvent("L %d", pUser->m_dwID);
UnregisterServer(TRUE);
UnregisterAppId();
Uninstall();
PostQueuedCompletionStatus(
m_hIocpWork, 0,
COMP_EXIT, NULL);
return EC_NOERROR;
}
DWORD CTLoginSvrModule::OnCS_HOTSEND_REQ( CSqlDatabase * pDB, LPMAPTGROUP pGROUP, CTUser * pUser, CPacket& packet)
{
BYTE bAll;
INT64 dlValue;
packet
>> dlValue
>> bAll;
if(m_hExecFile == INVALID_HANDLE_VALUE)
return EC_NOERROR;
if(bAll)
{
pUser->m_qCheckPoint.pop();
if(dlValue != (m_dlCheckFile ^ pUser->m_dlCheckKey))
{
LogExecCheck(pUser->m_dwID, 1);
return EC_SESSION_INVALIDCHAR;
}
}
else if(!CheckFile(pUser, dlValue))
{
LogExecCheck(pUser->m_dwID, 2);
return EC_SESSION_INVALIDCHAR;
}
return EC_NOERROR;
}
Ich kompilierte diesen Service (es sind noch andere Dateien vorhanden).Jedoch wollte dieser dann nicht mehr starten. Daher wollte ich nun hier nachfragen was genau ich verändern soll damit die wVersion ignoriert wird.
Mit freundlichen Grüßen.. Konst






