API UO GetLayerCount - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
UO.GetLayerCount
Оглавление · Алфавитный указатель · World & Geometry
ClassicUO • Runtime API
Считает записи неземельной геометрии в одной клетке.
Точный синтаксис
UO.GetLayerCount(X:Any, Y:Any, WorldNum:Any) -> Any
Выберите одну из зарегистрированных форм. Параметры передаются позиционно. Any означает значение BASIC с преобразованием внутри команды; Unit — отсутствие возвращаемого значения.
Параметры
X— Мировая координата X клетки текущей карты, не положение в гампе.Y— Мировая координата Y клетки текущей карты.WorldNum— Номер карты/фасета; используйте UO.WorldNum(). Читается только текущая загруженная карта.
Возвращает
Integer — количество троек graphic/Z/hue, полученных GetStaticTiles. В текущем клиенте учитываются Static, Multi и Item: несколько записей одной высоты считаются отдельно. Пустая клетка/другая карта дают 0. Это не номер слоя экипировки, не число этажей, не количество уникальных высот и не Boolean.
Поведение
- Команда читает локальную карту и не запускает движение или target. Клетка за пределами размеров карты не подменяется клеткой соседнего столбца.
- Высота Z, graphic/type, цвет hue, флаги и слой экипировки имеют разный смысл. Нулевой graphic или Z=0 могут быть допустимыми данными; проверяйте форму результата.
- Состав соответствует ReadStaticsXY, а не GetLayer или ObjAtLayer. Этот клиент включает динамические предметы и части Multi; исходный справочник Stealth описывает счётчик статик.
Внутренние функции: от вызова до результата
Это цепочка настоящих C#-методов клиента. Имена внутренних методов не являются дополнительными UO-командами. Запускаемый код и все вспомогательные процедуры приведены ниже.
1. ExecuteStealthCompatibility
Ветка GetLayerCount передаёт X/Y/WorldNum в GetStaticTiles.
Делит длину плоского int[] на 3 и возвращает Integer.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ExecuteStealthCompatibility.
2. GetStaticTiles
Получает X/Y/карту на игровом потоке, затем перебирает список объектов клетки через Map.GetTile.
Возвращает плоские тройки graphic/Z/hue для Static, Multi и Item. Это расширение текущего клиента: выборка включает загруженные части домов и предметы на земле, но не Land и не Mobile. Несовпадение карты даёт пустой массив.
Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция GetStaticTiles.
3. GetChunk2
Получает X/Y блока карты и флаг load. Проверяет обе оси до вычисления линейного индекса; отрицательные и слишком большие координаты дают null.
Возвращает загруженный/переиспользуемый Chunk или null. При load=true может прочитать блок из ресурсов; холодное чтение не имеет жёсткой гарантии времени.
Исходник проекта: src/ClassicUO.Client/Game/Map/Map.cs; функция GetChunk2.
Чтение не перемещает персонажа и не отправляет команды серверу. Геометрия меняется между запросами; полученный массив — результат этого чтения, а не подписка на изменения.
Примеры
Пример 1. Посчитать записи под персонажем
# Посчитать записи под персонажем
#
# Считает записи неземельной геометрии в одной клетке.
#
# Integer — количество троек graphic/Z/hue, полученных GetStaticTiles. В текущем клиенте
# учитываются Static, Multi и Item: несколько записей одной высоты считаются отдельно. Пустая
# клетка/другая карта дают 0. Это не номер слоя экипировки, не число этажей, не количество
# уникальных высот и не Boolean.
SUB Main()
# count — число записей клетки; 1 означает одну запись, а не логический успех.
VAR count = UO.GetLayerCount(UO.GetX(), UO.GetY(), UO.WorldNum())
UO.Print('Tile records: ' + CStr(count))
END SUB
Разбор параметров и выполнения:
- count — число записей клетки; 1 означает одну запись, а не логический успех.
Пример 2. Прочитать тройки и посчитать из одного снимка
# Прочитать тройки и посчитать из одного снимка
#
# Считает записи неземельной геометрии в одной клетке.
#
# Integer — количество троек graphic/Z/hue, полученных GetStaticTiles. В текущем клиенте
# учитываются Static, Multi и Item: несколько записей одной высоты считаются отдельно. Пустая
# клетка/другая карта дают 0. Это не номер слоя экипировки, не число этажей, не количество
# уникальных высот и не Boolean.
SUB Main()
# ReadStaticsXY возвращает плоский Array: graphic, Z, hue, затем следующая тройка.
# Деление длины на 3 считает записи одного снимка. Отдельный GetLayerCount позже может дать
# другое число, если мир изменился.
VAR tiles = UO.ReadStaticsXY(UO.GetX(), UO.GetY(), UO.WorldNum())
VAR count = CInt(GetArrayLength(tiles) / 3)
UO.Print('Records in this snapshot: ' + CStr(count))
END SUB
Разбор параметров и выполнения:
- ReadStaticsXY возвращает плоский Array: graphic, Z, hue, затем следующая тройка.
- Деление длины на 3 считает записи одного снимка. Отдельный GetLayerCount позже может дать другое число, если мир изменился.
Пример 3. Проверить соседнюю клетку
# Проверить соседнюю клетку
#
# Считает записи неземельной геометрии в одной клетке.
#
# Integer — количество троек graphic/Z/hue, полученных GetStaticTiles. В текущем клиенте
# учитываются Static, Multi и Item: несколько записей одной высоты считаются отдельно. Пустая
# клетка/другая карта дают 0. Это не номер слоя экипировки, не число этажей, не количество
# уникальных высот и не Boolean.
SUB Main()
# Отсутствие записей не доказывает проходимость земли. Наличие записи тоже не доказывает, что
# она является стеной.
VAR x = UO.GetX() + 1
VAR y = UO.GetY()
VAR count = UO.GetLayerCount(x, y, UO.WorldNum())
IF count > 0 THEN
UO.Print('Non-land geometry exists: ' + CStr(count))
ELSE
UO.Print('No loaded non-land records')
END IF
END SUB
Разбор параметров и выполнения:
- Отсутствие записей не доказывает проходимость земли. Наличие записи тоже не доказывает, что она является стеной.