API UO CancelTrade - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
UO.CancelTrade
ClassicUO • Runtime API
Отменяет выбранный обмен и закрывает его окно.
Точный синтаксис
UO.CancelTrade(TradeNum:Any) -> Any
Параметры
TradeNum— Целое число: текущий номер окна от 1 до TradeCount(). 0 и отрицательные значения недопустимы. Это не serial.
Возвращает
Integer: 1 = TRUE — окно найдено, закрыто и запрос отмены отправлен через закрытие; 0 = FALSE — окна нет. Это не ожидание серверного ответа. Повторная отмена закрытого окна не отправляет второй пакет.
Это логический результат: 1 = TRUE, 0 = FALSE. После VAR result = команда(...) можно писать IF result = TRUE THEN или IF result = 1 THEN; для отрицательного результата — IF result = FALSE THEN или IF result = 0 THEN. TRUE/FALSE пишутся без кавычек. Вызовите команду один раз и сохраните результат: повторный вызов может повторить действие или прочитать уже изменившееся состояние.
Поведение
- GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade нумеруют окна с 1; TradeContainer/TradeOpponent/TradeName и все формы TradeCheck — с 0. Это явная совместимость данного клиента: внешние справочники разных движков используют разные начала отсчёта.
- Чтение выполняется на игровом потоке по живым окнам текущего мира. Закрытые окна не считаются. Вызовы чтения не отправляют пакетов и не ждут ответа. Порядок UI может меняться при открытии, закрытии и переносе окна наверх; номер не является постоянным идентификатором.
- ConfirmTrade и запись своего TradeCheck отправляют пакет только при изменении согласия. Чужое согласие задаёт сервер. CancelTrade отправляет отмену один раз. 1/TRUE — локальное состояние/обработка, а не гарантия завершения обмена. Имена и оба согласия не доказывают, что состав предметов не изменился.
Внутренние функции: от вызова до результата
Ниже — путь вызова в C#. После него приведены исполняемые Basic-примеры; это не попытка заново реализовать сетевой протокол в скрипте.
1. ExecuteStealthCompatibility
Регистрация выбирает форму по числу аргументов; числа преобразуются через NumberConversions. Для TradeCheck с двумя аргументами стороны 1/2 проверяются и переводятся в 0/1 bridge. Legacy-serial форматируется через ToHex.
Integer: 1 = TRUE — окно найдено, закрыто и запрос отмены отправлен через закрытие; 0 = FALSE — окна нет. Это не ожидание серверного ответа. Повторная отмена закрытого окна не отправляет второй пакет.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ExecuteStealthCompatibility.
2. CancelTrade
Invoke передаёт чтение/изменение на игровой поток с отменой скрипта; метод читает ID1/ID2, LocalSerial, OpponentName или флажки выбранного TradingGump.
Отменяет выбранный обмен и закрывает его окно.
Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция CancelTrade.
3. FindNumberedTrade
FindNumberedTrade проверяет number>0 до вычитания 1; FindTrade отклоняет отрицательный индекс и перечисляет только незакрытые TradingGump текущего World.
GetTradeContainer/GetTradeOpponent/GetTradeOpponentName/ConfirmTrade/CancelTrade нумеруют окна с 1; TradeContainer/TradeOpponent/TradeName и все формы TradeCheck — с 0. Это явная совместимость данного клиента: внешние справочники разных движков используют разные начала отсчёта.
Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция FindNumberedTrade.
4. Dispose
Dispose сразу выходит для уже закрытого окна, освобождает UI и вызывает GameActions.CancelTrade(ID1) ровно один раз.
Integer: 1 = TRUE — окно найдено, закрыто и запрос отмены отправлен через закрытие; 0 = FALSE — окна нет. Это не ожидание серверного ответа. Повторная отмена закрытого окна не отправляет второй пакет.
Исходник проекта: src/ClassicUO.Client/Game/UI/Gumps/TradingGump.cs; функция Dispose.
Помощник приведён полностью и действительно вызывается из Main. Проверки диапазона/ID снижают риск ошибки, но несколько вызовов не атомарны: окно может смениться между ними. Для действия expectedPartner — сохранённый serial персонажа; это не проверка цены или содержимого обмена.
Примеры
Прямое чтение или действие
# Прямое чтение или действие
#
# Отменяет выбранный обмен и закрывает его окно.
#
# Integer: 1 = TRUE — окно найдено, закрыто и запрос отмены отправлен через закрытие; 0 = FALSE
# — окна нет. Это не ожидание серверного ответа. Повторная отмена закрытого окна не отправляет
# второй пакет.
#
# Это логический результат: 1 = TRUE, 0 = FALSE. После VAR result = команда(...) можно писать IF
# result = TRUE THEN или IF result = 1 THEN; для отрицательного результата — IF result = FALSE
# THEN или IF result = 0 THEN. TRUE/FALSE пишутся без кавычек. Вызовите команду один раз и
# сохраните результат: повторный вызов может повторить действие или прочитать уже изменившееся
# состояние.
SUB Main()
# Вызов сделан один раз, результат сохранён в value/result. 0 — первый индекс, 1 — первый номер
# (см. синтаксис этой команды). HEX показывает числовой serial; CStr — число или строку.
VAR result = UO.CancelTrade(1)
IF result = TRUE THEN
UO.Print("Local request processed")
END IF
END SUB
Разбор параметров и выполнения:
- Вызов сделан один раз, результат сохранён в value/result. 0 — первый индекс, 1 — первый номер (см. синтаксис этой команды). HEX показывает числовой serial; CStr — число или строку.
Другой сценарий и параметры
# Другой сценарий и параметры
#
# Отменяет выбранный обмен и закрывает его окно.
#
# Integer: 1 = TRUE — окно найдено, закрыто и запрос отмены отправлен через закрытие; 0 = FALSE
# — окна нет. Это не ожидание серверного ответа. Повторная отмена закрытого окна не отправляет
# второй пакет.
#
# Это логический результат: 1 = TRUE, 0 = FALSE. После VAR result = команда(...) можно писать IF
# result = TRUE THEN или IF result = 1 THEN; для отрицательного результата — IF result = FALSE
# THEN или IF result = 0 THEN. TRUE/FALSE пишутся без кавычек. Вызовите команду один раз и
# сохраните результат: повторный вызов может повторить действие или прочитать уже изменившееся
# состояние.
SUB Main()
# ConfirmTrade и запись своего TradeCheck отправляют пакет только при изменении согласия. Чужое
# согласие задаёт сервер. CancelTrade отправляет отмену один раз. 1/TRUE — локальное
# состояние/обработка, а не гарантия завершения обмена. Имена и оба согласия не доказывают, что
# состав предметов не изменился.
VAR tradeNumber = 2
IF UO.TradeCount() >= tradeNumber THEN
VAR result = UO.CancelTrade(tradeNumber)
UO.Print(CStr(result))
END IF
END SUB
Разбор параметров и выполнения:
- ConfirmTrade и запись своего TradeCheck отправляют пакет только при изменении согласия. Чужое согласие задаёт сервер. CancelTrade отправляет отмену один раз. 1/TRUE — локальное состояние/обработка, а не гарантия завершения обмена. Имена и оба согласия не доказывают, что состав предметов не изменился.
Полный помощник со всеми функциями
# Полный помощник со всеми функциями
#
# Отменяет выбранный обмен и закрывает его окно.
#
# Integer: 1 = TRUE — окно найдено, закрыто и запрос отмены отправлен через закрытие; 0 = FALSE
# — окна нет. Это не ожидание серверного ответа. Повторная отмена закрытого окна не отправляет
# второй пакет.
#
# Это логический результат: 1 = TRUE, 0 = FALSE. После VAR result = команда(...) можно писать IF
# result = TRUE THEN или IF result = 1 THEN; для отрицательного результата — IF result = FALSE
# THEN или IF result = 0 THEN. TRUE/FALSE пишутся без кавычек. Вызовите команду один раз и
# сохраните результат: повторный вызов может повторить действие или прочитать уже изменившееся
# состояние.
SUB Main()
# Помощник приведён полностью и действительно вызывается из Main. Проверки диапазона/ID снижают
# риск ошибки, но несколько вызовов не атомарны: окно может смениться между ними. Для действия
# expectedPartner — сохранённый serial персонажа; это не проверка цены или содержимого обмена.
VAR expectedPartner = UO.GetTradeOpponent(1)
VAR result = ApplyToPartner(1, expectedPartner)
UO.Print(CStr(result))
END SUB
FUNCTION ApplyToPartner(tradeNumber, expectedPartner)
IF expectedPartner = 0 THEN
RETURN FALSE
END IF
IF UO.GetTradeOpponent(tradeNumber) <> expectedPartner THEN
RETURN FALSE
END IF
RETURN UO.CancelTrade(tradeNumber)
END FUNCTION
Разбор параметров и выполнения:
- Помощник приведён полностью и действительно вызывается из Main. Проверки диапазона/ID снижают риск ошибки, но несколько вызовов не атомарны: окно может смениться между ними. Для действия expectedPartner — сохранённый serial персонажа; это не проверка цены или содержимого обмена.