Skip to content

UO Topic movement Part 2

Codex edited this page Oct 12, 2026 · 3 revisions

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

Рух персонажа — 2

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

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

1 · 2

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


UO.NewMoveXY

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

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

int UO.NewMoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running);
int UO.NewMoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running, object? stepCallback);
int UO.NewMoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running, object? stepCallback, object? timeout);
int UO.NewMoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running, object? stepCallback, object? timeout, object? maxSteps);
int UO.NewMoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running, object? stepCallback, object? timeout, object? maxSteps, object? maxDistance);
int UO.NewMoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running, object? stepCallback, object? timeout, object? maxSteps, object? maxDistance, object? accuracyZ);
int UO.NewMoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running, object? stepCallback, object? timeout, object? maxSteps, object? maxDistance, object? accuracyZ, object? avoidMobiles);
int UO.NewMoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running, object? stepCallback, object? timeout, object? maxSteps, object? maxDistance, object? accuracyZ, object? avoidMobiles, object? openDoors);
int UO.NewMoveXY(object? xdst, object? ydst, object? optimized, object? accuracy, object? running, object? stepCallback, object? timeout, object? maxSteps, object? maxDistance, object? accuracyZ, object? avoidMobiles, object? openDoors, object? stopOnStuck);

Переміщає персонажа до X/Y, чекає закінчення та перевіряє досягнення мети; підтримує додаткові обмеження та callback.

Параметри

  • xdst — Світова координата X призначення, 0..65535. Це не serial та не позиція всередині гампа.
  • ydst - Світова координата Y призначення, 0..65535.
  • optimized - true - звичайний режим пошуку та перевірки шляху вперед; false — зменшена евристика та перевірка найближчого кроку. false не вимикає обхід перешкод.
  • accuracy — Допуск X і Y у клітинах: обидва відхилення повинні вкладатися в нього. Значення обмежується діапазоном 0..20; 0 вимагає точних X/Y.
  • running — true/1 — запит бігу, false/0 — крок. Серверні затримки руху зберігаються; це не множник швидкості.
  • timeout — необов'язкова межа очікування в мілісекундах; відсутній аргумент, 0 та негативне значення означають відсутність цієї додаткової межі.
  • maxSteps — Необов'язкова межа помічених змін позиції, не мережних пакетів. 0/негативне/відсутність — без цього ліміту. Між опитуваннями може пройти кілька кроків, тому це не точний лічильник клітин.
  • maxDistance — Необов'язкова межа вихідної відстані max(abs(dx),abs(dy)) до мети. 0/відсутність відключають його. Це не дозволене відхилення при обході та не довжина знайденого шляху.
  • accuracyZ — Допуск висоти: abs(фактична Z - потрібна Z), обмежується 0..255. Нуль потребує точної висоти; 255 практично відключає обмеження Z. Для NewMoveXY цільовий Z дорівнює Z персонажа під час виклику; за промовчанням допуск 255.
  • avoidMobiles — Необов'язковий прапор: true забороняє прохід крізь персонажів, що враховуються; false дозволяє спробу. Без аргументу використовується moveThroughNPC. Сервер може заборонити прохід.
  • openDoors — Необов'язковий прапор відчинення дверей по дорозі. Без аргументу використовується moveOpenDoor; true не надає доступу до замкнених дверей.
  • stopOnStuck — true завершує рух з 0, якщо після планування приблизно 1000 мс не змінювалися X/Y/Z. Активні порції пошуку та перерахунку скидають цей таймер; окремий timeout продовжує діяти. За замовчуванням false.

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

int 1 — наприкінці перевірки персонаж перебуває у заданому допуску X/Y/Z, зокрема коли був там до виклику. int 0 — неприпустимі координати, відмова запуску, недосягнута точка або умова зупинки, що спрацювала. Це не число кроків та не serial; при аварійному скасуванні процедура переривається замість звичайного повернення 0.

Результат команди — числовий прапор: 1 означає виконану умову, 0 — невиконану. Після var result = команда (...) перевіряйте if (result != 0) або if (result == 0). Збережіть результат одного виклику: повторний виклик може виконати дію знову або прочитати стан, що вже змінився.

Поведінка

  • Повний маршрут A* будується до першого кроку, короткими порціями між оновленнями клієнта. За Optimized=true перевіряються наступні 4 клітинки шляху; за false — найближчий крок. Це перевірка вже розрахованого шляху, не дальність усього маршруту й не повзунки обходу під час руху мишею.
  • Відмова сервера DenyWalk або нова перешкода запитує перерахунок від поточної позиції після завершення черги кроків. Число повторів та частота перерахунку обмежені; відсутність шляху може завершити рух з 0.
  • Маршрут належить процедурі, що запустила: її аварійна зупинка скасовує автоматичний шлях, що залишився. Якщо інший запуск або користувач замінив маршрут, скасування колишнього власника новий маршрут не торкається. Вже надіслані кроки не відгукуються.
  • SetBadLocation та SetBadObject застосовуються як знімок заборон поточного runtime при запуску маршруту. Вони зберігаються за його внутрішньому перерахунку. Зміна чи очищення списків впливає на наступний маршрут, а не переписує той, що вже виконується.
  • Після прийняття запиту, виклик чекає на потоці скрипта. Початковий пошук та перерахунок виконуються на ігровому потоці порціями: максимум 32 розкриття вузлів та м'який бюджет близько 1 мс за порцію. Одна складна перевірка клітки чи читання картки може перевищити цей бюджет. Між порціями клієнт продовжує оновлення; повний ліміт пошуку залишається 10000 вузлів.
  • timeout відраховується після прийняття запиту та включає наступні порції пошуку та перерахунку. stopOnStuck не вважає працюючий пошук застряганням персонажа; після завершення планування відсутність змін позиції знову враховується. Підсумковий 1/0 перевіряє фактичні координати, а не лише готовність шляху.
  • Результат враховує локальну позицію клієнта; наступна серверна корекція все ще можлива. Запуск конкуруючих команд руху із різних процедур змінює загальний маршрут персонажа.
  • Налаштування moveCheckStamina, moveExitOnDisconnect, moveOpenDoor, moveThroughCorner, moveThroughNPC, moveHeuristicMult, moveTurnCost і moveBetweenTwoCorners впливають на виконання. Явні avoidMobiles/openDoors замінюють відповідні значення для цього дзвінка.
  • Результат 0 не повідомляє точну причину. Перевіряйте координати, з'єднання, витривалість та журнал; не повторюйте рух нескінченно без UO.Wait та ліміту спроб.
  • Основний bridge фіксує номер запиту, екземпляри гравця/Pathfinder/карти та індекс картки. Новий запит, зміна контексту або остаточна відмова дають 0; Перевірка повторюється після читання координат та останнього callback. Timeout, maxSteps та callback=0 зупиняють лише збережений запит, не новий чужий маршрут. Тимчасовий Blocked при ще активному відновленні не втрачає володіння: очікування продовжується. Для зовнішнього legacy-bridge без IApiMovementOwnershipBridge збережено колишній сумісний механізм.
  • Загальний Pathfinder зберігає до 8 тимчасових заборон спрямованості X/Y/Z на 2000 мс, лише якщо відхилений рух відповідного активного запиту. Ротація, невідома послідовність, повторна синхронізація та старий/чужий запит не створюють такої заборони. Новий зовнішній запит і втрата контексту карти/програвача очищає їх. Пошук завантаженої геометрії намагається обійти перехід; це не знання всіх перешкод на сервері. Без зміни X/Y/Z гравця дозволено внутрішні перерахунки до 8 з паузою щонайменше 40 мс. Немає повного шляху або цей бюджет вичерпано – маршрут закінчується. Потім завдання координат завершується після обробки поданих кроків; mobile-Follow може повторити спробу через затримку.

Callback кроку у C# явно реєструється через RegisterStepCallback(name, Func<int,int,int,bool>) або Func<int,int,int,int>. Координати x/y/z передаються як int; false/0 зупиняє маршрут, true/ненульове число продовжує. Реєстрація діє у поточному виконанні та звільняється разом із ним.

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

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

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

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

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

var result = UO.NewMoveXY((UO.GetX() + 3), UO.GetY(), true, 0, false);
UO.Print("NewMoveXY: " + Convert.ToString(result));

1. Дійти до сусідньої точки та перевірити результат — прямий скрипт

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

  • x/y - світова мета; Optimized=true, Accuracy=0 вимагають точних X/Y, Running=false задає ходьбу.
  • ok — int 1 або 0, а не кількість пройдених клітин. Ціль повинна бути доступна на поточній карті.
var x = UO.GetX() + 3;
var y = UO.GetY();
var ok = UO.NewMoveXY(x, y, true, 0, false);
if (Truth(ok))
{
    UO.Print("Destination reached");
}
else
{
    UO.Print("Destination not reached");
}

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

2. Біг з межею часу та відстані – функція сценарію

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

  • 1445/1690 - приклад мети; Accuracy=1 дозволяє зупинку поряд. Running = true. StepCallback=0 відключає callback.
  • timeout=5000 мс; maxSteps=100 спостережуваних переміщень; maxDistance=30 перевіряється від вихідної точки.
  • AccuracyZ=255 не вимагає поверху; avoidMobiles=true, openDoors=true, stopOnStuck=true включають ці умови.
return  RunScenario();
 object? RunScenario()
{
    var ok = UO.NewMoveXY(1445, 1690, true, 1, true, 0, 5000, 100, 30, 255, true, true, true);
    UO.Print("Move result: " + Convert.ToString(ok));
    return null;
}

3. Перевіряти витривалість у callback - клас сценарію

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

  • StepCallback="AfterStep" отримує три координати. Реєстрація RegisterStepCallback пов'язує ім'я з bool-делегатом. При Stamina <= 10 він повертає false і припиняє рух; true продовжує маршрут.
  • timeout=5000 мс обмежує очікування. Callback викликається після поміченого зміни, а чи не гарантовано кожен мережевий крок; не виконуйте в ньому довге очікування або новий маршрут.
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 stepRegistration = RegisterStepCallback("AfterStep", AfterStep);
        var ok = UO.NewMoveXY(UO.GetX() + 5, UO.GetY(), true, 0, false, "AfterStep", 5000);
        UO.Print("Move result: " + Convert.ToString(ok));
        return null;
    }

    bool AfterStep(int x, int y, int z)
    {
        UO.Print("Position: " + Convert.ToString(x) + "," + Convert.ToString(y) + "," + Convert.ToString(z));
        return UO.Stamina() > 10;
    }

    private IDisposable RegisterStepCallback(string name, Func<int, int, int, bool> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterStepCallback(name, handler);
    private IDisposable RegisterStepCallback(string name, Func<int, int, int, int> handler) => global::ClassicUO.CSharp.CSharpScriptContext.Current.RegisterStepCallback(name, handler);
}

4. GoToPoint: повний код допоміжної функції та Main - прямий скрипт

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

  • GoToPoint — допоміжна функція цього прикладу. Її чотири параметри x/y/accuracy/running описані над оголошенням функції; повне тіло функції знаходиться в тому ж копіюваному блоці.
  • Main обчислює ціль і викликає GoToPoint. Вона додає optimized=true, callback=0, timeout=8000 та maxSteps=100, викликає NewMoveXY один раз і передає повернутий int назад у Main.
  • NewMoveXY є вбудованою командою клієнта. Її пошук A*, перевірка прохідності та обробка серверних кроків реалізовані в клієнті, а не додаткових прихованих процедур цього скрипту.
  • У цьому прикладі callback вимкнено. Якщо в іншому прикладі задається ім'я callback або викликається додаткова функція скрипта, її визначення також має бути наведене цілком.
  • У C# перевіряйте if (reached != 0); числовий результат 0 означає неуспіх. Пряме порівняння int з bool неприпустиме. Аварійне скасування перериває виконання і має повертати false.
var x = UO.GetX() + 3;
var y = UO.GetY();
var reached = GoToPoint(x, y, 0, true);
if (Truth(Truth(reached) == true))
{
    UO.Print("Destination reached");
}
else
{
    UO.Print("Destination not reached");
}

dynamic GoToPoint(dynamic x, dynamic y, dynamic accuracy, dynamic running)
{
    dynamic optimized = true;
    var callback = 0;
    var timeout = 8000;
    var maxSteps = 100;
    var reached = UO.NewMoveXY(x, y, optimized, accuracy, running, callback, timeout, maxSteps);
    return reached;
}

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.NewMoveXY(xdst, ydst, optimized, accuracy, running) — UO.NewMoveXY(Any,Any,Any,Any,Any)

Параметри: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any)

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

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

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

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

values => new InjectionValue(CompactNewMoveXY(values))

UO.NewMoveXY(xdst, ydst, optimized, accuracy, running, stepCallback) — UO.NewMoveXY(Any,Any,Any,Any,Any,Any)

Параметри: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any), stepCallback (Any)

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

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

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

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

values => new InjectionValue(CompactNewMoveXY(values))

UO.NewMoveXY(xdst, ydst, optimized, accuracy, running, stepCallback, timeout) — UO.NewMoveXY(Any,Any,Any,Any,Any,Any,Any)

Параметри: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any), stepCallback (Any), timeout (Any)

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

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

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

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

values => new InjectionValue(CompactNewMoveXY(values))

UO.NewMoveXY(xdst, ydst, optimized, accuracy, running, stepCallback, timeout, maxSteps) — UO.NewMoveXY(Any,Any,Any,Any,Any,Any,Any,Any)

Параметри: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any), stepCallback (Any), timeout (Any), maxSteps (Any)

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

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

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

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

values => new InjectionValue(CompactNewMoveXY(values))

UO.NewMoveXY(xdst, ydst, optimized, accuracy, running, stepCallback, timeout, maxSteps, maxDistance) — UO.NewMoveXY(Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметри: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any), stepCallback (Any), timeout (Any), maxSteps (Any), maxDistance (Any)

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

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

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

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

values => new InjectionValue(CompactNewMoveXY(values))

UO.NewMoveXY(xdst, ydst, optimized, accuracy, running, stepCallback, timeout, maxSteps, maxDistance, accuracyZ) — UO.NewMoveXY(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметри: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any), stepCallback (Any), timeout (Any), maxSteps (Any), maxDistance (Any), accuracyZ (Any)

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

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

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

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

values => new InjectionValue(CompactNewMoveXY(values))

UO.NewMoveXY(xdst, ydst, optimized, accuracy, running, stepCallback, timeout, maxSteps, maxDistance, accuracyZ, avoidMobiles) — UO.NewMoveXY(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметри: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any), stepCallback (Any), timeout (Any), maxSteps (Any), maxDistance (Any), accuracyZ (Any), avoidMobiles (Any)

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

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

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

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

values => new InjectionValue(CompactNewMoveXY(values))

UO.NewMoveXY(xdst, ydst, optimized, accuracy, running, stepCallback, timeout, maxSteps, maxDistance, accuracyZ, avoidMobiles, openDoors) — UO.NewMoveXY(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметри: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any), stepCallback (Any), timeout (Any), maxSteps (Any), maxDistance (Any), accuracyZ (Any), avoidMobiles (Any), openDoors (Any)

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

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

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

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

values => new InjectionValue(CompactNewMoveXY(values))

UO.NewMoveXY(xdst, ydst, optimized, accuracy, running, stepCallback, timeout, maxSteps, maxDistance, accuracyZ, avoidMobiles, openDoors, stopOnStuck) — UO.NewMoveXY(Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any,Any)

Параметри: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any), stepCallback (Any), timeout (Any), maxSteps (Any), maxDistance (Any), accuracyZ (Any), avoidMobiles (Any), openDoors (Any), stopOnStuck (Any)

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

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

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

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

values => new InjectionValue(CompactNewMoveXY(values))

UO.OpenDoor

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

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

void UO.OpenDoor();

Запитує відчинення дверей перед персонажем.

Параметри

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

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

void - значення немає. Викликайте окремим рядком; завершення не підтверджує дію сервера.

Поведінка

  • OpenDoor викликає GameActions.OpenDoor через Invoke. Serial двері не приймається; пошук та правила відкриття належать GameActions/серверу.
  • У прикладах UO.Wait задає лише паузу скрипта; закінчення паузи не доводить виконання запиту сервером.

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

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

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

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

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

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

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

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

  • Запитує відчинення дверей перед персонажем.
UO.OpenDoor();

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

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

  • OpenDoor викликає GameActions.OpenDoor через Invoke. Serial двері не приймається; пошук та правила відкриття належать GameActions/серверу.
return  RunScenario();
 object? RunScenario()
{
    if (Truth(UO.IsOnline()))
    {
        UO.OpenDoor();
    }

    return null;
}

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

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

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

  • У прикладах UO.Wait задає лише паузу скрипта; закінчення паузи не доводить виконання запиту сервером.
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.OpenDoor();
        UO.Wait(250);
        UO.Print("Door request sent");
        return null;
    }
}

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

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

UO.OpenDoor() — UO.OpenDoor()

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

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

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

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

case "opendoor": bridge.OpenDoor(); break;

UO.PMove

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

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

void UO.PMove(object? targetX, object? targetY);
void UO.PMove(object? x, object? y, object? z);

Сумісна команда руху до X/Y через окремі клавішні кроки з межею 30 секунд.

Параметри

  • targetX - Цільовий світовий X.
  • x - Цільовий світовий X.
  • targetY - Цільовий світовий Y.
  • y - Цільовий світовий Y.
  • z - Третій сумісний аргумент приймається, але ігнорується. Використовуйте MoveXYZ для контролю висоти.

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

void - значення, що повертається немає. Викликайте окремим рядком; це не true/false та не число кроків.

Поведінка

  • Це простий рух у бік мети з паузою 75 мс між спробами, без повноцінного пошуку обходу. Для нових сценаріїв із перешкодами використовуйте NewMoveXY.
  • Якщо за 30 секунд не досягнуто точних X/Y, виводиться повідомлення. З результату void не можна здобути успіх; порівнюйте координати.
  • MoveOff забороняє клавішні кроки цієї команди, MoveOn знову дозволяє. PMove при вимкненому русі все одно може чекати до краю.

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

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

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

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

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

UO.Print("Calling UO.PMove");
UO.PMove((UO.GetX() + 1), UO.GetY());

1. Пройти сусідню клітинку - прямий скрипт

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

  • x/y задають призначення. MoveOn дозволяє клавішні кроки.
  • PMove не повертає число: позиція читається окремо.
var x = UO.GetX() + 1;
var y = UO.GetY();
UO.MoveOn();
UO.PMove(x, y);
UO.Print("X=" + Convert.ToString(UO.GetX()));

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

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

  • 1445/1690 замініть доступною точкою.
  • Перевірка порівнює обидві координати; Unit не підходить для if UO.PMove(...).
return  RunScenario();
 object? RunScenario()
{
    var x = 1445;
    var y = 1690;
    UO.PMove(x, y);
    if (Truth(UO.GetX() == x) && Truth(UO.GetY() == y))
    {
        UO.Print("Exact XY reached");
    }

    return null;
}

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

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

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

  • X/Y збігаються з поточними, тому йти не потрібно.
  • z=20 ігнорується та не піднімає на верхній поверх. Для цього потрібний MoveXYZ із реальною точкою сходів.

Стандартна швидкість руху

Мінімальний інтервал кроку: пішки — ходьба 400 мс, біг 200 мс; верхи - ходьба 200 мс, біг 100 мс.

Це стандартні межі клієнта, а не автоматично визначені налаштування вашого шарда. Серверні режими швидкості й політ враховуються окремо. Таймери скрипта можуть уповільнити рух, але не зменшити ці межі.

Кроки, маршрути, Follow, керування мишею/клавішами та карта використовують загальну чергу персонажа. Заміна маршруту, поворот або корекція позиції сервером не скасовують паузу, що залишилася після запиту кроку. Після затримки немає прискореної серії компенсації пропущених кадрів. Очікування підтвердження, перешкоди та поганий зв'язок можуть сповільнити рух.

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.PMove(UO.GetX(), UO.GetY(), 20);
        UO.Print("Actual Z=" + Convert.ToString(UO.GetZ()));
        return null;
    }
}

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

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

UO.PMove(targetX, targetY) — UO.PMove(Integer,Integer)

Параметри: targetX (Integer), targetY (Integer)

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

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

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

public void PMove(int targetX, int targetY)

        {

            var currentX = GetX();

            var currentY = GetY();

            var timeout = timeSource.Now.AddSeconds(30);



            while ((targetX != currentX || targetY != currentY) && timeSource.Now < timeout)

            {

                var direction = GetDirection(currentX, currentY, targetX, targetY);

                var key = GetKey(direction);



                bridge.MakeStepByKey(key);

                bridge.Wait(75);



                currentX = GetX();

                currentY = GetY();

            }



            if (targetX != currentX || targetY != currentY)

                SystemMessage("PMove stopped: destination was not reached in 30 seconds.");

        }

UO.PMove(x, y, z) — UO.PMove(Integer,Integer,Integer)

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

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

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

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

public void PMove(int x, int y, int z) => PMove(x, y);

UO.PredictedDirection

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

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

int UO.PredictedDirection();

Читає прогнозовану сторону напряму після вже поставлених у чергу кроків персонажа.

Параметри

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

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

int напрямки 0..7, без біта бігу. 0 - північ чи відсутність персонажа.

Поведінка

  • Тільки показана у синтаксисі функція UO без аргументів. Немає параметрів target, serial, type, мети, дистанції або timeout. Число не bool, ID або запис tile: 1 не означає досягнення мети.
  • GetEndPosition читає X/Y/Z/напрямок останнього вже доданого Mobile.Step. При порожній черзі читає поточне положення/напрямок персонажа. Це читання O(1): крок не витягується, рух та пакет не відправляються, маршрут не розраховується, досягнення команда не чекає.
  • Напрямки світу: 0 північ, 1 північний схід, 2 схід, 3 південний схід, 4 південь, 5 південний захід, 6 захід, 7 північний захід. Ізометричний екран. Direction.Mask прибирає прапор бігу; швидкість не повертається.
  • Це локальний прогноз, що не підтверджене прибуття. Нові/завершені кроки, відмова сервера, очищення черги або телепорт можуть його змінити. Окремі виклики компонентів не є атомарними; збіг X не доводить збіг Y/Z або підтвердження сервера.
  • Invoke виконує читання на ігровому потоці; з робочого потоку очікується обробка запиту менеджером. Скасування скрипта перериває очікування. Паузи та додаткові запити мережі не додаються.
  • Зовнішні реалізації IApiBridge без IPredictedMovementBridge зберігають запасне читання поточних координат/напряму. Classic UO реалізує інтерфейс з урахуванням черги.

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

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

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

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

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

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

1. Прочитати один компонент - прямий скрипт

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

  • predicted зберігає один виклик без аргументів; Convert.ToString форматує число для журналу.
var predicted = UO.PredictedDirection();
UO.Print("Predicted: " + Convert.ToString(predicted));

2. Спостерігати зміну прогнозу – функція сценарію

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

  • UO.Wait(100) призупиняє приклад на 100 мс. before і after можуть збігтися навіть за проміжному русі; ці читання рух не запускають.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.PredictedDirection();
    await Delay(100);
    var after = UO.PredictedDirection();
    if (Truth(before != after))
    {
        UO.Print("Prediction changed: " + Convert.ToString(before) + " -> " + 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;

3. Повна функція порівняння - клас сценарію

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

  • expected - приклад координати/висоти/напряму, не аргумент нативної команди. PredictionEquals перевіряє UO.Self(), читає значення один раз і повертає 1 (умова виконано) при рівності, інакше 0 (умова не виконано). Весь код функції показано нижче Main. Збіг одного компонента означає прибуття.
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()
    {
        if (Truth(Truth(PredictionEquals(4)) == true))
        {
            UO.Print("Queued endpoint matches this component");
        }
        else
        {
            UO.Print("Different component or no player");
        }

        return null;
    }

    dynamic PredictionEquals(dynamic expected)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var predicted = UO.PredictedDirection();
        return Truth(predicted == expected);
    }

    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.PredictedDirection() — UO.PredictedDirection()

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

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

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

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

case "predicteddirection": return new InjectionValue(ReadPredictedCoordinate(3));

UO.PredictedX

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

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

int UO.PredictedX();

Читає прогнозовану координату X після вже поставлених у чергу кроків персонажа.

Параметри

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

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

int X у клітинках картки. 0 - допустима координата або відсутність персонажа.

Поведінка

  • Тільки показана у синтаксисі функція UO без аргументів. Немає параметрів target, serial, type, мети, дистанції або timeout. Число не bool, ID або запис tile: 1 не означає досягнення мети.
  • GetEndPosition читає X/Y/Z/напрямок останнього вже доданого Mobile.Step. При порожній черзі читає поточне положення/напрямок персонажа. Це читання O(1): крок не витягується, рух та пакет не відправляються, маршрут не розраховується, досягнення команда не чекає.
  • X і Y — координати світу/карти, не пікселі гампа контейнера. Z — висота, не номер поверху. Повертається один компонент, не масив і не кінцева ціль усього маршруту.
  • Це локальний прогноз, що не підтверджене прибуття. Нові/завершені кроки, відмова сервера, очищення черги або телепорт можуть його змінити. Окремі виклики компонентів не є атомарними; збіг X не доводить збіг Y/Z або підтвердження сервера.
  • Invoke виконує читання на ігровому потоці; з робочого потоку очікується обробка запиту менеджером. Скасування скрипта перериває очікування. Паузи та додаткові запити мережі не додаються.
  • Зовнішні реалізації IApiBridge без IPredictedMovementBridge зберігають запасне читання поточних координат/напряму. Classic UO реалізує інтерфейс з урахуванням черги.

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

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

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

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

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

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

1. Прочитати один компонент - прямий скрипт

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

  • predicted зберігає один виклик без аргументів; Convert.ToString форматує число для журналу.
var predicted = UO.PredictedX();
UO.Print("Predicted: " + Convert.ToString(predicted));

2. Спостерігати зміну прогнозу – функція сценарію

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

  • UO.Wait(100) призупиняє приклад на 100 мс. before і after можуть збігтися навіть за проміжному русі; ці читання рух не запускають.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.PredictedX();
    await Delay(100);
    var after = UO.PredictedX();
    if (Truth(before != after))
    {
        UO.Print("Prediction changed: " + Convert.ToString(before) + " -> " + 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;

3. Повна функція порівняння - клас сценарію

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

  • expected - приклад координати/висоти/напряму, не аргумент нативної команди. PredictionEquals перевіряє UO.Self(), читає значення один раз і повертає 1 (умова виконано) при рівності, інакше 0 (умова не виконано). Весь код функції показано нижче Main. Збіг одного компонента означає прибуття.
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()
    {
        if (Truth(Truth(PredictionEquals(1445)) == true))
        {
            UO.Print("Queued endpoint matches this component");
        }
        else
        {
            UO.Print("Different component or no player");
        }

        return null;
    }

    dynamic PredictionEquals(dynamic expected)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var predicted = UO.PredictedX();
        return Truth(predicted == expected);
    }

    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.PredictedX() — UO.PredictedX()

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

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

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

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

case "predictedx": return new InjectionValue(ReadPredictedCoordinate(0));

UO.PredictedY

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

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

int UO.PredictedY();

Читає прогнозовану координату Y після вже поставлених у чергу кроків персонажа.

Параметри

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

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

int Y у клітинках картки. 0 - допустима координата або відсутність персонажа.

Поведінка

  • Тільки показана у синтаксисі функція UO без аргументів. Немає параметрів target, serial, type, мети, дистанції або timeout. Число не bool, ID або запис tile: 1 не означає досягнення мети.
  • GetEndPosition читає X/Y/Z/напрямок останнього вже доданого Mobile.Step. При порожній черзі читає поточне положення/напрямок персонажа. Це читання O(1): крок не витягується, рух та пакет не відправляються, маршрут не розраховується, досягнення команда не чекає.
  • X і Y — координати світу/карти, не пікселі гампа контейнера. Z — висота, не номер поверху. Повертається один компонент, не масив і не кінцева ціль усього маршруту.
  • Це локальний прогноз, що не підтверджене прибуття. Нові/завершені кроки, відмова сервера, очищення черги або телепорт можуть його змінити. Окремі виклики компонентів не є атомарними; збіг X не доводить збіг Y/Z або підтвердження сервера.
  • Invoke виконує читання на ігровому потоці; з робочого потоку очікується обробка запиту менеджером. Скасування скрипта перериває очікування. Паузи та додаткові запити мережі не додаються.
  • Зовнішні реалізації IApiBridge без IPredictedMovementBridge зберігають запасне читання поточних координат/напряму. Classic UO реалізує інтерфейс з урахуванням черги.

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

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

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

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

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

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

1. Прочитати один компонент - прямий скрипт

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

  • predicted зберігає один виклик без аргументів; Convert.ToString форматує число для журналу.
var predicted = UO.PredictedY();
UO.Print("Predicted: " + Convert.ToString(predicted));

2. Спостерігати зміну прогнозу – функція сценарію

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

  • UO.Wait(100) призупиняє приклад на 100 мс. before і after можуть збігтися навіть за проміжному русі; ці читання рух не запускають.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.PredictedY();
    await Delay(100);
    var after = UO.PredictedY();
    if (Truth(before != after))
    {
        UO.Print("Prediction changed: " + Convert.ToString(before) + " -> " + 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;

3. Повна функція порівняння - клас сценарію

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

  • expected - приклад координати/висоти/напряму, не аргумент нативної команди. PredictionEquals перевіряє UO.Self(), читає значення один раз і повертає 1 (умова виконано) при рівності, інакше 0 (умова не виконано). Весь код функції показано нижче Main. Збіг одного компонента означає прибуття.
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()
    {
        if (Truth(Truth(PredictionEquals(1690)) == true))
        {
            UO.Print("Queued endpoint matches this component");
        }
        else
        {
            UO.Print("Different component or no player");
        }

        return null;
    }

    dynamic PredictionEquals(dynamic expected)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var predicted = UO.PredictedY();
        return Truth(predicted == expected);
    }

    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.PredictedY() — UO.PredictedY()

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

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

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

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

case "predictedy": return new InjectionValue(ReadPredictedCoordinate(1));

UO.PredictedZ

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

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

int UO.PredictedZ();

Читає прогнозовану висоту Z після поставлених у чергу кроків персонажа.

Параметри

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

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

int Z, знакова висота - 128..127; негативне значення зберігається. 0 - допустима висота або відсутність персонажа.

Поведінка

  • Тільки показана у синтаксисі функція UO без аргументів. Немає параметрів target, serial, type, мети, дистанції або timeout. Число не bool, ID або запис tile: 1 не означає досягнення мети.
  • GetEndPosition читає X/Y/Z/напрямок останнього вже доданого Mobile.Step. При порожній черзі читає поточне положення/напрямок персонажа. Це читання O(1): крок не витягується, рух та пакет не відправляються, маршрут не розраховується, досягнення команда не чекає.
  • X і Y — координати світу/карти, не пікселі гампа контейнера. Z — висота, не номер поверху. Повертається один компонент, не масив і не кінцева ціль усього маршруту.
  • Це локальний прогноз, що не підтверджене прибуття. Нові/завершені кроки, відмова сервера, очищення черги або телепорт можуть його змінити. Окремі виклики компонентів не є атомарними; збіг X не доводить збіг Y/Z або підтвердження сервера.
  • Invoke виконує читання на ігровому потоці; з робочого потоку очікується обробка запиту менеджером. Скасування скрипта перериває очікування. Паузи та додаткові запити мережі не додаються.
  • Зовнішні реалізації IApiBridge без IPredictedMovementBridge зберігають запасне читання поточних координат/напряму. Classic UO реалізує інтерфейс з урахуванням черги.

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

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

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

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

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

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

1. Прочитати один компонент - прямий скрипт

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

  • predicted зберігає один виклик без аргументів; Convert.ToString форматує число для журналу.
var predicted = UO.PredictedZ();
UO.Print("Predicted: " + Convert.ToString(predicted));

2. Спостерігати зміну прогнозу – функція сценарію

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

  • UO.Wait(100) призупиняє приклад на 100 мс. before і after можуть збігтися навіть за проміжному русі; ці читання рух не запускають.
return await RunScenarioAsync();
async Task<object?> RunScenarioAsync()
{
    var before = UO.PredictedZ();
    await Delay(100);
    var after = UO.PredictedZ();
    if (Truth(before != after))
    {
        UO.Print("Prediction changed: " + Convert.ToString(before) + " -> " + 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;

3. Повна функція порівняння - клас сценарію

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

  • expected - приклад координати/висоти/напряму, не аргумент нативної команди. PredictionEquals перевіряє UO.Self(), читає значення один раз і повертає 1 (умова виконано) при рівності, інакше 0 (умова не виконано). Весь код функції показано нижче Main. Збіг одного компонента означає прибуття.
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()
    {
        if (Truth(Truth(PredictionEquals(-4)) == true))
        {
            UO.Print("Queued endpoint matches this component");
        }
        else
        {
            UO.Print("Different component or no player");
        }

        return null;
    }

    dynamic PredictionEquals(dynamic expected)
    {
        if (Truth(UO.Self() == 0))
        {
            return false;
        }

        var predicted = UO.PredictedZ();
        return Truth(predicted == expected);
    }

    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.PredictedZ() — UO.PredictedZ()

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

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

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

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

case "predictedz": return new InjectionValue(ReadPredictedCoordinate(2));

UO.SetRunMountTimer

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

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

void UO.SetRunMountTimer(object? value);

Задає інтервал кроку бігу верхи. Використовуйте для сповільнення або повернення до стандартної швидкості. Прискорити рух понад стандартний темп цієї команди не можна.

Параметри

  • value — Обов'язкове ціле число мілісекунд. Діапазон 100..2000; менші значення, включаючи 0 і негативні, піднімаються до 100, великі зменшуються до 2000.

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

void - значення немає. Викликайте окремим рядком. Щоб прочитати застосований інтервал, використовуйте UO.GetRunMountTimer(). Не підтвердження кроку сервером.

Поведінка

  • Налаштування відноситься до режиму бігу верхи. Стандартне та мінімально дозволене значення - 100 мс; верхня межа - 2000 мс. Інші три режими мають окремі налаштування.
  • Це локальний інтервал руху персонажа, а не ping, FPS, тайм-аут пошуку шляху або виміряна тривалість серверного кроку. Збільшення числа уповільнює рух; Зменшення нижче стандартного інтервалу не прискорює надсилання пакетів.
  • Команда сама не починає рух, не сідає на їздову тварину і не змінює режим ходьби/бігу. Режим вибирається під час руху; заданий сервером режим швидкості та політ також враховуються клієнтом.
  • Налаштування є загальним для руху цього клієнта: його можуть використовувати ручне керування, маршрут карти та інші скрипти. Тимчасово змінюючи її, збережіть колишнє значення та відновіть після операції; не змінюйте один режим одночасно з кількох процедур.
  • Поворот та відхилений крок відрізняються від звичайного переміщення. Серверне підтвердження, затримки зв'язку та перешкоди можуть збільшити фактичний час. Клієнт не відправляє серію прискорених кроків, щоб наздогнати пропущені кадри.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

UO.Print("Calling UO.SetRunMountTimer");
UO.SetRunMountTimer(100);

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

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

  • Value = 100 - мілісекунди. Виклик налаштовує рух, але не починає маршрут.
UO.SetRunMountTimer(100);

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

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

  • Value=200 додає 100 мс до стандартного інтервалу. Зміна діє тільки на бігу верхи. Наприклад, виберіть вільний напрямок.
  • UO.Step отримує Direction=2 та Running=true. Код 7 може означати лише поворот; інші коди не є true/false. finally відновлює попереднє налаштування при звичайному завершенні або обробці помилки.
return  RunScenario();
 object? RunScenario()
{
    var previous = UO.GetRunMountTimer();
    try
    {
        UO.SetRunMountTimer(200);
        var stepResult = UO.Step(2, true);
        if (Truth(stepResult != 7))
        {
            UO.Print("Step was not confirmed: " + Convert.ToString(stepResult));
        }
    }
    finally
    {
        UO.SetRunMountTimer(previous);
    }

    return null;
}

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

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

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

  • Після Value=1 applied дорівнює 100. Приклад не рухає персонажа та відновлює вихідний інтервал.
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 previous = UO.GetRunMountTimer();
        try
        {
            UO.SetRunMountTimer(1);
            var applied = UO.GetRunMountTimer();
            UO.Print("Applied delay, ms: " + Convert.ToString(applied));
        }
        finally
        {
            UO.SetRunMountTimer(previous);
        }

        return null;
    }
}

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

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

UO.SetRunMountTimer(value) — UO.SetRunMountTimer(Any)

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

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

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

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

case "setrunmounttimer":

                    state.RunMountTimer = ClampMoveTimer(Arg(0), 100);

                    bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer);

                    return InjectionValue.Unit;

UO.SetRunUnmountTimer

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

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

void UO.SetRunUnmountTimer(object? value);

Задає інтервал кроку бігу пішки. Використовуйте для сповільнення або повернення до стандартної швидкості. Прискорити рух понад стандартний темп цієї команди не можна.

Параметри

  • value — Обов'язкове ціле число мілісекунд. Діапазон 200..2000; менші значення, включаючи 0 і негативні, піднімаються до 200, великі зменшуються до 2000.

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

void - значення немає. Викликайте окремим рядком. Щоб прочитати застосований інтервал, використовуйте UO.GetRunUnmountTimer(). Не підтвердження кроку сервером.

Поведінка

  • Налаштування відноситься до режиму бігу пішки. Стандартне та мінімально дозволене значення - 200 мс; верхня межа - 2000 мс. Інші три режими мають окремі налаштування.
  • Це локальний інтервал руху персонажа, а не ping, FPS, тайм-аут пошуку шляху або виміряна тривалість серверного кроку. Збільшення числа уповільнює рух; Зменшення нижче стандартного інтервалу не прискорює надсилання пакетів.
  • Команда сама не починає рух, не сідає на їздову тварину і не змінює режим ходьби/бігу. Режим вибирається під час руху; заданий сервером режим швидкості та політ також враховуються клієнтом.
  • Налаштування є загальним для руху цього клієнта: його можуть використовувати ручне керування, маршрут карти та інші скрипти. Тимчасово змінюючи її, збережіть колишнє значення та відновіть після операції; не змінюйте один режим одночасно з кількох процедур.
  • Поворот та відхилений крок відрізняються від звичайного переміщення. Серверне підтвердження, затримки зв'язку та перешкоди можуть збільшити фактичний час. Клієнт не відправляє серію прискорених кроків, щоб наздогнати пропущені кадри.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

UO.Print("Calling UO.SetRunUnmountTimer");
UO.SetRunUnmountTimer(200);

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

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

  • Value = 200 - мілісекунди. Виклик налаштовує рух, але не починає маршрут.
UO.SetRunUnmountTimer(200);

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

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

  • Value=300 додає 100 мс до стандартного інтервалу. Зміна діє тільки на бігу пішки. Наприклад, виберіть вільний напрямок.
  • UO.Step отримує Direction=2 та Running=true. Код 7 може означати лише поворот; інші коди не є true/false. finally відновлює попереднє налаштування при звичайному завершенні або обробці помилки.
return  RunScenario();
 object? RunScenario()
{
    var previous = UO.GetRunUnMountTimer();
    try
    {
        UO.SetRunUnmountTimer(300);
        var stepResult = UO.Step(2, true);
        if (Truth(stepResult != 7))
        {
            UO.Print("Step was not confirmed: " + Convert.ToString(stepResult));
        }
    }
    finally
    {
        UO.SetRunUnmountTimer(previous);
    }

    return null;
}

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

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

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

  • Після Value=1 applied дорівнює 200. Приклад не рухає персонажа та відновлює вихідний інтервал.
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 previous = UO.GetRunUnMountTimer();
        try
        {
            UO.SetRunUnmountTimer(1);
            var applied = UO.GetRunUnMountTimer();
            UO.Print("Applied delay, ms: " + Convert.ToString(applied));
        }
        finally
        {
            UO.SetRunUnmountTimer(previous);
        }

        return null;
    }
}

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

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

UO.SetRunUnmountTimer(value) — UO.SetRunUnmountTimer(Any)

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

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

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

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

case "setrununmounttimer":

                    state.RunUnmountTimer = ClampMoveTimer(Arg(0), 200);

                    bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer);

                    return InjectionValue.Unit;

UO.SetWalkMountTimer

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

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

void UO.SetWalkMountTimer(object? value);

Задає інтервал кроку ходьби верхи. Використовуйте для сповільнення або повернення до стандартної швидкості. Прискорити рух понад стандартний темп цієї команди не можна.

Параметри

  • value — Обов'язкове ціле число мілісекунд. Діапазон 200..2000; менші значення, включаючи 0 і негативні, піднімаються до 200, великі зменшуються до 2000.

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

void - значення немає. Викликайте окремим рядком. Щоб прочитати застосований інтервал, використовуйте UO.GetWalkMountTimer(). Не підтвердження кроку сервером.

Поведінка

  • Налаштування відноситься до режиму ходьби верхи. Стандартне та мінімально дозволене значення - 200 мс; верхня межа - 2000 мс. Інші три режими мають окремі налаштування.
  • Це локальний інтервал руху персонажа, а не ping, FPS, тайм-аут пошуку шляху або виміряна тривалість серверного кроку. Збільшення числа уповільнює рух; Зменшення нижче стандартного інтервалу не прискорює надсилання пакетів.
  • Команда сама не починає рух, не сідає на їздову тварину і не змінює режим ходьби/бігу. Режим вибирається під час руху; заданий сервером режим швидкості та політ також враховуються клієнтом.
  • Налаштування є загальним для руху цього клієнта: його можуть використовувати ручне керування, маршрут карти та інші скрипти. Тимчасово змінюючи її, збережіть колишнє значення та відновіть після операції; не змінюйте один режим одночасно з кількох процедур.
  • Поворот та відхилений крок відрізняються від звичайного переміщення. Серверне підтвердження, затримки зв'язку та перешкоди можуть збільшити фактичний час. Клієнт не відправляє серію прискорених кроків, щоб наздогнати пропущені кадри.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

UO.Print("Calling UO.SetWalkMountTimer");
UO.SetWalkMountTimer(200);

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

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

  • Value = 200 - мілісекунди. Виклик налаштовує рух, але не починає маршрут.
UO.SetWalkMountTimer(200);

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

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

  • Value=300 додає 100 мс до стандартного інтервалу. Зміна діє лише на ходьби верхи. Наприклад, виберіть вільний напрямок.
  • UO.Step отримує Direction=2 та Running=false. Код 7 може означати лише поворот; інші коди не є true/false. finally відновлює попереднє налаштування при звичайному завершенні або обробці помилки.
return  RunScenario();
 object? RunScenario()
{
    var previous = UO.GetWalkMountTimer();
    try
    {
        UO.SetWalkMountTimer(300);
        var stepResult = UO.Step(2, false);
        if (Truth(stepResult != 7))
        {
            UO.Print("Step was not confirmed: " + Convert.ToString(stepResult));
        }
    }
    finally
    {
        UO.SetWalkMountTimer(previous);
    }

    return null;
}

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

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

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

  • Після Value=1 applied дорівнює 200. Приклад не рухає персонажа та відновлює вихідний інтервал.
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 previous = UO.GetWalkMountTimer();
        try
        {
            UO.SetWalkMountTimer(1);
            var applied = UO.GetWalkMountTimer();
            UO.Print("Applied delay, ms: " + Convert.ToString(applied));
        }
        finally
        {
            UO.SetWalkMountTimer(previous);
        }

        return null;
    }
}

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

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

UO.SetWalkMountTimer(value) — UO.SetWalkMountTimer(Any)

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

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

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

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

case "setwalkmounttimer":

                    state.WalkMountTimer = ClampMoveTimer(Arg(0), 200);

                    bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer);

                    return InjectionValue.Unit;

UO.SetWalkUnmountTimer

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

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

void UO.SetWalkUnmountTimer(object? value);

Задає інтервал кроку пішки. Використовуйте для сповільнення або повернення до стандартної швидкості. Прискорити рух понад стандартний темп цієї команди не можна.

Параметри

  • value — Обов'язкове ціле число мілісекунд. Діапазон 400..2000; менші значення, включаючи 0 і негативні, піднімаються до 400, великі зменшуються до 2000.

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

void - значення немає. Викликайте окремим рядком. Щоб прочитати застосований інтервал, використовуйте UO.GetWalkUnmountTimer(). Не підтвердження кроку сервером.

Поведінка

  • Налаштування стосується режиму ходьби пішки. Стандартне та мінімально дозволене значення - 400 мс; верхня межа - 2000 мс. Інші три режими мають окремі налаштування.
  • Це локальний інтервал руху персонажа, а не ping, FPS, тайм-аут пошуку шляху або виміряна тривалість серверного кроку. Збільшення числа уповільнює рух; Зменшення нижче стандартного інтервалу не прискорює надсилання пакетів.
  • Команда сама не починає рух, не сідає на їздову тварину і не змінює режим ходьби/бігу. Режим вибирається під час руху; заданий сервером режим швидкості та політ також враховуються клієнтом.
  • Налаштування є загальним для руху цього клієнта: його можуть використовувати ручне керування, маршрут карти та інші скрипти. Тимчасово змінюючи її, збережіть колишнє значення та відновіть після операції; не змінюйте один режим одночасно з кількох процедур.
  • Поворот та відхилений крок відрізняються від звичайного переміщення. Серверне підтвердження, затримки зв'язку та перешкоди можуть збільшити фактичний час. Клієнт не відправляє серію прискорених кроків, щоб наздогнати пропущені кадри.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

UO.Print("Calling UO.SetWalkUnmountTimer");
UO.SetWalkUnmountTimer(400);

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

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

  • Value = 400 - мілісекунди. Виклик налаштовує рух, але не починає маршрут.
UO.SetWalkUnmountTimer(400);

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

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

  • Value=500 додає 100 мс до стандартного інтервалу. Зміна діє лише на ходьби пішки. Наприклад, виберіть вільний напрямок.
  • UO.Step отримує Direction=2 та Running=false. Код 7 може означати лише поворот; інші коди не є true/false. finally відновлює попереднє налаштування при звичайному завершенні або обробці помилки.
return  RunScenario();
 object? RunScenario()
{
    var previous = UO.GetWalkUnmountTimer();
    try
    {
        UO.SetWalkUnmountTimer(500);
        var stepResult = UO.Step(2, false);
        if (Truth(stepResult != 7))
        {
            UO.Print("Step was not confirmed: " + Convert.ToString(stepResult));
        }
    }
    finally
    {
        UO.SetWalkUnmountTimer(previous);
    }

    return null;
}

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

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

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

  • Після Value=1 applied дорівнює 400. Приклад не рухає персонажа та відновлює вихідний інтервал.
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 previous = UO.GetWalkUnmountTimer();
        try
        {
            UO.SetWalkUnmountTimer(1);
            var applied = UO.GetWalkUnmountTimer();
            UO.Print("Applied delay, ms: " + Convert.ToString(applied));
        }
        finally
        {
            UO.SetWalkUnmountTimer(previous);
        }

        return null;
    }
}

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

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

UO.SetWalkUnmountTimer(value) — UO.SetWalkUnmountTimer(Any)

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

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

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

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

case "setwalkunmounttimer":

                    state.WalkUnmountTimer = ClampMoveTimer(Arg(0), 400);

                    bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer);

                    return InjectionValue.Unit;

UO.Step

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

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

dynamic UO.Step(object? direction, object? running);

Запитує одиночний крок/поворот і, якщо був відправлений крок, чекає на підтвердження сервера.

Параметри

  • direction - Напрямок 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW. Реалізація застосовує побітове &7; використовуйте 0..7 для ясності.
  • running — true/1 — запит бігу, false/0 — крок. Серверні затримки руху зберігаються; це не множник швидкості.

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

int: 7 - підтверджений крок або виконаний тільки поворот; 5 - сервер відхилив крок; 4 — закінчилося очікування підтвердження (до 10000 мс); 3 - крок заблокований клієнтом; 2 - черга переповнена; 0 — загальна відмова, вимкнення або недостатня витривалість. Це не true/false: наприклад, ненульовий код 5 означає відмову.

Поведінка

  • Одна команда спочатку може повернути персонажа; це не обов'язково переміщення наступної клітини.
  • Враховуються moveCheckStamina, moveExitOnDisconnect та moveOpenDoor. Серверна заборона та локальна перешкода різняться.
  • Не повторюйте команду в циклі без аналізу результату та UO.Wait: черга руху та швидкість сервера обмежені.
  • QueueStep на ігровому потоці перевіряє гравця, з'єднання, напрямок, чергу, темп та локальну прохідність. Перед Player.Walk кожен виклик окремо фіксує покоління Confirm/Deny свого sequence та Walker; потім повертає Result разом із цим знімком. Step і чекаючий StepControlled перевіряють тільки цю збережену пару, а не загальні поля наступного запиту; заміна гравця/Walker припиняє очікування загальною відмовою. Підтвердження іншої чергової команди не підтверджує цього кроку. Поворот без переміщення залишається окремим випадком.

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

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

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

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

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

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

1. Крок на схід – прямий скрипт

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

  • Direction=2 — E, Running=false — крок.
  • Перевіряється точний код 7; Для підтвердження переміщення порівняйте X/Y до та після.
var result = UO.Step(2, false);
if (Truth(result == 7))
{
    UO.Print("Step accepted or turn completed");
}
else
{
    UO.Print("Movement status: " + Convert.ToString(result));
}

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

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

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

  • Direction = 0 - N. Координати зчитуються до і після виклику.
  • Постійна позиція можлива при повороті або відмові, тому результат потрібен окремо.
return  RunScenario();
 object? RunScenario()
{
    var x = UO.GetX();
    var y = UO.GetY();
    var result = UO.Step(0, false);
    if (Truth(UO.GetX() == x) && Truth(UO.GetY() == y))
    {
        UO.Print("Position unchanged; status=" + Convert.ToString(result));
    }

    return null;
}

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

3. Обробити серверну відмову під час бігу - клас сценарію

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

  • Direction=4 — S, Running=true.
  • Код 5 – відмова сервера. UO.Wait=250 мс задає паузу скрипта і не гарантує, що наступна спроба буде успішною.

Стандартна швидкість руху

Мінімальний інтервал кроку: пішки — ходьба 400 мс, біг 200 мс; верхи - ходьба 200 мс, біг 100 мс.

Це стандартні межі клієнта, а не автоматично визначені налаштування вашого шарда. Серверні режими швидкості й політ враховуються окремо. Таймери скрипта можуть уповільнити рух, але не зменшити ці межі.

Кроки, маршрути, Follow, керування мишею/клавішами та карта використовують загальну чергу персонажа. Заміна маршруту, поворот або корекція позиції сервером не скасовують паузу, що залишилася після запиту кроку. Після затримки немає прискореної серії компенсації пропущених кадрів. Очікування підтвердження, перешкоди та поганий зв'язок можуть сповільнити рух.

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 result = UO.Step(4, true);
        if (Truth(result == 5))
        {
            UO.Print("Server denied the step");
            await Delay(250);
        }

        return null;
    }

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

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

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

UO.Step(direction, running) — UO.Step(Any,Any)

Параметри: direction (Any), running (Any)

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

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

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

case "step":

                    if (state.MoveExitOnDisconnect != 0 && bridge.IsOnline() == 0)

                        return new InjectionValue(0);

                    if (state.MoveCheckStamina > 0 && bridge.Stamina < state.MoveCheckStamina)

                        return new InjectionValue(0);

                    if (state.MoveOpenDoor != 0)

                        bridge.OpenDoor();

                    return new InjectionValue(bridge.Step(Arg(0) & 7, Arg(1) != 0));

UO.StepQ

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

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

int UO.StepQ(object? direction, object? run);
int UO.StepQ(object? direction, object? run, object? timeout);
int UO.StepQ(object? direction, object? run, object? timeout, object? queue);
int UO.StepQ(object? direction, object? run, object? timeout, object? queue, object? waitForAck);

Запитує один крок через чергу; додаткова форма може чекати на звільнення черги та підтвердження.

Параметри

  • direction - Напрямок 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW. Реалізація застосовує побітове &7; використовуйте 0..7 для ясності.
  • run — true/1 — запит бігу, false/0 — крок. Серверні затримки руху зберігаються; це не множник швидкості.
  • timeout — Необов'язковий термін очікування черги в мс. 0/негативне не чекає звільнення; при waitForAck=true та timeout=0 підтвердження очікується до 10000 мс. При позитивному значенні очікування на підтвердження отримує окремий такий самий термін.
  • queue — Необов'язковий прапор за промовчанням true. false передає forcePacket при запиті кроку; не скасовує серверні обмеження та не очищає накопичену чергу.
  • waitForAck - false/відсутність - повернути результат постановки відразу. true — для відправленого кроку чекати на підтвердження/відмову.

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

int без waitForAck: 0..255 — sequence надісланого запиту, включаючи допустимий 0; 256 - тільки поворот; -2 - перешкода на клієнті; -1 — загальна відмова/повна черга/відключення/витривалість. З waitForAck=true: 7 - підтвердження, 5 - відмова сервера, 4 - тайм-аут; -1/-2/256 зберігають попередній зміст. Число 7 у формі без очікування - sequence, а не підтвердження. Перевіряйте конкретні числові коди; if (result) для int у C# неприпустимо.

Поведінка

  • Одна команда спочатку може повернути персонажа; це не обов'язково переміщення наступної клітини.
  • Враховуються moveCheckStamina, moveExitOnDisconnect та moveOpenDoor. Серверна заборона та локальна перешкода різняться.
  • Не повторюйте команду в циклі без аналізу результату та UO.Wait: черга руху та швидкість сервера обмежені.
  • Без очікування команда не підтверджує зміни позиції. LastStepQUsedDoor показує спробу відкриття дверей, не результат кроку.
  • QueueStep на ігровому потоці перевіряє гравця, з'єднання, напрямок, чергу, темп та локальну прохідність. Перед Player.Walk кожен виклик окремо фіксує покоління Confirm/Deny свого sequence та Walker; потім повертає Result разом із цим знімком. Step і чекаючий StepControlled перевіряють тільки цю збережену пару, а не загальні поля наступного запиту; заміна гравця/Walker припиняє очікування загальною відмовою. Підтвердження іншої чергової команди не підтверджує цього кроку. Поворот без переміщення залишається окремим випадком.

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

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

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

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

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

var result = UO.StepQ(2, false);
UO.Print("StepQ: " + Convert.ToString(result));

1. Отримати sequence без очікування - прямий скрипт

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

  • direction = 2 - E, run = false. Два аргументи означають звичайну постановку без очікування на підтвердження.
  • sequence=0 є допустимим успіхом постановки; sequence=256 означає поворот.
var sequence = UO.StepQ(2, false);
if (Truth(sequence >= 0) && Truth(sequence <= 255))
{
    UO.Print("Queued sequence: " + Convert.ToString(sequence));
}
else
{
    UO.Print("Queue status: " + Convert.ToString(sequence));
}

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

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

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

  • direction=4 — S, run=true, timeout=1500 мс. queue=true, waitForAck=true.
  • Очікування місця та підтвердження може зайняти до двох інтервалів по 1500 мс. 256 вимагає окремого обліку повороту.
return  RunScenario();
 object? RunScenario()
{
    var status = UO.StepQ(4, true, 1500, true, true);
    if (Truth(status == 7))
    {
        UO.Print("Server confirmed");
    }
    else
    {
        UO.Print("Step status: " + Convert.ToString(status));
    }

    return null;
}

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

3. Окремо обробити локальну стіну – клас сценарію.

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

  • direction=6 - W, run=false; timeout=0 не чекає на чергу; queue=false запитує forcePacket, waitForAck=false.
  • ForcePacket не дає права пройти через стіну. При -2 розраховуйте інший маршрут замість повторного відправлення до тієї ж клітки.

Стандартна швидкість руху

Мінімальний інтервал кроку: пішки — ходьба 400 мс, біг 200 мс; верхи - ходьба 200 мс, біг 100 мс.

Це стандартні межі клієнта, а не автоматично визначені налаштування вашого шарда. Серверні режими швидкості й політ враховуються окремо. Таймери скрипта можуть уповільнити рух, але не зменшити ці межі.

Кроки, маршрути, Follow, керування мишею/клавішами та карта використовують загальну чергу персонажа. Заміна маршруту, поворот або корекція позиції сервером не скасовують паузу, що залишилася після запиту кроку. Після затримки немає прискореної серії компенсації пропущених кадрів. Очікування підтвердження, перешкоди та поганий зв'язок можуть сповільнити рух.

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 status = UO.StepQ(6, false, 0, false, false);
        if (Truth(status == -2))
        {
            UO.Print("Local obstacle; calculate another route");
        }

        return null;
    }

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

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

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

UO.StepQ(direction, run) — UO.StepQ(Any,Any)

Параметри: direction (Any), run (Any)

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

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

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

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

values => new InjectionValue(CompactStepQ(values))

UO.StepQ(direction, run, timeout) — UO.StepQ(Any,Any,Any)

Параметри: direction (Any), run (Any), timeout (Any)

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

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

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

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

values => new InjectionValue(CompactStepQ(values))

UO.StepQ(direction, run, timeout, queue) — UO.StepQ(Any,Any,Any,Any)

Параметри: direction (Any), run (Any), timeout (Any), queue (Any)

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

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

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

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

values => new InjectionValue(CompactStepQ(values))

UO.StepQ(direction, run, timeout, queue, waitForAck) — UO.StepQ(Any,Any,Any,Any,Any)

Параметри: direction (Any), run (Any), timeout (Any), queue (Any), waitForAck (Any)

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

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

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

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

values => new InjectionValue(CompactStepQ(values))

UO.moveBetweenTwoCorners

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

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

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

Роздільна здатність діагоналі при двох заблокованих бічних клітинах.

Параметри

  • value — необов'язкове нове значення. 0 забороняє, ненульове стає 1. Сервер може відкинути такий прохід незалежно від налаштування клієнта.

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

int — поточне збережене значення. Без аргументу лише читає; з аргументом повертає значення після застосування вище правил. Це налаштування, не результат руху.

Поведінка

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

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

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

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

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

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

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

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

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

  • Аргументів немає, стан не змінюється.
  • value – числове значення цієї настройки.
var value = UO.moveBetweenTwoCorners();
UO.Print(Convert.ToString(value));

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

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

  • value=0. 0 забороняє, ненульове стає 1. Сервер може відкинути такий прохід незалежно від налаштування клієнта.
  • applied показує збережене значення, а чи не успішне досягнення мети.
return  RunScenario();
 object? RunScenario()
{
    var applied = UO.moveBetweenTwoCorners(0);
    UO.Print("Applied: " + Convert.ToString(applied));
    return null;
}

3. Застосувати на одну ділянку скрипта – клас сценарію

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

  • попередній зберігає початкове налаштування; NewMoveXY обмежено 3000 мс.
  • Остання команда відновлює налаштування після повернення.
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 previous = UO.moveBetweenTwoCorners();
        UO.moveBetweenTwoCorners(0);
        var ok = UO.NewMoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false, 0, 3000);
        UO.moveBetweenTwoCorners(previous);
        UO.Print(Convert.ToString(ok));
        return null;
    }
}

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

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

UO.moveBetweenTwoCorners() — UO.moveBetweenTwoCorners()

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

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

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

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

case "movebetweentwocorners":

                    if (arguments.Length > 0) state.MoveBetweenTwoCorners = Arg(0) != 0 ? 1 : 0;

                    return new InjectionValue(state.MoveBetweenTwoCorners);

UO.moveBetweenTwoCorners(value) — UO.moveBetweenTwoCorners(Any)

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

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

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

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

case "movebetweentwocorners":

                    if (arguments.Length > 0) state.MoveBetweenTwoCorners = Arg(0) != 0 ? 1 : 0;

                    return new InjectionValue(state.MoveBetweenTwoCorners);

UO.moveCheckStamina

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

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

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

Мінімальна витривалість для руху команд.

Параметри

  • value — необов'язкове нове значення. Ціле >=0; негативне стає 0. Нуль вимикає перевірку порога.

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

int — поточне збережене значення. Без аргументу лише читає; з аргументом повертає значення після застосування вище правил. Це налаштування, не результат руху.

Поведінка

  • Налаштування зберігається в стані runtime і використовується відповідними командами під час запуску; зміна не переписує вже побудований шлях автоматично.
  • Повернення вихідного значення показане для звичайного завершення. Після аварійної зупинки наступні рядки відновлення не виконуються.
  • За замовчуванням 1. Значення 0 відключає цю локальну перевірку; позитивне задає мінімальну витривалість. Нижче порога запуск відхиляється або рух зупиняється, а не чекає відновлення витривалості.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

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

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

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

  • Аргументів немає, стан не змінюється.
  • value – числове значення цієї настройки.
var value = UO.moveCheckStamina();
UO.Print(Convert.ToString(value));

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

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

  • value=15. Ціле >=0; негативне стає 0. Нуль вимикає перевірку порога.
  • applied показує збережене значення, а чи не успішне досягнення мети.
return  RunScenario();
 object? RunScenario()
{
    var applied = UO.moveCheckStamina(15);
    UO.Print("Applied: " + Convert.ToString(applied));
    return null;
}

3. Застосувати на одну ділянку скрипта – клас сценарію

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

  • попередній зберігає початкове налаштування; NewMoveXY обмежено 3000 мс.
  • Остання команда відновлює налаштування після повернення.
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 previous = UO.moveCheckStamina();
        UO.moveCheckStamina(15);
        var ok = UO.NewMoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false, 0, 3000);
        UO.moveCheckStamina(previous);
        UO.Print(Convert.ToString(ok));
        return null;
    }
}

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

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

UO.moveCheckStamina() — UO.moveCheckStamina()

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

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

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

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

case "movecheckstamina": if (arguments.Length > 0) state.MoveCheckStamina = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveCheckStamina);

UO.moveCheckStamina(value) — UO.moveCheckStamina(Any)

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

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

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

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

case "movecheckstamina": if (arguments.Length > 0) state.MoveCheckStamina = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveCheckStamina);

UO.moveExitOnDisconnect

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

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

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

Припинення/відмова при відключеному з'єднанні.

Параметри

  • value — необов'язкове нове значення. 0 вимикає, ненульове стає 1. Вимкнення перевірки не дозволяє рухатись на сервері без з'єднання.

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

int — поточне збережене значення. Без аргументу лише читає; з аргументом повертає значення після застосування вище правил. Це налаштування, не результат руху.

Поведінка

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

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

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

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

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

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

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

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

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

  • Аргументів немає, стан не змінюється.
  • value – числове значення цієї настройки.
var value = UO.moveExitOnDisconnect();
UO.Print(Convert.ToString(value));

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

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

  • value=1. 0 вимикає, ненульове стає 1. Вимкнення перевірки не дозволяє рухатись на сервері без з'єднання.
  • applied показує збережене значення, а чи не успішне досягнення мети.
return  RunScenario();
 object? RunScenario()
{
    var applied = UO.moveExitOnDisconnect(1);
    UO.Print("Applied: " + Convert.ToString(applied));
    return null;
}

3. Застосувати на одну ділянку скрипта – клас сценарію

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

  • попередній зберігає початкове налаштування; NewMoveXY обмежено 3000 мс.
  • Остання команда відновлює налаштування після повернення.
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 previous = UO.moveExitOnDisconnect();
        UO.moveExitOnDisconnect(1);
        var ok = UO.NewMoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false, 0, 3000);
        UO.moveExitOnDisconnect(previous);
        UO.Print(Convert.ToString(ok));
        return null;
    }
}

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

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

UO.moveExitOnDisconnect() — UO.moveExitOnDisconnect()

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

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

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

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

case "moveexitondisconnect": if (arguments.Length > 0) state.MoveExitOnDisconnect = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveExitOnDisconnect);

UO.moveExitOnDisconnect(value) — UO.moveExitOnDisconnect(Any)

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

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

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

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

case "moveexitondisconnect": if (arguments.Length > 0) state.MoveExitOnDisconnect = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveExitOnDisconnect);

UO.moveHeuristicMult

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

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

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

Чисельник евристики Pathfinder у відсотках.

Параметри

  • value — необов'язкове нове значення. Ціле >=0 зберігається; перед пошуком мінімум 1. Значення 100 відповідає звичайній оцінці; >100 може віддати перевагу більш швидкому пошуку без гарантії мінімальної вартості. При Optimized=false використовується 1.

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

int — поточне збережене значення. Без аргументу лише читає; з аргументом повертає значення після застосування вище правил. Це налаштування, не результат руху.

Поведінка

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

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

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

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

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

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

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

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

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

  • Аргументів немає, стан не змінюється.
  • value – числове значення цієї настройки.
var value = UO.moveHeuristicMult();
UO.Print(Convert.ToString(value));

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

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

  • value=100. Ціле >=0 зберігається; перед пошуком мінімум 1. Значення 100 відповідає звичайній оцінці; >100 може віддати перевагу швидшому пошуку без гарантії мінімальної вартості. Optimized=false використовується 1.
  • applied показує збережене значення, а чи не успішне досягнення мети.
return  RunScenario();
 object? RunScenario()
{
    var applied = UO.moveHeuristicMult(100);
    UO.Print("Applied: " + Convert.ToString(applied));
    return null;
}

3. Застосувати на одну ділянку скрипта – клас сценарію

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

  • попередній зберігає початкове налаштування; NewMoveXY обмежено 3000 мс.
  • Остання команда відновлює налаштування після повернення.
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 previous = UO.moveHeuristicMult();
        UO.moveHeuristicMult(100);
        var ok = UO.NewMoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false, 0, 3000);
        UO.moveHeuristicMult(previous);
        UO.Print(Convert.ToString(ok));
        return null;
    }
}

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

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

UO.moveHeuristicMult() — UO.moveHeuristicMult()

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

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

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

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

case "moveheuristicmult": if (arguments.Length > 0) state.MoveHeuristicMultiplier = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveHeuristicMultiplier);

UO.moveHeuristicMult(value) — UO.moveHeuristicMult(Any)

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

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

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

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

case "moveheuristicmult": if (arguments.Length > 0) state.MoveHeuristicMultiplier = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveHeuristicMultiplier);

UO.moveOpenDoor

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

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

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

Спроби відкрити двері під час руху.

Параметри

  • value — необов'язкове нове значення. 0 вимикає, ненульове стає 1. Явний openDoors у NewMoveXY/MoveXYZ замінює цей прапорець на час дзвінка.

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

int — поточне збережене значення. Без аргументу лише читає; з аргументом повертає значення після застосування вище правил. Це налаштування, не результат руху.

Поведінка

  • Налаштування зберігається в стані runtime і використовується відповідними командами під час запуску; зміна не переписує вже побудований шлях автоматично.
  • Повернення вихідного значення показане для звичайного завершення. Після аварійної зупинки наступні рядки відновлення не виконуються.
  • За замовчуванням 0. При 1 клітини дверей вважаються прохідними під час A*; Спроба відкрити конкретні сусідні двері виконується перед кроком. За відсутності відомого об'єкта дверей використовується запит OpenDoor.
  • Цей прапор сам не зачиняє двері. Закривання відкритих персонажем дверей виконується окремим налаштуванням клієнта; замкнені двері або серверна заборона можуть зірвати маршрут.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

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

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

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

  • Аргументів немає, стан не змінюється.
  • value – числове значення цієї настройки.
var value = UO.moveOpenDoor();
UO.Print(Convert.ToString(value));

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

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

  • value=1. 0 вимикає, ненульове стає 1. Явний openDoors в NewMoveXY/MoveXYZ замінює цей прапорець під час дзвінка.
  • applied показує збережене значення, а чи не успішне досягнення мети.
return  RunScenario();
 object? RunScenario()
{
    var applied = UO.moveOpenDoor(1);
    UO.Print("Applied: " + Convert.ToString(applied));
    return null;
}

3. Застосувати на одну ділянку скрипта – клас сценарію

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

  • попередній зберігає початкове налаштування; NewMoveXY обмежено 3000 мс.
  • Остання команда відновлює налаштування після повернення.
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 previous = UO.moveOpenDoor();
        UO.moveOpenDoor(1);
        var ok = UO.NewMoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false, 0, 3000);
        UO.moveOpenDoor(previous);
        UO.Print(Convert.ToString(ok));
        return null;
    }
}

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

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

UO.moveOpenDoor() — UO.moveOpenDoor()

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

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

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

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

case "moveopendoor": if (arguments.Length > 0) state.MoveOpenDoor = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveOpenDoor);

UO.moveOpenDoor(value) — UO.moveOpenDoor(Any)

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

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

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

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

case "moveopendoor": if (arguments.Length > 0) state.MoveOpenDoor = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveOpenDoor);

UO.moveThroughCorner

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

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

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

Роздільна здатність діагоналі між клітинами при одній заблокованій бічній клітині.

Параметри

  • value — необов'язкове нове значення. 0 забороняє, ненульове стає 1. Якщо обидві бічні клітини заблоковані, застосовується moveBetweenTwoCorners.

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

int — поточне збережене значення. Без аргументу лише читає; з аргументом повертає значення після застосування вище правил. Це налаштування, не результат руху.

Поведінка

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

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

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

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

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

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

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

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

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

  • Аргументів немає, стан не змінюється.
  • value – числове значення цієї настройки.
var value = UO.moveThroughCorner();
UO.Print(Convert.ToString(value));

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

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

  • value=0. 0 забороняє, ненульове стає 1. Якщо обидві бічні клітини заблоковані, застосовується moveBetweenTwoCorners.
  • applied показує збережене значення, а чи не успішне досягнення мети.
return  RunScenario();
 object? RunScenario()
{
    var applied = UO.moveThroughCorner(0);
    UO.Print("Applied: " + Convert.ToString(applied));
    return null;
}

3. Застосувати на одну ділянку скрипта – клас сценарію

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

  • попередній зберігає початкове налаштування; NewMoveXY обмежено 3000 мс.
  • Остання команда відновлює налаштування після повернення.
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 previous = UO.moveThroughCorner();
        UO.moveThroughCorner(0);
        var ok = UO.NewMoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false, 0, 3000);
        UO.moveThroughCorner(previous);
        UO.Print(Convert.ToString(ok));
        return null;
    }
}

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

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

UO.moveThroughCorner() — UO.moveThroughCorner()

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

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

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

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

case "movethroughcorner": if (arguments.Length > 0) state.MoveThroughCorner = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveThroughCorner);

UO.moveThroughCorner(value) — UO.moveThroughCorner(Any)

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

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

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

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

case "movethroughcorner": if (arguments.Length > 0) state.MoveThroughCorner = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveThroughCorner);

UO.moveThroughNPC

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

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

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

Дозвіл спроби проходу крізь персонажів.

Параметри

  • value — необов'язкове нове значення. Ціле >=0, негативне стає 0; позитивне дозволяє спробу. Явний avoidMobiles визначає зворотне обмеження для окремого дзвінка.

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

int — поточне збережене значення. Без аргументу лише читає; з аргументом повертає значення після застосування вище правил. Це налаштування, не результат руху.

Поведінка

  • Налаштування зберігається в стані runtime і використовується відповідними командами під час запуску; зміна не переписує вже побудований шлях автоматично.
  • Повернення вихідного значення показане для звичайного завершення. Після аварійної зупинки наступні рядки відновлення не виконуються.
  • За замовчуванням 1000. Значення 0 зберігає завантажених персонажів як перешкоди; значення >0 дозволяє спробу проходу крізь них. Це не поріг витривалості: величини 1 і 1000 включають однаковий режим. Серверна заборона проходу залишається чинною.
  • У звичайному клієнтському host ці дані стану беруться з GetPersistentState менеджера та загальні для скриптів/чату/макросів одного світу/профілю, а не належать одному скрипту. Інший процес або явно окремий InjectionRuntimeState має інший стан. Завантаження/очищення профілю може його замінити; збережені serial все одно перевіряються по завантаженому світу.

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

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

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

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

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

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

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

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

  • Аргументів немає, стан не змінюється.
  • value – числове значення цієї настройки.
var value = UO.moveThroughNPC();
UO.Print(Convert.ToString(value));

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

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

  • value=0. Ціле >=0, негативне стає 0; позитивне дозволяє спробу. Явний avoidMobiles визначає зворотне обмеження для окремого дзвінка.
  • applied показує збережене значення, а чи не успішне досягнення мети.
return  RunScenario();
 object? RunScenario()
{
    var applied = UO.moveThroughNPC(0);
    UO.Print("Applied: " + Convert.ToString(applied));
    return null;
}

3. Застосувати на одну ділянку скрипта – клас сценарію

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

  • попередній зберігає початкове налаштування; NewMoveXY обмежено 3000 мс.
  • Остання команда відновлює налаштування після повернення.
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 previous = UO.moveThroughNPC();
        UO.moveThroughNPC(0);
        var ok = UO.NewMoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false, 0, 3000);
        UO.moveThroughNPC(previous);
        UO.Print(Convert.ToString(ok));
        return null;
    }
}

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

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

UO.moveThroughNPC() — UO.moveThroughNPC()

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

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

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

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

case "movethroughnpc": if (arguments.Length > 0) state.MoveThroughNpc = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveThroughNpc);

UO.moveThroughNPC(value) — UO.moveThroughNPC(Any)

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

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

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

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

case "movethroughnpc": if (arguments.Length > 0) state.MoveThroughNpc = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveThroughNpc);

UO.moveTurnCost

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

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

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

Додаткова вартість зміни напрямку під час пошуку шляху.

Параметри

  • value — необов'язкове нове значення. Ціле >=0, негативне стає 0. Це вага маршруту, не мілісекунди: прямий крок коштує 10, діагональний 14, а це добавка за поворот.

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

int — поточне збережене значення. Без аргументу лише читає; з аргументом повертає значення після застосування вище правил. Це налаштування, не результат руху.

Поведінка

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

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

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

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

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

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

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

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

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

  • Аргументів немає, стан не змінюється.
  • value – числове значення цієї настройки.
var value = UO.moveTurnCost();
UO.Print(Convert.ToString(value));

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

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

  • value=14. Ціле >=0, негативне стає 0. Це вага маршруту, не мілісекунди: прямий крок стоїть 10, діагональний 14а це добавка за поворот.
  • applied показує збережене значення, а чи не успішне досягнення мети.
return  RunScenario();
 object? RunScenario()
{
    var applied = UO.moveTurnCost(14);
    UO.Print("Applied: " + Convert.ToString(applied));
    return null;
}

3. Застосувати на одну ділянку скрипта – клас сценарію

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

  • попередній зберігає початкове налаштування; NewMoveXY обмежено 3000 мс.
  • Остання команда відновлює налаштування після повернення.
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 previous = UO.moveTurnCost();
        UO.moveTurnCost(14);
        var ok = UO.NewMoveXY(UO.GetX() + 2, UO.GetY(), true, 0, false, 0, 3000);
        UO.moveTurnCost(previous);
        UO.Print(Convert.ToString(ok));
        return null;
    }
}

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

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

UO.moveTurnCost() — UO.moveTurnCost()

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

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

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

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

case "moveturncost": if (arguments.Length > 0) state.MoveTurnCost = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveTurnCost);

UO.moveTurnCost(value) — UO.moveTurnCost(Any)

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

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

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

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

case "moveturncost": if (arguments.Length > 0) state.MoveTurnCost = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveTurnCost);

Clone this wiki locally