int g_nHealthOffset = 0; void UTIL_SetHealth(edict_t *pEntity, int hp) { if (!g_nHealthOffset) return; *(int *)(pEntity->GetUnknown() + g_nHealthOffset) = hp; pEntity->m_fStateFlags |= FL_EDICT_CHANGED; } int UTIL_FindOffset(char *ClassName, char *Property) { ServerClass *sc = serverdll->GetAllServerClasses(); while (sc) { if (strcmp(sc->GetName(), ClassName) == 0) { int NumProps = sc->m_pTable->GetNumProps(); for (int i = 0; i < NumProps; i++) { if (strcmp(sc->m_pTable->GetProp(i)->GetName(), Property) == 0) { return sc->m_pTable->GetProp(i)->GetOffset() / 4; } } return 0; } sc = sc->m_pNext; } return 0; } // Run this in CPluginClass::Load void UTIL_PrecacheOffsets() { g_nHealthOffset = UTIL_FindOffset("CBasePlayer", "m_iHealth"); } void UTIL_DumpOffsets() { FILE *fp = fopen("offsets.txt","w"); if (!fp) return; ServerClass *sc = serverdll->GetAllServerClasses(); while (sc) { int NumProps = sc->m_pTable->GetNumProps(); fprintf(fp, "%s\n", sc->m_pTable->GetName()); for (int i = 0; i < NumProps; i++) { SendProp *prop = sc->m_pTable->GetProp(i); if (prop) fprintf(fp, " %5d %s\n", prop->GetOffset() / 4, prop->GetName()); } sc = sc->m_pNext; } fclose(fp); }