AutoPatch in 1.5.2 Servers

08/04/2015 20:21 louco89#1
Hello everybody, I'm trying to fix my private bot and I am unable to update the part of movement, list and everything is ok, just I need it, managed to find some references, but all I use crash the game.

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;
I use this offsets from pwbr.
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;
Can anyone give me an idea of how to proceed?