DragonNest/Server/ServerCommon/Util.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

244 lines
No EOL
5.2 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 )