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