244 lines
5.2 KiB
C++
244 lines
5.2 KiB
C++
|
|
#include "stdafx.h"
|
|||
|
|
#include "Util.h"
|
|||
|
|
#include "StringUtil.h"
|
|||
|
|
#include "MtRandom.h"
|
|||
|
|
#if !defined(_GAMESERVER) && !defined(_VILLAGESERVER)
|
|||
|
|
const int MAX_SESSION_COUNT = 2; //compile time warning
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
CIDGenerator g_IDGenerator;
|
|||
|
|
|
|||
|
|
CIDGenerator::CIDGenerator()
|
|||
|
|
{
|
|||
|
|
m_nUserBaseID = 0x00000000;
|
|||
|
|
m_nNpcBaseID = 0x80000000;
|
|||
|
|
|
|||
|
|
m_nUserConnectionID = 10000;
|
|||
|
|
m_nUserConnectionMask = 0;
|
|||
|
|
m_bUserConnectionSet = false;
|
|||
|
|
m_nDBConnectionID = m_nVillageConnectionID = 0;
|
|||
|
|
m_nUserID = m_nNpcID = m_nPartyID = m_nVoiceChannelID = 0;
|
|||
|
|
m_nGameServerID = m_nFieldID = 0;
|
|||
|
|
m_nGameConnectionID = m_nMasterConnectionID = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CIDGenerator::~CIDGenerator()
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CIDGenerator::SetUserConnectionID(UINT nID)
|
|||
|
|
{
|
|||
|
|
m_IDLock.Lock();
|
|||
|
|
m_nUserConnectionID = nID;
|
|||
|
|
m_IDLock.UnLock();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CIDGenerator::SetUserConnectionMask(BYTE btMask)
|
|||
|
|
{
|
|||
|
|
DN_ASSERT(0 != btMask, "Check!");
|
|||
|
|
|
|||
|
|
m_nUserConnectionMask = (btMask << 24);
|
|||
|
|
m_bUserConnectionSet = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
UINT CIDGenerator::GetUserConnectionID(bool bDoGetRaw)
|
|||
|
|
{
|
|||
|
|
m_IDLock.Lock();
|
|||
|
|
if (0x00FFFFFF <= m_nUserConnectionID) m_nUserConnectionID = DEFAULTUSERSESSIONID;
|
|||
|
|
// UINT ID = ++m_nUserConnectionID;
|
|||
|
|
UINT nID = m_nUserConnectionID;
|
|||
|
|
if (!bDoGetRaw)
|
|||
|
|
nID = (m_nUserConnectionID += 5);
|
|||
|
|
m_IDLock.UnLock();
|
|||
|
|
|
|||
|
|
if (bDoGetRaw)
|
|||
|
|
return nID;
|
|||
|
|
|
|||
|
|
return(nID | m_nUserConnectionMask);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
UINT CIDGenerator::GetDBConnectionID()
|
|||
|
|
{
|
|||
|
|
m_IDLock.Lock();
|
|||
|
|
UINT ID = ++m_nDBConnectionID;
|
|||
|
|
m_IDLock.UnLock();
|
|||
|
|
return ID;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
UINT CIDGenerator::GetVillageConnectionID()
|
|||
|
|
{
|
|||
|
|
m_IDLock.Lock();
|
|||
|
|
UINT ID = ++m_nVillageConnectionID;
|
|||
|
|
m_IDLock.UnLock();
|
|||
|
|
return ID;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
UINT CIDGenerator::GetGameConnectionID()
|
|||
|
|
{
|
|||
|
|
m_IDLock.Lock();
|
|||
|
|
UINT ID = ++m_nGameConnectionID;
|
|||
|
|
m_IDLock.UnLock();
|
|||
|
|
return ID;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
UINT CIDGenerator::GetMasterConnectionID()
|
|||
|
|
{
|
|||
|
|
m_IDLock.Lock();
|
|||
|
|
UINT ID = ++m_nMasterConnectionID;
|
|||
|
|
m_IDLock.UnLock();
|
|||
|
|
return ID;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CIDGenerator::SetPartyID(UINT nID)
|
|||
|
|
{
|
|||
|
|
m_IDLock.Lock();
|
|||
|
|
m_nPartyID = nID;
|
|||
|
|
if (m_nPartyID == 2000000000) m_nPartyID = 0;
|
|||
|
|
m_IDLock.UnLock();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
UINT CIDGenerator::GetPartyID()
|
|||
|
|
{
|
|||
|
|
m_IDLock.Lock();
|
|||
|
|
UINT nID = ++m_nPartyID;
|
|||
|
|
m_IDLock.UnLock();
|
|||
|
|
return nID;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CIDGenerator::SetVoiceChannelID(UINT nID)
|
|||
|
|
{
|
|||
|
|
m_IDLock.Lock();
|
|||
|
|
m_nVoiceChannelID = nID;
|
|||
|
|
m_IDLock.UnLock();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
UINT CIDGenerator::GetVoiceChannelID()
|
|||
|
|
{
|
|||
|
|
m_IDLock.Lock();
|
|||
|
|
USHORT nID = ++m_nVoiceChannelID;
|
|||
|
|
if (m_nVoiceChannelID == 0) m_nVoiceChannelID = 1;
|
|||
|
|
m_IDLock.UnLock();
|
|||
|
|
return nID;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
UINT CIDGenerator::GetUserID()
|
|||
|
|
{
|
|||
|
|
m_IDLock.Lock();
|
|||
|
|
UINT ID = m_nUserBaseID + (++m_nUserID);
|
|||
|
|
m_IDLock.UnLock();
|
|||
|
|
return ID;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
UINT CIDGenerator::GetNpcID()
|
|||
|
|
{
|
|||
|
|
m_IDLock.Lock();
|
|||
|
|
UINT ID = m_nNpcBaseID + (++m_nNpcID);
|
|||
|
|
m_IDLock.UnLock();
|
|||
|
|
return ID;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
UINT CIDGenerator::GetGameServerID()
|
|||
|
|
{
|
|||
|
|
m_IDLock.Lock();
|
|||
|
|
UINT ID = ++m_nGameServerID;
|
|||
|
|
m_IDLock.UnLock();
|
|||
|
|
return ID;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
UINT CIDGenerator::GetFieldID()
|
|||
|
|
{
|
|||
|
|
m_IDLock.Lock();
|
|||
|
|
UINT ID = ++m_nFieldID;
|
|||
|
|
m_IDLock.UnLock();
|
|||
|
|
return ID;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CIDGenerator::IsUser(UINT ID)
|
|||
|
|
{
|
|||
|
|
if (ID < 0x80000000) return true;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CIDGenerator::IsNpc(UINT ID)
|
|||
|
|
{
|
|||
|
|
if (ID >= 0x80000000) return true;
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
std::wstring MakeSecondPasswordString( char *szVersion, const int nSeed, const int nValue[] )
|
|||
|
|
{
|
|||
|
|
std::wstring szResult;
|
|||
|
|
if( nSeed == 0 ) return szResult;
|
|||
|
|
if( nValue[0] == -1 || nValue[1] == -1 || nValue[2] == -1 || nValue[3] == -1 ) return szResult;
|
|||
|
|
|
|||
|
|
CMtRandom Random;
|
|||
|
|
|
|||
|
|
std::vector<std::string> tokens;
|
|||
|
|
TokenizeA( std::string(SecondPassword::GetVersion()), tokens, "." );
|
|||
|
|
|
|||
|
|
int nKey = atoi(tokens[0].c_str()) + atoi(tokens[1].c_str());
|
|||
|
|
if( nKey % 2 ) nKey = -nKey;
|
|||
|
|
|
|||
|
|
int nTempSeed = nSeed + nKey;
|
|||
|
|
Random.srand( nTempSeed );
|
|||
|
|
std::vector<int> nVecList, nVecList2;
|
|||
|
|
int nArray[10] = { 7, 8, 9, 4, 5, 6, 1, 2, 3, 0 };
|
|||
|
|
for( int i=0; i<10; i++ ) nVecList2.push_back(nArray[i]);
|
|||
|
|
|
|||
|
|
while( !nVecList2.empty() ) {
|
|||
|
|
int nOffset = Random.rand( (int)nVecList2.size() );
|
|||
|
|
nVecList.push_back( nVecList2[nOffset] );
|
|||
|
|
nVecList2.erase( nVecList2.begin() + nOffset );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for( int i=0; i<4; i++ ) {
|
|||
|
|
WCHAR wszTemp[4] = { 0, };
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>
|
|||
|
|
if( nValue[i] >= static_cast<int>(nVecList.size()) || nValue[i] < 0 )
|
|||
|
|
return szResult;
|
|||
|
|
|
|||
|
|
_itow_s( nVecList[nValue[i]], wszTemp, 4, 10 );
|
|||
|
|
szResult += wszTemp;
|
|||
|
|
}
|
|||
|
|
return szResult;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#if defined( PRE_ADD_CHARACTERCHECKSUM )
|
|||
|
|
UINT MakeCharacterCheckSum( INT64 biCharacterDBID, char cLevel, int nExp, INT64 biCoin, INT64 biWarehouseCoin )
|
|||
|
|
{
|
|||
|
|
const BYTE cCharSize = sizeof(char) * 2 + 1;
|
|||
|
|
const BYTE cIntSize = sizeof(int) * 2 + 1;
|
|||
|
|
const BYTE cBigIntSize = sizeof(INT64) * 2 + 1;
|
|||
|
|
|
|||
|
|
char szCharacterDBID[cBigIntSize];
|
|||
|
|
char szLevel[cCharSize];
|
|||
|
|
char szExp[cIntSize];
|
|||
|
|
char szCoin[cBigIntSize];
|
|||
|
|
char szWarehouseCoin[cBigIntSize];
|
|||
|
|
|
|||
|
|
sprintf_s(szCharacterDBID, "%016I64x", biCharacterDBID );
|
|||
|
|
sprintf_s(szLevel, "%02x", cLevel);
|
|||
|
|
sprintf_s(szExp, "%08I32x", nExp);
|
|||
|
|
sprintf_s(szCoin, "%016I64x", biCoin );
|
|||
|
|
sprintf_s(szWarehouseCoin, "%016I64x", biWarehouseCoin );
|
|||
|
|
|
|||
|
|
std::string strPin;
|
|||
|
|
strPin += szCharacterDBID;
|
|||
|
|
strPin += szLevel;
|
|||
|
|
strPin += szExp;
|
|||
|
|
strPin += szCoin;
|
|||
|
|
strPin += szWarehouseCoin;
|
|||
|
|
|
|||
|
|
std::string strMD5;
|
|||
|
|
MD5Hash(strPin.c_str(), static_cast<int>(strPin.size()), strMD5);
|
|||
|
|
strMD5.resize( sizeof(int) * 2 ); // 16<31><36><EFBFBD><EFBFBD> <20><> 8<>ڸ<EFBFBD><DAB8><EFBFBD> int <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
|
|||
|
|
|
|||
|
|
UINT uiCheckSum = 0;
|
|||
|
|
std::stringstream stream(strMD5.c_str());
|
|||
|
|
stream >> std::hex >> uiCheckSum;
|
|||
|
|
|
|||
|
|
return uiCheckSum;
|
|||
|
|
}
|
|||
|
|
#endif // #if defined( PRE_ADD_CHARACTERCHECKSUM )
|