HOOZi文档
Skip to content

offsets

具名游戏偏移表。把 dumper 的全量偏移输出灌成一张嵌套全局表,配合实体 .base(见 game)和 memread/write 自助读写任意属性——不用硬编码魔数,且随游戏更新自动同步(偏移变了重 dump,表跟着变)。

lua
local lp  = game.localplayer
local off = offsets.RecvTable.DT_Player.m_iHealth   -- 0x324,具名取,不写死
local hp  = mem.read_i32(lp.self_base + off)

访问形态

按 dumper 的 section / subsection 两级分组:

lua
offsets[section][key]              -- subsection 为空(如 Buttons / Mics / Globals)
offsets[section][subsection][key]  -- subsection 非空(如 RecvTable / dataMap / ClientClass)

例:

lua
offsets.RecvTable.DT_Player.m_iHealth     -- 实体网络字段
offsets.dataMap.CBaseGrenade.m_flDamage   -- dataMap 字段
offsets.Mics["CPlayer!camera_angles"]     -- key 含特殊字符用方括号
offsets.Buttons["+attack"]                -- 按钮命令地址

值是 uint64(地址或类内偏移)。所有值都在 Lua number 的精确整数范围内,无精度损失。

offsets.find(section, subsection, key) → uint64 | nil

动态查找,key 由运行时拼出时用(嵌套表只能写死路径)。subsection 为空段传 ""。查不到返 nil

别每帧调 —— find 是全表线性扫(9551 条)。能写死路径就用嵌套表 offsets[section][sub][key](O(1));find 只在 key 运行时拼出且仅初始化期算一次的冷路径用。

lua
local function health_off(dt)            -- dt 运行时决定
    return offsets.find("RecvTable", dt, "m_iHealth")
end

section 速览

dumper 输出的主要分组(条目数随版本浮动):

section内容直接 base + off 读?
RecvTable实体网络字段(DT_Player / DT_AI_BaseNPC / ...)多数可,见下方告诫
dataMap服务端 datamap 字段(CBaseGrenade / ...)多数可
Mics手工维护的杂项偏移(camera_angles / studio hdr / ...)已验证,可放心用
Buttons按钮命令(+attack / +jump / ...)地址是绝对地址,直接读
Convars / ConCommandsconvar / 命令对象地址绝对地址
WeaponSettings / Globals / ClientClass其余引擎结构视字段而定

丑话:偏移不保证 = 真实内存布局

  • RecvTable 段是网络包字段偏移。绝大多数等于真实类内内存偏移、能直接 base + off 读,但不保证每个都对——和内部 C++ 改偏移前要实测是同一条规矩。读出来的值不合理时,先怀疑这个偏移不是内存布局偏移。
  • Mics 段是已人工验证的那批,最稳。
  • 偏移随游戏大更新会漂。这张表跟 dumper 同步,但你写死的"base + 某偏移 代表某语义"的逻辑可能因结构变化失效。
  • 写侧加倍小心:读偏移读错只是拿到垃圾值,写错可直接崩游戏(见 mem 的写危险告诫)。

自动清理

offsets 是只读静态表,不持有任何资源,无需清理。