Планировали, планировали, да запланировали.

    С помощью планировщика можно осуществлять однократный или многократный запуск lua-скриптов, через которые контролировать различные параметры программы или события игры, и, в свою очередь, осуществлять реакцию на них.

    Как обычно большинство моих изобретений имеют разную степень "сложности"(количество параметров влияющих на результат). Рассмотрю их в отдельности. Можете заварить кофе/чай, а то может и запастись стаканом, как известно, он первый помощник в ситуациях вникания =) . Поехали.

    Вызвать окно со списком расписаний можно, например, из меню "Окна" рабочего окна. Этот пункт слева имеет значок часов.

    Если в списке не выделен ни один элемент, то окно содержит непосредственно список и несколько управляющих элементов вверху. Одним из которых является создание нового "события". 

    Нажатие на ссылку добавляет новую запись с "точкой" срабатывания "сейчас" (удалить ненужную позицию можно кликом в поле "Удалить"-"Х" в самом списке). При этом над списком отображается область параметров текущего элемента (текущего выделенного). В ней ему можно отредактировать:
(1) идентификатор (ИД). Уникальная строка, которая используется для изменения параметров расписания из скриптов;
(2) комментарий. Еще одна строка, в которой можно указать более подробное текстовое описание выполняемой задачи;
(3) основной (всегда однократный) скрипт. Набор команд, который нужно выполнить.
(4) время срабатывания (полный набор из год.месяц.день часы:минуты:секунды). Причем кроме фиксированного значения может иметь циклическое. Фиксированное это, например, "2021.02.24 12:00:00". Оно сработает один раз, после чего без машины времени (ну либо манипуляций с системным временем) создать условия повторного срабатывания будет невозможно. 
    А циклическое использует отрицательные значения в соответствующих полях. Имеет смысл кратности начиная с нуля. 
    "-2" - каждое второе значение: 0, 2, 4, 6 ... 20, 22, ...
    "-3" - каждое третье: 0, 3, 6, ... 18, 21, ...
    "-4" - каждое четвертое: 0, 4, 8, ... 16, 20, ...
и так далее, причем "-1" - по сути "каждое" любое, т.к. период этого значения получается "1".
    Пример:"2021.02.24 12:-2:00" - срабатывать каждую четную минуту (после :00 секунд) в течении часа "12" указанной даты. Получится 30 срабатываний за этот час ("2021.02.24 12:00:00", "2021.02.24 12:02:00"... "2021.02.24 12:58:00").
    Пример:"2021.-1.24 -2:01:01" - срабатывать каждый месяц 24го числа каждый четный час (в 01 минут и 01 секунд). Тут уже срабатываний больше и они будут распределены на весь 2021 год ("2021.01.24 00:01:01", "2021.01.24 02:01:01" ... "2021.02.24 04:01:01" ... "2021.12.24 22:01:01").
    Явный минус - начальная точка отсчета всегда 0. Задать сработку со смещением, например для периода "2": 1, 3, 5, 7, ... - не получится.
    Рассмотренный выше набор параметров является базовым. Однако есть расширенный, включающий дополнительные поля (обозначаются звездочкой * впереди) и их влияние на итоговый результат.     Активируется он для всего списка целиком опцией "*доп. поля списка"(1) в верхней части окна и включает кроме описанных выше (которые не меняют свой смысл) следующие:
    (2) *дополнительный период активности. После срабатывания основной временной "точки" указанное число секунд считается "активным периодом". Каждая проверка, попадающая в этот период имеет отдельную обработку.
    (3) *скрипт дополнительного периода. Именно он будет запускаться в этот период. Причем может это делать неоднократно.
    (4) *счетчик доп.скрипта. Регулирует число выполнений. "0" - каждый раз при проверке в активном периоде. Положительное число - не более указанного число раз. Даже если активный период продолжается, но счетчик израсходован, скрипт вызываться не будет. Отрицательное число запрещает выполнение, задавать его исходным в параметре смысла особого нет, но можно установить из какого-либо скрипта (динамическое отключение, в зависимости от других условий)
   (5) *интервал запуска доп.скрипта (секунд). Кроме выполнения в каждое попадание в активный период (а такое может происходить и, например, каждую секунду), что может быть слишком часто, чем требуется; можно выполнять *доп.скрипт не чаще, чем указанное число секунд. Т.е. если прошлое выполнение было 3 секунды назад, а интервал 5, то запуск не состоится.
    При окончании активного периода (и запусков *доп.скрипта) будет однократно запущен основной скрипт. Такая мутная (это от того, что стакан после холодной водочки запотел) схема в первую очередь преследует цель временной смены параметров. Например, есть расписание появления лото в лавке редкостей или боссов, и есть у соответствующих функций работы с этими направлениями период, когда они производят поиск цели. Вне периодов часто искать цели смысла нет - только тратить на это время, отрывая его от фарма. А в "узкие" промежутки имеет смысл только ждать и проверять очень часто. Вот тогда схема с "активным периодом" может быть полезна. 
    Вариант 1. Однократно запускаем *доп.скрипт (со счетчиком "1") в начале периода. В нем переводим программу в режим "Ожидание", а интервал опроса для нужной функции ставим в "часто" (например 1 секунда). А в конце периода уже основным скриптом возвращаем все "як и було". (Такое безусловно можно сделать и двумя записями на разные "точки" и в упрощенной схеме без *доп.полей, но этот вариант будет компактнее =) ).
    Вариант 2. Внутри *доп.скрипта (выполняемого и интервалом много раз) самостоятельно производим проверки и вызываем нужные функции. В этом случае основной завершающий скрипт даже может и не понадобится. Просто какой-то период усиленно по-проверяли что-то и успокоились. 
    *Расширенный вариант на конкретной строке списка легко преобразуется в упрощенный установкой *периода активности в значение "0". Тогда, даже если *доп.скрипт не пуст, он никогда не будет выполнен, а сразу за "точкой" срабатывания будет запущен основной.
    Еще одной особенностью планировщика является, что он работает только "между" событий работающих режимов. То есть в рабочем окне должен быть нажат Старт. Вторым моментом, что проверка осуществляется не в любые моменты, есть определенные точки выполнения, в которые будет вызван контроль. Например, он никогда не будет вызван в бою, т.к. доп. действия могут занимать продолжительное время, прерывание боя на него вызовет проигрыш. Существуют и другие "цельные" события, внутрь которых проверка не вклинивается. Это дает более стабильный результат, но реакция на события может "плавать", например установлено в "12:00:00", но очередной контроль зайдет сюда только в 12:00:02 (зависит от деталей каждого конкретного случая, если скорость реакции крайне важна, то точку срабатывания лучше установить чуть раньше, использовать *расширенный вариант и в *доп.скрипте перевести программу в режим "Ожидание", чтобы убрать всю лишнюю активность, а затем вернуть режим назад в основном завершающем скрипте).
    А теперь слайды конкретный пример для лавки редкостей. Упрощенный режим для этого не очень походит, поэтому сразу рассмотрю *расширенный, причем в обоих вариантах его использования рассмотренных выше.
   Дано: нагая дева лезет в окно. Не то =) Дано: в шестнадцать ноль-ноль дают лото. Причем эти 16:00 ориентировочные, не обязательно в 16:00:00 оно будет. Может появиться конечно, но может и в 16:00:41, и в 16:01:33. Так что имеем некий период, когда нужно "ловить".
    Реализация (детали прописи значений смотри ниже в приложении). Устанавливаем время в "2021.02.24 15:59:55" (чуть загодя, запас выбирайте на свое усмотрение). *Период активности, например, = "180" (секунд, что даст 3 минуты, за это время скорее всего гарантированно разметут большие стеки, и дальше закупиться большим объемом будет затруднительно). Дальше в соответствии с вариантами выше.
    Вариант 1. *счетчик доп.скрипта = "1". В самом *доп.скрипте два действия: перевести текущий режим в "Ожидание" и изменить интервал опроса лавки в рамках автопокупки в какое-то малое значение, например 1 секунда. 

setWorkMode( --Изменить_режим_работы_на
    modeWaiting--[[Ожидание]])
setAuchanScanInterval( --устанавливает новый интервал опроса (автопокупки) лавки
    1) --число секунд [(не обязательно),вкл/выкл (1 или 0) саму функцию]

либо если опустить комментарии в коде так (без текста не влияющего на выполнение):

setWorkMode(modeWaiting)
setAuchanScanInterval(1)

  *Доп. скрипт запустится один раз, дальше будет работать стандартная проверка автопокупки, но с более частым интервалом. Основной скрипт должен вернуть интервал проверки в значение не мешающее дальнейшей деятельности (притормаживать для опроса лавки каждую секунду "вообще всегда" сильно замедлит остальные задачи), например "240" (секунд, это 4 минуты). Кроме того в нем нужно переключить режим с "Ожидание" на тот, который вы запускали изначально, например, островной.

setAuchanScanInterval( --устанавливает новый интервал опроса (автопокупки) лавки
    240) --число секунд [(не обязательно),вкл/выкл (1 или 0) саму функцию]
setWorkMode( --Изменить_режим_работы_на
    modeIsland--[[Островной]])

или же:

setAuchanScanInterval(240)
setWorkMode(modeIsland)

    Вариант 2. *счетчик доп.скрипта = "0" (запускать любое число раз). А в *доп.скрипте немного другую конструкцию: режим "Ожидание" (перевести в него если он другой) и прямой вызов функции однократной проверки лавки (если она найдет цель, то сразу же начнет покупать). В данном случае частота опроса лавки задается параметром *интервал для доп.скрипта, например, "1" (секунда).

setWorkMode( --Изменить_режим_работы_на
    modeWaiting--[[Ожидание]])
getAuchanFromGame(--[[без параметров. Обновление лавки, возвращает признак начала покупки]])

или же:

setWorkMode(modeWaiting)
getAuchanFromGame()

    Здесь параметры самого помощника не затрагиваются и как только закончатся условия для запуска *доп.скрипта, то и частый опрос лавки тоже прекратится. Однако основной скрипт все еще нужен для выведения пома из пике режима "Ожидание". 

setWorkMode( --Изменить_режим_работы_на
    modeIsland--[[Островной]])

или же: 

 setWorkMode(modeIsland)

    Приложение к реализации
    Изменение текущего режима работы программы. Установить курсор ввода в скрипте в нужную (пустую) строку. В меню редактора (вверху) выбрать "Общие" - "Изменить режим". Пропись по умолчанию "пустая", в ней значится "не изменять". Вызов команды в таком виде допустим, но никаких изменений не произведет. 
Нужно заменить параметр в команде на нужный режим. Для этого удобно воспользоваться блоком "Режимы работы" на панели выше. Курсор ввода установить на любую часть прошлого параметра. 
В выпадающем списке выбрать нужный режим, а после нажать кнопку "V Вставить V". Текст на позиции ввода будет заменен.
    Изменение интервала опроса лавки в рамках автопокупки. Установить курсор ввода в скрипте в нужную (пустую) строку. В меню редактора (вверху) выбрать "Разное" - "Лавка редкостей" - "Установить интервал опроса". В скобках (перед закрывающей в данном случае) указать число секунд (больше нуля) нового значения.
    Вызов функции однократного опроса лавки. Установить курсор ввода в скрипте в нужную (пустую) строку. В меню редактора (вверху) выбрать "Разное" - "Лавка редкостей" - "Обновить + Поиск/запуск покупки". Данная команда без параметров вариантов выполнения у нее нет. Однако она возвращает признак начала покупки (т.е. что цель была найдена в результате) - "1", и "0" в противном случае. 
Проверив ответ можно предпринять дополнительные действия, например используя конструкцию lua: if _ then _ [else _] end.

Комментариев нет:

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.