API UO TradeCheck - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
UO.TradeCheck
ClassicUO • Runtime API
Читает флажки согласия; трёхпараметровая форма также изменяет собственный флажок.
Точный синтаксис
UO.TradeCheck(windowIndex:Any) -> Integer
UO.TradeCheck(TradeNum:Any, Num:Any) -> Any
UO.TradeCheck(windowIndex:Any, checkbox:Any, stateValue:Any) -> Integer
Параметры
windowIndex— Целое число: текущий индекс окна от 0 до TradeCount()-1. Отрицательный или отсутствующий индекс даёт пустой результат. Это не serial.TradeNum— Целое число: текущий индекс окна от 0 до TradeCount()-1. Отрицательный или отсутствующий индекс даёт пустой результат. Это не serial.Num— Только двухпараметровая форма: 1 — свой флажок, 2 — флажок партнёра; другие значения дают 0. TradeNum здесь начинается с 0.checkbox— Только трёхпараметровая форма: 0 — свой флажок, 1 — партнёра. Чужой флажок только читается; другое значение даёт 0.stateValue— Только при checkbox=0: 0/FALSE снимает согласие, любое ненулевое число/TRUE включает. При checkbox=1 значение игнорируется.
Возвращает
Integer: 1 = TRUE — выбранный флажок установлен; 0 = FALSE — снят, окно отсутствует либо сторона неверна. В форме записи возвращается состояние, а не признак успешной сделки: снятие флажка возвращает 0.
Это логический результат: 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. TradeCheck
Регистрация выбирает форму по числу аргументов; числа преобразуются через NumberConversions. Для TradeCheck с двумя аргументами стороны 1/2 проверяются и переводятся в 0/1 bridge. Legacy-serial форматируется через ToHex.
Integer: 1 = TRUE — выбранный флажок установлен; 0 = FALSE — снят, окно отсутствует либо сторона неверна. В форме записи возвращается состояние, а не признак успешной сделки: снятие флажка возвращает 0.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция TradeCheck.
2. TradeCheck
Invoke передаёт чтение/изменение на игровой поток с отменой скрипта; метод читает ID1/ID2, LocalSerial, OpponentName или флажки выбранного TradingGump.
Читает флажки согласия; трёхпараметровая форма также изменяет собственный флажок.
Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция TradeCheck.
3. FindTrade
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; функция FindTrade.
4. AcceptTrade
При изменении собственного флажка GameActions.AcceptTrade вызывает Send_TradeResponse с кодом 2, ID1 и состоянием. Чтение и повторная установка того же состояния пакета не создают.
Integer: 1 = TRUE — выбранный флажок установлен; 0 = FALSE — снят, окно отсутствует либо сторона неверна. В форме записи возвращается состояние, а не признак успешной сделки: снятие флажка возвращает 0.
Исходник проекта: src/ClassicUO.Client/Game/GameActions.cs; функция AcceptTrade.
Помощник приведён полностью и действительно вызывается из Main. Проверки диапазона/ID снижают риск ошибки, но несколько вызовов не атомарны: окно может смениться между ними. Для действия expectedPartner — сохранённый serial персонажа; это не проверка цены или содержимого обмена.
Примеры
Прямое чтение или действие
# Прямое чтение или действие
#
# Читает флажки согласия; трёхпараметровая форма также изменяет собственный флажок.
#
# Integer: 1 = TRUE — выбранный флажок установлен; 0 = FALSE — снят, окно отсутствует либо
# сторона неверна. В форме записи возвращается состояние, а не признак успешной сделки: снятие
# флажка возвращает 0.
#
# Это логический результат: 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()
# UO.TradeCheck(0) и UO.TradeCheck(0,1) читают своё согласие первого окна; UO.TradeCheck(0,2) —
# чужое. Здесь нет записи и нет автоматического подтверждения.
VAR own = UO.TradeCheck(0)
VAR sameOwn = UO.TradeCheck(0, 1)
VAR other = UO.TradeCheck(0, 2)
UO.Print(CStr(own) + "/" + CStr(sameOwn) + "/" + CStr(other))
END SUB
Разбор параметров и выполнения:
- UO.TradeCheck(0) и UO.TradeCheck(0,1) читают своё согласие первого окна; UO.TradeCheck(0,2) — чужое. Здесь нет записи и нет автоматического подтверждения.
Другой сценарий и параметры
# Другой сценарий и параметры
#
# Читает флажки согласия; трёхпараметровая форма также изменяет собственный флажок.
#
# Integer: 1 = TRUE — выбранный флажок установлен; 0 = FALSE — снят, окно отсутствует либо
# сторона неверна. В форме записи возвращается состояние, а не признак успешной сделки: снятие
# флажка возвращает 0.
#
# Это логический результат: 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()
# UO.TradeCheck(0,0,FALSE) снимает своё согласие. UO.TradeCheck(0,1,FALSE) только читает
# согласие партнёра: FALSE не может изменить чужую сторону. Результат 0 после снятия ожидаем.
VAR cleared = UO.TradeCheck(0, 0, FALSE)
VAR other = UO.TradeCheck(0, 1, FALSE)
UO.Print(CStr(cleared) + "/" + CStr(other))
END SUB
Разбор параметров и выполнения:
- UO.TradeCheck(0,0,FALSE) снимает своё согласие. UO.TradeCheck(0,1,FALSE) только читает согласие партнёра: FALSE не может изменить чужую сторону. Результат 0 после снятия ожидаем.
Полный помощник со всеми функциями
# Полный помощник со всеми функциями
#
# Читает флажки согласия; трёхпараметровая форма также изменяет собственный флажок.
#
# Integer: 1 = TRUE — выбранный флажок установлен; 0 = FALSE — снят, окно отсутствует либо
# сторона неверна. В форме записи возвращается состояние, а не признак успешной сделки: снятие
# флажка возвращает 0.
#
# Это логический результат: 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 accepted = BothAccepted(0)
IF accepted = TRUE THEN
UO.Print("Both boxes are checked; server completion is not known")
END IF
END SUB
FUNCTION BothAccepted(index)
IF index < 0 OR index >= UO.TradeCount() THEN
RETURN FALSE
END IF
VAR own = UO.TradeCheck(index, 1)
VAR other = UO.TradeCheck(index, 2)
RETURN own = TRUE AND other = TRUE
END FUNCTION
Разбор параметров и выполнения:
- Помощник приведён полностью и действительно вызывается из Main. Проверки диапазона/ID снижают риск ошибки, но несколько вызовов не атомарны: окно может смениться между ними. Для действия expectedPartner — сохранённый serial персонажа; это не проверка цены или содержимого обмена.