RU UO Topic movement Part 2 - LIHACHTETAN/ClassicUO-Bad-Newbie-CSharp-Scripts-IDE GitHub Wiki
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
Главная · C# · IDE · UO API · A–Z · Примеры · Языки
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
int UO.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/ненулевое число продолжает. Регистрация действует в текущем выполнении и освобождается вместе с ним.
Каждый пример можно сохранить отдельным файлом .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));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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;
}Параметры и ход выполнения:
- 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);
}Параметры и ход выполнения:
- 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.
Параметры: xdst (Any), ydst (Any), optimized (Any), accuracy (Any), running (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [NewMoveXY]. -
InjectionScript.Runtime.InjectionApiUO.CompactNewMoveXY:CompactNewMoveXY(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [NewMoveXY]. -
InjectionScript.Runtime.InjectionApiUO.CompactNewMoveXY:CompactNewMoveXY(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [NewMoveXY]. -
InjectionScript.Runtime.InjectionApiUO.CompactNewMoveXY:CompactNewMoveXY(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [NewMoveXY]. -
InjectionScript.Runtime.InjectionApiUO.CompactNewMoveXY:CompactNewMoveXY(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [NewMoveXY]. -
InjectionScript.Runtime.InjectionApiUO.CompactNewMoveXY:CompactNewMoveXY(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [NewMoveXY]. -
InjectionScript.Runtime.InjectionApiUO.CompactNewMoveXY:CompactNewMoveXY(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [NewMoveXY]. -
InjectionScript.Runtime.InjectionApiUO.CompactNewMoveXY:CompactNewMoveXY(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [NewMoveXY]. -
InjectionScript.Runtime.InjectionApiUO.CompactNewMoveXY:CompactNewMoveXY(values).
Вызов выполняет сохранённый 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.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [NewMoveXY]. -
InjectionScript.Runtime.InjectionApiUO.CompactNewMoveXY:CompactNewMoveXY(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactNewMoveXY(values))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.OpenDoor();Запрашивает открывание двери перед персонажем.
Параметров нет.
void — значения нет. Вызывайте отдельной строкой; завершение не подтверждает действие сервера.
- OpenDoor вызывает GameActions.OpenDoor через Invoke. Serial двери не принимается; поиск и правила открытия принадлежат GameActions/серверу.
- В примерах UO.Wait задаёт только паузу скрипта; окончание паузы не доказывает выполнение запроса сервером.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.OpenDoor");
UO.OpenDoor();Параметры и ход выполнения:
- Запрашивает открывание двери перед персонажем.
UO.OpenDoor();Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- В примерах 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.
Параметры: Параметров нет.
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteLegacyManualAlias. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.OpenDoor:bridge.OpenDoor().
Внутренний код реализации, не самостоятельный скрипт.
case "opendoor": bridge.OpenDoor(); break;PMove ожидает завершения обычного поиска пути. Форма X/Y проверяет точные X/Y, форма X/Y/Z также требует указанную высоту. Результат void; успех проверяйте по фактическим координатам. Для числового результата используйте NewMoveXY или MoveXYZ. Неявного ограничения 30 секунд нет.
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 реализует интерфейс с учётом очереди.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.PredictedDirection();
UO.Print("PredictedDirection: " + Convert.ToString(result));Параметры и ход выполнения:
- predicted сохраняет один вызов без аргументов; Convert.ToString форматирует число для журнала.
var predicted = UO.PredictedDirection();
UO.Print("Predicted: " + Convert.ToString(predicted));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ReadPredictedCoordinate:ReadPredictedCoordinate(3).
Внутренний код реализации, не самостоятельный скрипт.
case "predicteddirection": return new InjectionValue(ReadPredictedCoordinate(3));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 реализует интерфейс с учётом очереди.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.PredictedX();
UO.Print("PredictedX: " + Convert.ToString(result));Параметры и ход выполнения:
- predicted сохраняет один вызов без аргументов; Convert.ToString форматирует число для журнала.
var predicted = UO.PredictedX();
UO.Print("Predicted: " + Convert.ToString(predicted));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ReadPredictedCoordinate:ReadPredictedCoordinate(0).
Внутренний код реализации, не самостоятельный скрипт.
case "predictedx": return new InjectionValue(ReadPredictedCoordinate(0));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 реализует интерфейс с учётом очереди.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.PredictedY();
UO.Print("PredictedY: " + Convert.ToString(result));Параметры и ход выполнения:
- predicted сохраняет один вызов без аргументов; Convert.ToString форматирует число для журнала.
var predicted = UO.PredictedY();
UO.Print("Predicted: " + Convert.ToString(predicted));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ReadPredictedCoordinate:ReadPredictedCoordinate(1).
Внутренний код реализации, не самостоятельный скрипт.
case "predictedy": return new InjectionValue(ReadPredictedCoordinate(1));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 реализует интерфейс с учётом очереди.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.PredictedZ();
UO.Print("PredictedZ: " + Convert.ToString(result));Параметры и ход выполнения:
- predicted сохраняет один вызов без аргументов; Convert.ToString форматирует число для журнала.
var predicted = UO.PredictedZ();
UO.Print("Predicted: " + Convert.ToString(predicted));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ReadPredictedCoordinate:ReadPredictedCoordinate(2).
Внутренний код реализации, не самостоятельный скрипт.
case "predictedz": return new InjectionValue(ReadPredictedCoordinate(2));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetRunMountTimer(object? value);Задаёт интервал шага бега верхом. Используйте для намеренного замедления или возврата к стандартной скорости. Ускорить движение сверх стандартного темпа этой командой нельзя.
-
value— Обязательное целое число миллисекунд. Диапазон 100..2000; меньшие значения, включая 0 и отрицательные, поднимаются до 100, большие уменьшаются до 2000.
void — значения нет. Вызывайте отдельной строкой. Чтобы прочитать применённый интервал, используйте UO.GetRunMountTimer(). Это не подтверждение шага сервером.
- Настройка относится к режиму бега верхом. Стандартное и минимально разрешённое значение — 100 мс; верхняя граница — 2000 мс. Остальные три режима имеют отдельные настройки.
- Это локальный интервал движения персонажа, а не ping, FPS, тайм-аут поиска пути или измеренная длительность серверного шага. Увеличение числа замедляет движение; уменьшение ниже стандартного интервала не ускоряет отправку пакетов.
- Команда сама не начинает движение, не садится на ездовое животное и не меняет режим ходьбы/бега. Режим выбирается при движении; заданный сервером режим скорости и полёт также учитываются клиентом.
- Настройка общая для движения этого клиента: её могут использовать ручное управление, маршрут карты и другие скрипты. Временно меняя её, сохраните прежнее значение и восстановите после операции; не меняйте один режим одновременно из нескольких процедур.
- Поворот и отклонённый шаг отличаются от обычного перемещения. Серверное подтверждение, задержки связи и препятствия могут увеличить фактическое время. Клиент не отправляет серию ускоренных шагов, чтобы догнать пропущенные кадры.
- В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.SetRunMountTimer");
UO.SetRunMountTimer(100);Параметры и ход выполнения:
- Value=100 — миллисекунды. Вызов настраивает последующее движение, но не начинает маршрут.
UO.SetRunMountTimer(100);Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- После 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.
Параметры: value (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ClampMoveTimer:ClampMoveTimer(Arg(0), 100). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetMovementTimers:bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer).
Внутренний код реализации, не самостоятельный скрипт.
case "setrunmounttimer":
state.RunMountTimer = ClampMoveTimer(Arg(0), 100);
bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer);
return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetRunUnmountTimer(object? value);Задаёт интервал шага бега пешком. Используйте для намеренного замедления или возврата к стандартной скорости. Ускорить движение сверх стандартного темпа этой командой нельзя.
-
value— Обязательное целое число миллисекунд. Диапазон 200..2000; меньшие значения, включая 0 и отрицательные, поднимаются до 200, большие уменьшаются до 2000.
void — значения нет. Вызывайте отдельной строкой. Чтобы прочитать применённый интервал, используйте UO.GetRunUnmountTimer(). Это не подтверждение шага сервером.
- Настройка относится к режиму бега пешком. Стандартное и минимально разрешённое значение — 200 мс; верхняя граница — 2000 мс. Остальные три режима имеют отдельные настройки.
- Это локальный интервал движения персонажа, а не ping, FPS, тайм-аут поиска пути или измеренная длительность серверного шага. Увеличение числа замедляет движение; уменьшение ниже стандартного интервала не ускоряет отправку пакетов.
- Команда сама не начинает движение, не садится на ездовое животное и не меняет режим ходьбы/бега. Режим выбирается при движении; заданный сервером режим скорости и полёт также учитываются клиентом.
- Настройка общая для движения этого клиента: её могут использовать ручное управление, маршрут карты и другие скрипты. Временно меняя её, сохраните прежнее значение и восстановите после операции; не меняйте один режим одновременно из нескольких процедур.
- Поворот и отклонённый шаг отличаются от обычного перемещения. Серверное подтверждение, задержки связи и препятствия могут увеличить фактическое время. Клиент не отправляет серию ускоренных шагов, чтобы догнать пропущенные кадры.
- В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.SetRunUnmountTimer");
UO.SetRunUnmountTimer(200);Параметры и ход выполнения:
- Value=200 — миллисекунды. Вызов настраивает последующее движение, но не начинает маршрут.
UO.SetRunUnmountTimer(200);Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- После 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.
Параметры: value (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ClampMoveTimer:ClampMoveTimer(Arg(0), 200). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetMovementTimers:bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer).
Внутренний код реализации, не самостоятельный скрипт.
case "setrununmounttimer":
state.RunUnmountTimer = ClampMoveTimer(Arg(0), 200);
bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer);
return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetWalkMountTimer(object? value);Задаёт интервал шага ходьбы верхом. Используйте для намеренного замедления или возврата к стандартной скорости. Ускорить движение сверх стандартного темпа этой командой нельзя.
-
value— Обязательное целое число миллисекунд. Диапазон 200..2000; меньшие значения, включая 0 и отрицательные, поднимаются до 200, большие уменьшаются до 2000.
void — значения нет. Вызывайте отдельной строкой. Чтобы прочитать применённый интервал, используйте UO.GetWalkMountTimer(). Это не подтверждение шага сервером.
- Настройка относится к режиму ходьбы верхом. Стандартное и минимально разрешённое значение — 200 мс; верхняя граница — 2000 мс. Остальные три режима имеют отдельные настройки.
- Это локальный интервал движения персонажа, а не ping, FPS, тайм-аут поиска пути или измеренная длительность серверного шага. Увеличение числа замедляет движение; уменьшение ниже стандартного интервала не ускоряет отправку пакетов.
- Команда сама не начинает движение, не садится на ездовое животное и не меняет режим ходьбы/бега. Режим выбирается при движении; заданный сервером режим скорости и полёт также учитываются клиентом.
- Настройка общая для движения этого клиента: её могут использовать ручное управление, маршрут карты и другие скрипты. Временно меняя её, сохраните прежнее значение и восстановите после операции; не меняйте один режим одновременно из нескольких процедур.
- Поворот и отклонённый шаг отличаются от обычного перемещения. Серверное подтверждение, задержки связи и препятствия могут увеличить фактическое время. Клиент не отправляет серию ускоренных шагов, чтобы догнать пропущенные кадры.
- В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.SetWalkMountTimer");
UO.SetWalkMountTimer(200);Параметры и ход выполнения:
- Value=200 — миллисекунды. Вызов настраивает последующее движение, но не начинает маршрут.
UO.SetWalkMountTimer(200);Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- После 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.
Параметры: value (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ClampMoveTimer:ClampMoveTimer(Arg(0), 200). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetMovementTimers:bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer).
Внутренний код реализации, не самостоятельный скрипт.
case "setwalkmounttimer":
state.WalkMountTimer = ClampMoveTimer(Arg(0), 200);
bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer);
return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
void UO.SetWalkUnmountTimer(object? value);Задаёт интервал шага ходьбы пешком. Используйте для намеренного замедления или возврата к стандартной скорости. Ускорить движение сверх стандартного темпа этой командой нельзя.
-
value— Обязательное целое число миллисекунд. Диапазон 400..2000; меньшие значения, включая 0 и отрицательные, поднимаются до 400, большие уменьшаются до 2000.
void — значения нет. Вызывайте отдельной строкой. Чтобы прочитать применённый интервал, используйте UO.GetWalkUnmountTimer(). Это не подтверждение шага сервером.
- Настройка относится к режиму ходьбы пешком. Стандартное и минимально разрешённое значение — 400 мс; верхняя граница — 2000 мс. Остальные три режима имеют отдельные настройки.
- Это локальный интервал движения персонажа, а не ping, FPS, тайм-аут поиска пути или измеренная длительность серверного шага. Увеличение числа замедляет движение; уменьшение ниже стандартного интервала не ускоряет отправку пакетов.
- Команда сама не начинает движение, не садится на ездовое животное и не меняет режим ходьбы/бега. Режим выбирается при движении; заданный сервером режим скорости и полёт также учитываются клиентом.
- Настройка общая для движения этого клиента: её могут использовать ручное управление, маршрут карты и другие скрипты. Временно меняя её, сохраните прежнее значение и восстановите после операции; не меняйте один режим одновременно из нескольких процедур.
- Поворот и отклонённый шаг отличаются от обычного перемещения. Серверное подтверждение, задержки связи и препятствия могут увеличить фактическое время. Клиент не отправляет серию ускоренных шагов, чтобы догнать пропущенные кадры.
- В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Команда вызывается отдельной строкой. Сообщение перед ней показывает начало вызова, а не подтверждение действия сервера.
UO.Print("Calling UO.SetWalkUnmountTimer");
UO.SetWalkUnmountTimer(400);Параметры и ход выполнения:
- Value=400 — миллисекунды. Вызов настраивает последующее движение, но не начинает маршрут.
UO.SetWalkUnmountTimer(400);Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- После 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.
Параметры: value (Any)
Результат: void / Unit.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ClampMoveTimer:ClampMoveTimer(Arg(0), 400). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.SetMovementTimers:bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer).
Внутренний код реализации, не самостоятельный скрипт.
case "setwalkunmounttimer":
state.WalkUnmountTimer = ClampMoveTimer(Arg(0), 400);
bridge.SetMovementTimers(state.RunMountTimer, state.RunUnmountTimer, state.WalkMountTimer, state.WalkUnmountTimer);
return InjectionValue.Unit;Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 прекращает ожидание общим отказом. Подтверждение другой очередной команды не подтверждает этот шаг. Поворот без перемещения остаётся отдельным случаем.
Каждый пример можно сохранить отдельным файлом .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));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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.
Параметры: direction (Any), running (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.IsOnline:bridge.IsOnline(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.OpenDoor:bridge.OpenDoor(). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Step:bridge.Step(Arg(0) & 7, Arg(1) != 0). -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0). -
ClassicUO.Game.Managers.ClassicUOInjectionApiBridge.Stamina:bridge.Stamina.
Внутренний код реализации, не самостоятельный скрипт.
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));Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
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 прекращает ожидание общим отказом. Подтверждение другой очередной команды не подтверждает этот шаг. Поворот без перемещения остаётся отдельным случаем.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
var result = UO.StepQ(2, false);
UO.Print("StepQ: " + Convert.ToString(result));Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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;Параметры и ход выполнения:
- 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.
Параметры: direction (Any), run (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [StepQ]. -
InjectionScript.Runtime.InjectionApiUO.CompactStepQ:CompactStepQ(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactStepQ(values))Параметры: direction (Any), run (Any), timeout (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [StepQ]. -
InjectionScript.Runtime.InjectionApiUO.CompactStepQ:CompactStepQ(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactStepQ(values))Параметры: direction (Any), run (Any), timeout (Any), queue (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [StepQ]. -
InjectionScript.Runtime.InjectionApiUO.CompactStepQ:CompactStepQ(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactStepQ(values))Параметры: direction (Any), run (Any), timeout (Any), queue (Any), waitForAck (Any)
Результат: int / Integer.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.Register [StepQ]. -
InjectionScript.Runtime.InjectionApiUO.CompactStepQ:CompactStepQ(values).
Вызов выполняет сохранённый delegate обработчика. Метод регистрации создаёт этот delegate при построении API.
Внутренний код реализации, не самостоятельный скрипт.
values => new InjectionValue(CompactStepQ(values))Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.moveBetweenTwoCorners();
dynamic UO.moveBetweenTwoCorners(object? value);Разрешение диагонали при двух заблокированных боковых клетках.
-
value— Необязательное новое значение. 0 запрещает, ненулевое становится 1. Сервер может отвергнуть такой проход независимо от клиентской настройки.
int — текущее сохранённое значение. Без аргумента только читает; с аргументом возвращает значение после применения правил выше. Это настройка, не результат движения.
- Настройка хранится в состоянии runtime и используется соответствующими командами при запуске; изменение не переписывает уже построенный путь автоматически.
- Возврат исходного значения показан для обычного завершения. После аварийной остановки следующие строки восстановления не выполняются.
- В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.moveBetweenTwoCorners();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Аргументов нет, состояние не меняется.
- value — числовое значение этой настройки.
var value = UO.moveBetweenTwoCorners();
UO.Print(Convert.ToString(value));Параметры и ход выполнения:
- value=0. 0 запрещает, ненулевое становится 1. Сервер может отвергнуть такой проход независимо от клиентской настройки.
- applied показывает сохранённое значение, а не успешное достижение цели.
return RunScenario();
object? RunScenario()
{
var applied = UO.moveBetweenTwoCorners(0);
UO.Print("Applied: " + Convert.ToString(applied));
return null;
}Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "movebetweentwocorners":
if (arguments.Length > 0) state.MoveBetweenTwoCorners = Arg(0) != 0 ? 1 : 0;
return new InjectionValue(state.MoveBetweenTwoCorners);Параметры: value (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "movebetweentwocorners":
if (arguments.Length > 0) state.MoveBetweenTwoCorners = Arg(0) != 0 ? 1 : 0;
return new InjectionValue(state.MoveBetweenTwoCorners);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.moveCheckStamina();
dynamic UO.moveCheckStamina(object? value);Минимальная выносливость для команд движения.
-
value— Необязательное новое значение. Целое >=0; отрицательное становится 0. Ноль выключает проверку порога.
int — текущее сохранённое значение. Без аргумента только читает; с аргументом возвращает значение после применения правил выше. Это настройка, не результат движения.
- Настройка хранится в состоянии runtime и используется соответствующими командами при запуске; изменение не переписывает уже построенный путь автоматически.
- Возврат исходного значения показан для обычного завершения. После аварийной остановки следующие строки восстановления не выполняются.
- По умолчанию 1. Значение 0 отключает эту локальную проверку; положительное задаёт минимальную выносливость. Ниже порога запуск отклоняется или движение останавливается, а не ждёт восстановления выносливости.
- В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.moveCheckStamina();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Аргументов нет, состояние не меняется.
- value — числовое значение этой настройки.
var value = UO.moveCheckStamina();
UO.Print(Convert.ToString(value));Параметры и ход выполнения:
- value=15. Целое >=0; отрицательное становится 0. Ноль выключает проверку порога.
- applied показывает сохранённое значение, а не успешное достижение цели.
return RunScenario();
object? RunScenario()
{
var applied = UO.moveCheckStamina(15);
UO.Print("Applied: " + Convert.ToString(applied));
return null;
}Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "movecheckstamina": if (arguments.Length > 0) state.MoveCheckStamina = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveCheckStamina);Параметры: value (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "movecheckstamina": if (arguments.Length > 0) state.MoveCheckStamina = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveCheckStamina);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.moveExitOnDisconnect();
dynamic UO.moveExitOnDisconnect(object? value);Прекращение/отказ движения при отключённом соединении.
-
value— Необязательное новое значение. 0 выключает, ненулевое становится 1. Отключение проверки не позволяет двигаться на сервере без соединения.
int — текущее сохранённое значение. Без аргумента только читает; с аргументом возвращает значение после применения правил выше. Это настройка, не результат движения.
- Настройка хранится в состоянии runtime и используется соответствующими командами при запуске; изменение не переписывает уже построенный путь автоматически.
- Возврат исходного значения показан для обычного завершения. После аварийной остановки следующие строки восстановления не выполняются.
- В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.moveExitOnDisconnect();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Аргументов нет, состояние не меняется.
- value — числовое значение этой настройки.
var value = UO.moveExitOnDisconnect();
UO.Print(Convert.ToString(value));Параметры и ход выполнения:
- value=1. 0 выключает, ненулевое становится 1. Отключение проверки не позволяет двигаться на сервере без соединения.
- applied показывает сохранённое значение, а не успешное достижение цели.
return RunScenario();
object? RunScenario()
{
var applied = UO.moveExitOnDisconnect(1);
UO.Print("Applied: " + Convert.ToString(applied));
return null;
}Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "moveexitondisconnect": if (arguments.Length > 0) state.MoveExitOnDisconnect = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveExitOnDisconnect);Параметры: value (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "moveexitondisconnect": if (arguments.Length > 0) state.MoveExitOnDisconnect = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveExitOnDisconnect);В новом контексте скрипта 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 · 繁體中文 · 日本語 · 한국어
dynamic UO.moveHeuristicMult();
dynamic UO.moveHeuristicMult(object? value);Множитель эвристики Pathfinder в процентах.
-
value— Необязательное новое значение. Целое >=0 сохраняется; перед поиском минимум 1. Значение 100 соответствует обычной оценке; >100 может предпочесть более быстрый поиск без гарантии минимальной стоимости. При Optimized=false используется 1.
int — текущее сохранённое значение. Без аргумента только читает; с аргументом возвращает значение после применения правил выше. Это настройка, не результат движения.
- Настройка хранится в состоянии runtime и используется соответствующими командами при запуске; изменение не переписывает уже построенный путь автоматически.
- Возврат исходного значения показан для обычного завершения. После аварийной остановки следующие строки восстановления не выполняются.
- В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.moveHeuristicMult();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Аргументов нет, состояние не меняется.
- value — числовое значение этой настройки.
var value = UO.moveHeuristicMult();
UO.Print(Convert.ToString(value));Параметры и ход выполнения:
- 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;
}Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "moveheuristicmult": if (arguments.Length > 0) state.MoveHeuristicMultiplier = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveHeuristicMultiplier);Параметры: value (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "moveheuristicmult": if (arguments.Length > 0) state.MoveHeuristicMultiplier = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveHeuristicMultiplier);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.moveOpenDoor();
dynamic UO.moveOpenDoor(object? value);Попытки открыть двери по ходу движения.
-
value— Необязательное новое значение. 0 выключает, ненулевое становится 1. Явный openDoors в NewMoveXY/MoveXYZ заменяет этот флаг на время вызова.
int — текущее сохранённое значение. Без аргумента только читает; с аргументом возвращает значение после применения правил выше. Это настройка, не результат движения.
- Настройка хранится в состоянии runtime и используется соответствующими командами при запуске; изменение не переписывает уже построенный путь автоматически.
- Возврат исходного значения показан для обычного завершения. После аварийной остановки следующие строки восстановления не выполняются.
- По умолчанию 0. При 1 клетки дверей считаются проходимыми во время A*; попытка открыть конкретную соседнюю дверь выполняется перед шагом. При отсутствии известного объекта двери используется запрос OpenDoor.
- Этот флаг сам не закрывает дверь. Закрывание открытой персонажем двери выполняется отдельной настройкой клиента; запертая дверь или серверный запрет могут сорвать маршрут.
- В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.moveOpenDoor();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Аргументов нет, состояние не меняется.
- value — числовое значение этой настройки.
var value = UO.moveOpenDoor();
UO.Print(Convert.ToString(value));Параметры и ход выполнения:
- 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;
}Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "moveopendoor": if (arguments.Length > 0) state.MoveOpenDoor = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveOpenDoor);Параметры: value (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "moveopendoor": if (arguments.Length > 0) state.MoveOpenDoor = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveOpenDoor);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.moveThroughCorner();
dynamic UO.moveThroughCorner(object? value);Разрешение диагонали между клетками при одной заблокированной боковой клетке.
-
value— Необязательное новое значение. 0 запрещает, ненулевое становится 1. Если обе боковые клетки заблокированы, применяется moveBetweenTwoCorners.
int — текущее сохранённое значение. Без аргумента только читает; с аргументом возвращает значение после применения правил выше. Это настройка, не результат движения.
- Настройка хранится в состоянии runtime и используется соответствующими командами при запуске; изменение не переписывает уже построенный путь автоматически.
- Возврат исходного значения показан для обычного завершения. После аварийной остановки следующие строки восстановления не выполняются.
- В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.moveThroughCorner();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Аргументов нет, состояние не меняется.
- value — числовое значение этой настройки.
var value = UO.moveThroughCorner();
UO.Print(Convert.ToString(value));Параметры и ход выполнения:
- value=0. 0 запрещает, ненулевое становится 1. Если обе боковые клетки заблокированы, применяется moveBetweenTwoCorners.
- applied показывает сохранённое значение, а не успешное достижение цели.
return RunScenario();
object? RunScenario()
{
var applied = UO.moveThroughCorner(0);
UO.Print("Applied: " + Convert.ToString(applied));
return null;
}Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "movethroughcorner": if (arguments.Length > 0) state.MoveThroughCorner = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveThroughCorner);Параметры: value (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "movethroughcorner": if (arguments.Length > 0) state.MoveThroughCorner = Arg(0) != 0 ? 1 : 0; return new InjectionValue(state.MoveThroughCorner);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.moveThroughNPC();
dynamic UO.moveThroughNPC(object? value);Разрешение попытки прохода сквозь персонажей.
- Числовой порог выносливости: попытка пройти через персонажа разрешена при текущей Stamina >= порога. Начальное значение 1000; 0 разрешает попытку независимо от выносливости. Сервер может запретить проход.
int — текущее сохранённое значение. Без аргумента только читает; с аргументом возвращает значение после применения правил выше. Это настройка, не результат движения.
- Настройка хранится в состоянии runtime и используется соответствующими командами при запуске; изменение не переписывает уже построенный путь автоматически.
- Возврат исходного значения показан для обычного завершения. После аварийной остановки следующие строки восстановления не выполняются.
- Числовой порог выносливости: попытка пройти через персонажа разрешена при текущей Stamina >= порога. Начальное значение 1000; 0 разрешает попытку независимо от выносливости. Сервер может запретить проход.
- В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.moveThroughNPC();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Аргументов нет, состояние не меняется.
- value — числовое значение этой настройки.
var value = UO.moveThroughNPC();
UO.Print(Convert.ToString(value));Параметры и ход выполнения:
- value=0. Целое >=0, отрицательное становится 0; положительное разрешает попытку. Явный avoidMobiles задаёт обратное ограничение для отдельного вызова.
- applied показывает сохранённое значение, а не успешное достижение цели.
return RunScenario();
object? RunScenario()
{
var applied = UO.moveThroughNPC(0);
UO.Print("Applied: " + Convert.ToString(applied));
return null;
}Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "movethroughnpc": if (arguments.Length > 0) state.MoveThroughNpc = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveThroughNpc);Параметры: value (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "movethroughnpc": if (arguments.Length > 0) state.MoveThroughNpc = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveThroughNpc);Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
dynamic UO.moveTurnCost();
dynamic UO.moveTurnCost(object? value);Дополнительная стоимость изменения направления при поиске пути.
-
value— Необязательное новое значение. Целое >=0, отрицательное становится 0. Это вес маршрута, не миллисекунды: прямой шаг стоит 10, диагональный 14, а это добавка за поворот.
int — текущее сохранённое значение. Без аргумента только читает; с аргументом возвращает значение после применения правил выше. Это настройка, не результат движения.
- Настройка хранится в состоянии runtime и используется соответствующими командами при запуске; изменение не переписывает уже построенный путь автоматически.
- Возврат исходного значения показан для обычного завершения. После аварийной остановки следующие строки восстановления не выполняются.
- В обычном клиентском host эти данные состояния берутся из GetPersistentState менеджера и общие для скриптов/чата/макросов одного мира/профиля, а не принадлежат одному скрипту. Другой процесс или явно отдельный InjectionRuntimeState имеет другое состояние. Загрузка/очистка профиля может его заменить; сохранённые serial всё равно проверяются по загруженному миру.
Каждый пример можно сохранить отдельным файлом .csx и запускать в IDE. Объект UO и функции ожидания предоставляет host текущей игровой сессии. Демонстрационные serial, имена, координаты и адреса замените своими.
Выполните этот код как отдельный файл .csx. Аргументы видны прямо в вызове; демонстрационные имена, serial и адреса замените своими.
Результат одного вызова выводится в журнал. Число не преобразуется в bool; для массива показано количество элементов.
object? result = UO.moveTurnCost();
UO.Print(result is Array values ? "Count: " + values.Length : Convert.ToString(result));Параметры и ход выполнения:
- Аргументов нет, состояние не меняется.
- value — числовое значение этой настройки.
var value = UO.moveTurnCost();
UO.Print(Convert.ToString(value));Параметры и ход выполнения:
- value=14. Целое >=0, отрицательное становится 0. Это вес маршрута, не миллисекунды: прямой шаг стоит 10, диагональный 14, а это добавка за поворот.
- applied показывает сохранённое значение, а не успешное достижение цели.
return RunScenario();
object? RunScenario()
{
var applied = UO.moveTurnCost(14);
UO.Print("Applied: " + Convert.ToString(applied));
return null;
}Параметры и ход выполнения:
- 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.
Параметры: Параметров нет.
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
case "moveturncost": if (arguments.Length > 0) state.MoveTurnCost = Math.Max(0, Arg(0)); return new InjectionValue(state.MoveTurnCost);Параметры: value (Any)
Результат: dynamic / Any.
При вызове:
-
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility. -
InjectionScript.Runtime.InjectionApiUO.ExecuteClientApiCompatibility::Arg:Arg(0).
Внутренний код реализации, не самостоятельный скрипт.
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.