Repository navigation
UO Topic world geometry
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Головна · C# · IDE · Команди UO · За абеткою · Приклади · Мови
Координати, відстані, видимість, прохідність і властивості клітин карти. Команди побудови маршруту зібрано окремо в розділі «Рух персонажа».
| Тема | Команди та пояснення |
|---|---|
| Координати X, Y і Z | UO.GetX · UO.GetY · UO.GetZ |
| Відстань | UO.GetDistance · UO.Dist |
| Лінія видимості | UO.CheckLOS · UO.LOSOptions |
| Номер світу | UO.WorldNum |
| Клітини світу | UO.GetWorldCell · UO.GetWorldTilesArray |
| Прохідність | UO.IsWorldCellPassable · UO.GetNextStepZ |
| Висота поверхні | UO.GetSurfaceZ |
| Клітини карти | UO.GetMapCell |
| Клітини поверхні | UO.GetLandTileAt · UO.GetLandTileData · UO.GetLandTilesArray · UO.GetLandTilesArrayEx |
| Статичні об’єкти карти | UO.GetStaticTileAt · UO.GetStaticTileData · UO.GetStaticTiles · UO.GetStaticTilesArray · UO.GetStaticTilesArrayEx |
| Прапори клітини | UO.GetTileFlags · UO.ConvertIntegerToFlags |
| Висота клітини | UO.GetTileHeight |
| Шар об’єкта | UO.GetTileLayer |
| Назва клітини | UO.GetTileName |
| Водні клітини | UO.IsWaterTile |
| Дерева | UO.IsTreeTile |
| Клітини для видобутку | UO.IsMineTile |
UO.X · UO.Y · UO.Z · UO.GetX · UO.GetY · UO.GetZ
UO.GetWorldCell · UO.GetMapCell · UO.IsWorldCellPassable · UO.GetSurfaceZ · UO.GetNextStepZ · UO.GetWorldTilesArray
UO.GetLandscapeTile · UO.GetLandTileAt · UO.GetLandTileData · UO.GetLandTilesArray · UO.GetLandTilesArrayEx
UO.GetStaticArt · UO.GetStaticTileAt · UO.GetStaticTileData · UO.GetStaticTiles · UO.GetStaticTilesArray · UO.GetStaticTilesArrayEx · UO.ReadStaticsXY · UO.PrivateGetTile · UO.GetTileXYM · UO.GetLayerCount
UO.GetTileFlags · UO.GetTileHeight · UO.GetTileLayer · UO.GetTileName · UO.IsWaterTile · UO.IsTreeTile · UO.IsMineTile · UO.ConvertIntegerToFlags
UO.AddUserStatic · UO.ClearUserStatics · UO.GetUserStatic · UO.GetUserStatics · UO.RemoveUserStatic · UO.UserStaticExists
Нижче наведено короткі приклади. У повному описі кожної команди є параметри, результат, обмеження та кілька самостійних скриптів: прямий код, варіант із функцією та варіант із класом.
Параметри, результат та всі сценарії
var target = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(target)))
{
var distance = UO.GetDistance(target);
if (Truth(distance <= 2))
{
UO.Print("Target is within two tiles");
}
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри, результат та всі сценарії
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;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.AddUserStatic(object? staticItem, object? worldNum);
int UO.AddUserStatic(object? graphic, object? x, object? y, object? z, object? hue, object? map);Додає запис користувача статика в локальний стан скриптів. Числовий graphic використовується для локальної перевірки перешкод pathfinder'ом; об'єкт на сервері не створюється. Двоххаргументний виклик з ненумерованим текстом зберігає legacy-значення і не додає статик у pathfinder.
-
staticItem- числовий graphic або legacy-текстове значення. -
worldNum- індекс картки для запису або локального статика. -
graphic— ID статичний від0до65535. -
z- висота. При додаванні pathfinder значення обмежується діапазоном signed byte. -
hue- hue; при додаванні обмежується діапазоном від0до65535. -
map- індекс картки; для обробки менеджером діапазон обмежений0–255. -
x- Світова X користувача статика; int. Менеджер приймає координати всередині поточної завантаженої картки. -
y- Світова Y користувача статика; int. Менеджер приймає координати всередині поточної завантаженої картки.
Позитивний ID створеного запису. Для шестипараметричної форми негативні "graphic", "x", "y" або "map", а також "graphic" вище "65535" приводять до "-1". ID можна передати в UO.UserStaticExists, UO.RemoveUserStatic або використовувати для перевірки/видалення legacy-запису. Сам по собі повернутий ID не підтверджує, що статик буде видно або застосовано на сервері.
-
-
UO.AddUserStatic('tree', 0)- оскількиtreeне є числом, зберігає пару вихідних значень як legacy-запис у стані runtime; pathfinder її не використовує.
-
- Двопараметричний виклик з числовим graphic додає статик цього graphic на поточні координати персонажа, з
zперсонажа та hue0. - Шестипараметричний виклик додає статик із заданими graphic, координатами, висотою, hue та картою. Pathfinding враховує його тільки на активній карті і відповідно до прапорів graphic в клієнтських tiledata.
Ці записи локальні для клієнта скриптів: вони не створюють ігровий об'єкт, не надсилають запит на мережу і не змінюють дані shard'а.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.AddUserStatic(0x0CCA, UO.GetWorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));1. Зберегти пару як legacy-дані; текстовий StaticItem не створює перешкоди pathfinder'у. - Прямий скрипт
Параметри та порядок виконання:
- Зберегти пару як legacy-дані; текстовий StaticItem не створює перешкоди pathfinder'у.
var legacyId = UO.AddUserStatic("tree", 0);
UO.Print(Convert.ToString(legacyId));Параметри та порядок виконання:
- Числовий graphic додається до позиції персонажа на поточній карті.
return RunScenario();
object? RunScenario()
{
var staticId = UO.AddUserStatic(0x0CCA, UO.GetWorldNum());
UO.Print(Convert.ToString(staticId));
return null;
}Параметри та порядок виконання:
- Явно додати локальний static graphic у вказану позицію та на вказану карту.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var staticId = UO.AddUserStatic(0x0CCA, UO.GetX(), UO.GetY(), UO.GetZ(), 0, UO.GetWorldNum());
UO.Print(Convert.ToString(staticId));
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: staticItem (Any), worldNum (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1, bridge.WorldNumber). -
InjectionScript.Runtime.NumberConversions.TryStr2Int:NumberConversions.TryStr2Int(arguments[0].String, out graphic). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Text:Text(0). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.AddUserStatic:AddUserStatic(graphic, bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), bridge.GetZ(bridge.Self), 0, map). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Внутрішній код реалізації, не самостійний скрипт.
case "adduserstatic":
{
int map = Arg(1, bridge.WorldNumber);
if (arguments[0].Kind != InjectionValueKind.Array)
{
int graphic = 0;
if (arguments[0].Kind == InjectionValueKind.String &&
!NumberConversions.TryStr2Int(arguments[0].String, out graphic))
{
int legacyId = state.NextUserStaticId++;
state.UserStatics[legacyId] = Text(0) + "|" + Text(1);
return new InjectionValue(legacyId);
}
graphic = arguments[0].Kind == InjectionValueKind.String
? graphic
: NumberConversions.ToInt(arguments[0]);
return new InjectionValue(AddUserStatic(graphic, bridge.GetX(bridge.Self), bridge.GetY(bridge.Self),
bridge.GetZ(bridge.Self), 0, map));
}
if (arguments[0].Array.Length < 4)
throw new NativeSubrutineException("AddUserStatic expects [graphic,x,y,z,color] and world number, or graphic,x,y,z,color,world.");
InjectionValue[] item = arguments[0].Array;
return new InjectionValue(AddUserStatic(
NumberConversions.ToInt(item[0]), NumberConversions.ToInt(item[1]), NumberConversions.ToInt(item[2]),
NumberConversions.ToInt(item[3]), item.Length > 4 ? NumberConversions.ToInt(item[4]) : 0, map));
}Параметри: graphic (Any), x (Any), y (Any), z (Any), hue (Any), map (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.Register [AddUserStatic]. -
InjectionScript.Runtime.InjectionApiUO.AddUserStatic:AddUserStatic( NumberConversions.ToInt(values[0]), NumberConversions.ToInt(values[1]), NumberConversions.ToInt(values[2]), NumberConversions.ToInt(values[3]), NumberConversions.ToInt(values[4]), NumberConversions.ToInt(values[5])). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(values[0]).
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
values => new InjectionValue(AddUserStatic(
NumberConversions.ToInt(values[0]), NumberConversions.ToInt(values[1]), NumberConversions.ToInt(values[2]),
NumberConversions.ToInt(values[3]), NumberConversions.ToInt(values[4]), NumberConversions.ToInt(values[5])))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.CheckLOS(object? xfrom, object? yfrom, object? zfrom, object? xto, object? yto, object? zto, object? worldNum);Перевіряє локальну прохідність лінії між двома точками карти через CheckPortableLineOfSight.
-
xfrom— Вихідний X: 0..65535. -
yfrom— Вихідний Y: 0..65535. -
zfrom- Вихідна Z, int. -
xto— Кінцевий X: 0..65535. -
yto— Кінцевий Y: 0..65535. -
zto- Кінцева Z, int. -
worldNum— 0..255. Промінь ненульової довжини читає тільки поточну завантажену _world.Map/World.Map: через CheckWorldStep потрібні WorldNum == _world.MapIndex та живий Player.Pathfinder. Інший facet не завантажується та не запитується; немає карти/персонажу/pathfinder або крок недоступний - 0. Виняток однакових X/Y пропускає весь цикл клітин: при X/Y 0..65535, WorldNum в 0..255 і abs(Zfrom-Zto)<=20 повертає 1 навіть без завантаженої картки або з іншим номером картки. Це не доказ геометрії чи досяжності. Результат локальний, не розв'язання LOS сервера.
int 1 — локальний промінь досяг X/Y і кінцева висота відрізняється від Zto не більше ніж на 20; 0 — неприпустимі координати, перешкоди або межі перевірки.
- Промінь йде алгоритмом Bresenham, максимум 4096 кроків. На кожній клітині враховуються BadLocations, CheckWorldStep та повернена висота.
- При LosOptions != 0 додатково використовується CheckLosCell; біт 0x100 перевіряє обидві бічні клітини діагоналі. Перевірка локальної геометрії не засвідчує правила LOS конкретного сервера і не переміщає.
- Молодший byte (value & 0xFF) вибирає алгоритм 1..4; інші значення молодшого byte в CheckLosCell використовують алгоритм 3. Алгоритми 1/2 блокують Wall та Impassable, 3 додатково NoShoot, а 4 включає NoShoot тільки з 0x200 і пропускає перешкоди Window тільки з 0x400. Сторінка 0x100 додатково перевіряє обидві бічні клітини кожного діагонального кроку променя за будь-якого обраного алгоритму. value=0 відключає додаткові CheckLosCell/діагональні перевірки, але BadLocations і CheckWorldStep залишаються. Наприклад 4+0x100+0x200+0x400 вибирає custom з трьома прапорами; setter зберігає вихідний int, не нормалізований алгоритм.
- Промінь ненульової довжини читає тільки поточну завантажену _world.Map/World.Map: через CheckWorldStep потрібні WorldNum == _world.MapIndex та живий Player.Pathfinder. Інший facet не завантажується та не запитується; немає карти/персонажу/pathfinder або крок недоступний - 0. Виняток однакових X/Y пропускає весь цикл клітин: при X/Y 0..65535, WorldNum в 0..255 і abs(Zfrom-Zto)<=20 повертає 1 навіть без завантаженої картки або з іншим номером картки. Це не доказ геометрії чи досяжності. Результат локальний, не розв'язання LOS сервера.
- CheckLosCell обходить завантажені Land/Static/Multi/Item однієї клітини. Impassable Land блокує при abs(rayZ-land.Z)<=20. Прапори Static/Multi/Item діють лише в діапазоні tile.Z-2 .. tile.Z+max(1,Height)+2; дозволений custom Window пропускається до перевірки Wall/Impassable/NoShoot. Промінь X/Y використовує Bresenham, максимум 4096 кроків; Z береться з поверхонь CheckWorldStep, не інтерполюється до Zto, кінцевий допуск висоти - 20.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.CheckLOS(UO.X(), UO.Y(), UO.Z(), UO.X() + 1, UO.Y(), UO.Z(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Однакові точки відбуваються за допустимих X/Y/map.
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var visible = UO.CheckLOS(x,y,z,x,y,z,UO.WorldNum());
UO.Print(Convert.ToString(visible));Параметри та порядок виконання:
- Висота та прохідність сусідньої клітини читаються з локальної карти.
return RunScenario();
object? RunScenario()
{
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var clear = UO.CheckLOS(x, y, z, x + 1, y, z, UO.WorldNum());
UO.Print(Convert.ToString(clear));
return null;
}Параметри та порядок виконання:
- Негативний X відхиляється з результатом 0 без проходу картою.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var clear = UO.CheckLOS(-1, 0, 0, 0, 0, 0, 0);
UO.Print(Convert.ToString(clear));
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
UO.CheckLOS(xfrom, yfrom, zfrom, xto, yto, zto, worldNum) — UO.CheckLOS(Any,Any,Any,Any,Any,Any,Any)
Параметри: xfrom (Any), yfrom (Any), zfrom (Any), xto (Any), yto (Any), zto (Any), worldNum (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.CheckPortableLineOfSight:CheckPortableLineOfSight(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), Arg(5), Arg(6)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "checklos": return new InjectionValue(CheckPortableLineOfSight(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), Arg(5), Arg(6)) ? 1 : 0);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.ClearUserStatics();Видаляє всі власні static записи runtime і локальні статичні об'єкти менеджера.
Параметрів немає.
void - значення, що повертається немає.
- State.UserStatics та менеджерські об'єкти очищаються. Завантажені файли картки та реальні серверні предмети не видаляються.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Команда викликається окремим рядком. Повідомлення перед нею показує початок виклику, а не підтвердження дії сервера.
UO.Print("Calling UO.ClearUserStatics");
UO.ClearUserStatics();Параметри та порядок виконання:
- Видаляє всі власні static записи runtime і локальні статичні об'єкти менеджера.
UO.ClearUserStatics();Параметри та порядок виконання:
- Додати локальний статик на поточній клітці, потім видалити всі користувацькі статики.
return RunScenario();
object? RunScenario()
{
var localStatic = UO.AddUserStatic(0x0CCA, UO.GetX(), UO.GetY(), UO.GetZ(), 0, UO.WorldNum());
UO.ClearUserStatics();
return null;
}Параметри та порядок виконання:
- Очищення порожнього набору є прийнятним і не створює нового параметра.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
UO.ClearUserStatics();
UO.ClearUserStatics();
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: void / Unit.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ClearUserStatics:bridge.ClearUserStatics().
Внутрішній код реалізації, не самостійний скрипт.
case "clearuserstatics": state.UserStatics.Clear(); bridge.ClearUserStatics(); return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.ConvertIntegerToFlags(object? group, object? value);Розбирає числову маску tile flags масив імен перерахування TileFlag.
-
group— int: тільки 1 або 2 включають перетворення; будь-яке інше значення дає порожній масив. -
value— Маска, яку Arg перетворює на знаковий 32-бітний int, потім bridge призводить до ulong. Для високих 64-бітних прапорів ця форма не зберігає повну маску.
Array рядків з іменами ненульових TileFlag, біти яких повністю присутні в масці. Маска 0 дає порожній масив.
- Group 1 і 2 використовують той самий Enum.GetValues, а чи не різні каталоги. Це локальне перетворення маски; дані tiledata не запитуються.
- API-реєстрація використовує object?, але диспетчер Arg(1) передає int. Негативний int sign-extends при приведенні до ulong. GetTileFlags також повертає лише молодші 32 біта як signed int: ця сумісна пара не надає повний 64-бітний контракт tiledata.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.ConvertIntegerToFlags(1, 0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Жоден ненульовий flag немає в масці 0.
var flags = UO.ConvertIntegerToFlags(1,0);
UO.Print(Convert.ToString(ArrayLength(flags)));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Параметри та порядок виконання:
- Масив містить реальні імена TileFlag вибраної маски.
return RunScenario();
object? RunScenario()
{
var flags = UO.ConvertIntegerToFlags(2, 1);
for (int i = (int)(0); i <= ArrayLength(flags) - 1; i += (int)(1))
{
UO.Print(flags[i]);
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Параметри та порядок виконання:
- Група 0 не прийнята цією командою та повертає порожній масив.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var flags = UO.ConvertIntegerToFlags(0, 1);
UO.Print(Convert.ToString(ArrayLength(flags)));
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: group (Any), value (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.ConvertTileFlags:bridge.ConvertTileFlags(Arg(0), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "convertintegertoflags":
return new InjectionValue(bridge.ConvertTileFlags(Arg(0), Arg(1))
.Select(flag => new InjectionValue(flag)).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.Dist(object? xfrom, object? yfrom, object? xto, object? yto);Обчислює відстань у клітинах між двома світовими точками: найбільшу з абсолютних різниць X та Y.
-
xfrom- Координата X вихідної точки. -
yfrom- Координата Y вихідної точки. -
xto- Координата X призначення. -
yto- Координата Y призначення.
int — відстань у клітинах, невід'ємна для допустимих координат. 0 означає однакові XY, 1 — одну клітинку. Це кількість, а чи не ознака успіху. Окреме порівняння distance <= 2 повертає bool true або false; сама відстань залишається int.
- Тільки обчислення координат: без пакетів, очікувань, завантаження карти, перевірки перешкод, Z та карти світу. Команда не шукає прохідного маршруту і не гарантує досягнення мети. Крапки повинні відноситися до однієї системи координат; обхід перешкод може збільшити шлях.
- Потрібні всі чотири параметри. Передавайте світові координати int у документованому діапазоні 0..65535. object? у сигнатурі позначає універсальний адаптер, а не ID предмета. Значень за умовчанням координат всередині скрині, п'ятого Z і перевантаження з одним об'єктом у цих команд немає.
- Формула: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). Якщо поміняти точки місцями, результат буде той самий. Це не евклідова відстань, не сума різниць і не кількість кроків під час обходу перешкоди.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.Dist(100, 100, 103, 104);
UO.Print("Dist: " + Convert.ToString(result));Параметри та порядок виконання:
- Від (?100,100?) до (?103,104?): абсолютні різниці рівні ?3? і ?4?, максимум — ?4?. Main повертає int 4.
- int — відстань у клітинах, невід'ємна для допустимих координат. 0 означає однакові XY, 1 — одну клітинку. Це кількість, а чи не ознака успіху. Окреме порівняння distance <= 2 повертає bool true або false; сама відстань залишається int.
- Формула: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). Якщо поміняти точки місцями, результат буде той самий. Це не евклідова відстань, не сума різниць і не кількість кроків під час обходу перешкоди.
return UO.Dist(100,100,103,104);Параметри та порядок виконання:
- Від (100,100) до (101,99) відстань дорівнює ?1?. Окреме порівняння distance<=2 дає true=1. Main повертає "1:1": перша одиниця - відстань, друга - логічний результат порівняння.
- int — відстань у клітинах, невід'ємна для допустимих координат. 0 означає однакові XY, 1 — одну клітинку. Це кількість, а чи не ознака успіху. Окреме порівняння distance <= 2 повертає bool true або false; сама відстань залишається int.
- Формула: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). Якщо поміняти точки місцями, результат буде той самий. Це не евклідова відстань, не сума різниць і не кількість кроків під час обходу перешкоди.
return RunScenario();
object? RunScenario()
{
var distance = UO.Dist(100, 100, 101, 99);
var close = distance <= 2;
return Convert.ToString(distance) + ":" + Convert.ToString(close);
return null;
}Параметри та порядок виконання:
- UO.Dist повертає 4. RebuildTileDistance обчислює різниці через Abs, порівнює їх і повертає велику, також 4. Main повертає "4:4". Помічник повністю наведений у прикладі і не є ще однією командою двигуна.
- int — відстань у клітинах, невід'ємна для допустимих координат. 0 означає однакові XY, 1 — одну клітинку. Це кількість, а чи не ознака успіху. Окреме порівняння distance <= 2 повертає bool true або false; сама відстань залишається int.
- Формула: Max(Abs(Xto-Xfrom), Abs(Yto-Yfrom)). Якщо поміняти точки місцями, результат буде той самий. Це не евклідова відстань, не сума різниць і не кількість кроків під час обходу перешкоди.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var actual = UO.Dist(100, 100, 103, 104);
var rebuilt = RebuildTileDistance(100, 100, 103, 104);
return Convert.ToString(actual) + ":" + Convert.ToString(rebuilt);
return null;
}
dynamic RebuildTileDistance(dynamic Xfrom, dynamic Yfrom, dynamic Xto, dynamic Yto)
{
var dx = Math.Abs(Xto - Xfrom);
var dy = Math.Abs(Yto - Yfrom);
if (Truth(dx > dy))
{
return dx;
}
return dy;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: xfrom (Any), yfrom (Any), xto (Any), yto (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.GetDistance:GetDistance(Arg(0), Arg(1), Arg(2), Arg(3)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDistance:bridge.GetDistance(Arg(0)).
Внутрішній код реалізації, не самостійний скрипт.
case "dist": return new InjectionValue(arguments.Length >= 4
? GetDistance(Arg(0), Arg(1), Arg(2), Arg(3))
: bridge.GetDistance(Arg(0)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetDistance(object? id);
int UO.GetDistance(object? x, object? y);
int UO.GetDistance(object? id1, object? x2, object? y2);
int UO.GetDistance(object? x1, object? y1, object? x2, object? y2);Вимірює відстань у клітинах по максимуму різниць X/Y. Це геометрична оцінка без пошуку шляху.
-
id— Один аргумент: serial або аліас завантаженого об'єкта, відстань до якого потрібно отримати. -
x— Два аргументи: світова точка призначення. Початком служать GetX(self), GetY(self). -
y— Два аргументи: світова точка призначення. Початком служать GetX(self), GetY(self). -
id1— У формі з трьома аргументами — serial/аліас об'єкта, координати якого є початком. -
x1- У формі з чотирма аргументами - координати початку. Жодний об'єкт для цієї форми не потрібен. -
y1- У формі з чотирма аргументами - координати початку. Жодний об'єкт для цієї форми не потрібен. -
x2— У формах із трьома/чотирма аргументами — координати кінця. Не плутайте їх з serial другого об'єкта. -
y2— У формах із трьома/чотирма аргументами — координати кінця. Не плутайте їх з serial другого об'єкта.
int — max(abs(x2-x1), abs(y2-y1)): горизонталь, вертикаль та діагональ на сусідню клітину мають відстань 1. Висота Z та перешкоди не враховуються. Для невідомого serial форма з одним аргументом повертає 0; для існуючого об'єкта за відсутності персонажа - 65535. Для невідомого id1 форма з трьома аргументами використовує (0,0), тому спочатку перевіряйте Exists (id1).
- Форма з одним об'єктом використовує поточний центр розрахунку дальності World.RangeSize і останню позицію з черги кроків мобу, що рухається. Під час руху результат може відрізнятись від розрахунку через GetX/GetY.
- Координатні форми працюють із переданими числами. Для ігрових координат використовуйте діапазон 0..65535; крайні значення int і переповнення різниці не є підтримуваними координатами.
- Команда не обіцяє досяжності мети. Для руху потрібен MoveXY/NewMoveXY та перевірка його результату; стіни можуть зробити реальний шлях довшим.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.GetDistance("lasttarget");
UO.Print("GetDistance: " + Convert.ToString(result));Параметри та порядок виконання:
- target - serial, не type. Перевірка Exists не дозволяє прийняти нуль невідомого об'єкта за близьку мету.
- distance<=2 перевіряє дальність X/Y. Видимість та прохідність перевіряються окремо.
var target = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(target)))
{
var distance = UO.GetDistance(target);
if (Truth(distance <= 2))
{
UO.Print("Target is within two tiles");
}
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- x1=100, y1=200, x2=103, y2=204. Різниці рівні 3 та 4.
- Результат дорівнює 4, а не 7 і не евклідовим 5.
return RunScenario();
object? RunScenario()
{
var distance = UO.GetDistance(100, 200, 103, 204);
UO.Print(Convert.ToString(distance));
return null;
}Параметри та порядок виконання:
- Два аргументи x/y використовують поточну позицію self. Три аргументи id1/x2/y2 дозволяють явно задати об'єкт початку.
- При незмінній позиції обидві величини дорівнюють 3. Координати повинні залишатися в межах картки.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var x = UO.GetX() + 3;
var y = UO.GetY() + 1;
var fromSelf = UO.GetDistance(x, y);
var fromObject = UO.GetDistance("self", x, y);
UO.Print(Convert.ToString(fromSelf) + " / " + Convert.ToString(fromObject));
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: id (Any/Integer/String)
Результат: int / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDistance:bridge.GetDistance(Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "getdistance": return new InjectionValue(bridge.GetDistance(Arg(0)));Параметри: id (Any/Integer/String)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetDistance. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetDistance:bridge.GetDistance(id).
Внутрішній код реалізації, не самостійний скрипт.
public int GetDistance(int id) => bridge.GetDistance(id);Параметри: id (Any/Integer/String)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetDistance. -
InjectionScript.Runtime.InjectionApiUO.GetDistance:GetDistance(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Внутрішній код реалізації, не самостійний скрипт.
public int GetDistance(string id) => GetDistance(GetObject(id));Параметри: x (Integer), y (Integer)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetDistance. -
InjectionScript.Runtime.InjectionApiUO.GetDistance:GetDistance(bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), x, y). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Внутрішній код реалізації, не самостійний скрипт.
public int GetDistance(int x, int y) => GetDistance(bridge.GetX(bridge.Self), bridge.GetY(bridge.Self), x, y);Параметри: id1 (Any), x2 (Any), y2 (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetDistance. -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(obj1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(obj1). -
InjectionScript.Runtime.InjectionApiUO.GetDistance:GetDistance(x1, y1, NumberConversions.ToInt(x2), NumberConversions.ToInt(y2)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x2).
Внутрішній код реалізації, не самостійний скрипт.
public int GetDistance(InjectionValue id1, InjectionValue x2, InjectionValue y2)
{
var obj1 = GetObject(id1);
int x1 = bridge.GetX(obj1);
int y1 = bridge.GetY(obj1);
return GetDistance(x1, y1, NumberConversions.ToInt(x2), NumberConversions.ToInt(y2));
}Параметри: x1 (Integer), y1 (Integer), x2 (Integer), y2 (Integer)
Результат: int / Integer.
Під час виклику:
Внутрішній код реалізації, не самостійний скрипт.
public int GetDistance(int x1, int y1, int x2, int y2)
{
int dx = Math.Abs(x1 - x2);
int dy = Math.Abs(y1 - y2);
return Math.Max(dx, dy);
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetLandTileAt(object? x, object? y);
dynamic UO.GetLandTileAt(object? x, object? y, object? map);Повертає розширений запис землі обраної клітини.
-
x- X клітини поточної завантаженої карти; світова координата, не позиція всередині гампа. -
y- Y клітини поточної завантаженої карти; світова координата, не позиція всередині гампа. -
map— Номер картки. Якщо цей аргумент відсутній у вибраній формі, використовується поточна карта. Справжній клієнт читає лише плитки з поточної завантаженої карти.
Array з 11 полів одного запису; індекси починаються з 0:
-
[0] kind— string: "земля", "статичний" або "object". -
[1] serial- int: serial динамічного предмета; для land/static дорівнює 0. -
[2] graphic- int: type графіки. -
[3] x,[4] y- int: світові координати клітини. -
[5] z— int: висота основи у світі. -
[6] hue— int: колір, біля землі 0. -
[7] flags- int: молодші 32 біт прапорів tiledata. -
[8] name- string: назва з tiledata. -
[9] layer- int: шар екіпірування з tiledata, біля землі 0; не індекс статики. -
[10] height- int: висота graphic з tiledata, біля землі 0; не координати Z.
Порожній масив [] означає відсутність запису або недоступну картку/клітину. Для GetStaticTileAt негативний/занадто великий index також дає []; переповнення індексу не вибирає чужий запис.
- Дані належать до поточної завантаженої картки. Інша карта чи недоступна клітина дають порожній масив. Прямі запити тайлів можуть додатково повідомляти про розбіжність картки; GetWorldCell та GetWorldTilesArray відразу повертають порожній масив без такого повідомлення.
- Індекси масивів починаються з 0. Перед читанням поля перевіряйте ArrayLength. Z означає висоту у світі; layer – властивість екіпірування з tiledata, а index – порядковий номер запису клітини.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetLandTileAt(UO.GetX(), UO.GetY());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- x/y - становище персонажа; карта опущена та вибирається автоматично. Для GetStaticTileAt index=0 означає перший запис.
- Поля [2], [5], [9] мають різний зміст; усі читаються лише після перевірки довжини 11.
var tile = UO.GetLandTileAt(UO.GetX(), UO.GetY());
if (Truth(ArrayLength(tile) == 11))
{
UO.Print("Type: " + Convert.ToString(tile[2]));
UO.Print("World Z: " + Convert.ToString(tile[5]));
UO.Print("Equipment layer: " + Convert.ToString(tile[9]));
}
else
{
UO.Print("Tile is unavailable");
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Використовуються самі координати; GetStaticTileAt читає index=0.
- tile[8] - рядок назви, tile[10] - розмір за висотою з tiledata, а не Z основи.
return RunScenario();
object? RunScenario()
{
var tile = UO.GetLandTileAt(UO.GetX(), UO.GetY());
if (Truth(ArrayLength(tile) == 11))
{
UO.Print(tile[8]);
UO.Print("Graphic height: " + Convert.ToString(tile[10]));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- WaitTargetTile отримує graphic, x, y, z з полів 2…5.
- Це тільки підготовка наступного target. Приклад не запускає застосування інструменту або заклинання. serial=0 для статики не слід передавати як ID предмета.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var tile = UO.GetLandTileAt(UO.GetX(), UO.GetY());
if (Truth(ArrayLength(tile) == 11))
{
UO.WaitTargetTile(tile[2], tile[3], tile[4], tile[5]);
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: x (Any), y (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetLandTileAt. -
InjectionScript.Runtime.InjectionApiUO.GetLandTileAt:GetLandTileAt(x, y, new InjectionValue(bridge.WorldNumber)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
Внутрішній код реалізації, не самостійний скрипт.
public InjectionValue GetLandTileAt(InjectionValue x, InjectionValue y)
=> GetLandTileAt(x, y, new InjectionValue(bridge.WorldNumber));Параметри: x (Any), y (Any), map (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetLandTileAt. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLandscapeTile:bridge.GetLandscapeTile(cellX, cellY, world). -
InjectionScript.Runtime.InjectionApiUO.BuildWorldTileRecord:BuildWorldTileRecord("land", 0, land[0], cellX, cellY, land[1], 0, 0).
Внутрішній код реалізації, не самостійний скрипт.
public InjectionValue GetLandTileAt(InjectionValue x, InjectionValue y, InjectionValue map)
{
int cellX = NumberConversions.ToInt(x);
int cellY = NumberConversions.ToInt(y);
int world = NumberConversions.ToInt(map);
int[] land = bridge.GetLandscapeTile(cellX, cellY, world) ?? Array.Empty<int>();
return land.Length >= 2
? BuildWorldTileRecord("land", 0, land[0], cellX, cellY, land[1], 0, 0)
: new InjectionValue(Array.Empty<InjectionValue>());
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetLandTileData(object? tile);Читає розширений довідковий запис землі з tiledata.
-
tile— graphic/type запису, не serial і не індекс усередині клітинки. Таблицю землі визначає сама назва команди.
Array з 7 полів для допустимого graphic. Усі поля int, крім name (string):
-
[0] graphic- graphic/type запису. -
[1] flags— молодші 32 біта прапорів. -
[2] name- назва з tiledata (string). -
[3] texId- ID текстури землі. -
[4] wet— 1 якщо встановлено wet, інакше 0. -
[5] impassable- 1 якщо impassable, інакше 0. -
[6] noDiagonal— 1 якщо noDiagonal, інакше 0.
Для неприпустимого graphic довідкових властивостей немає: повертається короткий масив [переданный graphic, 0, ""]. Перевіряйте повну довжину перед читанням властивостей. Це не Pascal record та не список об'єктів.
- Команда читає tiledata і не вимагає предмета з цим graphic у світі. Прапори описують ресурс; результат не замінює повноцінну перевірку маршруту.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetLandTileData(0x0003);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Tile - числовий graphic вибраної таблиці.
- data[2] містить ім'я. Перевірка довжини відокремлює повноцінний запис від короткого запису неприпустимого graphic.
var data = UO.GetLandTileData(0x0003);
if (Truth(ArrayLength(data) == 7))
{
UO.Print(data[2]);
}
else
{
UO.Print("Tiledata entry is unavailable");
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- data[5] — окреме поле impassable: 1 (умова виконана), 0 (умова не виконана).
- Ця перевірка не враховує інші об'єкти у клітині чи здібності персонажа.
return RunScenario();
object? RunScenario()
{
var data = UO.GetLandTileData(0x0003);
if (Truth(ArrayLength(data) == 7))
{
if (Truth(data[5]))
{
UO.Print("Impassable flag is set");
}
else
{
UO.Print("Impassable flag is not set");
}
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- data[0] повторює переданий graphic, data[1] - загальна маска прапорів.
- Маска може одночасно містити кілька бітів; її числове значення не є serial.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var data = UO.GetLandTileData(0x0003);
if (Truth(ArrayLength(data) == 7))
{
UO.Print("Graphic: " + Convert.ToString(data[0]));
UO.Print("Flags: " + Convert.ToString(data[1]));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: tile (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.BuildTileData:BuildTileData(0, Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "getlandtiledata":
return BuildTileData(0, Arg(0));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetLandTilesArray(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileType);Шукає тайли землі по graphic/type у прямокутнику.
-
xmin- Світові координати двох кутів, включно; 0..65535. Переставлені кути нормалізуються. Область не більше 1 000 000 клітин; неприпустимі межі викликають помилку скрипта до читання карти. -
ymin- Світові координати двох кутів, включно; 0..65535. Переставлені кути нормалізуються. Область не більше 1 000 000 клітин; неприпустимі межі викликають помилку скрипта до читання карти. -
xmax- Світові координати двох кутів, включно; 0..65535. Переставлені кути нормалізуються. Область не більше 1 000 000 клітин; неприпустимі межі викликають помилку скрипта до читання карти. -
ymax- Світові координати двох кутів, включно; 0..65535. Переставлені кути нормалізуються. Область не більше 1 000 000 клітин; неприпустимі межі викликають помилку скрипта до читання карти. -
worldNum— Карта/фасет 0..255; використовуйте UO.WorldNum(). Інша карта дає порожній Array. Якщо картка змінюється між порціями, частковий результат відкидається. -
tileType— Один graphic/type тайла, зазвичай 0..65535; це не serial. 0 — точний graphic 0, -1 не означає будь-який type. Несупадний type дає порожній результат.
Array записів [graphic, X, Y, Z]; усі поля int. graphic - type землі, Z - її основа. Немає збігів: пустий Array. Кількість - ArrayLength(result), не сам результат. Індекси починаються з 0. Це не bool, serial або Pascal record; сьомого вихідного параметра немає.
- Читають локальні дані. Пошук не змінює FindItem/FindCount і не виконує рух, target чи мережеву команду.
- Порядок: X за зростанням, усередині X - Y за зростанням. Записи однієї клітини зберігають порядок bridge; це не сортування на відстані або висоті.
- Пошук обробляється порціями до 32 клітин з м'яким бюджетом близько 1 мс. Скасування перевіряється між порціями. Складна клітина чи холодне читання можуть перевищити бюджет. Велику область краще ділити; світ може змінюватись під час читання.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetLandTilesArray(UO.GetX(), UO.GetY(), UO.GetX() + 2, UO.GetY() + 2, UO.WorldNum(), 0x0003);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- x/y – позиція self, map – поточна карта. Область 3×3 включає межі. Ex передаються два type, у звичайній формі один. Змініть зразки під ресурси; це graphic, не ID об'єкта.
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetLandTilesArray(x, y, x + 2, y + 2, map, 0x0003);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Параметри та порядок виконання:
- Область 2×2 передана від більшого кута до меншого. Алгоритм сам нормалізує межі. row - один запис; PrintTile оголошена повністю і лише форматує числа, нічого не переміщуючи. graphic - type, x / y - координати, z - висота, hue - колір. Для землі переданий умовний hue=0: у записі землі немає поля кольору.
return RunScenario();
object? RunScenario()
{
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetLandTilesArray(x + 1, y + 1, x, y, map, 0x0003);
var i = 0;
while (Truth(i < ArrayLength(rows)))
{
var row = rows[i];
PrintTile(row[0], row[1], row[2], row[3], 0);
i = i + 1;
}
return null;
}
void PrintTile(dynamic graphic, dynamic x, dynamic y, dynamic z, dynamic hue)
{
UO.Print("Type=" + Convert.ToString(graphic) + " X=" + Convert.ToString(x) + " Y=" + Convert.ToString(y));
UO.Print("Z=" + Convert.ToString(z) + " hue=" + Convert.ToString(hue));
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Не більше трьох пошуків однієї клітини; між спробами WaitAsync(250). Кожен дзвінок створює новий результат. Нульова довжина означає відсутність збігів зараз, а чи не постійна відсутність об'єкта на сервері.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var attempt = 0;
while (Truth(attempt < 3))
{
var rows = UO.GetLandTilesArray(x, y, x, y, map, 0x0003);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
attempt = attempt + 1;
await Delay(250);
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
UO.GetLandTilesArray(xmin, ymin, xmax, ymax, worldNum, tileType) — UO.GetLandTilesArray(Any,Any,Any,Any,Any,Any)
Параметри: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileType (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.FindPortableTiles:FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, false). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "getlandtilesarray":
return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, false);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetLandTilesArrayEx(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileTypes);Шукає тайли землі по graphic/type у прямокутнику.
-
xmin- Світові координати двох кутів, включно; 0..65535. Переставлені кути нормалізуються. Область не більше 1 000 000 клітин; неприпустимі межі викликають помилку скрипта до читання карти. -
ymin- Світові координати двох кутів, включно; 0..65535. Переставлені кути нормалізуються. Область не більше 1 000 000 клітин; неприпустимі межі викликають помилку скрипта до читання карти. -
xmax- Світові координати двох кутів, включно; 0..65535. Переставлені кути нормалізуються. Область не більше 1 000 000 клітин; неприпустимі межі викликають помилку скрипта до читання карти. -
ymax- Світові координати двох кутів, включно; 0..65535. Переставлені кути нормалізуються. Область не більше 1 000 000 клітин; неприпустимі межі викликають помилку скрипта до читання карти. -
worldNum— Карта/фасет 0..255; використовуйте UO.WorldNum(). Інша карта дає порожній Array. Якщо картка змінюється між порціями, частковий результат відкидається. -
tileTypes— Array числових graphic/type; кожен збігається type включається. Повторення type не дублює запис. Скаляр також приймається як один type. Порожній Array означає все type; масив з одного 0 шукає тільки 0.
Array записів [graphic, X, Y, Z]; усі поля int. graphic - type землі, Z - її основа. Немає збігів: пустий Array. Кількість - ArrayLength(result), не сам результат. Індекси починаються з 0. Це не bool, serial або Pascal record; сьомого вихідного параметра немає.
- Читають локальні дані. Пошук не змінює FindItem/FindCount і не виконує рух, target чи мережеву команду.
- Порядок: X за зростанням, усередині X - Y за зростанням. Записи однієї клітини зберігають порядок bridge; це не сортування на відстані або висоті.
- Пошук обробляється порціями до 32 клітин з м'яким бюджетом близько 1 мс. Скасування перевіряється між порціями. Складна клітина чи холодне читання можуть перевищити бюджет. Велику область краще ділити; світ може змінюватись під час читання.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetLandTilesArrayEx(UO.X(), UO.Y(), UO.X() + 1, UO.Y() + 1, UO.WorldNum(), new[] { 0x0003 });
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- x/y – позиція self, map – поточна карта. Область 3×3 включає межі. Ex передаються два type, у звичайній формі один. Змініть зразки під ресурси; це graphic, не ID об'єкта.
dynamic[] types = new dynamic[checked((int)(1) + 1)];
types[0] = 0x0003;
types[1] = 0x0004;
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetLandTilesArrayEx(x, y, x + 2, y + 2, map, types);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Параметри та порядок виконання:
- Область 2×2 передана від більшого кута до меншого. Алгоритм сам нормалізує межі. row - один запис; PrintTile оголошена повністю і лише форматує числа, нічого не переміщуючи. graphic - type, x / y - координати, z - висота, hue - колір. Для землі переданий умовний hue=0: у записі землі немає поля кольору.
return RunScenario();
object? RunScenario()
{
dynamic[] types = new dynamic[checked((int)(1) + 1)];
types[0] = 0x0003;
types[1] = 0x0004;
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetLandTilesArrayEx(x + 1, y + 1, x, y, map, types);
var i = 0;
while (Truth(i < ArrayLength(rows)))
{
var row = rows[i];
PrintTile(row[0], row[1], row[2], row[3], 0);
i = i + 1;
}
return null;
}
void PrintTile(dynamic graphic, dynamic x, dynamic y, dynamic z, dynamic hue)
{
UO.Print("Type=" + Convert.ToString(graphic) + " X=" + Convert.ToString(x) + " Y=" + Convert.ToString(y));
UO.Print("Z=" + Convert.ToString(z) + " hue=" + Convert.ToString(hue));
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Не більше трьох пошуків однієї клітини; між спробами WaitAsync(250). Кожен дзвінок створює новий результат. Нульова довжина означає відсутність збігів зараз, а чи не постійна відсутність об'єкта на сервері.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
dynamic[] types = new dynamic[checked((int)(1) + 1)];
types[0] = 0x0003;
types[1] = 0x0004;
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var attempt = 0;
while (Truth(attempt < 3))
{
var rows = UO.GetLandTilesArrayEx(x, y, x, y, map, types);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
attempt = attempt + 1;
await Delay(250);
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
UO.GetLandTilesArrayEx(xmin, ymin, xmax, ymax, worldNum, tileTypes) — UO.GetLandTilesArrayEx(Any,Any,Any,Any,Any,Any)
Параметри: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileTypes (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.FindPortableTiles:FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), false). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::ArrayArg:ArrayArg(5).
Внутрішній код реалізації, не самостійний скрипт.
case "getlandtilesarrayex":
return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), false);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetLandscapeTile(object? x, object? y, object? map);Читає землю однієї клітки поточної картки.
-
x- X клітини поточної завантаженої карти; світова координата, не позиція всередині гампа. -
y- Y клітини поточної завантаженої карти; світова координата, не позиція всередині гампа. -
map— Номер картки. Якщо цей аргумент відсутній у вибраній формі, використовується поточна карта. Справжній клієнт читає лише плитки з поточної завантаженої карти.
Array із трьох int: [0] graphic — type землі; [1] z - світова висота землі; [2] flags — молодші 32 біта tiledata-прапорів. Якщо карта/клітина недоступна або немає землі, повертається порожній масив []. Це плоский запис, а не список із трьох тайлів.
- Дані належать до поточної завантаженої картки. Інша карта чи недоступна клітина дають порожній масив. Прямі запити тайлів можуть додатково повідомляти про розбіжність картки; GetWorldCell та GetWorldTilesArray відразу повертають порожній масив без такого повідомлення.
- Індекси масивів починаються з 0. Перед читанням поля перевіряйте ArrayLength. Z означає висоту у світі; layer – властивість екіпірування з tiledata, а index – порядковий номер запису клітини.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- x/y беруться з позиції персонажа; map=WorldNum() вибирає поточну картку.
- Наявність трьох полів перевіряється до індексації; land[0] - graphic, land[1] - Z.
var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
if (Truth(ArrayLength(land) >= 3))
{
UO.Print("Graphic: " + Convert.ToString(land[0]));
UO.Print("Ground Z: " + Convert.ToString(land[1]));
}
else
{
UO.Print("Land is unavailable");
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- x+1 — сусідня клітина, y та map зберігаються.
- deltaZ порівнює землю та персонажа. Це не перевірка прохідності: мости та статики враховуються окремо.
return RunScenario();
object? RunScenario()
{
var land = UO.GetLandscapeTile(UO.GetX() + 1, UO.GetY(), UO.WorldNum());
if (Truth(ArrayLength(land) >= 3))
{
var deltaZ = land[1] - UO.GetZ();
UO.Print("Ground height difference: " + Convert.ToString(deltaZ));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- group=0 вибирає землю; land[0] - graphic.
- GetTileName повертає текст, тоді як GetLandscapeTile повертає масив.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
if (Truth(ArrayLength(land) >= 3))
{
var name = UO.GetTileName(0, land[0]);
UO.Print(name);
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: x (Any), y (Any), map (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetLandscapeTile. -
InjectionScript.Runtime.InjectionApiUO.ToArray:ToArray(bridge.GetLandscapeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map))). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLandscapeTile:bridge.GetLandscapeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
Внутрішній код реалізації, не самостійний скрипт.
public InjectionValue GetLandscapeTile(InjectionValue x, InjectionValue y, InjectionValue map)
=> ToArray(bridge.GetLandscapeTile(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetLayerCount(object? x, object? y, object? worldNum);Вважає записи неземельної геометрії лише у клітині.
-
x— Світова координата X клітинки поточної карти, не встановлена в гампі. -
y— Світова координата Y клітини поточної картки. -
worldNum- Номер карти/фасета; використовуйте UO.WorldNum(). Читається лише поточна завантажена картка.
int — кількість трійок graphic/Z/hue, отриманих GetStaticTiles. У поточному клієнті враховуються Static, Multi та Item: декілька записів однієї висоти вважаються окремо. Порожня клітина/інша карта дають 0. Це не номер шару екіпіровки, не кількість поверхів, не кількість унікальних висот та не bool.
- Команда читає локальну карту та не запускає рух або target. Клітина поза розмірами карти не підміняється клітиною сусіднього стовпця.
- Висота Z, graphic/type, колір hue, прапори та шар екіпіровки мають різний сенс. Нульовий graphic або Z = 0 можуть бути допустимими даними; перевіряйте форму результату.
- Склад відповідає ReadStaticsXY, а не GetLayer або ObjAtLayer. Цей клієнт включає динамічні предмети та частини Multi.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetLayerCount(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- count – число записів клітини; 1 означає один запис, а не логічний успіх.
var count = UO.GetLayerCount(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print("Tile records: " + Convert.ToString(count));Параметри та порядок виконання:
- Відсутність записів не доводить прохідність землі. Наявність запису теж не доводить, що він є стіною.
return RunScenario();
object? RunScenario()
{
var x = UO.GetX() + 1;
var y = UO.GetY();
var count = UO.GetLayerCount(x, y, UO.WorldNum());
if (Truth(count > 0))
{
UO.Print("Non-land geometry exists: " + Convert.ToString(count));
}
else
{
UO.Print("No loaded non-land records");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Перевіряються поточна та сусідня клітини у тому ж світі. Кількість шарів не є їхньою висотою або graphic.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
int x = UO.GetX();
int y = UO.GetY();
int world = UO.WorldNum();
int land = UO.GetLayerCount(x, y, world);
int nearby = UO.GetLayerCount(x + 1, y, world);
UO.Print($"Layers here: {land}; adjacent tile: {nearby}");
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: 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 "getlayercount":
// Stealth's deprecated GetLayerCount(X,Y,WorldNum) is the
// number of static records at a map cell. The portable
// bridge returns each record as Graphic/Z/Hue triples.
return new InjectionValue(bridge.GetStaticTiles(Arg(0), Arg(1), Arg(2)).Length / 3);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetMapCell(object? x, object? y, object? worldNum);Читає graphic, висоту та прапори землі в одній клітці карти.
-
x— Світова координата X клітинки поточної карти, не встановлена в гампі. -
y— Світова координата Y клітини поточної картки. -
worldNum- Номер карти/фасета; використовуйте UO.WorldNum(). Читається лише поточна завантажена картка.
Array з трьох int: [0] graphic/type землі, [1] світова Z основи land, [2] молодші 32 бита прапорів tiledata. Недоступна клітка або інша карта дають порожній Array. Це не serial, bool або Pascal record; не використовуйте поля .Tile/.Z. Для кількості полів викликайте ArrayLength(cell).
- Команда читає локальну карту та не запускає рух або target. Клітина поза розмірами карти не підміняється клітиною сусіднього стовпця.
- Висота Z, graphic/type, колір hue, прапори та шар екіпіровки мають різний сенс. Нульовий graphic або Z = 0 можуть бути допустимими даними; перевіряйте форму результату.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetMapCell(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- X/Y беруться у self, WorldNum - поточна карта. cell зберігає всі поля одного дзвінка.
- Індекси починаються з 0. cell[1] - висота, а не ознака успішного пошуку; порожній масив перевіряється до індексації.
var cell = UO.GetMapCell(UO.GetX(), UO.GetY(), UO.WorldNum());
if (Truth(ArrayLength(cell) == 3))
{
UO.Print("Type: " + Convert.ToString(cell[0]));
UO.Print("Land Z: " + Convert.ToString(cell[1]));
UO.Print("Flags: " + Convert.ToString(cell[2]));
}
else
{
UO.Print("Map cell unavailable");
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Другий виклик читає клітинку на схід, обидва використовують одну карту.
- Різниця висот землі не доводить прохідність: стіни, статики та інші об'єкти перевіряються окремо.
return RunScenario();
object? RunScenario()
{
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var here = UO.GetMapCell(x, y, map);
var east = UO.GetMapCell(x + 1, y, map);
if (Truth(ArrayLength(here) == 3) && Truth(ArrayLength(east) == 3))
{
UO.Print("Land difference: " + Convert.ToString(east[1] - here[1]));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- GetMapCell читає Land.Z; GetSurfaceZ читає Land.AverageZ.
- Обидва значення є заввишки. На похилій землі можуть відрізнятися; це не висота статі будинку.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var cell = UO.GetMapCell(x, y, map);
if (Truth(ArrayLength(cell) == 3))
{
var average = UO.GetSurfaceZ(x, y, map);
UO.Print("Base: " + Convert.ToString(cell[1]) + ", average: " + Convert.ToString(average));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: x (Any), y (Any), worldNum (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetLandscapeTile:bridge.GetLandscapeTile(Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "getmapcell":
return new InjectionValue(bridge.GetLandscapeTile(Arg(0), Arg(1), Arg(2))
.Select(value => new InjectionValue(value)).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetNextStepZ(object? currX, object? currY, object? destX, object? destY, object? worldNum, object? currZ);Обчислює передбачувану висоту наступного кроку у вказаному напрямку.
-
currX— Вихідна світова X, зазвичай UO.GetX(). -
currY— Вихідна світова Y, зазвичай UO.GetY(). -
destX- X призначення. Для перевірки одного кроку передавайте сусідню клітину. -
destY- Y призначення; разом з DestX задає напрямок одного кроку, а не повний маршрут. -
worldNum- Номер карти/фасета; використовуйте UO.WorldNum(). Читається лише поточна завантажена картка. -
currZ- Вихідна висота Z, зазвичай UO.GetZ(); геометричний розрахунок використовує діапазон -128..127.
int — розрахована Z наступного кроку; 0 і від’ємні числа є допустимою висотою. Якщо персонаж відключений або карта інша, повертається 0. Метод повертає компонент Z перевірки навіть за непрохідності; саме число не підтверджує можливість проходу. Для прапорця та висоти разом використовуйте IsWorldCellPassable і читайте [0]/[1].
- Команда читає локальну карту та не запускає рух або target. Клітина поза розмірами карти не підміняється клітиною сусіднього стовпця.
- Висота Z, graphic/type, колір hue, прапори та шар екіпіровки мають різний сенс. Нульовий graphic або Z = 0 можуть бути допустимими даними; перевіряйте форму результату.
- Розрахунок не робить крок і не відчиняє двері. Він перевіряє локальну геометрію; сервер може відхилити реальний рух. Якщо Bridge не повернув Z, використовується CurrZ.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.GetNextStepZ(UO.GetX(), UO.GetY(), UO.GetX() + 1, UO.GetY(), UO.WorldNum(), UO.GetZ());
UO.Print("GetNextStepZ: " + Convert.ToString(result));Параметри та порядок виконання:
- Шість параметрів: вихідні X/Y, сусідні X/Y, карта та вихідна Z. nextZ – висота, не true/false.
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetZ();
var nextZ = UO.GetNextStepZ(x, y, x + 1, y, UO.WorldNum(), z);
UO.Print("Candidate Z: " + Convert.ToString(nextZ));Параметри та порядок виконання:
- Виклик здійснюється лише за відомого підключення. Між перевіркою та читанням з'єднання може зникнути; Z=0 все одно не є кодом успіху.
return RunScenario();
object? RunScenario()
{
if (Truth(Truth(UO.Connected()) == true))
{
var x = UO.GetX();
var y = UO.GetY();
var z = UO.GetNextStepZ(x, y, x, y + 1, UO.WorldNum(), UO.GetZ());
UO.Print("South candidate Z: " + Convert.ToString(z));
}
else
{
UO.Print("Character disconnected");
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Координати вихідної та цільової клітин передаються окремо. Результат - передбачувана висота, навіть за непрохідності; прапор проходу окремо дає IsWorldCellPassable.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
int x = UO.GetX();
int y = UO.GetY();
int z = UO.GetZ();
int nextZ = UO.GetNextStepZ(x, y, x + 1, y, UO.WorldNum(), z);
UO.Print($"Current height: {z}; next-step result: {nextZ}");
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
UO.GetNextStepZ(currX, currY, destX, destY, worldNum, currZ) — UO.GetNextStepZ(Any,Any,Any,Any,Any,Any)
Параметри: currX (Any), currY (Any), destX (Any), destY (Any), worldNum (Any), currZ (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsOnline:bridge.IsOnline(). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(4). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.CheckWorldStep:bridge.CheckWorldStep(Arg(0), Arg(1), Arg(5), Arg(2), Arg(3), Arg(4)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
Внутрішній код реалізації, не самостійний скрипт.
case "getnextstepz":
{
if (bridge.IsOnline() == 0 || Arg(4) != bridge.WorldNumber)
return new InjectionValue(0);
int[] step = bridge.CheckWorldStep(Arg(0), Arg(1), Arg(5), Arg(2), Arg(3), Arg(4));
return new InjectionValue(step.Length > 1 ? step[1] : Arg(5));
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetStaticArt(object? objType, object? hue);Отримує зображення одного Graphic із встановлених файлів графіки Ultima Online та повертає його у пам'яті у форматі BMP. Стане в нагоді для перевірки своїх ігрових ресурсів, розмірів іконки, читання кольору пікселя та порівняння пофарбованих варіантів предмета. Команда сама не відкриває вікно, не зберігає файл та не шукає предметів у світі.
-
objType— Обов'язковий Graphic/type з розділу static art: ціле 0..65535, рядок з таким числом або збережене ім'я AddType. Наприклад 0x0EED - арт стопки золота. Це не serial предмет, не map/tile координата та не номер анімації тіла. Щоб отримати арт завантаженого предмета, передайте UO.GetType(item), де item – його serial. При числовому type поза діапазоном виходить порожній масив; невідоме рядкове ім'я викликає помилку перетворення. -
hue- Обов'язкове ціле значення забарвлення: 0 - вихідні кольори арту; позитивне значення - hue з файлів клієнта. Числові рядки допустимі, зокрема результат UO.GetColor(item). Значення обмежується діапазоном 0..65535: негативне перетворюється на 0, занадто велике — на 65535. Тут -1 НЕ означає будь-який колір. Для арту з прапором PartialHue використовується часткове фарбування; для інших – повне. Результат конкретного hue залежить від завантаженої таблиці кольорів.
Array - одномірний масив int, кожен елемент 0..255 представляє один байт повного BMP-файлу, починаючи з заголовка. Індексація з 0. Це не bool, не ID, не шлях, не об'єкт Bitmap і не масив кольорів RGB. Порожній масив означає, що числовий type неприпустимий, арт відсутня чи необхідні ігрові файли не завантажені. Перед читанням заголовка перевіряйте ArrayLength; порожній масив не дорівнює числу 0.
- Потрібно рівно два аргументи. Читання виконується з локальних ресурсів клієнта без запиту до сервера. Існування предмета у світі не потрібне. Для mobile число з GetType означає body; тут те число адресує інший розділ ресурсів і дає зображення анімації персонажа.
- Формат результату: несжатий 24-bit BMP. Байти [0] = 66 і [1] = 77 - - BM; [2..5] - розмір всього файлу; [10..13] - початок пікселів, зараз 54; [14..17] - розмір DIB-заголовка, зараз 40; [18..21] - ширина; [22..25] - позитивна висота; [26..27] - 1 площину; [28..29] - 24 біта. Багатобайтові цифри записані little-endian.
- Кожен піксель займає три байти у порядку B, G, R. Рядки йдуть знизу вгору і доповнюються нульовими байтами до кратності 4. Довжина рядка = Int((width * 3 + 3) / 4) * 4. Для координат x,y від лівого верхнього кута зсув = 54 + (height - 1 - y) * stride + x * 3. Перед доступом перевіряйте межі та розмір масиву.
- Прозорість вихідного арту не зберігається: BMP тут містить alpha. Прозоре тло стає чорним, і відрізнити його від вихідного чорного пікселя за результатом не можна. Скріншот екрану, масштабування ігрового вікна, світло, дальність видимості та координати предмета не беруть участь.
- На кожен дзвінок формується масив зображення. Якщо арт потрібний багато разів, збережіть результат змінну і обробляйте його повторно. Не викликайте завантаження/фарбування кожного пікселя всередині циклу. Однакові параметри та постійні файли дають однаковий результат; різні hue не повинні змінювати кожен піксель, особливо при PartialHue.
- Для реального .bmp необхідний двійковий висновок точних байтів без текстового кодування. Звичайний File.WriteLine або JsonSave не створює BMP. Приклади нижче обробляють масив у пам'яті і не обіцяють наявність неіснуючого File. WriteBytes.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetStaticArt(0x0EED, 0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- ObjType=0x0EED вибирає ресурс, Hue=0 залишає вихідні кольори. Масив перевіряється до читання зсувів 18 та 22. 64 — власна межа прикладу, не обмеження команди.
- ArtSizeField — функція користувача C#, не команда UO. Складає чотири байти з вагами 1, 256, 65536, 16777216. Скрипт допомагає вибрати розмір свого осередку; автоматично гамп не створює.
var bmp = UO.GetStaticArt(0x0EED, 0);
if (Truth(ArrayLength(bmp) < 54))
{
UO.Print("Gold art is unavailable");
return null;
}
var width = ArtSizeField(bmp, 18);
var height = ArtSizeField(bmp, 22);
if (Truth(width > 64) || Truth(height > 64))
{
UO.Print("Use a larger cell for this icon");
return null;
}
UO.Print("Icon fits: " + Convert.ToString(width) + " x " + Convert.ToString(height));
dynamic ArtSizeField(dynamic bytes, dynamic offset)
{
return bytes[offset] + bytes[offset+1]*256 + bytes[offset+2]*65536 + bytes[offset+3]*16777216;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- GetStaticArt повертає BMP; ArtPixelRGB – окрема функція прикладу для цього формату. x=0,y=0 означає лівий верхній піксель зображення, а не координати світу. Заміна height-1-y є обов'язковою через порядок рядків знизу вгору.
- Функція повертає RGB int 0..16777215, а -1 використовує лише як свою ознаку відсутності пікселя. Чорний 0 — дійсний колір, не false і не помилка. Тому перевірка if rgb < 0 відокремлена від if rgb = 0.
return RunScenario();
object? RunScenario()
{
var bmp = UO.GetStaticArt(0x0EED, 0);
var rgb = ArtPixelRGB(bmp, 0, 0);
if (Truth(rgb < 0))
{
UO.Print("No pixel at this position");
return null;
}
if (Truth(rgb == 0))
{
UO.Print("Black pixel: may also be the original transparent background");
}
return null;
}
dynamic ArtPixelRGB(dynamic bmp, dynamic x, dynamic y)
{
if (Truth(ArrayLength(bmp) < 54))
{
return -1;
}
var width = bmp[18] + bmp[19] * 256 + bmp[20] * 65536 + bmp[21] * 16777216;
var height = bmp[22] + bmp[23] * 256 + bmp[24] * 65536 + bmp[25] * 16777216;
if (Truth(x < 0) || Truth(y < 0) || Truth(x >= width) || Truth(y >= height))
{
return -1;
}
var stride = Math.Floor((width * 3 + 3) / 4) * 4;
var offset = 54 + (height - 1 - y) * stride + x * 3;
if (Truth(offset + 2 >= ArrayLength(bmp)))
{
return -1;
}
return bmp[offset + 2] * 65536 + bmp[offset + 1] * 256 + bmp[offset];
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- 0x1F03 - Graphic роби; 0 та 0x0044 — вихідний та вибраний hue. Одинаковий Graphic дає однакові розміри. За порожнього результату порівняння не починається.
- changed вважає байти кольорових каналів, а не предмети і не число пікселів. Один піксель може змінити до трьох байтів. PartialHue, таблиця кольорів та вихідні кольори можуть залишити частину або все зображення колишнім; це не є доказом помилки команди.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var original = UO.GetStaticArt(0x1F03, 0);
var colored = UO.GetStaticArt(0x1F03, 0x0044);
var size = ArrayLength(original);
if (Truth(size < 54) || Truth(size != ArrayLength(colored)))
{
UO.Print("Cannot compare these art resources");
return null;
}
var changed = 0;
for (int offset = (int)(54); offset <= size - 1; offset += (int)(1))
{
if (Truth(original[offset] != colored[offset]))
{
changed = changed + 1;
}
}
if (Truth(changed == 0))
{
UO.Print("This hue did not change the exported bytes");
}
else
{
UO.Print("Changed color bytes: " + Convert.ToString(changed));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: objType (Any), hue (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStaticArt:bridge.GetStaticArt(ResolveType(arguments[0]), Arg(1)). -
InjectionScript.Runtime.InjectionApiUO.ResolveType:ResolveType(arguments[0]). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(1).
Внутрішній код реалізації, не самостійний скрипт.
case "getstaticart":
return new InjectionValue(bridge.GetStaticArt(ResolveType(arguments[0]), Arg(1)).Select(value => new InjectionValue(value)).ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetStaticTileAt(object? x, object? y, object? index);
dynamic UO.GetStaticTileAt(object? x, object? y, object? map, object? index);Повертає розширений запис одного запису над землею вибраної клітини.
-
x- X клітини поточної завантаженої карти; світова координата, не позиція всередині гампа. -
y- Y клітини поточної завантаженої карти; світова координата, не позиція всередині гампа. -
map— Номер картки. Якщо цей аргумент відсутній у вибраній формі, використовується поточна карта. Справжній клієнт читає лише плитки з поточної завантаженої карти. -
index— Порядковий номер запису в результатах GetStaticTiles, починаючи з 0. Це не graphic, не Z і не шар екіпіровки. У формі з 3 аргументів index стоїть третім; у формі з 4 аргументів map третій, index четвертий.
Array з 11 полів одного запису; індекси починаються з 0:
-
[0] kind— string: "земля", "статичний" або "object". -
[1] serial- int: serial динамічного предмета; для land/static дорівнює 0. -
[2] graphic- int: type графіки. -
[3] x,[4] y- int: світові координати клітини. -
[5] z— int: висота основи у світі. -
[6] hue— int: колір, біля землі 0. -
[7] flags- int: молодші 32 біт прапорів tiledata. -
[8] name- string: назва з tiledata. -
[9] layer- int: шар екіпірування з tiledata, біля землі 0; не індекс статики. -
[10] height- int: висота graphic з tiledata, біля землі 0; не координати Z.
Порожній масив [] означає відсутність запису або недоступну картку/клітину. Для GetStaticTileAt негативний/занадто великий index також дає []; переповнення індексу не вибирає чужий запис.
- Дані належать до поточної завантаженої картки. Інша карта чи недоступна клітина дають порожній масив. Прямі запити тайлів можуть додатково повідомляти про розбіжність картки; GetWorldCell та GetWorldTilesArray відразу повертають порожній масив без такого повідомлення.
- Індекси масивів починаються з 0. Перед читанням поля перевіряйте ArrayLength. Z означає висоту у світі; layer – властивість екіпірування з tiledata, а index – порядковий номер запису клітини.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- x/y - становище персонажа; карта опущена та вибирається автоматично. Для GetStaticTileAt index=0 означає перший запис.
- Поля [2], [5], [9] мають різний зміст; усі читаються лише після перевірки довжини 11.
var tile = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
if (Truth(ArrayLength(tile) == 11))
{
UO.Print("Type: " + Convert.ToString(tile[2]));
UO.Print("World Z: " + Convert.ToString(tile[5]));
UO.Print("Equipment layer: " + Convert.ToString(tile[9]));
}
else
{
UO.Print("Tile is unavailable");
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Використовуються самі координати; GetStaticTileAt читає index=0.
- tile[8] - рядок назви, tile[10] - розмір за висотою з tiledata, а не Z основи.
return RunScenario();
object? RunScenario()
{
var tile = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
if (Truth(ArrayLength(tile) == 11))
{
UO.Print(tile[8]);
UO.Print("Graphic height: " + Convert.ToString(tile[10]));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- WaitTargetTile отримує graphic, x, y, z з полів 2…5.
- Це тільки підготовка наступного target. Приклад не запускає застосування інструменту або заклинання. serial=0 для статики не слід передавати як ID предмета.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var tile = UO.GetStaticTileAt(UO.GetX(), UO.GetY(), 0);
if (Truth(ArrayLength(tile) == 11))
{
UO.WaitTargetTile(tile[2], tile[3], tile[4], tile[5]);
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: x (Any), y (Any), index (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetStaticTileAt. -
InjectionScript.Runtime.InjectionApiUO.GetStaticTileAt:GetStaticTileAt(x, y, new InjectionValue(bridge.WorldNumber), index). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
Внутрішній код реалізації, не самостійний скрипт.
public InjectionValue GetStaticTileAt(InjectionValue x, InjectionValue y, InjectionValue index)
=> GetStaticTileAt(x, y, new InjectionValue(bridge.WorldNumber), index);Параметри: x (Any), y (Any), map (Any), index (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetStaticTileAt. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStaticTiles:bridge.GetStaticTiles(cellX, cellY, NumberConversions.ToInt(map)). -
InjectionScript.Runtime.InjectionApiUO.BuildWorldTileRecord:BuildWorldTileRecord("static", 0, statics[offset], cellX, cellY, statics[offset + 1], statics[offset + 2], 1).
Внутрішній код реалізації, не самостійний скрипт.
public InjectionValue GetStaticTileAt(InjectionValue x, InjectionValue y, InjectionValue map, InjectionValue index)
{
int cellX = NumberConversions.ToInt(x);
int cellY = NumberConversions.ToInt(y);
int[] statics = bridge.GetStaticTiles(cellX, cellY, NumberConversions.ToInt(map)) ?? Array.Empty<int>();
int tileIndex = NumberConversions.ToInt(index);
if (tileIndex < 0 || tileIndex >= statics.Length / 3)
return new InjectionValue(Array.Empty<InjectionValue>());
int offset = tileIndex * 3;
return offset + 2 < statics.Length
? BuildWorldTileRecord("static", 0, statics[offset], cellX, cellY, statics[offset + 1], statics[offset + 2], 1)
: new InjectionValue(Array.Empty<InjectionValue>());
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetStaticTileData(object? tile);Читає розширений довідковий запис static graphic з tiledata.
-
tile— graphic/type запису, не serial і не індекс усередині клітинки. Таблицю статики визначає сама назва команди.
Array з 17 полів для допустимого graphic. Усі поля int, крім name (string):
-
[0] graphic- graphic/type запису. -
[1] flags— молодші 32 біта прапорів. -
[2] name- назва з tiledata (string). -
[3] weight- вага з tiledata. -
[4] layer— номер шару екіпірування. -
[5] count— поле Count з tiledata, не кількість предметів у світі. -
[6] animId- ID анімації. -
[7] hue- hue з tiledata. -
[8] lightIndex- індекс джерела світла. -
[9] height- висота graphic, не світова Z. -
[10] wet— 1 якщо встановлено wet, інакше 0. -
[11] impassable- 1 якщо impassable, інакше 0. -
[12] surface— 1 якщо surface, інакше 0. -
[13] foliage— 1 якщо foliage, інакше 0. -
[14] door— 1 якщо door, інакше 0. -
[15] wall— 1 якщо wall, інакше 0. -
[16] container— 1 якщо container, інакше 0.
Для неприпустимого graphic довідкових властивостей немає: повертається короткий масив [переданный graphic, 0, ""]. Перевіряйте повну довжину перед читанням властивостей. Це не Pascal record та не список об'єктів.
- Команда читає tiledata і не вимагає предмета з цим graphic у світі. Прапори описують ресурс; результат не замінює повноцінну перевірку маршруту.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetStaticTileData(0x0CCA);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Tile - числовий graphic вибраної таблиці.
- data[2] містить ім'я. Перевірка довжини відокремлює повноцінний запис від короткого запису неприпустимого graphic.
var data = UO.GetStaticTileData(0x0CCA);
if (Truth(ArrayLength(data) == 17))
{
UO.Print(data[2]);
}
else
{
UO.Print("Tiledata entry is unavailable");
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- data[11] — окреме поле impassable: 1 (умова виконана), 0 (умова не виконана).
- Ця перевірка не враховує інші об'єкти у клітині чи здібності персонажа.
return RunScenario();
object? RunScenario()
{
var data = UO.GetStaticTileData(0x0CCA);
if (Truth(ArrayLength(data) == 17))
{
if (Truth(data[11]))
{
UO.Print("Impassable flag is set");
}
else
{
UO.Print("Impassable flag is not set");
}
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- data[0] повторює переданий graphic, data[1] - загальна маска прапорів.
- Маска може одночасно містити кілька бітів; її числове значення не є serial.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var data = UO.GetStaticTileData(0x0CCA);
if (Truth(ArrayLength(data) == 17))
{
UO.Print("Graphic: " + Convert.ToString(data[0]));
UO.Print("Flags: " + Convert.ToString(data[1]));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: tile (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.BuildTileData:BuildTileData(1, Arg(0)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "getstatictiledata":
return BuildTileData(1, Arg(0));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetStaticTiles(object? x, object? y, object? map);Читає записи над землею в одній клітці карти.
-
x- X клітини поточної завантаженої карти; світова координата, не позиція всередині гампа. -
y- Y клітини поточної завантаженої карти; світова координата, не позиція всередині гампа. -
map— Номер картки. Якщо цей аргумент відсутній у вибраній формі, використовується поточна карта. Справжній клієнт читає лише плитки з поточної завантаженої карти.
Array - плоска послідовність int-трійок [graphic0, z0, hue0, graphic1, z1, hue1, …]. Число записів дорівнює довжині масиву / 3. Для запису i graphic знаходиться в [i*3], Z в [i*3+1], hue в [i*3+2]. Порожній масив означає відсутність записів або недоступну картку/клітину. Serial та номер шару тут не повертаються.
- Дані належать до поточної завантаженої картки. Інша карта чи недоступна клітина дають порожній масив. Прямі запити тайлів можуть додатково повідомляти про розбіжність картки; GetWorldCell та GetWorldTilesArray відразу повертають порожній масив без такого повідомлення.
- Індекси масивів починаються з 0. Перед читанням поля перевіряйте ArrayLength. Z означає висоту у світі; layer – властивість екіпірування з tiledata, а index – порядковий номер запису клітини.
- У поточному bridge перераховуються Static, Multi та світові Item у ланцюжку клітини. Назва команди не обмежує результат лише записами statics.mul. Порядок ланцюжка не гарантує сортування Z.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetStaticTiles(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- x/y/map вибирають поточну клітину.
- Довжина масиву – число полів. Розподіл на 3 дає кількість записів.
var tiles = UO.GetStaticTiles(UO.GetX(), UO.GetY(), UO.WorldNum());
var count = ArrayLength(tiles) / 3;
UO.Print("Tile records: " + Convert.ToString(count));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Параметри та порядок виконання:
- offset — індекс першого поля чергової трійки, що збільшується на 3.
- Перевірка offset+2 захищає читання всього запису.
return RunScenario();
object? RunScenario()
{
var tiles = UO.GetStaticTiles(UO.GetX(), UO.GetY(), UO.WorldNum());
var offset = 0;
while (Truth(offset + 2 < ArrayLength(tiles)))
{
UO.Print("Type: " + Convert.ToString(tiles[offset]) + ", Z: " + Convert.ToString(tiles[offset + 1]));
offset = offset + 3;
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- x+1 вибирає сусідню клітину.
- tiles[2] — колір першого запису; це не третій тайл.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var tiles = UO.GetStaticTiles(UO.GetX() + 1, UO.GetY(), UO.WorldNum());
if (Truth(ArrayLength(tiles) >= 3))
{
var hue = tiles[2];
UO.Print("First tile hue: " + Convert.ToString(hue));
}
else
{
UO.Print("No tile records");
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: x (Any), y (Any), map (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetStaticTiles. -
InjectionScript.Runtime.InjectionApiUO.ToArray:ToArray(bridge.GetStaticTiles(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map))). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetStaticTiles:bridge.GetStaticTiles(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
Внутрішній код реалізації, не самостійний скрипт.
public InjectionValue GetStaticTiles(InjectionValue x, InjectionValue y, InjectionValue map)
=> ToArray(bridge.GetStaticTiles(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetStaticTilesArray(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileType);Шукає запис Static/Multi/Item по graphic/type у прямокутнику.
-
xmin- Світові координати двох кутів, включно; 0..65535. Переставлені кути нормалізуються. Область не більше 1 000 000 клітин; неприпустимі межі викликають помилку скрипта до читання карти. -
ymin- Світові координати двох кутів, включно; 0..65535. Переставлені кути нормалізуються. Область не більше 1 000 000 клітин; неприпустимі межі викликають помилку скрипта до читання карти. -
xmax- Світові координати двох кутів, включно; 0..65535. Переставлені кути нормалізуються. Область не більше 1 000 000 клітин; неприпустимі межі викликають помилку скрипта до читання карти. -
ymax- Світові координати двох кутів, включно; 0..65535. Переставлені кути нормалізуються. Область не більше 1 000 000 клітин; неприпустимі межі викликають помилку скрипта до читання карти. -
worldNum— Карта/фасет 0..255; використовуйте UO.WorldNum(). Інша карта дає порожній Array. Якщо картка змінюється між порціями, частковий результат відкидається. -
tileType— Один graphic/type тайла, зазвичай 0..65535; це не serial. 0 — точний graphic 0, -1 не означає будь-який type. Несупадний type дає порожній результат.
Array записів [graphic, X, Y, Z, hue]; усі поля int. graphic - type, Z - основа, hue - колір. Декілька записів клітини залишаються окремими. Немає збігів: пустий Array. Кількість - ArrayLength(result), не сам результат. Індекси починаються з 0. Це не bool, serial або Pascal record; сьомого вихідного параметра немає.
- Читають локальні дані. Пошук не змінює FindItem/FindCount і не виконує рух, target чи мережеву команду.
- Порядок: X за зростанням, усередині X - Y за зростанням. Записи однієї клітини зберігають порядок bridge; це не сортування на відстані або висоті.
- Пошук обробляється порціями до 32 клітин з м'яким бюджетом близько 1 мс. Скасування перевіряється між порціями. Складна клітина чи холодне читання можуть перевищити бюджет. Велику область краще ділити; світ може змінюватись під час читання.
- Static-гілка поточного клієнта включає Static, Multi та Item з клітини, включаючи завантажені предмети на землі; Land та Mobile не включаються. Вона ширша за класичну вибірку тільки статик з файлів.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetStaticTilesArray(UO.GetX(), UO.GetY(), UO.GetX() + 2, UO.GetY() + 2, UO.WorldNum(), 0x0CCA);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- x/y – позиція self, map – поточна карта. Область 3×3 включає межі. Ex передаються два type, у звичайній формі один. Змініть зразки під ресурси; це graphic, не ID об'єкта.
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetStaticTilesArray(x, y, x + 2, y + 2, map, 0x0CCA);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Параметри та порядок виконання:
- Область 2×2 передана від більшого кута до меншого. Алгоритм сам нормалізує межі. row - один запис; PrintTile оголошена повністю і лише форматує числа, нічого не переміщуючи. graphic - type, x / y - координати, z - висота, hue - колір. Для землі переданий умовний hue=0: у записі землі немає поля кольору.
return RunScenario();
object? RunScenario()
{
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetStaticTilesArray(x + 1, y + 1, x, y, map, 0x0CCA);
var i = 0;
while (Truth(i < ArrayLength(rows)))
{
var row = rows[i];
PrintTile(row[0], row[1], row[2], row[3], row[4]);
i = i + 1;
}
return null;
}
void PrintTile(dynamic graphic, dynamic x, dynamic y, dynamic z, dynamic hue)
{
UO.Print("Type=" + Convert.ToString(graphic) + " X=" + Convert.ToString(x) + " Y=" + Convert.ToString(y));
UO.Print("Z=" + Convert.ToString(z) + " hue=" + Convert.ToString(hue));
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Не більше трьох пошуків однієї клітини; між спробами WaitAsync(250). Кожен дзвінок створює новий результат. Нульова довжина означає відсутність збігів зараз, а чи не постійна відсутність об'єкта на сервері.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var attempt = 0;
while (Truth(attempt < 3))
{
var rows = UO.GetStaticTilesArray(x, y, x, y, map, 0x0CCA);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
attempt = attempt + 1;
await Delay(250);
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
UO.GetStaticTilesArray(xmin, ymin, xmax, ymax, worldNum, tileType) — UO.GetStaticTilesArray(Any,Any,Any,Any,Any,Any)
Параметри: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileType (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.FindPortableTiles:FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, true). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "getstatictilesarray":
return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), new[] { Arg(5) }, true);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetStaticTilesArrayEx(object? xmin, object? ymin, object? xmax, object? ymax, object? worldNum, object? tileTypes);Шукає запис Static/Multi/Item по graphic/type у прямокутнику.
-
xmin- Світові координати двох кутів, включно; 0..65535. Переставлені кути нормалізуються. Область не більше 1 000 000 клітин; неприпустимі межі викликають помилку скрипта до читання карти. -
ymin- Світові координати двох кутів, включно; 0..65535. Переставлені кути нормалізуються. Область не більше 1 000 000 клітин; неприпустимі межі викликають помилку скрипта до читання карти. -
xmax- Світові координати двох кутів, включно; 0..65535. Переставлені кути нормалізуються. Область не більше 1 000 000 клітин; неприпустимі межі викликають помилку скрипта до читання карти. -
ymax- Світові координати двох кутів, включно; 0..65535. Переставлені кути нормалізуються. Область не більше 1 000 000 клітин; неприпустимі межі викликають помилку скрипта до читання карти. -
worldNum— Карта/фасет 0..255; використовуйте UO.WorldNum(). Інша карта дає порожній Array. Якщо картка змінюється між порціями, частковий результат відкидається. -
tileTypes— Array числових graphic/type; кожен збігається type включається. Повторення type не дублює запис. Скаляр також приймається як один type. Порожній Array означає все type; масив з одного 0 шукає тільки 0.
Array записів [graphic, X, Y, Z, hue]; усі поля int. graphic - type, Z - основа, hue - колір. Декілька записів клітини залишаються окремими. Немає збігів: пустий Array. Кількість - ArrayLength(result), не сам результат. Індекси починаються з 0. Це не bool, serial або Pascal record; сьомого вихідного параметра немає.
- Читають локальні дані. Пошук не змінює FindItem/FindCount і не виконує рух, target чи мережеву команду.
- Порядок: X за зростанням, усередині X - Y за зростанням. Записи однієї клітини зберігають порядок bridge; це не сортування на відстані або висоті.
- Пошук обробляється порціями до 32 клітин з м'яким бюджетом близько 1 мс. Скасування перевіряється між порціями. Складна клітина чи холодне читання можуть перевищити бюджет. Велику область краще ділити; світ може змінюватись під час читання.
- Static-гілка поточного клієнта включає Static, Multi та Item з клітини, включаючи завантажені предмети на землі; Land та Mobile не включаються. Вона ширша за класичну вибірку тільки статик з файлів.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetStaticTilesArrayEx(UO.X(), UO.Y(), UO.X() + 1, UO.Y() + 1, UO.WorldNum(), new[] { 0x0CCA });
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- x/y – позиція self, map – поточна карта. Область 3×3 включає межі. Ex передаються два type, у звичайній формі один. Змініть зразки під ресурси; це graphic, не ID об'єкта.
dynamic[] types = new dynamic[checked((int)(1) + 1)];
types[0] = 0x0CCA;
types[1] = 0x0CCB;
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetStaticTilesArrayEx(x, y, x + 2, y + 2, map, types);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Параметри та порядок виконання:
- Область 2×2 передана від більшого кута до меншого. Алгоритм сам нормалізує межі. row - один запис; PrintTile оголошена повністю і лише форматує числа, нічого не переміщуючи. graphic - type, x / y - координати, z - висота, hue - колір. Для землі переданий умовний hue=0: у записі землі немає поля кольору.
return RunScenario();
object? RunScenario()
{
dynamic[] types = new dynamic[checked((int)(1) + 1)];
types[0] = 0x0CCA;
types[1] = 0x0CCB;
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var rows = UO.GetStaticTilesArrayEx(x + 1, y + 1, x, y, map, types);
var i = 0;
while (Truth(i < ArrayLength(rows)))
{
var row = rows[i];
PrintTile(row[0], row[1], row[2], row[3], row[4]);
i = i + 1;
}
return null;
}
void PrintTile(dynamic graphic, dynamic x, dynamic y, dynamic z, dynamic hue)
{
UO.Print("Type=" + Convert.ToString(graphic) + " X=" + Convert.ToString(x) + " Y=" + Convert.ToString(y));
UO.Print("Z=" + Convert.ToString(z) + " hue=" + Convert.ToString(hue));
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Не більше трьох пошуків однієї клітини; між спробами WaitAsync(250). Кожен дзвінок створює новий результат. Нульова довжина означає відсутність збігів зараз, а чи не постійна відсутність об'єкта на сервері.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
dynamic[] types = new dynamic[checked((int)(1) + 1)];
types[0] = 0x0CCA;
types[1] = 0x0CCB;
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var attempt = 0;
while (Truth(attempt < 3))
{
var rows = UO.GetStaticTilesArrayEx(x, y, x, y, map, types);
UO.Print("Records: " + Convert.ToString(ArrayLength(rows)));
attempt = attempt + 1;
await Delay(250);
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
UO.GetStaticTilesArrayEx(xmin, ymin, xmax, ymax, worldNum, tileTypes) — UO.GetStaticTilesArrayEx(Any,Any,Any,Any,Any,Any)
Параметри: xmin (Any), ymin (Any), xmax (Any), ymax (Any), worldNum (Any), tileTypes (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.FindPortableTiles:FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), true). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::ArrayArg:ArrayArg(5).
Внутрішній код реалізації, не самостійний скрипт.
case "getstatictilesarrayex":
return FindPortableTiles(Arg(0), Arg(1), Arg(2), Arg(3), Arg(4), ArrayArg(5), true);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetSurfaceZ(object? x, object? y, object? worldNum);Читає середню висоту поверхні землі у клітці.
-
x— Світова координата X клітинки поточної карти, не встановлена в гампі. -
y— Світова координата Y клітини поточної картки. -
worldNum- Номер карти/фасета; використовуйте UO.WorldNum(). Читається лише поточна завантажена картка.
int - Land.AverageZ, у тому числі негативна висота і 0. За відсутності карти/землі або розбіжності картки повертається 0, тому це значення не відрізняє відсутність даних від справжньої висоти 0. Це не bool, поверх або висота найближчої статики.
- Команда читає локальну карту та не запускає рух або target. Клітина поза розмірами карти не підміняється клітиною сусіднього стовпця.
- Висота Z, graphic/type, колір hue, прапори та шар екіпіровки мають різний сенс. Нульовий graphic або Z = 0 можуть бути допустимими даними; перевіряйте форму результату.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetSurfaceZ(UO.GetX(), UO.GetY(), UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Усі три параметри відносяться до поточної клітини картки. z - Чисельна висота, не результат руху.
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var z = UO.GetSurfaceZ(x, y, map);
UO.Print("Average land Z: " + Convert.ToString(z));Параметри та порядок виконання:
- GetMapCell потрібен, щоб відрізнити відсутні дані від висоти 0. Між двома викликами картка все одно може змінитися.
return RunScenario();
object? RunScenario()
{
var x = UO.GetX() + 1;
var y = UO.GetY();
var map = UO.WorldNum();
var cell = UO.GetMapCell(x, y, map);
if (Truth(ArrayLength(cell) == 3))
{
UO.Print("Average: " + Convert.ToString(UO.GetSurfaceZ(x, y, map)));
}
else
{
UO.Print("No land data");
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Різниця показує нахил землі. Цей приклад нічого не переміщає і не рахує маршрут.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var x = UO.GetX();
var y = UO.GetY();
var map = UO.WorldNum();
var a = UO.GetMapCell(x, y, map);
var b = UO.GetMapCell(x + 1, y, map);
if (Truth(ArrayLength(a) == 3) && Truth(ArrayLength(b) == 3))
{
var difference = UO.GetSurfaceZ(x + 1, y, map) - UO.GetSurfaceZ(x, y, map);
UO.Print("Average difference: " + Convert.ToString(difference));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: x (Any), y (Any), worldNum (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetSurfaceZ:bridge.GetSurfaceZ(Arg(0), Arg(1), Arg(2)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутрішній код реалізації, не самостійний скрипт.
case "getsurfacez":
return new InjectionValue(bridge.GetSurfaceZ(Arg(0), Arg(1), Arg(2)));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetTileFlags(object? group, object? tileId);Читає бітову маску властивостей graphic із запису tiledata.
-
group- 0 - таблиця землі (land); 1 - таблиця статичних graphic. Реалізація вважає будь-яку ненульову групу другою таблицею; використовуйте 0 або 1. -
tileId— Graphic/type запису в tiledata, зазвичай ціле 0…65535. Це не serial предмет та не індекс статики всередині клітини.
int - молодші 32 біта прапорів tiledata. Встановлений старший біт дає негативне знакове число. 0 означає відсутність цих прапорів або неприпустимий tileId; це не самостійна ознака помилки та не bool. Декілька властивостей можуть бути встановлені одночасно.
- Ця команда читає довідковий запис graphic; координати світу не потрібні. group=0 і group=1 вибирають різні таблиці навіть за однакового tileId.
- Властивість читається з даних graphic, а чи не з поточного стану конкретного предмета.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetTileFlags(1, 0x0CCA);
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- group=1 вибирає static tiledata; tileId=0x0CCA - graphic дерева.
- value містить результат, описаний у розділі "Повертає"; його сенс не збігається з serial.
var value = UO.GetTileFlags(1, 0x0CCA);
if (Truth((Convert.ToUInt64(value) & 0x40UL) != 0))
{
UO.Print("Impassable flag is set");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- FindType повертає serial. GetType перетворює його на числовий graphic.
- group=1 використовується для предметів; у tileId передається graphic, не item.
return RunScenario();
object? RunScenario()
{
var item = UO.FindType(0x0EED, -1, "backpack");
if (Truth(item != ""))
{
var graphic = UO.GetType(item);
var value = UO.GetTileFlags(1, graphic);
UO.Print(Convert.ToString(value));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Перші два аргументи GetLandscapeTile - поточні світові X/Y; третій – поточна карта.
- land[0] містить graphic землі. group=0 вибирає land tiledata. Для GetTileLayer/GetTileHeight земля дає 0.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
if (Truth(ArrayLength(land) >= 3))
{
var graphic = land[0];
var value = UO.GetTileFlags(0, graphic);
UO.Print(Convert.ToString(value));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: group (Any), tileId (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetTileFlags. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileFlags:bridge.GetTileFlags(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group).
Внутрішній код реалізації, не самостійний скрипт.
public InjectionValue GetTileFlags(InjectionValue group, InjectionValue tileId)
=> new InjectionValue(unchecked((int)bridge.GetTileFlags(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId))));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetTileHeight(object? group, object? tileId);Читає висоту graphic із запису tiledata.
-
group- 0 - таблиця землі (land); 1 - таблиця статичних graphic. Реалізація вважає будь-яку ненульову групу другою таблицею; використовуйте 0 або 1. -
tileId— Graphic/type запису в tiledata, зазвичай ціле 0…65535. Це не serial предмет та не індекс статики всередині клітини.
int - висота графіки в одиницях Z з tiledata. Це розмір графіки по висоті, а чи не світова координата її підстави Z. Для землі, відсутньої записи чи нульової висоти повертається 0. Висота сама собою не доводить прохідність.
- Ця команда читає довідковий запис graphic; координати світу не потрібні. group=0 і group=1 вибирають різні таблиці навіть за однакового tileId.
- Властивість читається з даних graphic, а чи не з поточного стану конкретного предмета.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.GetTileHeight(1, 0x0CCA);
UO.Print("GetTileHeight: " + Convert.ToString(result));Параметри та порядок виконання:
- group=1 вибирає static tiledata; tileId=0x0CCA - graphic дерева.
- value містить результат, описаний у розділі "Повертає"; його сенс не збігається з serial.
var value = UO.GetTileHeight(1, 0x0CCA);
UO.Print("Tiledata height: " + Convert.ToString(value));Параметри та порядок виконання:
- FindType повертає serial. GetType перетворює його на числовий graphic.
- group=1 використовується для предметів; у tileId передається graphic, не item.
return RunScenario();
object? RunScenario()
{
var item = UO.FindType(0x0EED, -1, "backpack");
if (Truth(item != ""))
{
var graphic = UO.GetType(item);
var value = UO.GetTileHeight(1, graphic);
UO.Print(Convert.ToString(value));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Перші два аргументи GetLandscapeTile - поточні світові X/Y; третій – поточна карта.
- land[0] містить graphic землі. group=0 вибирає land tiledata. Для GetTileLayer/GetTileHeight земля дає 0.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
if (Truth(ArrayLength(land) >= 3))
{
var graphic = land[0];
var value = UO.GetTileHeight(0, graphic);
UO.Print(Convert.ToString(value));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: group (Any), tileId (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetTileHeight. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileDataProperties:bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)).
Внутрішній код реалізації, не самостійний скрипт.
public int GetTileHeight(InjectionValue group, InjectionValue tileId)
{
int tileGroup = NumberConversions.ToInt(group);
int[] properties = bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)) ?? Array.Empty<int>();
return tileGroup == 0 || properties.Length < 7 ? 0 : properties[6];
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetTileLayer(object? group, object? tileId);Читає номер шару екіпірування з запису tiledata.
-
group- 0 - таблиця землі (land); 1 - таблиця статичних graphic. Реалізація вважає будь-яку ненульову групу другою таблицею; використовуйте 0 або 1. -
tileId— Graphic/type запису в tiledata, зазвичай ціле 0…65535. Це не serial предмет та не індекс статики всередині клітини.
int — номер шару екіпіровки graphic: наприклад 1=Rhand, 2=Lhand, 21=Backpack. Для землі, відсутньої запису або нульового шару, повертається 0. Це не порядок статики у клітці, не поверх і не Z.
- Ця команда читає довідковий запис graphic; координати світу не потрібні. group=0 і group=1 вибирають різні таблиці навіть за однакового tileId.
- Властивість читається з даних graphic, а чи не з поточного стану конкретного предмета.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.GetTileLayer(1, 0x0CCA);
UO.Print("GetTileLayer: " + Convert.ToString(result));Параметри та порядок виконання:
- group=1 вибирає static tiledata; tileId=0x0CCA - graphic дерева.
- value містить результат, описаний у розділі "Повертає"; його сенс не збігається з serial.
var value = UO.GetTileLayer(1, 0x0CCA);
if (Truth(value == 1))
{
UO.Print("Right-hand graphic");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- FindType повертає serial. GetType перетворює його на числовий graphic.
- group=1 використовується для предметів; у tileId передається graphic, не item.
return RunScenario();
object? RunScenario()
{
var item = UO.FindType(0x0EED, -1, "backpack");
if (Truth(item != ""))
{
var graphic = UO.GetType(item);
var value = UO.GetTileLayer(1, graphic);
UO.Print(Convert.ToString(value));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Перші два аргументи GetLandscapeTile - поточні світові X/Y; третій – поточна карта.
- land[0] містить graphic землі. group=0 вибирає land tiledata. Для GetTileLayer/GetTileHeight земля дає 0.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
if (Truth(ArrayLength(land) >= 3))
{
var graphic = land[0];
var value = UO.GetTileLayer(0, graphic);
UO.Print(Convert.ToString(value));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: group (Any), tileId (Any)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetTileLayer. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileDataProperties:bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)).
Внутрішній код реалізації, не самостійний скрипт.
public int GetTileLayer(InjectionValue group, InjectionValue tileId)
{
int tileGroup = NumberConversions.ToInt(group);
int[] properties = bridge.GetTileDataProperties(tileGroup, NumberConversions.ToInt(tileId)) ?? Array.Empty<int>();
return tileGroup == 0 || properties.Length < 2 ? 0 : properties[1];
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.GetTileName(object? group, object? tileId);Читає назву graphic із запису tiledata.
-
group- 0 - таблиця землі (land); 1 - таблиця статичних graphic. Реалізація вважає будь-яку ненульову групу другою таблицею; використовуйте 0 або 1. -
tileId— Graphic/type запису в tiledata, зазвичай ціле 0…65535. Це не serial предмет та не індекс статики всередині клітини.
string - назва з ігрових файлів tiledata. Порожній рядок означає порожнє ім'я або неприпустимий tileId. Назва береться з ресурсів гри та не перекладається автоматично на мову інтерфейсу IDE. Не ім'я конкретного предмета від сервера.
- Ця команда читає довідковий запис graphic; координати світу не потрібні. group=0 і group=1 вибирають різні таблиці навіть за однакового tileId.
- Властивість читається з даних graphic, а чи не з поточного стану конкретного предмета.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.GetTileName(1, 0x0CCA);
UO.Print("GetTileName: " + Convert.ToString(result));Параметри та порядок виконання:
- group=1 вибирає static tiledata; tileId=0x0CCA - graphic дерева.
- value містить результат, описаний у розділі "Повертає"; його сенс не збігається з serial.
var value = UO.GetTileName(1, 0x0CCA);
if (Truth(value != ""))
{
UO.Print(value);
}
else
{
UO.Print("No tiledata name");
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- FindType повертає serial. GetType перетворює його на числовий graphic.
- group=1 використовується для предметів; у tileId передається graphic, не item.
return RunScenario();
object? RunScenario()
{
var item = UO.FindType(0x0EED, -1, "backpack");
if (Truth(item != ""))
{
var graphic = UO.GetType(item);
var value = UO.GetTileName(1, graphic);
UO.Print(Convert.ToString(value));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Перші два аргументи GetLandscapeTile - поточні світові X/Y; третій – поточна карта.
- land[0] містить graphic землі. group=0 вибирає land tiledata. Для GetTileLayer/GetTileHeight земля дає 0.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), UO.WorldNum());
if (Truth(ArrayLength(land) >= 3))
{
var graphic = land[0];
var value = UO.GetTileName(0, graphic);
UO.Print(Convert.ToString(value));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: group (Any), tileId (Any)
Результат: string / String.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetTileName. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileDataName:bridge.GetTileDataName(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId)). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(group).
Внутрішній код реалізації, не самостійний скрипт.
public string GetTileName(InjectionValue group, InjectionValue tileId)
=> bridge.GetTileDataName(NumberConversions.ToInt(group), NumberConversions.ToInt(tileId));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetTileXYM(object? x, object? y, object? map, object? tileStart, object? tileEnd, object? uoPath);Читає graphic ID з ланцюжка об'єктів клітини поточної завантаженої ігрової карти.
-
x— комірки координат X, int. -
y— комірки координат Y, int. -
map- Номер карти; повинен збігатися з World.MapIndex, і World.Map має існувати. -
tileStart— Нижній включений кордон Graphic. -
tileEnd- Верхня включена межа Graphic. Зворотний діапазон не переставляється та не дає збігів. -
uoPath— Параметр сумісності перетворюється на string, але поточний bridge його не використовує та не завантажує іншу папку файлів UO.
Array int із плоскими четвірками [graphic,x,y,z,graphic,x,y,z,...]. Помилка картки дає порожній масив та повідомлення; відсутність збігів також дає порожній масив.
- Іде по World.Map.GetTile(x,y).TNext і перевіряє tileStart<=Graphic<=tileEnd. Типи об'єктів окремо не фільтруються: це ланцюжок клітини, а не лише statics.
- Команда читає завантажену клієнтську геометрію. Дані з іншого map/facet не завантажуються. Параметр uoPath не використовується для завантаження файлів; число записів дорівнює довжині масиву/4.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetTileXYM(UO.GetX(), UO.GetY(), UO.WorldNum(), 0, 65535, "");
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Кожен запис займає чотири int.
var tiles = UO.GetTileXYM(UO.GetX(),UO.GetY(),UO.WorldNum(),0,65535,"");
UO.Print(Convert.ToString(ArrayLength(tiles)/4));
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Параметри та порядок виконання:
- Індекси i та i+3 відповідають graphic та z одного запису.
return RunScenario();
object? RunScenario()
{
var tiles = UO.GetTileXYM(UO.GetX(), UO.GetY(), UO.WorldNum(), 0, 65535, "");
for (int i = (int)(0); i <= ArrayLength(tiles) - 1; i += (int)(4))
{
UO.Print(Convert.ToString(tiles[i]) + " " + Convert.ToString(tiles[i + 3]));
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Параметри та порядок виконання:
- Діапазон 100..99 не містить жодного graphic і дає порожній масив.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var tiles = UO.GetTileXYM(UO.GetX(), UO.GetY(), UO.WorldNum(), 100, 99, "");
UO.Print(Convert.ToString(ArrayLength(tiles)));
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: x (Any), y (Any), map (Any), tileStart (Any), tileEnd (Any), uoPath (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetTileXYM. -
InjectionScript.Runtime.InjectionApiUO.ToArray:ToArray(bridge.GetTileXYM(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), NumberConversions.ToInt(tileStart), NumberConversions.ToInt(tileEnd), uoPath.ToString())). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetTileXYM:bridge.GetTileXYM(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), NumberConversions.ToInt(tileStart), NumberConversions.ToInt(tileEnd), uoPath.ToString()). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x). -
InjectionScript.Runtime.InjectionValue.ToString:uoPath.ToString().
Внутрішній код реалізації, не самостійний скрипт.
public InjectionValue GetTileXYM(InjectionValue x, InjectionValue y, InjectionValue map, InjectionValue tileStart, InjectionValue tileEnd, InjectionValue uoPath)
=> ToArray(bridge.GetTileXYM(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), NumberConversions.ToInt(tileStart), NumberConversions.ToInt(tileEnd), uoPath.ToString()));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
string UO.GetUserStatic(object? id);Читає збережений користувача static-запис.
-
id— int ID, отриманий AddUserStatic; не graphic/type і не serial світу.
string - збережена серіалізована запис; невідомий ID дає порожній рядок.
- state.UserStatics.TryGetValue повертає рядок без його розбору. Геометричний запис - "graphic|x|y|z|hue|map"; старі текстові записи можуть бути іншим текстом.
- Читає поточний локальний стан. Пакету, target та автоматичного оновлення немає; окремі читання можуть бачити різні стани.
- У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.GetUserStatic(1);
UO.Print("GetUserStatic: " + Convert.ToString(result));Параметри та порядок виконання:
- Читає збережений користувача static-запис.
UO.Print(UO.GetUserStatic(1));Параметри та порядок виконання:
- state.UserStatics.TryGetValue повертає рядок без його розбору. Геометричний запис - "graphic|x|y|z|hue|map"; старі текстові записи можуть бути іншим текстом.
return RunScenario();
object? RunScenario()
{
if (Truth(UO.UserStaticExists(1)))
{
UO.Print(UO.GetUserStatic(1));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Читає поточний локальний стан. Пакету, target та автоматичного оновлення немає; окремі читання можуть бачити різні стани.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var records = UO.GetUserStatics();
if (Truth(UO.GetArrayLength(records) > 0))
{
UO.Print(UO.GetUserStatic(records[0][0]));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: id (Any)
Результат: string / String.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetUserStatic. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(id).
Внутрішній код реалізації, не самостійний скрипт.
public string GetUserStatic(InjectionValue id)
=> state.UserStatics.TryGetValue(NumberConversions.ToInt(id), out string value) ? value : string.Empty;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetUserStatics();Читає state. UserStatics.
Параметрів немає.
Array рядків [id, serializedText], відсортованих за id. Кожен id - int, serializedText - string; порожній словник дає порожній масив.
- Читає state. UserStatics. Геометрична запис зберігається як "graphic|x|y|z|hue|map"; старі текстові записи AddUserStatic можуть мати інший формат. Це локальні записи користувача, не всі статики карти.
- Читає поточний локальний стан. Пакету, target та автоматичного оновлення немає; окремі читання можуть бачити різні стани.
- У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetUserStatics();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- Читає state. UserStatics.
var records = UO.GetUserStatics();
UO.Print(UO.GetArrayLength(records));Параметри та порядок виконання:
- Читає state. UserStatics. Геометрична запис зберігається як "graphic|x|y|z|hue|map"; старі текстові записи AddUserStatic можуть мати інший формат. Це локальні записи користувача, не всі статики карти.
return RunScenario();
object? RunScenario()
{
var records = UO.GetUserStatics();
if (Truth(UO.GetArrayLength(records) > 0))
{
UO.Print(records[0][0]);
UO.Print(records[0][1]);
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Читає поточний локальний стан. Пакету, target та автоматичного оновлення немає; окремі читання можуть бачити різні стани.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var before = UO.GetUserStatics();
UO.Wait(500);
var after = UO.GetUserStatics();
UO.Print(before);
UO.Print(after);
return null;
}
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: dynamic / Any.
Під час виклику:
Внутрішній код реалізації, не самостійний скрипт.
public InjectionValue GetUserStatics()
=> new InjectionValue(state.UserStatics.OrderBy(pair => pair.Key)
.Select(pair => new InjectionValue(new[] { new InjectionValue(pair.Key), new InjectionValue(pair.Value) }))
.ToArray());Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetWorldCell(object? x, object? y);
dynamic UO.GetWorldCell(object? x, object? y, object? map);Читає розширені записи землі, записів над землею та завантажених світових предметів у вибраній галузі.
-
x- X клітини поточної завантаженої карти; світова координата, не позиція всередині гампа. -
y- Y клітини поточної завантаженої карти; світова координата, не позиція всередині гампа. -
map— Номер картки. Якщо цей аргумент відсутній у вибраній формі, використовується поточна карта. Справжній клієнт читає лише плитки з поточної завантаженої карти.
Array записи. Кожен елемент result[i] має такий формат:
Array з 11 полів одного запису; індекси починаються з 0:
-
[0] kind— string: "земля", "статичний" або "object". -
[1] serial- int: serial динамічного предмета; для land/static дорівнює 0. -
[2] graphic- int: type графіки. -
[3] x,[4] y- int: світові координати клітини. -
[5] z— int: висота основи у світі. -
[6] hue— int: колір, біля землі 0. -
[7] flags- int: молодші 32 біт прапорів tiledata. -
[8] name- string: назва з tiledata. -
[9] layer- int: шар екіпірування з tiledata, біля землі 0; не індекс статики. -
[10] height- int: висота graphic з tiledata, біля землі 0; не координати Z.
ArrayLength(result) - число записів, не число клітин і не число кроків маршруту. Результат може бути пустим. Один x/y може мати кілька записів з різними Z. Запис "object" має serial; запис "static" немає придатного serial.
- Дані належать до поточної завантаженої картки. Інша карта чи недоступна клітина дають порожній масив. Прямі запити тайлів можуть додатково повідомляти про розбіжність картки; GetWorldCell та GetWorldTilesArray відразу повертають порожній масив без такого повідомлення.
- Індекси масивів починаються з 0. Перед читанням поля перевіряйте ArrayLength. Z означає висоту у світі; layer – властивість екіпірування з tiledata, а index – порядковий номер запису клітини.
- Статична частина використовує GetStaticTiles: його поточна вибірка включає також Multi/Item. Світовий Item може додатково бути присутнім як "object" з serial; не рахуйте кожен запис унікальним предметом.
- GetWorldTilesArray обмежує область 1 000 000 клітин. Перевищення або координати поза 0…65535/map поза 0…255 викликають помилку команди, а не частковий масив. Для найчастішого опитування вибирайте невелику область.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetWorldCell(UO.GetX(), UO.GetY());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- GetWorldCell читає одну клітинку; GetWorldTilesArray у цьому прикладі читає квадрат 3×3 з включеними межами.
- cells[i] - вкладений масив. tile[0] - категорія, [2] - graphic, [5] - Z.
var cells = UO.GetWorldCell(UO.GetX(), UO.GetY());
var i = 0;
while (Truth(i < ArrayLength(cells)))
{
var tile = cells[i];
UO.Print(tile[0] + ": " + Convert.ToString(tile[2]) + ", Z=" + Convert.ToString(tile[5]));
i = i + 1;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Область вибирається координатами, а чи не контейнером.
- Перевірка kind="object" відокремлює серійні предмети від землі/статики; [1] містить serial.
return RunScenario();
object? RunScenario()
{
var cells = UO.GetWorldCell(UO.GetX(), UO.GetY());
var i = 0;
while (Truth(i < ArrayLength(cells)))
{
var tile = cells[i];
if (Truth(tile[0] == "object"))
{
UO.Print("Object serial: " + Convert.ToString(tile[1]));
}
i = i + 1;
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- tile[5] та GetZ() порівнюються в однакових одиницях світової висоти.
- Рівність Z фільтрує основу, але не означає прохідність або збіг поверху цілком.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var cells = UO.GetWorldCell(UO.GetX(), UO.GetY());
var i = 0;
while (Truth(i < ArrayLength(cells)))
{
var tile = cells[i];
if (Truth(tile[5] == UO.GetZ()))
{
UO.Print(tile[8]);
}
i = i + 1;
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: x (Any), y (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetWorldCell. -
InjectionScript.Runtime.InjectionApiUO.GetWorldCell:GetWorldCell(x, y, new InjectionValue(bridge.WorldNumber)). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
Внутрішній код реалізації, не самостійний скрипт.
public InjectionValue GetWorldCell(InjectionValue x, InjectionValue y)
=> GetWorldCell(x, y, new InjectionValue(bridge.WorldNumber));Параметри: x (Any), y (Any), map (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetWorldCell. -
InjectionScript.Runtime.InjectionApiUO.BuildWorldCell:BuildWorldCell(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), true). -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(x).
Внутрішній код реалізації, не самостійний скрипт.
public InjectionValue GetWorldCell(InjectionValue x, InjectionValue y, InjectionValue map)
=> BuildWorldCell(NumberConversions.ToInt(x), NumberConversions.ToInt(y), NumberConversions.ToInt(map), true);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetWorldNum();Читає номер поточної картки із моделі клієнта.
Параметрів немає.
int — індекс поточної картки клієнта, зазвичай 0=Felucca, 1=Trammel, 2=Ilshenar, 3=Malas, 4=Tokuno, 5=Ter Mur. Сервер користувача може використовувати інший набір карт. 0 - повноцінна карта, не ознака помилки.
- Читаються вже отримані локальні дані. Запит не відкриває статус і не змушує сервер надіслати оновлення. Після смерті, переходу на карту або видалення об'єкта значення можуть змінитися між двома викликами.
- C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.GetWorldNum();
UO.Print("GetWorldNum: " + Convert.ToString(result));Параметри та порядок виконання:
- Виклик без аргументів відноситься до self. Номер поточної картки зберігається у value.
- Convert.ToString перетворює число для виведення і не змінює значення результату.
var value = UO.GetWorldNum();
UO.Print("GetWorldNum: " + Convert.ToString(value));Параметри та порядок виконання:
- Значення читається одного разу без аргументів. Номер поточної картки використовується у наведеному розрахунку або за умови.
- Числові пороги — приклад умов скрипту, а чи не нові межі клієнта. Поле зберігає серверні одиниці та обмеження, описані вище.
return RunScenario();
object? RunScenario()
{
var value = UO.GetWorldNum();
var land = UO.GetLandscapeTile(UO.GetX(), UO.GetY(), value);
UO.Print("Land record length: " + Convert.ToString(ArrayLength(land)));
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;Параметри та порядок виконання:
- Обидва дзвінки без аргументу читають своє поточне значення. UO.Wait(1000) дає паузу в мілісекундах між знімками.
- Порівняється зміна: номер поточної картки. Приклад нічого не змінює у світі і не чекає нескінченно. Події всередині цієї секунди можуть бути пропущені.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var before = UO.GetWorldNum();
await Delay(1000);
var after = UO.GetWorldNum();
if (Truth(before != after))
{
UO.Print("Before: " + Convert.ToString(before) + "; after: " + Convert.ToString(after));
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.RegisterCharacterGetterAliases [GetWorldNum]. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
Виклик виконує збережений delegate обробника. Метод реєстрації створює цей delegate під час побудови API.
Внутрішній код реалізації, не самостійний скрипт.
() => bridge.WorldNumberСтворення API: Ці функції створюють реєстрацію API; вони не виконуються заново під час кожного виклику команди.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.GetWorldTilesArray(object? minX, object? minY, object? maxX, object? maxY, object? map);Читає розширені записи землі, записів над землею та завантажених світових предметів у вибраній галузі.
-
minX- Перша межа X прямокутника, включена; 0…65535. -
minY- Перша межа Y прямокутника, включена; 0…65535. -
maxX- Друга включена межа X; менша/велика із двох X вибираються автоматично. -
maxY- Друга включена межа Y; менша/велика із двох Y вибираються автоматично. -
map— Номер картки. Якщо цей аргумент відсутній у вибраній формі, використовується поточна карта. Справжній клієнт читає лише плитки з поточної завантаженої карти.
Array записи. Кожен елемент result[i] має такий формат:
Array з 11 полів одного запису; індекси починаються з 0:
-
[0] kind— string: "земля", "статичний" або "object". -
[1] serial- int: serial динамічного предмета; для land/static дорівнює 0. -
[2] graphic- int: type графіки. -
[3] x,[4] y- int: світові координати клітини. -
[5] z— int: висота основи у світі. -
[6] hue— int: колір, біля землі 0. -
[7] flags- int: молодші 32 біт прапорів tiledata. -
[8] name- string: назва з tiledata. -
[9] layer- int: шар екіпірування з tiledata, біля землі 0; не індекс статики. -
[10] height- int: висота graphic з tiledata, біля землі 0; не координати Z.
ArrayLength(result) - число записів, не число клітин і не число кроків маршруту. Результат може бути пустим. Один x/y може мати кілька записів з різними Z. Запис "object" має serial; запис "static" немає придатного serial.
- Дані належать до поточної завантаженої картки. Інша карта чи недоступна клітина дають порожній масив. Прямі запити тайлів можуть додатково повідомляти про розбіжність картки; GetWorldCell та GetWorldTilesArray відразу повертають порожній масив без такого повідомлення.
- Індекси масивів починаються з 0. Перед читанням поля перевіряйте ArrayLength. Z означає висоту у світі; layer – властивість екіпірування з tiledata, а index – порядковий номер запису клітини.
- Статична частина використовує GetStaticTiles: його поточна вибірка включає також Multi/Item. Світовий Item може додатково бути присутнім як "object" з serial; не рахуйте кожен запис унікальним предметом.
- GetWorldTilesArray обмежує область 1 000 000 клітин. Перевищення або координати поза 0…65535/map поза 0…255 викликають помилку команди, а не частковий масив. Для найчастішого опитування вибирайте невелику область.
Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
object? result = UO.GetWorldTilesArray(UO.GetX() - 1, UO.GetY() - 1, UO.GetX() + 1, UO.GetY() + 1, UO.WorldNum());
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметри та порядок виконання:
- GetWorldCell читає одну клітинку; GetWorldTilesArray у цьому прикладі читає квадрат 3×3 з включеними межами.
- cells[i] - вкладений масив. tile[0] - категорія, [2] - graphic, [5] - Z.
var cells = UO.GetWorldTilesArray(UO.GetX() - 1, UO.GetY() - 1, UO.GetX() + 1, UO.GetY() + 1, UO.WorldNum());
var i = 0;
while (Truth(i < ArrayLength(cells)))
{
var tile = cells[i];
UO.Print(tile[0] + ": " + Convert.ToString(tile[2]) + ", Z=" + Convert.ToString(tile[5]));
i = i + 1;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- Область вибирається координатами, а чи не контейнером.
- Перевірка kind="object" відокремлює серійні предмети від землі/статики; [1] містить serial.
return RunScenario();
object? RunScenario()
{
var cells = UO.GetWorldTilesArray(UO.GetX() - 1, UO.GetY() - 1, UO.GetX() + 1, UO.GetY() + 1, UO.WorldNum());
var i = 0;
while (Truth(i < ArrayLength(cells)))
{
var tile = cells[i];
if (Truth(tile[0] == "object"))
{
UO.Print("Object serial: " + Convert.ToString(tile[1]));
}
i = i + 1;
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- tile[5] та GetZ() порівнюються в однакових одиницях світової висоти.
- Рівність Z фільтрує основу, але не означає прохідність або збіг поверху цілком.
return new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenario();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
public object? RunScenario()
{
var cells = UO.GetWorldTilesArray(UO.GetX() - 1, UO.GetY() - 1, UO.GetX() + 1, UO.GetY() + 1, UO.WorldNum());
var i = 0;
while (Truth(i < ArrayLength(cells)))
{
var tile = cells[i];
if (Truth(tile[5] == UO.GetZ()))
{
UO.Print(tile[8]);
}
i = i + 1;
}
return null;
}
int ArrayLength(object? value) => value is System.Array array ? array.Length : 0;
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: minX (Any), minY (Any), maxX (Any), maxY (Any), map (Any)
Результат: dynamic / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetWorldTilesArray. -
InjectionScript.Runtime.NumberConversions.ToInt:NumberConversions.ToInt(minX). -
InjectionScript.Runtime.InjectionApiUO.BuildWorldCell:BuildWorldCell(cellX, cellY, world, false). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetWorldItems:bridge.GetWorldItems(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(serial). -
InjectionScript.Runtime.InjectionApiUO.BuildWorldTileRecord:BuildWorldTileRecord("object", serial, bridge.GetGraphics(serial), objectX, objectY, bridge.GetZ(serial), bridge.GetColor(serial), 1). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetGraphics:bridge.GetGraphics(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetZ:bridge.GetZ(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetColor:bridge.GetColor(serial). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.WorldNumber:bridge.WorldNumber.
Внутрішній код реалізації, не самостійний скрипт.
public InjectionValue GetWorldTilesArray(InjectionValue minX, InjectionValue minY, InjectionValue maxX, InjectionValue maxY, InjectionValue map)
{
int firstX = Math.Min(NumberConversions.ToInt(minX), NumberConversions.ToInt(maxX));
int lastX = Math.Max(NumberConversions.ToInt(minX), NumberConversions.ToInt(maxX));
int firstY = Math.Min(NumberConversions.ToInt(minY), NumberConversions.ToInt(maxY));
int lastY = Math.Max(NumberConversions.ToInt(minY), NumberConversions.ToInt(maxY));
int world = NumberConversions.ToInt(map);
if (firstX < 0 || firstY < 0 || lastX > ushort.MaxValue || lastY > ushort.MaxValue
|| world < 0 || world > byte.MaxValue)
throw new NativeSubrutineException("World tile coordinates must be 0..65535 and the map must be 0..255.");
if (((long)lastX - firstX + 1) * ((long)lastY - firstY + 1) > 1_000_000L)
throw new NativeSubrutineException("World tile array is limited to 1,000,000 cells per call.");
// Live world items have no per-result map field. Never combine the
// current world's items with a request for a different map, or scan
// every cell only to report the same unloaded-map failure repeatedly.
if (world != bridge.WorldNumber)
return new InjectionValue(Array.Empty<InjectionValue>());
var result = new List<InjectionValue>();
for (int cellX = firstX; cellX <= lastX; cellX++)
for (int cellY = firstY; cellY <= lastY; cellY++)
{
InjectionValue cell = BuildWorldCell(cellX, cellY, world, false);
if (cell.Kind == InjectionValueKind.Array)
result.AddRange(cell.Array);
}
foreach (int serial in bridge.GetWorldItems() ?? Array.Empty<int>())
{
int objectX = bridge.GetX(serial);
int objectY = bridge.GetY(serial);
if (objectX >= firstX && objectX <= lastX && objectY >= firstY && objectY <= lastY)
result.Add(BuildWorldTileRecord("object", serial, bridge.GetGraphics(serial), objectX, objectY,
bridge.GetZ(serial), bridge.GetColor(serial), 1));
}
return new InjectionValue(result.ToArray());
}Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetX();
int UO.GetX(object? id);Читає поле X завантаженого об'єкта чи поточного персонажа.
-
id— Serial/ID об'єкта, а не graphic/type. Число, hex-рядок, стандартне ім'я self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse або ім'я AddObject. Аліас має бути встановлений; існування перевіряється Exists. У зареєстрованій формі без аргументів використається self.
int — координата X. Для невідомого об'єкта повертається 0. Нуль також є допустимою координатою. Вимірюється у клітинах для об'єктів світу; це не екранні пікселі.
- Читаються останні дані, які вже відомі клієнту; запит на оновлення серверу не надсилається.
- Невідомий об'єкт та ще не отримана властивість можуть мати нульове/порожнє значення. Перевіряйте Exists та умови конкретної дії.
- Для персонажа чи предмета землі це координата світу. У предмета всередині контейнера X/Y задають положення всередині гампа; команда не переводить їх у світові координати власника.
- Читається поточна координата об'єкта. Очікуючі підтвердження кроки не перетворюються цією командою на розрахунок маршруту.
int x = UO.GetX();
UO.Print($"X = {x}");Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.GetX();
UO.Print("GetX: " + Convert.ToString(result));Параметри та порядок виконання:
- Форма без аргументу вибирає self, поточного персонажа.
- position містить координати X, а не serial.
var position = UO.GetX();
UO.Print("X: " + Convert.ToString(position));Параметри та порядок виконання:
- lasttarget повинен вказувати на завантаженого персонажа чи предмет землі.
- delta - Різниця по одній осі. Вона не є довжиною маршруту; Значення може бути негативним.
return RunScenario();
object? RunScenario()
{
var other = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(other)))
{
var delta = UO.GetX(other) - UO.GetX();
UO.Print("Difference: " + Convert.ToString(delta));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- id="self" - явна форма вибору персонажа. UO.Wait=500 мілісекунд.
- Порівняння показує зміну тільки осі X. Зміна іншої осі або поворот тут не враховуються.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var before = UO.GetX("self");
await Delay(500);
var after = UO.GetX("self");
if (Truth(before != after))
{
UO.Print("Coordinate changed");
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetX. -
InjectionScript.Runtime.InjectionApiUO.GetX:GetX("self").
Внутрішній код реалізації, не самостійний скрипт.
public int GetX() => GetX("self");Параметри: id (Any/Integer/String)
Результат: int / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Внутрішній код реалізації, не самостійний скрипт.
case "getx": return new InjectionValue(bridge.GetX(Arg(0, bridge.Self)));Параметри: id (Any/Integer/String)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetX. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetX:bridge.GetX(id).
Внутрішній код реалізації, не самостійний скрипт.
public int GetX(int id) => bridge.GetX(id);Параметри: id (Any/Integer/String)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetX. -
InjectionScript.Runtime.InjectionApiUO.GetX:GetX(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Внутрішній код реалізації, не самостійний скрипт.
public int GetX(string id) => GetX(GetObject(id));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.GetY();
int UO.GetY(object? id);Читає поле Y завантаженого об'єкта чи поточного персонажа.
-
id— Serial/ID об'єкта, а не graphic/type. Число, hex-рядок, стандартне ім'я self/backpack/lasttarget/lastobject/lastcontainer/laststatus/finditem/lastcorpse або ім'я AddObject. Аліас має бути встановлений; існування перевіряється Exists. У зареєстрованій формі без аргументів використається self.
int — координата Y. Для невідомого об'єкта повертається 0. Нуль також є допустимою координатою. Вимірюється у клітинах для об'єктів світу; це не екранні пікселі.
- Читаються останні дані, які вже відомі клієнту; запит на оновлення серверу не надсилається.
- Невідомий об'єкт та ще не отримана властивість можуть мати нульове/порожнє значення. Перевіряйте Exists та умови конкретної дії.
- Для персонажа чи предмета землі це координата світу. У предмета всередині контейнера X/Y задають положення всередині гампа; команда не переводить їх у світові координати власника.
- Читається поточна координата об'єкта. Очікуючі підтвердження кроки не перетворюються цією командою на розрахунок маршруту.
int y = UO.GetY();
UO.Print($"Y = {y}");Кожен приклад можна зберегти окремим файлом .csx та запускати в IDE. Об'єкт UO та функції очікування надає host поточної ігрової сесії. Демонстраційні serial, імена, координати та адреси замініть своїми.
Виконайте цей код як окремий файл .csx. Аргументи видно безпосередньо у виклику; демонстраційні імена, serial та адреси замініть своїми.
Результат одного виклику виводиться в журнал. Число не перетворюється на bool; для масиву показано кількість елементів.
var result = UO.GetY();
UO.Print("GetY: " + Convert.ToString(result));Параметри та порядок виконання:
- Форма без аргументу вибирає self, поточного персонажа.
- position містить координати Y, а не serial.
var position = UO.GetY();
UO.Print("Y: " + Convert.ToString(position));Параметри та порядок виконання:
- lasttarget повинен вказувати на завантаженого персонажа чи предмет землі.
- delta - Різниця по одній осі. Вона не є довжиною маршруту; Значення може бути негативним.
return RunScenario();
object? RunScenario()
{
var other = UO.GetSerial("lasttarget");
if (Truth(UO.Exists(other)))
{
var delta = UO.GetY(other) - UO.GetY();
UO.Print("Difference: " + Convert.ToString(delta));
}
return null;
}
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;Параметри та порядок виконання:
- id="self" - явна форма вибору персонажа. UO.Wait=500 мілісекунд.
- Порівняння показує зміну тільки осі Y. Зміна іншої осі або поворот тут не враховуються.
return await new ScriptScenario(UO, WaitAsync, Args, Cancellation, Checkpoint).RunScenarioAsync();
class ScriptScenario
{
private readonly global::ClassicUO.CSharp.CSharpGameApi UO;
private readonly Func<int, Task> WaitAsync;
private readonly string[] Args;
private readonly CancellationToken Cancellation;
private readonly Action Checkpoint;
public ScriptScenario(global::ClassicUO.CSharp.CSharpGameApi api, Func<int, Task> wait, string[] args, CancellationToken cancellation, Action checkpoint)
{
UO = api;
WaitAsync = wait;
Args = args;
Cancellation = cancellation;
Checkpoint = checkpoint;
}
async public Task<object?> RunScenarioAsync()
{
var before = UO.GetY("self");
await Delay(500);
var after = UO.GetY("self");
if (Truth(before != after))
{
UO.Print("Coordinate changed");
}
return null;
}
Task Delay(object? milliseconds) => WaitAsync(checked((int)Convert.ToDouble(milliseconds)));
bool Truth(object? value) => value is bool flag ? flag : value is string text ? !string.IsNullOrEmpty(text) : value != null && Convert.ToDouble(value) != 0;
}C# враховує регістр. Використовуйте точне ім’я UO. Числові прапорці порівнюйте з 0; bool використовуйте лише там, де сигнатура повертає bool.
Параметри: Немає параметрів.
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetY. -
InjectionScript.Runtime.InjectionApiUO.GetY:GetY("self").
Внутрішній код реалізації, не самостійний скрипт.
public int GetY() => GetY("self");Параметри: id (Any/Integer/String)
Результат: int / Any.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(Arg(0, bridge.Self)). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0, bridge.Self). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Self:bridge.Self.
Внутрішній код реалізації, не самостійний скрипт.
case "gety": return new InjectionValue(bridge.GetY(Arg(0, bridge.Self)));Параметри: id (Any/Integer/String)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetY. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.GetY:bridge.GetY(id).
Внутрішній код реалізації, не самостійний скрипт.
public int GetY(int id) => bridge.GetY(id);Параметри: id (Any/Integer/String)
Результат: int / Integer.
Під час виклику:
-
InjectionScript.Runtime.InjectionApiUO.GetY. -
InjectionScript.Runtime.InjectionApiUO.GetY:GetY(GetObject(id)). -
InjectionScript.Runtime.InjectionApiUO.GetObject:GetObject(id).
Внутрішній код реалізації, не самостійний скрипт.
public int GetY(string id) => GetY(GetObject(id));ClassicUO — Bad Newbie & C# Scripts IDE