API UO TerminateAll - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
UO.TerminateAll
Оглавление · Алфавитный указатель
ClassicUO • Runtime API
Запрашивает аварийную остановку всех активных скриптов Basic данного клиента: отдельных процедур, обычных скриптов, Autoload и встроенных примеров. Отменяет ожидающие запуска процедуры, включая ожидающие подготовки файла и перезапуска отладчика, чтобы они не запустились после остановки.
Точный синтаксис
UO.TerminateAll() -> Unit
Выберите одну из зарегистрированных форм. Параметры передаются позиционно. Any означает значение BASIC с преобразованием внутри команды; Unit — отсутствие возвращаемого значения.
Параметры
Параметров нет.
Возвращает
Unit: результата нет. Команда запрашивает отмену всех текущих запусков и возвращает управление вызывающему коду, если он сам не был отменён. Очистка рабочих потоков выполняется после срабатывания их проверок отмены.
Поведение
- Точный синтаксис — UO.TerminateAll(), без пробела внутри имени и без аргументов. UO.Terminate("all") поддерживается как совместимая альтернативная запись.
- Останавливаются работающие процедуры, процедуры на ручной паузе и на точке останова, встроенные ожидания и зарегистрированные отложенные запуски. Повторный вызов при отсутствии работы безопасен.
- Снятие локальных прицелов и автоматических маршрутов учитывает их владельцев. Оставшийся маршрут остановленного скрипта отменяется на игровом потоке; новый маршрут пользователя, заменивший его, сохраняется. Уже отправленные пакеты движения не отменяются.
- Если вызвать команду из выполняющегося SUB, этот SUB тоже получает отмену: строки после TerminateAll() исполняться не должны. Общий клиент и его сетевое соединение продолжают работать.
- Галочка одного одновременного запуска не блокирует команду. Чтобы аварийная клавиша не зависела от запуска ещё одного SUB, используйте действие макроса Basic Command с текстом UO.TerminateAll().
- Команда относится к скриптам Basic этого клиента. Она не выключает отдельные службы AutoLoot/AutoBuy/AutoSell в Bad Newbie и не затрагивает другой запущенный клиент.
- Отмена не откатывает уже отправленные серверу действия. Код сторонних нативных плагинов без поддержки отмены нельзя безопасно уничтожить вместе с потоком. Новые явные запуски после выполнения команды разрешены; при включённой галочке они ждут освобождения места в том смысле, что попытка до завершения очистки пропускается, а не ставится в очередь.
Примеры
Пример 1. Назначить общую аварийную клавишу
UO.TerminateAll()
Разбор параметров и выполнения:
- Параметров нет. Вставьте строку в макрос с действием Basic Command, назначьте удобное сочетание клавиш и сохраните.
- Нажатие передаёт отмену всем скриптам напрямую. Дополнительный SUB не создаётся, поэтому запрет одновременных процедур не мешает остановке.
- Та же команда доступна в чате: ,terminateall при стандартном префиксе запятая.
Пример 2. Остановить все скрипты из проверки внутри рабочего скрипта
# Остановить все скрипты из проверки внутри рабочего скрипта
#
# Запрашивает аварийную остановку всех активных скриптов Basic данного клиента: отдельных
# процедур, обычных скриптов, Autoload и встроенных примеров. Отменяет ожидающие запуска
# процедуры, включая ожидающие подготовки файла и перезапуска отладчика, чтобы они не
# запустились после остановки.
#
# Unit: результата нет. Команда запрашивает отмену всех текущих запусков и возвращает управление
# вызывающему коду, если он сам не был отменён. Очистка рабочих потоков выполняется после
# срабатывания их проверок отмены.
SUB Main()
# У TerminateAll нет параметров. Условие UO.Dead() проверяет смерть персонажа перед очередной
# итерацией.
# При выполнении условия отменяются и текущий Main, и остальные запуски Basic. Сообщение Print
# расположено до остановки, поскольку после неё код этой процедуры прекращается.
# WAIT(250) задаёт паузу 250 миллисекунд между проверками в этом примере. Команда остановки не
# меняет длительность обычных пауз скрипта.
VAR cycle
FOR cycle = 1 TO 10
IF UO.Dead() THEN
UO.Print('Character is dead: stopping all Basic scripts')
UO.TerminateAll()
END IF
# Здесь выполняется одна безопасная итерация вашей работы.
WAIT(250)
NEXT
END SUB
Разбор параметров и выполнения:
- У TerminateAll нет параметров. Условие UO.Dead() проверяет смерть персонажа перед очередной итерацией.
- При выполнении условия отменяются и текущий Main, и остальные запуски Basic. Сообщение Print расположено до остановки, поскольку после неё код этой процедуры прекращается.
- WAIT(250) задаёт паузу 250 миллисекунд между проверками в этом примере. Команда остановки не меняет длительность обычных пауз скрипта.
Пример 3. Совместимая форма с all
# Совместимая форма с all
#
# Запрашивает аварийную остановку всех активных скриптов Basic данного клиента: отдельных
# процедур, обычных скриптов, Autoload и встроенных примеров. Отменяет ожидающие запуска
# процедуры, включая ожидающие подготовки файла и перезапуска отладчика, чтобы они не
# запустились после остановки.
#
# Unit: результата нет. Команда запрашивает отмену всех текущих запусков и возвращает управление
# вызывающему коду, если он сам не был отменён. Очистка рабочих потоков выполняется после
# срабатывания их проверок отмены.
# В этой альтернативной записи используется UO.Terminate с одним параметром subrutineName="all".
# Это эквивалент UO.TerminateAll().
# Строка all — специальное значение, а не имя процедуры, которое требуется объявить. Отменяется
# и EmergencyStop.
# Для аварийной игровой клавиши используйте однострочную команду из первого примера: отдельная
# процедура EmergencyStop сама подчиняется запрету параллельных запусков.
SUB EmergencyStop()
UO.Print('Stopping all Basic scripts')
UO.Terminate('all')
END SUB
Разбор параметров и выполнения:
- В этой альтернативной записи используется UO.Terminate с одним параметром subrutineName="all". Это эквивалент UO.TerminateAll().
- Строка all — специальное значение, а не имя процедуры, которое требуется объявить. Отменяется и EmergencyStop.
- Для аварийной игровой клавиши используйте однострочную команду из первого примера: отдельная процедура EmergencyStop сама подчиняется запрету параллельных запусков.
Пример 4. Остановить общую работу, если обязательный объект стал недоступен
# Остановить общую работу, если обязательный объект стал недоступен
#
# Запрашивает аварийную остановку всех активных скриптов Basic данного клиента: отдельных
# процедур, обычных скриптов, Autoload и встроенных примеров. Отменяет ожидающие запуска
# процедуры, включая ожидающие подготовки файла и перезапуска отладчика, чтобы они не
# запустились после остановки.
#
# Unit: результата нет. Команда запрашивает отмену всех текущих запусков и возвращает управление
# вызывающему коду, если он сам не был отменён. Очистка рабочих потоков выполняется после
# срабатывания их проверок отмены.
# GetSerial сохраняет serial обязательного объекта, здесь собственного рюкзака. Exists=0
# означает, что этот объект сейчас неизвестен клиенту.
# TerminateAll вызывается без аргументов только при нарушении выбранного условия. Эта политика
# останавливает все процедуры, а не только работу с данным рюкзаком.
# Сначала выводится причина остановки. После запроса отмены текущая процедура тоже прекращается;
# рассчитывать на выполнение следующего действия нельзя.
SUB GuardBackpack()
VAR bag = UO.GetSerial('backpack')
IF UO.Exists(bag) = 0 THEN
UO.Print('Required backpack is unavailable: stopping all scripts')
UO.TerminateAll()
END IF
END SUB
Разбор параметров и выполнения:
- GetSerial сохраняет serial обязательного объекта, здесь собственного рюкзака. Exists=0 означает, что этот объект сейчас неизвестен клиенту.
- TerminateAll вызывается без аргументов только при нарушении выбранного условия. Эта политика останавливает все процедуры, а не только работу с данным рюкзаком.
- Сначала выводится причина остановки. После запроса отмены текущая процедура тоже прекращается; рассчитывать на выполнение следующего действия нельзя.