-
Notifications
You must be signed in to change notification settings - Fork 0
API UO SetClassMask
Создаёт или заменяет собственный класс экипировки для 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.
Проверяет имя и зарезервированные разделители.
Никакого словаря фиксированных профессий.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.ClassMasks.cs; функция ReadClassName.
Проверяет типы и создаёт отдельные множества graphic.
Скриптовые массивы после вызова не изменяют правило.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.ClassMasks.cs; функция ReadEquipmentGroup.
Проверяет противоречия и атомарно заменяет правило под блокировкой словаря.
Возвращает 1; при ошибке замены нет.
Исходник проекта: external/InjectionScript/src/InjectionScript/Runtime/InjectionApiUO.ClassMasks.cs; функция SetClassMask.
Правила хранятся в экземпляре InjectionApiUO, без сетевых пакетов и без записи настроек профиля.
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, а не полный комплект.
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 расширяет альтернативы; не требует надевать две кожаные вещи.
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.
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Разбор параметров и выполнения:
- Повторная регистрация заменяет копию правила. Старое имя остаётся тем же, поэтому строку приоритетов переписывать не нужно.
ClassicUO
Bad Newbie & Basic IDE
Найти в справочнике
Клиент и скрипты
Каталоги значений
Разработка и помощь