API UO GetLandTilesArray - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
UO.GetLandTilesArray
Оглавление · Алфавитный указатель · World & Geometry
ClassicUO • Runtime API
Ищет тайлы земли по graphic/type в прямоугольнике.
Точный синтаксис
UO.GetLandTilesArray(Xmin:Any, Ymin:Any, Xmax:Any, Ymax:Any, WorldNum:Any, TileType:Any) -> Any
Выберите одну из зарегистрированных форм. Параметры передаются позиционно. Any означает значение BASIC с преобразованием внутри команды; Unit — отсутствие возвращаемого значения.
Параметры
Xmin— Мировые координаты двух углов, включительно; 0..65535. Переставленные углы нормализуются. Область не более 1 000 000 клеток; недопустимые границы вызывают ошибку скрипта до чтения карты.Ymin— Мировые координаты двух углов, включительно; 0..65535. Переставленные углы нормализуются. Область не более 1 000 000 клеток; недопустимые границы вызывают ошибку скрипта до чтения карты.Xmax— Мировые координаты двух углов, включительно; 0..65535. Переставленные углы нормализуются. Область не более 1 000 000 клеток; недопустимые границы вызывают ошибку скрипта до чтения карты.Ymax— Мировые координаты двух углов, включительно; 0..65535. Переставленные углы нормализуются. Область не более 1 000 000 клеток; недопустимые границы вызывают ошибку скрипта до чтения карты.WorldNum— Карта/фасет 0..255; используйте UO.WorldNum(). Другая карта даёт пустой Array. Если карта меняется между порциями, частичный результат отбрасывается.TileType— Один graphic/type тайла, обычно 0..65535; это не serial. 0 — точный graphic 0, -1 не означает любой type. Несовпадающий type даёт пустой результат.
Возвращает
Array записей [graphic, X, Y, Z]; все поля Integer. graphic — type земли, Z — её основание. Нет совпадений: пустой Array. Количество — GetArrayLength(result), не сам результат. Индексы начинаются с 0. Это не Boolean, serial или Pascal record; седьмого выходного параметра нет.
Поведение
- Читаются локальные данные. Поиск не меняет FindItem/FindCount и не выполняет движение, target или сетевую команду.
- Порядок: X по возрастанию, внутри X — Y по возрастанию. Записи одной клетки сохраняют порядок bridge; это не сортировка по расстоянию или высоте.
- Поиск обрабатывается порциями до 32 клеток с мягким бюджетом около 1 мс. Отмена проверяется между порциями. Сложная клетка или холодное чтение могут превысить бюджет. Большую область лучше делить; мир может меняться во время чтения.
Внутренние функции: от вызова до результата
Реальные C#-этапы. Это пояснение реализации; вызываемые процедуры примеров полностью определены ниже.
1. ExecuteStealthCompatibility
Принимает шесть аргументов. Обычная форма передаёт один type; Ex преобразует Array или скаляр в список type.
Вызывает FindPortableTiles с флагом land/static; возвращает Array записей напрямую.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ExecuteStealthCompatibility.
2. FindPortableTiles
Проверяет координаты, карту и площадь в 64-битной арифметике. Нормализует углы и строит HashSet type.
Сохраняет курсор X/Y, запрашивает ScanSlice через ExecutePathQuerySlice; между порциями Wait(0) проверяет отмену. Смена карты даёт пустой Array.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция FindPortableTiles.
3. ScanSlice
Обрабатывает до 32 клеток на игровом потоке, сохраняя положение курсора после каждой клетки.
GetLandscapeTile даёт graphic/Z/flags, GetStaticTiles — тройки graphic/Z/hue. Выбирает совпадающие type и записывает поля результата. Возвращает управление между порциями.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ScanSlice.
4. GetChunk2
Принимает две координаты блока и флаг загрузки. Проверяет обе оси до линейного индекса.
Возвращает Chunk или null; вне карты не подставляет соседний столбец. Переиспользует загруженные блоки, новые читает по необходимости.
Исходник проекта: src/ClassicUO.Client/Game/Map/Map.cs; функция GetChunk2.
Читаются локальные данные. Поиск не меняет FindItem/FindCount и не выполняет движение, target или сетевую команду.
Примеры
Пример 1. Поиск рядом с персонажем
# Поиск рядом с персонажем
#
# Ищет тайлы земли по graphic/type в прямоугольнике.
#
# Array записей [graphic, X, Y, Z]; все поля Integer. graphic — type земли, Z — её основание.
# Нет совпадений: пустой Array. Количество — GetArrayLength(result), не сам результат. Индексы
# начинаются с 0. Это не Boolean, serial или Pascal record; седьмого выходного параметра нет.
SUB Main()
# x/y — позиция self, map — текущая карта. Область 3×3 включает границы. В Ex передаются два
# type, в обычной форме один. Измените образцы под свои ресурсы; это graphic, не ID объекта.
VAR x = UO.GetX()
VAR y = UO.GetY()
VAR map = UO.WorldNum()
VAR rows = UO.GetLandTilesArray(x, y, x + 2, y + 2, map, 0x0003)
UO.Print("Records: " + CStr(GetArrayLength(rows)))
END SUB
Разбор параметров и выполнения:
- x/y — позиция self, map — текущая карта. Область 3×3 включает границы. В Ex передаются два type, в обычной форме один. Измените образцы под свои ресурсы; это graphic, не ID объекта.
Пример 2. Переставленные углы и вывод всех полей
# Переставленные углы и вывод всех полей
#
# Ищет тайлы земли по graphic/type в прямоугольнике.
#
# Array записей [graphic, X, Y, Z]; все поля Integer. graphic — type земли, Z — её основание.
# Нет совпадений: пустой Array. Количество — GetArrayLength(result), не сам результат. Индексы
# начинаются с 0. Это не Boolean, serial или Pascal record; седьмого выходного параметра нет.
SUB Main()
# Область 2×2 передана от большего угла к меньшему. Алгоритм сам нормализует границы. row — одна
# запись; PrintTile объявлена целиком и только форматирует числа, ничего не перемещая. graphic —
# type, x/y — координаты, z — высота, hue — цвет. Для земли передан условный hue=0: в записи
# земли нет поля цвета.
VAR x = UO.GetX()
VAR y = UO.GetY()
VAR map = UO.WorldNum()
VAR rows = UO.GetLandTilesArray(x + 1, y + 1, x, y, map, 0x0003)
VAR i = 0
WHILE i < GetArrayLength(rows)
VAR row = rows[i]
PrintTile(row[0], row[1], row[2], row[3], 0)
i = i + 1
WEND
END SUB
SUB PrintTile(graphic, x, y, z, hue)
UO.Print("Type=" + CStr(graphic) + " X=" + CStr(x) + " Y=" + CStr(y))
UO.Print("Z=" + CStr(z) + " hue=" + CStr(hue))
END SUB
Разбор параметров и выполнения:
- Область 2×2 передана от большего угла к меньшему. Алгоритм сам нормализует границы. row — одна запись; PrintTile объявлена целиком и только форматирует числа, ничего не перемещая. graphic — type, x/y — координаты, z — высота, hue — цвет. Для земли передан условный hue=0: в записи земли нет поля цвета.
Пример 3. Повторный опрос с ограничением попыток
# Повторный опрос с ограничением попыток
#
# Ищет тайлы земли по graphic/type в прямоугольнике.
#
# Array записей [graphic, X, Y, Z]; все поля Integer. graphic — type земли, Z — её основание.
# Нет совпадений: пустой Array. Количество — GetArrayLength(result), не сам результат. Индексы
# начинаются с 0. Это не Boolean, serial или Pascal record; седьмого выходного параметра нет.
SUB Main()
# Не более трёх поисков одной клетки; между попытками WAIT(250). Каждый вызов создаёт новый
# результат. Нулевая длина означает отсутствие совпадений сейчас, а не постоянное отсутствие
# объекта на сервере.
VAR x = UO.GetX()
VAR y = UO.GetY()
VAR map = UO.WorldNum()
VAR attempt = 0
WHILE attempt < 3
VAR rows = UO.GetLandTilesArray(x, y, x, y, map, 0x0003)
UO.Print("Records: " + CStr(GetArrayLength(rows)))
attempt = attempt + 1
WAIT(250)
WEND
END SUB
Разбор параметров и выполнения:
- Не более трёх поисков одной клетки; между попытками WAIT(250). Каждый вызов создаёт новый результат. Нулевая длина означает отсутствие совпадений сейчас, а не постоянное отсутствие объекта на сервере.