[DELPHI] Source: FaceTarget (WoW)

10/02/2010 21:34 piotr55#1
Hi there,

ive made a lil code to Face (and turn camera) to the selected Target (GUID)
by doing Math ;)

maybe some1 needs this. (i'm using it to autokill Tyrannus via port):

Code:
procedure FaceGUID(GUID:UInt64; CenterCam:Bool);
var
  Mx, My, Tx, Ty, Distance1, Distance2, Rota: Extended;
  C_Pointer, C_Offset: Integer;
begin
  if (GUID <> 0) and (GUID <> MemRUInt64(PlayerGUID)) then begin
    Mx := roundto(MemRFloat(MemRBase + PlayerX), -3);
    My := roundto(MemRFloat(MemRBase + PlayerY), -3);
    Tx := roundto(MemRFloat(GetObjectBaseByGuid(GUID) + UnitFieldsX),-3);
    Ty := roundto(MemRFloat(GetObjectBaseByGuid(GUID) + UnitFieldsY),-3);

    Distance1 := roundto(Sqrt(Sqr(Mx-Tx)+Sqr(My-Ty)), -3);
    Distance2 := roundto(Sqrt(Sqr(My-Ty)), -3);
    Rota := ArcSin(Distance2 / Distance1);

    if (Mx < Tx) and (My > Ty) then
    Rota := DegreeToRadian(360) - Rota
    else
    if (Mx > Tx) and (My > Ty) then
    Rota := DegreeToRadian(180) + Rota
    else
    if (Mx > Tx) and (My < Ty) then Rota := DegreeToRadian(180) - Rota;

    MemWFloat(MemRBase + PlayerR, Rota);

    if CenterCam = true then
    begin
      C_Pointer := MemRInt(CameraPointer);
      C_Offset  := MemRInt(C_Pointer + CameraOffset);
      MemWFloat(C_Offset + CameraRotaY, 0);
    end;
  end;
end;
MemRInt = MemoryRead an Integer value
MemWFloat = MemoryWrite a Float value (Extended or Single possible)
^^ u should know how to do that.

Rota <- your Rotation
Mx, ... <- your coords
Tx, ... <- targets coords

3.3.5 offsets are:
Code:
  Base              =   $00CD87A8;
  BaseOffset1       =   $34;
  BaseOffset2       =   $24;
  ObjManagerBase    =   $00C79CE0;
  ObjManagerOffs    =   $2ED0;
  ObjManagerFirst   =   $AC;
  ObjManagerNext    =   $3C;
  PlayerX           =   $798;
  PlayerY           =   $79C;
  PlayerR           =   $7A8;
  UnitFieldsX       =   PlayerX; // $798
  UnitFieldsY       =   PlayerY; // $79C
  CameraPointer     =   $00B7436C;
  CameraOffset      =   $7E20;
  CameraRotaY       =   $11C;
  LocalTargetGUID   =   $00BD07B0;
functions to read playerbase and objectmanager
Code:
function MemRBase: Integer;
begin
  result := MemRInt(MemRInt(MemRInt(Base) + BaseOffset1) + BaseOffset2);
end;

function GetFirstObject: Integer;
begin
  result := MemRInt(MemRInt(MemRInt(ObjManagerBase) + ObjManagerOffs) + ObjManagerFirst);
end;

function GetObjectBaseByGuid(Guid:Uint64): integer;
var
  TOBaseAddress: Integer;
  TOGuid: UInt64;
begin
  if GUID <> 0 then begin
    result := 0;
    TOBaseAddress := GetFirstObject;
     while TOBaseAddress <> 0 do begin
       TOGuid := MemRUInt64(TOBaseAddress + ObjGUIDOffset);
       if TOGuid = Guid then begin
       result := TOBaseAddress;
       break;
       end else
       TOBaseAddress := MemRInt(TOBaseAddress + ObjManagerNext);
     end;
     //result := 0;
  end else result := 0;
end;
think, this should help u a bit.

greetz
piotr
10/11/2010 17:59 krotkin#2
insane - kind a aimbot for wow :)))