API laststatus - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

laststatus

Оглавление · Алфавитный указатель · Именованные параметры

ClassicUO • Runtime API • laststatus.md

Точный синтаксис / Registered signatures

laststatus -> Any (runtime value)
'laststatus' — named object alias resolved from current client state

Порядок аргументов соответствует строкам выше. Unit означает отсутствие возвращаемого значения. Any — значение BASIC с преобразованием при вызове. Имена нечувствительны к регистру.

UO.LastStatus

ClassicUO • Runtime API

Возвращает serial последнего объекта, для которого клиент принял статус.

Точный синтаксис

UO.LastStatus() -> Integer

Выберите одну из зарегистрированных форм. Параметры передаются позиционно. Any означает значение BASIC с преобразованием внутри команды; Unit — отсутствие возвращаемого значения.

Параметры

Параметров нет.

Возвращает

Integer — 32 бита serial, не type и не логический результат. 0: ещё нет принятого статуса либо мир очищен. Старший бит сохраняется; отрицательное число тоже может представлять serial. Проверяйте <> 0, а не > 0 и не = TRUE.

Поведение

  • Без параметров. Чтение не отправляет пакеты, не открывает окно и не ждёт ответа. UO.GetStatus(id), RequestStats и UpdateObject лишь запрашивают данные: отправка не меняет LastStatus.
  • Принятый пакет 0x11 сохраняет serial и известные клиенту X/Y вместе в World для всех скриптов. Неизвестный/уничтоженный объект и неполный базовый пакет не заменяют запись. Последующие пакеты других объектов могут её заменить.
  • X/Y — снимок Entity на момент получения, а не текущая позиция. Для mobile это мировые клетки; для предмета внутри контейнера это могут быть координаты содержимого. Пакет статуса сам не передаёт X/Y. Перемещение/удаление объекта после приёма не меняет снимок; World.Clear сбрасывает его. Для текущих координат существующего объекта используйте GetX/GetY.
  • Отдельные вызовы не образуют атомарный снимок; сервер может обновить запись между ними. Равенство serial не доказывает новый ответ именно на ваш запрос. laststatus без скобок — живое встроенное значение, если скрипт не переопределил его переменной; UO.LastStatus() — зарегистрированная функция.

Внутренние функции: от вызова до результата

Ниже реальные внутренние C#-этапы. ReadSavedStatus — полностью определённая вспомогательная функция примера, а не скрытая встроенная команда.

1. CharacterStatus

CharacterStatus проверяет базовый пакет и наличие Entity через World.Get, обновляет поля статуса и сохраняет serial/X/Y. Позиция копируется из Entity, не из байтов статуса.

Integer — 32 бита serial, не type и не логический результат. 0: ещё нет принятого статуса либо мир очищен. Старший бит сохраняется; отрицательное число тоже может представлять serial. Проверяйте <> 0, а не > 0 и не = TRUE.

Исходник проекта: src/ClassicUO.Client/Network/PacketHandlers.cs; функция CharacterStatus.

2. ExecuteStealthCompatibility

ExecuteStealthCompatibility возвращает serial bridge в Integer. LastStatusX/LastStatusY используют IStatusSnapshotBridge для сохранённых координат; старый сторонний bridge без этого интерфейса сохраняет прежнее чтение GetX/GetY.

Integer — 32 бита serial, не type и не логический результат. 0: ещё нет принятого статуса либо мир очищен. Старший бит сохраняется; отрицательное число тоже может представлять serial. Проверяйте <> 0, а не > 0 и не = TRUE.

Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.cs; функция ExecuteStealthCompatibility.

3. Invoke

Invoke выполняет чтение World на игровом потоке с учётом отмены скрипта. Нет ожидания сетевого ответа или изменения статуса.

Без параметров. Чтение не отправляет пакеты, не открывает окно и не ждёт ответа. UO.GetStatus(id), RequestStats и UpdateObject лишь запрашивают данные: отправка не меняет LastStatus.

Исходник проекта: src/ClassicUO.Client/Game/Managers/ClassicUOInjectionApiBridge.cs; функция Invoke.

4. Clear

Clear сбрасывает serial и обе координаты в 0, включая очистку с сохранением работающих скриптов.

X/Y — снимок Entity на момент получения, а не текущая позиция. Для mobile это мировые клетки; для предмета внутри контейнера это могут быть координаты содержимого. Пакет статуса сам не передаёт X/Y. Перемещение/удаление объекта после приёма не меняет снимок; World.Clear сбрасывает его. Для текущих координат существующего объекта используйте GetX/GetY.

Исходник проекта: src/ClassicUO.Client/Game/World.cs; функция Clear.

Отдельные вызовы не образуют атомарный снимок; сервер может обновить запись между ними. Равенство serial не доказывает новый ответ именно на ваш запрос. laststatus без скобок — живое встроенное значение, если скрипт не переопределил его переменной; UO.LastStatus() — зарегистрированная функция.

Примеры

Пример 1. Прочитать последнее значение

# Прочитать последнее значение
#
# Возвращает serial последнего объекта, для которого клиент принял статус.
#
# Integer32 бита serial, не type и не логический результат. 0: ещё нет принятого статуса либо
# мир очищен. Старший бит сохраняется; отрицательное число тоже может представлять serial.
# Проверяйте <> 0, а не > 0 и не = TRUE.

SUB Main()
    # Значение читается один раз. Для serial HEX сохраняет удобную шестнадцатеричную запись; для
    # координаты CStr выводит число. Вызов не выбирает объект.

    VAR value = UO.LastStatus()
    UO.Print('Saved value: ' + HEX(value))
END SUB

Разбор параметров и выполнения:

  • Значение читается один раз. Для serial HEX сохраняет удобную шестнадцатеричную запись; для координаты CStr выводит число. Вызов не выбирает объект.

Пример 2. Запросить статус и прочитать известные данные

# Запросить статус и прочитать известные данные
#
# Возвращает serial последнего объекта, для которого клиент принял статус.
#
# Integer32 бита serial, не type и не логический результат. 0: ещё нет принятого статуса либо
# мир очищен. Старший бит сохраняется; отрицательное число тоже может представлять serial.
# Проверяйте <> 0, а не > 0 и не = TRUE.

SUB Main()
    # subjectserial self. 500пауза в миллисекундах, выбранная только для примера. Она не
    # гарантирует ответа: показана текущая запись, которая могла остаться старой или принадлежать
    # другому объекту.

    VAR subject = UO.Self()
    IF subject <> 0 THEN
        UO.GetStatus(subject)
        WAIT(500)
        VAR value = UO.LastStatus()
        UO.Print('Known value: ' + HEX(value))
    END IF
END SUB

Разбор параметров и выполнения:

  • subject — serial self. 500 — пауза в миллисекундах, выбранная только для примера. Она не гарантирует ответа: показана текущая запись, которая могла остаться старой или принадлежать другому объекту.

Пример 3. Полный помощник ReadSavedStatus

# Полный помощник ReadSavedStatus
#
# Возвращает serial последнего объекта, для которого клиент принял статус.
#
# Integer32 бита serial, не type и не логический результат. 0: ещё нет принятого статуса либо
# мир очищен. Старший бит сохраняется; отрицательное число тоже может представлять serial.
# Проверяйте <> 0, а не > 0 и не = TRUE.

SUB Main()
    # expectedIdserial, сохранённый в Main. Помощник полностью определён ниже; -1 означает, что
    # выбранной записи уже нет, и не является результатом самой команды. Проверка до/после снижает
    # риск смешения объектов, но не гарантирует атомарность при обновлениях того же serial.

    VAR expectedId = UO.LastStatus()
    IF expectedId <> 0 THEN
        VAR value = ReadSavedStatus(expectedId)
        UO.Print('Checked value: ' + CStr(value))
    END IF
END SUB

SUB ReadSavedStatus(expectedId)
    IF expectedId = 0 OR UO.LastStatus() <> expectedId THEN
        RETURN -1
    END IF
    VAR value = UO.LastStatus()
    IF UO.LastStatus() <> expectedId THEN
        RETURN -1
    END IF
    RETURN value
END SUB

Разбор параметров и выполнения:

  • expectedId — serial, сохранённый в Main. Помощник полностью определён ниже; -1 означает, что выбранной записи уже нет, и не является результатом самой команды. Проверка до/после снижает риск смешения объектов, но не гарантирует атомарность при обновлениях того же serial.

Варианты использования

Это отдельные сценарии. Подставьте свои serial, пути и координаты; серверные действия зависят от текущего состояния игры.

Чтение значения

SUB Main()
    VAR value = 'laststatus'
    UO.Print(CStr(value))
END SUB

Использование в процедуре

SUB ShowValue()
    VAR value = 'laststatus'
    UO.Print(CStr(value))
END SUB

SUB Main()
    ShowValue()
END SUB
⚠️ **GitHub.com Fallback** ⚠️