I tried some code and no runs.
Code:
procedure PatchCall(aPParams: PParams); stdcall;
var
addr:pointer;
x,y,z:Dword;
begin
x:=548;
y:=673;
z:=50;
addr := Pointer(PW_BASE_PATCH);
asm
pushad
MOV EDI,y // есть предположение,
MOV ESI,x // что здесь нужно поменять местами X, Z и Y
MOV EAX,DWORD PTR DS:[PW_BASE_ADDRESS] // base_addr
PUSH 0 // ; /Arg7 = 00000000
PUSH EDI // ; |Arg6
MOV ECX,DWORD PTR DS:[EAX+$1C] // ; |
PUSH ESI // ; |Arg5
PUSH 0 // ; |Arg4 = 00000000
PUSH 0 // ; |Arg3 = 00000000
PUSH 0 // ; |Arg2 = 00000000
PUSH $14A // ; |Arg1 = 0000014A
call addr // ; \elementc.00438770
MOV EDX,DWORD PTR DS:[PW_BASE_ADDRESS] //; elementc.009C14F8
XOR EAX,EAX
MOV AL,0
PUSH 0 //; /Arg7 = 00000000
MOV ECX,DWORD PTR DS:[EDX+$1C] //; |
MOV EDX,z //; |
PUSH EAX //; |Arg6 = 00000000
PUSH EDX //; |Arg5 = Высота полета
PUSH 1 //; |Arg4 = 00000001
PUSH 0 //; |Arg3 = 00000000
PUSH 0 //; |Arg2 = 00000000
PUSH $14A //; |Arg1 = 0000014A
CALL addr //; \elementc.00438770
popad
end;
end;
procedure WalkCall(aPParams: PParams); Stdcall;
var
CallAddress1, CallAddress2, CallAddress3: pointer;
X, Y, Z: Single;
flying: DWORD;
begin
CallAddress1 := pointer(ADDRESS_ACTION1);
CallAddress2 := pointer(ADDRESS_ACTION2);
CallAddress3 := pointer(ADDRESS_ACTION3);
X := aPParams^.X;
Y := aPParams^.Y;
Z := aPParams^.Z;
flying := aPParams^.Param1;
asm
pushad
mov eax, dword ptr [PW_BASE_ADDRESS]
mov esi, dword ptr [eax+$30]
mov ecx, dword ptr [esi+$13A8]
push 1
call CallAddress1
mov edi, eax
lea eax, dword ptr [esp+$0C]
push eax
push flying
mov ecx, edi
call CallAddress2
mov ecx, dword ptr [esi+$13A8]
push 0
push 1
push edi
push 1
call CallAddress3
mov eax, dword ptr [PW_BASE_ADDRESS]
mov eax, dword ptr [eax+$30]
mov eax, dword ptr [eax+$13A8]
mov eax, dword ptr [eax+$30]
mov ecx, dword ptr [eax+$4]
mov eax, x
mov dword ptr[ecx+$3C], eax
mov eax, z
mov dword ptr[ecx+$40], eax
mov eax, y
mov dword ptr[ecx+$44], eax
popad
end;
end;
procedure AutoRouteCall(cmd: pointer); stdcall;
var
addr: pointer;
begin
addr := pointer(PW_BASE_PATCH);
asm
pushad
mov eax, dword ptr [PW_BASE_ADDRESS]
mov eax, dword ptr [eax + PW_BASE_OFFSET]
mov ecx, dword ptr [eax + PW_BASE_CHAR]
push cmd
call addr
popad
end;
end;
procedure TCharInfo.StartMoveTo(X, Y: Integer);
var
Buf: array [0 .. 6] of Integer;
H, PI, W, I: DWORD;
begin
H := FindWindow('ElementClient Window', PWideChar(FTitle));
if (H <= 0) then
begin
exit;
end;
if (Logado = False) then
begin
exit;
end;
GetWindowThreadProcessId(H, @PI);
W := OpenProcess(PROCESS_ALL_ACCESS, False, PI);
Buf[0] := 330;
Buf[1] := 0;
Buf[2] := 0;
Buf[3] := 0; // Команда на взлёт
Buf[4] := X;
Buf[5] := Y;
Buf[6] := 0;
InjectFunc(W, @AutoRouteCall, @Buf, SizeOf(Buf));
end;
Code:
PW_BASE_ADDRESS = $00D23CB4; PW_BASE_OFFSET = $1C; PW_BASE_PATCH = $00455A20; ADDRESS_ACTION1 = $0049FFC0; ADDRESS_ACTION2 = $004A6360; ADDRESS_ACTION3 = $004A05B0; ADDRESS_GATHER = $00495B30; ADDRESS_CAST = $0048DE60;






