function ShellExecuteW(hwnd: integer; lpOperation, lpFile, lpParameters, lpDirectory: PChar; nShowCmd: integer): integer; stdcall;
external 'Shell32.dll';
function keybd_event(bVk, bScan: byte; dwFlags, dwExtraInfo: integer): integer; stdcall;
external 'user32.dll';
function ShowWindow(hwnd:cardinal; action:integer):boolean; stdcall;
external 'user32.dll';
procedure disconnectMonitor;
const
login = ''; //<-- между '' пишем логин
password = ''; //<-- пароль
gamePath = ''; //<-- полный путь до l2.exe (например D:\Lineage\system\l2.exe)
begin
while engine.Delay(5000) do begin
if (Time > RestartTime) and (Time < RestartTime + RestartDelay) then RestartByTime:= true;
if (Engine.Status = lsOffline) or (Engine.Status = lsOff) or RestartByTime then begin
loggedIn:=true;
print('Disconnected');
Engine.FaceControl(0, false);
Delay(1000);
Engine.GameClose;
Delay(1000);
if(RestartByTime) then begin
while (Time < RestartTime + RestartDelay) do begin
Delay(60000);
end;
RestartByTime:= false;
end;
ShellExecuteW(0, 'open', PChar(gamePath), nil, nil, 0);
Delay(10000); // тут можно увеличить, если игра не успевает прогрузиться до ввода данных
enterText(login);
Engine.UseKey('Tab');
Delay(300);
enterText(password);
Delay(300);
Engine.UseKey('Enter');
Delay(2000);
Engine.UseKey('Enter');
Delay(2000);
Engine.UseKey('Enter');
Delay(2000);
Engine.UseKey('Enter');
Delay(10000);
Engine.FaceControl(0, true);
end;
end;
end;
procedure enterText(const text: string);
var
i: cardinal;
upperCase: boolean;
begin
for i:= 1 to length(text) do begin
if isDigit(text[i]) then
Engine.UseKey(text[i])
else begin
upperCase:= text[i] = UpCase(text[i]);
if upperCase then begin
keybd_event($A0, 0, 0, 0);
end;
delay(20);
Engine.UseKey(text[i]);
end;
delay(20);
keybd_event($A0, 0, 2, 0);
delay(50);
end;
end;
// Thanks to Mariko (from l2kot.ru)
function isDigit(ch: char): boolean;
const digits = '0123456789';
var i: cardinal;
begin
result:= true;
for i:= 0 to length(digits)-1 do
if digits[i] = ch then
exit;
result:= false;
end;
// Thanks end
begin
if engine.status <> lsonline then loggedIn:= true else loggedIn:= false;
Script.NewThread(@disconnectMonitor);
end.
end.
function ShellExecuteW(hwnd: integer; lpOperation, lpFile, lpParameters, lpDirectory: PChar; nShowCmd: integer): integer; stdcall;
external 'Shell32.dll';
function keybd_event(bVk, bScan: byte; dwFlags, dwExtraInfo: integer): integer; stdcall;
external 'user32.dll';
function ShowWindow(hwnd:cardinal; action:integer):boolean; stdcall;
external 'user32.dll';
procedure disconnectMonitor;
const
login = ''; //<-- между '' пишем логин
password = ''; //<-- пароль
gamePath = ''; //<-- полный путь до l2.exe (например D:\Lineage\system\l2.exe)
begin
while engine.Delay(5000) do begin
if (Engine.Status = lsOnline)and (RestartByTime = false) then begin
warMonitor;
end;
if (Time > RestartTime) and (Time < RestartTime + RestartDelay) then RestartByTime:= true;
if (Engine.Status = lsOffline) or (Engine.Status = lsOff) or RestartByTime then begin
loggedIn:=true;
print('Disconnected');
Engine.FaceControl(0, false);
Delay(1000);
Engine.GameClose; //полезная команда, придумайте ей условие и она сможет срабатывать при дисконекте. Например в случае отсутствия получения опыта
Delay(2000); // тут для каждого окна нужны разные данные, что бы бот успевал вводить логин и пароль в своё окно, а не чужое
if(RestartByTime) then begin
while (Time < RestartTime + RestartDelay) do begin
Delay(60000);
end;
RestartByTime:= false;
end;
ShellExecuteW(0, 'open', PChar(gamePath), nil, nil, 0);
Delay(40000); // тут для каждого окна нужны разные данные, что бы бот успевал вводить логин и пароль в своё окно, а не чужое
enterText(login);
Engine.UseKey('Tab');
Delay(300);
enterText(password);
Delay(300);
Engine.UseKey('Enter');
Delay(2000);
Engine.UseKey('Enter');
Delay(2000);
Engine.UseKey('Enter');
Delay(2000);
Engine.UseKey('Enter');
Delay(10000);
warMonitor;
end;
end;
end;
procedure warMonitor;
begin
if war=true then begin//когда мы на войне
check;
delay(150);
end;
if war=false then begin//когда мы не на войне
GoGK;
rebuff;
tpTospot;
roadTospot;
delay(150);
end;
end;
procedure enterText(const text: string);
var
i: cardinal;
upperCase: boolean;
begin
for i:= 1 to length(text) do begin
if isDigit(text[i]) then
Engine.UseKey(text[i])
else begin
upperCase:= text[i] = UpCase(text[i]);
if upperCase then begin
keybd_event($A0, 0, 0, 0);
end;
delay(20);
Engine.UseKey(text[i]);
end;
delay(20);
keybd_event($A0, 0, 2, 0);
delay(50);
end;
end;
// Thanks to Mariko (from l2kot.ru)
function isDigit(ch: char): boolean;
const digits = '0123456789';
var i: cardinal;
begin
result:= true;
for i:= 0 to length(digits)-1 do
if digits[i] = ch then
exit;
result:= false;
end;
// Thanks to Mariko (from l2kot.ru) end
procedure tpTospot; //телепорт до спота
begin
Engine.SetTarget(12345);//id гейткипера
Engine.MoveToTarget(-20);
delay(1500);
Engine.DlgOpen;
delay(1500);
Engine.DlgSel(1);//стройка где написано телепорт
delay(1500);
Engine.DlgSel(10);//номер строки куда нужно тп
delay(15000);
end;
procedure roadToSpot; //маршрут до спота после тп
begin
Engine.MoveTo(-12345, 12345, -12345);
Engine.MoveTo(-12345, 12345, -12345);
Engine.MoveTo(-12345, 12345, -12345);
War:=true;
Engine.FaceControl(0,true);
end;
procedure GoGK; //тут подводка к гк
begin
Engine.MoveTo(-12345, 12345, -12345);
Engine.MoveTo(-12345, 12345, -12345);
Engine.MoveTo(-12345, 12345, -12345);
end;
procedure Check; //процедура проверки нубо бафа и смерти
var
obj: TL2NPC;
buff:TL2buff;
begin
if not User.Buffs.ById(4322, Obj) then begin //баф на скорость
Engine.FaceControl(0,false);
print('/unstuck');
engine.entertext('/unstuck');
Delay(30000);
War:=false;
end;
if User.Dead then begin
Engine.FaceControl(0,false);
Print('”Уехал в вальгаллу');
War:=false;
Delay(1000);
Engine.GOHome;
Delay(3000);
end;
end;
begin
if engine.status <> lsonline then loggedIn:= true else loggedIn:= false;
Script.NewThread(@disconnectMonitor);
end.
end.
Координаты ставятся по вашей красной (в окне бота Virtual map) точке, нажатием клавиши Alt+V в окне скрипта (Script).
ID NPC есть в окне нижнего правого угла основного окна бота.
ID бафов можно посмотреть щёлкнув на имя персонажа в окне Players (правый вверхний угол, второе окно после hp и mp) и далее в нижнем окне (messages) выбрать вкладку (Target), а в ней (BF), там покажет все наложенные бафы и их ID.
Здесь присутствуют: 1 (пользователей: 0, гостей: 1)