通过人物到地面物品的距离 来查找
1 初始化数值搜索,float类型的
2 往物品靠近 搜索减少的数值
3 远离这个物品 搜索增加的数值
4 人物没动 搜索没改变的数值
5 重复搜索步骤2,3,4
人物站长物品的中间应该 距离数值应该是0点几
最后找到了2个结果
把鼠标放到物品上出现其他 数据
EBX=0A2DF490
EDX=14B8FC60不出现数据时把鼠标往物品上一放
EAX=0D959EB8,EDX=14B8FC60,这个EDX的值和上面的EDX是一样的,所以搜索EAX
EDX=09AD9208,这个时候游戏非常卡,游戏容易崩溃,把鼠标往物品上一放,选择最后出现的
EAX=00F06F38
ECX=046D3768
ESI=00925468
EAX=00924E0C
edx=0D95A240-0D959EB8=388
此时人物与老树根的距离=[[[[[[[00924E0C]+1C]+08]+28]+18]+388]+04]+158
物品名称
老树根=[[[[[[[[924e0c]+1C]+8]+28]+18]+388]+4]+164]+0
其他偏移 用MemView(结构化内存监视器)遍历出来
00925484=[[00924E0C]+1C]
[[[[00924E0C]+1C]+08]+28]
+14 地面物品数量
+20 地面物品最大数组
物品对象指针=[地面物品列表基址]+04
[+164]+0 名称
+110 ID号
+154 距离
+3C 坐标X
+44 坐标Y
+40 坐标Z
//
{此段代码需要hook的支持}
/// <summary>
/// {人物是在游戏当中还是小退}
/// </summary>
function InGame():Boolean;
var gameretn:DWORD;
begin
asm
mov eax,[$00924D48]
mov gameretn,eax
end;
if gameretn=0 then Result:=true{在游戏当中}
else if gameretn>=1 then Result:=False; {人物在角色选择界面}
end;
procedure TForm1.Button1Click(Sender: TObject);
/// <summary>
/// 地面物品
/// </summary>
{
}
var
I :Integer;
pGds :PDWORD;
gdsTmp :DWORD;
Gds_id :PDWORD;{物品ID}
Gds_sysId :PDWORD;{系统ID}
Gds_amount :pDWORD;{物品数量}
Gds_distance :PSingle;{距离}
Gds_name :PDWORD;{名称}
Gds_name1 :PWideChar;
Gds_px :single;
Gds_py :single;
Gds_pz :single;
Gds_posx :pSingle; {坐标X}
Gds_posy :pSingle; {坐标y}
Gds_posz :pSingle; {坐标z}
begin
if InGame=False then Exit;
asm
mov eax,[$924E0C]
mov eax,[eax+$1c]
mov eax,[eax+$8]
mov eax,[eax+$28]
mov ecx,[eax+$18]
mov gdsTmp,ecx
end;
Memo1.clear;
for I:=0 to 768 do
begin
pGds:=pointer(gdsTmp+I*4);
if pGds^>0 then
begin
pGds :=Pointer(pGds^+$4);
Gds_id :=Pointer(pGds^+$110);
Gds_sysId :=Pointer(pGds^+$10C);
Gds_name :=Pointer(pGds^+$164);
Gds_name1 :=Pointer(Gds_name^+$0);
Gds_distance:=Pointer(pGds^+$154);
Gds_posx :=Pointer(pGds^+$3C);
Gds_posy :=Pointer(pGds^+$44);
Gds_posz :=Pointer(pGds^+$40);
Gds_px :=round(Gds_posx^/10+400); //x坐=取整数部分(坐标/10)+400
Gds_py :=round(Gds_posy^/10+550); //Y坐标=取整数部分(坐标/10)+550
Gds_pz :=round(Gds_posz^/10); //z坐标=取整数部分(坐标/10)
memo1.lines.add(Format(' 物品ID %4x 系统ID %x 坐标 %.f,%.f,%.f ↑ 距离 %5f %s',[Gds_id^,Gds_sysId^,Gds_px,Gds_py,Gds_pz,Gds_distance^,Gds_name1]));
end;
end;
Memo1.Hint:=Memo1.Text;
end;
/// <summary>
/// {人物是在游戏当中还是小退}
/// </summary>
function InGame():Boolean;
var gameretn:DWORD;
begin
asm
mov eax,[$00924D48]
mov gameretn,eax
end;
if gameretn=0 then Result:=true{在游戏当中}
else if gameretn>=1 then Result:=False; {人物在角色选择界面}
end;
procedure TForm1.Button1Click(Sender: TObject);
/// <summary>
/// 地面物品
/// </summary>
{
}
var
I :Integer;
pGds :PDWORD;
gdsTmp :DWORD;
Gds_id :PDWORD;{物品ID}
Gds_sysId :PDWORD;{系统ID}
Gds_amount :pDWORD;{物品数量}
Gds_distance :PSingle;{距离}
Gds_name :PDWORD;{名称}
Gds_name1 :PWideChar;
Gds_px :single;
Gds_py :single;
Gds_pz :single;
Gds_posx :pSingle; {坐标X}
Gds_posy :pSingle; {坐标y}
Gds_posz :pSingle; {坐标z}
begin
if InGame=False then Exit;
asm
mov eax,[$924E0C]
mov eax,[eax+$1c]
mov eax,[eax+$8]
mov eax,[eax+$28]
mov ecx,[eax+$18]
mov gdsTmp,ecx
end;
Memo1.clear;
for I:=0 to 768 do
begin
pGds:=pointer(gdsTmp+I*4);
if pGds^>0 then
begin
pGds :=Pointer(pGds^+$4);
Gds_id :=Pointer(pGds^+$110);
Gds_sysId :=Pointer(pGds^+$10C);
Gds_name :=Pointer(pGds^+$164);
Gds_name1 :=Pointer(Gds_name^+$0);
Gds_distance:=Pointer(pGds^+$154);
Gds_posx :=Pointer(pGds^+$3C);
Gds_posy :=Pointer(pGds^+$44);
Gds_posz :=Pointer(pGds^+$40);
Gds_px :=round(Gds_posx^/10+400); //x坐=取整数部分(坐标/10)+400
Gds_py :=round(Gds_posy^/10+550); //Y坐标=取整数部分(坐标/10)+550
Gds_pz :=round(Gds_posz^/10); //z坐标=取整数部分(坐标/10)
memo1.lines.add(Format(' 物品ID %4x 系统ID %x 坐标 %.f,%.f,%.f ↑ 距离 %5f %s',[Gds_id^,Gds_sysId^,Gds_px,Gds_py,Gds_pz,Gds_distance^,Gds_name1]));
end;
end;
Memo1.Hint:=Memo1.Text;
end;