Перейти к содержанию

Скрипт на автозапуск и вход


Рекомендуемые сообщения

Выкладываю скрипт, которым пользуюсь сам. автор не я, ник к сожалению не вспомню (правки делал Mariko). Я лишь вносил мелкие правки, чтобы бот не долбился в выключенный сервер и не откидывался раньше времени.

Скрипт автоматически запускает клиент, вводит данные и перед рестартом в 15-00 по МСК выходит из игры

uses SysUtils;
var
  loggedIn:boolean;
  RestartByTime: boolean = false;
  RestartTime: TDateTime = StrToDateTime('14:55:00');
  RestartDelay: TDateTime = StrToDateTime('00:05:00');       
 
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.

 

  • Like 1
  • Thanks 3
Ссылка на сообщение
Поделиться на другие сайты
  • 4 недели спустя...

А почему может быть такая штука? : Все работает ровно до момента ввода логина/пароля. Поля просто пустые остаются, скрипт дальше работать продолжает, вырубает клиент и все по новой.

Ссылка на сообщение
Поделиться на другие сайты
3 hours ago, Amicus said:

А почему может быть такая штука? : Все работает ровно до момента ввода логина/пароля. Поля просто пустые остаются, скрипт дальше работать продолжает, вырубает клиент и все по новой.

Адрик и клиент от админа запущены?

Ссылка на сообщение
Поделиться на другие сайты

Такое еще может быть, если запускаемое окно не соответствует окну в списке адрика, где запущен скрипт (т.е. надпись Loading появляется на другом персе). Подними окно со скриптом в левой колонке адрика наверх. Если окон много, то может наблюдаться такое поведение, через минут 5 скрипт как правило наконец ловит нужное окно и отрабатывает

Изменено пользователем Intervence
Ссылка на сообщение
Поделиться на другие сайты
2 minutes ago, Intervence said:

Такое еще может быть, если запускаемое окно не соответствует окну в списке адрика, где запущен скрипт (т.е. надпись Loading появляется на другом персе). Подними окно со скриптом в левой колонке адрика наверх. Если окон много, то может наблюдаться такое поведение, через минут 5 скрипт как правило наконец ловит нужное окно и отрабатывает

Спасибо. Проверю, подожду минут 10. Завтра отпишусь о результате 😃 

Ссылка на сообщение
Поделиться на другие сайты
4 hours ago, Intervence said:

Такое еще может быть, если запускаемое окно не соответствует окну в списке адрика, где запущен скрипт (т.е. надпись Loading появляется на другом персе). Подними окно со скриптом в левой колонке адрика наверх. Если окон много, то может наблюдаться такое поведение, через минут 5 скрипт как правило наконец ловит нужное окно и отрабатывает

Несколько часов подряд скрипт пытался ввести данные в поле, ничего у него не вышло. Проверил с одним окном, история повторяется. 

Ссылка на сообщение
Поделиться на другие сайты

ну пожалуй последний вариант, который в голову приходит - раскладка во время запуска английская стоит?

On 21.06.2021 at 22:55, Intervence said:

Delay(10000); // тут можно увеличить, если игра не успевает прогрузиться до ввода данных

также попробуй выставить тут значение 15000 или 20000 для теста. Возможно окно не успевает инициализироваться до того, как скрипт начинает туда данные заколачивать

Ссылка на сообщение
Поделиться на другие сайты
  • 5 недель спустя...
On 24.07.2021 at 03:12, Intervence said:

ну пожалуй последний вариант, который в голову приходит - раскладка во время запуска английская стоит?

также попробуй выставить тут значение 15000 или 20000 для теста. Возможно окно не успевает инициализироваться до того, как скрипт начинает туда данные заколачивать

такая же проблема, все варианты описаные выше попробовал и все-равно. 

Ссылка на сообщение
Поделиться на другие сайты
  • 3 недели спустя...

Такая же ерунда, бесконечно закрывает и открывает все клиенты по очереди. Как это можно исправить? Или есть у кого рабочий скрипт на автовход?

Изменено пользователем TheAkrand
Ссылка на сообщение
Поделиться на другие сайты
  • 2 месяца спустя...

Для запуска нескольких окно, ему нужно рандомное время запуска, иначе он вводит данные для входа не в своё окно. Для отработки по дисконекту используйте команду Engine.GameClose; она может убивать ваше окно при любом условии, а скрипт будет перезапускать всё (например если опыт перестал идти 10 мин или бафа нету 10 мин). Прикрепляю пример с исправлениями и комментариями в связке со скриптом проверки на смерть, бафы, нубо-ребаф и возврат на спот.

uses SysUtils;
var
  loggedIn:boolean;
  War: Boolean = false;
  RestartByTime: boolean = false;
  RestartTime: TDateTime = StrToDateTime('14:55:00');
  RestartDelay: TDateTime = StrToDateTime('00:05:00');       
 
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 rebuff; //баф нубо бафами
begin
  Engine.MoveTo(-12345, 12345, -12345);
  Engine.MoveTo(-12345, 12345, -12345);
  Engine.MoveTo(-12345, 12345, -12345);
  Engine.SetTarget(12345);
  Engine.MoveToTarget(-20);
  delay(1500);
  Engine.DlgOpen();
  delay(1500);
  Engine.DlgSel(2);
  delay(3000);
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.

Лучше читать и править код поможет тема от Админа "Учимся писать скрипты для бота Adrenaline" на этом форуме, а так же официальное API.

Давайте делиться правками, тестами и идеями на эту тему.
 

  • Like 2
Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

Здравствуйте. Как было сказано выше, скрипт отличный, но на дисконнекты никак не реагирует.
Пробую прикрутить таймер, пример отсюда https://adrenalinebot.com/ru/api/example/checking-if-our-character-is-stuck-in-the-thread

Quote

uses SysUtils;

procedure CheckStuckThread(sec: integer);
var Timer: int64;  X, Y, Z: integer;
begin
  while (Engine.Status <> lsOnline) do delay(555);    // ожидаем входа в игру
  X:= User.X;  Y:= User.Y;  Z:= User.Z;               // запоминаем текущие координаты
  Timer:= GetTickCount + sec*1000;                    // запоминаем время

  while delay(555) do begin                           // запускаем бесконечный цикл
    if (Engine.Status = lsOnline) then begin          // если мы в игре, то 
      if (User.Cast.EndTime = 0)                      // если мы ничего не кастуем в данный момент
      and (not User.Sitting)                          // и не сидим регенимся
      and (Abs(User.X-X) < 10)                        // (значение 10 можно менять) 
      and (Abs(User.Y-Y) < 10) then begin             // и наши координаты почти не изменились, тогда
        Print('Похоже, что я стою на месте');         // пишем в логи (эту строчку можно закоментировать)
        if (GetTickCount > Timer) then begin          // если прошло больше указанного времени, то
          Script.Suspend;                             // тормозим скрипт
          Print('Кажется я застрял');                 // пишем в логи (эту строчку можно закоментировать)
          if Engine.UseItem(736) then begin           // используем SoE
            while (User.Cast.EndTime <> 0) do delay(555); // ждем окончания каста
            delay(5555);                              // и ждем еще немного, чтобы прогрузиться
          end;
          Script.Replace;                             // перезапускаем скрипт (или делаем чтобы-нибудь еще)
        end;
      end else begin                                  // если же мы ничего не кастуем, и наши координаты поменялись, то
        X:= User.X;  Y:= User.Y;  Z:= User.Z;         // запоминаем новые координаты
        Timer:= GetTickCount + sec*1000;              // обновляем таймер
        Print('Все в порядке, я двигаюсь');           // пишем в логи (эту строчку можно закоментировать)
      end;
    end;
  end;
end;

begin
  Script.NewThread(@CheckStuckThread, Pointer(30));  // параметром указываем время (в сек), после которого юзать СОЕ
  // code ...
end.

 

В общем виде - не работает никак, ругается на строчку Script.NewThread(@CheckStuckThread, Pointer(30));

Пытаемся написать скрипт, который при дисконнекте просто выходит из игры. Получается так
 

Quote

uses SysUtils;

procedure CheckStuckThread(sec: integer);
var Timer: int64;  X, Y, Z: integer;
begin
  while (Engine.Status <> lsOnline) do delay(555);    // ожидаем входа в игру
  X:= User.X;  Y:= User.Y;  Z:= User.Z;               // запоминаем текущие координаты
  Timer:= GetTickCount + sec*100;                    // запоминаем время

  while 1<>2 do begin                           // запускаем бесконечный цикл
    if (Engine.Status = lsOnline) then begin          // если мы в игре, то 
      if (User.Cast.EndTime = 0)                      // если мы ничего не кастуем в данный момент
      and (not User.Sitting)                          // и не сидим регенимся
      and (Abs(User.X-X) < 10)                        // (значение 10 можно менять) 
      and (Abs(User.Y-Y) < 10) then begin             // и наши координаты почти не изменились, тогда
        Print('Похоже, что я стою на месте');         // пишем в логи (эту строчку можно закоментировать)
        if (GetTickCount > Timer) then begin          // если прошло больше указанного времени, то
        Print('Кажется я застрял');                 // пишем в логи (эту строчку можно закоментировать)
          Engine.GameClose;                             // закрываем игру
        end;
      end else begin                                  // если же мы ничего не кастуем, и наши координаты поменялись, то
        X:= User.X;  Y:= User.Y;  Z:= User.Z;         // запоминаем новые координаты
        Timer:= GetTickCount + sec*1000;              // обновляем таймер
        Print('Все в порядке, я двигаюсь');           // пишем в логи (эту строчку можно закоментировать)
      end;
    end;
  end;
end;

begin

  Script.NewThread(@CheckStuckThread);
  while 1<>2 do
  delay(1000);
end.

Бот выдает ошибку - Integer overflow. Если поиграться с таймингами, точнее - sec*10 выставив, можем добиться спама в чат "похоже что я стою на месте"
Подскажите, как заставить бота делать релог, если бот стоит на месте минуты 3? Не выходит никак

Ссылка на сообщение
Поделиться на другие сайты
On 17.12.2021 at 09:59, VersentFurio said:

RestartTime: TDateTime = StrToDateTime('14:55:00');

Добрый день, а как прописать, чтобы ну предположим в 14:55:00 и 19:55:00 или еще время, чтобы перезагружался несколько раз в день ?

Ссылка на сообщение
Поделиться на другие сайты
15 hours ago, 943810s said:

Добрый день, а как прописать, чтобы ну предположим в 14:55:00 и 19:55:00 или еще время, чтобы перезагружался несколько раз в день ?

RestartTime это переменная.

RestartTime1: TDateTime = StrToDateTime('14:55:00');

RestartTime2: TDateTime = StrToDateTime('15:55:00');

RestartTime2: TDateTime = StrToDateTime('15:55:00');
И далее работаешь с ними точно также, как с RestartTime
 

Ссылка на сообщение
Поделиться на другие сайты
3 hours ago, NeCoder said:

RestartTime это переменная.

RestartTime1: TDateTime = StrToDateTime('14:55:00');

RestartTime2: TDateTime = StrToDateTime('15:55:00');

RestartTime2: TDateTime = StrToDateTime('15:55:00');
И далее работаешь с ними точно также, как с RestartTime
 

Подставил, не работает, я от слов совсем не силен в "Delphi" - темный лес, можете дописать как это будет на примере : пяти значений ?

Заранее буду благодарен.

 

uses SysUtils;
var
  loggedIn:boolean;
  RestartByTime: boolean = false;
  RestartTime1: TDateTime = StrToDateTime('14:55:00');
  RestartTime2: TDateTime = StrToDateTime('17:55:00');
  RestartTime3: TDateTime = StrToDateTime('20:55:00');
  RestartTime4: TDateTime = StrToDateTime('23:55:00');
  RestartTime5: TDateTime = StrToDateTime('00:55:00');
  RestartDelay: TDateTime = StrToDateTime('00:05:00');       
 
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 = 'test';      //<-- между '' пишем логин    
  password = 'test';   //<-- пароль     
  gamePath = 'D:\La2\system\l2.exe';   //<-- полный путь до 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.

Ссылка на сообщение
Поделиться на другие сайты
11 hours ago, 943810s said:

не силен в "Delphi

Советую освоить. Писать тебе никто ничего не будет в 90% случаев.
А если напишут, надо тестить. А всем лень.
Крч попробуй что-нибудь типа 

uses SysUtils;
var
  loggedIn:boolean;
  War: Boolean = false;
  RestartByTime: boolean = false;
  RestartTime1: TDateTime = StrToDateTime('14:55:00');
  RestartTime2: TDateTime = StrToDateTime('17:55:00');
  RestartTime3: TDateTime = StrToDateTime('20:55:00');
  RestartTime4: TDateTime = StrToDateTime('23:55:00');
  RestartTime5: TDateTime = StrToDateTime('00:55:00');
  RestartDelay: TDateTime = StrToDateTime('00:09:00');
  DD:TL2Control;
 
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 = 'D:\Torrents\L2_Interlude_L2KOT.RU_v4.1\system\l2.exe';   //<-- полный путь до l2.exe (например D:\Lineage\system\l2.exe)
begin
  while engine.Delay(10000) do begin
 // if (Engine.Status = lsOnline)and (RestartByTime = false) then begin
 //   		warMonitor;
 // 	end;	
	if (Time > RestartTime1)or(Time > RestartTime2)or(Time > RestartTime3)or(Time > RestartTime4)or(Time > RestartTime5)
	or(Time < RestartTime1 + RestartDelay)or (Time < RestartTime2 + RestartDelay)or (Time < RestartTime3 + RestartDelay)or (Time < RestartTime4 + RestartDelay)or (Time < RestartTime2 + 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 < RestartTime1 + RestartDelay)or (Time < RestartTime2 + RestartDelay)or (Time < RestartTime3 + RestartDelay)or(Time < RestartTime4 + RestartDelay)or (Time < RestartTime5 + RestartDelay)do begin
         Delay(5000);
       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(2000);
 while (Engine.Status = lsOffline) do
 begin
 print('still offline');
 delay(1000);
 end;
 if (Engine.Status = lsOnline) then
    begin                      // сворачиваем окна в конце загрузки
 keybd_event($5B,0,0,0);
 delay(100);
 keybd_event($4D,0,0,0);
 delay(100);
 keybd_event($4D,0,2,0);
 delay(100);
 keybd_event($5B,0,2,0);       
    end;
 delay(1000);                    
      Engine.FaceControl(0, true);
  //    warMonitor;
    end;
  end;
end;

procedure CheckStuckThread(sec: integer);            //автодисконнект, если стоим на месте
var Timer: int64;  X, Y, Z, time: integer;
begin
  while (Engine.Status <> lsOnline) do delay(555);    // ожидаем входа в игру
  X:= User.X;  Y:= User.Y;  Z:= User.Z;               // запоминаем текущие координаты                 
 while engine.delay(555) do begin                    // запускаем бесконечный цикл
    if (Engine.Status = lsOnline) then begin          // если мы в игре, то 
      if (User.Cast.EndTime = 0)                      // если мы ничего не кастуем в данный момент
      and (not User.Sitting)                          // и не сидим регенимся
      and (Abs(User.X-X) < 10)                        // (значение 10 можно менять) 
      and (Abs(User.Y-Y) < 10) then begin             // и наши координаты почти не изменились, тогда
        Print('Похоже, что я стою на месте');         // пишем в логи (эту строчку можно закоментировать)
        delay(60000);                                 //10 сек цикл
        time:=time+1;                                 //суммируем
        if (time=3) then begin          // если прошло больше указанного времени, тут 6х10 сек
                                       // тормозим скрипт
          Print('Кажется я застрял');                 // пишем в логи (эту строчку можно закоментировать)
        Engine.GameClose;
        end;
      end else begin                                  // если же мы ничего не кастуем, и наши координаты поменялись, то
        X:= User.X;  Y:= User.Y;  Z:= User.Z;         // запоминаем новые координаты
        Print('Все в порядке, я двигаюсь');
        time:=0;
        delay(60000);
      end;
    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;


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;

procedure rebuff; //баф нубо бафами
begin
  Engine.MoveTo(-12345, 12345, -12345);
  Engine.MoveTo(-12345, 12345, -12345);
  Engine.MoveTo(-12345, 12345, -12345);
  Engine.SetTarget(12345);
  Engine.MoveToTarget(-20);
  delay(1500);
  Engine.DlgOpen();
  delay(1500);
  Engine.DlgSel(2);
  delay(3000);
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);
  Script.NewThread(@CheckStuckThread);
end.

 

11 hours ago, 943810s said:

if (Time > RestartTime) and (Time < RestartTime + RestartDelay) then RestartByTime:= true;   <-- тут пишет, что какая то ошибка

у тебя переменные RestartTime1, 2, 3, 4, 5, а ты оставил RestartTime. Ничего удивительного

Ссылка на сообщение
Поделиться на другие сайты
On 06.02.2022 at 07:23, NeCoder said:

у тебя переменные RestartTime1, 2, 3, 4, 5, а ты оставил RestartTime. Ничего удивительного

Ошибок нет, но скрипт вообще не запускается =(,можете просто именно в этот скрипт:

uses SysUtils;
var
  loggedIn:boolean;
  RestartByTime: boolean = false;
  RestartTime: TDateTime = StrToDateTime('14:55:00');
  RestartDelay: TDateTime = StrToDateTime('00:05:00');       
 
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.

 

поставить переменные 

On 06.02.2022 at 07:23, NeCoder said:

RestartTime1: TDateTime = StrToDateTime('14:55:00'); RestartTime2: TDateTime = StrToDateTime('17:55:00'); RestartTime3: TDateTime = StrToDateTime('20:55:00'); RestartTime4: TDateTime = StrToDateTime('23:55:00'); RestartTime5: TDateTime = StrToDateTime('00:55:00');

И чтобы он запускался ,и перезагружался по времени указанных в переменных

Изменено пользователем 943810s
Ссылка на сообщение
Поделиться на другие сайты
21 minutes ago, Вася said:

А какой командой перезапустить сервер?

 

sudo rm -rf /

Изменено пользователем babkaODMENA
Ссылка на сообщение
Поделиться на другие сайты
On 05.02.2022 at 18:50, 943810s said:

Подставил, не работает, я от слов совсем не силен в "Delphi" - темный лес, можете дописать как это будет на примере : пяти значений ?

Заранее буду благодарен.

 

uses SysUtils;
var
  loggedIn:boolean;
  RestartByTime: boolean = false;
  RestartTime1: TDateTime = StrToDateTime('14:55:00');
  RestartTime2: TDateTime = StrToDateTime('17:55:00');
  RestartTime3: TDateTime = StrToDateTime('20:55:00');
  RestartTime4: TDateTime = StrToDateTime('23:55:00');
  RestartTime5: TDateTime = StrToDateTime('00:55:00');
  RestartDelay: TDateTime = StrToDateTime('00:05:00');       
 
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 = 'test';      //<-- между '' пишем логин    
  password = 'test';   //<-- пароль     
  gamePath = 'D:\La2\system\l2.exe';   //<-- полный путь до 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.

А где объявление "Time"? Это что(переменная, функия или процедура)?  Я так понимаю она должна возвращать текущее время и проверять условие в этой строке:  if (Time > RestartTime) and (Time < RestartTime + RestartDelay) then RestartByTime:= true; 

Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
×
×
  • Создать...