//Numpad 7 = Unlimited Ammo Toggle
//Numpad 8 = Rapid Fire Middle Button on Toggle
//Numpad 9 = Super Rapid Fire Left Button on Toggle
#include "stdafx.h"
#include "message.h"
#include <time.h>
#define ADDR_LTCLIENT 0x377B5940
#define ADDR_UNLAMMO 0x3743E3B7
#define ADDR_RAPIDFIRE 0x3744853A
#define ADDR_GAMESTATUS 0X377CE190
#define ADDR_STS 0x00479E80
CCommonLT* g_CommonLT;
CLTClient* g_LTClient;
INT UnlimitedAmmo, RapidFire, SuperRapidFire;
int nVel = 0;
BOOL IsGameReady( )
{
if( GetModuleHandleA( "ClientFX.fxd" ) != NULL &&
GetModuleHandleA( "CShell.dll" ) != NULL &&
GetModuleHandleA( "d3d9.dll" ) != NULL )
return TRUE;
return FALSE;
}
VOID *DetourCreate( BYTE *src, CONST BYTE *dst, CONST INT len )
{
BYTE *jmp = ( BYTE * )malloc( len + 5 );
DWORD dwBack;
VirtualProtect( src, len, PAGE_EXECUTE_READWRITE, &dwBack );
memcpy( jmp, src, len );
jmp += len;
jmp[0] = 0xE9;
*( DWORD * )( jmp + 1 ) = ( DWORD )( src + len - jmp ) - 5;
src[0] = 0xE9;
*( DWORD * )( src + 1 ) = ( DWORD )( dst - src ) - 5;
for( INT i = 5; i < len; i++ )
src[i] = 0x90;
VirtualProtect( src, len, dwBack, &dwBack );
return( jmp - len );
}
typedef UINT( WINAPI *tSendToServer )( ILTMessage_Read *pMsg, UINT Flags );
tSendToServer oSendToServer;
UINT WINAPI hkSendToServer( ILTMessage_Read *pMsg, UINT Flags )
{
if(UnlimitedAmmo)
{
uint8 ID = pMsg->Readuint8( );
if( ID == 130 )
{
CAutoMessage unlimited;
unlimited.Reset( );
unlimited.Writeuint8( 130 );
INT iCount = 70;
if( pMsg->Size( ) >= 992 )
iCount = 97;
for( INT i = 0; i < iCount; i++ )
unlimited.Writeuint8( pMsg->Readuint8( ) );
return oSendToServer( unlimited.Read( ), Flags );
}
memcpy( ( LPVOID )ADDR_UNLAMMO, "\xEB", 1 );
}
else
{
memcpy( ( LPVOID )ADDR_UNLAMMO, "\x74", 1 );
}
if(RapidFire && GetAsyncKeyState(VK_MBUTTON) < 0)
{
static int nTimer;
if(nTimer < GetTickCount())
{
switch(nVel)
{
case 0:
nTimer = GetTickCount() + 100.0f;
case 1:
nTimer = GetTickCount() + 90.0f;
case 2:
nTimer = GetTickCount() + 80.0f;
case 3:
nTimer = GetTickCount() + 60.0f;
case 4:
nTimer = GetTickCount() + 50.0f;
}
memcpy((void *)ADDR_RAPIDFIRE, (PBYTE)"\x90\x90", 2);
}
} else {
memcpy((void *)ADDR_RAPIDFIRE, (PBYTE)"\x74\x3E", 2);
}
if(SuperRapidFire && GetAsyncKeyState(VK_LBUTTON) < 0)
{
memcpy((void *)ADDR_RAPIDFIRE, (PBYTE)"\x90\x90", 2);
} else {
memcpy((void *)ADDR_RAPIDFIRE, (PBYTE)"\x74\x3E", 2);
}
return oSendToServer( pMsg, Flags );
}
DWORD WINAPI Thread( LPVOID lpArgs )
{
while( !IsGameReady( ) )
Sleep( 100 );
g_LTClient = *( CLTClient ** )ADDR_LTCLIENT;
g_CommonLT = g_LTClient->Common( );
oSendToServer = ( tSendToServer ) DetourCreate( ( PBYTE ) ADDR_STS,( PBYTE ) hkSendToServer, 7 );
while( 1 )
{
if( GetAsyncKeyState( VK_NUMPAD7 ) &1 )
UnlimitedAmmo = !UnlimitedAmmo;
if( GetAsyncKeyState( VK_NUMPAD8 ) &1 )
RapidFire = !RapidFire;
if( GetAsyncKeyState( VK_NUMPAD9 ) &1 )
SuperRapidFire = !SuperRapidFire;
Sleep( 100 );
}
return 0;
}