diff --git a/core/GameConfigs.cpp b/core/GameConfigs.cpp index 0897f49a..0478d082 100644 --- a/core/GameConfigs.cpp +++ b/core/GameConfigs.cpp @@ -90,9 +90,37 @@ struct TempSigInfo unsigned int s_ServerBinCRC; bool s_ServerBinCRC_Ok = false; +static bool DoesGameMatch(const char *value) +{ + if (strcmp(value, g_Game) == 0 || + strcmp(value, g_GameDesc) == 0 || + strcmp(value, g_GameName) == 0) + { + return true; + } + return false; +} + +static bool DoesEngineMatch(const char *value) +{ +#if SOURCE_ENGINE == SE_EPISODEONE + if (strcmp(value, "original") == 0) +#elif SOURCE_ENGINE == SE_ORANGEBOX + if (strcmp(value, "orangebox") == 0) +#elif SOURCE_ENGINE == SE_LEFT4DEAD + if (strcmp(value, "left4dead") == 0) +#else +#error "Unknown engine type" +#endif + { + return true; + } + return false; +} + CGameConfig::CGameConfig(const char *file) { - m_pFile = sm_strdup(file); + strncopy(m_File, file, sizeof(m_File)); m_pOffsets = sm_trie_create(); m_pProps = sm_trie_create(); m_pKeys = sm_trie_create(); @@ -110,7 +138,6 @@ CGameConfig::~CGameConfig() sm_trie_destroy(m_pProps); sm_trie_destroy(m_pKeys); sm_trie_destroy(m_pSigs); - delete [] m_pFile; delete m_pStrings; } @@ -136,11 +163,9 @@ SMCResult CGameConfig::ReadSMC_NewSection(const SMCStates *states, const char *n } case PSTATE_GAMES: { - if ((strcmp(name, "*") == 0) - || (strcmp(name, "#default") == 0) - || (strcasecmp(name, g_Game) == 0) - || (strcasecmp(name, g_GameDesc) == 0) - || (strcasecmp(name, g_GameName) == 0)) + if (strcmp(name, "*") == 0 || + strcmp(name, "#default") == 0 || + DoesGameMatch(name)) { bShouldBeReadingDefault = true; m_ParseState = PSTATE_GAMEDEFS; @@ -160,12 +185,15 @@ SMCResult CGameConfig::ReadSMC_NewSection(const SMCStates *states, const char *n { m_ParseState = PSTATE_GAMEDEFS_KEYS; } - else if ((strcmp(name, "#supported") == 0) - && (strcmp(m_Game, "#default") == 0)) + else if ((strcmp(name, "#supported") == 0) && (strcmp(m_Game, "#default") == 0)) { m_ParseState = PSTATE_GAMEDEFS_SUPPORTED; /* Ignore this section unless we get a game. */ bShouldBeReadingDefault = false; + had_game = false; + matched_game = false; + had_engine = false; + matched_engine = false; } else if (strcmp(name, "Signatures") == 0) { @@ -244,7 +272,7 @@ SMCResult CGameConfig::ReadSMC_NewSection(const SMCStates *states, const char *n if (error[0] != '\0') { m_IgnoreLevel = 1; - g_Logger.LogError("[SM] Error while parsing CRC section for \"%s\" (%s):", m_Game, m_pFile); + g_Logger.LogError("[SM] Error while parsing CRC section for \"%s\" (%s):", m_Game, m_CurFile); g_Logger.LogError("[SM] %s", error); } else { m_ParseState = PSTATE_GAMEDEFS_CRC_BINARY; @@ -297,13 +325,29 @@ SMCResult CGameConfig::ReadSMC_KeyValue(const SMCStates *states, const char *key int id = m_pStrings->AddString(value); sm_trie_replace(m_pKeys, key, (void *)id); } else if (m_ParseState == PSTATE_GAMEDEFS_SUPPORTED) { - if (strcmp(key, "game") == 0 - && (strcasecmp(value, g_Game) == 0 - || strcasecmp(value, g_GameDesc) == 0 - || strcasecmp(value, g_GameName) == 0) - ) + if (strcmp(key, "game") == 0) { - bShouldBeReadingDefault = true; + had_game = true; + if (DoesGameMatch(value)) + { + matched_game = true; + } + if ((!had_engine && matched_game) || (matched_engine && matched_game)) + { + bShouldBeReadingDefault = true; + } + } + else if (strcmp(key, "engine") == 0) + { + had_engine = true; + if (DoesEngineMatch(value)) + { + matched_engine = true; + } + if ((!had_game && matched_engine) || (matched_game && matched_engine)) + { + bShouldBeReadingDefault = true; + } } } else if (m_ParseState == PSTATE_GAMEDEFS_SIGNATURES_SIG) { if (strcmp(key, PLATFORM_NAME) == 0) @@ -390,7 +434,7 @@ SMCResult CGameConfig::ReadSMC_LeavingSection(const SMCStates *states) g_Logger.LogError("[SM] Unable to find property %s.%s (file \"%s\") (mod \"%s\")", m_Class, m_Prop, - m_pFile, + m_CurFile, m_Game); } } @@ -440,7 +484,7 @@ SMCResult CGameConfig::ReadSMC_LeavingSection(const SMCStates *states) { g_Logger.LogError("[SM] Unrecognized library \"%s\" (gameconf \"%s\")", s_TempSig.library, - m_pFile); + m_CurFile); } else { #if defined PLATFORM_LINUX if (s_TempSig.sig[0] == '@') @@ -457,12 +501,12 @@ SMCResult CGameConfig::ReadSMC_LeavingSection(const SMCStates *states) } else { g_Logger.LogError("[SM] Unable to load library \"%s\" (gameconf \"%s\")", s_TempSig.library, - m_pFile); + m_File); } } else { g_Logger.LogError("[SM] Unable to find library \"%s\" in memory (gameconf \"%s\")", s_TempSig.library, - m_pFile); + m_File); } } if (final_addr) @@ -526,37 +570,206 @@ skip_find: return SMCResult_Continue; } -bool CGameConfig::Reparse(char *error, size_t maxlength) -{ - SMCError err; - SMCStates state = {0, 0}; +#define MSTATE_NONE 0 +#define MSTATE_MAIN 1 +#define MSTATE_FILE 2 - char path[PLATFORM_MAX_PATH]; - g_SourceMod.BuildPath(Path_SM, path, sizeof(path), "gamedata/%s.txt", m_pFile); - /* Backwards compatibility */ - if (!g_LibSys.PathExists(path)) +class MasterReader : public ITextListener_SMC +{ +public: + virtual void ReadSMC_ParseStart() { - g_SourceMod.BuildPath(Path_SM, path, sizeof(path), "configs/gamedata/%s.txt", m_pFile); + state = MSTATE_NONE; + ignoreLevel = 0; } - /* Initialize parse states */ - m_IgnoreLevel = 0; - bShouldBeReadingDefault = true; - m_ParseState = PSTATE_NONE; + virtual SMCResult ReadSMC_NewSection(const SMCStates *states, const char *name) + { + if (ignoreLevel) + { + return SMCResult_Continue; + } + + if (state == MSTATE_NONE) + { + if (strcmp(name, "Game Master") == 0) + { + state = MSTATE_MAIN; + } + else + { + ignoreLevel++; + } + } + else if (state == MSTATE_MAIN) + { + strncopy(cur_file, name, sizeof(cur_file)); + had_engine = false; + matched_engine = false; + had_game = false; + matched_game = false; + state = MSTATE_FILE; + } + else if (state == MSTATE_FILE) + { + ignoreLevel++; + } + + return SMCResult_Continue; + } + + virtual SMCResult ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value) + { + if (ignoreLevel || state != MSTATE_FILE) + { + return SMCResult_Continue; + } + + if (strcmp(key, "engine") == 0) + { + had_engine = true; + if (DoesEngineMatch(value)) + { + matched_engine = true; + } + } + else if (strcmp(key, "game") == 0) + { + had_game = true; + if (DoesGameMatch(value)) + { + matched_game = true; + } + } + + return SMCResult_Continue; + } + + virtual SMCResult ReadSMC_LeavingSection(const SMCStates *states) + { + if (ignoreLevel) + { + ignoreLevel--; + return SMCResult_Continue; + } + + if (state == MSTATE_FILE) + { + /* The four success conditions: + * 1. Needed nothing. + * 2. Needed game only. + * 3. Needed engine only. + * 4. Needed both engine and game. + * Final result is minimized via k-map. + */ +#if 0 + if ((!had_engine && !had_game) || + (!had_engine && (had_game && matched_game)) || + (!had_game && (had_engine && matched_engine)) || + ((had_game && had_engine) && (matched_game && matched_engine))) +#endif + if ((!had_engine && !had_game) || + (!had_engine && matched_game) || + (!had_game && matched_engine) || + (matched_engine && matched_game)) + { + fileList->push_back(cur_file); + } + state = MSTATE_MAIN; + } + else if (state == MSTATE_MAIN) + { + state = MSTATE_NONE; + } + + return SMCResult_Continue; + } +public: + List *fileList; + unsigned int state; + unsigned int ignoreLevel; + char cur_file[PLATFORM_MAX_PATH]; + bool had_engine; + bool matched_engine; + bool had_game; + bool matched_game; +}; + +static MasterReader master_reader; + +bool CGameConfig::Reparse(char *error, size_t maxlength) +{ /* Reset cached data */ m_pStrings->Reset(); sm_trie_clear(m_pOffsets); sm_trie_clear(m_pProps); sm_trie_clear(m_pKeys); - if ((err=textparsers->ParseSMCFile(path, this, &state, error, maxlength)) + char path[PLATFORM_MAX_PATH]; + + /* See if we can use the extended gamedata format. */ + g_SourceMod.BuildPath(Path_SM, path, sizeof(path), "gamedata/%s/master.games.txt", m_File); + if (!g_LibSys.PathExists(path)) + { + /* Nope, use the old mechanism. */ + UTIL_Format(path, sizeof(path), "%s.txt", m_File); + return EnterFile(path, error, maxlength); + } + + /* Otherwise, it's time to parse the master. */ + SMCError err; + SMCStates state = {0, 0}; + List fileList; + master_reader.fileList = &fileList; + + err = textparsers->ParseSMCFile(path, &master_reader, &state, error, maxlength); + if (err != SMCError_Okay) + { + const char *msg = textparsers->GetSMCErrorString(err); + + g_Logger.LogError("[SM] Error parsing master gameconf file \"%s\":", path); + g_Logger.LogError("[SM] Error %d on line %d, col %d: %s", + err, + state.line, + state.col, + msg ? msg : "Unknown error"); + return false; + } + + /* Go through each file we found and parse it. */ + List::iterator iter; + for (iter = fileList.begin(); iter != fileList.end(); iter++) + { + UTIL_Format(path, sizeof(path), "%s/%s", m_File, (*iter).c_str()); + if (!EnterFile(path, error, maxlength)) + { + return false; + } + } + + return true; +} + +bool CGameConfig::EnterFile(const char *file, char *error, size_t maxlength) +{ + SMCError err; + SMCStates state = {0, 0}; + + g_SourceMod.BuildPath(Path_SM, m_CurFile, sizeof(m_CurFile), "gamedata/%s", file); + + /* Initialize parse states */ + m_IgnoreLevel = 0; + bShouldBeReadingDefault = true; + m_ParseState = PSTATE_NONE; + + if ((err=textparsers->ParseSMCFile(m_CurFile, this, &state, error, maxlength)) != SMCError_Okay) { const char *msg; msg = textparsers->GetSMCErrorString(err); - g_Logger.LogError("[SM] Error parsing gameconfig file \"%s\":", path); + g_Logger.LogError("[SM] Error parsing gameconfig file \"%s\":", m_CurFile); g_Logger.LogError("[SM] Error %d on line %d, col %d: %s", err, state.line, @@ -722,7 +935,7 @@ void GameConfigManager::CloseGameConfigFile(IGameConfig *cfg) if (pConfig->DecRefCount() == 0) { - sm_trie_delete(m_pLookup, pConfig->m_pFile); + sm_trie_delete(m_pLookup, pConfig->m_File); delete pConfig; } } diff --git a/core/GameConfigs.h b/core/GameConfigs.h index c3a27953..f49a8f17 100644 --- a/core/GameConfigs.h +++ b/core/GameConfigs.h @@ -55,6 +55,7 @@ public: ~CGameConfig(); public: bool Reparse(char *error, size_t maxlength); + bool EnterFile(const char *file, char *error, size_t maxlength); public: //ITextListener_SMC SMCResult ReadSMC_NewSection(const SMCStates *states, const char *name); SMCResult ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value); @@ -69,7 +70,8 @@ public: unsigned int DecRefCount(); private: BaseStringTable *m_pStrings; - char *m_pFile; + char m_File[PLATFORM_MAX_PATH]; + char m_CurFile[PLATFORM_MAX_PATH]; Trie *m_pOffsets; Trie *m_pProps; Trie *m_pKeys; @@ -83,6 +85,10 @@ private: char m_offset[64]; char m_Game[256]; bool bShouldBeReadingDefault; + bool had_game; + bool matched_game; + bool had_engine; + bool matched_engine; /* Custom Sections */ unsigned int m_CustomLevel; diff --git a/gamedata/core.games.txt b/gamedata/core.games.txt deleted file mode 100644 index b7a48fd4..00000000 --- a/gamedata/core.games.txt +++ /dev/null @@ -1,180 +0,0 @@ -"Games" -{ - "#default" - { - "Offsets" - { - "GetDataDescMap" - { - "windows" "13" - "linux" "14" - } - - "m_lifeState" - { - "class" "CBasePlayer" - "prop" "m_lifeState" - } - } - } - - "dod" - { - "Keys" - { - "RadioMenuTimeout" "4" - } - "Offsets" - { - "GetDataDescMap" - { - "windows" "11" - "linux" "12" - } - } - } - - "ship" - { - "Offsets" - { - "GetDataDescMap" - { - "windows" "18" - "linux" "19" - } - } - } - - "tf" - { - "Offsets" - { - "GetDataDescMap" - { - "windows" "11" - "linux" "12" - } - } - } - - "ageofchivalry" - { - "Keys" - { - "RadioMenuTimeout" "4" - } - - "Offsets" - { - "GetDataDescMap" - { - "windows" "11" - "linux" "12" - } - } - } - - "left4dead" - { - "Offsets" - { - "GetDataDescMap" - { - "windows" "11" - "linux" "12" - } - } - } - - /** - * Which games support ShowMenu? - */ - "#default" - { - "#supported" - { - "game" "cstrike" - "game" "dod" - "game" "sourceforts" - "game" "insurgency" - "game" "Insurgency" - "game" "tf" - "game" "pvkii" - "game" "diprip" - "game" "synergy" - "game" "FortressForever" - "game" "left4dead" - "game" "ageofchivalry" - "game" "obsidian" - } - - "Keys" - { - "HudRadioMenuMsg" "ShowMenu" - } - } - - /** - * Which games support HudMsg? - */ - "#default" - { - "#supported" - { - "game" "hl2mp" - "game" "sourceforts" - "game" "tf" - "game" "ageofchivalry" - "game" "obsidian" - } - - "Keys" - { - "HudTextMsg" "HudMsg" - } - } - - /** - * Which games use an extra byte in the HintText - * message? Even though it's in the SDK, apparently - * only CS:S does this right now. - */ - "#default" - { - "#supported" - { - "game" "cstrike" - } - - "Keys" - { - "HintTextPreByte" "yes" - } - } - - "cstrike" - { - "Keys" - { - "GameExtension" "game.cstrike" - } - } - - "tf" - { - "Keys" - { - "GameExtension" "game.tf2" - "RadioMenuTimeout" "4" - } - } - - "synergy" - { - "Keys" - { - "RadioMenuTimeout" "4" - } - } -} diff --git a/gamedata/core.games/common.games.txt b/gamedata/core.games/common.games.txt new file mode 100644 index 00000000..7c3eb034 --- /dev/null +++ b/gamedata/core.games/common.games.txt @@ -0,0 +1,143 @@ +"Games" +{ + "#default" + { + "Offsets" + { + "m_lifeState" + { + "class" "CBasePlayer" + "prop" "m_lifeState" + } + } + } + + /* Original engine specifics */ + "#default" + { + "#supported" + { + "engine" "original" + } + + "Offsets" + { + "GetDataDescMap" + { + "windows" "13" + "linux" "14" + } + } + } + + /* OB/L4D engine specifics */ + "#default" + { + "#supported" + { + "engine" "orangebox" + "engine" "left4dead" + } + + "Offsets" + { + "GetDataDescMap" + { + "windows" "11" + "linux" "12" + } + } + } + + /* The Ship is completely different */ + "ship" + { + "Offsets" + { + "GetDataDescMap" + { + "windows" "18" + "linux" "19" + } + } + } + + /* Which games support ShowMenu? */ + "#default" + { + "#supported" + { + "game" "cstrike" + "game" "dod" + "game" "sourceforts" + "game" "insurgency" + "game" "tf" + "game" "pvkii" + "game" "diprip" + "game" "synergy" + "game" "FortressForever" + "game" "left4dead" + "game" "obsidian" + "game" "ageofchivalry" + } + + "Keys" + { + "HudRadioMenuMsg" "ShowMenu" + } + } + + /* Which games need a radio menu timeout? */ + "#default" + { + "#supported" + { + "game" "tf" + "game" "synergy" + "game" "dod" + "game" "ageofchivalry" + } + + "Keys" + { + "RadioMenuTimeout" "4" + } + } + + /** + * Which games support HudMsg? + */ + "#default" + { + "#supported" + { + "game" "hl2mp" + "game" "sourceforts" + "game" "tf" + "game" "ageofchivalry" + "game" "obsidian" + } + + "Keys" + { + "HudTextMsg" "HudMsg" + } + } + + "cstrike" + { + "Keys" + { + "HintTextPreByte" "yes" + "GameExtension" "game.cstrike" + } + } + + "tf" + { + "Keys" + { + "GameExtension" "game.tf2" + } + } +} diff --git a/gamedata/core.games/master.games.txt b/gamedata/core.games/master.games.txt new file mode 100644 index 00000000..71869f35 --- /dev/null +++ b/gamedata/core.games/master.games.txt @@ -0,0 +1,6 @@ +"Game Master" +{ + "common.games.txt" + { + } +} diff --git a/gamedata/sdktools.games.ep2.txt b/gamedata/sdktools.games.ep2.txt deleted file mode 100644 index e9a2cbb4..00000000 --- a/gamedata/sdktools.games.ep2.txt +++ /dev/null @@ -1,635 +0,0 @@ -"Games" -{ - /* Sounds */ - "#default" - { - "Keys" - { - "SlapSoundCount" "3" - "SlapSound1" "player/pl_fallpain1.wav" - "SlapSound2" "player/pl_fallpain3.wav" - "SlapSound3" "player/pl_pain5.wav" - "m_iFrags" "m_iFrags" - } - "Offsets" - { - "m_iHealth" - { - "class" "CBasePlayer" - "prop" "m_iHealth" - } - "m_lifeState" - { - "class" "CBasePlayer" - "prop" "m_lifeState" - } - } - } - - /* General Temp Entities */ - "#default" - { - "#supported" - { - "game" "dod" - "game" "tf" - "game" "ageofchivalry" - } - - "Offsets" - { - /* Offset into CBaseTempEntity constructor */ - "s_pTempEntities" - { - "windows" "17" - } - "GetTEName" - { - "windows" "4" - "linux" "4" - } - "GetTENext" - { - "windows" "8" - "linux" "8" - } - "TE_GetServerClass" - { - "windows" "0" - "linux" "0" - } - } - - "Signatures" - { - "CBaseTempEntity" - { - "library" "server" - "windows" "\x8B\xC1\x8B\x4C\x24\x04\xC7\x00\x2A\x2A\x2A\x2A\x89\x48\x04\x8B\x15\x2A\x2A\x2A\x2A\x89\x50\x08\xA3\x2A\x2A\x2A\x2A\xC2\x04\x00" - } - "s_pTempEntities" - { - "library" "server" - "linux" "@_ZN15CBaseTempEntity15s_pTempEntitiesE" - } - } - } - - /* Create Entity Signatures */ - "#default" - { - "#supported" - { - "game" "dod" - "game" "tf" - "game" "ageofchivalry" - } - - "Signatures" - { - "DispatchSpawn" - { - "library" "server" - "linux" "@_Z13DispatchSpawnP11CBaseEntity" - "windows" "\x53\x55\x56\x8B\x74\x24\x10\x85\xF6\x57\x0F\x84\x2A\x2A\x2A\x2A\x8B\x1D\x2A\x2A\x2A\x2A\x8B\x03\x8B\x50\x64\x8B\xCB" - } - "CreateEntityByName" - { - "library" "server" - "linux" "@_Z18CreateEntityByNamePKci" - "windows" "\x56\x8B\x74\x24\x0C\x83\xFE\xFF\x57\x8B\x7C\x24\x0C\x74\x27\x8B\x0D\x2A\x2A\x2A\x2A\x8B\x01\x8B\x50\x54\x56\xFF\xD2" - } - } - } - - /* CGlobalEntityList */ - "#default" - { - "#supported" - { - "game" "dod" - "game" "tf" - "game" "ageofchivalry" - } - - "Offsets" - { - /* Offset into LevelShutdown */ - "gEntList" - { - "windows" "11" - } - } - - "Signatures" - { - "LevelShutdown" - { - "library" "server" - "windows" "\xE8\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\xE8" - } - "gEntList" - { - "library" "server" - "linux" "@gEntList" - } - - /* Functions in CGlobalEntityList */ - "FindEntityByClassname" - { - "library" "server" - "windows" "\x53\x55\x56\x8B\xF1\x8B\x4C\x24\x10\x85\xC9\x57\x74\x19\x8B\x01\x8B\x50\x08\xFF\xD2\x8B\x00\x25\xFF\x0F\x00\x00\x83\xC0\x01\xC1\xE0\x04\x8B\x3C\x30\xEB\x06\x8B\xBE\x2A\x2A\x2A\x2A\x85\xFF\x74\x39\x8B\x5C\x24\x18\x8B\x2D\x2A\x2A\x2A\x2A\xEB\x03" - "linux" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc" - } - } - } - - /* General GameRules */ - "#default" - { - "#supported" - { - "game" "dod" - "game" "tf" - "game" "ageofchivalry" - } - - "Offsets" - { - /* Offset into CreateGameRulesObject */ - "g_pGameRules" - { - "windows" "2" - } - } - - "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" - "windows" "\x8B\x0D\x2A\x2A\x2A\x2A\x85\xC9\x74\x2A\x8B\x01\x8B\x50\x2A\x6A\x01\xFF\xD2" - } - "g_pGameRules" - { - "library" "server" - "linux" "@g_pGameRules" - } - } - } - - /* IServer interface pointer */ - "#default" - { - "Offsets" - { - /* Offset into IVEngineServer::CreateFakeClient */ - "sv" - { - "windows" "6" - } - } - - "Signatures" - { - /* CBaseServer object for IServer interface */ - "sv" - { - "library" "engine" - "linux" "@sv" - } - } - } - - /* EntityFactoryDictionary function */ - "#default" - { - "Signatures" - { - "EntityFactory" - { - "library" "server" - "windows" "\xB8\x01\x00\x00\x00\x84\x2A\x2A\x2A\x2A\x2A\x75\x1D\x09\x2A\x2A\x2A\x2A\x2A\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x68\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x83\xC4\x04\xB8\x2A\x2A\x2A\x2A\xC3" - "linux" "@_Z23EntityFactoryDictionaryv" - } - } - } - - /* CBaseEntityOutput::FireOutput */ - "#default" - { - "#supported" - { - "game" "dod" - "game" "tf" - "game" "ageofchivalry" - } - "Signatures" - { - "FireOutput" - { - "library" "server" - "windows" "\x81\xEC\x1C\x01\x00\x00\x53\x55\x56\x8B\x71\x14\x85\xF6" - "linux" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f" - } - } - "Offsets" - { - "FireOutputBackup" - { - "windows" "6" - "linux" "10" - } - } - } - - /* 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)%-0.*s" - * Cross referenced back to the vtable and counted manually (SetUserCvar is 1 higher, offsets start from 1) - */ - "SetUserCvar" - { - "windows" "17" - "linux" "55" - } - /** - * 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+98h], 0 - * Win: mov byte ptr [esi+0A4h], 0 - */ - "InfoChanged" - { - "windows" "164" - "linux" "152" - } - } - } - - /* Team Fortress 2 */ - "tf" - { - "Offsets" - { - "GiveNamedItem" - { - "windows" "406" - "linux" "410" - } - "RemovePlayerItem" - { - "windows" "238" - "linux" "239" - } - "Weapon_GetSlot" - { - "windows" "236" - "linux" "237" - } - "Ignite" - { - "windows" "193" - "linux" "194" - } - "Extinguish" - { - "windows" "197" - "linux" "198" - } - "Teleport" - { - "windows" "100" - "linux" "101" - } - "CommitSuicide" - { - "windows" "388" - "linux" "388" - } - "GetVelocity" - { - "windows" "130" - "linux" "131" - } - "EyeAngles" - { - "windows" "122" - "linux" "123" - } - "DispatchKeyValue" - { - "windows" "29" - "linux" "28" - } - "DispatchKeyValueFloat" - { - "windows" "28" - "linux" "29" - } - "DispatchKeyValueVector" - { - "windows" "27" - "linux" "30" - } - "SetEntityModel" - { - "windows" "23" - "linux" "24" - } - "AcceptInput" - { - "windows" "34" - "linux" "35" - } - "WeaponEquip" - { - "windows" "229" - "linux" "230" - } - "Activate" - { - "windows" "31" - "linux" "32" - } - } - } - - /* Day of Defeat: Source */ - "dod" - { - "Offsets" - { - "GiveNamedItem" - { - "windows" "350" - "linux" "351" - } - "RemovePlayerItem" - { - "windows" "238" - "linux" "239" - } - "Weapon_GetSlot" - { - "windows" "236" - "linux" "237" - } - "Ignite" - { - "windows" "193" - "linux" "194" - } - "Extinguish" - { - "windows" "197" - "linux" "198" - } - "Teleport" - { - "windows" "100" - "linux" "101" - } - "CommitSuicide" - { - "windows" "388" - "linux" "388" - } - "GetVelocity" - { - "windows" "130" - "linux" "131" - } - "EyeAngles" - { - "windows" "122" - "linux" "123" - } - "AcceptInput" - { - "windows" "34" - "linux" "35" - } - "DispatchKeyValue" - { - "windows" "29" - "linux" "28" - } - "DispatchKeyValueFloat" - { - "windows" "28" - "linux" "29" - } - "DispatchKeyValueVector" - { - "windows" "27" - "linux" "30" - } - "SetEntityModel" - { - "windows" "23" - "linux" "24" - } - "WeaponEquip" - { - "windows" "229" - "linux" "230" - } - "Activate" - { - "windows" "31" - "linux" "32" - } - } - } - - /* Afe of Chivalry */ - "ageofchivalry" - { - "Offsets" - { - "GiveNamedItem" - { - "windows" "351" - "linux" "352" - } - "RemovePlayerItem" - { - "windows" "239" - "linux" "240" - } - "Weapon_GetSlot" - { - "windows" "237" - "linux" "238" - } - "Ignite" - { - "windows" "194" - "linux" "195" - } - "Extinguish" - { - "windows" "198" - "linux" "199" - } - "Teleport" - { - "windows" "101" - "linux" "102" - } - "CommitSuicide" - { - "windows" "389" - "linux" "389" - } - "GetVelocity" - { - "windows" "130" - "linux" "131" - } - "EyeAngles" - { - "windows" "122" - "linux" "123" - } - "AcceptInput" - { - "windows" "34" - "linux" "35" - } - "DispatchKeyValue" - { - "windows" "29" - "linux" "28" - } - "DispatchKeyValueFloat" - { - "windows" "28" - "linux" "29" - } - "DispatchKeyValueVector" - { - "windows" "27" - "linux" "30" - } - "SetEntityModel" - { - "windows" "23" - "linux" "24" - } - "WeaponEquip" - { - "windows" "230" - "linux" "231" - } - "Activate" - { - "windows" "31" - "linux" "32" - } - } - } - - /* Obsidian Conflict 1.3 */ - "obsidian" - { - "Offsets" - { - "GiveNamedItem" - { - "windows" "350" - "linux" "351" - } - "RemovePlayerItem" - { - "windows" "237" - "linux" "238" - } - "Weapon_GetSlot" - { - "windows" "235" - "linux" "236" - } - "Ignite" - { - "windows" "190" - "linux" "191" - } - "Extinguish" - { - "windows" "194" - "linux" "195" - } - "Teleport" - { - "windows" "100" - "linux" "101" - } - "CommitSuicide" - { - "windows" "393" - "linux" "393" - } - "GetVelocity" - { - "windows" "127" - "linux" "128" - } - "EyeAngles" - { - "windows" "119" - "linux" "120" - } - "AcceptInput" - { - "windows" "34" - "linux" "35" - } - "DispatchKeyValue" - { - "windows" "29" - "linux" "28" - } - "DispatchKeyValueFloat" - { - "windows" "28" - "linux" "29" - } - "DispatchKeyValueVector" - { - "windows" "27" - "linux" "30" - } - "SetEntityModel" - { - "windows" "23" - "linux" "24" - } - "WeaponEquip" - { - "windows" "228" - "linux" "229" - } - "Activate" - { - "windows" "31" - "linux" "32" - } - } - } -} diff --git a/gamedata/sdktools.games.txt b/gamedata/sdktools.games.txt deleted file mode 100644 index 39e76c47..00000000 --- a/gamedata/sdktools.games.txt +++ /dev/null @@ -1,1701 +0,0 @@ -"Games" -{ - /* Sounds */ - "#default" - { - "Keys" - { - "SlapSoundCount" "3" - "SlapSound1" "player/pl_fallpain1.wav" - "SlapSound2" "player/pl_fallpain3.wav" - "SlapSound3" "player/pl_pain5.wav" - "m_iFrags" "m_iFrags" - } - "Offsets" - { - "m_iHealth" - { - "class" "CBasePlayer" - "prop" "m_iHealth" - } - "m_lifeState" - { - "class" "CBasePlayer" - "prop" "m_lifeState" - } - } - } - - /* General Temp Entities */ - "#default" - { - "#supported" - { - "game" "cstrike" - "game" "hl2mp" - "game" "ship" - "game" "!Dystopia" - "game" "!Insurgency" - "game" "pvkii" - "game" "sourceforts" - "game" "FortressForever" - "game" "empires" - "game" "synergy" - "game" "hidden" - "game" "zombie_master" - } - - "Offsets" - { - /* Offset into CBaseTempEntity constructor */ - "s_pTempEntities" - { - "windows" "17" - } - "GetTEName" - { - "windows" "4" - "linux" "4" - } - "GetTENext" - { - "windows" "8" - "linux" "8" - } - "TE_GetServerClass" - { - "windows" "1" - "linux" "1" - } - } - - "Signatures" - { - "CBaseTempEntity" - { - "library" "server" - "windows" "\x8B\xC1\x8B\x4C\x24\x04\xC7\x00\x2A\x2A\x2A\x2A\x89\x48\x04\x8B\x15\x2A\x2A\x2A\x2A\x89\x50\x08\xA3\x2A\x2A\x2A\x2A\xC2\x04\x00" - } - "s_pTempEntities" - { - "library" "server" - "linux" "@_ZN15CBaseTempEntity15s_pTempEntitiesE" - } - } - } - - /* General GameRules */ - "#default" - { - "#supported" - { - "game" "cstrike" - "game" "garrysmod" - "game" "hl2mp" - "game" "ship" - "game" "!Dystopia" - "game" "!Insurgency" - "game" "pvkii" - "game" "sourceforts" - "game" "FortressForever" - "game" "empires" - "game" "synergy" - "game" "hidden" - } - - "Offsets" - { - /* Offset into CreateGameRulesObject */ - "g_pGameRules" - { - "windows" "2" - } - } - - "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" - "windows" "\x8B\x0D\x2A\x2A\x2A\x2A\x85\xC9\x74\x2A\x8B\x01\x6A\x01\xFF\x50" - } - "g_pGameRules" - { - "library" "server" - "linux" "@g_pGameRules" - } - } - } - - /* CGlobalEntityList */ - "#default" - { - "#supported" - { - "game" "cstrike" - "game" "garrysmod" - "game" "hl2mp" - "game" "ship" - "game" "!Insurgency" - "game" "pvkii" - "game" "sourceforts" - "game" "FortressForever" - "game" "empires" - "game" "synergy" - "game" "hidden" - "game" "zombie_master" - } - - "Offsets" - { - /* Offset into LevelShutdown */ - "gEntList" - { - "windows" "11" - } - } - - "Signatures" - { - "LevelShutdown" - { - "library" "server" - "windows" "\xE8\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\xE8" - } - "gEntList" - { - "library" "server" - "linux" "@gEntList" - } - - /* Functions in CGlobalEntityList */ - "FindEntityByClassname" - { - "library" "server" - "windows" "\x53\x55\x56\x8B\xF1\x8B\x4C\x24\x2A\x85\xC9\x57\x74\x2A\x8B\x01\xFF\x50\x2A\x8B\x08\x81\xE1\x2A\x2A\x2A\x2A\x83\xC1\x2A\xC1\xE1\x2A\x8B\x3C\x31\xEB\x2A\x8B\xBE\x2A\x2A\x2A\x2A\x85\xFF\x74\x2A\x8B\x5C\x24\x2A\x8B\x2D\x2A\x2A\x2A\x2A\x8D\x9B\x00\x00\x00\x00\x8B\x37\x85\xF6\x75\x2A\x68\x2A\x2A\x2A\x2A\xFF\x2A\x83\xC4\x2A\xEB\x2A\x39" - "linux" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc" - } - } - } - - /* Create Entity Signatures */ - "#default" - { - "#supported" - { - "game" "cstrike" - "game" "hl2mp" - "game" "!Insurgency" - "game" "pvkii" - "game" "sourceforts" - "game" "empires" - "game" "synergy" - "game" "hidden" - "game" "FortressForever" - } - - "Signatures" - { - "DispatchSpawn" - { - "library" "server" - "linux" "@_Z13DispatchSpawnP11CBaseEntity" - "windows" "\x53\x55\x56\x8B\x74\x24\x10\x85\xF6\x57\x0F\x84\x2A\x2A\x2A\x2A\x8B\x1D\x2A\x2A\x2A\x2A\x8B\x03\x8B\xCB\xFF\x50\x60" - } - "CreateEntityByName" - { - "library" "server" - "linux" "@_Z18CreateEntityByNamePKci" - "windows" "\x56\x8B\x74\x24\x0C\x83\xFE\xFF\x57\x8B\x7C\x24\x0C\x74\x25\x8B\x0D\x2A\x2A\x2A\x2A\x8B\x01\x56\xFF\x50\x54\x85\xC0" - } - } - } - - /* IServer interface pointer */ - "#default" - { - "Offsets" - { - /* Offset into IVEngineServer::CreateFakeClient */ - "sv" - { - "windows" "6" - } - } - - "Signatures" - { - /* CBaseServer object for IServer interface */ - "sv" - { - "library" "engine" - "linux" "@sv" - } - } - } - - /* EntityFactoryDictionary function */ - "#default" - { - "Signatures" - { - "EntityFactory" - { - "library" "server" - "windows" "\xB8\x01\x00\x00\x00\x84\x2A\x2A\x2A\x2A\x2A\x75\x1D\x09\x2A\x2A\x2A\x2A\x2A\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x68\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x83\xC4\x04\xB8\x2A\x2A\x2A\x2A\xC3" - "linux" "@_Z23EntityFactoryDictionaryv" - } - } - } - /* CBaseEntityOutput::FireOutput */ - "#default" - { - "#supported" - { - "game" "cstrike" - "game" "hl2mp" - } - "Signatures" - { - "FireOutput" - { - "library" "server" - "windows" "\x81\xEC\x1C\x03\x00\x00\x53\x55\x56\x8B\x71\x14" - "linux" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f" - } - } - "Offsets" - { - "FireOutputBackup" - { - "windows" "6" - "linux" "6" - } - } - } - - /* 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)%-0.*s" - * Cross referenced back to the vtable and counted manually (SetUserCvar is 1 higher, offsets start from 1) - */ - "SetUserCvar" - { - "windows" "17" - "linux" "53" - } - /** - * 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+98h], 0 - * Win: mov byte ptr [esi+0A4h], 0 - */ - "InfoChanged" - { - "windows" "164" - "linux" "152" - } - } - } - - /* Counter-Strike: Source */ - "cstrike" - { - "Keys" - { - "SlapSoundCount" "3" - "SlapSound1" "player/damage1.wav" - "SlapSound2" "player/damage2.wav" - "SlapSound3" "player/damage3.wav" - } - - "Offsets" - { - "GiveNamedItem" - { - "windows" "329" - "linux" "330" - } - "RemovePlayerItem" - { - "windows" "226" - "linux" "227" - } - "Weapon_GetSlot" - { - "windows" "224" - "linux" "225" - } - "Ignite" - { - "windows" "188" - "linux" "189" - } - "Extinguish" - { - "windows" "189" - "linux" "190" - } - "Teleport" - { - "windows" "98" - "linux" "99" - } - "CommitSuicide" - { - "windows" "357" - "linux" "358" - } - "GetVelocity" - { - "windows" "126" - "linux" "127" - } - "EyeAngles" - { - "windows" "118" - "linux" "119" - } - "AcceptInput" - { - "windows" "35" - "linux" "36" - } - "DispatchKeyValue" - { - "windows" "31" - "linux" "30" - } - "DispatchKeyValueFloat" - { - "windows" "30" - "linux" "31" - } - "DispatchKeyValueVector" - { - "windows" "29" - "linux" "32" - } - "SetEntityModel" - { - "windows" "25" - "linux" "26" - } - "WeaponEquip" - { - "windows" "217" - "linux" "218" - } - "Activate" - { - "windows" "32" - "linux" "33" - } - } - } - - - /* Half-Life 2: Deathmatch */ - "hl2mp" - { - "Offsets" - { - "GiveNamedItem" - { - "windows" "328" - "linux" "329" - } - "RemovePlayerItem" - { - "windows" "226" - "linux" "227" - } - "Weapon_GetSlot" - { - "windows" "224" - "linux" "225" - } - "Ignite" - { - "windows" "188" - "linux" "189" - } - "Extinguish" - { - "windows" "189" - "linux" "190" - } - "Teleport" - { - "windows" "98" - "linux" "99" - } - "CommitSuicide" - { - "windows" "356" - "linux" "357" - } - "GetVelocity" - { - "windows" "126" - "linux" "127" - } - "EyeAngles" - { - "windows" "118" - "linux" "119" - } - "AcceptInput" - { - "windows" "35" - "linux" "36" - } - "DispatchKeyValue" - { - "windows" "31" - "linux" "30" - } - "DispatchKeyValueFloat" - { - "windows" "30" - "linux" "31" - } - "DispatchKeyValueVector" - { - "windows" "29" - "linux" "32" - } - "SetEntityModel" - { - "windows" "25" - "linux" "26" - } - "WeaponEquip" - { - "windows" "217" - "linux" "218" - } - "Activate" - { - "windows" "32" - "linux" "33" - } - } - } - - /* The Ship */ - "ship" - { - "Offsets" - { - /* CBasePlayer */ - "GiveNamedItem" - { - "windows" "316" - "linux" "317" - } - "RemovePlayerItem" - { - "windows" "220" - "linux" "221" - } - "Weapon_GetSlot" - { - "windows" "218" - "linux" "219" - } - "Ignite" - { - "windows" "180" - "linux" "181" - } - "Extinguish" - { - "windows" "181" - "linux" "182" - } - "Teleport" - { - "windows" "100" - "linux" "101" - } - "CommitSuicide" - { - "windows" "343" - "linux" "344" - } - "GetVelocity" - { - "windows" "124" - "linux" "125" - } - "EyeAngles" - { - "windows" "116" - "linux" "117" - } - "DispatchKeyValue" - { - "windows" "35" - "linux" "34" - } - "DispatchKeyValueFloat" - { - "windows" "34" - "linux" "35" - } - "DispatchKeyValueVector" - { - "windows" "33" - "linux" "36" - } - "AcceptInput" - { - "windows" "39" - "linux" "40" - } - "SetEntityModel" - { - "windows" "30" - "linux" "31" - } - "WeaponEquip" - { - "windows" "211" - "linux" "212" - } - "Activate" - { - "windows" "37" - "linux" "38" - } - - /* Temp Entities */ - "TE_GetServerClass" - { - "windows" "0" - "linux" "0" - } - } - - "Signatures" - { - "DispatchSpawn" - { - "library" "server" - "linux" "@_Z13DispatchSpawnP11CBaseEntity" - "windows" "\x53\x56\x8B\x74\x24\x0C\x85\xF6\x57\x0F\x84\x2A\x2A\x2A\x2A\x8B\x1D\x2A\x2A\x2A\x2A\x8B\x03\x8B\xCB\xFF\x50\x60\x8B\0x16" - } - "CreateEntityByName" - { - "library" "server" - "linux" "@_Z18CreateEntityByNamePKci" - "windows" "\x56\x8B\x74\x24\x0C\x83\xFE\xFF\x57\x8B\x7C\x24\x0C\x74\x25\x8B\x0D\x2A\x2A\x2A\x2A\x8B\x01\x56\xFF\x50\x54\x85\xC0" - } - } - } - - /* Dsytopia */ - "!Dystopia" - { - - "Offsets" - { - /* CBasePlayer */ - "GiveNamedItem" - { - "windows" "331" - "linux" "332" - } - "RemovePlayerItem" - { - "windows" "229" - "linux" "230" - } - "Weapon_GetSlot" - { - "windows" "227" - "linux" "228" - } - "Ignite" - { - "windows" "191" - "linux" "192" - } - "Extinguish" - { - "windows" "192" - "linux" "193" - } - "Teleport" - { - "windows" "100" - "linux" "101" - } - "CommitSuicide" - { - "windows" "360" - "linux" "361" - } - "GetVelocity" - { - "windows" "128" - "linux" "129" - } - "EyeAngles" - { - "windows" "120" - "linux" "121" - } - "AcceptInput" - { - "windows" "35" - "linux" "36" - } - "DispatchKeyValue" - { - "windows" "31" - "linux" "30" - } - "DispatchKeyValueFloat" - { - "windows" "30" - "linux" "31" - } - "DispatchKeyValueVector" - { - "windows" "29" - "linux" "32" - } - "SetEntityModel" - { - "windows" "25" - "linux" "26" - } - "WeaponEquip" - { - "windows" "220" - "linux" "221" - } - "Activate" - { - "windows" "32" - "linux" "33" - } - - /* Offset into CBaseTempEntity constructor. - * On Windows Dsytopia is heavily inlined; we use the function - * surrounding "aCouldnTFindTem" in IDA instead. - */ - "s_pTempEntities" - { - "windows" "70" - } - } - - "Signatures" - { - /* On Windows Dsytopia is heavily inlined; we use the function - * surrounding "aCouldnTFindTem" in IDA instead. - */ - "CBaseTempEntity" - { - "library" "server" - "windows" "\x81\xEC\x84\x00\x00\x00\x56\x8B\xF1\x8B\x46\x6C\x57\x8D\x7E\x6C\x8D\x4C\x24\x08\x83\xC8\x20\x51\x89\x44\x24\x0C\xE8\x2A\x2A\x2A" - } - - /* Dystopia always has to be different, doesn't it - * - * This is very similar to the general signature, except that - * it does "mov edx, [eax+2Ch]" before making a call rather than - * doing "call dword ptr [eax+2Ch]" - */ - "CreateGameRulesObject" - { - "library" "server" - "windows" "\x8B\x0D\x2A\x2A\x2A\x2A\x85\xC9\x74\x2A\x8B\x01\x8B\x50\x2A\x6A\x01\xFF\xD2" - } - } - } - - /* Insurgency Generic */ - "!Insurgency" - { - "Offsets" - { - /* CBasePlayer */ - "Ignite" - { - "windows" "176" - "linux" "177" - } - "Extinguish" - { - "windows" "176" - "linux" "177" - } - "Teleport" - { - "windows" "91" - "linux" "92" - } - "GetVelocity" - { - "windows" "116" - "linux" "117" - } - "EyeAngles" - { - "windows" "108" - "linux" "109" - } - "AcceptInput" - { - "windows" "34" - "linux" "35" - } - "DispatchKeyValue" - { - "windows" "30" - "linux" "29" - } - "DispatchKeyValueFloat" - { - "windows" "29" - "linux" "30" - } - "DispatchKeyValueVector" - { - "windows" "28" - "linux" "31" - } - "SetEntityModel" - { - "windows" "24" - "linux" "25" - } - "WeaponEquip" - { - "windows" "215" - "linux" "216" - } - "Activate" - { - "windows" "31" - "linux" "32" - } - } - } - - /* Pirates, Vikings and Knights II */ - "pvkii" - { - "Offsets" - { - /* CBasePlayer */ - "GiveNamedItem" - { - "windows" "328" - "linux" "329" - } - "RemovePlayerItem" - { - "windows" "226" - "linux" "227" - } - "Weapon_GetSlot" - { - "windows" "224" - "linux" "225" - } - "Ignite" - { - "windows" "188" - "linux" "189" - } - "Extinguish" - { - "windows" "189" - "linux" "190" - } - "Teleport" - { - "windows" "98" - "linux" "99" - } - "CommitSuicide" - { - "windows" "356" - "linux" "357" - } - "GetVelocity" - { - "windows" "126" - "linux" "127" - } - "EyeAngles" - { - "windows" "118" - "linux" "119" - } - "AcceptInput" - { - "windows" "35" - "linux" "36" - } - "DispatchKeyValue" - { - "windows" "31" - "linux" "30" - } - "DispatchKeyValueFloat" - { - "windows" "30" - "linux" "31" - } - "DispatchKeyValueVector" - { - "windows" "29" - "linux" "32" - } - "SetEntityModel" - { - "windows" "25" - "linux" "26" - } - "WeaponEquip" - { - "windows" "217" - "linux" "218" - } - "Activate" - { - "windows" "32" - "linux" "33" - } - } - } - - /* Fortress Forever */ - "FortressForever" - { - "Offsets" - { - "GiveNamedItem" - { - "windows" "338" - "linux" "339" - } - "RemovePlayerItem" - { - "windows" "236" - "linux" "237" - } - "Weapon_GetSlot" - { - "windows" "234" - "linux" "235" - } - "Ignite" - { - "windows" "198" - "linux" "199" - } - "Extinguish" - { - "windows" "199" - "linux" "200" - } - "Teleport" - { - "windows" "104" - "linux" "105" - } - "CommitSuicide" - { - "windows" "366" - "linux" "367" - } - "GetVelocity" - { - "windows" "136" - "linux" "137" - } - "EyeAngles" - { - "windows" "128" - "linux" "129" - } - "AcceptInput" - { - "windows" "39" - "linux" "40" - } - "DispatchKeyValue" - { - "windows" "35" - "linux" "34" - } - "DispatchKeyValueFloat" - { - "windows" "34" - "linux" "35" - } - "DispatchKeyValueVector" - { - "windows" "33" - "linux" "36" - } - "SetEntityModel" - { - "windows" "27" - "linux" "28" - } - "WeaponEquip" - { - "windows" "227" - "linux" "228" - } - "Activate" - { - "windows" "36" - "linux" "37" - } - } - - "Signatures" - { - "CreateGameRulesObject" - { - "library" "server" - "windows" "8B\x0D\x2A\x2A\x2A\x2A\x85\xC9\x74\x09\x8B\x01\x8B\x50\x2C\x6A\x01" - } - "FindEntityByClassname" - { - "library" "server" - "windows" "\x53\x55\x56\x8B\xF1\x8B\x4C\x24\x10\x85\xC9\x57\x74\x19\x8B\x01\x8B\x50\x08\xFF\xD2\x8B\x00\x25\xFF\x0F\x00\x00\x83\xC0\x01\xC1\xE0\x04\x8B\x3C\x30\xEB\x06\x8B\xBE\x04\x00\x01\x00\x85\xFF\x74\x39\x8B\x5C\x24\x18\x8B\x2D\x2A\x2A\x2A\x2A\xEB\x03" - } - "DispatchSpawn" - { - "library" "server" - "windows" "\x53\x55\x56\x8B\x74\x24\x10\x85\xF6\x57\x0F\x84\x2A\x2A\x2A\x2A\x8B\x1D\x2A\x2A\x2A\x2A\x8B\x03\x8B\x50\x60\x8B\xCB" - } - "CreateEntityByName" - { - "library" "server" - "windows" "\x56\x8B\x74\x24\x0C\x83\xFE\xFF\x57\x8B\x7C\x24\x0C\x74\x27\x8B\x0D\x2A\x2A\x2A\x2A\x8B\x01\x8B\x50\x54\x56\xFF\xD2" - } - } - } - - /* Garry's Mod 10 - Windows only - * This mod is not officially supported, and the definitions are - * for Garry's Mod pre-Orange Box. - * (credits: Damaged Soul) - */ - "garrysmod" - { - "Offsets" - { - "GiveNamedItem" - { - "windows" "366" - } - "RemovePlayerItem" - { - "windows" "264" - } - "Weapon_GetSlot" - { - "windows" "262" - } - "Ignite" - { - "windows" "220" - } - "Extinguish" - { - "windows" "221" - } - "Teleport" - { - "windows" "99" - } - "CommitSuicide" - { - "windows" "394" - } - "GetVelocity" - { - "windows" "127" - } - "EyeAngles" - { - "windows" "119" - } - "AcceptInput" - { - "windows" "35" - } - "DispatchKeyValue" - { - "windows" "31" - } - "DispatchKeyValueFloat" - { - "windows" "30" - } - "DispatchKeyValueVector" - { - "windows" "29" - } - } - } - - /* Empires 2 */ - "empires" - { - - "Offsets" - { - "GiveNamedItem" - { - "windows" "332" - "linux" "333" - } - "RemovePlayerItem" - { - "windows" "230" - "linux" "231" - } - "Weapon_GetSlot" - { - "windows" "228" - "linux" "229" - } - "Ignite" - { - "windows" "192" - "linux" "193" - } - "Extinguish" - { - "windows" "193" - "linux" "194" - } - "Teleport" - { - "windows" "102" - "linux" "103" - } - "CommitSuicide" - { - "windows" "360" - "linux" "361" - } - "GetVelocity" - { - "windows" "130" - "linux" "131" - } - "EyeAngles" - { - "windows" "122" - "linux" "123" - } - "AcceptInput" - { - "windows" "36" - "linux" "37" - } - "DispatchKeyValue" - { - "windows" "31" - "linux" "30" - } - "DispatchKeyValueFloat" - { - "windows" "30" - "linux" "31" - } - "DispatchKeyValueVector" - { - "windows" "29" - "linux" "32" - } - "SetEntityModel" - { - "windows" "25" - "linux" "26" - } - "WeaponEquip" - { - "windows" "221" - "linux" "222" - } - "Activate" - { - "windows" "32" - "linux" "33" - } - - /* Offset into LevelShutdown for CGlobalEntList */ - "gEntList" - { - "windows" "64" - } - } - - "Signatures" - { - "LevelShutdown" - { - "library" "server" - "windows" "\x8B\x0D\x2A\x2A\x2A\x2A\x85\xC9\x74\x2B\x56\xE8\x2A\x2A\x2A\x2A\x8B\x0D\x2A\x2A\x2A\x2A\x85\xC9\x8B\xF1\x74\x0E" - } - } - } - - "sourceforts" - { - "Offsets" - { - /* CBasePlayer */ - "GiveNamedItem" - { - "windows" "328" - "linux" "329" - } - "RemovePlayerItem" - { - "windows" "226" - "linux" "227" - } - "Weapon_GetSlot" - { - "windows" "224" - "linux" "225" - } - "Ignite" - { - "windows" "188" - "linux" "189" - } - "Extinguish" - { - "windows" "189" - "linux" "190" - } - "Teleport" - { - "windows" "98" - "linux" "99" - } - "CommitSuicide" - { - "windows" "356" - "linux" "357" - } - "GetVelocity" - { - "windows" "126" - "linux" "127" - } - "EyeAngles" - { - "windows" "118" - "linux" "119" - } - "DispatchKeyValue" - { - "windows" "31" - "linux" "30" - } - "DispatchKeyValueFloat" - { - "windows" "30" - "linux" "31" - } - "DispatchKeyValueVector" - { - "windows" "29" - "linux" "32" - } - "AcceptInput" - { - "windows" "35" - "linux" "36" - } - "SetEntityModel" - { - "windows" "25" - "linux" "26" - } - "WeaponEquip" - { - "windows" "217" - "linux" "218" - } - "Activate" - { - "windows" "32" - "linux" "33" - } - } - } - - /* Synergy Release 1 */ - "synergy" - { - "Offsets" - { - /* CBasePlayer */ - "GiveNamedItem" - { - "windows" "334" - "linux" "335" - } - "RemovePlayerItem" - { - "windows" "226" - "linux" "227" - } - "Weapon_GetSlot" - { - "windows" "224" - "linux" "225" - } - "Ignite" - { - "windows" "188" - "linux" "189" - } - "Extinguish" - { - "windows" "189" - "linux" "190" - } - "Teleport" - { - "windows" "98" - "linux" "99" - } - "CommitSuicide" - { - "windows" "362" - "linux" "363" - } - "GetVelocity" - { - "windows" "126" - "linux" "127" - } - "EyeAngles" - { - "windows" "118" - "linux" "119" - } - "DispatchKeyValue" - { - "windows" "31" - "linux" "30" - } - "DispatchKeyValueFloat" - { - "windows" "30" - "linux" "31" - } - "DispatchKeyValueVector" - { - "windows" "29" - "linux" "32" - } - "AcceptInput" - { - "windows" "35" - "linux" "36" - } - "SetEntityModel" - { - "windows" "25" - "linux" "26" - } - "WeaponEquip" - { - "windows" "217" - "linux" "218" - } - "Activate" - { - "windows" "32" - "linux" "33" - } - } - } - - /* Hidden:Source Beta 4b */ - "hidden" - { - "Offsets" - { - /* CBasePlayer */ - "GiveNamedItem" - { - "windows" "348" - "linux" "349" - } - "RemovePlayerItem" - { - "windows" "207" - "linux" "208" - } - "Weapon_GetSlot" - { - "windows" "205" - "linux" "206" - } - "Ignite" - { - "windows" "170" - "linux" "171" - } - "Extinguish" - { - "windows" "171" - "linux" "172" - } - "Teleport" - { - "windows" "90" - "linux" "91" - } - "GetVelocity" - { - "windows" "114" - "linux" "115" - } - "EyeAngles" - { - "windows" "106" - "linux" "107" - } - "DispatchKeyValue" - { - "windows" "30" - "linux" "29" - } - "DispatchKeyValueFloat" - { - "windows" "29" - "linux" "30" - } - "DispatchKeyValueVector" - { - "windows" "28" - "linux" "31" - } - "AcceptInput" - { - "windows" "34" - "linux" "35" - } - "SetEntityModel" - { - "windows" "25" - "linux" "26" - } - "Activate" - { - "windows" "32" - "linux" "33" - } - "TE_GetServerClass" - { - "windows" "0" - "linux" "0" - } - "WeaponEquip" - { - "windows" "198" - "linux" "199" - } - } - - "Signatures" - { - "DispatchSpawn" - { - "library" "server" - "linux" "@_Z13DispatchSpawnP11CBaseEntity" - "windows" "\x53\x56\x8B\x74\x24\x0C\x85\xF6\x57\x0F\x84\x2A\x2A\x2A\x2A\x8B\x1D\x2A\x2A\x2A\x2A\x8B\x03\x8B\xCB\xFF\x50\x14" - } - } - } - - /* Zombie Master 1.1.3 */ - "zombie_master" - { - "Offsets" - { - /* CBasePlayer */ - "GiveNamedItem" - { - "windows" "329" - "linux" "330" - } - "RemovePlayerItem" - { - "windows" "226" - "linux" "227" - } - "Weapon_GetSlot" - { - "windows" "224" - "linux" "225" - } - "Ignite" - { - "windows" "188" - "linux" "189" - } - "Extinguish" - { - "windows" "189" - "linux" "190" - } - "Teleport" - { - "windows" "98" - "linux" "99" - } - "CommitSuicide" - { - "windows" "357" - "linux" "358" - } - "GetVelocity" - { - "windows" "126" - "linux" "127" - } - "EyeAngles" - { - "windows" "118" - "linux" "119" - } - "DispatchKeyValue" - { - "windows" "31" - "linux" "30" - } - "DispatchKeyValueFloat" - { - "windows" "30" - "linux" "31" - } - "DispatchKeyValueVector" - { - "windows" "29" - "linux" "32" - } - "AcceptInput" - { - "windows" "35" - "linux" "36" - } - "SetEntityModel" - { - "windows" "25" - "linux" "26" - } - "s_pTempEntities" - { - "windows" "30" - } - "g_pGameRules" - { - "windows" "7" - } - "WeaponEquip" - { - "windows" "198" - "linux" "199" - } - "Activate" - { - "windows" "32" - "linux" "33" - } - } - - "Signatures" - { - "CBaseTempEntity" - { - "library" "server" - "windows" "\x55\x8B\xEC\x51\x89\x4D\xFC\x8B\x45\xFC\xC7\x00\x2A\x2A\x2A\x2A\x8B\x4D\xFC\x8B\x55\x08\x89\x51\x04\x8B\x45\xFC\x8B\x0D\x2A\x2A" - } - "DispatchSpawn" - { - "library" "server" - "linux" "@_Z13DispatchSpawnP11CBaseEntity" - "windows" "\x55\x8B\xEC\x83\xEC\x20\x83\x7D\x08\x00\x0F\x84\x95\x01\x00\x00\xA1\x2A\x2A\x2A\x2A\x50\x8D\x4D\xF0\xE8\x2A\x2A\x2A\x2A\x8D\x4D" - } - "CreateEntityByName" - { - "library" "server" - "linux" "@_Z18CreateEntityByNamePKci" - "windows" "\x55\x8B\xEC\x83\xEC\x0C\x83\x7D\x0C\xFF\x74\x39\x8B\x45\x0C\x50\x8B\x0D\x2A\x2A\x2A\x2A\x8B\x11\x8B\x0D\x2A\x2A\x2A\x2A\xFF\x52" - } - "FindEntityByClassname" - { - "library" "server" - "windows" "\x55\x8B\xEC\x83\xEC\x10\x89\x4D\xF4\x83\x7D\x08\x00\x74\x1C\x8B\x45\x08\x8B\x10\x8B\x4D\x08\xFF\x52\x08\x50\x8B\x4D\xF4\xE8\x2A\x2A\x2A\x2A\x8B\x40\x0C\x89\x45\x\xF0\xEB\x0B\x8B\x4D\xF4\xE8\x2A\x2A\x2A\x2A\x89\x45\xF0\x8B\x4D\xF0\x89\x4D\xFC\xEB\x09\x8B\x55\xFC\x8B\x42\x0C\x89\x45\xFC\x83\x7D\xFC\x00\x74\x38\x8B\x4D\xFC\x8B\x11\x89" - "linux" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc" - } - "CreateGameRulesObject" - { - "library" "server" - "windows" "\x55\x8B\xEC\x83\xEC\x10\xA1\x2A\x2A\x2A\x2A\x89\x45\xF4\x8B\x4D\xF4\x89\x4D\xF8\x83\x7D\xF8\x00" - } - "g_pGameRules" - { - "library" "server" - "linux" "@g_pGameRules" - } - } - } - - /* Zombie Panic! Source 1.2b - * Note: This mod is not fully supported yet. - * The definitions below were supplied by a third party. - * (thanks "noob cannon lol") - */ - "$Zombie Panic! Source" - { - "Offsets" - { - "GiveNamedItem" - { - "windows" "333" - "linux" "334" - } - "RemovePlayerItem" - { - "windows" "230" - "linux" "231" - } - "Weapon_GetSlot" - { - "windows" "226" - "linux" "227" - } - "Ignite" - { - "windows" "190" - "linux" "191" - } - "Extinguish" - { - "windows" "191" - "linux" "192" - } - "Teleport" - { - "windows" "100" - "linux" "101" - } - "CommitSuicide" - { - "windows" "361" - "linux" "362" - } - "GetVelocity" - { - "windows" "128" - "linux" "129" - } - "EyeAngles" - { - "windows" "120" - "linux" "121" - } - "AcceptInput" - { - "windows" "35" - "linux" "36" - } - "DispatchKeyValue" - { - "windows" "31" - "linux" "30" - } - "DispatchKeyValueFloat" - { - "windows" "30" - "linux" "31" - } - "DispatchKeyValueVector" - { - "windows" "29" - "linux" "32" - } - "SetEntityModel" - { - "windows" "25" - "linux" "26" - } - "WeaponEquip" - { - "windows" "219" - "linux" "220" - } - "Activate" - { - "windows" "32" - "linux" "33" - } - } - "Signatures" - { - "CreateGameRulesObject" - { - "library" "server" - "windows" "\x8B\x0D\x2A\x2A\x2A\x2A\x85\xC9\x74\x2A\x8B\x01\x8B\x50\x2C\x6A\x01" - } - "FindEntityByClassname" - { - "library" "server" - "windows" "\x53\x55\x56\x8B\xF1\x8B\x4C\x24\x2A\x2A\x85\xC9\x74\x2A\x8B\x01\x8B\x50\x2A\x2A\x2A\x8B\x00\x25\xFF\x0F\x00\x00\x40\xC1\xC1\xE0\x04\x8B\x2A\x2A\xEB\x2A\x8B\xBE\x2A\x2A\x2A\x2A\x85\xFF\x74\x2A\x8B\x5C\x24\x2A\x8B\x2D\x2A\x2A\x2A\x2A\x8D\xA4\x24\x00\x00\x00\x00\x8B\x37\x85\xF6\x75\x2A\x68\x2A\x2A\x2A\x2A\xFF\x2A\x83\xC4\x2A\xEB\x2A\x39" - "linux" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc" - } - "CreateEntityByName" - { - "library" "server" - "linux" "@_Z18CreateEntityByNamePKci" - "windows" "\x56\x8B\x74\x24\x2A\x57\x8B\x7C\x24\x2A\x83\xFE\xFF\x74\x2A\x8B\x0D\x2A\x2A\x2A\x2A\x8B\x01\x8B\x50\x2A\x56\xFF\xD2" - } - "DispatchSpawn" - { - "library" "server" - "linux" "@_Z13DispatchSpawnP11CBaseEntity" - "windows" "\x53\x55\x56\x8B\x74\x24\x10\x2A\x85\xF6\x0F\x84\x2A\x2A\x2A\x2A\x8B\x1D\x2A\x2A\x2A\x2A\x8B\x03\x8B\x50\x60\x8B\xCB" - } - } - } -} - diff --git a/gamedata/sdktools.games/common.games.txt b/gamedata/sdktools.games/common.games.txt new file mode 100644 index 00000000..50ffee16 --- /dev/null +++ b/gamedata/sdktools.games/common.games.txt @@ -0,0 +1,37 @@ +"Games" +{ + /* Sounds */ + "#default" + { + "Keys" + { + "SlapSoundCount" "3" + "SlapSound1" "player/pl_fallpain1.wav" + "SlapSound2" "player/pl_fallpain3.wav" + "SlapSound3" "player/pl_pain5.wav" + } + } + + /* Properties */ + "#default" + { + "Keys" + { + "m_iFrags" "m_iFrags" + } + + "Offsets" + { + "m_iHealth" + { + "class" "CBasePlayer" + "prop" "m_iHealth" + } + "m_lifeState" + { + "class" "CBasePlayer" + "prop" "m_lifeState" + } + } + } +} diff --git a/gamedata/sdktools.games/engine.ep1.txt b/gamedata/sdktools.games/engine.ep1.txt new file mode 100644 index 00000000..86784b98 --- /dev/null +++ b/gamedata/sdktools.games/engine.ep1.txt @@ -0,0 +1,288 @@ +"Games" +{ + /* General Temp Entities */ + "#default" + { + "#supported" + { + "game" "cstrike" + "game" "hl2mp" + "game" "ship" + "game" "!Dystopia" + "game" "insurgency" + "game" "pvkii" + "game" "sourceforts" + "game" "FortressForever" + "game" "empires" + "game" "synergy" + "game" "hidden" + "game" "zombie_master" + } + + "Offsets" + { + /* Offset into CBaseTempEntity constructor */ + "s_pTempEntities" + { + "windows" "17" + } + "GetTEName" + { + "windows" "4" + "linux" "4" + } + "GetTENext" + { + "windows" "8" + "linux" "8" + } + "TE_GetServerClass" + { + "windows" "1" + "linux" "1" + } + } + + "Signatures" + { + "CBaseTempEntity" + { + "library" "server" + "windows" "\x8B\xC1\x8B\x4C\x24\x04\xC7\x00\x2A\x2A\x2A\x2A\x89\x48\x04\x8B\x15\x2A\x2A\x2A\x2A\x89\x50\x08\xA3\x2A\x2A\x2A\x2A\xC2\x04\x00" + } + "s_pTempEntities" + { + "library" "server" + "linux" "@_ZN15CBaseTempEntity15s_pTempEntitiesE" + } + } + } + + /* General GameRules */ + "#default" + { + "#supported" + { + "game" "cstrike" + "game" "garrysmod" + "game" "hl2mp" + "game" "ship" + "game" "!Dystopia" + "game" "insurgency" + "game" "pvkii" + "game" "sourceforts" + "game" "FortressForever" + "game" "empires" + "game" "synergy" + "game" "hidden" + } + + "Offsets" + { + /* Offset into CreateGameRulesObject */ + "g_pGameRules" + { + "windows" "2" + } + } + + "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" + "windows" "\x8B\x0D\x2A\x2A\x2A\x2A\x85\xC9\x74\x2A\x8B\x01\x6A\x01\xFF\x50" + } + "g_pGameRules" + { + "library" "server" + "linux" "@g_pGameRules" + } + } + } + + /* CGlobalEntityList */ + "#default" + { + "#supported" + { + "game" "cstrike" + "game" "garrysmod" + "game" "hl2mp" + "game" "ship" + "game" "insurgency" + "game" "pvkii" + "game" "sourceforts" + "game" "FortressForever" + "game" "empires" + "game" "synergy" + "game" "hidden" + "game" "zombie_master" + } + + "Offsets" + { + /* Offset into LevelShutdown */ + "gEntList" + { + "windows" "11" + } + } + + "Signatures" + { + "LevelShutdown" + { + "library" "server" + "windows" "\xE8\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\xE8" + } + "gEntList" + { + "library" "server" + "linux" "@gEntList" + } + + /* Functions in CGlobalEntityList */ + "FindEntityByClassname" + { + "library" "server" + "windows" "\x53\x55\x56\x8B\xF1\x8B\x4C\x24\x2A\x85\xC9\x57\x74\x2A\x8B\x01\xFF\x50\x2A\x8B\x08\x81\xE1\x2A\x2A\x2A\x2A\x83\xC1\x2A\xC1\xE1\x2A\x8B\x3C\x31\xEB\x2A\x8B\xBE\x2A\x2A\x2A\x2A\x85\xFF\x74\x2A\x8B\x5C\x24\x2A\x8B\x2D\x2A\x2A\x2A\x2A\x8D\x9B\x00\x00\x00\x00\x8B\x37\x85\xF6\x75\x2A\x68\x2A\x2A\x2A\x2A\xFF\x2A\x83\xC4\x2A\xEB\x2A\x39" + "linux" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc" + } + } + } + + /* Create Entity Signatures */ + "#default" + { + "#supported" + { + "game" "cstrike" + "game" "hl2mp" + "game" "insurgency" + "game" "pvkii" + "game" "sourceforts" + "game" "empires" + "game" "synergy" + "game" "hidden" + "game" "FortressForever" + } + + "Signatures" + { + "DispatchSpawn" + { + "library" "server" + "linux" "@_Z13DispatchSpawnP11CBaseEntity" + "windows" "\x53\x55\x56\x8B\x74\x24\x10\x85\xF6\x57\x0F\x84\x2A\x2A\x2A\x2A\x8B\x1D\x2A\x2A\x2A\x2A\x8B\x03\x8B\xCB\xFF\x50\x60" + } + "CreateEntityByName" + { + "library" "server" + "linux" "@_Z18CreateEntityByNamePKci" + "windows" "\x56\x8B\x74\x24\x0C\x83\xFE\xFF\x57\x8B\x7C\x24\x0C\x74\x25\x8B\x0D\x2A\x2A\x2A\x2A\x8B\x01\x56\xFF\x50\x54\x85\xC0" + } + } + } + + /* IServer interface pointer */ + "#default" + { + "Offsets" + { + /* Offset into IVEngineServer::CreateFakeClient */ + "sv" + { + "windows" "6" + } + } + + "Signatures" + { + /* CBaseServer object for IServer interface */ + "sv" + { + "library" "engine" + "linux" "@sv" + } + } + } + + /* EntityFactoryDictionary function */ + "#default" + { + "Signatures" + { + "EntityFactory" + { + "library" "server" + "windows" "\xB8\x01\x00\x00\x00\x84\x2A\x2A\x2A\x2A\x2A\x75\x1D\x09\x2A\x2A\x2A\x2A\x2A\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x68\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x83\xC4\x04\xB8\x2A\x2A\x2A\x2A\xC3" + "linux" "@_Z23EntityFactoryDictionaryv" + } + } + } + /* CBaseEntityOutput::FireOutput */ + "#default" + { + "#supported" + { + "game" "cstrike" + "game" "hl2mp" + } + "Signatures" + { + "FireOutput" + { + "library" "server" + "windows" "\x81\xEC\x1C\x03\x00\x00\x53\x55\x56\x8B\x71\x14" + "linux" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f" + } + } + "Offsets" + { + "FireOutputBackup" + { + "windows" "6" + "linux" "6" + } + } + } + + /* 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)%-0.*s" + * Cross referenced back to the vtable and counted manually (SetUserCvar is 1 higher, offsets start from 1) + */ + "SetUserCvar" + { + "windows" "17" + "linux" "53" + } + /** + * 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+98h], 0 + * Win: mov byte ptr [esi+0A4h], 0 + */ + "InfoChanged" + { + "windows" "164" + "linux" "152" + } + } + } +} diff --git a/gamedata/sdktools.games/engine.ep2.txt b/gamedata/sdktools.games/engine.ep2.txt new file mode 100644 index 00000000..df8fcbec --- /dev/null +++ b/gamedata/sdktools.games/engine.ep2.txt @@ -0,0 +1,257 @@ +"Games" +{ + /* General Temp Entities */ + "#default" + { + "#supported" + { + "game" "dod" + "game" "tf" + "game" "ageofchivalry" + } + + "Offsets" + { + /* Offset into CBaseTempEntity constructor */ + "s_pTempEntities" + { + "windows" "17" + } + "GetTEName" + { + "windows" "4" + "linux" "4" + } + "GetTENext" + { + "windows" "8" + "linux" "8" + } + "TE_GetServerClass" + { + "windows" "0" + "linux" "0" + } + } + + "Signatures" + { + "CBaseTempEntity" + { + "library" "server" + "windows" "\x8B\xC1\x8B\x4C\x24\x04\xC7\x00\x2A\x2A\x2A\x2A\x89\x48\x04\x8B\x15\x2A\x2A\x2A\x2A\x89\x50\x08\xA3\x2A\x2A\x2A\x2A\xC2\x04\x00" + } + "s_pTempEntities" + { + "library" "server" + "linux" "@_ZN15CBaseTempEntity15s_pTempEntitiesE" + } + } + } + + /* Create Entity Signatures */ + "#default" + { + "#supported" + { + "game" "dod" + "game" "tf" + "game" "ageofchivalry" + } + + "Signatures" + { + "DispatchSpawn" + { + "library" "server" + "linux" "@_Z13DispatchSpawnP11CBaseEntity" + "windows" "\x53\x55\x56\x8B\x74\x24\x10\x85\xF6\x57\x0F\x84\x2A\x2A\x2A\x2A\x8B\x1D\x2A\x2A\x2A\x2A\x8B\x03\x8B\x50\x64\x8B\xCB" + } + "CreateEntityByName" + { + "library" "server" + "linux" "@_Z18CreateEntityByNamePKci" + "windows" "\x56\x8B\x74\x24\x0C\x83\xFE\xFF\x57\x8B\x7C\x24\x0C\x74\x27\x8B\x0D\x2A\x2A\x2A\x2A\x8B\x01\x8B\x50\x54\x56\xFF\xD2" + } + } + } + + /* CGlobalEntityList */ + "#default" + { + "#supported" + { + "game" "dod" + "game" "tf" + "game" "ageofchivalry" + } + + "Offsets" + { + /* Offset into LevelShutdown */ + "gEntList" + { + "windows" "11" + } + } + + "Signatures" + { + "LevelShutdown" + { + "library" "server" + "windows" "\xE8\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\xE8" + } + "gEntList" + { + "library" "server" + "linux" "@gEntList" + } + + /* Functions in CGlobalEntityList */ + "FindEntityByClassname" + { + "library" "server" + "windows" "\x53\x55\x56\x8B\xF1\x8B\x4C\x24\x10\x85\xC9\x57\x74\x19\x8B\x01\x8B\x50\x08\xFF\xD2\x8B\x00\x25\xFF\x0F\x00\x00\x83\xC0\x01\xC1\xE0\x04\x8B\x3C\x30\xEB\x06\x8B\xBE\x2A\x2A\x2A\x2A\x85\xFF\x74\x39\x8B\x5C\x24\x18\x8B\x2D\x2A\x2A\x2A\x2A\xEB\x03" + "linux" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc" + } + } + } + + /* General GameRules */ + "#default" + { + "#supported" + { + "game" "dod" + "game" "tf" + "game" "ageofchivalry" + } + + "Offsets" + { + /* Offset into CreateGameRulesObject */ + "g_pGameRules" + { + "windows" "2" + } + } + + "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" + "windows" "\x8B\x0D\x2A\x2A\x2A\x2A\x85\xC9\x74\x2A\x8B\x01\x8B\x50\x2A\x6A\x01\xFF\xD2" + } + "g_pGameRules" + { + "library" "server" + "linux" "@g_pGameRules" + } + } + } + + /* IServer interface pointer */ + "#default" + { + "Offsets" + { + /* Offset into IVEngineServer::CreateFakeClient */ + "sv" + { + "windows" "6" + } + } + + "Signatures" + { + /* CBaseServer object for IServer interface */ + "sv" + { + "library" "engine" + "linux" "@sv" + } + } + } + + /* EntityFactoryDictionary function */ + "#default" + { + "Signatures" + { + "EntityFactory" + { + "library" "server" + "windows" "\xB8\x01\x00\x00\x00\x84\x2A\x2A\x2A\x2A\x2A\x75\x1D\x09\x2A\x2A\x2A\x2A\x2A\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x68\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x83\xC4\x04\xB8\x2A\x2A\x2A\x2A\xC3" + "linux" "@_Z23EntityFactoryDictionaryv" + } + } + } + + /* CBaseEntityOutput::FireOutput */ + "#default" + { + "#supported" + { + "game" "dod" + "game" "tf" + "game" "ageofchivalry" + } + "Signatures" + { + "FireOutput" + { + "library" "server" + "windows" "\x81\xEC\x1C\x01\x00\x00\x53\x55\x56\x8B\x71\x14\x85\xF6" + "linux" "@_ZN17CBaseEntityOutput10FireOutputE9variant_tP11CBaseEntityS2_f" + } + } + "Offsets" + { + "FireOutputBackup" + { + "windows" "6" + "linux" "10" + } + } + } + + /* 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)%-0.*s" + * Cross referenced back to the vtable and counted manually (SetUserCvar is 1 higher, offsets start from 1) + */ + "SetUserCvar" + { + "windows" "17" + "linux" "55" + } + /** + * 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+98h], 0 + * Win: mov byte ptr [esi+0A4h], 0 + */ + "InfoChanged" + { + "windows" "164" + "linux" "152" + } + } + } +} diff --git a/gamedata/sdktools.games.l4d.txt b/gamedata/sdktools.games/engine.l4d.txt similarity index 91% rename from gamedata/sdktools.games.l4d.txt rename to gamedata/sdktools.games/engine.l4d.txt index 786f9f5f..be6cdbca 100644 --- a/gamedata/sdktools.games.l4d.txt +++ b/gamedata/sdktools.games/engine.l4d.txt @@ -8,20 +8,6 @@ "SlapSoundCount" "2" "SlapSound1" "player/damage1.wav" "SlapSound2" "player/damage2.wav" - "m_iFrags" "m_iFrags" - } - "Offsets" - { - "m_iHealth" - { - "class" "CBasePlayer" - "prop" "m_iHealth" - } - "m_lifeState" - { - "class" "CBasePlayer" - "prop" "m_lifeState" - } } } diff --git a/gamedata/sdktools.games/game.aoc.txt b/gamedata/sdktools.games/game.aoc.txt new file mode 100644 index 00000000..c551fe29 --- /dev/null +++ b/gamedata/sdktools.games/game.aoc.txt @@ -0,0 +1,90 @@ +"Games" +{ + /* Age of Chivalry */ + "ageofchivalry" + { + "Offsets" + { + "GiveNamedItem" + { + "windows" "351" + "linux" "352" + } + "RemovePlayerItem" + { + "windows" "239" + "linux" "240" + } + "Weapon_GetSlot" + { + "windows" "237" + "linux" "238" + } + "Ignite" + { + "windows" "194" + "linux" "195" + } + "Extinguish" + { + "windows" "198" + "linux" "199" + } + "Teleport" + { + "windows" "101" + "linux" "102" + } + "CommitSuicide" + { + "windows" "389" + "linux" "389" + } + "GetVelocity" + { + "windows" "130" + "linux" "131" + } + "EyeAngles" + { + "windows" "122" + "linux" "123" + } + "AcceptInput" + { + "windows" "34" + "linux" "35" + } + "DispatchKeyValue" + { + "windows" "29" + "linux" "28" + } + "DispatchKeyValueFloat" + { + "windows" "28" + "linux" "29" + } + "DispatchKeyValueVector" + { + "windows" "27" + "linux" "30" + } + "SetEntityModel" + { + "windows" "23" + "linux" "24" + } + "WeaponEquip" + { + "windows" "230" + "linux" "231" + } + "Activate" + { + "windows" "31" + "linux" "32" + } + } + } +} diff --git a/gamedata/sdktools.games/game.cstrike.txt b/gamedata/sdktools.games/game.cstrike.txt new file mode 100644 index 00000000..c2807a5d --- /dev/null +++ b/gamedata/sdktools.games/game.cstrike.txt @@ -0,0 +1,98 @@ +"Games" +{ + /* Counter-Strike: Source */ + "cstrike" + { + "Keys" + { + "SlapSoundCount" "3" + "SlapSound1" "player/damage1.wav" + "SlapSound2" "player/damage2.wav" + "SlapSound3" "player/damage3.wav" + } + + "Offsets" + { + "GiveNamedItem" + { + "windows" "329" + "linux" "330" + } + "RemovePlayerItem" + { + "windows" "226" + "linux" "227" + } + "Weapon_GetSlot" + { + "windows" "224" + "linux" "225" + } + "Ignite" + { + "windows" "188" + "linux" "189" + } + "Extinguish" + { + "windows" "189" + "linux" "190" + } + "Teleport" + { + "windows" "98" + "linux" "99" + } + "CommitSuicide" + { + "windows" "357" + "linux" "358" + } + "GetVelocity" + { + "windows" "126" + "linux" "127" + } + "EyeAngles" + { + "windows" "118" + "linux" "119" + } + "AcceptInput" + { + "windows" "35" + "linux" "36" + } + "DispatchKeyValue" + { + "windows" "31" + "linux" "30" + } + "DispatchKeyValueFloat" + { + "windows" "30" + "linux" "31" + } + "DispatchKeyValueVector" + { + "windows" "29" + "linux" "32" + } + "SetEntityModel" + { + "windows" "25" + "linux" "26" + } + "WeaponEquip" + { + "windows" "217" + "linux" "218" + } + "Activate" + { + "windows" "32" + "linux" "33" + } + } + } +} \ No newline at end of file diff --git a/gamedata/sdktools.games/game.dod.txt b/gamedata/sdktools.games/game.dod.txt new file mode 100644 index 00000000..6bf8b8d9 --- /dev/null +++ b/gamedata/sdktools.games/game.dod.txt @@ -0,0 +1,90 @@ +"Games" +{ + /* Day of Defeat: Source */ + "dod" + { + "Offsets" + { + "GiveNamedItem" + { + "windows" "350" + "linux" "351" + } + "RemovePlayerItem" + { + "windows" "238" + "linux" "239" + } + "Weapon_GetSlot" + { + "windows" "236" + "linux" "237" + } + "Ignite" + { + "windows" "193" + "linux" "194" + } + "Extinguish" + { + "windows" "197" + "linux" "198" + } + "Teleport" + { + "windows" "100" + "linux" "101" + } + "CommitSuicide" + { + "windows" "388" + "linux" "388" + } + "GetVelocity" + { + "windows" "130" + "linux" "131" + } + "EyeAngles" + { + "windows" "122" + "linux" "123" + } + "AcceptInput" + { + "windows" "34" + "linux" "35" + } + "DispatchKeyValue" + { + "windows" "29" + "linux" "28" + } + "DispatchKeyValueFloat" + { + "windows" "28" + "linux" "29" + } + "DispatchKeyValueVector" + { + "windows" "27" + "linux" "30" + } + "SetEntityModel" + { + "windows" "23" + "linux" "24" + } + "WeaponEquip" + { + "windows" "229" + "linux" "230" + } + "Activate" + { + "windows" "31" + "linux" "32" + } + } + } +} diff --git a/gamedata/sdktools.games/game.dystopia.txt b/gamedata/sdktools.games/game.dystopia.txt new file mode 100644 index 00000000..65f6c371 --- /dev/null +++ b/gamedata/sdktools.games/game.dystopia.txt @@ -0,0 +1,125 @@ +"Games" +{ + /* Dsytopia */ + "!Dystopia" + { + + "Offsets" + { + /* CBasePlayer */ + "GiveNamedItem" + { + "windows" "331" + "linux" "332" + } + "RemovePlayerItem" + { + "windows" "229" + "linux" "230" + } + "Weapon_GetSlot" + { + "windows" "227" + "linux" "228" + } + "Ignite" + { + "windows" "191" + "linux" "192" + } + "Extinguish" + { + "windows" "192" + "linux" "193" + } + "Teleport" + { + "windows" "100" + "linux" "101" + } + "CommitSuicide" + { + "windows" "360" + "linux" "361" + } + "GetVelocity" + { + "windows" "128" + "linux" "129" + } + "EyeAngles" + { + "windows" "120" + "linux" "121" + } + "AcceptInput" + { + "windows" "35" + "linux" "36" + } + "DispatchKeyValue" + { + "windows" "31" + "linux" "30" + } + "DispatchKeyValueFloat" + { + "windows" "30" + "linux" "31" + } + "DispatchKeyValueVector" + { + "windows" "29" + "linux" "32" + } + "SetEntityModel" + { + "windows" "25" + "linux" "26" + } + "WeaponEquip" + { + "windows" "220" + "linux" "221" + } + "Activate" + { + "windows" "32" + "linux" "33" + } + + /* Offset into CBaseTempEntity constructor. + * On Windows Dsytopia is heavily inlined; we use the function + * surrounding "aCouldnTFindTem" in IDA instead. + */ + "s_pTempEntities" + { + "windows" "70" + } + } + + "Signatures" + { + /* On Windows Dsytopia is heavily inlined; we use the function + * surrounding "aCouldnTFindTem" in IDA instead. + */ + "CBaseTempEntity" + { + "library" "server" + "windows" "\x81\xEC\x84\x00\x00\x00\x56\x8B\xF1\x8B\x46\x6C\x57\x8D\x7E\x6C\x8D\x4C\x24\x08\x83\xC8\x20\x51\x89\x44\x24\x0C\xE8\x2A\x2A\x2A" + } + + /* Dystopia always has to be different, doesn't it + * + * This is very similar to the general signature, except that + * it does "mov edx, [eax+2Ch]" before making a call rather than + * doing "call dword ptr [eax+2Ch]" + */ + "CreateGameRulesObject" + { + "library" "server" + "windows" "\x8B\x0D\x2A\x2A\x2A\x2A\x85\xC9\x74\x2A\x8B\x01\x8B\x50\x2A\x6A\x01\xFF\xD2" + } + } + } +} \ No newline at end of file diff --git a/gamedata/sdktools.games/game.empires.txt b/gamedata/sdktools.games/game.empires.txt new file mode 100644 index 00000000..2ee37fc5 --- /dev/null +++ b/gamedata/sdktools.games/game.empires.txt @@ -0,0 +1,106 @@ +"Games" +{ + /* Empires 2 */ + "empires" + { + + "Offsets" + { + "GiveNamedItem" + { + "windows" "332" + "linux" "333" + } + "RemovePlayerItem" + { + "windows" "230" + "linux" "231" + } + "Weapon_GetSlot" + { + "windows" "228" + "linux" "229" + } + "Ignite" + { + "windows" "192" + "linux" "193" + } + "Extinguish" + { + "windows" "193" + "linux" "194" + } + "Teleport" + { + "windows" "102" + "linux" "103" + } + "CommitSuicide" + { + "windows" "360" + "linux" "361" + } + "GetVelocity" + { + "windows" "130" + "linux" "131" + } + "EyeAngles" + { + "windows" "122" + "linux" "123" + } + "AcceptInput" + { + "windows" "36" + "linux" "37" + } + "DispatchKeyValue" + { + "windows" "31" + "linux" "30" + } + "DispatchKeyValueFloat" + { + "windows" "30" + "linux" "31" + } + "DispatchKeyValueVector" + { + "windows" "29" + "linux" "32" + } + "SetEntityModel" + { + "windows" "25" + "linux" "26" + } + "WeaponEquip" + { + "windows" "221" + "linux" "222" + } + "Activate" + { + "windows" "32" + "linux" "33" + } + + /* Offset into LevelShutdown for CGlobalEntList */ + "gEntList" + { + "windows" "64" + } + } + + "Signatures" + { + "LevelShutdown" + { + "library" "server" + "windows" "\x8B\x0D\x2A\x2A\x2A\x2A\x85\xC9\x74\x2B\x56\xE8\x2A\x2A\x2A\x2A\x8B\x0D\x2A\x2A\x2A\x2A\x85\xC9\x8B\xF1\x74\x0E" + } + } + } +} \ No newline at end of file diff --git a/gamedata/sdktools.games/game.ff.txt b/gamedata/sdktools.games/game.ff.txt new file mode 100644 index 00000000..73d010f7 --- /dev/null +++ b/gamedata/sdktools.games/game.ff.txt @@ -0,0 +1,114 @@ +"Games" +{ + /* Fortress Forever */ + "FortressForever" + { + "Offsets" + { + "GiveNamedItem" + { + "windows" "338" + "linux" "339" + } + "RemovePlayerItem" + { + "windows" "236" + "linux" "237" + } + "Weapon_GetSlot" + { + "windows" "234" + "linux" "235" + } + "Ignite" + { + "windows" "198" + "linux" "199" + } + "Extinguish" + { + "windows" "199" + "linux" "200" + } + "Teleport" + { + "windows" "104" + "linux" "105" + } + "CommitSuicide" + { + "windows" "366" + "linux" "367" + } + "GetVelocity" + { + "windows" "136" + "linux" "137" + } + "EyeAngles" + { + "windows" "128" + "linux" "129" + } + "AcceptInput" + { + "windows" "39" + "linux" "40" + } + "DispatchKeyValue" + { + "windows" "35" + "linux" "34" + } + "DispatchKeyValueFloat" + { + "windows" "34" + "linux" "35" + } + "DispatchKeyValueVector" + { + "windows" "33" + "linux" "36" + } + "SetEntityModel" + { + "windows" "27" + "linux" "28" + } + "WeaponEquip" + { + "windows" "227" + "linux" "228" + } + "Activate" + { + "windows" "36" + "linux" "37" + } + } + + "Signatures" + { + "CreateGameRulesObject" + { + "library" "server" + "windows" "8B\x0D\x2A\x2A\x2A\x2A\x85\xC9\x74\x09\x8B\x01\x8B\x50\x2C\x6A\x01" + } + "FindEntityByClassname" + { + "library" "server" + "windows" "\x53\x55\x56\x8B\xF1\x8B\x4C\x24\x10\x85\xC9\x57\x74\x19\x8B\x01\x8B\x50\x08\xFF\xD2\x8B\x00\x25\xFF\x0F\x00\x00\x83\xC0\x01\xC1\xE0\x04\x8B\x3C\x30\xEB\x06\x8B\xBE\x04\x00\x01\x00\x85\xFF\x74\x39\x8B\x5C\x24\x18\x8B\x2D\x2A\x2A\x2A\x2A\xEB\x03" + } + "DispatchSpawn" + { + "library" "server" + "windows" "\x53\x55\x56\x8B\x74\x24\x10\x85\xF6\x57\x0F\x84\x2A\x2A\x2A\x2A\x8B\x1D\x2A\x2A\x2A\x2A\x8B\x03\x8B\x50\x60\x8B\xCB" + } + "CreateEntityByName" + { + "library" "server" + "windows" "\x56\x8B\x74\x24\x0C\x83\xFE\xFF\x57\x8B\x7C\x24\x0C\x74\x27\x8B\x0D\x2A\x2A\x2A\x2A\x8B\x01\x8B\x50\x54\x56\xFF\xD2" + } + } + } +} \ No newline at end of file diff --git a/gamedata/sdktools.games/game.garrysmod.txt b/gamedata/sdktools.games/game.garrysmod.txt new file mode 100644 index 00000000..90d8826c --- /dev/null +++ b/gamedata/sdktools.games/game.garrysmod.txt @@ -0,0 +1,66 @@ +"Games" +{ + /* Garry's Mod 10 - Windows only + * This mod is not officially supported, and the definitions are + * for Garry's Mod pre-Orange Box. + * (credits: Damaged Soul) + */ + "garrysmod" + { + "Offsets" + { + "GiveNamedItem" + { + "windows" "366" + } + "RemovePlayerItem" + { + "windows" "264" + } + "Weapon_GetSlot" + { + "windows" "262" + } + "Ignite" + { + "windows" "220" + } + "Extinguish" + { + "windows" "221" + } + "Teleport" + { + "windows" "99" + } + "CommitSuicide" + { + "windows" "394" + } + "GetVelocity" + { + "windows" "127" + } + "EyeAngles" + { + "windows" "119" + } + "AcceptInput" + { + "windows" "35" + } + "DispatchKeyValue" + { + "windows" "31" + } + "DispatchKeyValueFloat" + { + "windows" "30" + } + "DispatchKeyValueVector" + { + "windows" "29" + } + } + } +} \ No newline at end of file diff --git a/gamedata/sdktools.games/game.hidden.txt b/gamedata/sdktools.games/game.hidden.txt new file mode 100644 index 00000000..d78f1c2a --- /dev/null +++ b/gamedata/sdktools.games/game.hidden.txt @@ -0,0 +1,101 @@ +"Games" +{ + /* Hidden:Source Beta 4b */ + "hidden" + { + "Offsets" + { + /* CBasePlayer */ + "GiveNamedItem" + { + "windows" "348" + "linux" "349" + } + "RemovePlayerItem" + { + "windows" "207" + "linux" "208" + } + "Weapon_GetSlot" + { + "windows" "205" + "linux" "206" + } + "Ignite" + { + "windows" "170" + "linux" "171" + } + "Extinguish" + { + "windows" "171" + "linux" "172" + } + "Teleport" + { + "windows" "90" + "linux" "91" + } + "GetVelocity" + { + "windows" "114" + "linux" "115" + } + "EyeAngles" + { + "windows" "106" + "linux" "107" + } + "DispatchKeyValue" + { + "windows" "30" + "linux" "29" + } + "DispatchKeyValueFloat" + { + "windows" "29" + "linux" "30" + } + "DispatchKeyValueVector" + { + "windows" "28" + "linux" "31" + } + "AcceptInput" + { + "windows" "34" + "linux" "35" + } + "SetEntityModel" + { + "windows" "25" + "linux" "26" + } + "Activate" + { + "windows" "32" + "linux" "33" + } + "TE_GetServerClass" + { + "windows" "0" + "linux" "0" + } + "WeaponEquip" + { + "windows" "198" + "linux" "199" + } + } + + "Signatures" + { + "DispatchSpawn" + { + "library" "server" + "linux" "@_Z13DispatchSpawnP11CBaseEntity" + "windows" "\x53\x56\x8B\x74\x24\x0C\x85\xF6\x57\x0F\x84\x2A\x2A\x2A\x2A\x8B\x1D\x2A\x2A\x2A\x2A\x8B\x03\x8B\xCB\xFF\x50\x14" + } + } + } +} \ No newline at end of file diff --git a/gamedata/sdktools.games/game.hl2mp.txt b/gamedata/sdktools.games/game.hl2mp.txt new file mode 100644 index 00000000..243df4b0 --- /dev/null +++ b/gamedata/sdktools.games/game.hl2mp.txt @@ -0,0 +1,90 @@ +"Games" +{ + /* Half-Life 2: Deathmatch */ + "hl2mp" + { + "Offsets" + { + "GiveNamedItem" + { + "windows" "328" + "linux" "329" + } + "RemovePlayerItem" + { + "windows" "226" + "linux" "227" + } + "Weapon_GetSlot" + { + "windows" "224" + "linux" "225" + } + "Ignite" + { + "windows" "188" + "linux" "189" + } + "Extinguish" + { + "windows" "189" + "linux" "190" + } + "Teleport" + { + "windows" "98" + "linux" "99" + } + "CommitSuicide" + { + "windows" "356" + "linux" "357" + } + "GetVelocity" + { + "windows" "126" + "linux" "127" + } + "EyeAngles" + { + "windows" "118" + "linux" "119" + } + "AcceptInput" + { + "windows" "35" + "linux" "36" + } + "DispatchKeyValue" + { + "windows" "31" + "linux" "30" + } + "DispatchKeyValueFloat" + { + "windows" "30" + "linux" "31" + } + "DispatchKeyValueVector" + { + "windows" "29" + "linux" "32" + } + "SetEntityModel" + { + "windows" "25" + "linux" "26" + } + "WeaponEquip" + { + "windows" "217" + "linux" "218" + } + "Activate" + { + "windows" "32" + "linux" "33" + } + } + } +} \ No newline at end of file diff --git a/gamedata/sdktools.games/game.insurgency.txt b/gamedata/sdktools.games/game.insurgency.txt new file mode 100644 index 00000000..9f84b199 --- /dev/null +++ b/gamedata/sdktools.games/game.insurgency.txt @@ -0,0 +1,71 @@ +"Games" +{ + /* Insurgency */ + "insurgency" + { + "Offsets" + { + /* CBasePlayer */ + "Ignite" + { + "windows" "174" + "linux" "175" + } + "Extinguish" + { + "windows" "175" + "linux" "176" + } + "Teleport" + { + "windows" "90" + "linux" "91" + } + "GetVelocity" + { + "windows" "115" + "linux" "116" + } + "EyeAngles" + { + "windows" "107" + "linux" "108" + } + "AcceptInput" + { + "windows" "34" + "linux" "35" + } + "DispatchKeyValue" + { + "windows" "30" + "linux" "29" + } + "DispatchKeyValueFloat" + { + "windows" "29" + "linux" "30" + } + "DispatchKeyValueVector" + { + "windows" "28" + "linux" "31" + } + "SetEntityModel" + { + "windows" "24" + "linux" "25" + } + "WeaponEquip" + { + "windows" "215" + "linux" "216" + } + "Activate" + { + "windows" "31" + "linux" "32" + } + } + } +} \ No newline at end of file diff --git a/gamedata/sdktools.games/game.obsidian.txt b/gamedata/sdktools.games/game.obsidian.txt new file mode 100644 index 00000000..ae10526e --- /dev/null +++ b/gamedata/sdktools.games/game.obsidian.txt @@ -0,0 +1,90 @@ +"Games" +{ + /* Obsidian Conflict 1.3 */ + "obsidian" + { + "Offsets" + { + "GiveNamedItem" + { + "windows" "350" + "linux" "351" + } + "RemovePlayerItem" + { + "windows" "237" + "linux" "238" + } + "Weapon_GetSlot" + { + "windows" "235" + "linux" "236" + } + "Ignite" + { + "windows" "190" + "linux" "191" + } + "Extinguish" + { + "windows" "194" + "linux" "195" + } + "Teleport" + { + "windows" "100" + "linux" "101" + } + "CommitSuicide" + { + "windows" "393" + "linux" "393" + } + "GetVelocity" + { + "windows" "127" + "linux" "128" + } + "EyeAngles" + { + "windows" "119" + "linux" "120" + } + "AcceptInput" + { + "windows" "34" + "linux" "35" + } + "DispatchKeyValue" + { + "windows" "29" + "linux" "28" + } + "DispatchKeyValueFloat" + { + "windows" "28" + "linux" "29" + } + "DispatchKeyValueVector" + { + "windows" "27" + "linux" "30" + } + "SetEntityModel" + { + "windows" "23" + "linux" "24" + } + "WeaponEquip" + { + "windows" "228" + "linux" "229" + } + "Activate" + { + "windows" "31" + "linux" "32" + } + } + } +} diff --git a/gamedata/sdktools.games/game.pvkii.txt b/gamedata/sdktools.games/game.pvkii.txt new file mode 100644 index 00000000..d853afcb --- /dev/null +++ b/gamedata/sdktools.games/game.pvkii.txt @@ -0,0 +1,91 @@ +"Games" +{ + /* Pirates, Vikings and Knights II */ + "pvkii" + { + "Offsets" + { + /* CBasePlayer */ + "GiveNamedItem" + { + "windows" "328" + "linux" "329" + } + "RemovePlayerItem" + { + "windows" "226" + "linux" "227" + } + "Weapon_GetSlot" + { + "windows" "224" + "linux" "225" + } + "Ignite" + { + "windows" "188" + "linux" "189" + } + "Extinguish" + { + "windows" "189" + "linux" "190" + } + "Teleport" + { + "windows" "98" + "linux" "99" + } + "CommitSuicide" + { + "windows" "356" + "linux" "357" + } + "GetVelocity" + { + "windows" "126" + "linux" "127" + } + "EyeAngles" + { + "windows" "118" + "linux" "119" + } + "AcceptInput" + { + "windows" "35" + "linux" "36" + } + "DispatchKeyValue" + { + "windows" "31" + "linux" "30" + } + "DispatchKeyValueFloat" + { + "windows" "30" + "linux" "31" + } + "DispatchKeyValueVector" + { + "windows" "29" + "linux" "32" + } + "SetEntityModel" + { + "windows" "25" + "linux" "26" + } + "WeaponEquip" + { + "windows" "217" + "linux" "218" + } + "Activate" + { + "windows" "32" + "linux" "33" + } + } + } +} \ No newline at end of file diff --git a/gamedata/sdktools.games/game.ship.txt b/gamedata/sdktools.games/game.ship.txt new file mode 100644 index 00000000..c538397e --- /dev/null +++ b/gamedata/sdktools.games/game.ship.txt @@ -0,0 +1,114 @@ +"Games" +{ + /* The Ship */ + "ship" + { + "Offsets" + { + /* CBasePlayer */ + "GiveNamedItem" + { + "windows" "316" + "linux" "317" + } + "RemovePlayerItem" + { + "windows" "220" + "linux" "221" + } + "Weapon_GetSlot" + { + "windows" "218" + "linux" "219" + } + "Ignite" + { + "windows" "180" + "linux" "181" + } + "Extinguish" + { + "windows" "181" + "linux" "182" + } + "Teleport" + { + "windows" "100" + "linux" "101" + } + "CommitSuicide" + { + "windows" "343" + "linux" "344" + } + "GetVelocity" + { + "windows" "124" + "linux" "125" + } + "EyeAngles" + { + "windows" "116" + "linux" "117" + } + "DispatchKeyValue" + { + "windows" "35" + "linux" "34" + } + "DispatchKeyValueFloat" + { + "windows" "34" + "linux" "35" + } + "DispatchKeyValueVector" + { + "windows" "33" + "linux" "36" + } + "AcceptInput" + { + "windows" "39" + "linux" "40" + } + "SetEntityModel" + { + "windows" "30" + "linux" "31" + } + "WeaponEquip" + { + "windows" "211" + "linux" "212" + } + "Activate" + { + "windows" "37" + "linux" "38" + } + + /* Temp Entities */ + "TE_GetServerClass" + { + "windows" "0" + "linux" "0" + } + } + + "Signatures" + { + "DispatchSpawn" + { + "library" "server" + "linux" "@_Z13DispatchSpawnP11CBaseEntity" + "windows" "\x53\x56\x8B\x74\x24\x0C\x85\xF6\x57\x0F\x84\x2A\x2A\x2A\x2A\x8B\x1D\x2A\x2A\x2A\x2A\x8B\x03\x8B\xCB\xFF\x50\x60\x8B\0x16" + } + "CreateEntityByName" + { + "library" "server" + "linux" "@_Z18CreateEntityByNamePKci" + "windows" "\x56\x8B\x74\x24\x0C\x83\xFE\xFF\x57\x8B\x7C\x24\x0C\x74\x25\x8B\x0D\x2A\x2A\x2A\x2A\x8B\x01\x56\xFF\x50\x54\x85\xC0" + } + } + } +} \ No newline at end of file diff --git a/gamedata/sdktools.games/game.sourceforts.txt b/gamedata/sdktools.games/game.sourceforts.txt new file mode 100644 index 00000000..5f802aff --- /dev/null +++ b/gamedata/sdktools.games/game.sourceforts.txt @@ -0,0 +1,91 @@ +"Games" +{ + /* SourceForts */ + "SourceForts" + { + "Offsets" + { + /* CBasePlayer */ + "GiveNamedItem" + { + "windows" "328" + "linux" "329" + } + "RemovePlayerItem" + { + "windows" "226" + "linux" "227" + } + "Weapon_GetSlot" + { + "windows" "224" + "linux" "225" + } + "Ignite" + { + "windows" "188" + "linux" "189" + } + "Extinguish" + { + "windows" "189" + "linux" "190" + } + "Teleport" + { + "windows" "98" + "linux" "99" + } + "CommitSuicide" + { + "windows" "356" + "linux" "357" + } + "GetVelocity" + { + "windows" "126" + "linux" "127" + } + "EyeAngles" + { + "windows" "118" + "linux" "119" + } + "DispatchKeyValue" + { + "windows" "31" + "linux" "30" + } + "DispatchKeyValueFloat" + { + "windows" "30" + "linux" "31" + } + "DispatchKeyValueVector" + { + "windows" "29" + "linux" "32" + } + "AcceptInput" + { + "windows" "35" + "linux" "36" + } + "SetEntityModel" + { + "windows" "25" + "linux" "26" + } + "WeaponEquip" + { + "windows" "217" + "linux" "218" + } + "Activate" + { + "windows" "32" + "linux" "33" + } + } + } +} \ No newline at end of file diff --git a/gamedata/sdktools.games/game.synergy.txt b/gamedata/sdktools.games/game.synergy.txt new file mode 100644 index 00000000..a3f84048 --- /dev/null +++ b/gamedata/sdktools.games/game.synergy.txt @@ -0,0 +1,91 @@ +"Games" +{ + /* Synergy Release 1 */ + "synergy" + { + "Offsets" + { + /* CBasePlayer */ + "GiveNamedItem" + { + "windows" "334" + "linux" "335" + } + "RemovePlayerItem" + { + "windows" "226" + "linux" "227" + } + "Weapon_GetSlot" + { + "windows" "224" + "linux" "225" + } + "Ignite" + { + "windows" "188" + "linux" "189" + } + "Extinguish" + { + "windows" "189" + "linux" "190" + } + "Teleport" + { + "windows" "98" + "linux" "99" + } + "CommitSuicide" + { + "windows" "362" + "linux" "363" + } + "GetVelocity" + { + "windows" "126" + "linux" "127" + } + "EyeAngles" + { + "windows" "118" + "linux" "119" + } + "DispatchKeyValue" + { + "windows" "31" + "linux" "30" + } + "DispatchKeyValueFloat" + { + "windows" "30" + "linux" "31" + } + "DispatchKeyValueVector" + { + "windows" "29" + "linux" "32" + } + "AcceptInput" + { + "windows" "35" + "linux" "36" + } + "SetEntityModel" + { + "windows" "25" + "linux" "26" + } + "WeaponEquip" + { + "windows" "217" + "linux" "218" + } + "Activate" + { + "windows" "32" + "linux" "33" + } + } + } +} \ No newline at end of file diff --git a/gamedata/sdktools.games/game.tf.txt b/gamedata/sdktools.games/game.tf.txt new file mode 100644 index 00000000..8656f893 --- /dev/null +++ b/gamedata/sdktools.games/game.tf.txt @@ -0,0 +1,90 @@ +"Games" +{ + /* Team Fortress 2 */ + "tf" + { + "Offsets" + { + "GiveNamedItem" + { + "windows" "406" + "linux" "410" + } + "RemovePlayerItem" + { + "windows" "238" + "linux" "239" + } + "Weapon_GetSlot" + { + "windows" "236" + "linux" "237" + } + "Ignite" + { + "windows" "193" + "linux" "194" + } + "Extinguish" + { + "windows" "197" + "linux" "198" + } + "Teleport" + { + "windows" "100" + "linux" "101" + } + "CommitSuicide" + { + "windows" "388" + "linux" "388" + } + "GetVelocity" + { + "windows" "130" + "linux" "131" + } + "EyeAngles" + { + "windows" "122" + "linux" "123" + } + "DispatchKeyValue" + { + "windows" "29" + "linux" "28" + } + "DispatchKeyValueFloat" + { + "windows" "28" + "linux" "29" + } + "DispatchKeyValueVector" + { + "windows" "27" + "linux" "30" + } + "SetEntityModel" + { + "windows" "23" + "linux" "24" + } + "AcceptInput" + { + "windows" "34" + "linux" "35" + } + "WeaponEquip" + { + "windows" "229" + "linux" "230" + } + "Activate" + { + "windows" "31" + "linux" "32" + } + } + } +} \ No newline at end of file diff --git a/gamedata/sdktools.games/game.zm.txt b/gamedata/sdktools.games/game.zm.txt new file mode 100644 index 00000000..a431c2ba --- /dev/null +++ b/gamedata/sdktools.games/game.zm.txt @@ -0,0 +1,136 @@ +"Games" +{ + /* Zombie Master 1.1.3 */ + "zombie_master" + { + "Offsets" + { + /* CBasePlayer */ + "GiveNamedItem" + { + "windows" "329" + "linux" "330" + } + "RemovePlayerItem" + { + "windows" "226" + "linux" "227" + } + "Weapon_GetSlot" + { + "windows" "224" + "linux" "225" + } + "Ignite" + { + "windows" "188" + "linux" "189" + } + "Extinguish" + { + "windows" "189" + "linux" "190" + } + "Teleport" + { + "windows" "98" + "linux" "99" + } + "CommitSuicide" + { + "windows" "357" + "linux" "358" + } + "GetVelocity" + { + "windows" "126" + "linux" "127" + } + "EyeAngles" + { + "windows" "118" + "linux" "119" + } + "DispatchKeyValue" + { + "windows" "31" + "linux" "30" + } + "DispatchKeyValueFloat" + { + "windows" "30" + "linux" "31" + } + "DispatchKeyValueVector" + { + "windows" "29" + "linux" "32" + } + "AcceptInput" + { + "windows" "35" + "linux" "36" + } + "SetEntityModel" + { + "windows" "25" + "linux" "26" + } + "s_pTempEntities" + { + "windows" "30" + } + "g_pGameRules" + { + "windows" "7" + } + "WeaponEquip" + { + "windows" "198" + "linux" "199" + } + "Activate" + { + "windows" "32" + "linux" "33" + } + } + + "Signatures" + { + "CBaseTempEntity" + { + "library" "server" + "windows" "\x55\x8B\xEC\x51\x89\x4D\xFC\x8B\x45\xFC\xC7\x00\x2A\x2A\x2A\x2A\x8B\x4D\xFC\x8B\x55\x08\x89\x51\x04\x8B\x45\xFC\x8B\x0D\x2A\x2A" + } + "DispatchSpawn" + { + "library" "server" + "linux" "@_Z13DispatchSpawnP11CBaseEntity" + "windows" "\x55\x8B\xEC\x83\xEC\x20\x83\x7D\x08\x00\x0F\x84\x95\x01\x00\x00\xA1\x2A\x2A\x2A\x2A\x50\x8D\x4D\xF0\xE8\x2A\x2A\x2A\x2A\x8D\x4D" + } + "CreateEntityByName" + { + "library" "server" + "linux" "@_Z18CreateEntityByNamePKci" + "windows" "\x55\x8B\xEC\x83\xEC\x0C\x83\x7D\x0C\xFF\x74\x39\x8B\x45\x0C\x50\x8B\x0D\x2A\x2A\x2A\x2A\x8B\x11\x8B\x0D\x2A\x2A\x2A\x2A\xFF\x52" + } + "FindEntityByClassname" + { + "library" "server" + "windows" "\x55\x8B\xEC\x83\xEC\x10\x89\x4D\xF4\x83\x7D\x08\x00\x74\x1C\x8B\x45\x08\x8B\x10\x8B\x4D\x08\xFF\x52\x08\x50\x8B\x4D\xF4\xE8\x2A\x2A\x2A\x2A\x8B\x40\x0C\x89\x45\x\xF0\xEB\x0B\x8B\x4D\xF4\xE8\x2A\x2A\x2A\x2A\x89\x45\xF0\x8B\x4D\xF0\x89\x4D\xFC\xEB\x09\x8B\x55\xFC\x8B\x42\x0C\x89\x45\xFC\x83\x7D\xFC\x00\x74\x38\x8B\x4D\xFC\x8B\x11\x89" + "linux" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc" + } + "CreateGameRulesObject" + { + "library" "server" + "windows" "\x55\x8B\xEC\x83\xEC\x10\xA1\x2A\x2A\x2A\x2A\x89\x45\xF4\x8B\x4D\xF4\x89\x4D\xF8\x83\x7D\xF8\x00" + } + "g_pGameRules" + { + "library" "server" + "linux" "@g_pGameRules" + } + } + } +} \ No newline at end of file diff --git a/gamedata/sdktools.games/game.zpanic.txt b/gamedata/sdktools.games/game.zpanic.txt new file mode 100644 index 00000000..63a935b7 --- /dev/null +++ b/gamedata/sdktools.games/game.zpanic.txt @@ -0,0 +1,120 @@ +"Games" +{ + /* Zombie Panic! Source 1.2b + * Note: This mod is not fully supported yet. + * The definitions below were supplied by a third party. + * (thanks "noob cannon lol") + */ + "$Zombie Panic! Source" + { + "Offsets" + { + "GiveNamedItem" + { + "windows" "333" + "linux" "334" + } + "RemovePlayerItem" + { + "windows" "230" + "linux" "231" + } + "Weapon_GetSlot" + { + "windows" "226" + "linux" "227" + } + "Ignite" + { + "windows" "190" + "linux" "191" + } + "Extinguish" + { + "windows" "191" + "linux" "192" + } + "Teleport" + { + "windows" "100" + "linux" "101" + } + "CommitSuicide" + { + "windows" "361" + "linux" "362" + } + "GetVelocity" + { + "windows" "128" + "linux" "129" + } + "EyeAngles" + { + "windows" "120" + "linux" "121" + } + "AcceptInput" + { + "windows" "35" + "linux" "36" + } + "DispatchKeyValue" + { + "windows" "31" + "linux" "30" + } + "DispatchKeyValueFloat" + { + "windows" "30" + "linux" "31" + } + "DispatchKeyValueVector" + { + "windows" "29" + "linux" "32" + } + "SetEntityModel" + { + "windows" "25" + "linux" "26" + } + "WeaponEquip" + { + "windows" "219" + "linux" "220" + } + "Activate" + { + "windows" "32" + "linux" "33" + } + } + "Signatures" + { + "CreateGameRulesObject" + { + "library" "server" + "windows" "\x8B\x0D\x2A\x2A\x2A\x2A\x85\xC9\x74\x2A\x8B\x01\x8B\x50\x2C\x6A\x01" + } + "FindEntityByClassname" + { + "library" "server" + "windows" "\x53\x55\x56\x8B\xF1\x8B\x4C\x24\x2A\x2A\x85\xC9\x74\x2A\x8B\x01\x8B\x50\x2A\x2A\x2A\x8B\x00\x25\xFF\x0F\x00\x00\x40\xC1\xC1\xE0\x04\x8B\x2A\x2A\xEB\x2A\x8B\xBE\x2A\x2A\x2A\x2A\x85\xFF\x74\x2A\x8B\x5C\x24\x2A\x8B\x2D\x2A\x2A\x2A\x2A\x8D\xA4\x24\x00\x00\x00\x00\x8B\x37\x85\xF6\x75\x2A\x68\x2A\x2A\x2A\x2A\xFF\x2A\x83\xC4\x2A\xEB\x2A\x39" + "linux" "@_ZN17CGlobalEntityList21FindEntityByClassnameEP11CBaseEntityPKc" + } + "CreateEntityByName" + { + "library" "server" + "linux" "@_Z18CreateEntityByNamePKci" + "windows" "\x56\x8B\x74\x24\x2A\x57\x8B\x7C\x24\x2A\x83\xFE\xFF\x74\x2A\x8B\x0D\x2A\x2A\x2A\x2A\x8B\x01\x8B\x50\x2A\x56\xFF\xD2" + } + "DispatchSpawn" + { + "library" "server" + "linux" "@_Z13DispatchSpawnP11CBaseEntity" + "windows" "\x53\x55\x56\x8B\x74\x24\x10\x2A\x85\xF6\x0F\x84\x2A\x2A\x2A\x2A\x8B\x1D\x2A\x2A\x2A\x2A\x8B\x03\x8B\x50\x60\x8B\xCB" + } + } + } +} \ No newline at end of file diff --git a/gamedata/sdktools.games/master.games.txt b/gamedata/sdktools.games/master.games.txt new file mode 100644 index 00000000..ee480165 --- /dev/null +++ b/gamedata/sdktools.games/master.games.txt @@ -0,0 +1,112 @@ +"Game Master" +{ + "common.games.txt" + { + } + + "engine.l4d.txt" + { + "engine" "left4dead" + } + + "engine.ep2.txt" + { + "engine" "orangebox" + } + + "engine.ep1.txt" + { + "engine" "original" + } + + "game.tf.txt" + { + "game" "tf" + } + + "game.dod.txt" + { + "game" "dod" + } + + "game.cstrike.txt" + { + "game" "cstrike" + } + + "game.hl2mp.txt" + { + "game" "hl2mp" + } + + "game.ship.txt" + { + "game" "ship" + } + + "game.dystopia.txt" + { + "game" "!Dystopia" + } + + "game.insurgency.txt" + { + "game" "insurgency" + } + + "game.pvkii.txt" + { + "game" "pvkii" + } + + "game.ff.txt" + { + "game" "FortressForever" + } + + "game.garrysmod.txt" + { + "engine" "original" + "game" "garrysmod" + } + + "game.empires.txt" + { + "game" "empires" + } + + "game.sourceforts.txt" + { + "game" "sourceforts" + } + + "game.synergy.txt" + { + "game" "synergy" + } + + "game.hidden.txt" + { + "game" "hidden" + } + + "game.zm.txt" + { + "game" "zombie_master" + } + + "game.zpanic.txt" + { + "game" "$Zombie Panic! Source" + } + + "game.obsidian.txt" + { + "game" "obsidian" + } + + "game.aoc.txt" + { + "game" "ageofchivalry" + } +}