API UO Terminate - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
UO.Terminate
Оглавление · Алфавитный указатель · Scripts & Runtime
ClassicUO • Runtime API
Запрашивает аварийную остановку процедуры Basic. Без аргументов выбирает последнюю запущенную процедуру, которая ещё не останавливается. С именем останавливает все запуски с этим именем; точный ключ вида harvest.sc::Main выбирает конкретную процедуру из файла. Для остановки вообще всех скриптов предусмотрена отдельная UO.TerminateAll().
Точный синтаксис
UO.Terminate() -> Unit
UO.Terminate(subrutineName:String) -> Unit
Выберите одну из зарегистрированных форм. Параметры передаются позиционно. Any означает значение BASIC с преобразованием внутри команды; Unit — отсутствие возвращаемого значения.
Параметры
subrutineName— Необязательная строка: имя запущенной процедуры, например Harvest; либо точный ключ из каталога, например harvest.sc::Main. Регистр не важен. "all" означает остановку всех и равнозначен UO.TerminateAll(). Пустая строка, как и отсутствие аргумента, выбирает последнюю запущенную процедуру. Неизвестное непустое имя ничего не останавливает.
Возвращает
Unit: команда не возвращает число и не ожидает завершения рабочего потока. Она немедленно запрашивает отмену. Исполнение прекращается на ближайшей проверке отмены; паузы, точки останова и встроенные ожидания прерываются. Серверные действия, уже отправленные до отмены, не откатываются.
Поведение
- UO.Terminate() выбирает процедуру по порядку запуска, а не по имени, строке редактора, времени последнего действия или порядку отображения. Поставленная на паузу процедура также считается запущенной.
- Выбираются отдельные запуски. Обычные вызовы вложенных SUB/FUNCTION работают в том же запуске; при остановке прекращается вся его цепочка вызовов. Команда не завершает клиент или процессы Windows.
- Очищается принадлежащий этому запуску локальный прицел и отменяется оставшийся автоматический маршрут. Отмена движения выполняется на игровом потоке; если маршрут уже заменён другим запуском или пользователем, прежний владелец его не останавливает. Отправленные серверу шаги не отзываются.
- Если создать новый SUB StopLast() и вызвать из него UO.Terminate(), сам StopLast может оказаться последним запуском. Для игровой горячей клавиши используйте действие макроса «Basic Command» с текстом UO.Terminate(): такой вызов обрабатывается напрямую, без запуска дополнительной процедуры.
- Для привязки откройте настройки → макросы, создайте макрос, выберите действие Basic Command, впишите команду, назначьте сочетание клавиш и сохраните. Для определённой процедуры впишите UO.Terminate("Harvest").
- Команда остаётся доступной при включённой настройке одного одновременного запуска. Отменённая процедура освобождает место только после очистки своего рабочего потока; до этого новый запуск пропускается.
- При остановке по имени также отменяются соответствующие отложенные запуски. Завершённые процедуры не изменяются. Об отсутствии подходящего запуска клиент сообщает в статусе. Зависший вызов стороннего нативного плагина, который не поддерживает отмену, нельзя безопасно прервать принудительным уничтожением потока.
Примеры
Пример 1. Горячая клавиша для последней запущенной процедуры
UO.Terminate()
Разбор параметров и выполнения:
- Аргументов нет: используются пустые скобки. Вставьте эту строку в действие макроса Basic Command, затем назначьте клавишу.
- Если сначала запущен Harvest, а потом Heal, первое нажатие отменяет Heal. Следующее нажатие может отменить Harvest. Повторное нажатие не возобновляет остановленный запуск.
- Этот пример является текстом команды для макроса. Не оборачивайте его в отдельный SUB StopLast(), если требуется остановить ранее запущенный скрипт.
Пример 2. Остановить харвест по имени, оставив остальные процедуры
# Остановить харвест по имени, оставив остальные процедуры
#
# Запрашивает аварийную остановку процедуры Basic. Без аргументов выбирает последнюю запущенную
# процедуру, которая ещё не останавливается. С именем останавливает все запуски с этим именем;
# точный ключ вида harvest.sc::Main выбирает конкретную процедуру из файла. Для остановки вообще
# всех скриптов предусмотрена отдельная UO.TerminateAll().
#
# Unit: команда не возвращает число и не ожидает завершения рабочего потока. Она немедленно
# запрашивает отмену. Исполнение прекращается на ближайшей проверке отмены; паузы, точки
# останова и встроенные ожидания прерываются. Серверные действия, уже отправленные до отмены, не
# откатываются.
# Единственный параметр subrutineName получает значение procedureName, то есть строку Harvest.
# Все одновременно запущенные процедуры с именем Harvest получают отмену, в том числе из разных
# файлов. Процедура с другим именем, например Heal, продолжает работу.
# Print сообщает об отправке запроса отмены, а не подтверждает завершение всех потоков. Этот
# служебный SUB должен иметь возможность запуститься; при включённом запрете параллельных
# процедур используйте ту же UO.Terminate("Harvest") напрямую в командном макросе.
SUB StopHarvest()
VAR procedureName = 'Harvest'
UO.Terminate(procedureName)
UO.Print('Cancellation requested for Harvest')
END SUB
Разбор параметров и выполнения:
- Единственный параметр subrutineName получает значение procedureName, то есть строку Harvest.
- Все одновременно запущенные процедуры с именем Harvest получают отмену, в том числе из разных файлов. Процедура с другим именем, например Heal, продолжает работу.
- Print сообщает об отправке запроса отмены, а не подтверждает завершение всех потоков. Этот служебный SUB должен иметь возможность запуститься; при включённом запрете параллельных процедур используйте ту же UO.Terminate("Harvest") напрямую в командном макросе.
Пример 3. Выбрать Main только из определённого файла
# Выбрать Main только из определённого файла
#
# Запрашивает аварийную остановку процедуры Basic. Без аргументов выбирает последнюю запущенную
# процедуру, которая ещё не останавливается. С именем останавливает все запуски с этим именем;
# точный ключ вида harvest.sc::Main выбирает конкретную процедуру из файла. Для остановки вообще
# всех скриптов предусмотрена отдельная UO.TerminateAll().
#
# Unit: команда не возвращает число и не ожидает завершения рабочего потока. Она немедленно
# запрашивает отмену. Исполнение прекращается на ближайшей проверке отмены; паузы, точки
# останова и встроенные ожидания прерываются. Серверные действия, уже отправленные до отмены, не
# откатываются.
# Параметр subrutineName получает полный ключ harvest.sc::Main: имя файла относительно Autoload,
# две двоеточия и имя процедуры.
# Замените примерный ключ точным ключом вашей процедуры. Для второго одноимённого объявления
# каталог может содержать суффикс #2.
# Такой ключ не совпадает с heal.sc::Main: другой файл остаётся запущенным. Если ключ не найден,
# случайная процедура не выбирается.
SUB StopOneFile()
VAR procedureKey = 'harvest.sc::Main'
UO.Terminate(procedureKey)
UO.Print('Cancellation requested: ' + procedureKey)
END SUB
Разбор параметров и выполнения:
- Параметр subrutineName получает полный ключ harvest.sc::Main: имя файла относительно Autoload, две двоеточия и имя процедуры.
- Замените примерный ключ точным ключом вашей процедуры. Для второго одноимённого объявления каталог может содержать суффикс #2.
- Такой ключ не совпадает с heal.sc::Main: другой файл остаётся запущенным. Если ключ не найден, случайная процедура не выбирается.
Пример 4. Совместимая консольная форма через Exec
# Совместимая консольная форма через Exec
#
# Запрашивает аварийную остановку процедуры Basic. Без аргументов выбирает последнюю запущенную
# процедуру, которая ещё не останавливается. С именем останавливает все запуски с этим именем;
# точный ключ вида harvest.sc::Main выбирает конкретную процедуру из файла. Для остановки вообще
# всех скриптов предусмотрена отдельная UO.TerminateAll().
#
# Unit: команда не возвращает число и не ожидает завершения рабочего потока. Она немедленно
# запрашивает отмену. Исполнение прекращается на ближайшей проверке отмены; паузы, точки
# останова и встроенные ожидания прерываются. Серверные действия, уже отправленные до отмены, не
# откатываются.
# UO.Exec получает один строковый параметр command. Внутри строки terminate — команда, а Harvest
# — её единственный аргумент с именем процедуры.
# Это тот же запрос остановки, что UO.Terminate("Harvest"). В игровом чате со стандартным
# префиксом используется ,terminate Harvest.
# Не добавляйте имя файла вместо имени процедуры без разделителя ::; для точного выбора
# используйте форму предыдущего примера.
SUB StopGathering()
VAR command = 'terminate Harvest'
UO.Exec(command)
UO.Print('Stop command sent')
END SUB
Разбор параметров и выполнения:
- UO.Exec получает один строковый параметр command. Внутри строки terminate — команда, а Harvest — её единственный аргумент с именем процедуры.
- Это тот же запрос остановки, что UO.Terminate("Harvest"). В игровом чате со стандартным префиксом используется ,terminate Harvest.
- Не добавляйте имя файла вместо имени процедуры без разделителя ::; для точного выбора используйте форму предыдущего примера.