1 范围___
2 跑去挖
{此段代码需要hook的支持}
/// <summary>
/// 挖矿
/// </summary>
/// <param name="_EDX">矿铲所在包裹的位置/param>
/// <param name="_ECX">地面系统物品ID/param>
procedure wakuang(_EDX:DWORD;_ECX:DWORD);
begin
ASM
PUSH 0
PUSH $0C01 //矿产ID号
PUSH _EDX // 包裹ID号(矿铲所在包裹的位置)
PUSH 0
PUSH _ECX //石矿 地面系统物品ID EDX=00000000
MOV EBX,$005A73A0
CALL EBX
ADD ESP,$14
END;
end;
{此段代码需要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);
{采集材料,需要排序否则程序挖的不是最近那个和 和选怪一样 捡物}
var
I:Integer;
L:Integer;
pGds :PDWORD;
gdsTmp :DWORD;
Gds_id1 :PDWORD;
Gds_id2 :PDWORD;
Gds_distance :PSingle;
Gds_name :PDWORD;
Gds_name1 :PWideChar;
gds_posx :PSingle;
gds_posy :PSingle;
gds_posz :PSingle;
Gds_A_B :Single;
Gds_id1tmp :DWORD;
Gds_id2tmp :DWORD;
Gds_distance0 :PSingle;
Gds_id3 :PDWORD;//
Gds_id3tmp :DWORD;//用于挖框
Gds_distance2 :Single; //用于挖框
Gds_distance1 :Single;
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;
for I:=0 to 768 do
begin
pGds:=pointer(gdsTmp+I*4);
if pGds^>0 then
begin
pGds :=Pointer(pGds^+$4);
Gds_id3 :=Pointer(pGds^+$10C); {系统物品ID}
Gds_name :=Pointer(pGds^+$164);
Gds_name1 :=Pointer(Gds_name^);
Gds_distance :=Pointer(pGds^+$154);
for L:=0 to ListBox1.Count-1 do {}
begin {}
if Gds_name1<>ListBox1.Items[L] then continue;
Gds_id3tmp:=Gds_id3^;
Gds_distance1:=Gds_distance^;
// Memo1.Lines.Add(Format('%x',[Gds_id3tmp]));
end;
end;
end;
if Gds_distance1<=8 then wakuang(pckId,Gds_id3tmp);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
{返回 矿铲 所在包裹的ID号}
var
I: Integer;
packsack :PDWORD;
pckTmp :DWORD;
pck_amount:DWORD;
pck_kind :PDWORD;
pckObjId :PDWORD;
pck_name :PDWORD;
pck_name1 :PWideChar;
begin
if InGame=False then Exit;
asm
mov eax,[$924E0C]
mov eax,[eax+$1c]
mov eax,[eax+$20]
mov eax,[eax+$b4c]
mov ecx,[eax+$10]
mov pck_amount,ecx//
mov ecx,[eax+$c]
mov pckTmp,ecx //
end;
for I := 0 to pck_amount - 1 do
begin
packsack := pointer(pckTmp + I*4);
pck_kind := Pointer(packsack^ + $4);
pckObjId := Pointer(packsack^ + $8);
if packsack^ > 0 then
begin
if pckObjId^ = $C01 then pckId:=I;{返回 矿铲 所在包裹的ID号} {pckID需要公共声明}
{如果包里没有发现矿铲,...}
end;
end;
end;
/// <summary>
/// 挖矿
/// </summary>
/// <param name="_EDX">矿铲所在包裹的位置/param>
/// <param name="_ECX">地面系统物品ID/param>
procedure wakuang(_EDX:DWORD;_ECX:DWORD);
begin
ASM
PUSH 0
PUSH $0C01 //矿产ID号
PUSH _EDX // 包裹ID号(矿铲所在包裹的位置)
PUSH 0
PUSH _ECX //石矿 地面系统物品ID EDX=00000000
MOV EBX,$005A73A0
CALL EBX
ADD ESP,$14
END;
end;
{此段代码需要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);
{采集材料,需要排序否则程序挖的不是最近那个和 和选怪一样 捡物}
var
I:Integer;
L:Integer;
pGds :PDWORD;
gdsTmp :DWORD;
Gds_id1 :PDWORD;
Gds_id2 :PDWORD;
Gds_distance :PSingle;
Gds_name :PDWORD;
Gds_name1 :PWideChar;
gds_posx :PSingle;
gds_posy :PSingle;
gds_posz :PSingle;
Gds_A_B :Single;
Gds_id1tmp :DWORD;
Gds_id2tmp :DWORD;
Gds_distance0 :PSingle;
Gds_id3 :PDWORD;//
Gds_id3tmp :DWORD;//用于挖框
Gds_distance2 :Single; //用于挖框
Gds_distance1 :Single;
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;
for I:=0 to 768 do
begin
pGds:=pointer(gdsTmp+I*4);
if pGds^>0 then
begin
pGds :=Pointer(pGds^+$4);
Gds_id3 :=Pointer(pGds^+$10C); {系统物品ID}
Gds_name :=Pointer(pGds^+$164);
Gds_name1 :=Pointer(Gds_name^);
Gds_distance :=Pointer(pGds^+$154);
for L:=0 to ListBox1.Count-1 do {}
begin {}
if Gds_name1<>ListBox1.Items[L] then continue;
Gds_id3tmp:=Gds_id3^;
Gds_distance1:=Gds_distance^;
// Memo1.Lines.Add(Format('%x',[Gds_id3tmp]));
end;
end;
end;
if Gds_distance1<=8 then wakuang(pckId,Gds_id3tmp);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
{返回 矿铲 所在包裹的ID号}
var
I: Integer;
packsack :PDWORD;
pckTmp :DWORD;
pck_amount:DWORD;
pck_kind :PDWORD;
pckObjId :PDWORD;
pck_name :PDWORD;
pck_name1 :PWideChar;
begin
if InGame=False then Exit;
asm
mov eax,[$924E0C]
mov eax,[eax+$1c]
mov eax,[eax+$20]
mov eax,[eax+$b4c]
mov ecx,[eax+$10]
mov pck_amount,ecx//
mov ecx,[eax+$c]
mov pckTmp,ecx //
end;
for I := 0 to pck_amount - 1 do
begin
packsack := pointer(pckTmp + I*4);
pck_kind := Pointer(packsack^ + $4);
pckObjId := Pointer(packsack^ + $8);
if packsack^ > 0 then
begin
if pckObjId^ = $C01 then pckId:=I;{返回 矿铲 所在包裹的ID号} {pckID需要公共声明}
{如果包里没有发现矿铲,...}
end;
end;
end;