Всем доброго дня!
Тоже подкопились вопросы, причем самого разного толка. Где-то я чую, что мог бы решить, но всё никак не пойму, в чем соль.
Как обычно, буду рад ответу на любой из вопросов, потому что они все разноплановые и разные по сложности. Собираю коллективное знание, так сказать, с миру по нитке.
Вопрос 1. Правильно ли я понимаю, что хорошая практика иметь шаг в 5 пунктов между стадиями квеста, иначе движок может забаговать? Или это байка? А также какое количество стадий может быть максимальным? Не сами стадии, а их "номер" беспокоит. Например, стадия 455 будет работать? А стадия 1000?
Вопрос 2. Как окрасить цветом текст, набранный в MessageBoxEX? Видел окрас в FormID Finder, хотел бы такой же в своем меню одном применить, но в коде Finder ногу сломишь. Интересует зеленый и красный цвета для текста (если быть совсем уж конкретным).
Контекст: в менюшке для активатора "Бочонок с вином" игрок может отравить вино. Если бочонок не отравлен, текст будет зеленый; если отравлен - красный.
Вопрос 3. Как отфильтровывать нужных неписей\предметы в массиве?
Контекст: Мне нужно это для нескольких целей.
Первая цель фильтрации: обьектный, привязанный к персонажу скрипт, который отфильтровывает его имущество в ячейке его проживания и меняет владение (ownership) на ничейное (через команду SetOwnership, естественно) чтобы сымитировать "сквоттинг" ячейки и имущества. Нет человека, значит и вещи уже ничейные, что логично.
Суб-вопрос: такой скрипт должен привязываться к spell-target в нужной ячейке или можно его привязать к самому персонажу?
Суб-суб-вопрос (да): Я привязал к персонажу следующий простейший скрипт, и после этого при убийстве персонажа открытие его инвентаря моментально приводит к вылету, хотя скрипт при этом рабочий, владение предметов действительно меняется. Есть идеи, что здесь не так? Или не тут лежит причина?
Вторая цель фильтрации: Я создал пользовательские функции, которые вызываются на определенных стадиях квеста. Они должны отфильтровать нужных неписей и приписать им либо пакеты поведения, либо напрямую приказать сделать то-то и то-то. Но все варианты, которые я использовал, не работают. Либо игра перегружается, и её никак не выключить, либо игра вылетает, либо просто ничего не происходит, хотя скрипт вроде что-то делает. Так что мне нужна экспертиза по тому, где я, собственно, ошибся в структуре или вызванных функциях кода.
Вот следующий (нерабочий, игра вылетает) скрипт, который при стадии квеста заставляет пиратов "бежать в страхе" из той ячейки, где они находятся, в любую другую.
Второй похожий (но нерабочий, ничего не происходит) заставляет стражников выхватить мечи и в алертном состоянии бродить по поселению:
Третья цель фильтрации: похожа на первую. Основной вопрос: как внести в фильтрацию массива условие в виде определенного радиуса от spelltarget'a?
Контекст: У меня есть большая ячейка, где существует несколько разных неписей, и если игрок убьет одну группировку, то именно её вещи (и книги, и одежда, и мебель, и контейнеры, и оружие, и тд) становятся ничейными, но только в определенном радиусе.
Для этого я набросал следующий скрипт:
Вопрос 4. Я писал по поводу скрипта для появляющихся и исчезающих кораблей. Я несколько раз переписал скрипт. Остановился на том, чтобы скрипт действовал в том случае, если 1) игрок неподалеку от поселения (это обьектный скрипт); 2) игрок находится в окне загрузки. Но это привело к другой проблеме: что если загрузка не попадает в нужный временной диапазон? Как прописать активацию\деактивацию моделей кораблей постфактум? Вроде ответ на поверхности, но я действительно не догоняю.
Вопрос 5. Схож с третьим. Как активировать сбор массива по временным промежуткам?
Контекст: Массив отбирает случайно двух-трех НПС раз в игровой час и кидает им "приказ" активировать активатор (бочку с пивом). Скрипт прикреплен к spelltarget. Но при входе в локацию расположения spelltarget'a сол скриптом у меня вылетает игра (опять ошибка в работе массива). Лечится только полным удалением spelltargeta из локации.
Вопрос 6. Вопрос скорее про алгоритмы. Заставить неписей случайно выбирать в какой из 4 домов (interior cells) войти и после вернуться к точке в доках может быть решен несколькими путями. Вопрос в том, какими?
Я набросал следующий алгоритм. Тут нужна экспертиза тех, кто работал с пакетами ИИ и может сказать, рабочий ли такой алгоритм или нет.
Алгоритм следующий:
На каждый маркер (по маркеру на каждую из четырех interior cells) делаем пакет ИИ. В нем условия: 25% GetRandomCount; > 10 от маркера в ячейке; время работы с 9 до 18. Таким образом, каждый пакет получает шанс в 25% быть выбранным, затем сбрасывается, когда персонаж достигает маркера, находясь меньше чем в 10 метрах от него, и пакет ВСЕГДА будет выбираться в промежуток между 9 и 18 часами дня (смотрите зачем нужно дальше). Ну и то, что это будни и так понятно!
Когда пакет сбрасывается (персонаж дошел до маркера), он тут же получает классический пакет возвращения к точке А, то есть к маркеру в доках. У этого пакета так же висят условия: > 10 от маркера А; время работы с 9 до 18. То есть, после сброса одного из 4 пакетов персонаж всегда получает этот пакет, возвращается в доки, и там опять выбирает один из 4 пакетов и снова идет к маркеру во внутренней ячейке пока время не достигнет 18 часов.
Верно ли я понимаю логику работы движка игры?
Я часто наблюдал при тестировании, что указания на метраж от маркера может привести к вылету, если маркер находится в другой ячейке, особенно во внутренней (interior) ячейке. Вылет происходит если персонажа подвергнуть функции evp, когда он находится не во внутренней ячейке, а в пакете при этом указано, что он должен быть не менее чем N метров от предмета во внутренней ячейке.
Поэтому мой вопрос про алгоритм\архитектуру действия пакетов совсем не праздный.
Вопрос 7. Как работает функция обнуляющая набранный урон от падения? Точнее: она должна быть привязана к обьекту или к квесту? Если к обьекту, то этот обьеке ( triggerbox) может находиться в воздухе? Или тогда обнуления не произойдет?
Контекст: Я прикрепил скрипт с этой фукнцией на triggerbox, который находится в воздухе. Хотел создать эмуляцию "прыжка веры", если игрок в прыжке проходит через триггербокс, висящий в воздухе, то игроку сбрасывают весь набранный урон от падения, и он не получит урона, когда коснется земли.
Таким образом, вопрос в том, ошибка допущена в скрипте или в том, что triggerbox в таких случаях должен находиться на земле?
Вопрос 8. Особенности включения кастомного xml-bar. После стадии квеста должна вызываться XML с дефолтным баром (полоской), уменьшающейся со временем. С тем, как это будет работать, я разберусь по идее, но вот почему она вообще не появляется, это для меня вопрос открытый. Код я пока закомментировал.
Вопрос 9. Как соединить кастомный код с кодом оригинальной канализационной двери с анимацией открытия?
Такирелль сильно помог с созданием меню (спасибо еще раз!), но почему-то дверь не воспроизводит анимацию открытия. В остальном код совершенно рабочий, я попытался добавить оригинальные условия скрипта с анимацией открытия канализационной двери, но где-то всё же ошибся.
Вопрос 10. Кто нибудь знает функцию или способ как вычленить FormID\EditorID топика диалога, а также условия (conditions) топика? Есть ли функция get чтобы сохранить эти данные в код? По идее мы же как-то можем обратиться к функциям, являющимися условиями диалогов, зная сам топик? Или как это должно работать? По этой теме вообще ничего не нахожу.
Вопрос 11. Вопрос по активации\деактивации точек спавна. Делаю это через объектный скрипт, который крепится к самим точкам спавна. Правильно ли это? Или лучше создать отдельный скрипт, повесить его на spelltraget, который и будет контролировать включение\отключение точек?
Контекст: по вечерам в поселении в некоторых местах могут заспавниться грабители, но активная точка спавна должна быть только одна из трех.
Три референса спавн-точки стоят близко друг ко другу во внешних ячейках.
Скрипт вроде рабочий, но есть сомнения в "правильности" самого кода.
Вопрос 12. Самый легкий, но важный. Напишите пожалуйста, как в Золотом Издании переведены следующие предметы (LowerCupTan02, MiddleMetalGoblet, LowerMugTan01, MiddleMetalTankard005)?
Контекст: Я создал строковый массив, который проходится по инвентарю игрока, и если в нем есть предметы с соответствующими названиями, то он может налить себе в "кружку" (Goblet, Tankard, Cup or Mug) вина из бочонка. Поэтому для перевода нужна информация как эти же названия даны в русском официальном переводе.
Вопрос 13. Так сказать, на будущее. Если мод обновляется до новой версии, как вносят изменения с новой версии в перевод предыдущей? не переводить же один и тот же плагин заново?! Наверное должна существовать инфраструктура комфортного обновления существующего перевода?
Спасибо всем за помощь в предыдущих вопросах, поддержка форумчан это действительно чудо! Особенно когда сам не знаешь совершенно как решить поставленную задачу. И это очень вдохновляет работать дальше.
Всех с наступающим Новым Годом!