Intervence 51 Опубликовано 21 июня, 2021 Жалоба Поделиться Опубликовано 21 июня, 2021 Выкладываю скрипт, которым пользуюсь сам. автор не я, ник к сожалению не вспомню (правки делал 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. 1 3 Ссылка на сообщение Поделиться на другие сайты
Amicus 0 Опубликовано 19 июля, 2021 Жалоба Поделиться Опубликовано 19 июля, 2021 А почему может быть такая штука? : Все работает ровно до момента ввода логина/пароля. Поля просто пустые остаются, скрипт дальше работать продолжает, вырубает клиент и все по новой. Ссылка на сообщение Поделиться на другие сайты
Intervence 51 Опубликовано 19 июля, 2021 Автор Жалоба Поделиться Опубликовано 19 июля, 2021 3 hours ago, Amicus said: А почему может быть такая штука? : Все работает ровно до момента ввода логина/пароля. Поля просто пустые остаются, скрипт дальше работать продолжает, вырубает клиент и все по новой. Адрик и клиент от админа запущены? Ссылка на сообщение Поделиться на другие сайты
Amicus 0 Опубликовано 19 июля, 2021 Жалоба Поделиться Опубликовано 19 июля, 2021 10 minutes ago, Intervence said: Адрик и клиент от админа запущены? Да Ссылка на сообщение Поделиться на другие сайты
Intervence 51 Опубликовано 19 июля, 2021 Автор Жалоба Поделиться Опубликовано 19 июля, 2021 (изменено) Такое еще может быть, если запускаемое окно не соответствует окну в списке адрика, где запущен скрипт (т.е. надпись Loading появляется на другом персе). Подними окно со скриптом в левой колонке адрика наверх. Если окон много, то может наблюдаться такое поведение, через минут 5 скрипт как правило наконец ловит нужное окно и отрабатывает Изменено 19 июля, 2021 пользователем Intervence Ссылка на сообщение Поделиться на другие сайты
Amicus 0 Опубликовано 19 июля, 2021 Жалоба Поделиться Опубликовано 19 июля, 2021 2 minutes ago, Intervence said: Такое еще может быть, если запускаемое окно не соответствует окну в списке адрика, где запущен скрипт (т.е. надпись Loading появляется на другом персе). Подними окно со скриптом в левой колонке адрика наверх. Если окон много, то может наблюдаться такое поведение, через минут 5 скрипт как правило наконец ловит нужное окно и отрабатывает Спасибо. Проверю, подожду минут 10. Завтра отпишусь о результате 😃 Ссылка на сообщение Поделиться на другие сайты
Amicus 0 Опубликовано 20 июля, 2021 Жалоба Поделиться Опубликовано 20 июля, 2021 4 hours ago, Intervence said: Такое еще может быть, если запускаемое окно не соответствует окну в списке адрика, где запущен скрипт (т.е. надпись Loading появляется на другом персе). Подними окно со скриптом в левой колонке адрика наверх. Если окон много, то может наблюдаться такое поведение, через минут 5 скрипт как правило наконец ловит нужное окно и отрабатывает Несколько часов подряд скрипт пытался ввести данные в поле, ничего у него не вышло. Проверил с одним окном, история повторяется. Ссылка на сообщение Поделиться на другие сайты
Intervence 51 Опубликовано 24 июля, 2021 Автор Жалоба Поделиться Опубликовано 24 июля, 2021 ну пожалуй последний вариант, который в голову приходит - раскладка во время запуска английская стоит? On 21.06.2021 at 22:55, Intervence said: Delay(10000); // тут можно увеличить, если игра не успевает прогрузиться до ввода данных также попробуй выставить тут значение 15000 или 20000 для теста. Возможно окно не успевает инициализироваться до того, как скрипт начинает туда данные заколачивать Ссылка на сообщение Поделиться на другие сайты
StepUp 0 Опубликовано 23 августа, 2021 Жалоба Поделиться Опубликовано 23 августа, 2021 On 24.07.2021 at 03:12, Intervence said: ну пожалуй последний вариант, который в голову приходит - раскладка во время запуска английская стоит? также попробуй выставить тут значение 15000 или 20000 для теста. Возможно окно не успевает инициализироваться до того, как скрипт начинает туда данные заколачивать такая же проблема, все варианты описаные выше попробовал и все-равно. Ссылка на сообщение Поделиться на другие сайты
StreaMeX 1 Опубликовано 31 августа, 2021 Жалоба Поделиться Опубликовано 31 августа, 2021 А этот скрипт работает только на релог после рестарта или на вылет тоже работает? Ссылка на сообщение Поделиться на другие сайты
Avoka_D 0 Опубликовано 4 сентября, 2021 Жалоба Поделиться Опубликовано 4 сентября, 2021 Скрипт не вставляется в Адрик, в чем может быть проблема? Ссылка на сообщение Поделиться на другие сайты
Verd 6 Опубликовано 7 сентября, 2021 Жалоба Поделиться Опубликовано 7 сентября, 2021 У меня почему то этот скрипт бесконечно открывает и закрывает клиенты. Ссылка на сообщение Поделиться на другие сайты
TheAkrand 0 Опубликовано 24 сентября, 2021 Жалоба Поделиться Опубликовано 24 сентября, 2021 (изменено) Такая же ерунда, бесконечно закрывает и открывает все клиенты по очереди. Как это можно исправить? Или есть у кого рабочий скрипт на автовход? Изменено 24 сентября, 2021 пользователем TheAkrand Ссылка на сообщение Поделиться на другие сайты
Turop 0 Опубликовано 10 декабря, 2021 Жалоба Поделиться Опубликовано 10 декабря, 2021 I used this script it works, login normally. But when the window disconnects, it doesn't close the window. Ссылка на сообщение Поделиться на другие сайты
VersentFurio 2 Опубликовано 17 декабря, 2021 Жалоба Поделиться Опубликовано 17 декабря, 2021 Для запуска нескольких окно, ему нужно рандомное время запуска, иначе он вводит данные для входа не в своё окно. Для отработки по дисконекту используйте команду 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. Давайте делиться правками, тестами и идеями на эту тему. 2 Ссылка на сообщение Поделиться на другие сайты
NeCoder 4 Опубликовано 29 января, 2022 Жалоба Поделиться Опубликовано 29 января, 2022 Здравствуйте. Как было сказано выше, скрипт отличный, но на дисконнекты никак не реагирует. Пробую прикрутить таймер, пример отсюда 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? Не выходит никак Ссылка на сообщение Поделиться на другие сайты
943810s 0 Опубликовано 4 февраля, 2022 Жалоба Поделиться Опубликовано 4 февраля, 2022 On 17.12.2021 at 09:59, VersentFurio said: RestartTime: TDateTime = StrToDateTime('14:55:00'); Добрый день, а как прописать, чтобы ну предположим в 14:55:00 и 19:55:00 или еще время, чтобы перезагружался несколько раз в день ? Ссылка на сообщение Поделиться на другие сайты
NeCoder 4 Опубликовано 5 февраля, 2022 Жалоба Поделиться Опубликовано 5 февраля, 2022 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 Ссылка на сообщение Поделиться на другие сайты
943810s 0 Опубликовано 5 февраля, 2022 Жалоба Поделиться Опубликовано 5 февраля, 2022 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. Ссылка на сообщение Поделиться на другие сайты
NeCoder 4 Опубликовано 6 февраля, 2022 Жалоба Поделиться Опубликовано 6 февраля, 2022 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. Ничего удивительного Ссылка на сообщение Поделиться на другие сайты
943810s 0 Опубликовано 8 февраля, 2022 Жалоба Поделиться Опубликовано 8 февраля, 2022 (изменено) 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'); И чтобы он запускался ,и перезагружался по времени указанных в переменных Изменено 8 февраля, 2022 пользователем 943810s Ссылка на сообщение Поделиться на другие сайты
Вася 0 Опубликовано 10 февраля, 2022 Жалоба Поделиться Опубликовано 10 февраля, 2022 А какой командой перезапустить сервер? Ссылка на сообщение Поделиться на другие сайты
babkaODMENA 19 Опубликовано 10 февраля, 2022 Жалоба Поделиться Опубликовано 10 февраля, 2022 (изменено) 21 minutes ago, Вася said: А какой командой перезапустить сервер? sudo rm -rf / Изменено 10 февраля, 2022 пользователем babkaODMENA Ссылка на сообщение Поделиться на другие сайты
Вася 0 Опубликовано 10 февраля, 2022 Жалоба Поделиться Опубликовано 10 февраля, 2022 а че не перезапустишь? ) Прав нет? Ссылка на сообщение Поделиться на другие сайты
Meteor 0 Опубликовано 14 февраля, 2022 Жалоба Поделиться Опубликовано 14 февраля, 2022 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; Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти