API UO GetWorldCell - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
UO.GetWorldCell
Оглавление · Алфавитный указатель · World & Geometry
ClassicUO • Runtime API
Читает расширенные записи земли, записей над землёй и загруженных мировых предметов в выбранной области.
Точный синтаксис
UO.GetWorldCell(x:Any, y:Any) -> Any
UO.GetWorldCell(x:Any, y:Any, map:Any) -> Any
Выберите одну из зарегистрированных форм. Параметры передаются позиционно. Any означает значение BASIC с преобразованием внутри команды; Unit — отсутствие возвращаемого значения.
Параметры
x— X клетки текущей загруженной карты; мировая координата, не позиция внутри гампа.y— Y клетки текущей загруженной карты; мировая координата, не позиция внутри гампа.map— Номер карты. Если этот аргумент отсутствует в выбранной форме, используется текущая карта. Реальный клиент читает тайлы только текущей загруженной карты.
Возвращает
Array записей. Каждый элемент result[i] имеет следующий формат:
Array из 11 полей одной записи; индексы начинаются с 0:
[0] kind— String: "land", "static" либо "object".[1] serial— Integer: serial динамического предмета; для land/static равен 0.[2] graphic— Integer: type графики.[3] x,[4] y— Integer: мировые координаты клетки.[5] z— Integer: высота основания в мире.[6] hue— Integer: цвет, у земли 0.[7] flags— Integer: младшие 32 бита флагов tiledata.[8] name— String: название из tiledata.[9] layer— Integer: слой экипировки из tiledata, у земли 0; не индекс статики.[10] height— Integer: высота graphic из tiledata, у земли 0; не координата Z.
GetArrayLength(result) — число записей, не число клеток и не число шагов маршрута. Результат может быть пустым. У одного x/y может быть несколько записей с разными Z. Запись "object" имеет serial; запись "static" не имеет пригодного serial.
Поведение
- Данные относятся к текущей загруженной карте. Другая карта или недоступная клетка дают пустой массив. Прямые запросы тайлов могут дополнительно сообщать о несовпадении карты; GetWorldCell и GetWorldTilesArray сразу возвращают пустой массив без такого сообщения.
- Индексы массивов начинаются с 0. Перед чтением поля проверяйте GetArrayLength. Z означает высоту в мире; layer — свойство экипировки из tiledata, а index — порядковый номер записи клетки.
- Статическая часть использует GetStaticTiles: его текущая выборка включает также Multi/Item. Мировой Item может дополнительно присутствовать как "object" с serial; не считайте каждую запись уникальным предметом.
- GetWorldTilesArray ограничивает область 1 000 000 клеток. Превышение или координаты вне 0…65535/map вне 0…255 вызывают ошибку команды, а не частичный массив. Для частого опроса выбирайте небольшую область.
Примеры
Пример 1. Посчитать и перечислить записи
# Посчитать и перечислить записи
#
# Читает расширенные записи земли, записей над землёй и загруженных мировых предметов в
# выбранной области.
#
# Array записей. Каждый элемент result[i] имеет следующий формат:
#
# Array из 11 полей одной записи; индексы начинаются с 0:
#
# - `[0] kind` — String: "land", "static" либо "object".
# - `[1] serial` — Integer: serial динамического предмета; для land/static равен 0.
# - `[2] graphic` — Integer: type графики.
# - `[3] x`, `[4] y` — Integer: мировые координаты клетки.
# - `[5] z` — Integer: высота основания в мире.
# - `[6] hue` — Integer: цвет, у земли 0.
# - `[7] flags` — Integer: младшие 32 бита флагов tiledata.
# - `[8] name` — String: название из tiledata.
# - `[9] layer` — Integer: слой экипировки из tiledata, у земли 0; не индекс статики.
# - `[10] height` — Integer: высота graphic из tiledata, у земли 0; не координата Z.
#
# GetArrayLength(result) — число записей, не число клеток и не число шагов маршрута. Результат
# может быть пустым. У одного x/y может быть несколько записей с разными Z. Запись "object"
# имеет serial; запись "static" не имеет пригодного serial.
SUB Main()
# GetWorldCell читает одну клетку; GetWorldTilesArray в этом примере читает квадрат 3×3 с
# включёнными границами.
# cells[i] — вложенный массив. tile[0] — категория, [2] — graphic, [5] — Z.
VAR cells = UO.GetWorldCell(UO.GetX(), UO.GetY())
VAR i = 0
WHILE i < GetArrayLength(cells)
VAR tile = cells[i]
UO.Print(tile[0] + ': ' + CStr(tile[2]) + ', Z=' + CStr(tile[5]))
i = i + 1
WEND
END SUB
Разбор параметров и выполнения:
- GetWorldCell читает одну клетку; GetWorldTilesArray в этом примере читает квадрат 3×3 с включёнными границами.
- cells[i] — вложенный массив. tile[0] — категория, [2] — graphic, [5] — Z.
Пример 2. Показать только записи с serial предмета
# Показать только записи с serial предмета
#
# Читает расширенные записи земли, записей над землёй и загруженных мировых предметов в
# выбранной области.
#
# Array записей. Каждый элемент result[i] имеет следующий формат:
#
# Array из 11 полей одной записи; индексы начинаются с 0:
#
# - `[0] kind` — String: "land", "static" либо "object".
# - `[1] serial` — Integer: serial динамического предмета; для land/static равен 0.
# - `[2] graphic` — Integer: type графики.
# - `[3] x`, `[4] y` — Integer: мировые координаты клетки.
# - `[5] z` — Integer: высота основания в мире.
# - `[6] hue` — Integer: цвет, у земли 0.
# - `[7] flags` — Integer: младшие 32 бита флагов tiledata.
# - `[8] name` — String: название из tiledata.
# - `[9] layer` — Integer: слой экипировки из tiledata, у земли 0; не индекс статики.
# - `[10] height` — Integer: высота graphic из tiledata, у земли 0; не координата Z.
#
# GetArrayLength(result) — число записей, не число клеток и не число шагов маршрута. Результат
# может быть пустым. У одного x/y может быть несколько записей с разными Z. Запись "object"
# имеет serial; запись "static" не имеет пригодного serial.
SUB Main()
# Область выбирается координатами, а не контейнером.
# Проверка kind="object" отделяет серийные предметы от земли/статики; [1] содержит serial.
VAR cells = UO.GetWorldCell(UO.GetX(), UO.GetY())
VAR i = 0
WHILE i < GetArrayLength(cells)
VAR tile = cells[i]
IF tile[0] = 'object' THEN
UO.Print('Object serial: ' + CStr(tile[1]))
END IF
i = i + 1
WEND
END SUB
Разбор параметров и выполнения:
- Область выбирается координатами, а не контейнером.
- Проверка kind="object" отделяет серийные предметы от земли/статики; [1] содержит serial.
Пример 3. Отобрать записи на высоте персонажа
# Отобрать записи на высоте персонажа
#
# Читает расширенные записи земли, записей над землёй и загруженных мировых предметов в
# выбранной области.
#
# Array записей. Каждый элемент result[i] имеет следующий формат:
#
# Array из 11 полей одной записи; индексы начинаются с 0:
#
# - `[0] kind` — String: "land", "static" либо "object".
# - `[1] serial` — Integer: serial динамического предмета; для land/static равен 0.
# - `[2] graphic` — Integer: type графики.
# - `[3] x`, `[4] y` — Integer: мировые координаты клетки.
# - `[5] z` — Integer: высота основания в мире.
# - `[6] hue` — Integer: цвет, у земли 0.
# - `[7] flags` — Integer: младшие 32 бита флагов tiledata.
# - `[8] name` — String: название из tiledata.
# - `[9] layer` — Integer: слой экипировки из tiledata, у земли 0; не индекс статики.
# - `[10] height` — Integer: высота graphic из tiledata, у земли 0; не координата Z.
#
# GetArrayLength(result) — число записей, не число клеток и не число шагов маршрута. Результат
# может быть пустым. У одного x/y может быть несколько записей с разными Z. Запись "object"
# имеет serial; запись "static" не имеет пригодного serial.
SUB Main()
# tile[5] и GetZ() сравниваются в одинаковых единицах мировой высоты.
# Равенство Z фильтрует основание, но не означает проходимость или совпадение этажа целиком.
VAR cells = UO.GetWorldCell(UO.GetX(), UO.GetY())
VAR i = 0
WHILE i < GetArrayLength(cells)
VAR tile = cells[i]
IF tile[5] = UO.GetZ() THEN
UO.Print(tile[8])
END IF
i = i + 1
WEND
END SUB
Разбор параметров и выполнения:
- tile[5] и GetZ() сравниваются в одинаковых единицах мировой высоты.
- Равенство Z фильтрует основание, но не означает проходимость или совпадение этажа целиком.