farmwl

 Admin
  • Content count

    823
  • Joined

  • Last visited


Everything posted by farmwl

  1. farmwl added a topic in Scripting   

    [Урок 4] Процедуры и функции
    Статья еще надописана, ознакомиться с инфой по теме можете по ссылкам:
    http://learnpascal.ru/vvedenie-v-paskal/matematica-v-pasca.html
    http://learnpascal.ru/vvedenie-v-paskal/procedure-and-function-pascal.html
    Функции и процедуры - это фундамент любых скриптов \ программ. Для того, чтобы писать хорошие скрипты Вам обязательно нужно разбираться в данной теме. 
    Что это такое?
    Функции и процедуры - это мини программы, которые выполняют некоторую последовательность действий. Потом, чтобы вызвать в нужном месте выполнение некоторой функции\процедуры, Вам будет достаточно лишь вызвать ее по ее названию.
    В чем отличие процедуры от функции?
    Процедура просто выполняет действия, описанные в ней. А вот главная суть функции - в том, что она возвращает какой-нибудь результат (дает нам некоторый ответ).
    Ярким примером функции из жизни будет функция возведения числа в квадрат - мы берем некоторое число (аргумент), делаем что-то с ним, получаем ответ (результат).
    Процедура же в свою очередь просто выполняет некоторую последовательность действий.
    Чтобы было легче понять, вот вам несколько абстрактных примеров из игр (они могут не совпадать с реалиями скрипт движка, главное поймите идею):
    Процедуры: Воскреснуть, Пойти в некоторую точку, Использовать умение, Использовать предмет и тдФункции: Проверка смерти, Проверка кол-ва предметов в инвентаре, Проверка стадии квеста и тдТ.е. еще раз: в процедурах мы просто делаем что-нибудь, а в функциях нам важен некий результат действий.
    В описании скрипт движков ArcheBox и Adrenaline Вы как раз везде можете видеть ключевые слова procedure и function:

     
    Как этим пользоваться?
    Общая суть состоит в том, что вы выделяете некие отдельные блоки действий вот в такие подпрограммы, после чего вызываете их у себя в скрипте когда вам это нужно.
    Во-первых, это помогает экономить место, ведь часто некоторые действия повторяются очень часто, и благодаря функциям\процедурам Вам не нужно будет каждый раз дублировать код.
    Во-вторых, это помогает создавать некоторые универсальные блоки кода, которые будут делать почти одно и тоже, но с небольшими отличиями: например, Вам нужно найти ближайшего моба с нужным именем - Вы можете создать функцию, которая будет принимать аргумент - имя моба, и в зависимости от переданного ей имени будет находить ближайшего моба.
    Аргументы - это некоторый набор параметров, который мы передаем в функцию или процедуру. Помните пример с квадратом числа? Когда мы возводим число в квадрат мы должны знать, что это за число, ведь от этого зависит результат. Так, например, когда мы возводим в квадрат число 3, мы получаем ответ 9. В данном примере 3 - это подаваемый аргумент, а 9 - результат работы функции.
    • 0 replies
    • 789 views
  2. farmwl added a file in Scripts \ Plug-ins [Lineage II]   

    [L2] Bard's Mandolin v1.2.1
    Скрипт для автоматического прохождения квеста Мандолина Барда. Запускается с помощью бота L2Adrenalin !
    Script for automatically making Bard's Mandolin quest. You need L2Adrenalin bot to start it !
    Цена (Price): 5$ \ мес  (5$ per month)
    Купить (Buy): http://www.oplata.info/asp2/pay_wm.asp?id_d=2193608&lang=en-US

    English description + instructions:
    Особенности:
    Движение основано на GPSСкрипт сбоеустойчив к дисконектамМожно перезапустить его в любой момент времени - он подхватит себяЛогирование действий скрипта в логи ботаИнструкции по запуску:
    С помощью Script Updater скачать последнюю версию скрипта, она будет скачана в ..\Adrenalin\Scripts\Bard's_Mandolin [by farmwl]\..Запустить скрипт (Bard's_Mandolin.bin) 1 раз, он выдаст ошибку о том, что файл с ключом не найден и создаст его: key_bards_mandoline.txtЗакинуть в файл купленный ключЗапустить скрипт в Дионе
    • 110 downloads
    • 0 comments
    • 0 reviews
  3. farmwl added a post in a topic ASI WIN L2 NA палиться или нет?   

    Кодер говорит что все норм должно быть, я лично на NA не сижу, поэтому не могу утверждать что-либо
    share вообще не сидящий в L2 вообще не понимаю нахрена тут что-то комментирует, видимо разделом ошибся
  4. farmwl added a post in a topic Win10 Runtime error   

    последний адейт вин 10 - не приоритетная задача
    апдейтов за последние дни уже было несколько, даты в апдейтере не меняются по понятным причинам
  5. farmwl added a post in a topic Win10 Runtime error   

    Проблема в самом последнем обновлении вин 10, откатись просто. пока проблема не решится
  6. farmwl added a topic in Scripting   

    [Урок 11] Потоки (имитации псевдопараллельной работы)
    Часто бывает так, что какие-то проверки лучше всего совершать постоянно, но код скрипта не всегда можно устроить таким образом.
     таких случаях можно использовать потоки (Thread) - подпрограммы, которые могут совершаться одновременно (параллельно) с основным кодом скрипта.
    Создать новый поток можно таким образом: 
    uses SysUtils; procedure check_smth(); begin print('что-то произошло'); end; begin Script.NewThread(@check_smth); delay(-1); end. Скрипт запустит параллельно с собой еще и процедуру. Но она выполнится только 1 раз, нам же как правило нужно крутить ее в цикле. Для этого просто делаем внутри процедуры, которая будет потоком, бесконечный цикл:
    uses SysUtils; procedure check_smth(); begin while delay(1000) do print('что-то произошло'); // Будет раз в 1 сек выводить сообщение end; begin Script.NewThread(@check_smth); delay(-1); end.И сразу за этим возникает вопрос - а как остановить этот поток? Скриптовые движки увы не предоставляют возможность досрочно останавливать поток некоторой командой, однако в нашем случае можно задать логическую (boolean) переменную, которую мы будем проверять в потоке, и как только она примнет определенное значение (в нашем случае true) то выходим из процедуры с помощью exit: 
    uses SysUtils; var i: integer; stop_thread: boolean = false; // Наш флаг-переключатель, по умолчанию false (выключен) procedure check_smth(); begin while delay(1111) do begin if (stop_thread) then exit; // Если флаг "включен", то выходим из потока print('i = '+inttostr(i)); end; end; begin i:= 0; Script.NewThread(@check_smth); while delay(1111) do begin inc(i); // Увеличиваем i на 1 if (i > 11) then flag:= true; // Если i > 11, то "включаем" флаг end; end. Разумеется, это не единственный вариант, иногда лучше внутри процедуры, которая будет выполняться в потоке сделать просто проверку на к-л условие, чтобы процедура не выполнялось когда это не требуется.
    Рассмотрим наиболее часто требующийся поток: проверку на дисконнект + торможение скрипта в случае вылета:
    uses SysUtils; var block_disconnect_thread: boolean = false; // переключатель для отключения работы (но не остановки!) потока procedure Check_Disconnect_Thread(); var was_disconnected: boolean; begin was_disconnected:= false; while delay(33) do begin if (block_disconnect_thread) then continue; if (Status <> lsOnline) then begin was_disconnected:= true; Print('Дисконнект, торможу скрипт'); Script.Suspend; while (Status <> lsOnline) do delay(11); end; if (block_disconnect_thread) then continue; if (Status = lsOnline) then begin if (was_disconnected) then begin was_disconnected:= false; Script.Resume; Print('Соединение восстановлено, продолжаю работу',); end; while (Status = lsOnline) do delay(11); end; end; end; begin Script.NewThread(@Check_Disconnect_Thread); end.Важно понимать, что данные потоки - это дочерние сущности скрипт движка, поэтому они достаточно безопасны в использовании, создавая свои потоки по средствам синтаксиса самого Delphi - Вы рискуете повесить самого бота
    Так же существует возможность подавать аргумент в функцию при запуске потока, пример можете найти тут
    • 13 replies
    • 4,046 views
  7. farmwl added a topic in Scripting   

    [Урок 6] Работа с Unit'ами. Разбиение кода на части
    В скриптовом движке, как и в самом Delhi есть возможность разбивать код на так называемые Unit'ы (модули) - отдельные файлы, в которых могут быть описаны самодостаточные логические элементы (классы \ методы и тд).
    Для чего это нужно?
    Например вы пишите большой скрипт. Хранить весь код в одном файле, когда строк кода больше 3к - уже не очень удобно. Предположим, что наш воображаемый скрипт - для прокачки персонажа. Можно разбить его на части, 1-10, 10-20 и тд. Либо каждый обособленный кусок кода, который отвечает за какое-либо действие (например боевка или движение или просто набор вспомогательных функций, которые часто используются в коде). Таким образом каждый Unit будет отвечать за свой этап или блок действий. Это облегчает правку скрипта в будущем.
    Как это работает?
    Итак, если раньше у нас был только 1 файл - главный (который мы запускали), то теперь у нас будет несколько файлов: главный + юниты (как Вы поняли, их может быть несколько).
    Юниты нужно подключать к главному файлу, делается это просто - добавляем его в раздел uses:
    uses SysUtils, Classes, my_unit; // my_unit - название подключаемого юнитаЕсли юнитов несколько - просто перечисляйте их через запятую.
    ВАЖНО! название txt файла, должно совпадать с названием юнита, т.е. в данном случае это будет my_unit.txt
    Теперь перейдем к структуре юнита, она должна быть следующая:
    unit my_unit; interface uses // имена других модулей (юнитов), которые надо подключить к данному, // чтобы иметь доступ к классам, функциям, переменным, объектам и т.п. // этих модулей в области Interface и Implementation // Область Interface. Здесь находятся описания типов, объектов и процедур, которые БУДУТ ВПОСЛЕДСТВИИ ВИДНЫ в других // в других модулях, если к ним подключить данный type // описания типов и классов, к которым БУДЕТ ПРЕДОСТАВЛЕН доступ другим юнитам, если к ним подключить данный var // описания объектов и переменных, к которым БУДЕТ ПРЕДОСТАВЛЕН доступ другим юнитам, если к ним подключить данный implementation // Реализация uses // здесь могут быть перечислены имена юнитов, которые могут использоваться только в реализации классов или функций/процедур type // описания типов и классов, к которым НЕ БУДЕТ ПРЕДОСТАВЛЕН доступ другим юнитам, если к ним подключить данный var // описания объектов и переменных, к которым НЕ БУДЕТ ПРЕДОСТАВЛЕН доступ другим юнитам, если к ним подключить данный // Код юнита. Тут реализация классов, описанных выше в разделе type областей interface и implementation данного юнита end.Все, что описано в области interface, будет доступно из других модулей, если данный модуль к ним подключить. Здесь могут находиться описания классов (только описания!), описания процедур и функций (если они не являются методами класса, то тогда достаточно будет просто указать их заголовок с параметрами в области interface), переменные, объекты, константы. Вся реализация должна находиться после ключевого слова implementation (которое в переводе как раз и означает «реализация»). В «реализации» также могут находиться описания и других типов, классов, переменных, объектов, процедур, но только тогда они никак не могут быть доступными из других юнитов.
    Т.е. основная суть: чтобы сделать «что-то» доступным для других юнитов (при условии подключении данного юнита в разделе uses), необходимо описание «этого» поместить в область interface.
    • 2 replies
    • 2,028 views
  8. farmwl added a post in a topic неработает бот   

    повторялось уже неоднократно: обновления защиты со стороны серверов - это не наша прихоть, мы бы и сами были только рады их отсутствию. у них на нас уходит обычно 2 недели, у нас на них 1-2 дня. в этот раз увы совпало так, что кодер в отъезде, поэтому апдейт затянут. время компенсируется
    Тестовая версия A.dll доступна в чате на главной (смарт)
  9. farmwl added a post in a topic неработает бот   

    кодер в отъезде, как только так сразу
  10. farmwl added a post in a topic неработает бот   

    да, это СГ тоже
    в скайпе часто добавляетя много народа, но сообщения видимо пишите еще до добавления в контакты, поэтому эти сообщения не отображаются у меня сразу. дублируйте их значит на всякий случай. можете 2 раза продублировать, если не ответил в течение нескольких часов
  11. farmwl added a post in a topic неработает бот   

    смарт гвард обновлен, не удосужился даже прочитать FAQ?
  12. farmwl added a post in a topic adri + asi Загрузка акка под определенным скриптом   

    Увы адреналин не умеет обращаться к оконке, чтобы получить название аккаунта в МА, или сервер\номер персонажа и тд
    Чтобы делать автозапуск скрипта, можно сделать как описано тут
    Так же, если у тебя нет огромной текучки ботов, то можно в интерфейсе настроить на определенные ники запуск скриптов: 

    Работает это так: у тебя при запуске окна, сначала подгружается конфиг с названием как ник персонажа.  В этом конфиге нужно указать какой скрипт запускать после входа в игру. В этом скрипте ты уже загружаешь нужные конфиги и тд
  13. farmwl added a post in a topic Немного инфы об Engine.BypassToServer   

    если тебе нужно записывать выборы диалогов Alt + B, то можно HEX редакторами воспользоваться
    если просто диалоги с НПС - то Engine.DlgText содержит в себе всю необходимую информацию
  14. farmwl added a post in a topic Вопрос по Sсript Recorder   

    запускаешь скрипт -> делаешь что-нибудь в игре, он записывает твои действия -> копируешь их в свой скрипт например
    для каких целей использовать запись каждый решает для себя сам. кому-то нужно записать маршрут для возврата на спот, кому-то спарсить диалоги через Alt+B
  15. farmwl added a post in a topic Проблемы \ решения   

    Стоит понимать разницу между скрипт движком и стандартными функциями бота. Многие новые команды скрипт движка основаны уже именно на пакетах, в частности как раз аук функции. по этой же причине они вышли из строя с обновлением
  16. farmwl added a post in a topic Как пользоваться Script_Recorder'ом для Адреналина?   

    Тебе следует для начала основы скриптописания освоить видимо, базовую инфу можно найти тут: http://asiwin.com/forum/53-scripting/
    А то, по-моему, ты не очень представляешь как оно вообще должно выглядеть и работать)
     
  17. farmwl added a post in a topic Как пользоваться Script_Recorder'ом для Адреналина?   

    что там объяснять то? в инструкции описано подробно как запустить.
    если выдает ошибки при запуске - скачай последнюю версию, она там 1.3.1
  18. farmwl added a post in a topic Проблемы \ решения   

    а ты уверен, что у тебя версия с волкером?
    оконка за 300р - это именно оконка, без волкера. для волкера ключи пооконные от адреналина подходят если что
  19. farmwl added a topic in L2Adrenalin   

    Как узнать свои координаты? Запись маршрута в L2Adrenaline боте
    Существует 2 способа записи маршрута:
    Запись текущих (своих) координат.
    Тут все просто - Вы становитесь активным персонажем в нужную точку, переходите в многооконку, ставите курсор мыши в нужное место (в скрипте) и нажимаете сочетание клавиш Alt + V (это работает как с Ctrl+V, только Alt+V). Все, ASI записала текущие координаты туда, где был установлен курсор мыши.Запись маршрута встроенным рекордером.  
    Вы должны поставить курсор мыши в нужное место в скрипте и активировать функцию записи (красный кружок, расположен в закладке скрипт).
    Теперь Вам остается просто кликать мышкой в игре, каждый клик будет записываться рекордером, преобразуя координаты в готовые MoveTo. 
    • 0 replies
    • 663 views
  20. farmwl added a topic in L2Adrenalin   

    Работа с динамическими bypass'ами. Парсинг. Регулярные выражения.
    Сейчас админы серверов изобретают различные методы противодействия ботам. В этой статье будет рассмотрено, какие методы защиты применяются в диалогах, направленные на то, чтобы затруднить ботам их работу, в то время как для обычных игроков подобные меры защиты скорей всего будут даже не заметны.
    Пока я разрабатывал и тестировал скрипт для Adrenalin'a на прохождение квестов на ТТ рецепты, я встретил несколько способов, которые и будут описаны ниже. Для удобства я буду рассматривать диалог с Джереми, у которого берутся эти квесты. Для удобного просмотра диалогов в процессе работы можно воспользоваться Script Recorder'ом.
    Динамически меняющийся bypass (например, на euro-pvp.com). Самый простой случай - сама фраза, которую мы хотим выбрать не меняется, но с каждым новым открытием диалога меняется bypass, который нужно отправить. Обычно данный способ комбинируют с каким-нибудь еще.
    <a action="bypass -h 0-739772929">[Доставка ликера (In progress)]</a><br> // 0-739772929 <a action="bypass -h 01784106480">[Доставка яиц (In progress)]</a><br> // 01784106480<a action="bypass -h 0-739859206">[Доставка ликера (In progress)]</a><br> // 0-739859206 <a action="bypass -h 01784133759">[Доставка яиц (In progress)]</a><br> // 01784133759 Замена одной или нескольких букв в строчке (например, на emerial.ru). Длина строки при этом не меняется. Как правило, в исходной строке заменяют пару букв, так что бегло взглянув это можно даже не заметить. Например, вместо "Доставка яиц" будет "Досrавка яиц". Этот способ как раз и используется в дополнение к предыдущему, т.е. при каждом новом открытии диалога меняется и строка ответа и bypass. Данный способ мешает нам искать bypass по заранее известной подстроке, <a action="bypass -h 01736714927">[Доставка ликdра]</a><br> // 01736714927 <a action="bypass -h 0-1931249600">[Дeставка яиц]</a><br> // 0-1931249600<a action="bypass -h 01736767322">[Доставка лdкера]</a><br> // 01736767322 <a action="bypass -h 0-1931186782">[Доставка aиц]</a><br> // 0-1931186782Использование "невидимых" нам спец. символов. Причем как внутри диалога, так и внутри bypass'a (например, на ketrawars.net). Фактически они присутствуют в диалоге, но при экранировании (т.е. когда нам показывают этот диалог) они не отображаются. Это связано с нестандартными кодировками, кому сильно интересно можете погуглить. По этой же причине я не могу, например, выложить на форум код этих строк (эти спец символы будут автоматически удалены), поэтому любуемся скриншотами:В обычном блокноте:

    В Sublime:

    Таким образом, длина искомой подстроки меняется каждый раз, однако последовательность символов в этой подстроке целиком сохранятся.
    Возможно есть еще другие виды защит именно на уровне всевозможных модификаций диалогов (вылезающие при открытии диалога каптчи - это отдельный разговор), но мне пока другие не встречались.
    Итак, теперь, когда ясна задача, можно думать над тем, как находить заветные bypass's для отправки. Вариантов опять таки несколько, можно решить это, не выходя за рамки функций Pos, Copy, Delete, Trim и тд. Однако проще и красивее будет использовать регулярные выражения (regular expressions). О том, что это и как они составляются можете погуглить. Если кратко, то это поиск по шалблонам, который позволяет нам парсить диалоги в разы проще.
    Как пользоваться регулярными выражениями?
    Тут все просто, подключаете модуль RegExpr в раздел uses и пользуетесь.
    Пример:
    uses SysUtils, Classes, RegExpr; // подключили модуль RegExpr procedure PrintAllTags(); // распечатать все конструкции с bypass'ами var RegExp: TRegExpr; begin RegExp:= TRegExpr.Create; RegExp.Expression:= '(<a *(.+?)</a>)|(<button *(.+?)>)'; if RegExp.Exec(Engine.DlgText) then repeat Print(RegExp.Match[0]); until (not RegExp.ExecNext); RegExp.Free; end; begin PrintAllTags(); end.Этот простой код найдет и распечатает нам все интересующие bypass'ы:

     
    uses SysUtils, Classes, RegExpr; // подключили модуль RegExpr function Bypass(dlg: string): boolean; var RegExp: TRegExpr; SL: TStringList; i: integer; bps: string; begin Result:= true; // задаем результат по умолчанию RegExp:= TRegExpr.Create; // инициализируем объекты для дальнейшей работы SL:= TStringList.Create; RegExp.Expression:= '(<a *(.+?)</a>)|(<button *(.+?)>)'; // задаем регэксп на поиск всех возможных bypass'ов if RegExp.Exec(Engine.DlgText) then // если нашлелся нужный шаблон, то repeat SL.Add(RegExp.Match[0]); // заполняем наш список такими совпадениями until (not RegExp.ExecNext); // пока не закончатся шаблоны for i:= 0 to SL.Count-1 do begin // теперь пробегаемся по нашему списку if (Pos(dlg, SL[ i ]) > 0) then begin // если в i-ой строке нашелся искомый текст, то RegExp.Expression:= '"bypass -h *(.+?)"'; // ищем шаблон текста c bypass'ом if RegExp.Exec(SL[ i ]) then // и если нашли, то копирем из него интересующий нас кусок bps:= TrimLeft(Copy(RegExp.Match[0], 12, Length(RegExp.Match[0])-12)); end; end; Print(bps); // распечатываем конечный вариант bypass'а if (Length(bps) > 0) then Engine.BypassToServer(bps); // если его длина > 0, то отправляем на сервер RegExp.Free; // не забываем освобождать память SL.Free; end; begin Bypass('Набор воина'); end.О правилах составления регулярных выражений полно инфы в инете, например тут
    Возможностей много, можете почитать исходники: RegExpr.txt
    Надеюсь, что распарсить полученные строчки не составит труда
    • 2 replies
    • 3,051 views
  21. farmwl added a post in a topic Проблемы \ решения   

     > Бот не пакетный и не изменяет данные (c) http://asiwin.com/buy/adrenalin/
    Принцип работы бота иной, ему все равно на пакеты и изменение шифраций
  22. farmwl added a topic in ArcheBox   

    Как запустить скрипт \ плагин в ASI WIN?
    Очень часто мне задают вопрос: "А как запустить скрипт?".
    Максимально наглядный ответ:

    • 2 replies
    • 1,835 views
  23. farmwl added a topic in L2Adrenalin   

    Как запустить скрипт в Adrenaline bot без запуска клиента L2
    В Adrenaline для открытия \ редактирования \ запуска скрипта необходимо, чтобы в списке аккаунтов появился хотя бы 1 аккаунт.
    Как правило многие запускают клиент игры ради этого, но можно сделать проще. достаточно выделить поле редактирования скрипта и нажать сочетание Ctrl + P - появится "пустой" аккаунт. Теперь его можно выделить и работать со скриптами не прибегая к запуску игры.

    • 2 replies
    • 1,077 views
  24. farmwl added a post in a topic Проблемы \ решения   

    конечно ведется, пока тестируем, еще немножко терпения)
  25. farmwl added a topic in Interface set up examples   

    Список тем по настройке интерфейса L2 Adrenalin
    В данной теме будут собраны ответы на часто возникающие вопросы, которые можно решить с помощью интерфейса:
    Не забывайте, у нас есть подробнейшая инструкция по настройке интерфейса в текстовом формате
    Настройка кайта \ дистанционной атаки (для лучников и магов)Ребафф через Alt+B (работает не везде) Авто использование банок душ камаэлей \ камней зарядок гладов и тировНастройка спойла \ свипаНастройка крафта сосок \ ресурсовНастройка рыбалкиПример полной настройки коневода на АОЕ фармНастройка скилов пета \ сумонаНастройка реса в патиНастройка Toogle-скилов (Vicious Stance, Arcane Power и тд)
    • 0 replies
    • 2,706 views