UO Topic world geometry Part 2 - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

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

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

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

1 · 2

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


UO.GetZ

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

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

int UO.GetZ();
int UO.GetZ(object? id);

Читає поле Z завантаженого об'єкта чи поточного персонажа.

Параметри

  • id — Serial/ID об'єкта, а не graphic/type. Число, hex-рядок, стандартне ім'я self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse або ім'я AddObject. Аліас має бути встановлений; існування перевіряється Exists. У зареєстрованій формі без аргументів використається self.

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

int — висота Z. Для невідомого об’єкта повертається 0. Нуль також є допустимою координатою. Висота може бути від’ємною; це не шар екіпірування й не індекс статики.

Поведінка

  • Читаються останні дані, які вже відомі клієнту; запит на оновлення серверу не надсилається.
  • Невідомий об'єкт та ще не отримана властивість можуть мати нульове/порожнє значення. Перевіряйте Exists та умови конкретної дії.
  • Для персонажа чи предмета землі це координата світу. У предмета всередині контейнера X/Y задають положення всередині гампа; команда не переводить їх у світові координати власника.
  • Читається поточна координата об'єкта. Очікуючі підтвердження кроки не перетворюються цією командою на розрахунок маршруту.

Приклад .csx

int z = UO.GetZ();
UO.Print($"Z = {z}");

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

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

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

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

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

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

1. Прочитати свою координату — прямий скрипт

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

  • Форма без аргументу вибирає self, поточного персонажа.
  • position містить висота Z, а не serial.
var position = UO.GetZ();
UO.Print("Z: " + Convert.ToString(position));

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

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

  • lasttarget повинен вказувати на завантаженого персонажа чи предмет землі.
  • delta - Різниця по одній осі. Вона не є довжиною маршруту; Значення може бути негативним.
return  RunScenario();
 object? RunScenario()
{
    var other = UO.GetSerial("lasttarget");
    if (Truth(UO.Exists(other)))
    {
        var delta = UO.GetZ(other) - UO.GetZ();
        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 мілісекунд.
  • Порівняння показує зміну тільки осі Z. Зміна іншої осі або поворот тут не враховуються.
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.GetZ("self");
        await Delay(500);
        var after = UO.GetZ("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.GetZ() — UO.GetZ()

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

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

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

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

public int GetZ() => GetZ("self");

UO.GetZ(id) — UO.GetZ(Any)

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

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

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

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

case "getz": return new InjectionValue(bridge.GetZ(Arg(0, bridge.Self)));

UO.GetZ(id) — UO.GetZ(Integer)

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

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

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

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

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

UO.GetZ(id) — UO.GetZ(String)

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

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

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

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

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

UO.IsMineTile

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

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

int UO.IsMineTile(object? x, object? y);

Перевіряє ознаки клітини за локальними даними картки.

Параметри

  • x - int X клітини поточної карти; світова координата, що не екранний піксель.
  • y - int Y клітини поточної карти; світова координата, що не екранний піксель.

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

Числовий прапор int: 1 - знайдений об'єкт, що відповідає умові; 0 — такого об'єкта немає або клітка/картка недоступна.

Поведінка

  • AnyTileAt обходить TNext-ланцюжок завантаженої клітини. Умова IsMineTile: Static/Multi з StaticFilters.IsRock або ім'ям, що містить cave, mountain або rock без урахування регістру.
  • Перевірка описує локальні tiledata/фільтри. Вона не обіцяє наявність ресурсу, що добувається, прохідність, дальність або дозвіл сервера на видобуток.

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

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

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

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

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

var result = UO.IsMineTile(UO.GetX(), UO.GetY());
UO.Print("IsMineTile: " + Convert.ToString(result));

1. Прямий виклик – прямий скрипт

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

  • Перевіряє ознаки клітини за локальними даними картки.
UO.Print(UO.IsMineTile(UO.GetX(), UO.GetY()));

2. Явний варіант – функція сценарію

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

  • AnyTileAt обходить TNext-ланцюжок завантаженої клітини. Умова IsMineTile: Static/Multi з StaticFilters.IsRock або ім'ям, що містить cave, mountain або rock без урахування регістру.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX() + 1;
    var y = UO.GetY();
    if (Truth(UO.IsMineTile(x, y)))
    {
        UO.Print("Local tile predicate matched");
    }

    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. Повна допоміжна функція – клас сценарію

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

  • Перевірка описує локальні tiledata/фільтри. Вона не обіцяє наявність ресурсу, що добувається, прохідність, дальність або дозвіл сервера на видобуток.
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 before = UO.IsMineTile(x, y);
        UO.Wait(500);
        UO.Print(before = UO.IsMineTile(x, y));
        return null;
    }
}

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

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

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

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

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

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

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

public int IsMineTile(InjectionValue x, InjectionValue y) => bridge.IsMineTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y));

UO.IsTreeTile

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

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

int UO.IsTreeTile(object? x, object? y);

Перевіряє ознаки клітини за локальними даними картки.

Параметри

  • x - int X клітини поточної карти; світова координата, що не екранний піксель.
  • y - int Y клітини поточної карти; світова координата, що не екранний піксель.

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

Числовий прапор int: 1 - знайдений об'єкт, що відповідає умові; 0 — такого об'єкта немає або клітка/картка недоступна.

Поведінка

  • AnyTileAt обходить TNext-ланцюжок завантаженої клітини. Умова IsTreeTile: Static/Multi, розпізнаний StaticFilters.IsTree.
  • Перевірка описує локальні tiledata/фільтри. Вона не обіцяє наявність ресурсу, що добувається, прохідність, дальність або дозвіл сервера на видобуток.

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

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

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

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

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

var result = UO.IsTreeTile(UO.GetX(), UO.GetY());
UO.Print("IsTreeTile: " + Convert.ToString(result));

1. Прямий виклик – прямий скрипт

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

  • Перевіряє ознаки клітини за локальними даними картки.
UO.Print(UO.IsTreeTile(UO.GetX(), UO.GetY()));

2. Явний варіант – функція сценарію

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

  • AnyTileAt обходить TNext-ланцюжок завантаженої клітини. Умова IsTreeTile: Static/Multi, розпізнаний StaticFilters.IsTree.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX() + 1;
    var y = UO.GetY();
    if (Truth(UO.IsTreeTile(x, y)))
    {
        UO.Print("Local tile predicate matched");
    }

    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. Повна допоміжна функція – клас сценарію

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

  • Перевірка описує локальні tiledata/фільтри. Вона не обіцяє наявність ресурсу, що добувається, прохідність, дальність або дозвіл сервера на видобуток.
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 before = UO.IsTreeTile(x, y);
        UO.Wait(500);
        UO.Print(before = UO.IsTreeTile(x, y));
        return null;
    }
}

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

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

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

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

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

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

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

public int IsTreeTile(InjectionValue x, InjectionValue y) => bridge.IsTreeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y));

UO.IsWaterTile

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

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

int UO.IsWaterTile(object? x, object? y);

Перевіряє ознаки клітини за локальними даними картки.

Параметри

  • x - int X клітини поточної карти; світова координата, що не екранний піксель.
  • y - int Y клітини поточної карти; світова координата, що не екранний піксель.

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

Числовий прапор int: 1 - знайдений об'єкт, що відповідає умові; 0 — такого об'єкта немає або клітка/картка недоступна.

Поведінка

  • AnyTileAt обходить TNext-ланцюжок завантаженої клітини. Умова IsWaterTile: Land з TileData.IsWet або об'єкт з допустимим static graphic і прапором IsWet.
  • Перевірка описує локальні tiledata/фільтри. Вона не обіцяє наявність ресурсу, що добувається, прохідність, дальність або дозвіл сервера на видобуток.

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

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

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

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

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

var result = UO.IsWaterTile(UO.GetX(), UO.GetY());
UO.Print("IsWaterTile: " + Convert.ToString(result));

1. Прямий виклик – прямий скрипт

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

  • Перевіряє ознаки клітини за локальними даними картки.
UO.Print(UO.IsWaterTile(UO.GetX(), UO.GetY()));

2. Явний варіант – функція сценарію

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

  • AnyTileAt обходить TNext-ланцюжок завантаженої клітини. Умова IsWaterTile: Land з TileData.IsWet або об'єкт з допустимим static graphic і прапором IsWet.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX() + 1;
    var y = UO.GetY();
    if (Truth(UO.IsWaterTile(x, y)))
    {
        UO.Print("Local tile predicate matched");
    }

    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. Повна допоміжна функція – клас сценарію

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

  • Перевірка описує локальні tiledata/фільтри. Вона не обіцяє наявність ресурсу, що добувається, прохідність, дальність або дозвіл сервера на видобуток.
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 before = UO.IsWaterTile(x, y);
        UO.Wait(500);
        UO.Print(before = UO.IsWaterTile(x, y));
        return null;
    }
}

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

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

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

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

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

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

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

public int IsWaterTile(InjectionValue x, InjectionValue y) => bridge.IsWaterTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y));

UO.IsWorldCellPassable

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

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

dynamic UO.IsWorldCellPassable(object? currX, object? currY, object? currZ, object? destX, object? destY, object? destZ, object? worldNum);

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

Параметри

  • currX — обов’язкова світова координата X початкової клітинки. Ціле число 0..65535 у межах завантаженої карти; це не координата гампа.
  • currY — обов’язкова світова координата Y початкової клітинки. Ціле число 0..65535 у межах завантаженої карти; це не координата гампа.
  • currZ — Обов'язкова вихідна висота −128..127. Це висота світу, чи не номер поверху. Неприпустима висота відхиляється, не обрізається.
  • destX — обов’язкова світова координата X цільової клітинки. Ціле число 0..65535 у межах завантаженої карти; це не координата гампа.
  • destY — обов’язкова світова координата Y цільової клітинки. Ціле число 0..65535 у межах завантаженої карти; це не координата гампа.
  • destZ — Обов'язковий вхідний запасний Z, зазвичай CurrZ. Це не var: змінна не змінюється і не ставить необхідний поверх. Розраховану висоту читайте із результату [1]. Цей Bridge завжди повертає свою висоту; аргумент необхідний сумісності з формою Pascal.
  • worldNum — Обов'язковий номер картки: UO.WorldNum(). Перевіряється лише поточна картка з відомими розмірами; інша картка не завантажується.

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

Array з двох int: [0] - прохідність, 1 (умова виконано), 0 (умова не виконано); [1] - розрахована Z. Лише перший елемент логічний. Сам масив не можна порівнювати з true. Висота 0/негативна допустима; при [0]=0 висота не доводить досяжність. Відхилення аргументів повертає [0, CurrZ].

Поведінка

  • Немає руху, відкриття дверей, прицілу чи мережевих пакетів. Читається локальна геометрія; сервер може пізніше відхилити крок. Два запити можуть бачити різний стан.
  • Приймається сусідня клітина (різниця X/Y не більше 1). Більш далека мета, вихід за карту, відсутність персонажа/карти та IsDestroyed дають відмову до розрахунку. Для повноцінного маршруту використовуйте GetPathArray або NewMoveXY.
  • Однакові допустимі X/Y дають [1, CurrZ] без перевірки колізій: крок не потрібен. Це не перевірка можливості піти з клітки. Стан персонажа та чинні правила Pathfinder впливають на сусідній крок; без завантаженої геометрії може бути відхилений.

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

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

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

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

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

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

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

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

  • x/y/z – вихідна позиція, x+1/y – сусідня клітина, шостий параметр z – запасний Z, останній – поточна карта. result[0] перевіряється до використання result[1].
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;

2. Прочитати Z без зміни вхідного аргументу – функція сценарію

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

  • proposedZ залишається 0 після виклику. targetZ береться з result[1], а не з аргументу. У разі відмови приклад не робить висновків про висоту.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX();
    var y = UO.GetY();
    var z = UO.GetZ();
    var proposedZ = 0;
    var result = UO.IsWorldCellPassable(x, y, z, x, y + 1, proposedZ, UO.WorldNum());
    if (Truth(result[0] == 1))
    {
        var targetZ = result[1];
        UO.Print("Input=" + Convert.ToString(proposedZ) + "; result=" + Convert.ToString(targetZ));
    }

    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. Повна функція IsCellOpen - клас сценарію

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

  • Повний помічник нижче Main приймає вихідні X/Y/Z, цільові X/Y та карту. Він додає обов'язковий шостий аргумент і повертає лише int 1/0, а не масив. Тому результат IsCellOpen можна порівнювати з true. Код не рухає персонажа.
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 openCell = IsCellOpen(x, y, UO.GetZ(), x + 1, y + 1, UO.WorldNum());
        if (Truth(Truth(openCell) == true))
        {
            UO.Print("Diagonal cell is locally passable");
        }

        return null;
    }

    dynamic IsCellOpen(dynamic x, dynamic y, dynamic z, dynamic toX, dynamic toY, dynamic map)
    {
        var cellResult = UO.IsWorldCellPassable(x, y, z, toX, toY, z, map);
        if (Truth(ArrayLength(cellResult) != 2))
        {
            return 0;
        }

        return cellResult[0];
    }

    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.IsWorldCellPassable(currX, currY, currZ, destX, destY, destZ, worldNum) — UO.IsWorldCellPassable(Any,Any,Any,Any,Any,Any,Any)

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

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

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

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

case "isworldcellpassable":

                {

                    int destinationZFallback = Arg(5);

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

                    int passable = step.Length > 0 ? step[0] : 0;

                    int destinationZ = step.Length > 1 ? step[1] : destinationZFallback;

                    return new InjectionValue(new[] { new InjectionValue(passable), new InjectionValue(destinationZ) });

                }

UO.LOSOptions

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

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

dynamic UO.LOSOptions();
dynamic UO.LOSOptions(object? value);

Читає або зберігає локальну маску параметрів LOS runtime.

Параметри

  • value - Необов'язковий int; без аргументу лише читання. У цій гілці діапазон та окремі біти не перевіряються. Молодший 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, не нормалізований алгоритм.

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

int — state.LosOptions після можливої зміни. Це код/маска параметрів, не bool і не результат перевірки видимості.

Поведінка

  • ExecuteClientApiCompatibility присвоює state.LosOptions за наявності аргументу і повертає це поле. Виклик не виконує CheckLOS та не перевіряє стіни.
  • Налаштування належить runtime. Вона не гарантує серверну видимість і не є способом переміщення через перешкоди.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.
  • Молодший 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.LOSOptions();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));

1. Прямий виклик – прямий скрипт

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

  • Читає або зберігає локальну маску параметрів LOS runtime.
UO.Print(UO.LOSOptions());

2. Явний варіант – функція сценарію

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

  • ExecuteClientApiCompatibility присвоює state.LosOptions за наявності аргументу і повертає це поле. Виклик не виконує CheckLOS та не перевіряє стіни.
return  RunScenario();
 object? RunScenario()
{
    var before = UO.LOSOptions();
    UO.Print(UO.LOSOptions(0));
    UO.LOSOptions(before);
    return null;
}

3. Повна допоміжна функція – клас сценарію

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

  • Налаштування належить runtime. Вона не гарантує серверну видимість і не є способом переміщення через перешкоди.
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.LOSOptions();
        UO.LOSOptions(original);
        UO.Print(Convert.ToString(UO.LOSOptions() == original));
        return null;
    }
}

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

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

UO.LOSOptions() — UO.LOSOptions()

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

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

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

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

case "losoptions": if (arguments.Length > 0) state.LosOptions = Arg(0); return new InjectionValue(state.LosOptions);

UO.LOSOptions(value) — UO.LOSOptions(Any)

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

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

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

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

case "losoptions": if (arguments.Length > 0) state.LosOptions = Arg(0); return new InjectionValue(state.LosOptions);

UO.PrivateGetTile

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

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

string UO.PrivateGetTile(object? x, object? y, object? unknown, object? minTile, object? maxTile);

Шукає перший graphic у заданому діапазоні у локальній клітині.

Параметри

  • x - int світові координати поточної карти.
  • y - int світові координати поточної карти.
  • unknown — Legacy-параметр int зберігається в синтаксисі, але bridge його не використовує.
  • minTile - int включні межі graphic. Порядок не змінюється автоматично; minTile>maxTile не дає збігу.
  • maxTile - int включні межі graphic. Порядок не змінюється автоматично; minTile>maxTile не дає збігу.

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

string "0xXXXX" першого відповідного graphic; "0x0000" - немає збігу або карта не завантажена. Справжній graphic=0 також має цю виставу.

Поведінка

  • PrivateGetTile обходить TNext-ланцюжок всіх об'єктів клітини в порядку карти та порівнює graphic>=minTile && graphic<=maxTile. Не фільтрує лише Static і не враховує hue/висоти.
  • Немає Pathfinder/серверний запит. Для точної структурованої геометрії використовуйте GetWorldCell/ReadStaticsXY. Guard відсутньої карти повертає колишній no-match sentinel.

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

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

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

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

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

var result = UO.PrivateGetTile(UO.GetX(), UO.GetY(), 0, 0, 65535);
UO.Print("PrivateGetTile: " + Convert.ToString(result));

1. Прямий виклик – прямий скрипт

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

  • Шукає перший graphic у заданому діапазоні у локальній клітині.
UO.Print(UO.PrivateGetTile(UO.GetX(), UO.GetY(), 0, 0, 65535));

2. Явний варіант – функція сценарію

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

  • PrivateGetTile обходить TNext-ланцюжок всіх об'єктів клітини в порядку карти та порівнює graphic>=minTile && graphic<=maxTile. Не фільтрує лише Static і не враховує hue/висоти.
return  RunScenario();
 object? RunScenario()
{
    UO.Print(UO.PrivateGetTile(UO.GetX(), UO.GetY(), 0, 0x0E21, 0x0E21));
    return null;
}

3. Повна допоміжна функція – клас сценарію

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

  • Немає Pathfinder/серверний запит. Для точної структурованої геометрії використовуйте GetWorldCell/ReadStaticsXY. Guard відсутньої карти повертає колишній no-match sentinel.
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.PrivateGetTile(UO.GetX(), UO.GetY(), 0, 0, 65535);
        if (Truth(tile != "0x0000"))
        {
            UO.Print(tile);
        }

        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.PrivateGetTile(x, y, unknown, minTile, maxTile) — UO.PrivateGetTile(Integer,Integer,Integer,Integer,Integer)

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

Результат: string / String.

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

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

public string PrivateGetTile(int x, int y, int unknown, int minTile, int maxTile)

            => bridge.PrivateGetTile(x, y, unknown, minTile, maxTile);

UO.ReadStaticsXY

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

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

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

Читає плоскі static запис поточної карти в клітці.

Параметри

  • x - int світові координати клітини.
  • y - int світові координати клітини.
  • worldNum - int номер поточної карти. Інша карта не підвантажується та дає порожній масив.

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

Array int, трійки [graphic, Z, hue, graphic, Z, hue...]. Відсутність картки/незбігу WorldNum — порожній масив.

Поведінка

  • Bridge.GetStaticTiles включає Static, Multi та Item з TNext-ланцюжка клітини; Land виключено. Це не Pascal-запис і не масив вкладених триелементних записів.
  • Кількість записів = ArrayLength(result)/3. Читаються лише завантажені дані; немає запитів невідомої геометрії серверу.

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

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

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

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

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

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

1. Прямий виклик – прямий скрипт

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

  • Читає плоскі static запис поточної карти в клітці.
var records = UO.ReadStaticsXY(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(UO.GetArrayLength(records) / 3);

2. Явний варіант – функція сценарію

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

  • Bridge.GetStaticTiles включає Static, Multi та Item з TNext-ланцюжка клітини; Land виключено. Це не Pascal-запис і не масив вкладених триелементних записів.
return  RunScenario();
 object? RunScenario()
{
    var records = UO.ReadStaticsXY(UO.GetX(), UO.GetY(), UO.WorldNum());
    if (Truth(UO.GetArrayLength(records) >= 3))
    {
        UO.Print(records[0]);
        UO.Print(records[1]);
        UO.Print(records[2]);
    }

    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. Повна допоміжна функція – клас сценарію

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

  • Кількість записів = ArrayLength(result)/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 map = UO.WorldNum();
        var records = UO.ReadStaticsXY(UO.GetX(), UO.GetY(), map);
        var i = 0;
        while (Truth(i + 2 < UO.GetArrayLength(records)))
        {
            UO.Print(Convert.ToString(records[i]) + " " + Convert.ToString(records[i + 1]) + " " + Convert.ToString(records[i + 2]));
            i = i + 3;
        }

        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.ReadStaticsXY(x, y, worldNum) — UO.ReadStaticsXY(Any,Any,Any)

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

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

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

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

case "readstaticsxy":

                    return new InjectionValue(bridge.GetStaticTiles(Arg(0), Arg(1), Arg(2)).Select(value => new InjectionValue(value)).ToArray());

UO.RemoveUserStatic

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

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

dynamic UO.RemoveUserStatic(object? id);

Видаляє користувача static-запис по ID.

Параметри

  • id — int ID, повернутий AddUserStatic; немає graphic/type.

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

Числовий прапор "int": "1" - запис був і видалений, "0" - "ID" був відсутній.

Поведінка

  • Спочатку state.UserStatics.Remove; тільки при успішному видаленні викликається bridge. RemoveUserStatic (id). Видалення не відноситься до стандартних статиків файлів картки.
  • Локальна користувальницька геометрія видаляється з поточного стану. Серверні предмети та інші ID не змінюються.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

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

1. Прямий виклик – прямий скрипт

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

  • Видаляє користувача static-запис по ID.
UO.Print(UO.RemoveUserStatic(1));

2. Явний варіант – функція сценарію

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

  • Спочатку state.UserStatics.Remove; тільки при успішному видаленні викликається bridge. RemoveUserStatic (id). Видалення не відноситься до стандартних статиків файлів картки.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.UserStaticExists(1)))
    {
        UO.Print(UO.RemoveUserStatic(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. Повна допоміжна функція – клас сценарію

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

  • Локальна користувальницька геометрія видаляється з поточного стану. Серверні предмети та інші 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 records = UO.GetUserStatics();
        if (Truth(UO.GetArrayLength(records) > 0))
        {
            var id = records[0][0];
            UO.Print(UO.RemoveUserStatic(id));
            UO.Print(UO.UserStaticExists(id));
        }

        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.RemoveUserStatic(id) — UO.RemoveUserStatic(Any)

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

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

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

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

case "removeuserstatic":

                {

                    int id = Arg(0);

                    bool removed = state.UserStatics.Remove(id);

                    if (removed) bridge.RemoveUserStatic(id);

                    return new InjectionValue(removed ? 1 : 0);

                }

UO.UserStaticExists

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

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

int UO.UserStaticExists(object? id);

Перевіряє наявність ID у користувацьких static-записах.

Параметри

  • id — int ID AddUserStatic; не graphic/type і не serial.

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

Числовий прапор "int": "1" - ключ є в state. "UserStatics", "0" - відсутній.

Поведінка

  • Перевіряється лише ContainsKey у runtime-словнику. Вигляд об'єкта на карті, успішне створення bridge-об'єкта та серверний світ не перевіряються.
  • Читає поточний локальний стан. Пакету, target та автоматичного оновлення немає; окремі читання можуть бачити різні стани.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

var result = UO.UserStaticExists(1);
UO.Print("UserStaticExists: " + Convert.ToString(result));

1. Прямий виклик – прямий скрипт

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

  • Перевіряє наявність ID у користувацьких static-записах.
UO.Print(UO.UserStaticExists(1));

2. Явний варіант – функція сценарію

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

  • Перевіряється лише ContainsKey у runtime-словнику. Вигляд об'єкта на карті, успішне створення bridge-об'єкта та серверний світ не перевіряються.
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.UserStaticExists(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.UserStaticExists(id) — UO.UserStaticExists(Any)

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

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

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

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

public int UserStaticExists(InjectionValue id)

            => state.UserStatics.ContainsKey(NumberConversions.ToInt(id)) ? 1 : 0;

UO.WorldNum

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

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

dynamic UO.WorldNum();

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

Параметри

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

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

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; для масиву показано кількість елементів.

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

1. Вивести поточне значення свого персонажа - прямий скрипт

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

  • Виклик без аргументів відноситься до self. Номер поточної картки зберігається у value.
  • Convert.ToString перетворює число для виведення і не змінює значення результату.
var value = UO.WorldNum();
UO.Print("WorldNum: " + Convert.ToString(value));

2. Використовувати значення у прикладній перевірці – функція сценарію

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

  • Значення читається одного разу без аргументів. Номер поточної картки використовується у наведеному розрахунку або за умови.
  • Числові пороги — приклад умов скрипту, а чи не нові межі клієнта. Поле зберігає серверні одиниці та обмеження, описані вище.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.WorldNum();
    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.WorldNum();
        await Delay(1000);
        var after = UO.WorldNum();
        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.WorldNum() — UO.WorldNum()

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

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

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

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

case "worldnum": return new InjectionValue(bridge.WorldNumber);

UO.X

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

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

int UO.X();

Читає координату X із моделі клієнта.

Параметри

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

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

int - координата X завантаженого об'єкта. У персонажа/предмета світу це світова клітина, предмет у сумці — координата всередині контейнера. Невідомий об'єкт дає 0, але X=0 також допустимо.

Поведінка

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

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

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

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

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

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

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

1. Вивести поточне значення свого персонажа - прямий скрипт

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

  • Виклик без аргументів відноситься до self. Координату x зберігається у значення.
  • Convert.ToString перетворює число для виведення і не змінює значення результату.
var value = UO.X();
UO.Print("X: " + Convert.ToString(value));

2. Використовувати значення у прикладній перевірці – функція сценарію

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

  • Значення читається одного разу без аргументів. Координату x використовується у наведеному розрахунку або умові.
  • Числові пороги — приклад умов скрипту, а чи не нові межі клієнта. Поле зберігає серверні одиниці та обмеження, описані вище.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.X();
    UO.Print("Two tiles east would be X=" + Convert.ToString(value + 2));
    return null;
}

3. Спостерігати зміну за одну секунду – клас сценарію

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

  • Обидва дзвінки без аргументу читають своє поточне значення. UO.Wait(1000) дає паузу в мілісекундах між знімками.
  • Порівнюється зміна: координату 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.X();
        await Delay(1000);
        var after = UO.X();
        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.X() — UO.X()

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

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

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

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

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

() => bridge.GetX(bridge.Self)

Створення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.


UO.Y

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

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

int UO.Y();

Читає координату Y із моделі клієнта.

Параметри

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

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

int - координата Y завантаженого об'єкта. У персонажа/предмета світу це світова клітина, предмет у сумці — позиція всередині контейнера. Невідомий об'єкт дає 0.

Поведінка

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

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

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

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

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

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

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

1. Вивести поточне значення свого персонажа - прямий скрипт

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

  • Виклик без аргументів відноситься до self. Координату y зберігається у значення.
  • Convert.ToString перетворює число для виведення і не змінює значення результату.
var value = UO.Y();
UO.Print("Y: " + Convert.ToString(value));

2. Використовувати значення у прикладній перевірці – функція сценарію

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

  • Значення читається одного разу без аргументів. Координату y використовується у наведеному розрахунку або умові.
  • Числові пороги — приклад умов скрипту, а чи не нові межі клієнта. Поле зберігає серверні одиниці та обмеження, описані вище.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.Y();
    UO.Print("Two tiles south would be Y=" + Convert.ToString(value + 2));
    return null;
}

3. Спостерігати зміну за одну секунду – клас сценарію

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

  • Обидва дзвінки без аргументу читають своє поточне значення. UO.Wait(1000) дає паузу в мілісекундах між знімками.
  • Порівнюється зміна: координату 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.Y();
        await Delay(1000);
        var after = UO.Y();
        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.Y() — UO.Y()

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

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

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

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

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

() => bridge.GetY(bridge.Self)

Створення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.


UO.Z

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

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

int UO.Z();

Читає висоту Z із моделі клієнта.

Параметри

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

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

int — висота об'єкта в одиницях світу, зазвичай - 128..127. Це не номер поверху та не шар екіпірування. 0 може бути реальною висотою чи результатом відсутності об'єкта.

Поведінка

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

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

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

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

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

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

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

1. Вивести поточне значення свого персонажа - прямий скрипт

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

  • Виклик без аргументів відноситься до self. Висоту z зберігається у value.
  • Convert.ToString перетворює число для виведення і не змінює значення результату.
var value = UO.Z();
UO.Print("Z: " + Convert.ToString(value));

2. Використовувати значення у прикладній перевірці – функція сценарію

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

  • Значення читається одного разу без аргументів. Висоту z використовується у наведеному розрахунку або умові.
  • Числові пороги — приклад умов скрипту, а чи не нові межі клієнта. Поле зберігає серверні одиниці та обмеження, описані вище.
return  RunScenario();
 object? RunScenario()
{
    var value = UO.Z();
    var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
    if (Truth(ArrayLength(land) >= 3))
    {
        UO.Print("Height above land: " + Convert.ToString(value - land[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. Спостерігати зміну за одну секунду – клас сценарію

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

  • Обидва дзвінки без аргументу читають своє поточне значення. UO.Wait(1000) дає паузу в мілісекундах між знімками.
  • Порівнюється зміна: висоту Z. Приклад нічого не змінює у світі і не чекає нескінченно. Події всередині цієї секунди можуть бути пропущені.
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.Z();
        await Delay(1000);
        var after = UO.Z();
        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.Z() — UO.Z()

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

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

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

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

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

() => bridge.GetZ(bridge.Self)

Створення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.

⚠️ **GitHub.com Fallback** ⚠️