rendered paste body//==============================================================================
#include "Sound Hook.h"
#include "Memory Tools.h"
//==============================================================================
//==============================================================================
DWORD g_dwHW_Base = 0x01D0D000;
DWORD g_dwHW_Len = 0x000645a4;
DWORD g_dwCL_ParseSound_Begin = NULL;
DWORD g_dwCL_ParseSound_Call = NULL;
DWORD g_dwCL_ParseSound_End = NULL;
DWORD g_dwSvc_Table = NULL;
//==============================================================================
svc_entry_s* pSvcDispatch;
sound_t pSound;
//==============================================================================
void S_StartDynamicSound( int entnum, int entchannel, char* sample, float* origin, float volume, float attenuation, int timeofs , int pitch )
{
(*pSound)(entnum,entchannel,sample,origin,volume,attenuation,timeofs,pitch);
}
//==============================================================================
DWORD dwHook_SvcEntry( DWORD dwBegin, // begin of the parser
DWORD dwEnd, // end of the parser
DWORD dwCall, // call to the original handler
DWORD dwHandler, // our handler
int iPos // svc_table element ##x
)
{
//Make a copy of the original Handler
DWORD dwMy_Handler = gMemoryTools.dwCopyRange( dwBegin , dwEnd );
//Hook Svc_Table ( hw.dll )
pSvcDispatch[iPos].pfnHandler = (DWORD)dwMy_Handler;
//Redirect Call
return gMemoryTools.dwRedirectCall( ( dwMy_Handler + dwCall ), dwHandler );
}
//==============================================================================
void SetupSoundHook( void )
{
g_dwCL_ParseSound_Begin = gMemoryTools.dwFindPattern( g_dwHW_Base,g_dwHW_Len,(BYTE*)"\x83\xEC\x68\x53\x55\x56\x57\x68\x00\x00\x00\x00\xE8","xxxxxxxx????x");
g_dwCL_ParseSound_Call = gMemoryTools.dwFindPattern( g_dwHW_Base,g_dwHW_Len,(BYTE*)"\x50\x57\xE8\x00\x00\x00\x00\x83\xC4\x20\x5F\x5E\x5D\x5B\x83\xC4\x68\xC3","xxx????xxxxxxxxxxx");
g_dwCL_ParseSound_End = gMemoryTools.dwFindPattern( g_dwHW_Base,g_dwHW_Len,(BYTE*)"\x50\x57\x68\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x83\xC4\x0C\x5F\x5E\x5D\x5B\x83\xC4\x68\xC3","xxx????x????xxxxxxxxxxx");
g_dwSvc_Table = gMemoryTools.dwFindPattern( g_dwHW_Base,g_dwHW_Len,(BYTE*)"\x51\x53\x56\x57\x68\xFF\xFF\xFF\xFF\x33\xDB\xE8\xFF\xFF\xFF\xFF\x83\xC4\x04\x33\xF6\xBF","xxxxx????xxx????xxxxxx");
//correct vals
g_dwSvc_Table += 0x15;
g_dwCL_ParseSound_End += 0x16;
g_dwCL_ParseSound_Call += 2;
g_dwCL_ParseSound_Call -= g_dwCL_ParseSound_Begin;
//set locations
pSvcDispatch = (svc_entry_s*)(*(DWORD*)(g_dwSvc_Table + 1 ) - 4 );
pSound = (sound_t)dwHook_SvcEntry( g_dwCL_ParseSound_Begin ,g_dwCL_ParseSound_End , g_dwCL_ParseSound_Call , (DWORD)S_StartDynamicSound, 6 );
}
//==============================================================================
#ifndef _SOUNDHOOK_H_
#define _SOUNDHOOK_H_
#include "Include.h"
//==============================================================================
void S_StartDynamicSound( int entnum, int entchannel, char* sample, float* origin, float volume, float attenuation, int timeofs , int pitch );
void SetupSoundHook( void );
typedef void (*sound_t)(int,int,char*,float*,float,float,int,int);
//==============================================================================
typedef struct svc_entry_s
{
DWORD dwId; // +0 - id :) should be unique
char *szName; // +4 - pointer to the name string
DWORD pfnHandler; // +C - the parser itself
};
//==============================================================================
#endif
Call SetupSoundHook in your Init, sound code goes in S_StartDyanmicSound ( Pre original call ).