📄 unit1.pas
字号:
//外挂饭馆www.wgum.net
//中国最大的专业免费外挂教学,外挂研究,技术交流网站
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Math, ComCtrls,StrUtils;
type
TfrmMain = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
gBoxinfo: TGroupBox;
LabHPS: TLabel;
LabMP: TLabel;
LabMPS: TLabel;
LabLevel: TLabel;
LabLevelS: TLabel;
LabExp: TLabel;
LabExpS: TLabel;
LabXY: TLabel;
LabXYS: TLabel;
LabMoney: TLabel;
LabMoneyS: TLabel;
LabName: TLabel;
LabNameS: TLabel;
LabHP: TLabel;
gBoxBag: TGroupBox;
LabBagN: TLabel;
LabBagNS: TLabel;
LstBag: TListBox;
gBoxMoster: TGroupBox;
LabGnumber: TLabel;
LabGNS: TLabel;
LabNowGID: TLabel;
LabGID: TLabel;
LablstG: TLabel;
LabDGfw: TLabel;
LabGName: TLabel;
LabGNameS: TLabel;
LabGHP: TLabel;
LabGHPS: TLabel;
LstGname: TListBox;
LstGID: TListBox;
TxtDGfw: TEdit;
gBoxDw: TGroupBox;
LabGW: TLabel;
LabGWS: TLabel;
LabWGl: TLabel;
LstDW: TListBox;
LstGL: TListBox;
Tinfo: TTimer;
LabSkillN: TLabel;
LabSkillNS: TLabel;
LstSkill: TListBox;
cmdSkill: TButton;
LabState: TLabel;
LabWork: TLabel;
LabNw: TLabel;
LabNwS: TLabel;
TWorkC: TTimer;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure TinfoTimer(Sender: TObject);
procedure cmdSkillClick(Sender: TObject);
procedure PickUp;
procedure TWorkCTimer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure dati;
private
public
id,jc:integer;
ItemFliter: String;
WorkStart: Boolean;
WorkIndex: integer; // 1表示空闲;2表示打怪中;3表示拾取中;4表示运气中
SkillWork: Boolean;
GetWork: Boolean;
tCheck: Integer;
procedure WMHotKey(var Msg : TWMHotKey); message WM_HOTKEY;
procedure FunIn(FunName:Pointer;Param:pointer;ParamSize:DWORD);
procedure GetGw(a_gID: Cardinal);
procedure SkillGet;
procedure UseSkill;
end;
type
PGetGwCallParam = ^TGetGwCallParam;
TGetGwCallParam = packed record
EDX, EAX: DWORD;
end;
function NoCall(pDaima: cardinal):cardinal;
function GetGwCall(p: PGetGwCallParam):DWORD; Stdcall;
function PickCall(p: PGetGwCallParam):DWORD; Stdcall;
var
frmMain: TfrmMain;
wTime: Integer;
ProcessID: Thandle;
ProcID: Thandle;
Ghwnd: Thandle;
Ecxi: Cardinal;
r_HP,r_MaxHP,r_MP,r_MaxMP,r_Level,r_Exp,r_UpExp,r_Money: Cardinal;
r_X,r_Y,r_OldX,r_OldY: Single;
r_BaoN: Cardinal;
r_Name:array[0..16] of WideChar;
r_Name1:integer;
d_Max: Cardinal;
WriteCount: DWORD;
g_ID,g_oleID,g_HP,g_MaxHP: Cardinal;
g_X,g_Y: Single;
g_N,g_Max: Cardinal;
Const FirstAdr = $00920724;
Const r_BagAdr = FirstAdr + $884 + $C;
Const r_ExpAdr = $008F630C;
Const pAttack = $005a7c20;
Const pYunqi = $005a8260;
Const pTest = $0056ED00;
Const pUnYunqi = $005a82a0;
implementation
{$R *.dfm}
procedure TfrmMain.FormCreate(Sender: TObject);
begin
Ghwnd := FindWindow(nil, 'Element Client');
if Ghwnd = 0 then begin
ShowMessage('游戏未启动');
Application.Terminate();
end;
GetWindowThreadProcessId(Ghwnd, ProcID);
ProcessID := OpenProcess(PROCESS_ALL_ACCESS, False, ProcID);
if ProcessID = 0 then begin
showMessage('无法打开线程');
Application.Terminate();
end;
CloseHandle(ProcessID);
id:=GlobalAddAtom('Hotkey');
RegisterHotKey(frmMain.handle,id,MOD_ALT,VK_F9);
wTime := 0;
WorkIndex := 0;
WorkStart := False;
skillget;
frmMain.ItemFliter:= '';
Tinfo.Enabled :=True;
end;
procedure TfrmMain.TinfoTimer(Sender: TObject);
var
Num,gEcxi,gStart,gEax: Cardinal;
bEcxi,bBase,wID: Cardinal;
pWname,pGname: Integer;
pd,pn: Cardinal;
rg_Local: Single;
g_nowID: Cardinal;
wName,gName: array[0..16] of WideChar;
tName,tgName: string;
// tmpID1,tmpID2 : integer;
// tmpID: cardinal;
star:dword;
begin
if wTime = 31 then begin
wTime := 0;
end
else begin
wTime := wTime + 1;
end;
ProcessID := OpenProcess(PROCESS_ALL_ACCESS, False, ProcID);
if ProcessID <>0 then begin
// 人物基本信息
ReadProcessMemory(hProcess, pointer($922AEC), @star, 4, Num); //**
ReadProcessMemory(ProcessID, Pointer(FirstAdr), @ECXI, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXI + $28), @ECXI, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXI + $254), @r_HP, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXI + $26c), @r_MaxHP, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXI + $258), @r_MP, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXI + $270), @r_MaxMP, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXI + $260), @r_Exp, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXI + $24c), @r_Level, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXI + $3a4), @r_Name1, 4, Num);
ReadProcessMemory(ProcessID, Pointer(r_Name1), @r_Name, 34, Num);
ReadProcessMemory(ProcessID, Pointer(r_ExpAdr + 4 * r_Level), @r_UpExp, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXI + $3d8), @r_X, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXI + $3e0), @r_Y, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXI + $2D4), @r_Money, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXI + $7c4), @g_nowID, 4, Num);
if str=1 then
begin
sleep(1000);
dati;
end;
LabNameS.Caption := r_Name;
LabHPS.Caption := inttostr(r_HP) + '/' + inttostr(r_MaxHP);
LabMPS.Caption := inttostr(r_MP) + '/' + inttostr(r_MaxMP);
LablevelS.Caption := inttostr(r_Level);
LabExpS.Caption := inttostr(r_Exp) + '/' + inttostr(r_UpExp);
If r_X < 0 Then begin
If Abs(floor(r_X)) <> Abs(r_X) Then
r_X := floor(r_X) + 1;
end
else begin
r_X := floor(r_X);
end;
If r_Y < 0 Then begin
If Abs(floor(r_Y)) <> Abs(r_Y) Then
r_Y := floor(r_Y) + 1;
end
else begin
r_Y := floor(r_Y);
end;
LabXYS.Caption := '(' + inttostr(floor(r_X)) + ',' + inttostr(floor(r_Y)) + ')';
LabMoneys.Caption := inttostr(floor(r_Money / 10000)) + '金 ' + inttostr(floor((r_Money Mod 10000) / 100)) + '银 ' + inttostr(floor(r_Money Mod 100)) + '铜';
LabGID.Caption := inttostr(g_nowID);
//包裹基本信息
If wTime = 1 Then begin
lstBag.Clear;
ReadProcessMemory(ProcessID, Pointer(ECXI + $880), @bEcxi, 4, Num);
ReadProcessMemory(ProcessID, Pointer(bEcxi + $10), @r_BaoN, 4, Num);
ReadProcessMemory(ProcessID, Pointer(bEcxi + $C), @bEcxi, 4, Num);
for pn := 0 to r_BaoN -1 do
begin
ReadProcessMemory(ProcessID, Pointer(bEcxi + pn * 4), @bBase, 4, Num);
ReadProcessMemory(ProcessID, Pointer(bBase + $14), @pd, 4, Num);
if pd > 0 then begin
ReadProcessMemory(ProcessID, Pointer(bBase + $8), @wID, 4, Num);
// ReadProcessMemory(ProcessID, Pointer(bBase + $44), @wName, 32, Num);
// ReadProcessMemory(ProcessID, Pointer(pwName + $E), @wName, 32, Num);
// tName := wName;
// if pos('\r',tName)>0 then tName := leftstr(tName,pos('\r',tName)-1);
lstbag.Items.Add(inttostr(wid));
end;
//pwName := 0;
pd := 0;
end;
LabBagNS.Caption := inttostr(lstBag.Items.Count);
//身边怪基本信息
lstGName.Clear;
lstGID.Clear;
ReadProcessMemory(ProcessID, Pointer(FirstAdr), @gEcxi, 4, Num);
ReadProcessMemory(ProcessID, Pointer(gEcxi + $8), @gEcxi, 4, Num);
ReadProcessMemory(ProcessID, Pointer(gEcxi + $20), @gEcxi, 4, Num);
ReadProcessMemory(ProcessID, Pointer(gEcxi + $14), @g_N, 4, Num); //数量
ReadProcessMemory(ProcessID, Pointer(gEcxi + $24), @g_Max, 4, Num); //最大值
ReadProcessMemory(ProcessID, Pointer(gEcxi + $18), @gStart, 4, Num); //首地址
for pn := 0 to g_Max do
begin
ReadProcessMemory(ProcessID, Pointer(gStart + 4 * pn), @gEax, 4, Num);
if gEax > 0 then begin
ReadProcessMemory(ProcessID, Pointer(gEax + $4), @gEax, 4, Num);
ReadProcessMemory(ProcessID, Pointer(gEax + $11C), @g_ID, 4, Num);
ReadProcessMemory(ProcessID, Pointer(gEax + $134), @g_HP, 4, Num);
ReadProcessMemory(ProcessID, Pointer(gEax + $14C), @g_MaxHP, 4, Num);
ReadProcessMemory(ProcessID, Pointer(gEax + $3C), @g_X, 4, Num);
ReadProcessMemory(ProcessID, Pointer(gEax + $44), @g_Y, 4, Num);
ReadProcessMemory(ProcessID, Pointer(gEax + $22c), @rg_Local, 4, Num); //距离
if rg_Local < 10 then begin
ReadProcessMemory(ProcessID, Pointer(gEax + $208), @pgName, 4, Num); //名称
ReadProcessMemory(ProcessID, Pointer(pgName), @gName, 32, Num);
tgName := gName;
lstGname.Items.Add(tgName + ' ' + inttostr(floor(rg_Local)));
lstGID.Items.Add(inttostr(g_id));
LabGNS.Caption := inttostr(lstGID.Items.Count);
end;
end;
end;
end;
if workstart = False then
begin
case workIndex of
0:
begin
frmMain.LabWork.Caption := '空闲';
end;
1:
begin
if (strtoint(leftstr(frmMain.LabGID.Caption,1)) = 0) and (strtoint(frmMain.LabNwS.Caption) = 0) then
begin
if lstGID.Items.Count >0 then
begin
WorkStart := True;
frmMain.LabWork.Caption := '寻怪中';
GetGw(0);
end;
end
else if strtoint(leftstr(frmMain.LabGID.Caption,1)) <> 0 then
begin
WorkIndex := 2;
end
end;
2:
begin
WorkStart := True;
frmMain.LabWork.Caption := '打怪中';
tCheck:=15;
TWorkC.Enabled := True;
UseSkill;
// Nocall(pAttack);
end;
3:
//地面物品
begin
if frmMain.GetWork = False then
begin
frmMain.LabWork.Caption := '拣物品';
frmMain.GetWork:= True;
PickUP;
end;
end;
end;
end;
if (WorkIndex = 2) and (WorkStart = True) then
begin
if strtoint(leftstr(frmMain.LabGID.Caption,1)) = 0 then
begin
frmMain.LabWork.Caption := '怪死了';
if strtoint(frmMain.LabBagNS.Caption)<24 then
begin
WorkStart := False;
WorkIndex := 3;
end
else
begin
WorkStart:= False;
WorkIndex:= 1;
end;
end
else
begin
if SkillWork = False then Nocall(pAttack);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -