Skip to content

API UO SetClassMask

Codex edited this page Sep 21, 2026 · 1 revision

UO.SetClassMask

UO API · Все команды

Создаёт или заменяет собственный класс экипировки для classMask в UO.AttackNearest. Вы выбираете имя и graphic/type вещей; встроенные названия профессий не требуются.

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

UO.SetClassMask(name:Any, required:Any) -> Integer
UO.SetClassMask(name:Any, required:Any, forbidden:Any) -> Integer

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

Параметры

  • name — Непустая строка с вашим названием, например "DTMH", "моя_группа", "арчер_со_щитом". Регистр не важен, пробелы по краям убираются. | , ; запрещены: это разделители приоритетов. any/all/-1 зарезервированы для отключения фильтра.
  • required — Один type, плоский массив альтернатив или массив обязательных групп. Каждая группа — type либо плоский массив. Нужна хотя бы одна вещь из каждой группы; пустые обязательные группы недопустимы. Каждый type — Integer/числовая/hex-строка 1..65534. Вложенность глубже массива групп не принимается. Это graphic вещей, не serial и не body персонажа.
  • forbidden — Необязательный type или плоский массив запрещённых типов. По умолчанию запрещённых вещей нет; пустой массив тоже разрешён. Если любая такая вещь надета, правило не совпадает. Те же границы 1..65534; -1/any здесь не принимаются. Полностью запрещать все альтернативы обязательной группы нельзя.

Возвращает

Integer 1 — правило проверено и записано. Ошибочный тип/имя/пустая обязательная группа/противоречие вызывает ошибку скрипта, которую можно перехватить TRY/CATCH; прежнее правило сохраняется. Не возвращает serial или найденных персонажей, не начинает атаку.

Поведение

  • Имя — пользовательская метка, а не серверная профессия. Можно назвать правило DTMH, моя_группа или любым другим словом. Движок не определяет навыки/класс на сервере по имени персонажа.
  • В required один type или плоский массив означает хотя бы одну вещь из списка. Массив групп означает: нужна хотя бы одна вещь из КАЖДОЙ группы. Например [кожа, посохи] требует кожу И посох. Это набор альтернатив, а не требование надеть весь перечисленный гардероб.
  • Любая надетая вещь из forbidden исключает персонажа из этого правила, даже при выполненных required. Кожа плюс запрещённый chain не проходит правило кожи. Другие правила продолжают проверяться.
  • Учитываются только загруженные вещи, надетые на слоях 1..24 кроме рюкзака 21. Содержимое рюкзака/сундука, маунт 25, магазин 26..28 и банк 29 не считаются одеждой. Сравнивается graphic/type; serial, имя и hue вещи здесь не используются.
  • Список без загруженной подходящей экипировки не совпадает. Отсутствие запрещённой вещи в локальных данных не доказывает её отсутствие на сервере, если сервер ещё не прислал экипировку. Клиент не угадывает скрытые данные.
  • Правила принадлежат одному runtime скрипта, включая его функции и Include; не передаются другим самостоятельным запускам и не сохраняются в профиль. При новом запуске определите их снова, например общей процедурой настройки. Повторный SetClassMask заменяет правило с тем же именем, только после полной проверки новых данных.
  • Массивы копируются при регистрации. Изменение исходного массива не меняет правило: повторите SetClassMask. Несколько совпавших правил разрешаются порядком имён в classMask. Никаких стандартных таблиц одежды сервера нет.

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

Ниже описана реализация этого движка. Имена внутренних методов не являются дополнительными командами BASIC.

1. ReadClassName

Проверяет имя и зарезервированные разделители.

Никакого словаря фиксированных профессий.

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

2. ReadEquipmentGroup

Проверяет типы и создаёт отдельные множества graphic.

Скриптовые массивы после вызова не изменяют правило.

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

3. SetClassMask

Проверяет противоречия и атомарно заменяет правило под блокировкой словаря.

Возвращает 1; при ошибке замены нет.

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

Правила хранятся в экземпляре InjectionApiUO, без сетевых пакетов и без записи настроек профиля.

Примеры

Пример 1. DTMH: своя кожа без chain

FUNCTION Gear(ParamArray values())
    # Возвращает массив переданных значений, без поиска в игре.
    RETURN values
END FUNCTION

SUB Main()
    VAR myLeather = Gear(0x13C4, 0x13C7)
    VAR forbiddenChain = Gear(0x13BF, 0x13C0)
    # Любая одна перечисленная кожаная вещь; ни одного chain из запрета.
    UO.SetClassMask("DTMH", myLeather, forbiddenChain)
    VAR enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "DTMH", true, true)
    IF enemy <> 0 THEN
        UO.AddObject("leather_enemy", enemy)
    END IF
END SUB

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

  • DTMH — только ваше имя. Значения в myLeather/forbiddenChain — примеры: замените/дополните реальными graphic вашего сервера. Плоский список означает OR, а не полный комплект.

Пример 2. Свои названия, свои вещи и порядок атаки

FUNCTION Gear(ParamArray values())
    # Возвращает массив переданных значений, без поиска в игре.
    RETURN values
END FUNCTION

SUB Main()
    # Примерные graphic/type. Сверьте свои вещи через Info/GetType.
    # В списке только разрешённые вами типы, это не serial предметов.
    VAR leather = Gear(0x13C4, 0x13C7)
    VAR staves = Gear(0x0DF0, 0x0E81)
    VAR chain = Gear(0x13BF, 0x13C0)
    VAR plate = Gear(0x1415, 0x1411)
    VAR bows = Gear(0x13B2, 0x0F50)
    # DTMH: одна вещь из leather И одна из staves; chain запрещён.
    UO.SetClassMask("DTMH", Gear(leather, staves), chain)
    # охотник: одна вещь из bows; остальные вещи не ограничиваем.
    UO.SetClassMask("охотник", bows)
    # тяжёлый: хотя бы одна перечисленная пластинчатая вещь.
    UO.SetClassMask("тяжёлый", plate)

    VAR notoriety = "5|6"     # Enemy ИЛИ Murderer.
    VAR distance = 12         # До 12 клеток X/Y включительно.
    VAR body = -1             # Любое тело, не только human.
    VAR maxZ = 8              # Разница высот не больше 8 единиц Z.
    VAR nearest = true        # Ближайший ВНУТРИ первого доступного класса.
    VAR color = -1            # Любой hue тела, одежду по hue не фильтруем.
    VAR classMask = "DTMH|тяжёлый|охотник"
    VAR aliveOnly = true      # Отсеиваем мёртвых mobiles.
    VAR visibleOnly = true    # Видимых клиенту; это не CheckLOS.
    VAR enemy = UO.AttackNearest(notoriety, distance, body, maxZ, nearest, color, classMask, aliveOnly, visibleOnly)
    IF enemy = 0 THEN
        UO.Print("No matching enemy; no attack sent")
        RETURN
    END IF
    # AttackNearest уже направила цель в обработчик атаки; второй Attack не нужен.
    UO.AddObject("selected_enemy", enemy)
END SUB

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

  • Сначала выбирается DTMH; только если подходящих DTMH нет — тяжёлый, затем охотник. DTMH на 10 клетках имеет приоритет над тяжёлым на 2 клетках. Для обратного порядка поменяйте строку classMask. Из двух DTMH выбирается ближайший.
  • Gear — полностью приведённая пользовательская функция BASIC, не отдельная команда UO. Два массива в Gear(leather, staves) образуют две обязательные группы. Добавление типа в leather расширяет альтернативы; не требует надевать две кожаные вещи.

Пример 3. Полный набор обязательных типов через DIM

SUB Main()
    # Две отдельные группы: нужно надеть ОБА указанных типа.
    DIM required[1]
    DIM torso[0]
    DIM weapon[0]
    torso[0] = 0x13C4
    weapon[0] = 0x0DF0
    required[0] = torso
    required[1] = weapon
    UO.SetClassMask("мой_комплект", required)
    # Вещи в рюкзаке не подходят. Hue вещей не учитывается.
    VAR enemy = UO.AttackNearest(5, 6, -1, 4, true, -1, "мой_комплект", true, true)
    IF enemy <> 0 THEN
        UO.AddObject("outfit_enemy", enemy)
    END IF
END SUB

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

  • DIM required[1] создаёт два элемента с индексами 0 и 1. Две вложенные группы требуют torso И weapon; плоский [torsoType,weaponType] означал бы torso ИЛИ weapon.

Пример 4. Изменить одежду в правиле перед следующей атакой

SUB Main()
    DIM allowed[0]
    allowed[0] = 0x13B2
    UO.SetClassMask("приоритетный", allowed)
    # Хотим теперь искать другой graphic: одного изменения массива мало.
    allowed[0] = 0x0F50
    UO.SetClassMask("приоритетный", allowed)
    VAR enemy = UO.AttackNearest(5, 10, -1, 8, true, -1, "приоритетный", true, true)
    IF enemy <> 0 THEN
        UO.AddObject("updated_outfit", enemy)
    END IF
END SUB

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

  • Повторная регистрация заменяет копию правила. Старое имя остаётся тем же, поэтому строку приоритетов переписывать не нужно.

Clone this wiki locally