RU UO Topic movement Part 2 - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki

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

Движение — 2

Главная · C# · IDE · UO API · A–Z · Примеры · Языки

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

1 · 2

Полное описание команд


UO.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 при запуске маршрута. Они сохраняются при его внутреннем перерасчёте. Изменение или очистка списков влияет на следующий маршрут, а не переписывает уже выполняющийся.
  • Дальность задаёт UO.LimitMove: по умолчанию 2000, 0 — без предела. Скрытых границ 4096 шагов/узлов и 10000 узлов нет. Работа разбита на порции с возможностью Stop. GetPathArray учитывает числовой порог moveThroughNPC и настройку moveOpenDoor.
  • 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 мс, только по отклонённому перемещению соответствующего активного запроса. Поворот, неизвестный sequence, ресинхронизация и старый/чужой запрос не создают такой запрет. Новый внешний запрос и потеря контекста карты/игрока очищают их. Поиск по загруженной геометрии пытается обойти переход; это не знание всех серверных препятствий. Без изменения 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

PMove ожидает завершения обычного поиска пути. Форма X/Y проверяет точные X/Y, форма X/Y/Z также требует указанную высоту. Результат void; успех проверяйте по фактическим координатам. Для числового результата используйте NewMoveXY или MoveXYZ. Неявного ограничения 30 секунд нет.

UO.PMove

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. Координаты считываются до и после вызова.
  • Неизменная позиция возможна при повороте или отказе, поэтому result нужен отдельно.
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. Применить на один участок скрипта — класс сценария

Параметры и ход выполнения:

  • previous хранит исходную настройку; 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. Применить на один участок скрипта — класс сценария

Параметры и ход выполнения:

  • previous хранит исходную настройку; 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. Применить на один участок скрипта — класс сценария

Параметры и ход выполнения:

  • previous хранит исходную настройку; 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

Начальные настройки поиска пути

В новом контексте скрипта UO.moveHeuristicMult() равен 120, а UO.moveTurnCost() — 14. Явное значение, заданное скриптом, сохраняется для его следующих команд движения. Множитель 100 означает обычную оценку расстояния с диагоналями; больший множитель обычно ускоряет поиск, но не гарантирует кратчайшего пути. Меньшее значение может значительно увеличить время расчёта. Стоимость поворота 0 отключает дополнительный штраф за смену направления. Это настройки поиска пути, а не скорости персонажа или ограничения UO.LimitMove.

int previousHeuristic = (int)UO.moveHeuristicMult();
int previousTurnCost = (int)UO.moveTurnCost();
try
{
    UO.moveHeuristicMult(120);
    UO.moveTurnCost(14);
    UO.Print($"Heuristic: {UO.moveHeuristicMult()}, turn cost: {UO.moveTurnCost()}");
}
finally
{
    UO.moveHeuristicMult(previousHeuristic);
    UO.moveTurnCost(previousTurnCost);
}

Українська · Русский · 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. Применить на один участок скрипта — класс сценария

Параметры и ход выполнения:

  • previous хранит исходную настройку; 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. Применить на один участок скрипта — класс сценария

Параметры и ход выполнения:

  • previous хранит исходную настройку; 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. Применить на один участок скрипта — класс сценария

Параметры и ход выполнения:

  • previous хранит исходную настройку; 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);

Разрешение попытки прохода сквозь персонажей.

Параметры

  • Числовой порог выносливости: попытка пройти через персонажа разрешена при текущей Stamina >= порога. Начальное значение 1000; 0 разрешает попытку независимо от выносливости. Сервер может запретить проход.

Возвращает

int — текущее сохранённое значение. Без аргумента только читает; с аргументом возвращает значение после применения правил выше. Это настройка, не результат движения.

Поведение

  • Настройка хранится в состоянии runtime и используется соответствующими командами при запуске; изменение не переписывает уже построенный путь автоматически.
  • Возврат исходного значения показан для обычного завершения. После аварийной остановки следующие строки восстановления не выполняются.
  • Числовой порог выносливости: попытка пройти через персонажа разрешена при текущей Stamina >= порога. Начальное значение 1000; 0 разрешает попытку независимо от выносливости. Сервер может запретить проход.
  • В обычном клиентском 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. Применить на один участок скрипта — класс сценария

Параметры и ход выполнения:

  • previous хранит исходную настройку; 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. Применить на один участок скрипта — класс сценария

Параметры и ход выполнения:

  • previous хранит исходную настройку; 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);

UO.LimitMove — Предел дальности движения. Дальность задаёт UO.LimitMove: по умолчанию 2000, 0 — без предела. Скрытых границ 4096 шагов/узлов и 10000 узлов нет. Работа разбита на порции с возможностью Stop. GetPathArray учитывает числовой порог moveThroughNPC и настройку moveOpenDoor.

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