Code:
// Visit http://forum.gamedeception.net/
#include <ida.idc>
#include <Wow/Util_WoWVersion.idc>
static ExtractPath( sPath )
{
auto dwIndex;
for( dwIndex = strlen( sPath ); strstr( substr( sPath, dwIndex, -1 ), "\\" ); dwIndex-- );
return substr( sPath, 0, dwIndex + 1 );
}
static DumpField( szName, szPrefix, dwPointer, dwIndexOffset, hFile )
{
auto dwEnumId, dwFieldCount;
dwEnumId = AddEnum( -1, szName, 0x1100000 );
fprintf( hFile, "// Descriptors: 0x%08X\nenum %s\n{\n", dwPointer, szName );
while( 1 )
{
auto pszName, dwIndex;
pszName = GetString( Dword( dwPointer ), -1, ASCSTR_C );
if( pszName == "" )
break;
if( ( strstr( szPrefix, "GAMEOBJECT" ) != -1 && strstr( pszName, "OBJECT_FIELD" ) != -1 ) || strstr( pszName, szPrefix ) == 0 )
{
dwIndex = Dword( dwPointer + 4 ) + dwIndexOffset;
fprintf( hFile, "\t%s = 0x%X,\n", pszName, dwIndex * 4 );
dwFieldCount = dwFieldCount + 1;
}
dwPointer = dwPointer + 0x14;
}
fprintf( hFile, "\tTOTAL_%s_FIELDS = 0x%X\n", szPrefix, dwFieldCount );
fprintf( hFile, "};\n" );
return dwIndex;
}
static main()
{
auto sPath, hFile, dwStartFunc, dwFuncPtrCheck, s_objectDescriptors, s_unitDescriptors, s_itemDescriptors, s_playerDescriptors, s_containerDescriptors, s_gameobjectDescriptors, s_dynamicobjectDescriptors, s_corpseDescriptors;
auto DescriptorsSize;
sPath = ExtractPath( GetIdbPath() ) + "Objects_Enum.h";
hFile = fopen( sPath, "w" );
DescriptorsSize = 0;
if( hFile != -1 )
{
fprintf( hFile, "#ifndef __OBJECTS_ENUM_H__\n#define __OBJECTS_ENUM_H__\n" );
fprintf( hFile, "// %s\n", GetWoWVersionString() );
fprintf( hFile, "/*----------------------------------\n" );
fprintf( hFile, "WoW Offset Dumper 0.1 - IDC Script\n" );
fprintf( hFile, "by kynox, updated by namreeb\n\n" );
fprintf( hFile, "Credits:\n" );
fprintf( hFile, "bobbysing, Patrick, Dominik, Azorbix\n" );
fprintf( hFile, "-----------------------------------*/\n\n" );
dwStartFunc = FindBinary( INF_BASEADDR, SEARCH_DOWN, "56 57 68 ? ? ? ? B8 05" );
Message( "dwStartFunc: 0x%08X\n", dwStartFunc );
s_objectDescriptors = Dword( dwStartFunc + 0xD );
s_itemDescriptors = Dword( dwStartFunc + 0x32 );
s_containerDescriptors = Dword( dwStartFunc + 0x57 );
s_unitDescriptors = Dword( dwStartFunc + 0x7C );
s_playerDescriptors = Dword( dwStartFunc + 0xA1 );
s_gameobjectDescriptors = Dword( dwStartFunc + 0xC6 );
s_dynamicobjectDescriptors = Dword( dwStartFunc + 0xEB );
s_corpseDescriptors = Dword( dwStartFunc + 0x110 );
MakeName( s_objectDescriptors, "s_objectDescriptors" );
MakeName( s_unitDescriptors, "s_unitDescriptors" );
MakeName( s_itemDescriptors, "s_itemDescriptors" );
MakeName( s_playerDescriptors, "s_playerDescriptors" );
MakeName( s_containerDescriptors, "s_containerDescriptors" );
MakeName( s_gameobjectDescriptors, "s_gameobjectDescriptors" );
MakeName( s_dynamicobjectDescriptors, "s_dynamicobjectDescriptors" );
MakeName( s_corpseDescriptors, "s_corpseDescriptors" );
DescriptorsSize = DumpField( "eObjectFields", "OBJECT", s_objectDescriptors, 0, hFile ) + 1;
DumpField( "eItemFields", "ITEM", s_itemDescriptors, DescriptorsSize, hFile );
DumpField( "eContainerFields", "CONTAINER", s_containerDescriptors, DescriptorsSize, hFile );
DumpField( "eGameObjectFields", "GAMEOBJECT", s_gameobjectDescriptors, DescriptorsSize, hFile );
DumpField( "eDynamicObjectFields", "DYNAMICOBJECT", s_dynamicobjectDescriptors, DescriptorsSize, hFile );
DumpField( "eCorpseFields", "CORPSE", s_corpseDescriptors, DescriptorsSize, hFile );
DescriptorsSize = DumpField( "eUnitFields", "UNIT", s_unitDescriptors, DescriptorsSize, hFile ) + 1;
DumpField( "ePlayerFields", "PLAYER", s_playerDescriptors, DescriptorsSize, hFile );
fprintf( hFile, "#endif //__OBJECTS_ENUM_H__\n" );
fclose( hFile );
}
else
Message( "Failed to open file %s.\n", sPath );
Message( "Successfully dumped %s.\n", sPath );
}