offsets
具名游戏偏移表。把 dumper 的全量偏移输出灌成一张嵌套全局表,配合实体 .base(见 game)和 mem 的 read/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")
endsection 速览
dumper 输出的主要分组(条目数随版本浮动):
| section | 内容 | 直接 base + off 读? |
|---|---|---|
RecvTable | 实体网络字段(DT_Player / DT_AI_BaseNPC / ...) | 多数可,见下方告诫 |
dataMap | 服务端 datamap 字段(CBaseGrenade / ...) | 多数可 |
Mics | 手工维护的杂项偏移(camera_angles / studio hdr / ...) | 已验证,可放心用 |
Buttons | 按钮命令(+attack / +jump / ...)地址 | 是绝对地址,直接读 |
Convars / ConCommands | convar / 命令对象地址 | 绝对地址 |
WeaponSettings / Globals / ClientClass 等 | 其余引擎结构 | 视字段而定 |
丑话:偏移不保证 = 真实内存布局
RecvTable段是网络包字段偏移。绝大多数等于真实类内内存偏移、能直接base + off读,但不保证每个都对——和内部 C++ 改偏移前要实测是同一条规矩。读出来的值不合理时,先怀疑这个偏移不是内存布局偏移。Mics段是已人工验证的那批,最稳。- 偏移随游戏大更新会漂。这张表跟 dumper 同步,但你写死的"
base + 某偏移代表某语义"的逻辑可能因结构变化失效。 - 写侧加倍小心:读偏移读错只是拿到垃圾值,写错可直接崩游戏(见 mem 的写危险告诫)。
自动清理
offsets 是只读静态表,不持有任何资源,无需清理。