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

UO.GetResist

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

ClassicUO • Runtime API

Читает одно сопротивление своего персонажа по числовому или строковому селектору.

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

UO.GetResist(resistance:Any) -> Integer

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

Параметры

  • resistance — resistance обязателен. Числа: 0=physical, 1=fire, 2=cold, 3=poison, 4=energy. Строки: physical/phys/armor, fire, cold, poison, energy. Регистр и крайние пробелы игнорируются. Нет serial, type, hue, прицела или второго аргумента.

Возвращает

Integer — знаковое значение статуса, -32768..32767 в модели клиента. Отрицательное значение сохраняется. 0 бывает реальным сопротивлением, отсутствием данных либо отсутствующим/уничтоженным Player; GetResist также даёт 0 для неизвестного селектора. Это не Boolean, ID, навык или предел сопротивления. 1 означает один пункт, а не успешное выполнение.

Поведение

  • GetResistance сначала различает тип значения: строки "1" и "0" — неизвестные имена, дают 0 и не являются числовыми селекторами. Нестроковый Decimal отбрасывает дробь к нулю: 1.9 -> fire, -0.9 -> physical. TRUE=1 выбирает fire, FALSE=0 — physical; Array/Unit тоже преобразуются в 0. Используйте явное целое либо допустимое имя. Имена AddObject не разрешаются.
  • GetResistance выбирает ровно одно поле bridge. Неизвестные числа/имена дают Integer 0 без чтения поля. Команда не снимает пять значений атомарно и не меняет сопротивления.
  • PhysicalResistance — серверное поле брони/статуса: классический сервер может передавать рейтинг брони, а правила с сопротивлениями — физическое сопротивление. API не переводит одно в другое и не вычисляет процент снижения урона. Armor и физические псевдонимы читают одно поле.
  • Стихийные поля приходят в расширенном CharacterStatus (0x11), type >= 4. Сама команда не проверяет эпоху сервера. Компактный/старый статус без этих полей оставляет предыдущий кэш; у нового Player исходно 0. Сопротивление яду не является флагом Poisoned; это также не навык Resisting Spells.
  • CharacterStatus проверяет обязательное тело до изменения имени, здоровья и собственных характеристик, затем переводит каждое слово сопротивления в знаковый Int16. Обрезанное обязательное тело не меняет прежние данные. Необязательный хвост type 6 сохраняет прежние правила; команды сопротивлений не читают из него максимальные пределы.
  • Invoke читает на игровом потоке с возможностью отменить ожидание скриптом. Не запрашивает status, не открывает target, не посылает пакет, не меняет характеристику и не добавляет задержку.
  • Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.

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

Реальные внутренние этапы локального чтения сопротивления. ResistanceAtLeast ниже — полностью объявленная пользовательская BASIC-функция, а не скрытая встроенная команда или надевание защитной экипировки.

1. RegisterCharacterGetterAliases

Регистрирует GetResist(resistance) и UO.GetResist(resistance) как функции с одним аргументом, связанные с GetResistance. Встроенного имени без аргумента у этого селектора нет.

resistance обязателен. Числа: 0=physical, 1=fire, 2=cold, 3=poison, 4=energy. Строки: physical/phys/armor, fire, cold, poison, energy. Регистр и крайние пробелы игнорируются. Нет serial, type, hue, прицела или второго аргумента.

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

2. GetResistance

GetResistance сначала различает тип значения: строки "1" и "0" — неизвестные имена, дают 0 и не являются числовыми селекторами. Нестроковый Decimal отбрасывает дробь к нулю: 1.9 -> fire, -0.9 -> physical. TRUE=1 выбирает fire, FALSE=0 — physical; Array/Unit тоже преобразуются в 0. Используйте явное целое либо допустимое имя. Имена AddObject не разрешаются.

0: PhysicalResistance; 1: FireResistance; 2: ColdResistance; 3: PoisonResistance; 4: EnergyResistance. GetResistance выбирает ровно одно поле bridge. Неизвестные числа/имена дают Integer 0 без чтения поля. Команда не снимает пять значений атомарно и не меняет сопротивления.

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

3. ToInt

ToInt получает здесь только нестроковый селектор. Integer сохраняется, Decimal отбрасывает дробь к нулю, Array/Unit дают 0. Результат — индекс селектора, не сопротивление. Строковые имена разбирает GetResistance.

0: PhysicalResistance; 1: FireResistance; 2: ColdResistance; 3: PoisonResistance; 4: EnergyResistance.

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

4. Invoke

Invoke читает выбранное поле Player из таблицы выше с сохранением знака. Нет/уничтожен Player — 0. Чтение не запрашивает статус и не ждёт новых данных.

Invoke читает на игровом потоке с возможностью отменить ожидание скриптом. Не запрашивает status, не открывает target, не посылает пакет, не меняет характеристику и не добавляет задержку.

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

5. CharacterStatus

CharacterStatus проверяет обязательное тело до изменения имени, здоровья и собственных характеристик, затем переводит каждое слово сопротивления в знаковый Int16. Обрезанное обязательное тело не меняет прежние данные. Необязательный хвост type 6 сохраняет прежние правила; команды сопротивлений не читают из него максимальные пределы.

PhysicalResistance — серверное поле брони/статуса: классический сервер может передавать рейтинг брони, а правила с сопротивлениями — физическое сопротивление. API не переводит одно в другое и не вычисляет процент снижения урона. Armor и физические псевдонимы читают одно поле. Стихийные поля приходят в расширенном CharacterStatus (0x11), type >= 4. Сама команда не проверяет эпоху сервера. Компактный/старый статус без этих полей оставляет предыдущий кэш; у нового Player исходно 0. Сопротивление яду не является флагом Poisoned; это также не навык Resisting Spells.

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

6. Clear

World.Clear удаляет Player. Далее возвращается 0, пока не появятся текущий персонаж и его данные. Сохранённое значение не доказывает выполнение требования после переподключения.

Integer — знаковое значение статуса, -32768..32767 в модели клиента. Отрицательное значение сохраняется. 0 бывает реальным сопротивлением, отсутствием данных либо отсутствующим/уничтоженным Player; GetResist также даёт 0 для неизвестного селектора. Это не Boolean, ID, навык или предел сопротивления. 1 означает один пункт, а не успешное выполнение.

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

Каждый вызов читает локальные данные заново. Переменная хранит снимок; отдельные чтения могут получить разные обновления сервера. Ненулевой результат не проверяет подключение. Ноль может быть значением либо отсутствием данных.

Примеры

Пример 1. Выбрать по имени с разным регистром

# Выбрать по имени с разным регистром
#
# Читает одно сопротивление своего персонажа по числовому или строковому селектору.
#
# Integer — знаковое значение статуса, -32768..32767 в модели клиента. Отрицательное значение
# сохраняется. 0 бывает реальным сопротивлением, отсутствием данных либо
# отсутствующим/уничтоженным Player; GetResist также даёт 0 для неизвестного селектора. Это не
# Boolean, ID, навык или предел сопротивления. 1 означает один пункт, а не успешное выполнение.

SUB Main()
    # resistance=" FiRe " выбирает огонь после удаления крайних пробелов и без учёта регистра. value
    # остаётся знаковым числом; прицел не появляется.

    VAR value = UO.GetResist(' FiRe ')
    UO.Print('Fire resistance: ' + CStr(value))
END SUB

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

  • resistance=" FiRe " выбирает огонь после удаления крайних пробелов и без учёта регистра. value остаётся знаковым числом; прицел не появляется.

Пример 2. Сравнить числовой и строковый селекторы

# Сравнить числовой и строковый селекторы
#
# Читает одно сопротивление своего персонажа по числовому или строковому селектору.
#
# Integer — знаковое значение статуса, -32768..32767 в модели клиента. Отрицательное значение
# сохраняется. 0 бывает реальным сопротивлением, отсутствием данных либо
# отсутствующим/уничтоженным Player; GetResist также даёт 0 для неизвестного селектора. Это не
# Boolean, ID, навык или предел сопротивления. 1 означает один пункт, а не успешное выполнение.

SUB Main()
    # 2 выбирает холод; "poison" — яд. Это селекторы, не serial. Сравнение двух снимков возвращает
    # Boolean; сопротивление яду не говорит, отравлен ли персонаж.

    VAR cold = UO.GetResist(2)
    VAR poison = UO.GetResist('poison')
    IF cold < poison THEN
        UO.Print('Cold resistance is lower')
    ELSE
        UO.Print('Cold resistance is equal or higher')
    END IF
END SUB

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

  • 2 выбирает холод; "poison" — яд. Это селекторы, не serial. Сравнение двух снимков возвращает Boolean; сопротивление яду не говорит, отравлен ли персонаж.

Пример 3. Полная функция проверки минимального сопротивления

# Полная функция проверки минимального сопротивления
#
# Читает одно сопротивление своего персонажа по числовому или строковому селектору.
#
# Integer — знаковое значение статуса, -32768..32767 в модели клиента. Отрицательное значение
# сохраняется. 0 бывает реальным сопротивлением, отсутствием данных либо
# отсутствующим/уничтоженным Player; GetResist также даёт 0 для неизвестного селектора. Это не
# Boolean, ID, навык или предел сопротивления. 1 означает один пункт, а не успешное выполнение.

SUB Main()
    # minimum=50 — пример требования, не предел клиента. ResistanceAtLeast отвергает отсутствующий
    # Player, читает одно значение и возвращает Integer Boolean: 1=TRUE либо 0=FALSE по условию
    # value >= minimum. Само сопротивление не Boolean. Функция полностью объявлена ниже.
    # selector передаётся из функции в GetResist без изменений; пример использует "fire". Функция
    # проверяет наличие Player, но не валидирует произвольный селектор и не подтверждает свежесть
    # статуса. Используйте селектор из списка выше.

    IF ResistanceAtLeast('fire', 50) = TRUE THEN
        UO.Print('Local fire resistance requirement met')
    ELSE
        UO.Print('Requirement not met or no player')
    END IF
END SUB

SUB ResistanceAtLeast(selector, minimum)
    IF UO.Self() = 0 THEN
        RETURN FALSE
    END IF
    VAR value = UO.GetResist(selector)
    RETURN value >= minimum
END SUB

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

  • minimum=50 — пример требования, не предел клиента. ResistanceAtLeast отвергает отсутствующий Player, читает одно значение и возвращает Integer Boolean: 1=TRUE либо 0=FALSE по условию value >= minimum. Само сопротивление не Boolean. Функция полностью объявлена ниже.
  • selector передаётся из функции в GetResist без изменений; пример использует "fire". Функция проверяет наличие Player, но не валидирует произвольный селектор и не подтверждает свежесть статуса. Используйте селектор из списка выше.