RU 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 API · A–Z · Примеры · Языки

Части справочника

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 — полноценная карта, не признак ошибки.

Поведение

  • Читаются уже полученные локальные данные. Запрос не открывает status и не заставляет сервер прислать обновление. После смерти, перехода карты или удаления объекта значения могут измениться между двумя вызовами.
  • 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 также допустим.

Поведение

  • Читаются уже полученные локальные данные. Запрос не открывает status и не заставляет сервер прислать обновление. После смерти, перехода карты или удаления объекта значения могут измениться между двумя вызовами.
  • 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 сохраняется в value.
  • 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.

Поведение

  • Читаются уже полученные локальные данные. Запрос не открывает status и не заставляет сервер прислать обновление. После смерти, перехода карты или удаления объекта значения могут измениться между двумя вызовами.
  • 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 сохраняется в value.
  • 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 может быть реальной высотой или результатом отсутствия объекта.

Поведение

  • Читаются уже полученные локальные данные. Запрос не открывает status и не заставляет сервер прислать обновление. После смерти, перехода карты или удаления объекта значения могут измениться между двумя вызовами.
  • 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** ⚠️