//--------------------------------------------------------------------------------- // Purpose: returns the specified prop from the class and table provided. // if prop or table not found, pointer returns NULL //--------------------------------------------------------------------------------- SendProp *GetPropFromClassAndTable(const char *szClassName, const char *szTableName, const char *szPropName) { ServerClass *pServerClass = pServerDLL->GetAllServerClasses(); if (!pServerClass) { Warning("servergamedll->GetAllServerClasses() returned null\n"); return NULL; } while (pServerClass) { if ( FStrEq(szClassName, pServerClass->GetName()) ) { SendTable *pTable = GetDataTable( szTableName, pServerClass->m_pTable ); if (pTable) { int numprops = pTable->GetNumProps(); for (int i = 0; i < numprops; ++i) { SendProp *pProp = pTable->GetProp(i); if (pProp && FStrEq(szPropName, pProp->GetName()) ) { return pProp; } } } } pServerClass = pServerClass->m_pNext; } Warning("prop %s not found in %s => %s\n", szPropName, szClassName, szTableName); return NULL; }
//--------------------------------------------------------------------------------- // Purpose: returns the specified prop offset relative to the table provided. // if offset or table not found, bErr returns true and offset returned is 0 //--------------------------------------------------------------------------------- unsigned int GetPropOffsetFromTable(const char *pTableName, const char *pPropName) { ServerClass *pClass = pServerDLL->GetAllServerClasses(); if (!pClass) { Warning("servergamedll->GetAllServerClasses() returned null\n"); return 0; } while (pClass) { SendTable *pTable = GetDataTable( pTableName, pClass->m_pTable ); if (pTable == NULL) { pClass = pClass->m_pNext; continue; } int num = pTable->GetNumProps(); for (int i = 0; i < num; i++) { SendProp *pProp = pTable->GetProp(i); if ( FStrEq( pPropName, pProp->GetName() ) ) { return pProp->GetOffset(); } } pClass = pClass->m_pNext; } Warning("prop %s not found in %s or table name incorrect\n", pPropName, pTableName); return 0; }
//--------------------------------------------------------------------------------- // Purpose: used by the GetPropOffsetFromTable func to get a specific table //--------------------------------------------------------------------------------- SendTable *GetDataTable( const char *pTableName, SendTable *pTable ) { if (!pTable) return NULL; if ( FStrEq( pTableName, pTable->GetName() ) ) return pTable; int num = pTable->GetNumProps(); for (int i = 0; i < num; i++) { SendProp *pProp = pTable->GetProp(i); if (pProp) { SendTable *pSubTable = GetDataTable( pTableName, pProp->GetDataTable() ); if (pSubTable == NULL) continue; if ( FStrEq(pSubTable->GetName(), pTableName) ) return pSubTable; } } return NULL; }
void GameRulesHelper::OnServerActivated() { printf("Doin stuf\n"); m_pGameRulesProxy = UTIL_FindEntityByClassname(nullptr, "dota_gamerules"); m_pGameManagerProxy = UTIL_FindEntityByClassname(nullptr, "dota_gamemanager"); auto *pSendTable = ((IServerUnknown *) m_pGameRulesProxy)->GetNetworkable()->GetServerClass()->m_pTable; auto *pManagerSendTable = ((IServerUnknown *)m_pGameManagerProxy)->GetNetworkable()->GetServerClass()->m_pTable; if (!s_bHaveOffsets) { m_Offsets.m_nSeriesType = UTIL_FindInSendTable(pSendTable, "m_nSeriesType"); m_Offsets.m_nRadiantSeriesWins = UTIL_FindInSendTable(pSendTable, "m_nRadiantSeriesWins"); m_Offsets.m_nDireSeriesWins = UTIL_FindInSendTable(pSendTable, "m_nDireSeriesWins"); m_Offsets.m_nGameState = UTIL_FindInSendTable(pSendTable, "m_nGameState"); m_Offsets.m_fGameTime = UTIL_FindInSendTable(pSendTable, "m_fGameTime"); m_Offsets.m_nGGTeam = UTIL_FindInSendTable(pSendTable, "m_nGGTeam"); m_Offsets.m_flGGEndsAtTime = UTIL_FindInSendTable(pSendTable, "m_flGGEndsAtTime"); m_Offsets.m_iGameMode = UTIL_FindInSendTable(pSendTable, "m_iGameMode"); m_Offsets.m_bGamePaused = UTIL_FindInSendTable(pSendTable, "m_bGamePaused"); m_Offsets.m_iPauseTeam = UTIL_FindInSendTable(pSendTable, "m_iPauseTeam"); m_Offsets.m_StableHeroAvailable = UTIL_FindInSendTable(pManagerSendTable, "m_StableHeroAvailable"); m_Offsets.m_CurrentHeroAvailable = UTIL_FindInSendTable(pManagerSendTable, "m_CurrentHeroAvailable"); m_Offsets.m_CulledHeroes = UTIL_FindInSendTable(pManagerSendTable, "m_CulledHeroes"); s_bHaveOffsets = true; } m_pGameRules = nullptr; m_pGameManager = nullptr; for (int i = 0; i < pSendTable->GetNumProps(); i++) { auto pProp = pSendTable->GetProp(i); if (pProp->GetDataTable() && !Q_strcmp("dota_gamerules_data", pProp->GetName())) { auto proxyFn = pProp->GetDataTableProxyFn(); if (proxyFn) { CSendProxyRecipients recp; m_pGameRules = proxyFn(NULL, NULL, NULL, &recp, 0); } break; } } for (int i = 0; i < pManagerSendTable->GetNumProps(); i++) { auto pProp = pManagerSendTable->GetProp(i); if (pProp->GetDataTable() && !Q_strcmp("dota_gamemanager_data", pProp->GetName())) { auto proxyFn = pProp->GetDataTableProxyFn(); if (proxyFn) { CSendProxyRecipients recp; m_pGameManager = proxyFn(NULL, NULL, NULL, &recp, 0); printf("Manager name: %d\n", m_pGameManager); } break; } } const char *pszBannedHeroes = CommandLine()->ParmValue("-d2bannedheroes", ""); if (pszBannedHeroes && pszBannedHeroes[0]) { V_SplitString(pszBannedHeroes, ",", bannedHeroes); } BanThem(); }