Skip to content

UO Topic world geometry

Codex edited this page Oct 12, 2026 · 6 revisions

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Карта, координати та відстані

Головна · C# · IDE · Команди UO · За абеткою · Приклади · Мови

Координати, відстані, видимість, прохідність і властивості клітин карти. Команди побудови маршруту зібрано окремо в розділі «Рух персонажа».

Розділи

Тема Команди та пояснення
Координати X, Y і Z UO.GetX · UO.GetY · UO.GetZ
Відстань UO.GetDistance · UO.Dist
Лінія видимості UO.CheckLOS · UO.LOSOptions
Номер світу UO.WorldNum
Клітини світу UO.GetWorldCell · UO.GetWorldTilesArray
Прохідність UO.IsWorldCellPassable · UO.GetNextStepZ
Висота поверхні UO.GetSurfaceZ
Клітини карти UO.GetMapCell
Клітини поверхні UO.GetLandTileAt · UO.GetLandTileData · UO.GetLandTilesArray · UO.GetLandTilesArrayEx
Статичні об’єкти карти UO.GetStaticTileAt · UO.GetStaticTileData · UO.GetStaticTiles · UO.GetStaticTilesArray · UO.GetStaticTilesArrayEx
Прапори клітини UO.GetTileFlags · UO.ConvertIntegerToFlags
Висота клітини UO.GetTileHeight
Шар об’єкта UO.GetTileLayer
Назва клітини UO.GetTileName
Водні клітини UO.IsWaterTile
Дерева UO.IsTreeTile
Клітини для видобутку UO.IsMineTile

Усі команди теми

Координати X, Y і Z

UO.X · UO.Y · UO.Z · UO.GetX · UO.GetY · UO.GetZ

Відстань

UO.Dist · UO.GetDistance

Лінія видимості

UO.CheckLOS · UO.LOSOptions

Номер світу

UO.WorldNum · UO.GetWorldNum

Клітини світу та прохідність

UO.GetWorldCell · UO.GetMapCell · UO.IsWorldCellPassable · UO.GetSurfaceZ · UO.GetNextStepZ · UO.GetWorldTilesArray

Клітини поверхні

UO.GetLandscapeTile · UO.GetLandTileAt · UO.GetLandTileData · UO.GetLandTilesArray · UO.GetLandTilesArrayEx

Статичні об’єкти карти

UO.GetStaticArt · UO.GetStaticTileAt · UO.GetStaticTileData · UO.GetStaticTiles · UO.GetStaticTilesArray · UO.GetStaticTilesArrayEx · UO.ReadStaticsXY · UO.PrivateGetTile · UO.GetTileXYM · UO.GetLayerCount

Властивості клітини

UO.GetTileFlags · UO.GetTileHeight · UO.GetTileLayer · UO.GetTileName · UO.IsWaterTile · UO.IsTreeTile · UO.IsMineTile · UO.ConvertIntegerToFlags

Статичні об’єкти клієнта

UO.AddUserStatic · UO.ClearUserStatics · UO.GetUserStatic · UO.GetUserStatics · UO.RemoveUserStatic · UO.UserStaticExists

Приклади на тему

Нижче наведено короткі приклади. У повному описі кожної команди є параметри, результат, обмеження та кілька самостійних скриптів: прямий код, варіант із функцією та варіант із класом.

UO.GetDistance

Параметри, результат та всі сценарії

var target = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(target)))
{
    var distance = UO.GetDistance(target);
    if (Truth(distance <= 2))
    {
        UO.Print("Target is within two tiles");
    }
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

UO.IsWorldCellPassable

Параметри, результат та всі сценарії

var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var result = UO.IsWorldCellPassable(x,y,z,x+1,y,z,UO.WorldNum());
if (Truth(Truth(result[0]) == true))
{
    UO.Print("Passable, Z=" + Convert.ToString(result[1]));
}
else
{
    UO.Print("Blocked");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

Частини довідника

1 · 2

Повний опис команд


UO.AddUserStatic

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.AddUserStatic(object? staticItem, object? worldNum);
int UO.AddUserStatic(object? graphic, object? x, object? y, object? z, object? hue, object? map);

Додає запис користувача статика в локальний стан скриптів. Числовий graphic використовується для локальної перевірки перешкод pathfinder'ом; об'єкт на сервері не створюється. Двоххаргументний виклик з ненумерованим текстом зберігає legacy-значення і не додає статик у pathfinder.

Параметри

  • staticItem - числовий graphic або legacy-текстове значення.
  • worldNum - індекс картки для запису або локального статика.
  • graphic — ID статичний від 0 до 65535.
  • z - висота. При додаванні pathfinder значення обмежується діапазоном signed byte.
  • hue - hue; при додаванні обмежується діапазоном від 0 до 65535.
  • map - індекс картки; для обробки менеджером діапазон обмежений 0–255.
  • x - Світова X користувача статика; int. Менеджер приймає координати всередині поточної завантаженої картки.
  • y - Світова Y користувача статика; int. Менеджер приймає координати всередині поточної завантаженої картки.

Повернене значення

Позитивний ID створеного запису. Для шестипараметричної форми негативні "graphic", "x", "y" або "map", а також "graphic" вище "65535" приводять до "-1". ID можна передати в UO.UserStaticExists, UO.RemoveUserStatic або використовувати для перевірки/видалення legacy-запису. Сам по собі повернутий ID не підтверджує, що статик буде видно або застосовано на сервері.

Поведінка

    • UO.AddUserStatic('tree', 0) - оскільки tree не є числом, зберігає пару вихідних значень як legacy-запис у стані runtime; pathfinder її не використовує.
  • Двопараметричний виклик з числовим graphic додає статик цього graphic на поточні координати персонажа, з z персонажа та hue 0.
  • Шестипараметричний виклик додає статик із заданими graphic, координатами, висотою, hue та картою. Pathfinding враховує його тільки на активній карті і відповідно до прапорів graphic в клієнтських tiledata.

Ці записи локальні для клієнта скриптів: вони не створюють ігровий об'єкт, не надсилають запит на мережу і не змінюють дані shard'а.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.AddUserStatic(0x0CCA, UO.GetWorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Зберегти пару як legacy-дані; текстовий StaticItem не створює перешкоди pathfinder'у. - Прямий скрипт

Параметри та порядок виконання:

  • Зберегти пару як legacy-дані; текстовий StaticItem не створює перешкоди pathfinder'у.
var legacyId = UO.AddUserStatic("tree", 0);
UO.Print(Convert.ToString(legacyId));

2. Числовий graphic додається до позиції персонажа на поточній карті. - Функція сценарію

Параметри та порядок виконання:

  • Числовий graphic додається до позиції персонажа на поточній карті.
return  RunScenario();
 object? RunScenario()
{
    var staticId = UO.AddUserStatic(0x0CCA, UO.GetWorldNum());
    UO.Print(Convert.ToString(staticId));
    return null;
}

3. Явно додати локальний static graphic у вказану позицію та на вказану карту. - Клас сценарію

Параметри та порядок виконання:

  • Явно додати локальний static graphic у вказану позицію та на вказану карту.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var staticId = UO.AddUserStatic(0x0CCA, UO.GetX(), UO.GetY(), UO.GetZ(), 0, UO.GetWorldNum());
        UO.Print(Convert.ToString(staticId));
        return null;
    }
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.AddUserStatic(staticItem, worldNum) — UO.AddUserStatic(Any,Any)

Параметри: staticItem (Any), worldNum (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "adduserstatic":

                {

                    int map = Arg(1, bridge.WorldNumber);

                    if (arguments[0].Kind != InjectionValueKind.Array)

                    {

                        int graphic = 0;

                        if (arguments[0].Kind == InjectionValueKind.String &&

                            !NumberConversions.TryStr2Int(arguments[0].String, out graphic))

                        {

                            int legacyId = state.NextUserStaticId++;

                            state.UserStatics[legacyId] = Text(0) + "|" + Text(1);

                            return new InjectionValue(legacyId);

                        }

                        graphic = arguments[0].Kind == InjectionValueKind.String

                            ? graphic

                            : NumberConversions.ToInt(arguments[0]);

                        return new InjectionValue(AddUserStatic(graphic, bridge.GetX(bridge.Self), bridge.GetY(bridge.Self),

                            bridge.GetZ(bridge.Self), 0, map));

                    }

                    if (arguments[0].Array.Length < 4)

                        throw new NativeSubrutineException("AddUserStatic expects [graphic,x,y,z,color] and world number, or graphic,x,y,z,color,world.");

                    InjectionValue[] item = arguments[0].Array;

                    return new InjectionValue(AddUserStatic(

                        NumberConversions.ToInt(item[0]), NumberConversions.ToInt(item[1]), NumberConversions.ToInt(item[2]),

                        NumberConversions.ToInt(item[3]), item.Length > 4 ? NumberConversions.ToInt(item[4]) : 0, map));

                }

UO.AddUserStatic(graphic, x, y, z, hue, map) — UO.AddUserStatic(Any,Any,Any,Any,Any,Any)

Параметри: graphic (Any), x (Any), y (Any), z (Any), hue (Any), map (Any)

Результат: int / Integer.

Під час виклику:

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

Внутрішній код реалізації, не самостійний скрипт.

values => new InjectionValue(AddUserStatic(

                    NumberConversions.ToInt(values[0]), NumberConversions.ToInt(values[1]), NumberConversions.ToInt(values[2]),

                    NumberConversions.ToInt(values[3]), NumberConversions.ToInt(values[4]), NumberConversions.ToInt(values[5])))

UO.CheckLOS

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.CheckLOS(object? xfrom, object? yfrom, object? zfrom, object? xto, object? yto, object? zto, object? worldNum);

Перевіряє локальну прохідність лінії між двома точками карти через CheckPortableLineOfSight.

Параметри

  • xfrom — Вихідний X: 0..65535.
  • yfrom — Вихідний Y: 0..65535.
  • zfrom - Вихідна Z, int.
  • xto — Кінцевий X: 0..65535.
  • yto — Кінцевий Y: 0..65535.
  • zto - Кінцева Z, int.
  • worldNum — 0..255. Промінь ненульової довжини читає тільки поточну завантажену _world.Map/World.Map: через CheckWorldStep потрібні WorldNum == _world.MapIndex та живий Player.Pathfinder. Інший facet не завантажується та не запитується; немає карти/персонажу/pathfinder або крок недоступний - 0. Виняток однакових X/Y пропускає весь цикл клітин: при X/Y 0..65535, WorldNum в 0..255 і abs(Zfrom-Zto)<=20 повертає 1 навіть без завантаженої картки або з іншим номером картки. Це не доказ геометрії чи досяжності. Результат локальний, не розв'язання LOS сервера.

Повернене значення

int 1 — локальний промінь досяг X/Y і кінцева висота відрізняється від Zto не більше ніж на 20; 0 — неприпустимі координати, перешкоди або межі перевірки.

Поведінка

  • Промінь йде алгоритмом Bresenham, максимум 4096 кроків. На кожній клітині враховуються BadLocations, CheckWorldStep та повернена висота.
  • При LosOptions != 0 додатково використовується CheckLosCell; біт 0x100 перевіряє обидві бічні клітини діагоналі. Перевірка локальної геометрії не засвідчує правила LOS конкретного сервера і не переміщає.
  • Молодший byte (value & 0xFF) вибирає алгоритм 1..4; інші значення молодшого byte в CheckLosCell використовують алгоритм 3. Алгоритми 1/2 блокують Wall та Impassable, 3 додатково NoShoot, а 4 включає NoShoot тільки з 0x200 і пропускає перешкоди Window тільки з 0x400. Сторінка 0x100 додатково перевіряє обидві бічні клітини кожного діагонального кроку променя за будь-якого обраного алгоритму. value=0 відключає додаткові CheckLosCell/діагональні перевірки, але BadLocations і CheckWorldStep залишаються. Наприклад 4+0x100+0x200+0x400 вибирає custom з трьома прапорами; setter зберігає вихідний int, не нормалізований алгоритм.
  • Промінь ненульової довжини читає тільки поточну завантажену _world.Map/World.Map: через CheckWorldStep потрібні WorldNum == _world.MapIndex та живий Player.Pathfinder. Інший facet не завантажується та не запитується; немає карти/персонажу/pathfinder або крок недоступний - 0. Виняток однакових X/Y пропускає весь цикл клітин: при X/Y 0..65535, WorldNum в 0..255 і abs(Zfrom-Zto)<=20 повертає 1 навіть без завантаженої картки або з іншим номером картки. Це не доказ геометрії чи досяжності. Результат локальний, не розв'язання LOS сервера.
  • CheckLosCell обходить завантажені Land/Static/Multi/Item однієї клітини. Impassable Land блокує при abs(rayZ-land.Z)<=20. Прапори Static/Multi/Item діють лише в діапазоні tile.Z-2 .. tile.Z+max(1,Height)+2; дозволений custom Window пропускається до перевірки Wall/Impassable/NoShoot. Промінь X/Y використовує Bresenham, максимум 4096 кроків; Z береться з поверхонь CheckWorldStep, не інтерполюється до Zto, кінцевий допуск висоти - 20.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.CheckLOS(UO.X(), UO.Y(), UO.Z(), UO.X() + 1, UO.Y(), UO.Z(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Лінія на поточній клітці – прямий скрипт

Параметри та порядок виконання:

  • Однакові точки відбуваються за допустимих X/Y/map.
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var visible = UO.CheckLOS(x,y,z,x,y,z,UO.WorldNum());
UO.Print(Convert.ToString(visible));

2. Перевірка сусідньої клітини – функція сценарію

Параметри та порядок виконання:

  • Висота та прохідність сусідньої клітини читаються з локальної карти.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX();
    var y = UO.GetY();
    var z = UO.GetZ();
    var clear = UO.CheckLOS(x, y, z, x + 1, y, z, UO.WorldNum());
    UO.Print(Convert.ToString(clear));
    return null;
}

3. Неправильна координата — клас сценарію

Параметри та порядок виконання:

  • Негативний X відхиляється з результатом 0 без проходу картою.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var clear = UO.CheckLOS(-1, 0, 0, 0, 0, 0, 0);
        UO.Print(Convert.ToString(clear));
        return null;
    }
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.CheckLOS(xfrom, yfrom, zfrom, xto, yto, zto, worldNum) — UO.CheckLOS(Any,Any,Any,Any,Any,Any,Any)

Параметри: xfrom (Any), yfrom (Any), zfrom (Any), xto (Any), yto (Any), zto (Any), worldNum (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "checklos": return new InjectionValue(CheckPortableLineOfSight(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), Arg(5), Arg(6)) ? 1 : 0);

UO.ClearUserStatics

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

void UO.ClearUserStatics();

Видаляє всі власні static записи runtime і локальні статичні об'єкти менеджера.

Параметри

Параметрів немає.

Повернене значення

void - значення, що повертається немає.

Поведінка

  • State.UserStatics та менеджерські об'єкти очищаються. Завантажені файли картки та реальні серверні предмети не видаляються.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.

UO.Print("Calling UO.ClearUserStatics");
UO.ClearUserStatics();

1. Очистити стан - прямий скрипт

Параметри та порядок виконання:

  • Видаляє всі власні static записи runtime і локальні статичні об'єкти менеджера.
UO.ClearUserStatics();

2. Очистити після налаштування – функція сценарію

Параметри та порядок виконання:

  • Додати локальний статик на поточній клітці, потім видалити всі користувацькі статики.
return  RunScenario();
 object? RunScenario()
{
    var localStatic = UO.AddUserStatic(0x0CCA, UO.GetX(), UO.GetY(), UO.GetZ(), 0, UO.WorldNum());
    UO.ClearUserStatics();
    return null;
}

3. Повторне очищення – клас сценарію

Параметри та порядок виконання:

  • Очищення порожнього набору є прийнятним і не створює нового параметра.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        UO.ClearUserStatics();
        UO.ClearUserStatics();
        return null;
    }
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.ClearUserStatics() — UO.ClearUserStatics()

Параметри: Немає параметрів.

Результат: void / Unit.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "clearuserstatics": state.UserStatics.Clear(); bridge.ClearUserStatics(); return InjectionValue.Unit;

UO.ConvertIntegerToFlags

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.ConvertIntegerToFlags(object? group, object? value);

Розбирає числову маску tile flags масив імен перерахування TileFlag.

Параметри

  • group — int: тільки 1 або 2 включають перетворення; будь-яке інше значення дає порожній масив.
  • value — Маска, яку Arg перетворює на знаковий 32-бітний int, потім bridge призводить до ulong. Для високих 64-бітних прапорів ця форма не зберігає повну маску.

Повернене значення

Array рядків з іменами ненульових TileFlag, біти яких повністю присутні в масці. Маска 0 дає порожній масив.

Поведінка

  • Group 1 і 2 використовують той самий Enum.GetValues, а чи не різні каталоги. Це локальне перетворення маски; дані tiledata не запитуються.
  • API-реєстрація використовує object?, але диспетчер Arg(1) передає int. Негативний int sign-extends при приведенні до ulong. GetTileFlags також повертає лише молодші 32 біта як signed int: ця сумісна пара не надає повний 64-бітний контракт tiledata.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.ConvertIntegerToFlags(1, 0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Нульова маска – прямий скрипт

Параметри та порядок виконання:

  • Жоден ненульовий flag немає в масці 0.
var flags = UO.ConvertIntegerToFlags(1,0);
UO.Print(Convert.ToString(ArrayLength(flags)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. Маска нижчого біта – функція сценарію

Параметри та порядок виконання:

  • Масив містить реальні імена TileFlag вибраної маски.
return  RunScenario();
 object? RunScenario()
{
    var flags = UO.ConvertIntegerToFlags(2, 1);
    for (int i = (int)(0); i <= ArrayLength(flags) - 1; i += (int)(1))
    {
        UO.Print(flags[i]);
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

3. Невірна група – клас сценарію

Параметри та порядок виконання:

  • Група 0 не прийнята цією командою та повертає порожній масив.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var flags = UO.ConvertIntegerToFlags(0, 1);
        UO.Print(Convert.ToString(ArrayLength(flags)));
        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.ConvertIntegerToFlags(group, value) — UO.ConvertIntegerToFlags(Any,Any)

Параметри: group (Any), value (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "convertintegertoflags":

                    return new InjectionValue(bridge.ConvertTileFlags(Arg(0), Arg(1))

                        .Select(flag => new InjectionValue(flag)).ToArray());

UO.Dist

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

int UO.Dist(object? xfrom, object? yfrom, object? xto, object? yto);

Обчислює відстань у клітинах між двома світовими точками: найбільшу з абсолютних різниць X та Y.

Параметри

  • xfrom - Координата X вихідної точки.
  • yfrom - Координата Y вихідної точки.
  • xto - Координата X призначення.
  • yto - Координата Y призначення.

Повернене значення

int — відстань у клітинах, невід'ємна для допустимих координат. 0 означає однакові XY, 1 — одну клітинку. Це кількість, а чи не ознака успіху. Окреме порівняння distance <= 2 повертає bool true або false; сама відстань залишається int.

Поведінка

  • Тільки обчислення координат: без пакетів, очікувань, завантаження карти, перевірки перешкод, Z та карти світу. Команда не шукає прохідного маршруту і не гарантує досягнення мети. Крапки повинні відноситися до однієї системи координат; обхід перешкод може збільшити шлях.
  • Потрібні всі чотири параметри. Передавайте світові координати int у документованому діапазоні 0..65535. object? у сигнатурі позначає універсальний адаптер, а не ID предмета. Значень за умовчанням координат всередині скрині, п'ятого Z і перевантаження з одним об'єктом у цих команд немає.
  • Формула: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). Якщо поміняти точки місцями, результат буде той самий. Це не евклідова відстань, не сума різниць і не кількість кроків під час обходу перешкоди.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

var result = UO.Dist(100, 100, 103, 104);
UO.Print("Dist: " + Convert.ToString(result));

1. Пряме обчислення – прямий скрипт

Параметри та порядок виконання:

  • Від (?100,100?) до (?103,104?): абсолютні різниці рівні ?3? і ?4?, максимум — ?4?. Main повертає int 4.
  • int — відстань у клітинах, невід'ємна для допустимих координат. 0 означає однакові XY, 1 — одну клітинку. Це кількість, а чи не ознака успіху. Окреме порівняння distance <= 2 повертає bool true або false; сама відстань залишається int.
  • Формула: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). Якщо поміняти точки місцями, результат буде той самий. Це не евклідова відстань, не сума різниць і не кількість кроків під час обходу перешкоди.
return UO.Dist(100,100,103,104);

2. Правильна перевірка результату – функція сценарію

Параметри та порядок виконання:

  • Від (100,100) до (101,99) відстань дорівнює ?1?. Окреме порівняння distance<=2 дає true=1. Main повертає "1:1": перша одиниця - відстань, друга - логічний результат порівняння.
  • int — відстань у клітинах, невід'ємна для допустимих координат. 0 означає однакові XY, 1 — одну клітинку. Це кількість, а чи не ознака успіху. Окреме порівняння distance <= 2 повертає bool true або false; сама відстань залишається int.
  • Формула: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). Якщо поміняти точки місцями, результат буде той самий. Це не евклідова відстань, не сума різниць і не кількість кроків під час обходу перешкоди.
return  RunScenario();
 object? RunScenario()
{
    var distance = UO.Dist(100, 100, 101, 99);
    var close = distance <= 2;
    return Convert.ToString(distance) + ":" + Convert.ToString(close);
    return null;
}

3. Повний аналіз сценарію - клас сценарію

Параметри та порядок виконання:

  • UO.Dist повертає 4. RebuildTileDistance обчислює різниці через Abs, порівнює їх і повертає велику, також 4. Main повертає "4:4". Помічник повністю наведений у прикладі і не є ще однією командою двигуна.
  • int — відстань у клітинах, невід'ємна для допустимих координат. 0 означає однакові XY, 1 — одну клітинку. Це кількість, а чи не ознака успіху. Окреме порівняння distance <= 2 повертає bool true або false; сама відстань залишається int.
  • Формула: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). Якщо поміняти точки місцями, результат буде той самий. Це не евклідова відстань, не сума різниць і не кількість кроків під час обходу перешкоди.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var actual = UO.Dist(100, 100, 103, 104);
        var rebuilt = RebuildTileDistance(100, 100, 103, 104);
        return Convert.ToString(actual) + ":" + Convert.ToString(rebuilt);
        return null;
    }

    dynamic RebuildTileDistance(dynamic Xfrom, dynamic Yfrom, dynamic Xto, dynamic Yto)
    {
        var dx = Math.Abs(Xto - Xfrom);
        var dy = Math.Abs(Yto - Yfrom);
        if (Truth(dx > dy))
        {
            return dx;
        }

        return dy;
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.Dist(xfrom, yfrom, xto, yto) — UO.Dist(Any,Any,Any,Any)

Параметри: xfrom (Any), yfrom (Any), xto (Any), yto (Any)

Результат: int / Integer.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "dist": return new InjectionValue(arguments.Length >= 4

                    ? GetDistance(Arg(0), Arg(1), Arg(2), Arg(3))

                    : bridge.GetDistance(Arg(0)));

UO.GetDistance

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

int UO.GetDistance(object? id);
int UO.GetDistance(object? x, object? y);
int UO.GetDistance(object? id1, object? x2, object? y2);
int UO.GetDistance(object? x1, object? y1, object? x2, object? y2);

Вимірює відстань у клітинах по максимуму різниць X/Y. Це геометрична оцінка без пошуку шляху.

Параметри

  • id — Один аргумент: serial або аліас завантаженого об'єкта, відстань до якого потрібно отримати.
  • x — Два аргументи: світова точка призначення. Початком служать GetX(self), GetY(self).
  • y — Два аргументи: світова точка призначення. Початком служать GetX(self), GetY(self).
  • id1 — У формі з трьома аргументами — serial/аліас об'єкта, координати якого є початком.
  • x1 - У формі з чотирма аргументами - координати початку. Жодний об'єкт для цієї форми не потрібен.
  • y1 - У формі з чотирма аргументами - координати початку. Жодний об'єкт для цієї форми не потрібен.
  • x2 — У формах із трьома/чотирма аргументами — координати кінця. Не плутайте їх з serial другого об'єкта.
  • y2 — У формах із трьома/чотирма аргументами — координати кінця. Не плутайте їх з serial другого об'єкта.

Повернене значення

int — max(abs(x2-x1), abs(y2-y1)): горизонталь, вертикаль та діагональ на сусідню клітину мають відстань 1. Висота Z та перешкоди не враховуються. Для невідомого serial форма з одним аргументом повертає 0; для існуючого об'єкта за відсутності персонажа - 65535. Для невідомого id1 форма з трьома аргументами використовує (0,0), тому спочатку перевіряйте Exists (id1).

Поведінка

  • Форма з одним об'єктом використовує поточний центр розрахунку дальності World.RangeSize і останню позицію з черги кроків мобу, що рухається. Під час руху результат може відрізнятись від розрахунку через GetX/GetY.
  • Координатні форми працюють із переданими числами. Для ігрових координат використовуйте діапазон 0..65535; крайні значення int і переповнення різниці не є підтримуваними координатами.
  • Команда не обіцяє досяжності мети. Для руху потрібен MoveXY/NewMoveXY та перевірка його результату; стіни можуть зробити реальний шлях довшим.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

var result = UO.GetDistance("lasttarget");
UO.Print("GetDistance: " + Convert.ToString(result));

1. Перевірити дальність до мети – прямий скрипт

Параметри та порядок виконання:

  • target - serial, не type. Перевірка Exists не дозволяє прийняти нуль невідомого об'єкта за близьку мету.
  • distance<=2 перевіряє дальність X/Y. Видимість та прохідність перевіряються окремо.
var target = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(target)))
{
    var distance = UO.GetDistance(target);
    if (Truth(distance <= 2))
    {
        UO.Print("Target is within two tiles");
    }
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Відстань між двома точками – функція сценарію

Параметри та порядок виконання:

  • x1=100, y1=200, x2=103, y2=204. Різниці рівні 3 та 4.
  • Результат дорівнює 4, а не 7 і не евклідовим 5.
return  RunScenario();
 object? RunScenario()
{
    var distance = UO.GetDistance(100, 200, 103, 204);
    UO.Print(Convert.ToString(distance));
    return null;
}

3. Початок з об'єкта та зі свого персонажа — клас сценарію

Параметри та порядок виконання:

  • Два аргументи x/y використовують поточну позицію self. Три аргументи id1/x2/y2 дозволяють явно задати об'єкт початку.
  • При незмінній позиції обидві величини дорівнюють 3. Координати повинні залишатися в межах картки.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var x = UO.GetX() + 3;
        var y = UO.GetY() + 1;
        var fromSelf = UO.GetDistance(x, y);
        var fromObject = UO.GetDistance("self", x, y);
        UO.Print(Convert.ToString(fromSelf) + " / " + Convert.ToString(fromObject));
        return null;
    }
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetDistance(id) — UO.GetDistance(Any)

Параметри: id (Any/Integer/String)

Результат: int / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "getdistance": return new InjectionValue(bridge.GetDistance(Arg(0)));

UO.GetDistance(id) — UO.GetDistance(Integer)

Параметри: id (Any/Integer/String)

Результат: int / Integer.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public int GetDistance(int id) => bridge.GetDistance(id);

UO.GetDistance(id) — UO.GetDistance(String)

Параметри: id (Any/Integer/String)

Результат: int / Integer.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public int GetDistance(string id) => GetDistance(GetObject(id));

UO.GetDistance(x, y) — UO.GetDistance(Integer,Integer)

Параметри: x (Integer), y (Integer)

Результат: int / Integer.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public int GetDistance(int x, int y) => GetDistance(bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), x, y);

UO.GetDistance(id1, x2, y2) — UO.GetDistance(Any,Any,Any)

Параметри: id1 (Any), x2 (Any), y2 (Any)

Результат: int / Integer.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public int GetDistance(InjectionValue id1, InjectionValue x2, InjectionValue y2)

        {

            var obj1 = GetObject(id1);

            int x1 = bridge.GetX(obj1);

            int y1 = bridge.GetY(obj1);



            return GetDistance(x1, y1, NumberConversions.ToInt(x2), NumberConversions.ToInt(y2));

        }

UO.GetDistance(x1, y1, x2, y2) — UO.GetDistance(Integer,Integer,Integer,Integer)

Параметри: x1 (Integer), y1 (Integer), x2 (Integer), y2 (Integer)

Результат: int / Integer.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public int GetDistance(int x1, int y1, int x2, int y2)

        {

            int dx = Math.Abs(x1 - x2);

            int dy = Math.Abs(y1 - y2);



            return Math.Max(dx, dy);

        }

UO.GetLandTileAt

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.GetLandTileAt(object? x, object? y);
dynamic UO.GetLandTileAt(object? x, object? y, object? map);

Повертає розширений запис землі обраної клітини.

Параметри

  • x - X клітини поточної завантаженої карти; світова координата, не позиція всередині гампа.
  • y - Y клітини поточної завантаженої карти; світова координата, не позиція всередині гампа.
  • map — Номер картки. Якщо цей аргумент відсутній у вибраній формі, використовується поточна карта. Справжній клієнт читає лише плитки з поточної завантаженої карти.

Повернене значення

Array з 11 полів одного запису; індекси починаються з 0:

  • [0] kind — string: "земля", "статичний" або "object".
  • [1] serial - int: serial динамічного предмета; для land/static дорівнює 0.
  • [2] graphic - int: type графіки.
  • [3] x, [4] y - int: світові координати клітини.
  • [5] z — int: висота основи у світі.
  • [6] hue — int: колір, біля землі 0.
  • [7] flags - int: молодші 32 біт прапорів tiledata.
  • [8] name - string: назва з tiledata.
  • [9] layer - int: шар екіпірування з tiledata, біля землі 0; не індекс статики.
  • [10] height - int: висота graphic з tiledata, біля землі 0; не координати Z.

Порожній масив [] означає відсутність запису або недоступну картку/клітину. Для GetStaticTileAt негативний/занадто великий index також дає []; переповнення індексу не вибирає чужий запис.

Поведінка

  • Дані належать до поточної завантаженої картки. Інша карта чи недоступна клітина дають порожній масив. Прямі запити тайлів можуть додатково повідомляти про розбіжність картки; GetWorldCell та GetWorldTilesArray відразу повертають порожній масив без такого повідомлення.
  • Індекси масивів починаються з 0. Перед читанням поля перевіряйте ArrayLength. Z означає висоту у світі; layer – властивість екіпірування з tiledata, а index – порядковий номер запису клітини.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.GetLandTileAt(UO.GetX(), UO.GetY());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Окремо прочитати type, Z та шар – прямий скрипт

Параметри та порядок виконання:

  • x/y - становище персонажа; карта опущена та вибирається автоматично. Для GetStaticTileAt index=0 означає перший запис.
  • Поля [2], [5], [9] мають різний зміст; усі читаються лише після перевірки довжини 11.
var tile = UO.GetLandTileAt(UO.GetX(), UO.GetY());
if (Truth(ArrayLength(tile) == 11))
{
    UO.Print("Type: " + Convert.ToString(tile[2]));
    UO.Print("World Z: " + Convert.ToString(tile[5]));
    UO.Print("Equipment layer: " + Convert.ToString(tile[9]));
}
else
{
    UO.Print("Tile is unavailable");
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Отримати ім'я та висоту graphic - функція сценарію

Параметри та порядок виконання:

  • Використовуються самі координати; GetStaticTileAt читає index=0.
  • tile[8] - рядок назви, tile[10] - розмір за висотою з tiledata, а не Z основи.
return  RunScenario();
 object? RunScenario()
{
    var tile = UO.GetLandTileAt(UO.GetX(), UO.GetY());
    if (Truth(ArrayLength(tile) == 11))
    {
        UO.Print(tile[8]);
        UO.Print("Graphic height: " + Convert.ToString(tile[10]));
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Підготувати ціль за type та координатами - клас сценарію

Параметри та порядок виконання:

  • WaitTargetTile отримує graphic, x, y, z з полів 2…5.
  • Це тільки підготовка наступного target. Приклад не запускає застосування інструменту або заклинання. serial=0 для статики не слід передавати як ID предмета.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var tile = UO.GetLandTileAt(UO.GetX(), UO.GetY());
        if (Truth(ArrayLength(tile) == 11))
        {
            UO.WaitTargetTile(tile[2], tile[3], tile[4], tile[5]);
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetLandTileAt(x, y) — UO.GetLandTileAt(Any,Any)

Параметри: x (Any), y (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public InjectionValue GetLandTileAt(InjectionValue x, InjectionValue y)

            => GetLandTileAt(x, y, new InjectionValue(bridge.WorldNumber));

UO.GetLandTileAt(x, y, map) — UO.GetLandTileAt(Any,Any,Any)

Параметри: x (Any), y (Any), map (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public InjectionValue GetLandTileAt(InjectionValue x, InjectionValue y, InjectionValue map)

        {

            int cellX = NumberConversions.ToInt(x);

            int cellY = NumberConversions.ToInt(y);

            int world = NumberConversions.ToInt(map);

            int[] land = bridge.GetLandscapeTile(cellX, cellY, world) ?? Array.Empty<int>();

            return land.Length >= 2

                ? BuildWorldTileRecord("land", 0, land[0], cellX, cellY, land[1], 0, 0)

                : new InjectionValue(Array.Empty<InjectionValue>());

        }

UO.GetLandTileData

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.GetLandTileData(object? tile);

Читає розширений довідковий запис землі з tiledata.

Параметри

  • tile — graphic/type запису, не serial і не індекс усередині клітинки. Таблицю землі визначає сама назва команди.

Повернене значення

Array з 7 полів для допустимого graphic. Усі поля int, крім name (string):

  • [0] graphic - graphic/type запису.
  • [1] flags — молодші 32 біта прапорів.
  • [2] name - назва з tiledata (string).
  • [3] texId - ID текстури землі.
  • [4] wet — 1 якщо встановлено wet, інакше 0.
  • [5] impassable - 1 якщо impassable, інакше 0.
  • [6] noDiagonal — 1 якщо noDiagonal, інакше 0.

Для неприпустимого graphic довідкових властивостей немає: повертається короткий масив [переданный graphic, 0, ""]. Перевіряйте повну довжину перед читанням властивостей. Це не Pascal record та не список об'єктів.

Поведінка

  • Команда читає tiledata і не вимагає предмета з цим graphic у світі. Прапори описують ресурс; результат не замінює повноцінну перевірку маршруту.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.GetLandTileData(0x0003);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Прочитати ім'я запису — прямий скрипт

Параметри та порядок виконання:

  • Tile - числовий graphic вибраної таблиці.
  • data[2] містить ім'я. Перевірка довжини відокремлює повноцінний запис від короткого запису неприпустимого graphic.
var data = UO.GetLandTileData(0x0003);
if (Truth(ArrayLength(data) == 7))
{
    UO.Print(data[2]);
}
else
{
    UO.Print("Tiledata entry is unavailable");
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Перевірте окремий логічний прапор - функція сценарію

Параметри та порядок виконання:

  • data[5] — окреме поле impassable: 1 (умова виконана), 0 (умова не виконана).
  • Ця перевірка не враховує інші об'єкти у клітині чи здібності персонажа.
return  RunScenario();
 object? RunScenario()
{
    var data = UO.GetLandTileData(0x0003);
    if (Truth(ArrayLength(data) == 7))
    {
        if (Truth(data[5]))
        {
            UO.Print("Impassable flag is set");
        }
        else
        {
            UO.Print("Impassable flag is not set");
        }
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Вивести graphic та загальну маску прапорів - клас сценарію

Параметри та порядок виконання:

  • data[0] повторює переданий graphic, data[1] - загальна маска прапорів.
  • Маска може одночасно містити кілька бітів; її числове значення не є serial.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var data = UO.GetLandTileData(0x0003);
        if (Truth(ArrayLength(data) == 7))
        {
            UO.Print("Graphic: " + Convert.ToString(data[0]));
            UO.Print("Flags: " + Convert.ToString(data[1]));
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetLandTileData(tile) — UO.GetLandTileData(Any)

Параметри: tile (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "getlandtiledata":

                    return BuildTileData(0, Arg(0));

UO.GetLandTilesArray

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.GetLandTilesArray(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileType);

Шукає тайли землі по graphic/type у прямокутнику.

Параметри

  • 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]; усі поля int. graphic - type землі, Z - її основа. Немає збігів: пустий Array. Кількість - ArrayLength(result), не сам результат. Індекси починаються з 0. Це не bool, serial або Pascal record; сьомого вихідного параметра немає.

Поведінка

  • Читають локальні дані. Пошук не змінює FindItem/FindCount і не виконує рух, target чи мережеву команду.
  • Порядок: X за зростанням, усередині X - Y за зростанням. Записи однієї клітини зберігають порядок bridge; це не сортування на відстані або висоті.
  • Пошук обробляється порціями до 32 клітин з м'яким бюджетом близько 1 мс. Скасування перевіряється між порціями. Складна клітина чи холодне читання можуть перевищити бюджет. Велику область краще ділити; світ може змінюватись під час читання.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.GetLandTilesArray(UO.GetX(), UO.GetY(), UO.GetX() + 2, UO.GetY() + 2, UO.WorldNum(), 0x0003);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Пошук поряд з персонажем - прямий скрипт

Параметри та порядок виконання:

  • 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: " + Convert.ToString(ArrayLength(rows)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. Переставлені кути та виведення всіх полів – функція сценарію

Параметри та порядок виконання:

  • Область 2×2 передана від більшого кута до меншого. Алгоритм сам нормалізує межі. row - один запис; PrintTile оголошена повністю і лише форматує числа, нічого не переміщуючи. graphic - type, x / y - координати, z - висота, hue - колір. Для землі переданий умовний hue=0: у записі землі немає поля кольору.
return  RunScenario();
 object? RunScenario()
{
    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 (Truth(i < ArrayLength(rows)))
    {
        var row = rows[i];
        PrintTile(row[0], row[1], row[2], row[3], 0);
        i = i + 1;
    }

    return null;
}

void PrintTile(dynamic graphic, dynamic x, dynamic y, dynamic z, dynamic hue)
{
    UO.Print("Type=" + Convert.ToString(graphic) + " X=" + Convert.ToString(x) + " Y=" + Convert.ToString(y));
    UO.Print("Z=" + Convert.ToString(z) + " hue=" + Convert.ToString(hue));
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Повторне опитування з обмеженням повторних спроб – клас сценарію

Параметри та порядок виконання:

  • Не більше трьох пошуків однієї клітини; між спробами WaitAsync(250). Кожен дзвінок створює новий результат. Нульова довжина означає відсутність збігів зараз, а чи не постійна відсутність об'єкта на сервері.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var attempt = 0;
        while (Truth(attempt < 3))
        {
            var rows = UO.GetLandTilesArray(x, y, x, y, map, 0x0003);
            UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
            attempt = attempt + 1;
            await Delay(250);
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetLandTilesArray(xmin, ymin, xmax, ymax, worldNum, tileType) — UO.GetLandTilesArray(Any,Any,Any,Any,Any,Any)

Параметри: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileType (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "getlandtilesarray":

                    return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, false);

UO.GetLandTilesArrayEx

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.GetLandTilesArrayEx(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileTypes);

Шукає тайли землі по graphic/type у прямокутнику.

Параметри

  • 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. Якщо картка змінюється між порціями, частковий результат відкидається.
  • tileTypes — Array числових graphic/type; кожен збігається type включається. Повторення type не дублює запис. Скаляр також приймається як один type. Порожній Array означає все type; масив з одного 0 шукає тільки 0.

Повернене значення

Array записів [graphic, X, Y, Z]; усі поля int. graphic - type землі, Z - її основа. Немає збігів: пустий Array. Кількість - ArrayLength(result), не сам результат. Індекси починаються з 0. Це не bool, serial або Pascal record; сьомого вихідного параметра немає.

Поведінка

  • Читають локальні дані. Пошук не змінює FindItem/FindCount і не виконує рух, target чи мережеву команду.
  • Порядок: X за зростанням, усередині X - Y за зростанням. Записи однієї клітини зберігають порядок bridge; це не сортування на відстані або висоті.
  • Пошук обробляється порціями до 32 клітин з м'яким бюджетом близько 1 мс. Скасування перевіряється між порціями. Складна клітина чи холодне читання можуть перевищити бюджет. Велику область краще ділити; світ може змінюватись під час читання.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.GetLandTilesArrayEx(UO.X(), UO.Y(), UO.X() + 1, UO.Y() + 1, UO.WorldNum(), new[] { 0x0003 });
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Пошук поряд з персонажем - прямий скрипт

Параметри та порядок виконання:

  • x/y – позиція self, map – поточна карта. Область 3×3 включає межі. Ex передаються два type, у звичайній формі один. Змініть зразки під ресурси; це graphic, не ID об'єкта.
dynamic[] types = new dynamic[checked((int)(1) + 1)];
types[0] = 0x0003;
types[1] = 0x0004;
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetLandTilesArrayEx(x, y, x + 2, y + 2, map, types);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. Переставлені кути та виведення всіх полів – функція сценарію

Параметри та порядок виконання:

  • Область 2×2 передана від більшого кута до меншого. Алгоритм сам нормалізує межі. row - один запис; PrintTile оголошена повністю і лише форматує числа, нічого не переміщуючи. graphic - type, x / y - координати, z - висота, hue - колір. Для землі переданий умовний hue=0: у записі землі немає поля кольору.
return  RunScenario();
 object? RunScenario()
{
    dynamic[] types = new dynamic[checked((int)(1) + 1)];
    types[0] = 0x0003;
    types[1] = 0x0004;
    var x = UO.GetX();
    var y = UO.GetY();
    var map = UO.WorldNum();
    var rows = UO.GetLandTilesArrayEx(x + 1, y + 1, x, y, map, types);
    var i = 0;
    while (Truth(i < ArrayLength(rows)))
    {
        var row = rows[i];
        PrintTile(row[0], row[1], row[2], row[3], 0);
        i = i + 1;
    }

    return null;
}

void PrintTile(dynamic graphic, dynamic x, dynamic y, dynamic z, dynamic hue)
{
    UO.Print("Type=" + Convert.ToString(graphic) + " X=" + Convert.ToString(x) + " Y=" + Convert.ToString(y));
    UO.Print("Z=" + Convert.ToString(z) + " hue=" + Convert.ToString(hue));
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Повторне опитування з обмеженням повторних спроб – клас сценарію

Параметри та порядок виконання:

  • Не більше трьох пошуків однієї клітини; між спробами WaitAsync(250). Кожен дзвінок створює новий результат. Нульова довжина означає відсутність збігів зараз, а чи не постійна відсутність об'єкта на сервері.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        dynamic[] types = new dynamic[checked((int)(1) + 1)];
        types[0] = 0x0003;
        types[1] = 0x0004;
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var attempt = 0;
        while (Truth(attempt < 3))
        {
            var rows = UO.GetLandTilesArrayEx(x, y, x, y, map, types);
            UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
            attempt = attempt + 1;
            await Delay(250);
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetLandTilesArrayEx(xmin, ymin, xmax, ymax, worldNum, tileTypes) — UO.GetLandTilesArrayEx(Any,Any,Any,Any,Any,Any)

Параметри: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileTypes (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "getlandtilesarrayex":

                    return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), false);

UO.GetLandscapeTile

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.GetLandscapeTile(object? x, object? y, object? map);

Читає землю однієї клітки поточної картки.

Параметри

  • x - X клітини поточної завантаженої карти; світова координата, не позиція всередині гампа.
  • y - Y клітини поточної завантаженої карти; світова координата, не позиція всередині гампа.
  • map — Номер картки. Якщо цей аргумент відсутній у вибраній формі, використовується поточна карта. Справжній клієнт читає лише плитки з поточної завантаженої карти.

Повернене значення

Array із трьох int: [0] graphic — type землі; [1] z - світова висота землі; [2] flags — молодші 32 біта tiledata-прапорів. Якщо карта/клітина недоступна або немає землі, повертається порожній масив []. Це плоский запис, а не список із трьох тайлів.

Поведінка

  • Дані належать до поточної завантаженої картки. Інша карта чи недоступна клітина дають порожній масив. Прямі запити тайлів можуть додатково повідомляти про розбіжність картки; GetWorldCell та GetWorldTilesArray відразу повертають порожній масив без такого повідомлення.
  • Індекси масивів починаються з 0. Перед читанням поля перевіряйте ArrayLength. Z означає висоту у світі; layer – властивість екіпірування з tiledata, а index – порядковий номер запису клітини.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Показати землю під персонажем - прямий скрипт

Параметри та порядок виконання:

  • x/y беруться з позиції персонажа; map=WorldNum() вибирає поточну картку.
  • Наявність трьох полів перевіряється до індексації; land[0] - graphic, land[1] - Z.
var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
if (Truth(ArrayLength(land) >= 3))
{
    UO.Print("Graphic: " + Convert.ToString(land[0]));
    UO.Print("Ground Z: " + Convert.ToString(land[1]));
}
else
{
    UO.Print("Land is unavailable");
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Порівняти висоту сусідньої клітини – функція сценарію

Параметри та порядок виконання:

  • x+1 — сусідня клітина, y та map зберігаються.
  • deltaZ порівнює землю та персонажа. Це не перевірка прохідності: мости та статики враховуються окремо.
return  RunScenario();
 object? RunScenario()
{
    var land = UO.GetLandscapeTile(UO.GetX() + 1, UO.GetY(), UO.WorldNum());
    if (Truth(ArrayLength(land) >= 3))
    {
        var deltaZ = land[1] - UO.GetZ();
        UO.Print("Ground height difference: " + Convert.ToString(deltaZ));
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Прочитати назву знайденої землі – клас сценарію

Параметри та порядок виконання:

  • group=0 вибирає землю; land[0] - graphic.
  • GetTileName повертає текст, тоді як GetLandscapeTile повертає масив.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(land) >= 3))
        {
            var name = UO.GetTileName(0, land[0]);
            UO.Print(name);
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetLandscapeTile(x, y, map) — UO.GetLandscapeTile(Any,Any,Any)

Параметри: x (Any), y (Any), map (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public InjectionValue GetLandscapeTile(InjectionValue x, InjectionValue y, InjectionValue map)

            => ToArray(bridge.GetLandscapeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)));

UO.GetLayerCount

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.GetLayerCount(object? x, object? y, object? worldNum);

Вважає записи неземельної геометрії лише у клітині.

Параметри

  • x — Світова координата X клітинки поточної карти, не встановлена ​​в гампі.
  • y — Світова координата Y клітини поточної картки.
  • worldNum - Номер карти/фасета; використовуйте UO.WorldNum(). Читається лише поточна завантажена картка.

Повернене значення

int — кількість трійок graphic/Z/hue, отриманих GetStaticTiles. У поточному клієнті враховуються Static, Multi та Item: декілька записів однієї висоти вважаються окремо. Порожня клітина/інша карта дають 0. Це не номер шару екіпіровки, не кількість поверхів, не кількість унікальних висот та не bool.

Поведінка

  • Команда читає локальну карту та не запускає рух або target. Клітина поза розмірами карти не підміняється клітиною сусіднього стовпця.
  • Висота Z, graphic/type, колір hue, прапори та шар екіпіровки мають різний сенс. Нульовий graphic або Z = 0 можуть бути допустимими даними; перевіряйте форму результату.
  • Склад відповідає ReadStaticsXY, а не GetLayer або ObjAtLayer. Цей клієнт включає динамічні предмети та частини Multi.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.GetLayerCount(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Порахувати записи під персонажем - прямий скрипт

Параметри та порядок виконання:

  • count – число записів клітини; 1 означає один запис, а не логічний успіх.
var count = UO.GetLayerCount(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print("Tile records: " + Convert.ToString(count));

2. Перевірити сусідню клітину – функція сценарію

Параметри та порядок виконання:

  • Відсутність записів не доводить прохідність землі. Наявність запису теж не доводить, що він є стіною.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX() + 1;
    var y = UO.GetY();
    var count = UO.GetLayerCount(x, y, UO.WorldNum());
    if (Truth(count > 0))
    {
        UO.Print("Non-land geometry exists: " + Convert.ToString(count));
    }
    else
    {
        UO.Print("No loaded non-land records");
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Порівняти вміст двох шарів картки - клас сценарію

Параметри та порядок виконання:

  • Перевіряються поточна та сусідня клітини у тому ж світі. Кількість шарів не є їхньою висотою або graphic.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        int x = UO.GetX();
        int y = UO.GetY();
        int world = UO.WorldNum();
        int land = UO.GetLayerCount(x, y, world);
        int nearby = UO.GetLayerCount(x + 1, y, world);
        UO.Print($"Layers here: {land}; adjacent tile: {nearby}");
        return null;
    }
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetLayerCount(x, y, worldNum) — UO.GetLayerCount(Any,Any,Any)

Параметри: x (Any), y (Any), worldNum (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "getlayercount":

                    // Stealth's deprecated GetLayerCount(X,Y,WorldNum) is the

                    // number of static records at a map cell.  The portable

                    // bridge returns each record as Graphic/Z/Hue triples.

                    return new InjectionValue(bridge.GetStaticTiles(Arg(0), Arg(1), Arg(2)).Length / 3);

UO.GetMapCell

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.GetMapCell(object? x, object? y, object? worldNum);

Читає graphic, висоту та прапори землі в одній клітці карти.

Параметри

  • x — Світова координата X клітинки поточної карти, не встановлена ​​в гампі.
  • y — Світова координата Y клітини поточної картки.
  • worldNum - Номер карти/фасета; використовуйте UO.WorldNum(). Читається лише поточна завантажена картка.

Повернене значення

Array з трьох int: [0] graphic/type землі, [1] світова Z основи land, [2] молодші 32 бита прапорів tiledata. Недоступна клітка або інша карта дають порожній Array. Це не serial, bool або Pascal record; не використовуйте поля .Tile/.Z. Для кількості полів викликайте ArrayLength(cell).

Поведінка

  • Команда читає локальну карту та не запускає рух або target. Клітина поза розмірами карти не підміняється клітиною сусіднього стовпця.
  • Висота Z, graphic/type, колір hue, прапори та шар екіпіровки мають різний сенс. Нульовий graphic або Z = 0 можуть бути допустимими даними; перевіряйте форму результату.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.GetMapCell(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Прочитати землю під персонажем - прямий скрипт

Параметри та порядок виконання:

  • X/Y беруться у self, WorldNum - поточна карта. cell зберігає всі поля одного дзвінка.
  • Індекси починаються з 0. cell[1] - висота, а не ознака успішного пошуку; порожній масив перевіряється до індексації.
var cell = UO.GetMapCell(UO.GetX(), UO.GetY(), UO.WorldNum());
if (Truth(ArrayLength(cell) == 3))
{
    UO.Print("Type: " + Convert.ToString(cell[0]));
    UO.Print("Land Z: " + Convert.ToString(cell[1]));
    UO.Print("Flags: " + Convert.ToString(cell[2]));
}
else
{
    UO.Print("Map cell unavailable");
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Порівняти дві сусідні клітини – функція сценарію

Параметри та порядок виконання:

  • Другий виклик читає клітинку на схід, обидва використовують одну карту.
  • Різниця висот землі не доводить прохідність: стіни, статики та інші об'єкти перевіряються окремо.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX();
    var y = UO.GetY();
    var map = UO.WorldNum();
    var here = UO.GetMapCell(x, y, map);
    var east = UO.GetMapCell(x + 1, y, map);
    if (Truth(ArrayLength(here) == 3) && Truth(ArrayLength(east) == 3))
    {
        UO.Print("Land difference: " + Convert.ToString(east[1] - here[1]));
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Порівняти основу землі із середньою поверхнею — клас сценарію

Параметри та порядок виконання:

  • GetMapCell читає Land.Z; GetSurfaceZ читає Land.AverageZ.
  • Обидва значення є заввишки. На похилій землі можуть відрізнятися; це не висота статі будинку.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var cell = UO.GetMapCell(x, y, map);
        if (Truth(ArrayLength(cell) == 3))
        {
            var average = UO.GetSurfaceZ(x, y, map);
            UO.Print("Base: " + Convert.ToString(cell[1]) + ", average: " + Convert.ToString(average));
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetMapCell(x, y, worldNum) — UO.GetMapCell(Any,Any,Any)

Параметри: x (Any), y (Any), worldNum (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "getmapcell":

                    return new InjectionValue(bridge.GetLandscapeTile(Arg(0), Arg(1), Arg(2))

                        .Select(value => new InjectionValue(value)).ToArray());

UO.GetNextStepZ

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

int UO.GetNextStepZ(object? currX, object? currY, object? destX, object? destY, object? worldNum, object? currZ);

Обчислює передбачувану висоту наступного кроку у вказаному напрямку.

Параметри

  • currX — Вихідна світова X, зазвичай UO.GetX().
  • currY — Вихідна світова Y, зазвичай UO.GetY().
  • destX - X призначення. Для перевірки одного кроку передавайте сусідню клітину.
  • destY - Y призначення; разом з DestX задає напрямок одного кроку, а не повний маршрут.
  • worldNum - Номер карти/фасета; використовуйте UO.WorldNum(). Читається лише поточна завантажена картка.
  • currZ - Вихідна висота Z, зазвичай UO.GetZ(); геометричний розрахунок використовує діапазон -128..127.

Повернене значення

int — розрахована Z наступного кроку; 0 і від’ємні числа є допустимою висотою. Якщо персонаж відключений або карта інша, повертається 0. Метод повертає компонент Z перевірки навіть за непрохідності; саме число не підтверджує можливість проходу. Для прапорця та висоти разом використовуйте IsWorldCellPassable і читайте [0]/[1].

Поведінка

  • Команда читає локальну карту та не запускає рух або target. Клітина поза розмірами карти не підміняється клітиною сусіднього стовпця.
  • Висота Z, graphic/type, колір hue, прапори та шар екіпіровки мають різний сенс. Нульовий graphic або Z = 0 можуть бути допустимими даними; перевіряйте форму результату.
  • Розрахунок не робить крок і не відчиняє двері. Він перевіряє локальну геометрію; сервер може відхилити реальний рух. Якщо Bridge не повернув Z, використовується CurrZ.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

var result = UO.GetNextStepZ(UO.GetX(), UO.GetY(), UO.GetX() + 1, UO.GetY(), UO.WorldNum(), UO.GetZ());
UO.Print("GetNextStepZ: " + Convert.ToString(result));

1. Дізнатися передбачувану висоту східного кроку – прямий скрипт

Параметри та порядок виконання:

  • Шість параметрів: вихідні X/Y, сусідні X/Y, карта та вихідна Z. nextZ – висота, не true/false.
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var nextZ = UO.GetNextStepZ(x, y, x + 1, y, UO.WorldNum(), z);
UO.Print("Candidate Z: " + Convert.ToString(nextZ));

2. Відокремити відключення від справжньої висоти 0 — функція сценарію

Параметри та порядок виконання:

  • Виклик здійснюється лише за відомого підключення. Між перевіркою та читанням з'єднання може зникнути; Z=0 все одно не є кодом успіху.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(Truth(UO.Connected()) == true))
    {
        var x = UO.GetX();
        var y = UO.GetY();
        var z = UO.GetNextStepZ(x, y, x, y + 1, UO.WorldNum(), UO.GetZ());
        UO.Print("South candidate Z: " + Convert.ToString(z));
    }
    else
    {
        UO.Print("Character disconnected");
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Перевірити наступний крок з поточної висоти клас сценарію

Параметри та порядок виконання:

  • Координати вихідної та цільової клітин передаються окремо. Результат - передбачувана висота, навіть за непрохідності; прапор проходу окремо дає IsWorldCellPassable.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        int x = UO.GetX();
        int y = UO.GetY();
        int z = UO.GetZ();
        int nextZ = UO.GetNextStepZ(x, y, x + 1, y, UO.WorldNum(), z);
        UO.Print($"Current height: {z}; next-step result: {nextZ}");
        return null;
    }
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetNextStepZ(currX, currY, destX, destY, worldNum, currZ) — UO.GetNextStepZ(Any,Any,Any,Any,Any,Any)

Параметри: currX (Any), currY (Any), destX (Any), destY (Any), worldNum (Any), currZ (Any)

Результат: int / Integer.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "getnextstepz":

                {

                    if (bridge.IsOnline() == 0 || Arg(4) != bridge.WorldNumber)

                        return new InjectionValue(0);

                    int[] step = bridge.CheckWorldStep(Arg(0), Arg(1), Arg(5), Arg(2), Arg(3), Arg(4));

                    return new InjectionValue(step.Length > 1 ? step[1] : Arg(5));

                }

UO.GetStaticArt

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.GetStaticArt(object? objType, object? hue);

Отримує зображення одного Graphic із встановлених файлів графіки Ultima Online та повертає його у пам'яті у форматі BMP. Стане в нагоді для перевірки своїх ігрових ресурсів, розмірів іконки, читання кольору пікселя та порівняння пофарбованих варіантів предмета. Команда сама не відкриває вікно, не зберігає файл та не шукає предметів у світі.

Параметри

  • objType — Обов'язковий Graphic/type з розділу static art: ціле 0..65535, рядок з таким числом або збережене ім'я AddType. Наприклад 0x0EED - арт стопки золота. Це не serial предмет, не map/tile координата та не номер анімації тіла. Щоб отримати арт завантаженого предмета, передайте UO.GetType(item), де item – його serial. При числовому type поза діапазоном виходить порожній масив; невідоме рядкове ім'я викликає помилку перетворення.
  • hue - Обов'язкове ціле значення забарвлення: 0 - вихідні кольори арту; позитивне значення - hue з файлів клієнта. Числові рядки допустимі, зокрема результат UO.GetColor(item). Значення обмежується діапазоном 0..65535: негативне перетворюється на 0, занадто велике — на 65535. Тут -1 НЕ означає будь-який колір. Для арту з прапором PartialHue використовується часткове фарбування; для інших – повне. Результат конкретного hue залежить від завантаженої таблиці кольорів.

Повернене значення

Array - одномірний масив int, кожен елемент 0..255 представляє один байт повного BMP-файлу, починаючи з заголовка. Індексація з 0. Це не bool, не ID, не шлях, не об'єкт Bitmap і не масив кольорів RGB. Порожній масив означає, що числовий type неприпустимий, арт відсутня чи необхідні ігрові файли не завантажені. Перед читанням заголовка перевіряйте ArrayLength; порожній масив не дорівнює числу 0.

Поведінка

  • Потрібно рівно два аргументи. Читання виконується з локальних ресурсів клієнта без запиту до сервера. Існування предмета у світі не потрібне. Для mobile число з GetType означає body; тут те число адресує інший розділ ресурсів і дає зображення анімації персонажа.
  • Формат результату: несжатий 24-bit BMP. Байти [0] = 66 і [1] = 77 - - BM; [2..5] - розмір всього файлу; [10..13] - початок пікселів, зараз 54; [14..17] - розмір DIB-заголовка, зараз 40; [18..21] - ширина; [22..25] - позитивна висота; [26..27] - 1 площину; [28..29] - 24 біта. Багатобайтові цифри записані little-endian.
  • Кожен піксель займає три байти у порядку B, G, R. Рядки йдуть знизу вгору і доповнюються нульовими байтами до кратності 4. Довжина рядка = Int((width * 3 + 3) / 4) * 4. Для координат x,y від лівого верхнього кута зсув = 54 + (height - 1 - y) * stride + x * 3. Перед доступом перевіряйте межі та розмір масиву.
  • Прозорість вихідного арту не зберігається: BMP тут містить alpha. Прозоре тло стає чорним, і відрізнити його від вихідного чорного пікселя за результатом не можна. Скріншот екрану, масштабування ігрового вікна, світло, дальність видимості та координати предмета не беруть участь.
  • На кожен дзвінок формується масив зображення. Якщо арт потрібний багато разів, збережіть результат змінну і обробляйте його повторно. Не викликайте завантаження/фарбування кожного пікселя всередині циклу. Однакові параметри та постійні файли дають однаковий результат; різні hue не повинні змінювати кожен піксель, особливо при PartialHue.
  • Для реального .bmp необхідний двійковий висновок точних байтів без текстового кодування. Звичайний File.WriteLine або JsonSave не створює BMP. Приклади нижче обробляють масив у пам'яті і не обіцяють наявність неіснуючого File. WriteBytes.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.GetStaticArt(0x0EED, 0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Перевірити розмір іконки перед обробкою — прямий скрипт

Параметри та порядок виконання:

  • ObjType=0x0EED вибирає ресурс, Hue=0 залишає вихідні кольори. Масив перевіряється до читання зсувів 18 та 22. 64 — власна межа прикладу, не обмеження команди.
  • ArtSizeField — функція користувача C#, не команда UO. Складає чотири байти з вагами 1, 256, 65536, 16777216. Скрипт допомагає вибрати розмір свого осередку; автоматично гамп не створює.
var bmp = UO.GetStaticArt(0x0EED, 0);
if (Truth(ArrayLength(bmp) < 54))
{
    UO.Print("Gold art is unavailable");
    return null;
}
var width = ArtSizeField(bmp, 18);
var height = ArtSizeField(bmp, 22);
if (Truth(width > 64) || Truth(height > 64))
{
    UO.Print("Use a larger cell for this icon");
    return null;
}
UO.Print("Icon fits: " + Convert.ToString(width) + " x " + Convert.ToString(height));

dynamic ArtSizeField(dynamic bytes, dynamic offset)
{
    return bytes[offset] + bytes[offset+1]*256 + bytes[offset+2]*65536 + bytes[offset+3]*16777216;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Обчислити RGB пікселя з урахуванням перегорнутих рядків BMP — функція сценарію

Параметри та порядок виконання:

  • GetStaticArt повертає BMP; ArtPixelRGB – окрема функція прикладу для цього формату. x=0,y=0 означає лівий верхній піксель зображення, а не координати світу. Заміна height-1-y є обов'язковою через порядок рядків знизу вгору.
  • Функція повертає RGB int 0..16777215, а -1 використовує лише як свою ознаку відсутності пікселя. Чорний 0 — дійсний колір, не false і не помилка. Тому перевірка if rgb < 0 відокремлена від if rgb = 0.
return  RunScenario();
 object? RunScenario()
{
    var bmp = UO.GetStaticArt(0x0EED, 0);
    var rgb = ArtPixelRGB(bmp, 0, 0);
    if (Truth(rgb < 0))
    {
        UO.Print("No pixel at this position");
        return null;
    }

    if (Truth(rgb == 0))
    {
        UO.Print("Black pixel: may also be the original transparent background");
    }

    return null;
}

dynamic ArtPixelRGB(dynamic bmp, dynamic x, dynamic y)
{
    if (Truth(ArrayLength(bmp) < 54))
    {
        return -1;
    }

    var width = bmp[18] + bmp[19] * 256 + bmp[20] * 65536 + bmp[21] * 16777216;
    var height = bmp[22] + bmp[23] * 256 + bmp[24] * 65536 + bmp[25] * 16777216;
    if (Truth(x < 0) || Truth(y < 0) || Truth(x >= width) || Truth(y >= height))
    {
        return -1;
    }

    var stride = Math.Floor((width * 3 + 3) / 4) * 4;
    var offset = 54 + (height - 1 - y) * stride + x * 3;
    if (Truth(offset + 2 >= ArrayLength(bmp)))
    {
        return -1;
    }

    return bmp[offset + 2] * 65536 + bmp[offset + 1] * 256 + bmp[offset];
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Порівняти вихідну та пофарбовану версію одного арту – клас сценарію

Параметри та порядок виконання:

  • 0x1F03 - Graphic роби; 0 та 0x0044 — вихідний та вибраний hue. Одинаковий Graphic дає однакові розміри. За порожнього результату порівняння не починається.
  • changed вважає байти кольорових каналів, а не предмети і не число пікселів. Один піксель може змінити до трьох байтів. PartialHue, таблиця кольорів та вихідні кольори можуть залишити частину або все зображення колишнім; це не є доказом помилки команди.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var original = UO.GetStaticArt(0x1F03, 0);
        var colored = UO.GetStaticArt(0x1F03, 0x0044);
        var size = ArrayLength(original);
        if (Truth(size < 54) || Truth(size != ArrayLength(colored)))
        {
            UO.Print("Cannot compare these art resources");
            return null;
        }

        var changed = 0;
        for (int offset = (int)(54); offset <= size - 1; offset += (int)(1))
        {
            if (Truth(original[offset] != colored[offset]))
            {
                changed = changed + 1;
            }
        }

        if (Truth(changed == 0))
        {
            UO.Print("This hue did not change the exported bytes");
        }
        else
        {
            UO.Print("Changed color bytes: " + Convert.ToString(changed));
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetStaticArt(objType, hue) — UO.GetStaticArt(Any,Any)

Параметри: objType (Any), hue (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "getstaticart":

                    return new InjectionValue(bridge.GetStaticArt(ResolveType(arguments[0]), Arg(1)).Select(value => new InjectionValue(value)).ToArray());

UO.GetStaticTileAt

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.GetStaticTileAt(object? x, object? y, object? index);
dynamic UO.GetStaticTileAt(object? x, object? y, object? map, object? index);

Повертає розширений запис одного запису над землею вибраної клітини.

Параметри

  • x - X клітини поточної завантаженої карти; світова координата, не позиція всередині гампа.
  • y - Y клітини поточної завантаженої карти; світова координата, не позиція всередині гампа.
  • map — Номер картки. Якщо цей аргумент відсутній у вибраній формі, використовується поточна карта. Справжній клієнт читає лише плитки з поточної завантаженої карти.
  • index — Порядковий номер запису в результатах GetStaticTiles, починаючи з 0. Це не graphic, не Z і не шар екіпіровки. У формі з 3 аргументів index стоїть третім; у формі з 4 аргументів map третій, index четвертий.

Повернене значення

Array з 11 полів одного запису; індекси починаються з 0:

  • [0] kind — string: "земля", "статичний" або "object".
  • [1] serial - int: serial динамічного предмета; для land/static дорівнює 0.
  • [2] graphic - int: type графіки.
  • [3] x, [4] y - int: світові координати клітини.
  • [5] z — int: висота основи у світі.
  • [6] hue — int: колір, біля землі 0.
  • [7] flags - int: молодші 32 біт прапорів tiledata.
  • [8] name - string: назва з tiledata.
  • [9] layer - int: шар екіпірування з tiledata, біля землі 0; не індекс статики.
  • [10] height - int: висота graphic з tiledata, біля землі 0; не координати Z.

Порожній масив [] означає відсутність запису або недоступну картку/клітину. Для GetStaticTileAt негативний/занадто великий index також дає []; переповнення індексу не вибирає чужий запис.

Поведінка

  • Дані належать до поточної завантаженої картки. Інша карта чи недоступна клітина дають порожній масив. Прямі запити тайлів можуть додатково повідомляти про розбіжність картки; GetWorldCell та GetWorldTilesArray відразу повертають порожній масив без такого повідомлення.
  • Індекси масивів починаються з 0. Перед читанням поля перевіряйте ArrayLength. Z означає висоту у світі; layer – властивість екіпірування з tiledata, а index – порядковий номер запису клітини.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Окремо прочитати type, Z та шар – прямий скрипт

Параметри та порядок виконання:

  • x/y - становище персонажа; карта опущена та вибирається автоматично. Для GetStaticTileAt index=0 означає перший запис.
  • Поля [2], [5], [9] мають різний зміст; усі читаються лише після перевірки довжини 11.
var tile = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
if (Truth(ArrayLength(tile) == 11))
{
    UO.Print("Type: " + Convert.ToString(tile[2]));
    UO.Print("World Z: " + Convert.ToString(tile[5]));
    UO.Print("Equipment layer: " + Convert.ToString(tile[9]));
}
else
{
    UO.Print("Tile is unavailable");
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Отримати ім'я та висоту graphic - функція сценарію

Параметри та порядок виконання:

  • Використовуються самі координати; GetStaticTileAt читає index=0.
  • tile[8] - рядок назви, tile[10] - розмір за висотою з tiledata, а не Z основи.
return  RunScenario();
 object? RunScenario()
{
    var tile = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
    if (Truth(ArrayLength(tile) == 11))
    {
        UO.Print(tile[8]);
        UO.Print("Graphic height: " + Convert.ToString(tile[10]));
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Підготувати ціль за type та координатами - клас сценарію

Параметри та порядок виконання:

  • WaitTargetTile отримує graphic, x, y, z з полів 2…5.
  • Це тільки підготовка наступного target. Приклад не запускає застосування інструменту або заклинання. serial=0 для статики не слід передавати як ID предмета.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var tile = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
        if (Truth(ArrayLength(tile) == 11))
        {
            UO.WaitTargetTile(tile[2], tile[3], tile[4], tile[5]);
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetStaticTileAt(x, y, index) — UO.GetStaticTileAt(Any,Any,Any)

Параметри: x (Any), y (Any), index (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public InjectionValue GetStaticTileAt(InjectionValue x, InjectionValue y, InjectionValue index)

            => GetStaticTileAt(x, y, new InjectionValue(bridge.WorldNumber), index);

UO.GetStaticTileAt(x, y, map, index) — UO.GetStaticTileAt(Any,Any,Any,Any)

Параметри: x (Any), y (Any), map (Any), index (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public InjectionValue GetStaticTileAt(InjectionValue x, InjectionValue y, InjectionValue map, InjectionValue index)

        {

            int cellX = NumberConversions.ToInt(x);

            int cellY = NumberConversions.ToInt(y);

            int[] statics = bridge.GetStaticTiles(cellX, cellY, NumberConversions.ToInt(map)) ?? Array.Empty<int>();

            int tileIndex = NumberConversions.ToInt(index);

            if (tileIndex < 0 || tileIndex >= statics.Length / 3)

                return new InjectionValue(Array.Empty<InjectionValue>());

            int offset = tileIndex * 3;

            return offset + 2 < statics.Length

                ? BuildWorldTileRecord("static", 0, statics[offset], cellX, cellY, statics[offset + 1], statics[offset + 2], 1)

                : new InjectionValue(Array.Empty<InjectionValue>());

        }

UO.GetStaticTileData

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.GetStaticTileData(object? tile);

Читає розширений довідковий запис static graphic з tiledata.

Параметри

  • tile — graphic/type запису, не serial і не індекс усередині клітинки. Таблицю статики визначає сама назва команди.

Повернене значення

Array з 17 полів для допустимого graphic. Усі поля int, крім name (string):

  • [0] graphic - graphic/type запису.
  • [1] flags — молодші 32 біта прапорів.
  • [2] name - назва з tiledata (string).
  • [3] weight - вага з tiledata.
  • [4] layer — номер шару екіпірування.
  • [5] count — поле Count з tiledata, не кількість предметів у світі.
  • [6] animId - ID анімації.
  • [7] hue - hue з tiledata.
  • [8] lightIndex - індекс джерела світла.
  • [9] height - висота graphic, не світова Z.
  • [10] wet — 1 якщо встановлено wet, інакше 0.
  • [11] impassable - 1 якщо impassable, інакше 0.
  • [12] surface — 1 якщо surface, інакше 0.
  • [13] foliage — 1 якщо foliage, інакше 0.
  • [14] door — 1 якщо door, інакше 0.
  • [15] wall — 1 якщо wall, інакше 0.
  • [16] container — 1 якщо container, інакше 0.

Для неприпустимого graphic довідкових властивостей немає: повертається короткий масив [переданный graphic, 0, ""]. Перевіряйте повну довжину перед читанням властивостей. Це не Pascal record та не список об'єктів.

Поведінка

  • Команда читає tiledata і не вимагає предмета з цим graphic у світі. Прапори описують ресурс; результат не замінює повноцінну перевірку маршруту.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.GetStaticTileData(0x0CCA);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Прочитати ім'я запису — прямий скрипт

Параметри та порядок виконання:

  • Tile - числовий graphic вибраної таблиці.
  • data[2] містить ім'я. Перевірка довжини відокремлює повноцінний запис від короткого запису неприпустимого graphic.
var data = UO.GetStaticTileData(0x0CCA);
if (Truth(ArrayLength(data) == 17))
{
    UO.Print(data[2]);
}
else
{
    UO.Print("Tiledata entry is unavailable");
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Перевірте окремий логічний прапор - функція сценарію

Параметри та порядок виконання:

  • data[11] — окреме поле impassable: 1 (умова виконана), 0 (умова не виконана).
  • Ця перевірка не враховує інші об'єкти у клітині чи здібності персонажа.
return  RunScenario();
 object? RunScenario()
{
    var data = UO.GetStaticTileData(0x0CCA);
    if (Truth(ArrayLength(data) == 17))
    {
        if (Truth(data[11]))
        {
            UO.Print("Impassable flag is set");
        }
        else
        {
            UO.Print("Impassable flag is not set");
        }
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Вивести graphic та загальну маску прапорів - клас сценарію

Параметри та порядок виконання:

  • data[0] повторює переданий graphic, data[1] - загальна маска прапорів.
  • Маска може одночасно містити кілька бітів; її числове значення не є serial.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var data = UO.GetStaticTileData(0x0CCA);
        if (Truth(ArrayLength(data) == 17))
        {
            UO.Print("Graphic: " + Convert.ToString(data[0]));
            UO.Print("Flags: " + Convert.ToString(data[1]));
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetStaticTileData(tile) — UO.GetStaticTileData(Any)

Параметри: tile (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "getstatictiledata":

                    return BuildTileData(1, Arg(0));

UO.GetStaticTiles

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.GetStaticTiles(object? x, object? y, object? map);

Читає записи над землею в одній клітці карти.

Параметри

  • x - X клітини поточної завантаженої карти; світова координата, не позиція всередині гампа.
  • y - Y клітини поточної завантаженої карти; світова координата, не позиція всередині гампа.
  • map — Номер картки. Якщо цей аргумент відсутній у вибраній формі, використовується поточна карта. Справжній клієнт читає лише плитки з поточної завантаженої карти.

Повернене значення

Array - плоска послідовність int-трійок [graphic0, z0, hue0, graphic1, z1, hue1, …]. Число записів дорівнює довжині масиву / 3. Для запису i graphic знаходиться в [i*3], Z в [i*3+1], hue в [i*3+2]. Порожній масив означає відсутність записів або недоступну картку/клітину. Serial та номер шару тут не повертаються.

Поведінка

  • Дані належать до поточної завантаженої картки. Інша карта чи недоступна клітина дають порожній масив. Прямі запити тайлів можуть додатково повідомляти про розбіжність картки; GetWorldCell та GetWorldTilesArray відразу повертають порожній масив без такого повідомлення.
  • Індекси масивів починаються з 0. Перед читанням поля перевіряйте ArrayLength. Z означає висоту у світі; layer – властивість екіпірування з tiledata, а index – порядковий номер запису клітини.
  • У поточному bridge перераховуються Static, Multi та світові Item у ланцюжку клітини. Назва команди не обмежує результат лише записами statics.mul. Порядок ланцюжка не гарантує сортування Z.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.GetStaticTiles(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Порахувати записи клітини – прямий скрипт

Параметри та порядок виконання:

  • x/y/map вибирають поточну клітину.
  • Довжина масиву – число полів. Розподіл на 3 дає кількість записів.
var tiles = UO.GetStaticTiles(UO.GetX(), UO.GetY(), UO.WorldNum());
var count = ArrayLength(tiles) / 3;
UO.Print("Tile records: " + Convert.ToString(count));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. Перебрати graphic та висоту всіх записів – функція сценарію

Параметри та порядок виконання:

  • offset — індекс першого поля чергової трійки, що збільшується на 3.
  • Перевірка offset+2 захищає читання всього запису.
return  RunScenario();
 object? RunScenario()
{
    var tiles = UO.GetStaticTiles(UO.GetX(), UO.GetY(), UO.WorldNum());
    var offset = 0;
    while (Truth(offset + 2 < ArrayLength(tiles)))
    {
        UO.Print("Type: " + Convert.ToString(tiles[offset]) + ", Z: " + Convert.ToString(tiles[offset + 1]));
        offset = offset + 3;
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Прочитати hue першого запису — клас сценарію

Параметри та порядок виконання:

  • x+1 вибирає сусідню клітину.
  • tiles[2] — колір першого запису; це не третій тайл.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var tiles = UO.GetStaticTiles(UO.GetX() + 1, UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(tiles) >= 3))
        {
            var hue = tiles[2];
            UO.Print("First tile hue: " + Convert.ToString(hue));
        }
        else
        {
            UO.Print("No tile records");
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetStaticTiles(x, y, map) — UO.GetStaticTiles(Any,Any,Any)

Параметри: x (Any), y (Any), map (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public InjectionValue GetStaticTiles(InjectionValue x, InjectionValue y, InjectionValue map)

            => ToArray(bridge.GetStaticTiles(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)));

UO.GetStaticTilesArray

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.GetStaticTilesArray(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileType);

Шукає запис Static/Multi/Item по graphic/type у прямокутнику.

Параметри

  • 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]; усі поля int. graphic - type, Z - основа, hue - колір. Декілька записів клітини залишаються окремими. Немає збігів: пустий Array. Кількість - ArrayLength(result), не сам результат. Індекси починаються з 0. Це не bool, serial або Pascal record; сьомого вихідного параметра немає.

Поведінка

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

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.GetStaticTilesArray(UO.GetX(), UO.GetY(), UO.GetX() + 2, UO.GetY() + 2, UO.WorldNum(), 0x0CCA);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Пошук поряд з персонажем - прямий скрипт

Параметри та порядок виконання:

  • 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: " + Convert.ToString(ArrayLength(rows)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. Переставлені кути та виведення всіх полів – функція сценарію

Параметри та порядок виконання:

  • Область 2×2 передана від більшого кута до меншого. Алгоритм сам нормалізує межі. row - один запис; PrintTile оголошена повністю і лише форматує числа, нічого не переміщуючи. graphic - type, x / y - координати, z - висота, hue - колір. Для землі переданий умовний hue=0: у записі землі немає поля кольору.
return  RunScenario();
 object? RunScenario()
{
    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 (Truth(i < ArrayLength(rows)))
    {
        var row = rows[i];
        PrintTile(row[0], row[1], row[2], row[3], row[4]);
        i = i + 1;
    }

    return null;
}

void PrintTile(dynamic graphic, dynamic x, dynamic y, dynamic z, dynamic hue)
{
    UO.Print("Type=" + Convert.ToString(graphic) + " X=" + Convert.ToString(x) + " Y=" + Convert.ToString(y));
    UO.Print("Z=" + Convert.ToString(z) + " hue=" + Convert.ToString(hue));
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Повторне опитування з обмеженням повторних спроб – клас сценарію

Параметри та порядок виконання:

  • Не більше трьох пошуків однієї клітини; між спробами WaitAsync(250). Кожен дзвінок створює новий результат. Нульова довжина означає відсутність збігів зараз, а чи не постійна відсутність об'єкта на сервері.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var attempt = 0;
        while (Truth(attempt < 3))
        {
            var rows = UO.GetStaticTilesArray(x, y, x, y, map, 0x0CCA);
            UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
            attempt = attempt + 1;
            await Delay(250);
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetStaticTilesArray(xmin, ymin, xmax, ymax, worldNum, tileType) — UO.GetStaticTilesArray(Any,Any,Any,Any,Any,Any)

Параметри: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileType (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "getstatictilesarray":

                    return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, true);

UO.GetStaticTilesArrayEx

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.GetStaticTilesArrayEx(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileTypes);

Шукає запис Static/Multi/Item по graphic/type у прямокутнику.

Параметри

  • 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. Якщо картка змінюється між порціями, частковий результат відкидається.
  • tileTypes — Array числових graphic/type; кожен збігається type включається. Повторення type не дублює запис. Скаляр також приймається як один type. Порожній Array означає все type; масив з одного 0 шукає тільки 0.

Повернене значення

Array записів [graphic, X, Y, Z, hue]; усі поля int. graphic - type, Z - основа, hue - колір. Декілька записів клітини залишаються окремими. Немає збігів: пустий Array. Кількість - ArrayLength(result), не сам результат. Індекси починаються з 0. Це не bool, serial або Pascal record; сьомого вихідного параметра немає.

Поведінка

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

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.GetStaticTilesArrayEx(UO.X(), UO.Y(), UO.X() + 1, UO.Y() + 1, UO.WorldNum(), new[] { 0x0CCA });
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Пошук поряд з персонажем - прямий скрипт

Параметри та порядок виконання:

  • x/y – позиція self, map – поточна карта. Область 3×3 включає межі. Ex передаються два type, у звичайній формі один. Змініть зразки під ресурси; це graphic, не ID об'єкта.
dynamic[] types = new dynamic[checked((int)(1) + 1)];
types[0] = 0x0CCA;
types[1] = 0x0CCB;
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetStaticTilesArrayEx(x, y, x + 2, y + 2, map, types);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. Переставлені кути та виведення всіх полів – функція сценарію

Параметри та порядок виконання:

  • Область 2×2 передана від більшого кута до меншого. Алгоритм сам нормалізує межі. row - один запис; PrintTile оголошена повністю і лише форматує числа, нічого не переміщуючи. graphic - type, x / y - координати, z - висота, hue - колір. Для землі переданий умовний hue=0: у записі землі немає поля кольору.
return  RunScenario();
 object? RunScenario()
{
    dynamic[] types = new dynamic[checked((int)(1) + 1)];
    types[0] = 0x0CCA;
    types[1] = 0x0CCB;
    var x = UO.GetX();
    var y = UO.GetY();
    var map = UO.WorldNum();
    var rows = UO.GetStaticTilesArrayEx(x + 1, y + 1, x, y, map, types);
    var i = 0;
    while (Truth(i < ArrayLength(rows)))
    {
        var row = rows[i];
        PrintTile(row[0], row[1], row[2], row[3], row[4]);
        i = i + 1;
    }

    return null;
}

void PrintTile(dynamic graphic, dynamic x, dynamic y, dynamic z, dynamic hue)
{
    UO.Print("Type=" + Convert.ToString(graphic) + " X=" + Convert.ToString(x) + " Y=" + Convert.ToString(y));
    UO.Print("Z=" + Convert.ToString(z) + " hue=" + Convert.ToString(hue));
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Повторне опитування з обмеженням повторних спроб – клас сценарію

Параметри та порядок виконання:

  • Не більше трьох пошуків однієї клітини; між спробами WaitAsync(250). Кожен дзвінок створює новий результат. Нульова довжина означає відсутність збігів зараз, а чи не постійна відсутність об'єкта на сервері.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        dynamic[] types = new dynamic[checked((int)(1) + 1)];
        types[0] = 0x0CCA;
        types[1] = 0x0CCB;
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var attempt = 0;
        while (Truth(attempt < 3))
        {
            var rows = UO.GetStaticTilesArrayEx(x, y, x, y, map, types);
            UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
            attempt = attempt + 1;
            await Delay(250);
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetStaticTilesArrayEx(xmin, ymin, xmax, ymax, worldNum, tileTypes) — UO.GetStaticTilesArrayEx(Any,Any,Any,Any,Any,Any)

Параметри: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileTypes (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "getstatictilesarrayex":

                    return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), true);

UO.GetSurfaceZ

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.GetSurfaceZ(object? x, object? y, object? worldNum);

Читає середню висоту поверхні землі у клітці.

Параметри

  • x — Світова координата X клітинки поточної карти, не встановлена ​​в гампі.
  • y — Світова координата Y клітини поточної картки.
  • worldNum - Номер карти/фасета; використовуйте UO.WorldNum(). Читається лише поточна завантажена картка.

Повернене значення

int - Land.AverageZ, у тому числі негативна висота і 0. За відсутності карти/землі або розбіжності картки повертається 0, тому це значення не відрізняє відсутність даних від справжньої висоти 0. Це не bool, поверх або висота найближчої статики.

Поведінка

  • Команда читає локальну карту та не запускає рух або target. Клітина поза розмірами карти не підміняється клітиною сусіднього стовпця.
  • Висота Z, graphic/type, колір hue, прапори та шар екіпіровки мають різний сенс. Нульовий graphic або Z = 0 можуть бути допустимими даними; перевіряйте форму результату.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.GetSurfaceZ(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Середня висота під персонажем – прямий скрипт

Параметри та порядок виконання:

  • Усі три параметри відносяться до поточної клітини картки. z - Чисельна висота, не результат руху.
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var z = UO.GetSurfaceZ(x, y, map);
UO.Print("Average land Z: " + Convert.ToString(z));

2. Перевірити доступність землі до читання – функція сценарію

Параметри та порядок виконання:

  • GetMapCell потрібен, щоб відрізнити відсутні дані від висоти 0. Між двома викликами картка все одно може змінитися.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX() + 1;
    var y = UO.GetY();
    var map = UO.WorldNum();
    var cell = UO.GetMapCell(x, y, map);
    if (Truth(ArrayLength(cell) == 3))
    {
        UO.Print("Average: " + Convert.ToString(UO.GetSurfaceZ(x, y, map)));
    }
    else
    {
        UO.Print("No land data");
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Показати зміну середньої висоти на схід – клас сценарію

Параметри та порядок виконання:

  • Різниця показує нахил землі. Цей приклад нічого не переміщає і не рахує маршрут.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var x = UO.GetX();
        var y = UO.GetY();
        var map = UO.WorldNum();
        var a = UO.GetMapCell(x, y, map);
        var b = UO.GetMapCell(x + 1, y, map);
        if (Truth(ArrayLength(a) == 3) && Truth(ArrayLength(b) == 3))
        {
            var difference = UO.GetSurfaceZ(x + 1, y, map) - UO.GetSurfaceZ(x, y, map);
            UO.Print("Average difference: " + Convert.ToString(difference));
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetSurfaceZ(x, y, worldNum) — UO.GetSurfaceZ(Any,Any,Any)

Параметри: x (Any), y (Any), worldNum (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "getsurfacez":

                    return new InjectionValue(bridge.GetSurfaceZ(Arg(0), Arg(1), Arg(2)));

UO.GetTileFlags

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.GetTileFlags(object? group, object? tileId);

Читає бітову маску властивостей graphic із запису tiledata.

Параметри

  • group - 0 - таблиця землі (land); 1 - таблиця статичних graphic. Реалізація вважає будь-яку ненульову групу другою таблицею; використовуйте 0 або 1.
  • tileId — Graphic/type запису в tiledata, зазвичай ціле 0…65535. Це не serial предмет та не індекс статики всередині клітини.

Повернене значення

int - молодші 32 біта прапорів tiledata. Встановлений старший біт дає негативне знакове число. 0 означає відсутність цих прапорів або неприпустимий tileId; це не самостійна ознака помилки та не bool. Декілька властивостей можуть бути встановлені одночасно.

Поведінка

  • Ця команда читає довідковий запис graphic; координати світу не потрібні. group=0 і group=1 вибирають різні таблиці навіть за однакового tileId.
  • Властивість читається з даних graphic, а чи не з поточного стану конкретного предмета.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.GetTileFlags(1, 0x0CCA);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Прочитати властивість відомого static graphic - прямий скрипт

Параметри та порядок виконання:

  • group=1 вибирає static tiledata; tileId=0x0CCA - graphic дерева.
  • value містить результат, описаний у розділі "Повертає"; його сенс не збігається з serial.
var value = UO.GetTileFlags(1, 0x0CCA);
if (Truth((Convert.ToUInt64(value) & 0x40UL) != 0))
{
    UO.Print("Impassable flag is set");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Прочитати властивість graphic знайденого предмета – функція сценарію

Параметри та порядок виконання:

  • FindType повертає serial. GetType перетворює його на числовий graphic.
  • group=1 використовується для предметів; у tileId передається graphic, не item.
return  RunScenario();
 object? RunScenario()
{
    var item = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(item != ""))
    {
        var graphic = UO.GetType(item);
        var value = UO.GetTileFlags(1, graphic);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Прочитати властивість землі під персонажем - клас сценарію

Параметри та порядок виконання:

  • Перші два аргументи GetLandscapeTile - поточні світові X/Y; третій – поточна карта.
  • land[0] містить graphic землі. group=0 вибирає land tiledata. Для GetTileLayer/GetTileHeight земля дає 0.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(land) >= 3))
        {
            var graphic = land[0];
            var value = UO.GetTileFlags(0, graphic);
            UO.Print(Convert.ToString(value));
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetTileFlags(group, tileId) — UO.GetTileFlags(Any,Any)

Параметри: group (Any), tileId (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public InjectionValue GetTileFlags(InjectionValue group, InjectionValue tileId)

            => new InjectionValue(unchecked((int)bridge.GetTileFlags(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId))));

UO.GetTileHeight

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

int UO.GetTileHeight(object? group, object? tileId);

Читає висоту graphic із запису tiledata.

Параметри

  • group - 0 - таблиця землі (land); 1 - таблиця статичних graphic. Реалізація вважає будь-яку ненульову групу другою таблицею; використовуйте 0 або 1.
  • tileId — Graphic/type запису в tiledata, зазвичай ціле 0…65535. Це не serial предмет та не індекс статики всередині клітини.

Повернене значення

int - висота графіки в одиницях Z з tiledata. Це розмір графіки по висоті, а чи не світова координата її підстави Z. Для землі, відсутньої записи чи нульової висоти повертається 0. Висота сама собою не доводить прохідність.

Поведінка

  • Ця команда читає довідковий запис graphic; координати світу не потрібні. group=0 і group=1 вибирають різні таблиці навіть за однакового tileId.
  • Властивість читається з даних graphic, а чи не з поточного стану конкретного предмета.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

var result = UO.GetTileHeight(1, 0x0CCA);
UO.Print("GetTileHeight: " + Convert.ToString(result));

1. Прочитати властивість відомого static graphic - прямий скрипт

Параметри та порядок виконання:

  • group=1 вибирає static tiledata; tileId=0x0CCA - graphic дерева.
  • value містить результат, описаний у розділі "Повертає"; його сенс не збігається з serial.
var value = UO.GetTileHeight(1, 0x0CCA);
UO.Print("Tiledata height: " + Convert.ToString(value));

2. Прочитати властивість graphic знайденого предмета – функція сценарію

Параметри та порядок виконання:

  • FindType повертає serial. GetType перетворює його на числовий graphic.
  • group=1 використовується для предметів; у tileId передається graphic, не item.
return  RunScenario();
 object? RunScenario()
{
    var item = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(item != ""))
    {
        var graphic = UO.GetType(item);
        var value = UO.GetTileHeight(1, graphic);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Прочитати властивість землі під персонажем - клас сценарію

Параметри та порядок виконання:

  • Перші два аргументи GetLandscapeTile - поточні світові X/Y; третій – поточна карта.
  • land[0] містить graphic землі. group=0 вибирає land tiledata. Для GetTileLayer/GetTileHeight земля дає 0.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(land) >= 3))
        {
            var graphic = land[0];
            var value = UO.GetTileHeight(0, graphic);
            UO.Print(Convert.ToString(value));
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetTileHeight(group, tileId) — UO.GetTileHeight(Any,Any)

Параметри: group (Any), tileId (Any)

Результат: int / Integer.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public int GetTileHeight(InjectionValue group, InjectionValue tileId)

        {

            int tileGroup = NumberConversions.ToInt(group);

            int[] properties = bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)) ?? Array.Empty<int>();

            return tileGroup == 0 || properties.Length < 7 ? 0 : properties[6];

        }

UO.GetTileLayer

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

int UO.GetTileLayer(object? group, object? tileId);

Читає номер шару екіпірування з запису tiledata.

Параметри

  • group - 0 - таблиця землі (land); 1 - таблиця статичних graphic. Реалізація вважає будь-яку ненульову групу другою таблицею; використовуйте 0 або 1.
  • tileId — Graphic/type запису в tiledata, зазвичай ціле 0…65535. Це не serial предмет та не індекс статики всередині клітини.

Повернене значення

int — номер шару екіпіровки graphic: наприклад 1=Rhand, 2=Lhand, 21=Backpack. Для землі, відсутньої запису або нульового шару, повертається 0. Це не порядок статики у клітці, не поверх і не Z.

Поведінка

  • Ця команда читає довідковий запис graphic; координати світу не потрібні. group=0 і group=1 вибирають різні таблиці навіть за однакового tileId.
  • Властивість читається з даних graphic, а чи не з поточного стану конкретного предмета.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

var result = UO.GetTileLayer(1, 0x0CCA);
UO.Print("GetTileLayer: " + Convert.ToString(result));

1. Прочитати властивість відомого static graphic - прямий скрипт

Параметри та порядок виконання:

  • group=1 вибирає static tiledata; tileId=0x0CCA - graphic дерева.
  • value містить результат, описаний у розділі "Повертає"; його сенс не збігається з serial.
var value = UO.GetTileLayer(1, 0x0CCA);
if (Truth(value == 1))
{
    UO.Print("Right-hand graphic");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Прочитати властивість graphic знайденого предмета – функція сценарію

Параметри та порядок виконання:

  • FindType повертає serial. GetType перетворює його на числовий graphic.
  • group=1 використовується для предметів; у tileId передається graphic, не item.
return  RunScenario();
 object? RunScenario()
{
    var item = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(item != ""))
    {
        var graphic = UO.GetType(item);
        var value = UO.GetTileLayer(1, graphic);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Прочитати властивість землі під персонажем - клас сценарію

Параметри та порядок виконання:

  • Перші два аргументи GetLandscapeTile - поточні світові X/Y; третій – поточна карта.
  • land[0] містить graphic землі. group=0 вибирає land tiledata. Для GetTileLayer/GetTileHeight земля дає 0.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(land) >= 3))
        {
            var graphic = land[0];
            var value = UO.GetTileLayer(0, graphic);
            UO.Print(Convert.ToString(value));
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetTileLayer(group, tileId) — UO.GetTileLayer(Any,Any)

Параметри: group (Any), tileId (Any)

Результат: int / Integer.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public int GetTileLayer(InjectionValue group, InjectionValue tileId)

        {

            int tileGroup = NumberConversions.ToInt(group);

            int[] properties = bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)) ?? Array.Empty<int>();

            return tileGroup == 0 || properties.Length < 2 ? 0 : properties[1];

        }

UO.GetTileName

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

string UO.GetTileName(object? group, object? tileId);

Читає назву graphic із запису tiledata.

Параметри

  • group - 0 - таблиця землі (land); 1 - таблиця статичних graphic. Реалізація вважає будь-яку ненульову групу другою таблицею; використовуйте 0 або 1.
  • tileId — Graphic/type запису в tiledata, зазвичай ціле 0…65535. Це не serial предмет та не індекс статики всередині клітини.

Повернене значення

string - назва з ігрових файлів tiledata. Порожній рядок означає порожнє ім'я або неприпустимий tileId. Назва береться з ресурсів гри та не перекладається автоматично на мову інтерфейсу IDE. Не ім'я конкретного предмета від сервера.

Поведінка

  • Ця команда читає довідковий запис graphic; координати світу не потрібні. group=0 і group=1 вибирають різні таблиці навіть за однакового tileId.
  • Властивість читається з даних graphic, а чи не з поточного стану конкретного предмета.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

var result = UO.GetTileName(1, 0x0CCA);
UO.Print("GetTileName: " + Convert.ToString(result));

1. Прочитати властивість відомого static graphic - прямий скрипт

Параметри та порядок виконання:

  • group=1 вибирає static tiledata; tileId=0x0CCA - graphic дерева.
  • value містить результат, описаний у розділі "Повертає"; його сенс не збігається з serial.
var value = UO.GetTileName(1, 0x0CCA);
if (Truth(value != ""))
{
    UO.Print(value);
}
else
{
    UO.Print("No tiledata name");
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Прочитати властивість graphic знайденого предмета – функція сценарію

Параметри та порядок виконання:

  • FindType повертає serial. GetType перетворює його на числовий graphic.
  • group=1 використовується для предметів; у tileId передається graphic, не item.
return  RunScenario();
 object? RunScenario()
{
    var item = UO.FindType(0x0EED, -1, "backpack");
    if (Truth(item != ""))
    {
        var graphic = UO.GetType(item);
        var value = UO.GetTileName(1, graphic);
        UO.Print(Convert.ToString(value));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Прочитати властивість землі під персонажем - клас сценарію

Параметри та порядок виконання:

  • Перші два аргументи GetLandscapeTile - поточні світові X/Y; третій – поточна карта.
  • land[0] містить graphic землі. group=0 вибирає land tiledata. Для GetTileLayer/GetTileHeight земля дає 0.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
        if (Truth(ArrayLength(land) >= 3))
        {
            var graphic = land[0];
            var value = UO.GetTileName(0, graphic);
            UO.Print(Convert.ToString(value));
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetTileName(group, tileId) — UO.GetTileName(Any,Any)

Параметри: group (Any), tileId (Any)

Результат: string / String.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public string GetTileName(InjectionValue group, InjectionValue tileId)

            => bridge.GetTileDataName(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId));

UO.GetTileXYM

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.GetTileXYM(object? x, object? y, object? map, object? tileStart, object? tileEnd, object? uoPath);

Читає graphic ID з ланцюжка об'єктів клітини поточної завантаженої ігрової карти.

Параметри

  • x — комірки координат X, int.
  • y — комірки координат Y, int.
  • map - Номер карти; повинен збігатися з World.MapIndex, і World.Map має існувати.
  • tileStart — Нижній включений кордон Graphic.
  • tileEnd - Верхня включена межа Graphic. Зворотний діапазон не переставляється та не дає збігів.
  • uoPath — Параметр сумісності перетворюється на string, але поточний bridge його не використовує та не завантажує іншу папку файлів UO.

Повернене значення

Array int із плоскими четвірками [graphic,x,y,z,graphic,x,y,z,...]. Помилка картки дає порожній масив та повідомлення; відсутність збігів також дає порожній масив.

Поведінка

  • Іде по World.Map.GetTile(x,y).TNext і перевіряє tileStart<=Graphic<=tileEnd. Типи об'єктів окремо не фільтруються: це ланцюжок клітини, а не лише statics.
  • Команда читає завантажену клієнтську геометрію. Дані з іншого map/facet не завантажуються. Параметр uoPath не використовується для завантаження файлів; число записів дорівнює довжині масиву/4.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.GetTileXYM(UO.GetX(), UO.GetY(), UO.WorldNum(), 0, 65535, "");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Усі графіки поточної клітини – прямий скрипт.

Параметри та порядок виконання:

  • Кожен запис займає чотири int.
var tiles = UO.GetTileXYM(UO.GetX(),UO.GetY(),UO.WorldNum(),0,65535,"");
UO.Print(Convert.ToString(ArrayLength(tiles)/4));

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

2. Друкувати graphic та висоту — функція сценарію

Параметри та порядок виконання:

  • Індекси i та i+3 відповідають graphic та z одного запису.
return  RunScenario();
 object? RunScenario()
{
    var tiles = UO.GetTileXYM(UO.GetX(), UO.GetY(), UO.WorldNum(), 0, 65535, "");
    for (int i = (int)(0); i <= ArrayLength(tiles) - 1; i += (int)(4))
    {
        UO.Print(Convert.ToString(tiles[i]) + " " + Convert.ToString(tiles[i + 3]));
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

3. Зворотній діапазон – клас сценарію

Параметри та порядок виконання:

  • Діапазон 100..99 не містить жодного graphic і дає порожній масив.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var tiles = UO.GetTileXYM(UO.GetX(), UO.GetY(), UO.WorldNum(), 100, 99, "");
        UO.Print(Convert.ToString(ArrayLength(tiles)));
        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetTileXYM(x, y, map, tileStart, tileEnd, uoPath) — UO.GetTileXYM(Any,Any,Any,Any,Any,Any)

Параметри: x (Any), y (Any), map (Any), tileStart (Any), tileEnd (Any), uoPath (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public InjectionValue GetTileXYM(InjectionValue x, InjectionValue y, InjectionValue map, InjectionValue tileStart, InjectionValue tileEnd, InjectionValue uoPath)

            => ToArray(bridge.GetTileXYM(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), NumberConversions.ToInt(tileStart), NumberConversions.ToInt(tileEnd), uoPath.ToString()));

UO.GetUserStatic

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

string UO.GetUserStatic(object? id);

Читає збережений користувача static-запис.

Параметри

  • id — int ID, отриманий AddUserStatic; не graphic/type і не serial світу.

Повернене значення

string - збережена серіалізована запис; невідомий ID дає порожній рядок.

Поведінка

  • state.UserStatics.TryGetValue повертає рядок без його розбору. Геометричний запис - "graphic|x|y|z|hue|map"; старі текстові записи можуть бути іншим текстом.
  • Читає поточний локальний стан. Пакету, target та автоматичного оновлення немає; окремі читання можуть бачити різні стани.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

var result = UO.GetUserStatic(1);
UO.Print("GetUserStatic: " + Convert.ToString(result));

1. Прямий виклик – прямий скрипт

Параметри та порядок виконання:

  • Читає збережений користувача static-запис.
UO.Print(UO.GetUserStatic(1));

2. Явний варіант – функція сценарію

Параметри та порядок виконання:

  • state.UserStatics.TryGetValue повертає рядок без його розбору. Геометричний запис - "graphic|x|y|z|hue|map"; старі текстові записи можуть бути іншим текстом.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.UserStaticExists(1)))
    {
        UO.Print(UO.GetUserStatic(1));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Повна допоміжна функція – клас сценарію

Параметри та порядок виконання:

  • Читає поточний локальний стан. Пакету, target та автоматичного оновлення немає; окремі читання можуть бачити різні стани.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var records = UO.GetUserStatics();
        if (Truth(UO.GetArrayLength(records) > 0))
        {
            UO.Print(UO.GetUserStatic(records[0][0]));
        }

        return null;
    }

    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetUserStatic(id) — UO.GetUserStatic(Any)

Параметри: id (Any)

Результат: string / String.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public string GetUserStatic(InjectionValue id)

            => state.UserStatics.TryGetValue(NumberConversions.ToInt(id), out string value) ? value : string.Empty;

UO.GetUserStatics

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.GetUserStatics();

Читає state. UserStatics.

Параметри

Параметрів немає.

Повернене значення

Array рядків [id, serializedText], відсортованих за id. Кожен id - int, serializedText - string; порожній словник дає порожній масив.

Поведінка

  • Читає state. UserStatics. Геометрична запис зберігається як "graphic|x|y|z|hue|map"; старі текстові записи AddUserStatic можуть мати інший формат. Це локальні записи користувача, не всі статики карти.
  • Читає поточний локальний стан. Пакету, target та автоматичного оновлення немає; окремі читання можуть бачити різні стани.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.GetUserStatics();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Прямий виклик – прямий скрипт

Параметри та порядок виконання:

  • Читає state. UserStatics.
var records = UO.GetUserStatics();
UO.Print(UO.GetArrayLength(records));

2. Явний варіант – функція сценарію

Параметри та порядок виконання:

  • Читає state. UserStatics. Геометрична запис зберігається як "graphic|x|y|z|hue|map"; старі текстові записи AddUserStatic можуть мати інший формат. Це локальні записи користувача, не всі статики карти.
return  RunScenario();
 object? RunScenario()
{
    var records = UO.GetUserStatics();
    if (Truth(UO.GetArrayLength(records) > 0))
    {
        UO.Print(records[0][0]);
        UO.Print(records[0][1]);
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Повна допоміжна функція – клас сценарію

Параметри та порядок виконання:

  • Читає поточний локальний стан. Пакету, target та автоматичного оновлення немає; окремі читання можуть бачити різні стани.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var before = UO.GetUserStatics();
        UO.Wait(500);
        var after = UO.GetUserStatics();
        UO.Print(before);
        UO.Print(after);
        return null;
    }
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetUserStatics() — UO.GetUserStatics()

Параметри: Немає параметрів.

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public InjectionValue GetUserStatics()

            => new InjectionValue(state.UserStatics.OrderBy(pair => pair.Key)

                .Select(pair => new InjectionValue(new[] { new InjectionValue(pair.Key), new InjectionValue(pair.Value) }))

                .ToArray());

UO.GetWorldCell

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.GetWorldCell(object? x, object? y);
dynamic UO.GetWorldCell(object? x, object? y, object? map);

Читає розширені записи землі, записів над землею та завантажених світових предметів у вибраній галузі.

Параметри

  • x - X клітини поточної завантаженої карти; світова координата, не позиція всередині гампа.
  • y - Y клітини поточної завантаженої карти; світова координата, не позиція всередині гампа.
  • map — Номер картки. Якщо цей аргумент відсутній у вибраній формі, використовується поточна карта. Справжній клієнт читає лише плитки з поточної завантаженої карти.

Повернене значення

Array записи. Кожен елемент result[i] має такий формат:

Array з 11 полів одного запису; індекси починаються з 0:

  • [0] kind — string: "земля", "статичний" або "object".
  • [1] serial - int: serial динамічного предмета; для land/static дорівнює 0.
  • [2] graphic - int: type графіки.
  • [3] x, [4] y - int: світові координати клітини.
  • [5] z — int: висота основи у світі.
  • [6] hue — int: колір, біля землі 0.
  • [7] flags - int: молодші 32 біт прапорів tiledata.
  • [8] name - string: назва з tiledata.
  • [9] layer - int: шар екіпірування з tiledata, біля землі 0; не індекс статики.
  • [10] height - int: висота graphic з tiledata, біля землі 0; не координати Z.

ArrayLength(result) - число записів, не число клітин і не число кроків маршруту. Результат може бути пустим. Один x/y може мати кілька записів з різними Z. Запис "object" має serial; запис "static" немає придатного serial.

Поведінка

  • Дані належать до поточної завантаженої картки. Інша карта чи недоступна клітина дають порожній масив. Прямі запити тайлів можуть додатково повідомляти про розбіжність картки; GetWorldCell та GetWorldTilesArray відразу повертають порожній масив без такого повідомлення.
  • Індекси масивів починаються з 0. Перед читанням поля перевіряйте ArrayLength. Z означає висоту у світі; layer – властивість екіпірування з tiledata, а index – порядковий номер запису клітини.
  • Статична частина використовує GetStaticTiles: його поточна вибірка включає також Multi/Item. Світовий Item може додатково бути присутнім як "object" з serial; не рахуйте кожен запис унікальним предметом.
  • GetWorldTilesArray обмежує область 1 000 000 клітин. Перевищення або координати поза 0…65535/map поза 0…255 викликають помилку команди, а не частковий масив. Для найчастішого опитування вибирайте невелику область.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.GetWorldCell(UO.GetX(), UO.GetY());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Порахувати та перерахувати записи — прямий скрипт

Параметри та порядок виконання:

  • GetWorldCell читає одну клітинку; GetWorldTilesArray у цьому прикладі читає квадрат 3×3 з включеними межами.
  • cells[i] - вкладений масив. tile[0] - категорія, [2] - graphic, [5] - Z.
var cells = UO.GetWorldCell(UO.GetX(), UO.GetY());
var i = 0;
while (Truth(i < ArrayLength(cells)))
{
    var tile = cells[i];
    UO.Print(tile[0] + ": " + Convert.ToString(tile[2]) + ", Z=" + Convert.ToString(tile[5]));
    i = i + 1;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Показати тільки записи з serial предмета – функція сценарію

Параметри та порядок виконання:

  • Область вибирається координатами, а чи не контейнером.
  • Перевірка kind="object" відокремлює серійні предмети від землі/статики; [1] містить serial.
return  RunScenario();
 object? RunScenario()
{
    var cells = UO.GetWorldCell(UO.GetX(), UO.GetY());
    var i = 0;
    while (Truth(i < ArrayLength(cells)))
    {
        var tile = cells[i];
        if (Truth(tile[0] == "object"))
        {
            UO.Print("Object serial: " + Convert.ToString(tile[1]));
        }

        i = i + 1;
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Відібрати записи на висоті персонажа – клас сценарію

Параметри та порядок виконання:

  • tile[5] та GetZ() порівнюються в однакових одиницях світової висоти.
  • Рівність Z фільтрує основу, але не означає прохідність або збіг поверху цілком.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var cells = UO.GetWorldCell(UO.GetX(), UO.GetY());
        var i = 0;
        while (Truth(i < ArrayLength(cells)))
        {
            var tile = cells[i];
            if (Truth(tile[5] == UO.GetZ()))
            {
                UO.Print(tile[8]);
            }

            i = i + 1;
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetWorldCell(x, y) — UO.GetWorldCell(Any,Any)

Параметри: x (Any), y (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public InjectionValue GetWorldCell(InjectionValue x, InjectionValue y)

            => GetWorldCell(x, y, new InjectionValue(bridge.WorldNumber));

UO.GetWorldCell(x, y, map) — UO.GetWorldCell(Any,Any,Any)

Параметри: x (Any), y (Any), map (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public InjectionValue GetWorldCell(InjectionValue x, InjectionValue y, InjectionValue map)

            => BuildWorldCell(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), true);

UO.GetWorldNum

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

int UO.GetWorldNum();

Читає номер поточної картки із моделі клієнта.

Параметри

Параметрів немає.

Повернене значення

int — індекс поточної картки клієнта, зазвичай 0=Felucca, 1=Trammel, 2=Ilshenar, 3=Malas, 4=Tokuno, 5=Ter Mur. Сервер користувача може використовувати інший набір карт. 0 - повноцінна карта, не ознака помилки.

Поведінка

  • Читаються вже отримані локальні дані. Запит не відкриває статус і не змушує сервер надіслати оновлення. Після смерті, переходу на карту або видалення об'єкта значення можуть змінитися між двома викликами.
  • C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

var result = UO.GetWorldNum();
UO.Print("GetWorldNum: " + Convert.ToString(result));

1. Вивести поточне значення свого персонажа - прямий скрипт

Параметри та порядок виконання:

  • Виклик без аргументів відноситься до self. Номер поточної картки зберігається у value.
  • Convert.ToString перетворює число для виведення і не змінює значення результату.
var value = UO.GetWorldNum();
UO.Print("GetWorldNum: " + Convert.ToString(value));

2. Використовувати значення у прикладній перевірці – функція сценарію

Параметри та порядок виконання:

  • Значення читається одного разу без аргументів. Номер поточної картки використовується у наведеному розрахунку або за умови.
  • Числові пороги — приклад умов скрипту, а чи не нові межі клієнта. Поле зберігає серверні одиниці та обмеження, описані вище.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.GetWorldNum();
    var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), value);
    UO.Print("Land record length: " + Convert.ToString(ArrayLength(land)));
    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;

3. Спостерігати зміну за одну секунду – клас сценарію

Параметри та порядок виконання:

  • Обидва дзвінки без аргументу читають своє поточне значення. UO.Wait(1000) дає паузу в мілісекундах між знімками.
  • Порівняється зміна: номер поточної картки. Приклад нічого не змінює у світі і не чекає нескінченно. Події всередині цієї секунди можуть бути пропущені.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.GetWorldNum();
        await Delay(1000);
        var after = UO.GetWorldNum();
        if (Truth(before != after))
        {
            UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
        }

        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetWorldNum() — UO.GetWorldNum()

Параметри: Немає параметрів.

Результат: int / Integer.

Під час виклику:

Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.

Внутрішній код реалізації, не самостійний скрипт.

() => bridge.WorldNumber

Створення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.


UO.GetWorldTilesArray

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

dynamic UO.GetWorldTilesArray(object? minX, object? minY, object? maxX, object? maxY, object? map);

Читає розширені записи землі, записів над землею та завантажених світових предметів у вибраній галузі.

Параметри

  • minX - Перша межа X прямокутника, включена; 0…65535.
  • minY - Перша межа Y прямокутника, включена; 0…65535.
  • maxX - Друга включена межа X; менша/велика із двох X вибираються автоматично.
  • maxY - Друга включена межа Y; менша/велика із двох Y вибираються автоматично.
  • map — Номер картки. Якщо цей аргумент відсутній у вибраній формі, використовується поточна карта. Справжній клієнт читає лише плитки з поточної завантаженої карти.

Повернене значення

Array записи. Кожен елемент result[i] має такий формат:

Array з 11 полів одного запису; індекси починаються з 0:

  • [0] kind — string: "земля", "статичний" або "object".
  • [1] serial - int: serial динамічного предмета; для land/static дорівнює 0.
  • [2] graphic - int: type графіки.
  • [3] x, [4] y - int: світові координати клітини.
  • [5] z — int: висота основи у світі.
  • [6] hue — int: колір, біля землі 0.
  • [7] flags - int: молодші 32 біт прапорів tiledata.
  • [8] name - string: назва з tiledata.
  • [9] layer - int: шар екіпірування з tiledata, біля землі 0; не індекс статики.
  • [10] height - int: висота graphic з tiledata, біля землі 0; не координати Z.

ArrayLength(result) - число записів, не число клітин і не число кроків маршруту. Результат може бути пустим. Один x/y може мати кілька записів з різними Z. Запис "object" має serial; запис "static" немає придатного serial.

Поведінка

  • Дані належать до поточної завантаженої картки. Інша карта чи недоступна клітина дають порожній масив. Прямі запити тайлів можуть додатково повідомляти про розбіжність картки; GetWorldCell та GetWorldTilesArray відразу повертають порожній масив без такого повідомлення.
  • Індекси масивів починаються з 0. Перед читанням поля перевіряйте ArrayLength. Z означає висоту у світі; layer – властивість екіпірування з tiledata, а index – порядковий номер запису клітини.
  • Статична частина використовує GetStaticTiles: його поточна вибірка включає також Multi/Item. Світовий Item може додатково бути присутнім як "object" з serial; не рахуйте кожен запис унікальним предметом.
  • GetWorldTilesArray обмежує область 1 000 000 клітин. Перевищення або координати поза 0…65535/map поза 0…255 викликають помилку команди, а не частковий масив. Для найчастішого опитування вибирайте невелику область.

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

object? result = UO.GetWorldTilesArray(UO.GetX() - 1, UO.GetY() - 1, UO.GetX() + 1, UO.GetY() + 1, UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Порахувати та перерахувати записи — прямий скрипт

Параметри та порядок виконання:

  • GetWorldCell читає одну клітинку; GetWorldTilesArray у цьому прикладі читає квадрат 3×3 з включеними межами.
  • cells[i] - вкладений масив. tile[0] - категорія, [2] - graphic, [5] - Z.
var cells = UO.GetWorldTilesArray(UO.GetX() - 1, UO.GetY() - 1, UO.GetX() + 1, UO.GetY() + 1, UO.WorldNum());
var i = 0;
while (Truth(i < ArrayLength(cells)))
{
    var tile = cells[i];
    UO.Print(tile[0] + ": " + Convert.ToString(tile[2]) + ", Z=" + Convert.ToString(tile[5]));
    i = i + 1;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

2. Показати тільки записи з serial предмета – функція сценарію

Параметри та порядок виконання:

  • Область вибирається координатами, а чи не контейнером.
  • Перевірка kind="object" відокремлює серійні предмети від землі/статики; [1] містить serial.
return  RunScenario();
 object? RunScenario()
{
    var cells = UO.GetWorldTilesArray(UO.GetX() - 1, UO.GetY() - 1, UO.GetX() + 1, UO.GetY() + 1, UO.WorldNum());
    var i = 0;
    while (Truth(i < ArrayLength(cells)))
    {
        var tile = cells[i];
        if (Truth(tile[0] == "object"))
        {
            UO.Print("Object serial: " + Convert.ToString(tile[1]));
        }

        i = i + 1;
    }

    return null;
}

int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Відібрати записи на висоті персонажа – клас сценарію

Параметри та порядок виконання:

  • tile[5] та GetZ() порівнюються в однакових одиницях світової висоти.
  • Рівність Z фільтрує основу, але не означає прохідність або збіг поверху цілком.
return  new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

     public object? RunScenario()
    {
        var cells = UO.GetWorldTilesArray(UO.GetX() - 1, UO.GetY() - 1, UO.GetX() + 1, UO.GetY() + 1, UO.WorldNum());
        var i = 0;
        while (Truth(i < ArrayLength(cells)))
        {
            var tile = cells[i];
            if (Truth(tile[5] == UO.GetZ()))
            {
                UO.Print(tile[8]);
            }

            i = i + 1;
        }

        return null;
    }

    int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetWorldTilesArray(minX, minY, maxX, maxY, map) — UO.GetWorldTilesArray(Any,Any,Any,Any,Any)

Параметри: minX (Any), minY (Any), maxX (Any), maxY (Any), map (Any)

Результат: dynamic / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public InjectionValue GetWorldTilesArray(InjectionValue minX, InjectionValue minY, InjectionValue maxX, InjectionValue maxY, InjectionValue map)

        {

            int firstX = Math.Min(NumberConversions.ToInt(minX), NumberConversions.ToInt(maxX));

            int lastX = Math.Max(NumberConversions.ToInt(minX), NumberConversions.ToInt(maxX));

            int firstY = Math.Min(NumberConversions.ToInt(minY), NumberConversions.ToInt(maxY));

            int lastY = Math.Max(NumberConversions.ToInt(minY), NumberConversions.ToInt(maxY));

            int world = NumberConversions.ToInt(map);

            if (firstX < 0 || firstY < 0 || lastX > ushort.MaxValue || lastY > ushort.MaxValue

                || world < 0 || world > byte.MaxValue)

                throw new NativeSubrutineException("World tile coordinates must be 0..65535 and the map must be 0..255.");

            if (((long)lastX - firstX + 1) * ((long)lastY - firstY + 1) > 1_000_000L)

                throw new NativeSubrutineException("World tile array is limited to 1,000,000 cells per call.");

            // Live world items have no per-result map field. Never combine the

            // current world's items with a request for a different map, or scan

            // every cell only to report the same unloaded-map failure repeatedly.

            if (world != bridge.WorldNumber)

                return new InjectionValue(Array.Empty<InjectionValue>());



            var result = new List<InjectionValue>();

            for (int cellX = firstX; cellX <= lastX; cellX++)

            for (int cellY = firstY; cellY <= lastY; cellY++)

            {

                InjectionValue cell = BuildWorldCell(cellX, cellY, world, false);

                if (cell.Kind == InjectionValueKind.Array)

                    result.AddRange(cell.Array);

            }



            foreach (int serial in bridge.GetWorldItems() ?? Array.Empty<int>())

            {

                int objectX = bridge.GetX(serial);

                int objectY = bridge.GetY(serial);

                if (objectX >= firstX && objectX <= lastX && objectY >= firstY && objectY <= lastY)

                    result.Add(BuildWorldTileRecord("object", serial, bridge.GetGraphics(serial), objectX, objectY,

                        bridge.GetZ(serial), bridge.GetColor(serial), 1));

            }

            return new InjectionValue(result.ToArray());

        }

UO.GetX

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

int UO.GetX();
int UO.GetX(object? id);

Читає поле X завантаженого об'єкта чи поточного персонажа.

Параметри

  • id — Serial/ID об'єкта, а не graphic/type. Число, hex-рядок, стандартне ім'я self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse або ім'я AddObject. Аліас має бути встановлений; існування перевіряється Exists. У зареєстрованій формі без аргументів використається self.

Повернене значення

int — координата X. Для невідомого об'єкта повертається 0. Нуль також є допустимою координатою. Вимірюється у клітинах для об'єктів світу; це не екранні пікселі.

Поведінка

  • Читаються останні дані, які вже відомі клієнту; запит на оновлення серверу не надсилається.
  • Невідомий об'єкт та ще не отримана властивість можуть мати нульове/порожнє значення. Перевіряйте Exists та умови конкретної дії.
  • Для персонажа чи предмета землі це координата світу. У предмета всередині контейнера X/Y задають положення всередині гампа; команда не переводить їх у світові координати власника.
  • Читається поточна координата об'єкта. Очікуючі підтвердження кроки не перетворюються цією командою на розрахунок маршруту.

Приклад .csx

int x = UO.GetX();
UO.Print($"X = {x}");

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

var result = UO.GetX();
UO.Print("GetX: " + Convert.ToString(result));

1. Прочитати свою координату — прямий скрипт

Параметри та порядок виконання:

  • Форма без аргументу вибирає self, поточного персонажа.
  • position містить координати X, а не serial.
var position = UO.GetX();
UO.Print("X: " + Convert.ToString(position));

2. Порівняти з вибраним персонажем – функція сценарію

Параметри та порядок виконання:

  • lasttarget повинен вказувати на завантаженого персонажа чи предмет землі.
  • delta - Різниця по одній осі. Вона не є довжиною маршруту; Значення може бути негативним.
return  RunScenario();
 object? RunScenario()
{
    var other = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(other)))
    {
        var delta = UO.GetX(other) - UO.GetX();
        UO.Print("Difference: " + Convert.ToString(delta));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Запам'ятати точку та порівняти пізніше – клас сценарію

Параметри та порядок виконання:

  • id="self" - явна форма вибору персонажа. UO.Wait=500 мілісекунд.
  • Порівняння показує зміну тільки осі X. Зміна іншої осі або поворот тут не враховуються.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.GetX("self");
        await Delay(500);
        var after = UO.GetX("self");
        if (Truth(before != after))
        {
            UO.Print("Coordinate changed");
        }

        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetX() — UO.GetX()

Параметри: Немає параметрів.

Результат: int / Integer.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public int GetX() => GetX("self");

UO.GetX(id) — UO.GetX(Any)

Параметри: id (Any/Integer/String)

Результат: int / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "getx": return new InjectionValue(bridge.GetX(Arg(0, bridge.Self)));

UO.GetX(id) — UO.GetX(Integer)

Параметри: id (Any/Integer/String)

Результат: int / Integer.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public int GetX(int id) => bridge.GetX(id);

UO.GetX(id) — UO.GetX(String)

Параметри: id (Any/Integer/String)

Результат: int / Integer.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public int GetX(string id) => GetX(GetObject(id));

UO.GetY

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

C#-сигнатури

int UO.GetY();
int UO.GetY(object? id);

Читає поле Y завантаженого об'єкта чи поточного персонажа.

Параметри

  • id — Serial/ID об'єкта, а не graphic/type. Число, hex-рядок, стандартне ім'я self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse або ім'я AddObject. Аліас має бути встановлений; існування перевіряється Exists. У зареєстрованій формі без аргументів використається self.

Повернене значення

int — координата Y. Для невідомого об'єкта повертається 0. Нуль також є допустимою координатою. Вимірюється у клітинах для об'єктів світу; це не екранні пікселі.

Поведінка

  • Читаються останні дані, які вже відомі клієнту; запит на оновлення серверу не надсилається.
  • Невідомий об'єкт та ще не отримана властивість можуть мати нульове/порожнє значення. Перевіряйте Exists та умови конкретної дії.
  • Для персонажа чи предмета землі це координата світу. У предмета всередині контейнера X/Y задають положення всередині гампа; команда не переводить їх у світові координати власника.
  • Читається поточна координата об'єкта. Очікуючі підтвердження кроки не перетворюються цією командою на розрахунок маршруту.

Приклад .csx

int y = UO.GetY();
UO.Print($"Y = {y}");

Самостійні C#-скрипти

Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.

Простий приклад

Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.

Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.

var result = UO.GetY();
UO.Print("GetY: " + Convert.ToString(result));

1. Прочитати свою координату — прямий скрипт

Параметри та порядок виконання:

  • Форма без аргументу вибирає self, поточного персонажа.
  • position містить координати Y, а не serial.
var position = UO.GetY();
UO.Print("Y: " + Convert.ToString(position));

2. Порівняти з вибраним персонажем – функція сценарію

Параметри та порядок виконання:

  • lasttarget повинен вказувати на завантаженого персонажа чи предмет землі.
  • delta - Різниця по одній осі. Вона не є довжиною маршруту; Значення може бути негативним.
return  RunScenario();
 object? RunScenario()
{
    var other = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(other)))
    {
        var delta = UO.GetY(other) - UO.GetY();
        UO.Print("Difference: " + Convert.ToString(delta));
    }

    return null;
}

bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;

3. Запам'ятати точку та порівняти пізніше – клас сценарію

Параметри та порядок виконання:

  • id="self" - явна форма вибору персонажа. UO.Wait=500 мілісекунд.
  • Порівняння показує зміну тільки осі Y. Зміна іншої осі або поворот тут не враховуються.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
    private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
    private readonly Func<int, Task> WaitAsync;
    private readonly string[] Args;
    private readonly CancellationToken Cancellation;
    private readonly Action Checkpoint;
    public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
    {
        UO = api;
        WaitAsync = wait;
        Args = args;
        Cancellation = cancellation;
        Checkpoint = checkpoint;
    }

    async public Task<object?> RunScenarioAsync()
    {
        var before = UO.GetY("self");
        await Delay(500);
        var after = UO.GetY("self");
        if (Truth(before != after))
        {
            UO.Print("Coordinate changed");
        }

        return null;
    }

    Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
    bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}

Реалізація команди

C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.

UO.GetY() — UO.GetY()

Параметри: Немає параметрів.

Результат: int / Integer.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public int GetY() => GetY("self");

UO.GetY(id) — UO.GetY(Any)

Параметри: id (Any/Integer/String)

Результат: int / Any.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

case "gety": return new InjectionValue(bridge.GetY(Arg(0, bridge.Self)));

UO.GetY(id) — UO.GetY(Integer)

Параметри: id (Any/Integer/String)

Результат: int / Integer.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public int GetY(int id) => bridge.GetY(id);

UO.GetY(id) — UO.GetY(String)

Параметри: id (Any/Integer/String)

Результат: int / Integer.

Під час виклику:

Внутрішній код реалізації, не самостійний скрипт.

public int GetY(string id) => GetY(GetObject(id));

Clone this wiki locally