|
本帖最后由 真会走路的废柴 于 2011-12-3 14:59 编辑
帖子兼顾答疑,有问题跟帖或者是PM我皆可
在外面电脑上写的 ,代码部分比较乱 凑合看吧
这里主要介绍OBJ的数据结构,包含了 物品 包裹 UNIT PLAYER 等
首先 这个OBJ的结构是什么样子的呢,他的地址构成是怎么样的呢,看下例
$OBJManager 这个是OBJ管理的入口地址
$FirstObj 这个是第一个OBJ的偏移地址
$NextObj 这个是下一个OBJ的偏移地址
那么
$OBj = _BMREADMEMORY($wow_Hwnd,$OBJManager,"PTR")
上句得到了OBJMANAGE结构的入口
$Current= _BMREADMEMORY($wow_Hwnd,$OBj + $FirstObj,"PTR")
上句得到了 OBJMANAGE结构中 的第一个OBJ元素
$NEXT = _BMREADMEMORY($wow_Hwnd,$Current+ $NextObj ,"PTR")
上句得到了 OBJMANAGE结构中的 下一个元素
结构中第一个元素的地址是由入口地址偏移一个第一个OBJ地址得到
然后下面的每个元素都是上一个元素 偏移一个 $NextObj 的地址得到
这里得到的$Current,$NEXT 都是各个元素的基址
下面我们如何得知这个元素是哪种类型(物品,玩家,NPC,包裹等)
这里我们需要用到一个 偏移地址 $OBJTYPE
$TYPE = _BMREADMEMORY($wow_Hwnd,$Current+$OBJTYPE,"int")
这里计算得到的$TYPE就是该元素的类型 ,1代表物品,2代表容器,3表示是NPC,怪物等UNIT,4表示是其他玩家,5表示是动态物品(邮箱这种类型的)
$TYPE类型共计 1,2,3,4,5,6,7 7种类型
那么完整代码如下
local $Obj = _bmreadmemory($wow_hwnd,$OBJManager,"PTR")
local $Current = _bmreadmemory($wow_hwnd,$Obj+$FirstObj ,"PTR")
while 1
local $Type = _bmreadmemory($wow_hwnd,$Current +$OBJTYPE,"INT")
switch $Type
case 1
return "物品"
case 2
return "容器"
case 3
......
case else
exitloop
endswitch
local $Next = _bmreadmemory($wow_hwnd,$Current +$NextObj ,"PTR")
if $Next = $Current or $Next <= 0 then ;这里表示结构树已经结束了
exitloop
else
$Current = $next
endif
wend
以上是OBJ的结构树类型。
下面将用具体的代码示例来表示结构树中包含的数据信息
我们现在来尝试读取 某个NPC的一些信息
包含了 血量 $Unit_Hp,最大血量$Unit_Hp_Max,坐标,$Unit_X,$Unit_Y,$Unit_Z, 方向$Unit_R
那么结构是什么样子的呢
$Hp = _bmreadmemory($wow_hwnd, _bmreadmemory($wow_hwnd,$Current+$Info_Table,"ptr")+$Unit_Hp ,"int")
血量等信息 他是存储在一个 INFO_TABLE的表中,这个表里面包含了这个UNIT的所有的 “描述” 这个描述信息包含了哪些内容稍后介绍
$X = _bmreadmemory($wow_hwnd,$Current+$Unit_X,"float")
坐标这个信息 他是直接由基址+ 偏移得到的 而没有存储在描述表中,因为坐标这个信息并不属于描述结构
这里要注意的是 值的类型,血量和最大血量等 他是一个 INT类型 而坐标一般都是 FLOAT 浮点类型。而GUID等一般都是一个 UINT64 的64位长整数类型。
果然在外面 手里没有系统的代码 写起来都比较麻烦 |
|