RU UO Topic world geometry Part 2 - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Главная · C# · IDE · UO API · A–Z · Примеры · Языки
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 задают положение внутри гампа; команда не переводит их в мировые координаты владельца.
- Читается текущая координата объекта. Ожидающие подтверждения шаги не превращаются этой командой в расчёт маршрута.
int z = UO.GetZ();
UO.Print($"Z = {z}");Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.GetZ();
UO.Print("GetZ: " + Convert.ToString(result));Параметры и ход выполнения:
- Форма без аргумента выбирает self, текущего персонажа.
- position содержит высота Z, а не serial.
var position = UO.GetZ();
UO.Print("Z: " + Convert.ToString(position));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.GetZ. -
InjectionScript.Runtime.InjectionApiUO.GetZ:GetZ("self").
Внутренний код реализации, не самостоятельный скрипт.
public int GetZ() => GetZ("self");Параметры: id (Any/Integer/String)
Результат: int / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Внутренний код реализации, не самостоятельный скрипт.
case "getz": return new InjectionValue(bridge.GetZ(Arg(0, bridge.Self)));Параметры: id (Any/Integer/String)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.GetZ. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(id).
Внутренний код реализации, не самостоятельный скрипт.
public int GetZ(int id) => bridge.GetZ(id);Параметры: id (Any/Integer/String)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.GetZ. -
InjectionScript.Runtime.InjectionApiUO.GetZ:GetZ(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Внутренний код реализации, не самостоятельный скрипт.
public int GetZ(string id) => GetZ(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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/фильтры. Она не обещает наличие добываемого ресурса, проходимость, дальность или разрешение сервера на добычу.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.IsMineTile(UO.GetX(), UO.GetY());
UO.Print("IsMineTile: " + Convert.ToString(result));Параметры и ход выполнения:
- Проверяет признаки клетки по локальным данным карты.
UO.Print(UO.IsMineTile(UO.GetX(), UO.GetY()));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- Проверка описывает локальные 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.
Параметры: x (Any), y (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.IsMineTile. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsMineTile:bridge.IsMineTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
Внутренний код реализации, не самостоятельный скрипт.
public int IsMineTile(InjectionValue x, InjectionValue y) => bridge.IsMineTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.IsTreeTile(object? x, object? y);Проверяет признаки клетки по локальным данным карты.
-
x— int X клетки текущей карты; мировая координата, не экранный пиксель. -
y— int Y клетки текущей карты; мировая координата, не экранный пиксель.
Числовой флаг int: 1 — найден объект, соответствующий условию; 0 — такого объекта нет или клетка/карта недоступна.
- AnyTileAt обходит TNext-цепочку загруженной клетки. Условие IsTreeTile: Static/Multi, распознанный StaticFilters.IsTree.
- Проверка описывает локальные tiledata/фильтры. Она не обещает наличие добываемого ресурса, проходимость, дальность или разрешение сервера на добычу.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.IsTreeTile(UO.GetX(), UO.GetY());
UO.Print("IsTreeTile: " + Convert.ToString(result));Параметры и ход выполнения:
- Проверяет признаки клетки по локальным данным карты.
UO.Print(UO.IsTreeTile(UO.GetX(), UO.GetY()));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- Проверка описывает локальные 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.
Параметры: x (Any), y (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.IsTreeTile. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsTreeTile:bridge.IsTreeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
Внутренний код реализации, не самостоятельный скрипт.
public int IsTreeTile(InjectionValue x, InjectionValue y) => bridge.IsTreeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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/фильтры. Она не обещает наличие добываемого ресурса, проходимость, дальность или разрешение сервера на добычу.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.IsWaterTile(UO.GetX(), UO.GetY());
UO.Print("IsWaterTile: " + Convert.ToString(result));Параметры и ход выполнения:
- Проверяет признаки клетки по локальным данным карты.
UO.Print(UO.IsWaterTile(UO.GetX(), UO.GetY()));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- Проверка описывает локальные 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.
Параметры: x (Any), y (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.IsWaterTile. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsWaterTile:bridge.IsWaterTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
Внутренний код реализации, не самостоятельный скрипт.
public int IsWaterTile(InjectionValue x, InjectionValue y) => bridge.IsWaterTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 влияют на соседний шаг; без загруженной геометрии он может быть отклонён.
Каждый пример можно сохранить отдельным файлом .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));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- Полный помощник ниже 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(5). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CheckWorldStep:bridge.CheckWorldStep(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), Arg(6)).
Внутренний код реализации, не самостоятельный скрипт.
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) });
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.LOSOptions();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Читает или сохраняет локальную маску параметров LOS runtime.
UO.Print(UO.LOSOptions());Параметры и ход выполнения:
- ExecuteClientApiCompatibility присваивает state.LosOptions при наличии аргумента и возвращает это же поле. Вызов не выполняет CheckLOS и не проверяет стены.
return RunScenario();
object? RunScenario()
{
var before = UO.LOSOptions();
UO.Print(UO.LOSOptions(0));
UO.LOSOptions(before);
return null;
}Параметры и ход выполнения:
- Настройка принадлежит 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "losoptions": if (arguments.Length > 0) state.LosOptions = Arg(0); return new InjectionValue(state.LosOptions);Параметры: value (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "losoptions": if (arguments.Length > 0) state.LosOptions = Arg(0); return new InjectionValue(state.LosOptions);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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.
Каждый пример можно сохранить отдельным файлом .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));Параметры и ход выполнения:
- Ищет первый graphic в заданном диапазоне в локальной клетке.
UO.Print(UO.PrivateGetTile(UO.GetX(), UO.GetY(), 0, 0, 65535));Параметры и ход выполнения:
- 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;
}Параметры и ход выполнения:
- Нет 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.PrivateGetTile. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.PrivateGetTile:bridge.PrivateGetTile(x, y, unknown, minTile, maxTile).
Внутренний код реализации, не самостоятельный скрипт.
public string PrivateGetTile(int x, int y, int unknown, int minTile, int maxTile)
=> bridge.PrivateGetTile(x, y, unknown, minTile, maxTile);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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. Читаются только загруженные данные; нет запросов неизвестной геометрии серверу.
Каждый пример можно сохранить отдельным файлом .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));Параметры и ход выполнения:
- Читает плоские static-записи текущей карты в клетке.
var records = UO.ReadStaticsXY(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(UO.GetArrayLength(records) / 3);Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- Количество записей = 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.
Параметры: x (Any), y (Any), worldNum (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStaticTiles:bridge.GetStaticTiles(Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "readstaticsxy":
return new InjectionValue(bridge.GetStaticTiles(Arg(0), Arg(1), Arg(2)).Select(value => new InjectionValue(value)).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .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));Параметры и ход выполнения:
- Удаляет пользовательскую static-запись по ID.
UO.Print(UO.RemoveUserStatic(1));Параметры и ход выполнения:
- Сначала 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;Параметры и ход выполнения:
- Локальная пользовательская геометрия удаляется из текущего состояния. Серверные предметы и другие 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.
Параметры: id (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.RemoveUserStatic:bridge.RemoveUserStatic(id).
Внутренний код реализации, не самостоятельный скрипт.
case "removeuserstatic":
{
int id = Arg(0);
bool removed = state.UserStatics.Remove(id);
if (removed) bridge.RemoveUserStatic(id);
return new InjectionValue(removed ? 1 : 0);
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.UserStaticExists(1);
UO.Print("UserStaticExists: " + Convert.ToString(result));Параметры и ход выполнения:
- Проверяет наличие ID в пользовательских static-записях.
UO.Print(UO.UserStaticExists(1));Параметры и ход выполнения:
- Проверяется только 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;Параметры и ход выполнения:
- Читает текущее локальное состояние. Пакета, 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.
Параметры: id (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.UserStaticExists. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(id).
Внутренний код реализации, не самостоятельный скрипт.
public int UserStaticExists(InjectionValue id)
=> state.UserStatics.ContainsKey(NumberConversions.ToInt(id)) ? 1 : 0;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.WorldNum();Читает номер текущей карты из модели клиента.
Параметров нет.
int — индекс текущей карты клиента, обычно 0=Felucca, 1=Trammel, 2=Ilshenar, 3=Malas, 4=Tokuno, 5=Ter Mur. Пользовательский сервер может использовать иной набор карт. 0 — полноценная карта, не признак ошибки.
- Читаются уже полученные локальные данные. Запрос не открывает status и не заставляет сервер прислать обновление. После смерти, перехода карты или удаления объекта значения могут измениться между двумя вызовами.
- C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.WorldNum();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Вызов без аргументов относится к self. Номер текущей карты сохраняется в value.
- Convert.ToString преобразует число для вывода и не меняет смысл результата.
var value = UO.WorldNum();
UO.Print("WorldNum: " + Convert.ToString(value));Параметры и ход выполнения:
- Значение читается один раз без аргументов. Номер текущей карты используется в показанном расчёте или условии.
- Числовые пороги — пример условий скрипта, а не новые пределы клиента. Поле сохраняет серверные единицы и ограничения, описанные выше.
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;Параметры и ход выполнения:
- Оба вызова без аргумента читают своё текущее значение. 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
Внутренний код реализации, не самостоятельный скрипт.
case "worldnum": return new InjectionValue(bridge.WorldNumber);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.X();Читает координату X из модели клиента.
Параметров нет.
int — координата X загруженного объекта. У персонажа/предмета мира это мировая клетка, у предмета в сумке — координата внутри контейнера. Неизвестный объект даёт 0, но X=0 также допустим.
- Читаются уже полученные локальные данные. Запрос не открывает status и не заставляет сервер прислать обновление. После смерти, перехода карты или удаления объекта значения могут измениться между двумя вызовами.
- C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.X();
UO.Print("X: " + Convert.ToString(result));Параметры и ход выполнения:
- Вызов без аргументов относится к self. Координату x сохраняется в value.
- Convert.ToString преобразует число для вывода и не меняет смысл результата.
var value = UO.X();
UO.Print("X: " + Convert.ToString(value));Параметры и ход выполнения:
- Значение читается один раз без аргументов. Координату x используется в показанном расчёте или условии.
- Числовые пороги — пример условий скрипта, а не новые пределы клиента. Поле сохраняет серверные единицы и ограничения, описанные выше.
return RunScenario();
object? RunScenario()
{
var value = UO.X();
UO.Print("Two tiles east would be X=" + Convert.ToString(value + 2));
return null;
}Параметры и ход выполнения:
- Оба вызова без аргумента читают своё текущее значение. 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.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [X]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
() => bridge.GetX(bridge.Self)Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Y();Читает координату Y из модели клиента.
Параметров нет.
int — координата Y загруженного объекта. У персонажа/предмета мира это мировая клетка, у предмета в сумке — позиция внутри контейнера. Неизвестный объект даёт 0.
- Читаются уже полученные локальные данные. Запрос не открывает status и не заставляет сервер прислать обновление. После смерти, перехода карты или удаления объекта значения могут измениться между двумя вызовами.
- C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.Y();
UO.Print("Y: " + Convert.ToString(result));Параметры и ход выполнения:
- Вызов без аргументов относится к self. Координату y сохраняется в value.
- Convert.ToString преобразует число для вывода и не меняет смысл результата.
var value = UO.Y();
UO.Print("Y: " + Convert.ToString(value));Параметры и ход выполнения:
- Значение читается один раз без аргументов. Координату y используется в показанном расчёте или условии.
- Числовые пороги — пример условий скрипта, а не новые пределы клиента. Поле сохраняет серверные единицы и ограничения, описанные выше.
return RunScenario();
object? RunScenario()
{
var value = UO.Y();
UO.Print("Two tiles south would be Y=" + Convert.ToString(value + 2));
return null;
}Параметры и ход выполнения:
- Оба вызова без аргумента читают своё текущее значение. 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.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Y]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
() => bridge.GetY(bridge.Self)Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Z();Читает высоту Z из модели клиента.
Параметров нет.
int — высота объекта в единицах мира, обычно -128..127. Это не номер этажа и не слой экипировки. 0 может быть реальной высотой или результатом отсутствия объекта.
- Читаются уже полученные локальные данные. Запрос не открывает status и не заставляет сервер прислать обновление. После смерти, перехода карты или удаления объекта значения могут измениться между двумя вызовами.
- C# учитывает регистр. Используйте точное имя UO. Числовые флаги сравнивайте с 0; bool используйте только там, где сигнатура возвращает bool.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.Z();
UO.Print("Z: " + Convert.ToString(result));Параметры и ход выполнения:
- Вызов без аргументов относится к self. Высоту z сохраняется в value.
- Convert.ToString преобразует число для вывода и не меняет смысл результата.
var value = UO.Z();
UO.Print("Z: " + Convert.ToString(value));Параметры и ход выполнения:
- Значение читается один раз без аргументов. Высоту 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;Параметры и ход выполнения:
- Оба вызова без аргумента читают своё текущее значение. 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.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [Z]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
() => bridge.GetZ(bridge.Self)Создание API: Эти функции создают регистрацию API; они не выполняются заново при каждом вызове команды.