HOOZiDocs
Skip to content

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).

lua
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:

lua
offsets[section][key]              -- subsection empty (e.g. Buttons / Mics / Globals)
offsets[section][subsection][key]  -- subsection present (e.g. RecvTable / dataMap / ClientClass)

Examples:

lua
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 address

Values 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-framefind is a full linear scan (9551 entries). When you can write a literal path, use the nested table offsets[section][sub][key] (O(1)); reserve find for cold paths where the key is built at runtime and resolved once at init.

lua
local function health_off(dt)            -- dt decided at runtime
    return offsets.find("RecvTable", dt, "m_iHealth")
end

Section overview

The dumper's main groups (entry counts drift across versions):

sectionContentsDirect base + off read?
RecvTableEntity network fields (DT_Player / DT_AI_BaseNPC / ...)Mostly yes — see caveat below
dataMapServer datamap fields (CBaseGrenade / ...)Mostly yes
MicsHand-maintained misc offsets (camera_angles / studio hdr / ...)Verified — safe to use
ButtonsButton command (+attack / +jump / ...) addressesAbsolute addresses, read directly
Convars / ConCommandsconvar / command object addressesAbsolute addresses
WeaponSettings / Globals / ClientClass etc.Other engine structuresField-dependent

The catch: offsets are not guaranteed to equal real memory layout

  • The RecvTable section holds network-packet field offsets. Most equal the real in-class memory offset and read fine via base + 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 Mics section is the hand-verified batch — most reliable.
  • Offsets drift across major game updates. This table syncs with the dumper, but your hardcoded "base + some offset means 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.