API UO GetStaticTilesArray - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

UO.GetStaticTilesArray

Оглавление · Алфавитный указатель · World & Geometry

ClassicUO • Runtime API

Ищет записи Static/Multi/Item по graphic/type в прямоугольнике.

Точный синтаксис

UO.GetStaticTilesArray(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, hue]; все поля Integer. graphic — type, Z — основание, hue — цвет. Несколько записей клетки остаются отдельными. Нет совпадений: пустой Array. Количество — GetArrayLength(result), не сам результат. Индексы начинаются с 0. Это не Boolean, serial или Pascal record; седьмого выходного параметра нет.

Поведение

  • Читаются локальные данные. Поиск не меняет FindItem/FindCount и не выполняет движение, target или сетевую команду.
  • Порядок: X по возрастанию, внутри X — Y по возрастанию. Записи одной клетки сохраняют порядок bridge; это не сортировка по расстоянию или высоте.
  • Поиск обрабатывается порциями до 32 клеток с мягким бюджетом около 1 мс. Отмена проверяется между порциями. Сложная клетка или холодное чтение могут превысить бюджет. Большую область лучше делить; мир может меняться во время чтения.
  • Static-ветка текущего клиента включает Static, Multi и Item из клетки, включая загруженные предметы на земле; Land и Mobile не включаются. Она шире классической выборки только статик из файлов.

Внутренние функции: от вызова до результата

Реальные 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. Поиск рядом с персонажем

# Поиск рядом с персонажем
#
# Ищет записи Static/Multi/Item по graphic/type в прямоугольнике.
#
# Array записей [graphic, X, Y, Z, hue]; все поля Integer. graphic — type, Z — основание, hue —
# цвет. Несколько записей клетки остаются отдельными. Нет совпадений: пустой 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.GetStaticTilesArray(x, y, x + 2, y + 2, map, 0x0CCA)
    UO.Print("Records: " + CStr(GetArrayLength(rows)))
END SUB

Разбор параметров и выполнения:

  • x/y — позиция self, map — текущая карта. Область 3×3 включает границы. В Ex передаются два type, в обычной форме один. Измените образцы под свои ресурсы; это graphic, не ID объекта.

Пример 2. Переставленные углы и вывод всех полей

# Переставленные углы и вывод всех полей
#
# Ищет записи Static/Multi/Item по graphic/type в прямоугольнике.
#
# Array записей [graphic, X, Y, Z, hue]; все поля Integer. graphic — type, Z — основание, hue —
# цвет. Несколько записей клетки остаются отдельными. Нет совпадений: пустой 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.GetStaticTilesArray(x + 1, y + 1, x, y, map, 0x0CCA)
    VAR i = 0
    WHILE i < GetArrayLength(rows)
        VAR row = rows[i]
        PrintTile(row[0], row[1], row[2], row[3], row[4])
        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. Повторный опрос с ограничением попыток

# Повторный опрос с ограничением попыток
#
# Ищет записи Static/Multi/Item по graphic/type в прямоугольнике.
#
# Array записей [graphic, X, Y, Z, hue]; все поля Integer. graphic — type, Z — основание, hue —
# цвет. Несколько записей клетки остаются отдельными. Нет совпадений: пустой 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.GetStaticTilesArray(x, y, x, y, map, 0x0CCA)
        UO.Print("Records: " + CStr(GetArrayLength(rows)))
        attempt = attempt + 1
        WAIT(250)
    WEND
END SUB

Разбор параметров и выполнения:

  • Не более трёх поисков одной клетки; между попытками WAIT(250). Каждый вызов создаёт новый результат. Нулевая длина означает отсутствие совпадений сейчас, а не постоянное отсутствие объекта на сервере.