diff --git a/gamedata/core.games/engine.mcv.txt b/gamedata/core.games/engine.mcv.txt index 10254d9e9d..b98cab06c6 100644 --- a/gamedata/core.games/engine.mcv.txt +++ b/gamedata/core.games/engine.mcv.txt @@ -1,45 +1,61 @@ -/** - * Do not edit this file. Any changes will be overwritten by the gamedata - * updater or by upgrading your SourceMod install. - * - * To override data in this file, create a subdirectory named "custom" and - * place your own gamedata file(s) inside of it. Such files will be parsed - * after SM's own. - * - * For more information, see http://wiki.alliedmods.net/Gamedata_Updating_(SourceMod) - */ - "Games" { - /* CGlobalEntityList */ - "#default" - { - "#supported" - { - "engine" "mcv" - } - - "Offsets" - { - /* Offset into LevelShutdown */ - "gEntList" - { - "windows" "33" - } + /* CGlobalEntityList */ + /* Windows - get gEntList from offset into CServerGameDLL::LevelShutdown and then get EntInfo offset from gamedata */ + /* Linux - get gEntList directly from exported symbol and then get the EntInfo offset from gamedata */ - "EntInfo" + "#default" + { + "Addresses" + { + "EntInfosPtr" { - "windows" "4" + "windows64" + { + "signature" "EntInfosFinder" + "read" "19" + } } } "Signatures" - { - "LevelShutdown" + { + /* gEntList symbol */ + "gEntList" + { + "library" "server" + "linux64" "@gEntList" + } + + "LevelShutdown" + { + "library" "server" + "windows64" "\xE8\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x48\x8D\x0D\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\xE8" + } + + // Found from FindEntityByClassname. + "EntInfosFinder" { "library" "server" - "windows" "\x56\x8B\x35\x2A\x2A\x2A\x2A\x8B\xCE\x8B\x06\xFF\x90\x84\x00\x00\x00\xE8\x2A\x2A\x2A\x2A\xE8" + // EB 18 0F B7 C1 48 8D 1C 40 48 03 DB 48 8B 5C DF 20 EB 07 48 8B + "windows64" "\xEB\x18\x0F\xB7\xC1\x48\x8D\x1C\x40\x48\x03\xDB\x2A\x2A\x2A\x2A\x2A\xEB\x07\x48\x8B" } - } - } + } + + "Offsets" + { + /* Offset into LevelShutdown of gEntList */ + "gEntList" + { + "windows64" "13" + } + + /* gEntList->m_EntPtrArray[] offset */ + "EntInfo" + { + "linux64" "8" + "windows64" "8" + } + } + } } diff --git a/gamedata/sdkhooks.games/engine.mcv.txt b/gamedata/sdkhooks.games/engine.mcv.txt index 334bd5c49c..0e66112c90 100644 --- a/gamedata/sdkhooks.games/engine.mcv.txt +++ b/gamedata/sdkhooks.games/engine.mcv.txt @@ -1,112 +1,187 @@ "Games" { - "#default" - { - "Offsets" + "#default" + { + "Offsets" + { + // "[L0/W0] L107 W108 CBaseEntity::Blocked(CBaseEntity*)", + "Blocked" + { + "linux64" "107" + "windows64" "108" + } + // "[L0/W0] L105 W106 CBaseEntity::EndTouch(CBaseEntity*)", + "EndTouch" + { + "linux64" "105" + "windows64" "106" + } + // "[L0/W0] L119 W120 CBaseEntity::FireBullets(FireBulletsInfo_t const&)", + "FireBullets" + { + "linux64" "119" + "windows64" "120" + } + // "[L0/W0] L123 W124 CBaseEntity::GetMaxHealth(void)", + "GetMaxHealth" + { + "linux64" "123" + "windows64" "124" + } + // "[L0/W0] L69 W70 CBaseEntity::OnTakeDamage(CTakeDamageInfo const&)", + "OnTakeDamage" + { + "linux64" "69" + "windows64" "70" + } + "[L0/W0] L307 W306 CBasePlayer::OnTakeDamage_Alive(CTakeDamageInfo const&)", + "OnTakeDamage_Alive" + { + "linux64" "307" + "windows64" "306" + } + // "[L0/W0] L376 W375 CBasePlayer::PreThink(void)", + "PreThink" + { + "linux64" "376" + "windows64" "375" + } + // "[L0/W0] L377 W376 CBasePlayer::PostThink(void)", + "PostThink" + { + "linux64" "377" + "windows64" "376" + } + // CBaseCombatWeapon::FinishReload ????? + // "[L0/W0] L294 W296 CBaseCombatWeapon::FinishReload(void)", + "Reload" + { + "linux64" "294" + "windows64" "296" + } + // "[L0/W0] L24 W24 CBaseEntity::SetTransmit(CCheckTransmitInfo *,bool)", + "SetTransmit" + { + "linux64" "24" + "windows64" "24" + } + // "[L0/W0] L19 W19 CBaseEntity::ShouldCollide(int,int)", + "ShouldCollide" + { + "linux64" "19" + "windows64" "19" + } + // "[L0/W0] L32 W27 CBaseEntity::Spawn(void)", + // "[L0/W0] L26 W26 CBaseCombatCharacter::Spawn(void)", + "Spawn" + { + "linux64" "26" + "windows64" "26" + } + // "[L0/W0] L103 W104 CBaseEntity::StartTouch(CBaseEntity*)", + "StartTouch" + { + "linux64" "103" + "windows64" "104" + } + // "[L0/W0] L53 W55 CBaseEntity::Think(void)", + "Think" + { + "linux64" "53" + "windows64" "55" + } + // "[L0/W0] L104 W105 CBaseEntity::Touch(CBaseEntity*)", + "Touch" + { + "linux64" "104" + "windows64" "105" + } + // "[L0/W0] L67 W68 CBaseEntity::TraceAttack(CTakeDamageInfo const&,Vector const&,CGameTrace *)", + "TraceAttack" + { + "linux64" "67" + "windows64" "68" + } + // "[L0/W0] L102 W103 CBaseEntity::Use(CBaseEntity*,CBaseEntity*,USE_TYPE,float)", + "Use" + { + "linux64" "102" + "windows64" "103" + } + // "[L0/W0] L158 W157 CBaseEntity::VPhysicsUpdate(IPhysicsObject *)", + "VPhysicsUpdate" + { + "linux64" "158" + "windows64" "157" + } + // "[L0/W0] L299 W298 CBaseCombatCharacter::Weapon_CanSwitchTo(CBaseCombatWeapon *)", + "Weapon_CanSwitchTo" + { + "linux64" "299" + "windows64" "298" + } + // "[L0/W0] L292 W291 CBaseCombatCharacter::Weapon_CanUse(CBaseCombatWeapon *)", + "Weapon_CanUse" + { + "linux64" "292" + "windows64" "291" + } + // "[L0/W0] L296 W295 CBaseCombatCharacter::Weapon_Drop(CBaseCombatWeapon *,Vector const*,Vector const*)", + "Weapon_Drop" + { + "linux64" "296" + "windows64" "295" + } + // "[L0/W0] L293 W292 CBaseCombatCharacter::Weapon_Equip(CBaseCombatWeapon *)", + "Weapon_Equip" + { + "linux64" "293" + "windows64" "292" + } + // "[L0/W0] L297 W296 CBaseCombatCharacter::Weapon_Switch(CBaseCombatWeapon *,int)", + "Weapon_Switch" + { + "linux64" "297" + "windows64" "296" + } + } + } + + "#default" + { + "Offsets" + { + "EntityListeners" + { + // 49159 + // 98322 + //"windows" "196644" + "windows64" "393272" // wild guess based on Ins2 Win offsets. + //"windows64" "98318" + "linux64" "49159" + } + } + + "Addresses" { - "Blocked" + "EntityListenersPtr" { - "windows" "106" - } - "EndTouch" - { - "windows" "104" - } - "FireBullets" - { - "windows" "118" - } - "GetMaxHealth" - { - "windows" "122" - } - "OnTakeDamage" - { - "windows" "68" - } - "OnTakeDamage_Alive" - { - "windows" "306" - } - "PreThink" - { - "windows" "376" - } - "PostThink" - { - "windows" "377" - } - "Reload" - { - "windows" "295" - } - "SetTransmit" - { - "windows" "23" - } - "ShouldCollide" - { - "windows" "18" - } - "Spawn" - { - "windows" "25" - } - "StartTouch" - { - "windows" "102" - } - "Think" - { - "windows" "52" - } - "Touch" - { - "windows" "103" - } - "TraceAttack" - { - "windows" "66" - } - "Use" - { - "windows" "101" - } - "VPhysicsUpdate" - { - "windows" "157" - } - "Weapon_CanSwitchTo" - { - "windows" "297" - } - "Weapon_CanUse" - { - "windows" "291" - } - "Weapon_Drop" - { - "windows" "294" - } - "Weapon_Equip" - { - "windows" "292" - } - "Weapon_Switch" - { - "windows" "296" + "windows64" + { + "signature" "EntityListenersFinder" + "read" "18" + } } } - } - - "#default" - { - "Offsets" + + "Signatures" { - "EntityListeners" + // CGlobalEntityList::AddListenerEntity has symbols in windows64 binaries + "EntityListenersFinder" { - "windows" "196644" + "library" "server" + "windows64" "\x48\x89\x54\x24\x10\x48\x83\xEC\x28\x4C\x8D\x91\x38\x00\x06\x00" } } - } + } } diff --git a/gamedata/sdktools.games/engine.mcv.txt b/gamedata/sdktools.games/engine.mcv.txt index 081c2b09d5..041a774a21 100644 --- a/gamedata/sdktools.games/engine.mcv.txt +++ b/gamedata/sdktools.games/engine.mcv.txt @@ -1,284 +1,261 @@ -/** - * Do not edit this file. Any changes will be overwritten by the gamedata - * updater or by upgrading your SourceMod install. - * - * To override data in this file, create a subdirectory named "custom" and - * place your own gamedata file(s) inside of it. Such files will be parsed - * after SM's own. - * - * For more information, see http://wiki.alliedmods.net/Gamedata_Updating_(SourceMod) - */ - "Games" { - /* Sounds */ - "#default" - { - "Keys" - { - "SlapSoundCount" "6" - "SlapSound1" "physics/flesh/vietnam_flesh_impact_bullet1.wav" - "SlapSound2" "physics/flesh/vietnam_flesh_impact_bullet2.wav" - "SlapSound3" "physics/flesh/vietnam_flesh_impact_bullet3.wav" - "SlapSound4" "physics/flesh/vietnam_flesh_impact_bullet4.wav" - "SlapSound5" "physics/flesh/vietnam_flesh_impact_bullet5.wav" - "SlapSound6" "physics/flesh/vietnam_flesh_impact_bullet6.wav" - } - } - - /* General Temp Entities */ - "#default" - { - "Offsets" - { - /* Offset into CBaseTempEntity signature address */ - "s_pTempEntities" - { - "windows" "16" - } - "GetTEName" - { - "windows" "4" - } - "GetTENext" - { - "windows" "8" - } - "TE_GetServerClass" - { - "windows" "0" - } - } + "#default" + { + "Keys" + { + "SlapSoundCount" "6" + "SlapSound1" "physics/flesh/vietnam_flesh_impact_bullet1.wav" + "SlapSound2" "physics/flesh/vietnam_flesh_impact_bullet2.wav" + "SlapSound3" "physics/flesh/vietnam_flesh_impact_bullet3.wav" + "SlapSound4" "physics/flesh/vietnam_flesh_impact_bullet4.wav" + "SlapSound5" "physics/flesh/vietnam_flesh_impact_bullet5.wav" + "SlapSound6" "physics/flesh/vietnam_flesh_impact_bullet6.wav" - "Signatures" - { - "CBaseTempEntity" - { - "library" "server" - "windows" "\x55\x8B\xEC\x8B\x45\x08\x89\x41\x04\xC7\x01" - } - } - } - /* CGlobalEntityList */ - "#default" - { - "Signatures" - { - /* Functions in CGlobalEntityList */ - "FindEntityByClassname" - { - "library" "server" - "windows" "\x55\x89\xE5\x57\x56\x53\x83\xEC\x1C\x8B\x45\x0C\x8B\x5D\x08\x8B\x7D\x10\x85\xC0\x0F\x84\x2A\x2A\x2A\x2A\x8B\x10\x89\x04\x24\xFF\x52\x0C\x8B\x10\xB8\xFF\x1F\x00\x00\x0F\xB7\xCA\x83\xFA\xFF\x0F\x45\xC1\x8D\x04\x40\x8B\x5C\xC3\x10\xEB\x2A\x90\x2A\x2A\x2A\x2A\x89" - } - } - } + "GameRulesProxy" "CVietnamGameRulesProxy" + "GameRulesDataTable" "vietnam_gamerules" + } - /* General GameRules */ - "#default" - { - "Keys" - { - "GameRulesProxy" "CVietnamGameRulesProxy" - "GameRulesDataTable" "vietnam_gamerules" - } - } + "Signatures" + { + /* This signature sometimes has multiple matches, but this + * does not matter as g_pGameRules is involved in all of them. + * The same g_pGameRules offset applies to each match. + * + * Sometimes this block of bytes is at the beginning of the static + * CreateGameRulesObject function and sometimes it is in the middle + * of an entirely different function. This depends on the game. + */ + "CreateGameRulesObject" + { + "library" "server" + "windows64" "\x48\x89\x5C\x24\x08\x57\x48\x83\xEC\x30\x48\x8B\xF9\x48\x8B\x0D\x2A\x2A\x2A\x2A\x48\x85\xC9" + } + "g_pGameRules" + { + "library" "server" + "linux64" "@g_pGameRules" + } + } + "Signatures" + { + /* CBaseServer object for IServer interface */ + "sv" + { + "library" "engine" + "linux64" "@sv" + } + } - /* IServer interface pointer */ - "#default" - { - "Keys" - { - /* Signature for the beginning of IVEngineServer::CreateFakeClient. - * - * The engine binary is not actually scanned in order to look for - * this. SourceHook is used to used to determine the address of the - * function and this signature is used to verify that it contains - * the expected code. A pointer to sv (IServer interface) is used - * here. - */ - "CreateFakeClient_Windows" "\x55\x8B\xEC\x56\xFF\x75\x08\xB9" - } - - "Offsets" - { - /* Offset into IVEngineServer::CreateFakeClient */ - "sv" - { - "windows" "8" - } - } - - } - - /* EntityFactoryDictionary function */ - "#default" - { - "Signatures" - { - "EntityFactory" - { - "library" "server" - "windows" "\xA1\x2A\x2A\x2A\x2A\xA8\x01\x0F\x85\x2A\x2A\x2A\x2A\x83\xC8\x01" - } - } - } + /* General Temp Entities */ + "Offsets" + { + /* Offset into CBaseTempEntity signature address */ + "s_pTempEntities" + { + "windows64" "16" + } + "GetTEName" + { + "windows64" "4" + } + "GetTENext" + { + "windows64" "8" + } + "TE_GetServerClass" + { + "windows64" "0" + } - /* CBaseEntityOutput::FireOutput */ - "#default" - { - "Signatures" - { - "FireOutput" - { - "library" "server" - "windows" "\x55\x8B\xEC\x81\xEC\x44\x01\x00\x00\x8B\xC1" - } - } - } - - /* CBaseAnimating::LookupAttachment */ - "#default" - { - "Signatures" - { - "LookupAttachment" - { - "library" "server" - "windows" "\x55\x8B\xEC\x56\x8B\xF1\x83\xBE\xF4\x04\x00\x00\x00\x75\x2A\xE8\x2A\x2A\x2A\x2A\x85\xC0\x74\x2A\x8B\xCE\xE8\x2A\x2A\x2A\x2A\x8B\x86\xF4\x04\x00\x00\x5E\x85\xC0\x74\x2A\x83\x38\x00\x74\x2A\xFF\x75\x08\x50\xE8\x2A\x2A\x2A\x2A\x83\xC4\x08\x40" - } - } - } - - /* SetUserInfo data */ - "#default" - { - "Offsets" - { - /** - * CBaseClient::SetUserCVar(char const*,char const*); - * Linux offset straight from VTable dump. - * Windows offset is crazy. Found the windows SetName function using string "(%d)%-.*s" (aD_S in IDA) - * Cross referenced back to the vtable and counted manually (SetUserCvar is 1 higher, offsets start from 1) - */ - "SetUserCvar" - { - /* Not 100% sure on this, why would windows change and not linux - TEST ME */ - "windows" "31" - } - /** - * CBaseClient::SetName(char const*); - * Linux offset straight from VTable dump. - * Has string "(%d)%-0.*s" - */ - "SetClientName" - { - "windows" "30" - } - /** - * Offset into CBaseClient - Used by CBaseServer::UpdateUserSettings to determine when changes have been made. - * Find CBaseClient::UpdateUserSettings (strings "net_maxroutable", "cl_updaterate" etc) and the offset is set to 0 near the end. - * Linux: mov byte ptr [esi+0B0h], 0 - * Win: mov byte ptr [esi+0B0h], 0 - * - * L4D2: This has been moved into CBaseClient::UpdateUserSettings(), rest of the details are still relevant. - */ - "InfoChanged" - { - "windows" "488" - } - } - } - - "#default" - { - "Keys" - { - // Netprop on the team entity for team score - "m_iScore" "m_scoreTotal" - } - "Offsets" - { - "SetOwnerEntity" - { - "windows" "19" - } - "GiveNamedItem" - { - "windows" "461" - } - "RemovePlayerItem" - { - "windows" "304" - } - "Weapon_GetSlot" - { - "windows" "299" - } - "Ignite" - { - "windows" "229" - } - "Extinguish" - { - "windows" "232" - } - "Teleport" - { - "windows" "114" - } - "CommitSuicide" - { - "windows" "511" - } - "GetVelocity" - { - "windows" "140" - } - "EyeAngles" - { - "windows" "131" - } - "AcceptInput" - { - "windows" "41" - } - "SetEntityModel" - { - "windows" "27" - } - "WeaponEquip" - { - "windows" "292" - } - "Activate" - { - "windows" "38" - } - "PlayerRunCmd" - { - "windows" "481" - } - "GiveAmmo" - { - "windows" "285" - } - "GetAttachment" - { - "windows" "223" - } - } - "Signatures" - { - /** - * CNetworkStringTableContainer::WriteBaselines - * "Index error writing string table baseline %s\n" - */ - "WriteBaselines" - { - "library" "engine" - "windows" "\x55\x8B\xEC\x83\xEC\x58\x53\x56\x8B\xF1" - } - } - } + /* Offset into IVEngineServer::CreateFakeClient */ + //"sv" + //{ + // // "windows64" "8" + //} + /** + * CBaseClient::SetUserCVar(char const*,char const*); + * linux64 offset straight from VTable dump. + * windows64 offset is crazy. Found the windows64 SetName function using string "(%d)%-.*s" (aD_S in IDA) + * Cross referenced back to the vtable and counted manually (SetUserCvar is 1 higher, offsets start from 1) + */ + "SetUserCvar" + { + "linux64" "69" + "windows64" "61" + } + /** + * CBaseClient::SetName(char const*); + * linux64 offset straight from VTable dump. + * Has string "(%d)%-0.*s" + */ + "SetClientName" + { + "linux64" "68" + "windows64" "60" + } + /** + * Offset into CBaseClient - Used by CBaseServer::UpdateUserSettings to determine when changes have been made. + * Find CBaseClient::UpdateUserSettings (strings "net_maxroutable", "cl_updaterate" etc) and the offset is set to 0 near the end. + * linux64: mov byte ptr [rbx+258h], 0 + * Win64: mov byte ptr [rsi+278h], 0 + * In this example, offset is 278h = 632 + * MCV: This has been moved into CBaseClient::UpdateUserSettings(), rest of the details are still relevant. + */ + "InfoChanged" + { + "linux64" "600" + "windows64" "632" + } + // "[L0/W0] L20 W20 CBaseEntity::SetOwnerEntity(CBaseEntity*)", + "SetOwnerEntity" + { + "linux64" "20" + "windows64" "20" + } + // "[L0/W0] L462 W462 CVietnam_Player::GiveNamedItem(char const*,int,bool,bool,Vector const*)", + "GiveNamedItem" + { + "linux64" "462" + "windows64" "462" + } + // "[L0/W0] L305 W304 CBaseCombatCharacter::RemovePlayerItem(CBaseCombatWeapon *)", + "RemovePlayerItem" + { + "linux64" "305" + "windows64" "304" + } + // "[L0/W0] L301 W300 CBaseCombatCharacter::Weapon_GetSlot(int)", + "Weapon_GetSlot" + { + "linux64" "301" + "windows64" "300" + } + // "[L0/W0] L230 W229 CBaseAnimating::Ignite(float,bool,float,bool,CBaseEntity *,string_t)", + "Ignite" + { + "linux64" "230" + "windows64" "229" + } + // "[L0/W0] L233 W232 CBaseAnimating::Extinguish()", + "Extinguish" + { + "linux64" "233" + "windows64" "232" + } + // "[L0/W0] L115 W114 CBaseEntity::Teleport(Vector const*,QAngle const*,Vector const*,bool)", + "Teleport" + { + "linux64" "115" + "windows64" "114" + } + // Unsure which of these to use, so let's try the bool bool one first + // "[L0/W0] L511 W512 CBasePlayer::CommitSuicide(bool,bool)", + // "[L0/W0] L512 W511 CBasePlayer::CommitSuicide(Vector const&,bool,bool)", + "CommitSuicide" + { + "linux64" "511" + "windows64" "512" + } + // "[L0/W0] L141 W140 CBaseEntity::GetVelocity(Vector *,Vector *)", + "GetVelocity" + { + "linux64" "140" + "windows64" "140" + } + // "[L0/W0] L132 W131 CBaseEntity::EyeAngles(void)", + "EyeAngles" + { + "linux64" "132" + "windows64" "131" + } + // "[L0/W0] L42 W41 CBaseEntity::AcceptInput(char const*,CBaseEntity*,CBaseEntity*,variant_t,int)", + "AcceptInput" + { + "linux64" "42" + "windows64" "41" + } + // "[L0/W0] L28 W29 CBaseEntity::SetModel(char const*)", + "SetEntityModel" + { + "linux64" "28" + "windows64" "27" + } + // "[L0/W0] L293 W292 CBaseCombatCharacter::Weapon_Equip(CBaseCombatWeapon *)", + "WeaponEquip" + { + "linux64" "293" + "windows64" "292" + } + // "[L0/W0] L39 W41 CBaseEntity::Activate(void)", + "Activate" + { + "linux64" "39" + "windows64" "41" + } + // "[L0/W0] L482 W482 CBasePlayer::PlayerRunCommand(CUserCmd *,IMoveHelper *)", + "PlayerRunCmd" + { + "linux64" "482" + "windows64" "482" + } + // "[L0/W0] L286 W285 CBaseCombatCharacter::GiveAmmo(int,int,bool)", + "GiveAmmo" + { + "linux64" "286" + "windows64" "285" + } + // "[L0/W0] L224 W223 CBaseAnimating::GetAttachment(int,matrix3x4_t &)", + "GetAttachment" + { + "linux64" "224" + "windows64" "223" + } + } + "Signatures" + { + "CBaseTempEntity" + { + "library" "server" + "windows64" "\x48\x8D\x05\x2A\x2A\x2A\x2A\x48\x89\x51\x08\x48\x89\x01\x48\x8B\x05" + "linux64" "@_ZN15CBaseTempEntityC2EPKc" + } + // "NULL entity in global entity list!\n" + "FindEntityByClassname" + { + "library" "server" + "windows64" "\x48\x89\x5C\x24\x08\x48\x89\x74\x24\x10\x57\x48\x83\xEC\x20\x49\x8B\xF0\x48\x8B\xF9\x48\x85\xD2" + "linux64" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc" + } + // const CEntityFactoryDictionary::`vftable' + "EntityFactory" + { + "library" "server" + "windows64" "\x48\x83\xEC\x28\x8B\x2A\x2A\x2A\x82\x00\xA8\x01" + "linux64" "@_ZN24CEntityFactoryDictionary14InstallFactoryEP14IEntityFactoryPKc" + } + "FireOutput" + { + "library" "server" + "windows64" "\x4C\x8B\xDC\x41\x54\x41\x55" + "linux64" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f" + } + // Fuction calls between strings "eyes"(1st xref), "chest"(1st xref), "forward"(3rd xref) - CAI_BaseActor::UpdateHeadControl(CAI_BaseActor *this, const Vector *a2, float a3, float a4) + "LookupAttachment" + { + "library" "server" + "windows64" "\x48\x89\x5C\x24\x08\x57\x48\x83\xEC\x20\x48\x83\xB9\x38\x06\x00\x00\x00\x48\x8B\xFA\x48\x8B\xD9\x75\x2A\xE8\x2A\x2A\x2A\x2A\x48\x85\xC0\x74\x2A\x48\x8B\xCB\xE8\x2A\x2A\x2A\x2A\x48\x8B\x8B\x38\x06\x00\x00\x48\x85\xC9\x74\x2A\x48\x83\x39\x00\x74\x2A\x48\x8B\xD7\xE8\x2A\x2A\x2A\x2A" + "linux64" "@_ZN14CBaseAnimating16LookupAttachmentEPKc" + } + // "Index error writing string table baseline" + "WriteBaselines" + { + "library" "engine" + // This signature seems to be right, but causes server hangs when player joining it. + //"windows64" "\x4C\x8B\xDC\x53\x41\x55\x48\x81\xEC\xF8\x00\x00\x00" + "linux64" "@_ZN28CNetworkStringTableContainer14WriteBaselinesEPKcR8bf_writei" + } + } + } }