offsets
Named game-offset table. The dumper's full offset output is loaded into one nested global table — combine it with entity .base (see game) and mem read/write to self-service read/write any attribute, without hardcoding magic numbers, and it auto-syncs with game updates (re-dump on an offset change and the table follows).
local lp = game.localplayer
local off = offsets.RecvTable.DT_Player.m_iHealth -- 0x324, named lookup, not hardcoded
local hp = mem.read_i32(lp.self_base + off)Access shape
Grouped by the dumper's two levels of section / subsection:
offsets[section][key] -- subsection empty (e.g. Buttons / Mics / Globals)
offsets[section][subsection][key] -- subsection present (e.g. RecvTable / dataMap / ClientClass)Examples:
offsets.RecvTable.DT_Player.m_iHealth -- entity network field
offsets.dataMap.CBaseGrenade.m_flDamage -- dataMap field
offsets.Mics["CPlayer!camera_angles"] -- bracket form for keys with special chars
offsets.Buttons["+attack"] -- button command addressValues are uint64 (addresses or in-class offsets). All values fit within Lua's exact-integer range — no precision loss.
offsets.find(section, subsection, key) → uint64 | nil
Dynamic lookup, for when the key is built at runtime (the nested table only takes literal paths). Pass "" for an empty subsection. Returns nil on miss.
Don't call it per-frame —
findis a full linear scan (9551 entries). When you can write a literal path, use the nested tableoffsets[section][sub][key](O(1)); reservefindfor cold paths where the key is built at runtime and resolved once at init.
local function health_off(dt) -- dt decided at runtime
return offsets.find("RecvTable", dt, "m_iHealth")
endSection overview
The dumper's main groups (entry counts drift across versions):
| section | Contents | Direct base + off read? |
|---|---|---|
RecvTable | Entity network fields (DT_Player / DT_AI_BaseNPC / ...) | Mostly yes — see caveat below |
dataMap | Server datamap fields (CBaseGrenade / ...) | Mostly yes |
Mics | Hand-maintained misc offsets (camera_angles / studio hdr / ...) | Verified — safe to use |
Buttons | Button command (+attack / +jump / ...) addresses | Absolute addresses, read directly |
Convars / ConCommands | convar / command object addresses | Absolute addresses |
WeaponSettings / Globals / ClientClass etc. | Other engine structures | Field-dependent |
The catch: offsets are not guaranteed to equal real memory layout
- The
RecvTablesection holds network-packet field offsets. Most equal the real in-class memory offset and read fine viabase + off, but not every one is guaranteed — same rule as the internal C++ side verifying before relying on an offset. When a read returns nonsense, first suspect that the offset isn't a memory-layout offset. - The
Micssection is the hand-verified batch — most reliable. - Offsets drift across major game updates. This table syncs with the dumper, but your hardcoded "
base + some offsetmeans this semantic" logic can break when the structure changes. - Double caution on writes: a wrong read offset just yields a garbage value; a wrong write can crash the game (see the write warning in mem).
Auto-cleanup
offsets is a read-only static table holding no resources — nothing to clean up.