API UO Ground - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
UO.Ground
ClassicUO • Runtime API
Возвращает специальное обозначение земли для параметра контейнера поиска или места назначения переноса.
Точный синтаксис
UO.Ground() -> Integer
Параметры
Параметров нет.
Возвращает
Integer, всегда 0. Этот ноль — допустимое обозначение земли, а не FALSE, не ошибка поиска, не ID предмета, graphic, номер карты или координата. Не проверяйте Ground() как признак успеха; проверяйте результат поиска или переноса, которому передали это значение.
Поведение
- Параметров нет. Сам вызов Ground() ничего не ищет, не перемещает, не открывает target, не отправляет пакеты и не меняет результаты предыдущего поиска. До входа в игру тоже возвращает 0.
- Передавайте в позицию container/destination команд FindType, FindList, Count, FindTypeEx, FindTypesArrayEx, CountEx или MoveItem. Поиск видит загруженные объекты мира, но не загружает далёкие клетки. Для переноса на землю X/Y/Z — координаты мира, не пиксели окна контейнера.
- FindType(type, color) по-прежнему ищет в инвентаре: второй параметр — цвет. Для земли пишите FindType(type, color, UO.Ground()). В старых компактных FindType/MoveItem число -1 обозначает инвентарь; в совместимых FindTypeEx/FindTypesArrayEx/CountEx -1 также допускается как земля. Используйте UO.Ground() или явное имя ground, не переносите числовые обозначения между разными командами без проверки.
- Первоисточник: Stealth Ground. Различия обозначений между командами и примеры выше описывают этот клиент.
Внутренние функции: от вызова до результата
Ниже реальные внутренние этапы. FindGroundTypes — полностью описанная функция скрипта, а не дополнительная встроенная команда.
1. ExecuteStealthCompatibility
Ветка runtime без аргументов возвращает Integer 0 без обращения к игровому bridge.
Integer, всегда 0. Этот ноль — допустимое обозначение земли, а не FALSE, не ошибка поиска, не ID предмета, graphic, номер карты или координата. Не проверяйте Ground() как признак успеха; проверяйте результат поиска или переноса, которому передали это значение.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ExecuteStealthCompatibility.
2. ConvertContainer
Компактный поиск переводит явный 0 во внутреннее обозначение земли, сохраняя -1 для инвентаря по умолчанию. Совместимый поиск принимает 0 и исторический -1 для земли; имена контейнеров разрешаются отдельно.
FindType(type, color) по-прежнему ищет в инвентаре: второй параметр — цвет. Для земли пишите FindType(type, color, UO.Ground()). В старых компактных FindType/MoveItem число -1 обозначает инвентарь; в совместимых FindTypeEx/FindTypesArrayEx/CountEx -1 также допускается как земля. Используйте UO.Ground() или явное имя ground, не переносите числовые обозначения между разными командами без проверки.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ConvertContainer.
3. ConvertStealthSearchContainer
Компактный поиск переводит явный 0 во внутреннее обозначение земли, сохраняя -1 для инвентаря по умолчанию. Совместимый поиск принимает 0 и исторический -1 для земли; имена контейнеров разрешаются отдельно.
FindType(type, color) по-прежнему ищет в инвентаре: второй параметр — цвет. Для земли пишите FindType(type, color, UO.Ground()). В старых компактных FindType/MoveItem число -1 обозначает инвентарь; в совместимых FindTypeEx/FindTypesArrayEx/CountEx -1 также допускается как земля. Используйте UO.Ground() или явное имя ground, не переносите числовые обозначения между разными командами без проверки.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ConvertStealthSearchContainer.
4. ResolveTransferDestination
Обработчик назначения сохраняет явную землю как 0. Bridge клиента использует мировые координаты; в пакете выбрасывания поле контейнера записывается как 0xFFFFFFFF. Значение API и поле пакета имеют разное представление.
Замените 0x40001001 на serial доступного предмета. IsObjectExists сначала проверяет загруженный объект. MoveItem(item, amount, destination, X, Y, Z): amount=0 — вся стопка, Ground() — земля, GetX/GetY/GetZ — мировая клетка персонажа. result равен 1, если клиент принял запрос переноса, иначе 0. Это результат MoveItem, а не Ground(), и не подтверждение доставки от сервера.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ResolveTransferDestination.
5. MoveItem
Обработчик назначения сохраняет явную землю как 0. Bridge клиента использует мировые координаты; в пакете выбрасывания поле контейнера записывается как 0xFFFFFFFF. Значение API и поле пакета имеют разное представление.
Замените 0x40001001 на serial доступного предмета. IsObjectExists сначала проверяет загруженный объект. MoveItem(item, amount, destination, X, Y, Z): amount=0 — вся стопка, Ground() — земля, GetX/GetY/GetZ — мировая клетка персонажа. result равен 1, если клиент принял запрос переноса, иначе 0. Это результат MoveItem, а не Ground(), и не подтверждение доставки от сервера.
Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция MoveItem.
Параметров нет. Сам вызов Ground() ничего не ищет, не перемещает, не открывает target, не отправляет пакеты и не меняет результаты предыдущего поиска. До входа в игру тоже возвращает 0.
Примеры
Прочитать обозначение земли
# Прочитать обозначение земли
#
# Возвращает специальное обозначение земли для параметра контейнера поиска или места назначения
# переноса.
#
# Integer, всегда 0. Этот ноль — допустимое обозначение земли, а не FALSE, не ошибка поиска, не
# ID предмета, graphic, номер карты или координата. Не проверяйте Ground() как признак успеха;
# проверяйте результат поиска или переноса, которому передали это значение.
SUB Main()
# destination получает Integer 0, Print выводит это число. Сам вызов ничего не выбрасывает.
VAR destination = UO.Ground()
UO.Print(CStr(destination))
END SUB
Разбор параметров и выполнения:
- destination получает Integer 0, Print выводит это число. Сам вызов ничего не выбрасывает.
Найти стопку золота на земле
# Найти стопку золота на земле
#
# Возвращает специальное обозначение земли для параметра контейнера поиска или места назначения
# переноса.
#
# Integer, всегда 0. Этот ноль — допустимое обозначение земли, а не FALSE, не ошибка поиска, не
# ID предмета, graphic, номер карты или координата. Не проверяйте Ground() как признак успеха;
# проверяйте результат поиска или переноса, которому передали это значение.
SUB Main()
# 0x0EED — графика золота; второй -1 означает любой hue. Ground() задаёт поиск в мире, FALSE
# отключает рекурсию контейнеров. FindTypeEx возвращает один serial или 0 при отсутствии
# результата. <> 0 проверяет этот serial. Используются текущие FindDistance/FindVertical и
# список Ignore.
VAR id = UO.FindTypeEx(0x0EED, -1, UO.Ground(), FALSE)
IF id <> 0 THEN
UO.Print(HEX(id))
ELSE
UO.Print('0')
END IF
END SUB
Разбор параметров и выполнения:
- 0x0EED — графика золота; второй -1 означает любой hue. Ground() задаёт поиск в мире, FALSE отключает рекурсию контейнеров. FindTypeEx возвращает один serial или 0 при отсутствии результата. <> 0 проверяет этот serial. Используются текущие FindDistance/FindVertical и список Ignore.
Полная функция для поиска двух график на земле
# Полная функция для поиска двух график на земле
#
# Возвращает специальное обозначение земли для параметра контейнера поиска или места назначения
# переноса.
#
# Integer, всегда 0. Этот ноль — допустимое обозначение земли, а не FALSE, не ошибка поиска, не
# ID предмета, graphic, номер карты или координата. Не проверяйте Ground() как признак успеха;
# проверяйте результат поиска или переноса, которому передали это значение.
SUB Main()
# FindGroundTypes(firstType, secondType, radius, height) ищет золото 0x0EED и чёрный жемчуг
# 0x0F7A с radius=5 и height=10. DIM types[1] создаёт две ячейки; colors[0] и containers[0] — по
# одной. Целая стопка считается одним результатом; типы/цвета — альтернативы, пересекающиеся
# контейнеры не дублируют ID. Функция возвращает сохранённый массив serial; Finally
# восстанавливает оба предела. Main выводит каждый ID. Код функции приведён полностью.
VAR ids = FindGroundTypes(0x0EED, 0x0F7A, 5, 10)
FOR EACH id IN ids
UO.Print(HEX(id))
NEXT
END SUB
FUNCTION FindGroundTypes(firstType, secondType, radius, height)
VAR oldDistance = UO.FindDistance()
VAR oldVertical = UO.FindVertical()
DIM types[1]
types[0] = firstType
types[1] = secondType
DIM colors[0]
colors[0] = -1
DIM containers[0]
containers[0] = UO.Ground()
TRY
UO.FindDistance(radius)
UO.FindVertical(height)
UO.FindTypesArrayEx(types, colors, containers, FALSE)
RETURN UO.GetFoundItems()
FINALLY
UO.FindDistance(oldDistance)
UO.FindVertical(oldVertical)
END TRY
END FUNCTION
Разбор параметров и выполнения:
- FindGroundTypes(firstType, secondType, radius, height) ищет золото 0x0EED и чёрный жемчуг 0x0F7A с radius=5 и height=10. DIM types[1] создаёт две ячейки; colors[0] и containers[0] — по одной. Целая стопка считается одним результатом; типы/цвета — альтернативы, пересекающиеся контейнеры не дублируют ID. Функция возвращает сохранённый массив serial; Finally восстанавливает оба предела. Main выводит каждый ID. Код функции приведён полностью.
Перенести известный предмет на клетку персонажа
# Перенести известный предмет на клетку персонажа
#
# Возвращает специальное обозначение земли для параметра контейнера поиска или места назначения
# переноса.
#
# Integer, всегда 0. Этот ноль — допустимое обозначение земли, а не FALSE, не ошибка поиска, не
# ID предмета, graphic, номер карты или координата. Не проверяйте Ground() как признак успеха;
# проверяйте результат поиска или переноса, которому передали это значение.
SUB Main()
# Замените 0x40001001 на serial доступного предмета. IsObjectExists сначала проверяет
# загруженный объект. MoveItem(item, amount, destination, X, Y, Z): amount=0 — вся стопка,
# Ground() — земля, GetX/GetY/GetZ — мировая клетка персонажа. result равен 1, если клиент
# принял запрос переноса, иначе 0. Это результат MoveItem, а не Ground(), и не подтверждение
# доставки от сервера.
VAR item = 0x40001001
IF UO.IsObjectExists(item) THEN
VAR result = UO.MoveItem(item, 0, UO.Ground(), UO.GetX('self'), UO.GetY('self'), UO.GetZ('self'))
END IF
END SUB
Разбор параметров и выполнения:
- Замените 0x40001001 на serial доступного предмета. IsObjectExists сначала проверяет загруженный объект. MoveItem(item, amount, destination, X, Y, Z): amount=0 — вся стопка, Ground() — земля, GetX/GetY/GetZ — мировая клетка персонажа. result равен 1, если клиент принял запрос переноса, иначе 0. Это результат MoveItem, а не Ground(), и не подтверждение доставки от сервера.