Files
git 9cb257e7ae Add GameClients drops and keep current 1602 source work.
CN1602 is the local client. KR is the official tree with unpacked Data, System, and Sound. Packed .wpk files stay off git.
2026-08-30 23:24:31 +03:00

174 lines
3.9 KiB
C++

#include "stdafx.h"
#include "MasterServerSession.h"
#include "ServerSessionManager.h"
MasterServerSession::MasterServerSession()
{
}
MasterServerSession::~MasterServerSession()
{
}
VOID MasterServerSession::Init()
{
ServerSessionEx::Init();
Services().SetSyncKey( MASTER_SERVER );
}
VOID MasterServerSession::Release()
{
Services().CRYPTINFO.Release();
ServerSessionEx::Release();
}
VOID MasterServerSession::Update()
{
ServerSessionEx::Update();
}
// CHANGES: f110617.1L
void MasterServerSession::OnRedirect(
DWORD network_index, MSG_SERVER_TYPE* const first_contact_msg)
{
ServerSession::OnRedirect(network_index, first_contact_msg);
}
VOID MasterServerSession::OnAccept( DWORD dwNetworkIndex )
{
ASSERT( !"Should not enter here!" );
__asm int 3;
}
VOID MasterServerSession::OnConnect( BOOL bSuccess, DWORD dwNetworkIndex )
{
ServerSessionEx::OnConnect( bSuccess, dwNetworkIndex );
if( bSuccess )
{
SUNLOG(eCRITICAL_LOG, "Connected to master server." );
}
}
VOID MasterServerSession::OnDisconnect()
{
ServerSessionManager* pManager = ServerSessionManager::Instance();
SERVER_SESSION_DELEGATOR& rSession = pManager->FindServer( this );
if( rSession == NULL )
{
MessageOutEx( g_pSunLog, CSunLog::cCRITICAL_LOG, CSunLog::cOUTPUT_BOTH, CSunLog::cCATE_CONNECTION,
"[MasterServerSession] tried to remove an already released connection. Idx[%d]",
this->GetSessionIndex()
);
return;
}
pManager->RemoveServer( rSession );
ServerSessionEx::OnDisconnect();
//SUNLOG(eCRITICAL_LOG, "Disconnected from master server." );
}
BOOL MasterServerSession::SendPacket( MSG_BASE* pMsg, WORD wSize )
{
Services4Session& rService = Services();
Services4Session::sCRYPTINFO& rCRYPT = rService.CRYPTINFO;
BOOL bRet = FALSE;
BYTE* pBYTE;
pBYTE = PACKET_CONTROL_SM::GetBasePacketPtr4Send();
if( (BYTE*)pMsg != pBYTE )
CopyMemory( pBYTE, pMsg, (SIZE_T)wSize );
if( rCRYPT.IsCrypted() )
{
MSG_SM_CRYPTOGRAPHY_PACKET_ENCODING* pENCODING = PACKET_CONTROL_SM::GetPacketPtr_ENCODING();
ASSERT( wSize && wSize<16000 );
pENCODING->SetSNKey( rCRYPT.GetSendSNK() );
rCRYPT.CryptManager().Encrypt( pENCODING->GetPacketStream(), wSize, pENCODING->GetCRC() );
CryptFlowPolicy::MakePacket::PreSend_DefConverter(
(BYTE*)pENCODING,
rService.GetServerIPAddress(),
rService.GetSeqCryptKey() );
wSize += (WORD)pENCODING->GetHeaderSize();
bRet = Send( (BYTE*)pENCODING, wSize );
if( bRet )
rCRYPT.NextRoundSNKey4Send();
else
printf( "Send failed\n" );
return bRet;
}
else
{
ASSERT( !"Unexpected enter while in MasterServer state" );
}
return FALSE;
}
VOID MasterServerSession::OnRecv( BYTE *pMsg, WORD wSize )
{
Services4Session& rService = Services();
Services4Session::sCRYPTINFO& rCRYPT = rService.CRYPTINFO;
CryptFlowPolicy::MakePacket::PostRecv_DefConverter(
pMsg,
rService.GetServerIPAddress(),
rService.GetSeqCryptKey() );
union
{
MSG_BASE* pBASE;
MSG_SM_CRYPTOGRAPHY_PACKET_ENCODED* pENCODED;
};
BOOL bIsCrypted = rCRYPT.IsCrypted();
if( bIsCrypted )
pENCODED = PACKET_CONTROL_SM::GetPacketPtr_ENCODED();
else
pBASE = (MSG_BASE*)PACKET_CONTROL_SM::GetBasePacketPtr4Recv();
if( (BYTE*)pBASE != pMsg )
CopyMemory( pBASE, pMsg, (SIZE_T)wSize );
if( bIsCrypted )
{
if( rCRYPT.GetRecvSNK() == pENCODED->GetSNKey() )
{
DWORD dwSize = (DWORD)wSize - pENCODED->GetHeaderSize();
if( dwSize && (dwSize<16000) )
{
if( rCRYPT.CryptManager().Decrypt( pENCODED->GetPacketStream(), dwSize, pENCODED->GetCRC() ) )
{
rCRYPT.NextRoundSNKey4Recv();
pBASE = (MSG_BASE*)PACKET_CONTROL_SM::GetBasePacketPtr4Recv();
wSize = (WORD)dwSize;
Services().GetPacketHandler()->ParsePacket( MASTER_SERVER, this, pBASE, wSize );
return;
}
}
}
}
else
{
ASSERT( !"Unexpected enter while in MasterServer state" );
return;
}
ASSERT( !"Unexpected path..." );
}