首页 > 技术文章 > 完美国际坐标查看器(可更新)

xe2011 2014-02-26 19:42 原文

 EXE下载:https://files.cnblogs.com/xe2011/EXE_wmgjZBViewer2014-3-5-101313.7z

源码下载:https://files.cnblogs.com/xe2011/PASCAL_wmgjZBViewer2014-2-26-195325.7z

 

[人物配置]
;默认为1.5.1的游戏数据
;当游戏版本升级时可以手动修改基址,2级偏移有时会改变
;PosX=[[[C0C68C]+1C]+34]+3c//主角坐标X 取整(坐标/10)+400
;PosY=[[[C0C68C]+1C]+34]+40//主角坐标Z 取整(坐标/10)
;PosZ=[[[C0C68C]+1C]+34]+44//主角坐标Y 取整(坐标/10)+550


;【1.5.1 游戏数据】
;hpmin=[[[00C7ABCC]+1c]+2c]+4a8
;二级偏移地址改变了
游戏基址=$00C7ABCC
一级偏移地址=$1C
二级偏移地址=$2C
X坐标偏移地址=$3C
Y坐标偏移地址=$40
Z坐标偏移地址=$44


;【1.4.8 游戏数据】
;游戏基址=$C0C68C
;一级偏移地址=$1C
;二级偏移地址=$34
;X坐标偏移地址=$3C
;Y坐标偏移地址=$40
;Z坐标偏移地址=$44


;【1.4.6 游戏数据】
;游戏基址=$BBC26C
;一级偏移地址=$1C
;二级偏移地址=$34
;X坐标偏移地址=$3C
;Y坐标偏移地址=$40
;Z坐标偏移地址=$44

 

 

完美国际坐标查看器(可手动更新数据)
提供源码下载
默认是1.4.8的数据
其他的版本请自行修改游戏基址=$C0C68C;
比如1.4.6 游戏基址=$BBC26C;
基址会有CE找的就用CE找 不会用的就找K25外挂里面也有基地把他的基址抄过来

本程序的功能
配合 NPC编辑器可以发挥最大的功能 复制坐标功能

可以转换坐标把游戏内部的坐标转换成当前显示的坐标

 

 

 

 

附个 NPC面向坐标
面向说明
NPC面向  DirX     DirY     DirZ
东    0.000    0.000    0.000
西    -1.000    0.000    0.000
南    0.000    0.000    -1.000
北    0.000    0.000    1.000

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Label7: TLabel;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Timer2: TTimer;
    Label5: TLabel;
    Button4: TButton;
    Label4: TLabel;
    Button5: TButton;
    Edit4: TEdit;
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Edit1Click(Sender: TObject);
    procedure Edit2Click(Sender: TObject);
    procedure Edit3Click(Sender: TObject);
    procedure Label4Click(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Label4MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Label4MouseLeave(Sender: TObject);
    procedure Label5MouseLeave(Sender: TObject);
    procedure Label5MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Label5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
uses
 IniFiles, Unit2,ShellAPI;
{$R *.dfm}
var
    BaseAddress,
        Offset1,
        Offset2,
      PosOffsetX,
      PosOffsetY,
      PosOffsetZ:DWORD;

//    BaseAddress=$C0C68C;
//        Offset1=$1C;
//        Offset2=$34;
//      PosOffsetX=$3c;
//      PosOffsetY=$40;
//      PosOffsetZ=$44;


procedure LoadIni;
var
  IniFile: TInifile;
begin
  IniFile := TInifile.Create(Application.ExeName + '.ini');
  BaseAddress := IniFile.ReadInteger('人物配置', '游戏基址',$C0C68C);
  Offset1 := IniFile.ReadInteger('人物配置', '一级偏移地址',$1C);
  Offset2 := IniFile.ReadInteger('人物配置', '二级偏移地址',$34);

  PosOffsetX := IniFile.ReadInteger('人物配置', 'X坐标偏移地址',$3C);
  PosOffsetY := IniFile.ReadInteger('人物配置', 'Y坐标偏移地址',$40);
  PosOffsetZ := IniFile.ReadInteger('人物配置', 'Z坐标偏移地址',$44);
end;

procedure WriteIni;
var
  IniFile: TInifile;
begin
    IniFile := TInifile.Create(Application.ExeName + '.ini');
    IniFile.WriteInteger('人物配置', '游戏基址',$C0C68C);
    IniFile.WriteInteger('人物配置', '一级偏移地址',$1C);
    IniFile.WriteInteger('人物配置', '二级偏移地址',$34);

    IniFile.WriteInteger('人物配置', 'X坐标偏移地址',$3C);
    IniFile.WriteInteger('人物配置', 'Y坐标偏移地址',$40);
    IniFile.WriteInteger('人物配置', 'Z坐标偏移地址',$44);

end;

procedure DsplyRolePosXYZ();

// PosX=[[[924E0C]+1C]+20]+3c//主角坐标X 取整(坐标/10)+400
// PosY=[[[924E0C]+1C]+20]+40//主角坐标Z 取整(坐标/10// PosZ=[[[924E0C]+1C]+20]+44//主角坐标Y 取整(坐标/10)+550
var
  h:HWND;
  PID:Dword;
  hProcess:Thandle;
  MyPointer:Integer;
  Readbyte:DWORD;//Size_T
  PosX,PosY,PosZ:Single;//
begin
  h:=FindWindow('ElementClient Window',NIL);
  if h=0 then
  begin
      Form1.Caption:='没有找到游戏';
  end
  else
  begin
    Form1.Caption:='坐标查看器';
    GetWindowThreadProcessId(h,@PID);
    hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
    ReadProcessMemory(hProcess,Pointer(BaseAddress),@MyPointer,4,Readbyte);
    ReadProcessMemory(hProcess,Pointer(MyPointer+Offset1),@MyPointer,4,Readbyte);
    ReadProcessMemory(hProcess,Pointer(MyPointer+Offset2),@MyPointer,4,Readbyte);
    ReadProcessMemory(hProcess,Pointer(MyPointer+PosOffsetX),@PosX,4,Readbyte);
    ReadProcessMemory(hProcess,Pointer(MyPointer+PosOffsetY),@PosY,4,Readbyte);
    ReadProcessMemory(hProcess,Pointer(MyPointer+PosOffsetZ),@PosZ,4,Readbyte);
    CloseHandle(hProcess);

    form1.Edit1.text:= Format('%0.3f',[posX]);
    form1.Edit2.text:= Format('%.3f',[posY]);
    form1.Edit3.text:= Format('%.3f',[posZ]);

    //显示数值
    PosX:=Trunc(PosX/10+400); //x坐=取整数部分(坐标/10)+400
    PosY:=Trunc(PosY/10);     //z坐标=取整数部分(坐标/10)
    PosZ:=Trunc(PosZ/10+550); //Y坐标=取整数部分(坐标/10)+550

  //  form1.Edit1.text:=FloatToStr(PosX)+','+FloatToStr(PosY)+''+FloatToStr(PosZ);//使用format

    form1.Label1.Caption:= Format('X坐标:%.f',[posX]);
    form1.Label2.Caption:= Format('Y坐标:↑%.f',[posY]);
    form1.Label3.Caption:= Format('Z坐标:%.f',[posZ]);
    form1.Edit4.Text:=Format('%.f %.f %.f',[posX,posZ,posY]);
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
    Edit1.SetFocus;
    Edit1.SelectAll;
    Edit1.CopyToClipboard;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
    Edit2.SetFocus;
    Edit2.SelectAll;
    Edit2.CopyToClipboard;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
    Edit3.SetFocus;
    Edit3.SelectAll;
    Edit3.CopyToClipboard;
end;

procedure TForm1.Button4Click(Sender: TObject);
VAR
  EDT:TEdit;
begin
    EDT:=TEdit.Create(SELF);
    EDT.Parent:=Form1;
    EDT.Text:=Edit1.Text +' '+EDIT2.Text +' '+EDIT3.Text;
    EDT.SelectAll;
    EDT.CopyToClipboard;
    EDT.Free;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin

  Edit4.SelectAll;
  Edit4.CopyToClipboard;
end;

procedure TForm1.Edit1Click(Sender: TObject);
begin
    Edit1.SelectAll;
end;

procedure TForm1.Edit2Click(Sender: TObject);
begin
    Edit2.SelectAll;
end;

procedure TForm1.Edit3Click(Sender: TObject);
begin
   Edit3.SelectAll;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   if not FileExists(Application.ExeName + '.ini') then
   WriteIni;

   LoadIni;

end;

procedure TForm1.Label4Click(Sender: TObject);
begin
    Hide;
    Form2.Edit1.Text:=Edit1.Text;
    Form2.Edit2.Text:=Edit2.Text;
    Form2.Edit3.Text:=Edit3.Text;

    Form2.ShowModal;
    Show;
end;

procedure TForm1.Label4MouseLeave(Sender: TObject);
begin
   Label4.Font.Color:=clBlack;
   Label4.Font.Style:=[];
end;

procedure TForm1.Label4MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
   Label4.Font.Color:=clRed;
   Label4.Font.Style:=[fsUnderline];
end;

procedure TForm1.Label5Click(Sender: TObject);
begin
    ShellExecute(Handle, 'open', 'www.baidu.com', 0, 0, SW_SHOWNORMAL);
end;

procedure TForm1.Label5MouseLeave(Sender: TObject);
begin
   Label5.Font.Color:=clBlack;
   Label5.Font.Style:=[];
end;

procedure TForm1.Label5MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
   Label5.Font.Color:=clRed;
   Label5.Font.Style:=[fsUnderline];
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  try
      DsplyRolePosXYZ;
      Label7.Visible:=False;
  except
      Label7.Caption:='读取游戏数据失败';
      Label7.Visible:=tRUE;
  end;

end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
 // if Form2.Visible then
 //   form2.BringToFront;
end;

end.
UNIT1

 

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm2 = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Timer1: TTimer;
    GroupBox2: TGroupBox;
    Edit4: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Edit2Click(Sender: TObject);
    procedure Edit3Click(Sender: TObject);
    procedure Edit1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Edit4Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure Transform1;
    procedure Transform2;

  end;

var
  Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}
//    PosX:=Trunc(PosX/10+400); //x坐=取整数部分(坐标/10)+400
//    PosY:=Trunc(PosY/10);     //z坐标=取整数部分(坐标/10//    PosZ:=Trunc(PosZ/10+550); //Y坐标=取整数部分(坐标/10)+550
//
//游戏显示坐标
procedure TForm2.Timer1Timer(Sender: TObject);
begin
  FormStyle:=fsStayOnTop;
end;

procedure TForm2.Transform1;
var
  x,y,z:Single;
  x1,y1,z1:string;
begin
     x:= StrToFloat(Edit1.Text);
     x1:=Format('%d',[Round(x/10)+400]);  //X坐=取整数部分(坐标/10)+400

     y:= StrToFloat(Edit2.Text);
     y1:=Format('%d',[Round(y/10)]);  //Y坐标=取整数部分(坐标/10)

     z:= StrToFloat(Edit3.Text);
     z1:=Format('%d',[Round(z/10)+550]);  //Z坐标=取整数部分(坐标/10)+550

     Edit4.Text:=x1+' '+z1;
     Label5.Caption:=''+y1;
end;

//游戏内部实际坐标
procedure TForm2.Transform2;
begin

end;


procedure TForm2.Button1Click(Sender: TObject);
begin
  Transform1;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  Edit4.SelectAll;
  Edit4.CopyToClipboard;
end;

procedure TForm2.Edit1Click(Sender: TObject);
begin
     Edit1.SelectAll;
end;

procedure TForm2.Edit2Click(Sender: TObject);
begin
    Edit2.SelectAll;
end;

procedure TForm2.Edit3Click(Sender: TObject);
begin
     Edit3.SelectAll;
end;

procedure TForm2.Edit4Click(Sender: TObject);
begin
    Edit4.SelectAll;
end;

end.
UNIT2

 

[人物配置]
;完美国际数据可以手动修改
;默认为1.4.8服务端的数据
;PosX=[[[C0C68C]+1C]+34]+3c//主角坐标X 取整(坐标/10)+400
;PosY=[[[C0C68C]+1C]+34]+40//主角坐标Z 取整(坐标/10)
;PosZ=[[[C0C68C]+1C]+34]+44//主角坐标Y 取整(坐标/10)+550
;1.4.6 游戏基址=$BBC26C
;1.4.8 游戏基址=$C0C68C


游戏基址=$C0C68C
一级偏移地址=$1C
二级偏移地址=$34
X坐标偏移地址=$3C
Y坐标偏移地址=$40
Z坐标偏移地址=$44

 

 

推荐阅读