Планировали, планировали, да запланировали.
С помощью планировщика можно осуществлять
однократный или многократный запуск 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.