5,7地面物品

通过人物到地面物品的距离 来查找
       
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;
 
 




附件列表

     

    posted @ 2012-05-26 08:39  XE2011  阅读(553)  评论(0编辑  收藏  举报