Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include "SocketGame.h"
- #include <winsock2.h>
- #include <ws2tcpip.h>
- #pragma comment (lib, "Ws2_32.lib")
- DWORD dwReconnectLoginServerCount = 0;
- DWORD dwTimePacket = 0;
- BOOL bCanCheckConnection = FALSE;
- extern int iLoginServerPingID;
- extern int iGameServerPingID;
- struct PacketReceiving * SocketGame::psaPacketReceiving[100];
- int SocketGame::iNextReceiver;
- typedef void( __cdecl *t_RecvPacketRouter ) ( UINT Socket );
- t_RecvPacketRouter RecvPacketRouter = ( t_RecvPacketRouter )0x00632A50;
- void SocketGame::SendLoginServer( void * pData, BOOL bEncrypt )
- {
- SocketData * sdl = SOCKETL;
- SocketData * sdg = SOCKETG;
- if ( SOCKETL )
- SOCKETL->SendPacket( (Packet*)pData, bEncrypt );
- }
- void SocketGame::SendGameServer( void * pData, BOOL bEncrypt )
- {
- if ( SOCKETG )
- SOCKETG->SendPacket( (Packet*)pData, bEncrypt );
- }
- void SocketGame::SetIPPort( const char * pszIP, int iPort )
- {
- char * ip = (char*)pszIP;
- if ( (pszIP[0] < '0') || (pszIP[0] > '9') )
- {
- hostent * record = gethostbyname( pszIP );
- in_addr * address = (in_addr *)record->h_addr;
- ip = inet_ntoa( *address );
- }
- // IP
- STRINGCOPYLEN( (char*)0x0CDE160, 16, ip );
- STRINGCOPYLEN( (char*)0x0CDE13C, 16, ip );
- STRINGCOPYLEN( (char*)0x0CDE1A8, 16, ip );
- STRINGCOPYLEN( (char*)0x0CDE184, 16, ip );
- PORT_GAME = iPort;
- // PORT
- *(UINT*)0x0CDE180 = PORT_GAME;
- *(UINT*)0x0CDE15C = PORT_GAME;
- *(UINT*)0x0CDE1A4 = PORT_GAME;
- *(UINT*)0x0CDE1C8 = PORT_GAME;
- }
- int SocketGame::GetNumFreeSlots()
- {
- int iFreeSlots = 0;
- for( int i = 0; i < iMaxConnections; i++ )
- {
- SocketData * sd = pcaSocketData + i;
- if( !sd->bInUse )
- iFreeSlots++;
- }
- return iFreeSlots;
- }
- SocketData * SocketGame::GetFreeSocketData()
- {
- SocketData * r = NULL;
- for ( int i = 0; i < iMaxConnections; i++ )
- {
- SocketData * sd = pcaSocketData + i;
- if ( !sd->bInUse )
- {
- sd->Init();
- r = sd;
- break;
- }
- }
- return r;
- }
- SocketData * SocketGame::GetSocketData( const char * pszIP, int iPort )
- {
- for ( int i = 0; i < iMaxConnections; i++ )
- {
- SocketData * sd = pcaSocketData + i;
- if ( sd->bInUse && STRINGCOMPARE( sd->szIP, pszIP ) && sd->iPort == iPort )
- {
- return sd;
- }
- }
- return NULL;
- }
- void SocketGame::DisconnectOldSocket()
- {
- for ( int i = 0; i < iMaxConnections; i++ )
- {
- SocketData * sd = pcaSocketData + i;
- if ( !sd->bInUse && sd->bConnected )
- {
- SOCKETGAME->SocketClose( sd );
- }
- }
- }
- SocketData * SocketGame::Connect( const char * pszIP, int iPort )
- {
- SocketData * sd = NULL;
- if ( (sd = SOCKETGAME->GetSocketData( pszIP, iPort )) == NULL )
- {
- sd = SOCKETGAME->GetFreeSocketData();
- if ( sd )
- {
- if ( !sd->Connect( pszIP, iPort ) )
- {
- sd->UnInit();
- return NULL;
- }
- }
- }
- else
- {
- PacketReceiving * p = new PacketReceiving;
- p->bInUse = TRUE;
- p->bDelete = TRUE;
- //Connection already Confirmed
- PacketVersion sPacket;
- sPacket.iLength = sizeof( PacketVersion );
- sPacket.iHeader = PKTHDR_Version; // edit chaos
- sPacket.bServerFull = FALSE;
- sPacket.iUnk2 = 0;
- sPacket.iVersion = READDWORD( 0x04AF7FFC );
- CopyMemory( p->baPacket, &sPacket, sizeof( PacketVersion ) );
- SOCKETGAME->SocketPacket( sd, p );
- }
- return sd;
- }
- void SocketGame::SocketClose( SocketData * sd )
- {
- if ( (sd) && (sd->bInUse) )
- {
- if ( sd == SOCKETL )
- SOCKETL = NULL;
- if ( sd == SOCKETG )
- SOCKETL = NULL;
- while ( sd->bConnecting )
- Sleep( 2500 );
- sd->Close();
- sd->UnInit();
- }
- }
- void SocketGame::SocketPacket( SocketData * sd, PacketReceiving * p )
- {
- pcMutex->Lock( 5000 );
- Packet * psPacket = (Packet*)p->baPacket;
- int len = psPacket->iLength;
- if ( len > 0x2000 )
- return;
- PACKETHANDLER->AnalyzePacket( sd, psPacket );
- /* TEMPORARILY */
- static char * packettemp = NULL;
- if ( packettemp == NULL )
- packettemp = new char[0x202C];
- char * pointertotmp = packettemp;
- memcpy( packettemp + 0x2C, psPacket, len );
- WRITEDWORD( pointertotmp, sd );
- if ( psPacket->iHeader == PKTHDR_KeySet )
- {
- // sd->KeyObfuscatorSet( ((PacketSendKey*)&p->sPacket)->bKey );
- }
- else
- {
- __asm
- {
- PUSHAD;
- MOV EAX, packettemp;
- PUSH EAX;
- MOV EAX, 0x00632A50;
- CALL EAX;
- ADD ESP, 4;
- POPAD;
- }
- }
- sd->dwTimeLastPacketReceived = TICKCOUNT;
- sd->FreePacketReceiving( p );
- pcMutex->Unlock();
- }
- DWORD WINAPI SocketGame::ReceiveThread()
- {
- return TRUE;
- }
- DWORD WINAPI SocketGame::Receiver( SocketData * sd )
- {
- SocketGame * m = SOCKETGAME;
- HWND hWnd = m->GetHWND();
- PacketReceiving * p;
- do
- {
- WaitForSingleObject( sd->hReceiveThreadSignal, INFINITE );
- if( !m->IsActive() )
- break;
- while( (p = sd->ReceivePacket()) != NULL )
- {
- PostMessageA( hWnd, WM_SOCKETPACKET, (WPARAM)sd, (LPARAM)p );
- }
- sd->bBlockSend = TRUE;
- if ( m->IsActive() )
- {
- if ( sd->bConnected )
- {
- WNDPROC_SOCKETCLOSE( hWnd, sd );
- }
- }
- } while( m->IsActive() );
- return TRUE;
- }
- DWORD WINAPI SocketGame::Sender( SocketData * sd )
- {
- SocketGame * m = SOCKETGAME;
- HWND hWnd = m->GetHWND();
- PacketSending * p;
- do
- {
- WaitForSingleObject( sd->hSendThreadSignal, INFINITE );
- if( !m->IsActive() )
- break;
- while( (p = sd->NextPacketSending()) != NULL )
- {
- //Post Packet Message
- if ( !sd->Send( p ) )
- {
- sd->FreePacketSending( p );
- break;
- }
- sd->FreePacketSending( p );
- }
- } while( m->IsActive() );
- return TRUE;
- }
- void SocketGame::Init( HWND hwnd )
- {
- hWnd = hwnd;
- pcMutex = new CMutex( "Socket Game" );
- // Init socket data
- *( UINT* )0x213358C = *( UINT* )0x0A17540;
- BOOL bTestServer = FALSE;
- char * ip = NULL;
- ip = "190.2.131.139"; // official 137.74.4.97
- //ip = "158.69.136.79";
- //ip = "127.0.0.1";
- SetIPPort( ip, PORT_GAME );
- *( UINT* )0x2335020 = 0;
- // Initialize criticals sections
- InitializeCriticalSection( ( LPCRITICAL_SECTION )0x213321C );
- InitializeCriticalSection( ( LPCRITICAL_SECTION )0x2334DB8 );
- InitializeCriticalSection( ( LPCRITICAL_SECTION )0x2334D98 );
- *( UINT* )0x2133D90 = 0;
- // Define socket loop
- UINT socketLoop = 0x2335050;
- int iLoopVar = 0;
- // Socket Loop
- while ( socketLoop < 0x2444350 )
- {
- *( UINT* )( socketLoop + 4 ) = iLoopVar;
- *( UINT* )( socketLoop + 8 ) = 0;
- *( UINT* )( socketLoop ) = socketLoop;
- *( UINT* )( socketLoop + 0x24 ) = socketLoop;
- *( UINT* )( socketLoop + 0x2150 ) = socketLoop;
- *( UINT* )( socketLoop + 0x427C ) = 0;
- *( UINT* )( socketLoop + 0x4280 ) = 0;
- iLoopVar += 1;
- socketLoop += 0x43CC;
- }
- // Socket Loop
- socketLoop = 0x2134598;
- while ( socketLoop < 0x2334D98 )
- {
- *( UINT* )socketLoop = 0;
- socketLoop += 0x2008;
- }
- /*if ( bTestServer )
- {
- PORT_GAME = 10010;
- }*/
- // PORT
- *( UINT* )0x0CDE180 = PORT_GAME;
- *( UINT* )0x0CDE15C = PORT_GAME;
- *( UINT* )0x0CDE1A4 = PORT_GAME;
- *( UINT* )0x0CDE1C8 = PORT_GAME;
- bActive = TRUE;
- iMaxConnections = 8; // Chaos EDIT default = 8 what is this for, no fing idea.
- pcaSocketData = new SocketData[iMaxConnections];
- for ( int i = 0; i < iMaxConnections; i++ )
- {
- SocketData * sd = pcaSocketData + i;
- sd->pcThis = sd;
- sd->bInUse = FALSE;
- sd->Prepare( 500, 500 );
- sd->hReceiveThread = CreateThread( NULL, KB16, (LPTHREAD_START_ROUTINE)&SocketGame::Receiver, sd, STACK_SIZE_PARAM_IS_A_RESERVATION, NULL );
- sd->hSendThread = CreateThread( NULL, KB16, (LPTHREAD_START_ROUTINE)&SocketGame::Sender, sd, STACK_SIZE_PARAM_IS_A_RESERVATION, NULL );
- }
- bActive = TRUE;
- }
- BOOL WINAPI SocketGame::CheckConnection()
- {
- static DWORD dwTimeCheckL = 0;
- static DWORD dwTimeCheckG = 0;
- //Login Server
- if ( SOCKETGAME )
- {
- SocketData * sd = SOCKETL;
- if ( sd )
- {
- if ( SOCKETGAME->szLoginIP[0] == 0 )
- {
- STRINGCOPY( SOCKETGAME->szLoginIP, sd->szIP );
- SOCKETGAME->iLoginPort = sd->iPort;
- }
- if ( (sd->dwTimeLastPacketReceived + 20000) < TICKCOUNT )
- {
- SOCKETGAME->bLoginServerReconnect = TRUE;
- }
- }
- else
- SOCKETGAME->bLoginServerReconnect = TRUE;
- }
- //Game Server
- if ( SOCKETGAME )
- {
- SocketData * sd = SOCKETG;
- if ( sd )
- {
- if ( SOCKETGAME->szGameIP[0] == 0 )
- {
- STRINGCOPY( SOCKETGAME->szGameIP, sd->szIP );
- SOCKETGAME->iGameServerPort = sd->iPort;
- }
- if ( (sd->dwTimeLastPacketReceived + 20000) < TICKCOUNT )
- {
- SOCKETGAME->bGameServerReconnect = TRUE;
- }
- }
- else
- SOCKETGAME->bGameServerReconnect = TRUE;
- }
- if ( SOCKETGAME->bLoginServerReconnect )
- {
- if ( dwTimeCheckL < TICKCOUNT )
- {
- if ( SOCKETL )
- {
- if ( SOCKETL->bConnected )
- SOCKETGAME->SocketClose( SOCKETL );
- SOCKETL = NULL;
- }
- SOCKETGAME->iReconnectLCOUNT++;
- if ( SOCKETGAME->iReconnectLCOUNT > 10 )
- {
- DISCONNECT_TYPE = -1;
- DISCONNECT_TIME = TICKCOUNT;
- }
- else
- {
- ChatGame::AddChatBoxTextEx( EChatColor::CHATCOLOR_Error, "> Reconnecting to Login Server (%d/10)", SOCKETGAME->iReconnectLCOUNT );
- SocketData * sd = SOCKETGAME->Connect( SOCKETGAME->szLoginIP, SOCKETGAME->iLoginPort );
- SOCKETL = sd;
- if ( sd )
- {
- //Send Reconnect Packet
- PacketReconnectUser s;
- s.iLength = sizeof( PacketReconnectUser );
- s.iHeader = PKTHDR_Reconnect;
- s.dwObjectID = UNITDATA->iID;
- s.iUnk = 0;
- STRINGCOPY( s.szUserID, (char*)0x39033E8 );
- SENDPACKETL( &s );
- }
- }
- dwTimeCheckL = TICKCOUNT + 5000;
- }
- }
- if ( SOCKETGAME->bGameServerReconnect )
- {
- if ( dwTimeCheckG < TICKCOUNT )
- {
- if ( SOCKETG )
- {
- if ( SOCKETG->bConnected )
- SOCKETGAME->SocketClose( SOCKETG );
- SOCKETG = NULL;
- }
- SOCKETGAME->iReconnectGCOUNT++;
- if ( SOCKETGAME->iReconnectGCOUNT > 10 )
- {
- DISCONNECT_TYPE = -1;
- DISCONNECT_TIME = TICKCOUNT;
- }
- else
- {
- ChatGame::AddChatBoxTextEx( EChatColor::CHATCOLOR_Error, "> Reconnecting to Game Server (%d/10)", SOCKETGAME->iReconnectGCOUNT );
- SocketData * sd = SOCKETGAME->Connect( SOCKETGAME->szGameIP, SOCKETGAME->iGameServerPort );
- SOCKETG = sd;
- if ( sd )
- {
- //Send Reconnect Packet
- PacketReconnectUser s;
- s.iLength = sizeof( PacketReconnectUser );
- s.iHeader = PKTHDR_Reconnect;
- s.dwObjectID = UNITDATA->iID;
- s.iUnk = 0;
- STRINGCOPY( s.szUserID, (char*)0x39033E8 );
- SENDPACKETG( &s );
- }
- }
- dwTimeCheckG = TICKCOUNT + 5000;
- }
- }
- return TRUE;
- }
- void SocketGame::Connected()
- {
- bCanCheckConnection = TRUE;
- }
- void SocketGame::Loop()
- {
- if ( Game::GetGameMode() == GAMEMODE_InGame )
- {
- static bool bFirst = false;
- if ( !bFirst )
- {
- if ( SOCKETL && SOCKETG )
- {
- ZeroMemory( (void*)0x03A46600, 0x8E * 4 );
- WRITEDWORD( 0x03A975F4, 0 );
- WRITEDWORD( 0x03A975F8, 0 );
- WRITEDWORD( 0x03A97648, 0 );
- WRITEDWORD( 0x03A97664, 0 );
- WRITEDWORD( 0x03A3E3BC, READDWORD( 0x00CF4824 ) );
- WRITEDWORD( 0x03A46844, 0 );
- WRITEDWORD( 0x00CF47C0, 0 );
- WRITEDWORD( 0x03A976E4, 0 );
- WRITEDWORD( 0x039C8710, 0 );
- WRITEDWORD( 0x00A1781C, 0 );
- WRITEDWORD( 0x03A975F8, -1 );
- ZeroMemory( (void*)0x039F0308, 0x80 * 4 );
- ZeroMemory( (void*)0x0397A708, 0x6 * 4 );
- ZeroMemory( (void*)0x03A46AA0, 0x6 * 4 );
- UnitData * ud = UNITDATA;
- if ( ud )
- {
- PacketSelectCharacter s;
- s.iLength = sizeof( PacketSelectCharacter );
- s.iHeader = PKTHDR_SelectCharacter;
- s.dwReserved1 = 0;
- s.dwReserved2 = 0;
- s.dwReserved3 = 0;
- STRINGCOPY( s.szCharName, ud->sCharacterData.szName );
- SENDPACKETL( &s );
- }
- }
- bFirst = true;
- }
- else
- {
- CALL( 0x006335B8 ); //Update Character... 48470013
- if ( bCanCheckConnection )
- SOCKETGAME->CheckConnection();
- PingConnections();
- if ( DISCONNECT_TYPE != (-2) )
- {
- if ( SOCKETL == NULL )
- {
- if ( DISCONNECT_TYPE == -1 )
- {
- DISCONNECT_TYPE = 1;
- ChatGame::AddChatBoxTextEx( CHATCOLOR_Error, "Connection lost with %s", "Login Server" );
- }
- }
- else if ( SOCKETG == NULL )
- {
- if ( DISCONNECT_TYPE == -1 )
- {
- DISCONNECT_TYPE = 2;
- ChatGame::AddChatBoxTextEx( CHATCOLOR_Error, "Connection lost with %s", "Game Server" );
- }
- }
- }
- }
- CALL( 0x0061ECF0 );
- CALL( 0x00408DF0 );
- }
- }
- void SocketGame::Shutdown()
- {
- bActive = FALSE;
- }
- void SocketGame::PingConnections()
- {
- extern DWORD dwLastTickLogin;
- extern DWORD dwLastTickGame;
- static int iCounter = 0;
- iCounter++;
- static DWORD dwTick = 0;
- for (int i = 0; i < iMaxConnections; i++)
- {
- SocketData * sd = pcaSocketData + i;
- if ((sd->bInUse) && (sd->bConnected))
- {
- if ((sd->bPing == false))
- {
- if ((TICKCOUNT - dwTick) >= 1000) // changed chaos 150 default
- {
- if (SOCKETG)
- {
- PacketPing s;
- s.iLength = sizeof(PacketPing);
- s.iHeader = PKTHDR_Ping;
- dwLastTickGame = TICKCOUNT;
- SENDPACKETG(&s);
- }
- if (SOCKETL)
- {
- PacketPing s;
- s.iLength = sizeof(PacketPing);
- s.iHeader = PKTHDR_Ping;
- dwLastTickLogin = TICKCOUNT;
- SENDPACKETL(&s);
- }
- else
- {
- //Reset Pinging if taking longer than 60 seconds
- if (sd->GetPing(TICKCOUNT) > 60000)
- sd->bPing = false;
- }
- dwTick = TICKCOUNT;
- }
- }
- }
- }
- if (iCounter >= 100)
- iCounter = 0; // users always had DC3, and this part of the code is doing the 10 checks to reconnect to gameserver ( which i added ) when we had the issue.
- }
- void SocketGame::SendPacket( UINT Socket, UINT packet, int size )
- {
- send( *( UINT* )( Socket + 8 ), ( const char * )packet, size, 0 );
- ANTICHEATHANDLER->CheckThread();
- }
- void SocketGame::RecvPacket( UINT Socket )
- {
- int SRecv = 0;
- while ( true )
- {
- SRecv = recv( *( int* )( Socket + 4 ), ( char* )( Socket + 0x2C ), 0x2000, 0 );
- if ( SRecv != SOCKET_ERROR )
- {
- *( int* )( Socket + 8 ) = *( int* )( Socket + 0x2C );
- *( int* )( Socket + 12 ) = *( int* )( Socket + 0x2C + 4 );
- RecvPacketRouter( Socket );
- }
- }
- }
- SocketGame::~SocketGame()
- {
- for ( int i = 0; i < iMaxConnections; i++ )
- {
- SocketData * sd = pcaSocketData + i;
- TerminateThread( sd->hReceiveThread, 0 );
- TerminateThread( sd->hSendThread, 0 );
- }
- DELETA( pcaSocketData );
- }
- void __cdecl SendPacketHook( UINT Socket, UINT packet, int size )
- {
- std::shared_ptr<SocketGame> pSocket = std::make_shared<SocketGame>( );
- pSocket->SendPacket( Socket, packet, size );
- }
- void __cdecl RecvDataHook( UINT Socket )
- {
- std::shared_ptr<SocketGame> pSocket = std::make_shared<SocketGame>( );
- pSocket->RecvPacket( Socket );
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement