

/// <summary>
/// 吃红/蓝
/// </summary>
/// <param name="objType">物品类型/param>
/// <param name="packId">包裹ID号/param>
procedure RecoverMe(objType:DWORD;packId:Integer);//吃红/蓝
/// 使用药水的条件
/// 1 checkbox.checked
/// 1 HPmin<=编辑框
/// 2 Hpmin>0人物没有死亡 // if role_MpMin=0 then Exit;
/// 3 药品冷却时间=0
begin
ASM
PUSH 1
PUSH objType {EDX=包裹里的物品的类型}
PUSH packId {EAX背包格子ID号}
PUSH 0
MOV ECX,[$924e0c]
MOV ECX,[ECX+$20]
LEA ECX,[ECX+$0EC]
MOV EBX,$00582E70
CALL EBX
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;
I1:Integer;
_idtmp :DWORD;
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);
if packsack^ > 0 then //当对象数组列表不为0的时候才添加
begin
if pck_kind^ <> 9 then Continue; {9=药水类}
pckObjId := Pointer(packsack^+$8);
pck_name := Pointer(packsack^ + $54);
pck_name1 := Pointer(pck_name^ + $C);
if (pck_name1<>'大瓶活血散') then Continue; {ComboBox_MP.Text}
_idtmp:=pckObjId^;
I1:=i; {红,蓝所在的包裹位置}
end;
end;
RecoverMe(_idtmp,I1);
end;
/// 吃红/蓝
/// </summary>
/// <param name="objType">物品类型/param>
/// <param name="packId">包裹ID号/param>
procedure RecoverMe(objType:DWORD;packId:Integer);//吃红/蓝
/// 使用药水的条件
/// 1 checkbox.checked
/// 1 HPmin<=编辑框
/// 2 Hpmin>0人物没有死亡 // if role_MpMin=0 then Exit;
/// 3 药品冷却时间=0
begin
ASM
PUSH 1
PUSH objType {EDX=包裹里的物品的类型}
PUSH packId {EAX背包格子ID号}
PUSH 0
MOV ECX,[$924e0c]
MOV ECX,[ECX+$20]
LEA ECX,[ECX+$0EC]
MOV EBX,$00582E70
CALL EBX
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;
I1:Integer;
_idtmp :DWORD;
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);
if packsack^ > 0 then //当对象数组列表不为0的时候才添加
begin
if pck_kind^ <> 9 then Continue; {9=药水类}
pckObjId := Pointer(packsack^+$8);
pck_name := Pointer(packsack^ + $54);
pck_name1 := Pointer(pck_name^ + $C);
if (pck_name1<>'大瓶活血散') then Continue; {ComboBox_MP.Text}
_idtmp:=pckObjId^;
I1:=i; {红,蓝所在的包裹位置}
end;
end;
RecoverMe(_idtmp,I1);
end;