← 返回总索引怪物对象字段(数组指针 + 偏移) 2026-09-16-13-19-49\怪物对象字段_数组指针偏移.md
分类:内存逆向与基址定位来源会话:2026-09-16原件:2026-09-16-13-19-49\怪物对象字段_数组指针偏移.md

怪物对象字段(数组指针 + 偏移)— 按 _NPC遍历_被单击 真实代码

数据源:你贴出的 _NPC遍历_被单击 子程序(易语言,本机活游戏实跑代码)。
这是本游戏(D:\rxjh2025,YGOnline.exe 2026-09-14 构建)怪物对象布局的权威值
配套验证脚本:CE_怪物对象字段验证.lua(CE 挂进程跑,输出 rxjh_monsterobj.txt)。
玩家(type 0x31)与怪物(type 0x2E)是不同 C++ 类,字段偏移不通用! 遍历必须先按 +0x08 类型分流。


一、数组指针(同玩家对象数组)

代码逐字:

怪物位置 = 内存_读整数型 (全局_进程句柄, (8000 + x) × 4 + #怪物基址值)

二、怪物对象字段(相对对象指针 怪物位置

偏移(hex) 偏移(dec) 字段 读取方式 来源 状态
+0x08 8 类型(0x2E=怪物) 整数 代码过滤 ==0x2E ✅ 代码
+0x0C 12 怪物ID / 槽位ID 整数 内存_读整数型(ptr+0xC) ✅ 代码(与玩家同偏移)
+0x364 868 名字(BIG5 内联文本) 文本 编码_BIG5到简体(内存_读文本型(ptr+0x364)) ✅ 代码
+0x5F4 1522 当前血 整数 内存_读整数型(ptr+0x5F4) ✅ 代码
+0x5F8 1528 最大血 整数 内存_读整数型(ptr+0x5F8) ✅ 代码
+0x5FC 1532 等级 整数 内存_读整数型(ptr+0x5FC) ✅ 代码
+0x12FC 4860 坐标X(float) 小数 内存_读小数型(ptr+0x107C+0x280) ⚠ 代码注释(待验证)
+0x130C 4876 坐标Y(float) 小数 内存_读小数型(ptr+0x1084+0x288) ⚠ 代码注释(待验证)

坐标说明:代码写成 怪物位置 + 0x107C + 0x280,即 ptr + 0x107C + 0x280 = ptr + 0x12FC(是扁平偏移,非指针链;若是指针链会写成 读整数(ptr+0x107C)+0x280)。故坐标 X = ptr+0x12FC,Y = ptr+0x130C


三、⚠ 玩家 vs 怪物 布局对照(同数组、不同类,偏移完全不同)

字段 玩家(type 0x31) 怪物(type 0x2E)
名字 +0x18 +0x364
ID/槽位 +0x0C +0x0C(相同)
当前血 +0x74 +0x5F4
最大血 +0x78 +0x5F8
等级 +0x2780 +0x5FC
坐标X +0x1F84 +0x12FC
坐标Y +0x1F8C +0x130C
类型 +0x08(值 0x31) +0x08(值 0x2E)

结论:数组叫"对象数组"但玩家/怪物是不同结构。不能把玩家的 +0x74 血 / +0x18 名 / +0x2780 等级套到怪物上,反之亦然。遍历时务必先按 +0x08 分流。


四、⚠ 与 31007 / 早期分析旧值的冲突(旧值作废)

字段 旧记值 本版本真实(代码) 结论
怪名字 +0x18(误,那是玩家)/ +0x360(旧记) +0x364 旧错;0x360 可能是 4 字节长度前缀
怪当前血 +0x5F8(误标"当前") +0x5F4(当前)/ +0x5F8(最大) 旧错,以代码为准
怪等级 +0x5FC +0x5FC ✅ 一致
怪坐标 0x1078 / 0x1080 +0x12FC / +0x130C 旧错,以代码(0x107C+0x280)为准

未在 _NPC遍历_被单击 内出现的旧记字段,仍待验证:距离 +0x35C、怪编号 +0x3B0


五、验证用法(CE)

  1. CE 打开 D:\rxjh2025\client\YGOnline.exe → 内存浏览器 → Lua 引擎 → 执行 CE_怪物对象字段验证.lua
  2. C:\Users\Administrator\rxjh_monsterobj.txt:每只 type=0x2E 对象打印 名字@0x364 / 名字@0x360(对照) / 等级 / 当前血 / 最大血 / 坐标X / 坐标Y
  3. 选一只怪物,核对 名字 / 等级 / 当前血 / 最大血 与游戏内一致 → 偏移坐实;坐标(注释)也一并看是否出合理浮点。
  4. 把 txt 发我,我把 ✅ 固化进总表和 常量.e.txt