API UO LastStatusY - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

UO.LastStatusY

Оглавление · Алфавитный указатель · Character

ClassicUO • Runtime API

Возвращает сохранённую координату Y объекта последнего принятого статуса.

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

UO.LastStatusY() -> Integer

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

Параметры

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

Возвращает

Integer — сохранённая координата Y, не пиксель окна статуса и не Boolean. До первого статуса или после очистки мира — 0; сама координата 0 тоже допустима. Проверяйте UO.LastStatus() для отличия отсутствия записи.

Поведение

  • Без параметров. Чтение не отправляет пакеты, не открывает окно и не ждёт ответа. 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 — сохранённая координата Y, не пиксель окна статуса и не Boolean. До первого статуса или после очистки мира — 0; сама координата 0 тоже допустима. Проверяйте UO.LastStatus() для отличия отсутствия записи.

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

2. LastStatusY

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

Integer — сохранённая координата Y, не пиксель окна статуса и не Boolean. До первого статуса или после очистки мира — 0; сама координата 0 тоже допустима. Проверяйте UO.LastStatus() для отличия отсутствия записи.

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

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. Прочитать последнее значение

# Прочитать последнее значение
#
# Возвращает сохранённую координату Y объекта последнего принятого статуса.
#
# Integer — сохранённая координата Y, не пиксель окна статуса и не Boolean. До первого статуса
# или после очистки мира — 0; сама координата 0 тоже допустима. Проверяйте UO.LastStatus() для
# отличия отсутствия записи.

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

    VAR value = UO.LastStatusY()
    UO.Print('Saved value: ' + CStr(value))
END SUB

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

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

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

# Запросить статус и прочитать известные данные
#
# Возвращает сохранённую координату Y объекта последнего принятого статуса.
#
# Integer — сохранённая координата Y, не пиксель окна статуса и не Boolean. До первого статуса
# или после очистки мира — 0; сама координата 0 тоже допустима. Проверяйте UO.LastStatus() для
# отличия отсутствия записи.

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

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

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

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

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

# Полный помощник ReadSavedStatus
#
# Возвращает сохранённую координату Y объекта последнего принятого статуса.
#
# Integer — сохранённая координата Y, не пиксель окна статуса и не Boolean. До первого статуса
# или после очистки мира — 0; сама координата 0 тоже допустима. Проверяйте UO.LastStatus() для
# отличия отсутствия записи.

SUB Main()
    # expectedId — serial, сохранённый в 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.LastStatusY()
    IF UO.LastStatus() <> expectedId THEN
        RETURN -1
    END IF
    RETURN value
END SUB

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

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