"Games" { "tf" { "Functions" { "IServerPluginCallbacks::OnEdictAllocated" { "offset" "IServerPluginCallbacks::OnEdictAllocated" "hooktype" "raw" "return" "void" "this" "ignore" "arguments" { "edict" { "type" "edict" } } } "IServerPluginCallbacks::OnEdictFreed" { "offset" "IServerPluginCallbacks::OnEdictFreed" "hooktype" "raw" "return" "void" "this" "ignore" "arguments" { "edict" { "type" "edict" } } } "ED_Alloc" { "signature" "ED_Alloc" "hooktype" "raw" "return" "void" "this" "ignore" "arguments" { "forcedIdx" { "type" "int" } } } "CTFPlayer::UpdateExpression" { "signature" "CTFPlayer::UpdateExpression" "hooktype" "raw" "callconv" "thiscall" "return" "void" "this" "ignore" } "CTFPlayer::SpeakWeaponFire" { "signature" "CTFPlayer::SpeakWeaponFire" "hooktype" "raw" "callconv" "thiscall" "return" "void" "this" "ignore" "arguments" { "concept" { "type" "int" } } } "CTFPlayer::CreateFeignDeathRagdoll" { "signature" "CTFPlayer::CreateFeignDeathRagdoll" "hooktype" "raw" "callconv" "thiscall" "return" "void" "this" "ignore" "arguments" { "info" { "type" "int" } "bGib" { "type" "int" } "bBurning" { "type" "int" } "bDisguised" { "type" "int" } } } } "Offsets" { "IServerPluginCallbacks::OnEdictAllocated" { "windows" "16" "linux" "16" } "IServerPluginCallbacks::OnEdictFreed" { "windows" "17" "linux" "17" } "WindowsOrLinux" { "windows" "1" "linux" "0" } } "Addresses" { "sv" { "windows" { "signature" "sv" "read" "10" } } } "Signatures" { "CreateInterface" { "library" "engine" "windows" "@CreateInterface" "linux" "@CreateInterface" } "CEntityFactoryDictionary::Create" { "library" "server" "windows" "\x55\x8B\xEC\x8B\x01\x56\x8B\x75\x08\x56\xFF\x50\x0C" "linux" "@_ZN24CEntityFactoryDictionary6CreateEPKc" } "ED_Alloc" { "library" "engine" // ED_Alloc( %d ) - invalid edict index specified. "windows" "\x55\x8B\xEC\x83\xEC\x10\x56\x8B\x75\x08\x57\x85\xF6" "linux" "@_Z8ED_Alloci" } // for getting sv.num_edicts etc "sv" { "library" "engine" "linux" "@sv" "windows" "\x83\x3D\x2A\x2A\x2A\x2A\x02\x7C\x2A\xB9\x2A\x2A\x2A\x2A" } // blocking facial flexes "CTFPlayer::SpeakWeaponFire" { "library" "server" "windows" "\x55\x8B\xEC\x8B\x15\x2A\x2A\x2A\x2A\x81\xEC\x04\x01\x00\x00" "linux" "@_ZN9CTFPlayer15SpeakWeaponFireEi" } // blocking facial flexes "CTFPlayer::UpdateExpression" { "library" "server" "linux" "@_ZN9CTFPlayer16UpdateExpressionEv" } "CTFPlayer::TFPlayerThink" { // UpdateExpression is inlined as of 8826692 "library" "server" "windows" "\x53\x8B\xDC\x83\xEC\x08\x83\xE4\xF0\x83\xC4\x04\x55\x8B\x6B\x04\x89\x6C\x24\x04\x8B\xEC\x81\xEC\x78\x02\x00\x00\x56\x57\x8B\xF9\x8B\x8F\xB0\x22\x00\x00" } "CTFPlayer::CreateFeignDeathRagdoll" { "library" "server" "windows" "\x55\x8B\xEC\x83\xEC\x40\x53\x56\x57\x8B\xF9\x8B\x8F\x24\x24\x00\x00" "linux" "@_ZN9CTFPlayer23CreateFeignDeathRagdollERK15CTakeDamageInfobbb" } } "MemPatches" { "ED_Alloc::nop" { "signature" "ED_Alloc" "linux" { // always try to alloc a new ent, regardless of FreeTime "offset" "1D6h" "verify" "\x77\x78" "patch" "\x90\x90\x90\x90\x90\x90" } "windows" { "offset" "1D2h" // ja "verify" "\x77\x25" // unconditional jmp "patch" "\xEB\x25" "preserve" "\x00\xFF" } } "CTFPlayer::TFPlayerThink::InlinedExpressionUpdateSkip" { "windows" { "signature" "CTFPlayer::TFPlayerThink" "offset" "A40h" "verify" "\x50\x6A\x02\x8B\xCF" // fix the stack (pop previously pushed 104h to ecx) then patch JMP to end of expression update (InlinedExpressionUpdateEnd-(InlinedExpressionUpdateSkip+6)) "patch" "\x59\xE9\x00\x00\x00\x00" } } "CTFPlayer::TFPlayerThink::InlinedExpressionUpdateEnd" { "windows" { // location after the inlined call to UpdateExpression // we only use this for getting the patch address and performing validation; it's not applied "signature" "CTFPlayer::TFPlayerThink" "offset" "BA9h" "verify" "\x6A\x07\x8D" "patch" "\x00" } } } } }