Перейти к содержанию

Umbakano Jr

Модмейкер
  • Постов

    3 967
  • Зарегистрирован

  • Посещение

  • Победитель дней

    9

Записи блога, опубликованные Umbakano Jr

  1. Umbakano Jr
    Статья предназначена для тех, кто не только активно делает моды, но и активно играет.

    Решил поделиться опытом как удобнее "обустроиться" при модостроительстве. Ведь создание модов, их тестирование, зачастую требуют специфических условий к используемым плагинам, и в конце концов "мешает" игровой сборке, то есть мешает играть! О том как разделить эти конфликтующие функции и пойдет речь.
    Довольно быстро пришло понимание, что играть и делать моды, а особенно тестировать сторонние "творения", в итоге приводят к нарастающим проблемам в совместимости модов и замусориванию папки игры "остатками" ресурсов. Необходимо было разделить эти функции.
    Пораскинув мозгами и собрав в кучу то, что после них осталось, я разработал схему использования лицензированной версии игры как для модостроения, так и для игры, под одним аккаунтом Стим, но двумя пользователями ПК.

    Итак, "принцип действия" следующий:

    Используется два пользователя компьютера, назовем их Test и Game, один для моддинга, второй только для игры. У каждого из них собственные независимые папки для документов, и соответственно, собственные настройки игры и сохранения.
    Используются две копии Wrye Bash, у каждого пользователя собственные настройки bash.ini для создания уникальных папок для хранения архивов с модами, назовем их Skyrim Mods Test и Skyrim Mods Game.

    Используются две копии папки с игрой, имеющие уникальные названия, привязанные к пользователям, например, Skyrim Test и Skyrim Game.

    Последний штрих, чтобы все это работало, при входе под именем пользователя Test или Game, переименовать соответствующую папку с игрой в стандартное название Skyrim, понимаемое Стимом. Переименовывать можно вручную, но эффективнее автоматизировать этот процесс, например, создав задачу в Планировщике задач ОС Виндовс.

  2. Umbakano Jr
    Вот и у меня дошли ноги/дотянулись руки до этой игры. И первое впечатление было - что это?

    Я, конечно, неоднократно читал в сети, что игра необычная, экспериментальная, без привычного геймплея, и очень красивая, потому "морально" готовился "к встрече". И все равно получил нокаут подсознательного, и не в состоянии сопротивляться внутреннему порыву, решил выплеснуть захлестнувшие меня эмоции!

    Да, первое впечатление было - что это, тут же ничего нет? В смысле буквально ничего! Ни интерфейса, ни персонажа, ни привычного управления. Да и картинка, вид моря - первая панорама в игре, не впечатлила, больше напоминая большой пруд нежели море. А проклятый FOV так резал глаза деформацией в углах обзора, что я забеспокоился, а правильно ли у меня настроена игра! Но и настроек, как таковых в игре тоже нет...

    Смирившись с минимализмом управления, отправился "в путь". Ничего другого игра не предлагает. Из-за непонимания английского, довольствовался субтитрами, и в кои-то веки не жалел, что не знаю иностранного. Очень быстро пришло осознание, что тексты носят острый суицидальный характер и относятся к некоему индивиду, страдающему шизофренией в следствие посттравматического синдрома после гибели той самой Эстер в авто аварии. Кстати, эту догадку подтвердила концовка игры.

    Хотя, может быть, это, так сказать, мое личное восприятие на "тест Роршаха", а в текстах сокрыт некий сакральный контекст, те самые загадки, которые упоминались в рецензиях? В любом случае, текста подают немного и дозировано, явно на чекпойнтах, он быстро перестает отвлекать. А поскольку сюжет, если следование по маршруту можно назвать сюжетом, прямолинейный как стрела, то остается лишь одно - наблюдать... но, наблюдать что?
    И вот тут, уже после исследований мира Скайрим, я должен признать, наблюдать, и невольно сравнивать, есть чего! Ландшафт сделан геологически и топологически правильно, хотя то здесь, то там можно встретить "притянутые за уши" текстуры, общее впечатление - обалденно! Но, зная сколько лет потратили разработчики на этот проект (четыре года), не покидало недоумение - на что они потратили столько времени? Весь остров по размеру можно сравнить с миром Вайтрана, при этом никаких существ, НПС, либо подобного! Ни одной букашки, лишь летающая камера от первого лица в "одностороннем коридоре" ландшафта. Да это больше похоже на портфолио разработчиков дизайна, нежели игру!

    "Нокдаун" я получил на следующий день, когда оказалось, что игру я прошел еще накануне, затратив лишь пару часов, даже не поняв, что черный экран после ролика "убейся ап скалы" и есть конец! Мной обуревали противоречивые чувства, главное из которых - ненаигранность, будто поторопился и не разглядел нечто важное. В конце концов сдался и пошел проходить повторно...

    А на следующий вечер меня уже непреодолимо тянуло в этот мир! И вновь бредя по уже, казалось бы, знакомой тропинке, я почти поверил, что раскрыл замысел разработчиков! Моими ощущениями манипулировали с помощью визуальной и звуковой составляющей "стандартного" игрового движка. И это было так непривычно!

    Почти безупречная картинка и, первоначально незаметное, звуковое окружение, продуманные, сбалансированные для каждого шага вашего пути, создают нет, не особую атмосферу в игре, а особые ощущения прямо у вас внутри! Хочется остановиться и впитывать этот странный окружающий тебя мир! Это какой-то гипноз!

    И теперь мне понятно, на что ушли годы работы талантливых людей. И сам остров перестал быть голым и пустынным, наполнился какой-то мрачной магией чужой трагедии, и множеством деталей... А ведь известно - дьявол кроется в деталях!

    p.s. Сегодня я опять там был, почему?
  3. Umbakano Jr
    Начало здесь

    Что ни говори, а когда не пишешь блог, работа над модом проходит гораздо быстрее! С другой стороны, ведение блога разработки дисциплинирует "творческие порывы" , заставляя использовать более оптимальный код и меньше "мусорить"...

    Понадобились сутки, чтобы в корне переделать систему вызова хранилищ. Теперь она основывается не на системе меню, а на ... говорящем активаторе! Да, да, это такой активатор который позволяет использовать диалоги с "не НПС"! Я приспособил его для отображения и запуска списка репозиториев. В результате, я получил быстрый и простой доступ к любому репозиторию. Да, и визуально, это более элегантное решение!




    Полагаю, такое решение будет полезно при необходимости отображения большого количества опций, поэтому покажу как его сделать.

    В окне Object Window, в разделе Actors, найдите категорию Talking Activator. В таблице справа, создайте новый объект, или используйте уже имеющийся как шаблон. Для наших целей не важно какой вид и какую модель будет использовать этот активатор, мы будет активировать его удаленно. Внесите уникальное имя, это обязательно и название активатора, оно будет отображаться на экране.




    Перетащите этот объект в ячейку, в моем случае это CB_Cell. Если вы не используете собственных ячеек и не желаете "затрагивать" ванильные, можно обращаться к активатору напрямую, в скрипте, создавая его object reference, с помощью функции PlaceAtMe(). Но я рекомендую, все же, разместить объект в ячейке, это более эффективно с точки зрения производительности, и оптимально с точки зрения более короткого кода! На этом, говорящий активатор готов к использованию.

    Создайте квест стартующий с игрой, флажок Start Game Enabled, остальные флажки снимите, установите высокий приоритет (более 80) и сохраните его, закрыв. Заново откройте, теперь появились дополнительные вкладки, переключитесь на Player Dialoge и заполните таблицы, как показано на рисунке:




    В нижней части вкладки, в окне End впишите команду активации нужного контейнера. Чтобы присвоить этому фрагменту свойство (Property), первоначально скомпилируйте скрипт с любым комментом и закройте окно. Вновь откройте, будет доступен ввод свойств для скрипта. Введите и заполните свойство для контейнера, раскомментируйте и отредактируйте код. Скомпилируйте и закройте окно.





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

    Чтобы сработал этот диалог и отобразился список нашего меню, удаленно активируем Talking Activator. Эту функцию я "повесил" на нажатие кнопки в скрипте квеста. CB_TalkingActivator.Activate(GetPlayer())
    Вот и все, меню в виде диалога готово, остался последний штрих.


    Чтобы наш диалог сразу отображался в игре, необходимо создать SEQ-файл!
    Самый простой способ его создания, не требующий ручного ввода, использовать TES5Edit. Загрузите в эту программу мод, найдите его и выделите название, важно стоять именно на названии мода, тогда в контекстном меню, в пункте Разное, появится пункт Создать SEQ-файл. Само создание происходит мгновенно и в нужную папку (Data\SEQ), с правильным названием (в моем случае, Collector bags II.seq).


    Продолжение здесь
  4. Umbakano Jr
    Начало здесь

    Сначала хотел отредактировать предыдущий дневник, но потом подумал, какого черта, это же дневник, а не инструкция прямого действия! А поводом к такому решению послужило событие, заставившее меня отказаться от использования метода добавления в хранилище, разработанное на предыдущем шаге.

    Я нашел решение - прямой доступ к текущей записи инвентаря! То, что вчера казалось невозможным, сегодня реализуется парой строчек кода!

    Скрипт CB_PlayerAlias_Script я откатил до предыдущего состояния, проще говоря, отредактировал, убрав обработку по нажатию клавиш. И создал новый скрипт.


    Для решения текущей задачи, я создал скрипт CB_PlayerQuest_Script в нашем квесте CB_Player.















    Звучит скрипт так. Определиться когда открыто меню инвентаря. Если нужное меню открыто, ожидать нажатия клавиши (в данном случае Back Space). И если такая клавиша нажата, получить FormID текущей записи, по которой определить объект и отправить его в соответствующее хранилище.



    Не забываем заполнить свойства скрипта.














    Сохраняем результат работы.
    Тестирование в игре показало отличную скорость реакции на нажатие клавиши и стабильную работу.

    А теперь вернемся и закончим предыдущий шаг - фильтрование объектов в категории Разное. Мы повесили скрипт на хранилище "-Все разное", он работает - сортирует объекты по нужным хранилищам, но у нас нет доступа к этим хранилищам. Вот его и сделаем сейчас!


    Меня устраивал метод доступа к хранилищам через меню, и хотя я стараюсь избегать частого его использования, все же воспользуюсь им и сейчас.
    В окне Object Window выбираем категорию Message, и в таблице справа, жмем ПКМ и выбираем пункт New.






    Я создал три объекта Message, для отображения трех групп кнопок, иначе они не поместятся на экране.














    Наверное, проводятся какие-то работы на сайте, потому что блог лишен всех кнопок управления форматированием, а открытие и закрытие черновика "ломает" уже готовый (форматированный текст). Но я все же продолжу - не хочу терять время...

    Меню будет вызываться из двух "режимов". Первый, когда инвентарь закрыт, нажатие кнопки Back Space откроет начальное меню, из которого, по цепочке, можно получить доступ ко всем кнопкам, и вызвать любое хранилище. Второй, когда инвентарь открыт, нажатие на репозиторий "-Все разное" откроет третью часть меню, для доступа к разному.
    Для оптимизации, чтобы не использовать одинаковый вызов меню в двух скриптах одного квеста, я вызываю функцию из скрипта квеста.

    Ниже представлены измененные скрипты псевдонима и квеста.






    В результате, мы имеем полноценный мод, предоставляющий бездонные хранилища для всех категорий объектов, с простым и удобным доступом. И хотя еще не реализована автосортировка, но простота и скорость добавления объектов "напрямую", по нажатию кнопки, без открытия хранилища, компенсирует ее отсутствие!

    На этом этот шаг заканчиваю - сложно писать блог, используя теги по-памяти и без гарантии сохранения форматирования...

    Продолжение здесь
  5. Umbakano Jr
    Начало здесь.

    Приступим к "прикручиванию" скриптов к репозиториям для придания им функциональности. Иначе говоря, заставим их делать то, для чего они предназначены - открывать хранилища!
    Из предыдущего опыта я знаю, что скрипты можно повесить прямиком на репозитории и они будут замечательно работать, но... Поскольку это объекты инвентаря, которые мы "одеваем", возникнет необходимость "снять", и эта процедура из самого объекта не работает и придется прикручивать ее к "игроку". А раз так, то логичнее все сразу "расписать" в одном скрипте, а не "распылять" по множеству объектов!



    В окне Object Window выбираем пункт Quest, в таблице справа находим наш квест CB_Player и открываем его для редактирования. Переключаемся на закладку Quest Aliases, где у нас уже есть один псевдоним - Player.



    Открываем его редактирования и в секторе Scripts жмем кнопку Add, чтобы добавить новый скрипт. В следующем окне выбираем пункт New script, а дальше заполняем название и жмем ОК.
     


    Открываем этот новый скрипт для редактирования и начинаем творить (пока для одного репозитория). "Звучит" скрипт так - если одетый объект это репозиторий, то снять его, закрыть меню и открыть хранилище.


      После сохранения и компиляции скрипта, открываем и заполняем его свойства. Для хранилища вручную указываем нашу ячейку и хранилище. А для репозитория можно воспользоваться авто-заполнением - жмем кнопку Auto-Fill.





    Жмем ОК чтобы закрыть свойства, потом закрываем окно псевдонима и окно квеста. Везде используем кнопку ОК, чтобы сохранить изменения.



    Сохраняем результаты работы, нажав пиктограмму Сохранить, и пойдем в игру проверить работоспособность репозитория "- Все оружие".

    ... Все работает как планировалось! А значит можно расширить этот скрипт, включив в него все репозитории и хранилища.

    Поскольку я задавал легко запоминающиеся описательные названия объектов, мне легче и быстрее добавлять свойства (Property) прямо в теле скрипта, а после компиляции их заполнять. В некоторых случаях, может быть проще сначала задать и заполнить свойства через редактор, а потом править скрипт.


    Вот полностью готовый скрипт. Как видите он однообразен, проверяет что одето и снимает этот объект, потом закрывает меню и открывает соответствующее хранилище. Исключение составляют репозитории, при "одевании" расходующиеся, такие как еда, зелье или ингредиенты. В этих случаях следует "пополнить" инвентарь, использовав функцию добавления.
    Заполненные свойства скрипта.
     




    Зайдя в игру, убеждаемся что все работает - хранилища открываются, принимают только определенные для них типы объектов и вообще все замечательно, кроме одного. Репозитории перемещаются и "принимаются" хранилищами, а мы этого не хотим! В наших планах чтобы репозитории невозможно было переместить из инвентаря или выбросить в мир!
    Помните, при создании фильтров для хранилищ, мы упоминали спец. объекты, которые не должны попадать в хранилище. Тогда эти свойства остались не заполнены, пора их заполнить, ведь спец. объекты (репозитории) уже созданы.

    <...здесь пауза длиной в сутки...>

    Как я выяснил, использование скриптов на каждом отдельном хранилище, для возврата попавшего туда репозитория, не эффективно! Наилучший способ - обработать эту ситуацию в уже имеющемся скрипте псевдонима Player.
    Значит, скрипты на хранилищах надо "почистить" от неиспользуемых свойств. И изменить скрипт CB_PlayerAlias_Script так чтобы репозитории всегда "возвращались" в инвентарь.


    Сначала чистим. Это не сложно, ведь основной скрипт у нас на "родительском" объекте CB_Container.
    Отправляемся редактировать скрипт висящий на контейнере. Выбираем в окне Object Window раздел Container, находим наш объект CB_Container и открываем для редактирования. Чтобы удалить ненужное свойство (Property), нужно отредактировать сам скрипт. Открываем его, находим строку и удаляем ее. Form Property CB_Object Auto {специальный объект для активации этого контейнера} Scriptname CB_Box_FilterType_Script extends ObjectReference {Фильтр по типу объекта для контейнера} Int Property TypeObject Auto {тип объекта по списку SKSE 41 - Weapon 26 - Armor 46 - Potion 23 - Scroll - Food 30 - Ingredient 27 - Book 32 - Misc - Gem 52 - Soul - Ore - Anim} Event OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer) If akBaseItem.GetType() == TypeObject Else Self.RemoveItem(akBaseItem, aiItemCount, True, akSourceContainer) EndIf EndEvent  

    Компилируем и сохраняем скрипт, и обязательно заходим в окно свойств скрипта, во-первых, убедиться что свойство удалилось, во-вторых, чтобы редактор "запомнил" эти изменения. Если этого не сделать останется ссылка на несуществующее свойство, и хотя на работу мода это не повлияет, зато будет постоянно генерироваться предупреждение в лог-файле.
     
     

     


     

    Тоже самое делаем для хранилища CB_Box_Food, редактируем его скрипт CB_Box_FilterFood_Script, избавляясь от свойства CB_FOOD. Вот измененный скрипт.


     
    Сохраняем промежуточные результаты работы и переходим к скрипту CB_PlayerAlias_Script.
     

    Выделяем в окне Object Window категорию Quest, и в таблице справа, находим наш квест CB_Player. Открываем и переключаемся на закладку Quest Aliases. Открываем псевдоним Player и редактируем его скрипт.
    Я добавил обработку события OnItemRemoved(), чтобы когда удаляется один из репозиториев, восстанавливать его количество в инвентаре. Дабы не "раздувать" скрипт однотипными командами, добавил функцию - она нужна только для компактности кода.
     

     

    На этом этапе мы получили полноценный рабочий мод! Бездонные хранилища для каждой категории отдельно! И хотя на этом останавливаться я не собираюсь, но уже можно гордиться результатом...
     
    Продолжение здесь.
  6. Umbakano Jr
    Начало здесь.

    Пару дней ушло на "творческие метания"! Пытался совместить свои желания с возможностями игровой механики. Я совершенно точно знаю, что хочу видеть в моде - перемещение объекта из инвентаря в нужное хранилище без открытия последнего! И хотя SKSE существенно расширяет наши возможности, но определить скриптами текущий объект в инвентаре, пока не возможно, а значит невозможно и произвести над ним желаемые действия!

    Но решение найдено! И хотя оно малопроизводительно (прямое управление объектом было бы на порядок быстрее), но оно элегантное и главное - работает!


    Чтобы реализовать такое действие, внесем коррективы в существующий скрипт CB_PlayerAlias_Script, прикрепленный к псевдониму Player, нашего квеста CB_Player.
    В событии при удалении объекта OnItemRemoved() мы предотвращали "потерю" репозиториев из инвентаря. Туда же я добавил код, анализирующий нажатие клавиш. Теперь, если при удалении объекта была нажата не одна, а две клавиши, то удаленный объект добавляется в соответствующее хранилище, а его ссылка в мире удаляется. Для игрока эта операция будет выглядеть как перемещение объекта из инвентаря в хранилище!
    Благодаря использованию функции SKSE GetNumKeysPressed(), определяющей количество нажатых клавиш, мы избегаем конфликта с любыми модами, управляющими кнопками клавиатуры. При этом сами можем использовать любые комбинации клавиш в сочетании с клавишей, назначенной для выбрасывания объектов из инвентаря! Например, (удобнее для пальцев) "L-Shift + R" или "L-Ctrl + R" или "R-Alt + R" (неудобно, но работает!)...



    Я уже протестировал этот код в игре, и мне понравилось! Я могу очень "гибко" выкладывать объекты в хранилища, и если надо переместить большое количество объектов, то комбинацию клавиш нажимать при подтверждении удаления!


    Теперь обратим внимание на хранилище "-Все разное". Сейчас там складируются те категории объектов, доступ к которым мы хотели бы иметь отдельно. Мне представляется, что сортировки по категориям, внутри этого хранилища, будет достаточно. Вот этой задачей и займемся.


    В окне Cell View находим нашу ячейку CB_Cell, а в ней хранилище CB_Misc. Открываем его для редактирования, переключаемся на вкладку скриптов. Поскольку функциональности имеющегося скрипта нам недостаточно, отключаем его, кнопка Remove, и добавляем новый скрипт, кнопка Add.


    Заполняем все его свойства.




    [/size]

    Продолжение здесь
  7. Umbakano Jr
    Начало здесь.

    Вчера мы закончили создавать хранилища, а ночью, пока все спали, я зашел в игру, "телепортировался" в ячейку CB_Cell и проверил работоспособность фильтров на хранилищах. Все работает правильно, как и ожидалось!

    Сегодня создаем специальные объекты. Я буду называть их репозиториями, ведь для игрока они представляются бездонными контейнерами, хотя на деле являются лишь активаторами, спусковыми крючками для открытия соответствующих хранилищ.

    Как я и планировал, использую принцип репозиториев из первой версии мода - в каждой категории объектов будет специальный объект при активации которого открывается соответствующее хранилище.

    Приступим к созданию репозиториев в том же порядке, каком расположены категории в инвентаре.


    Начнем с категории "Оружие". В окне Object Window выделяем пункт Weapon. В таблице справа, кликаем ПКМ и выбираем пункт New. Откроется пустой бланк объекта Weapon. Нам потребуется заполнить лишь названия и тип одевания (Equip Type), чтобы при использовании не заменять в руках оружие, остальные поля оставляем пустые. Даже модель объекта нас пока не тревожит, оставим ее "на потом". Жмем ОК - объект готов.











    Следующая категория "Броня". В окне Object Window выделяем пункт Armor. В таблице справа, кликаем ПКМ и выбираем пункт New. Откроется пустой бланк объекта Armor. Нам потребуется заполнить лишь названия и установить Equip Type равным Potion, остальные поля оставляем пустые. Жмем ОК - объект готов.







    Категория "Зелья". В окне Object Window выделяем пункт Potion. В таблице справа, кликаем ПКМ и выбираем пункт New. Откроется пустой бланк объекта Potion. Нам потребуется заполнить названия и выбрать магический эффект в табличке Results. Без указания магического эффекта игру будет "выбивать", поэтому, на данном этапе, выбираем любой эффект.




    [/size]


    Категория "Свитки". В окне Object Window выделяем пункт Scroll. В таблице справа, кликаем ПКМ и выбираем пункт New. Откроется пустой бланк объекта Scroll. Нам потребуется заполнить названия и опять же выбрать любой магический эффект.











    Категория "Еда и напитки". Чтобы создать объект в этой категории, в окне Object Window выделяем пункт Potion. В таблице справа, кликаем ПКМ и выбираем пункт New. Откроется пустой бланк объекта Potion. Нам потребуется заполнить названия и эффект, так же, как при создании репозитория для зелий, и вдобавок установить флажок Food Item.







    Категория "Ингредиенты". В окне Object Window выделяем пункт Ingredient. В таблице справа, кликаем ПКМ и выбираем пункт New. Откроется пустой бланк объекта Ingredient. Нам потребуется заполнить названия, эффект и Equip Type (необязательно).







    Категория "Книги". В окне Object Window выделяем пункт Book. В таблице справа, кликаем ПКМ и выбираем пункт New. Откроется пустой бланк объекта Book. Нам потребуется заполнить названия и вид в инвентаре Inventory Art (произвольным значением для книг).







    Категория "Разное". В окне Object Window выделяем пункт MiscItem. В таблице справа, кликаем ПКМ и выбираем пункт New. Откроется пустой бланк объекта MiscItem. Нам потребуется только заполнить названия.






    Созданных репозиториев достаточно, чтобы обслужить все наши хранилища. Репозиторий "Все разное" будет открывать меню для доступа к хранилищам, у которых нет собственных репозиториев.

    А сейчас, чтобы закончить этот этап на мажорной ноте, "положим" все эти репозитории в инвентарь ГГ.


    В окне Object Window в разделе Character выделяем пункт Quest. В таблице справа, кликаем ПКМ и выбираем пункт New. Откроется пустой бланк объекта Quest. Указываем название и снимаем флажок Run Once (запустить один раз). Жмем ОК чтобы сохранить квест и открываем его снова.





    Переключаемся на закладку Quest Aliases, в табличке ниже кликаем ПКМ и выбираем первый пункт New Reference Alias.




    Задаем имя псевдонима - Player (произвольное). И в разделе Unique Actor выбираем пункт Player.




    В нижней части окна, в табличке Alias Inventory, кликаем ПКМ и выбираем пункт New.




    Появится запись, которую надо изменить на желаемую нам.




    Вот так, добавляя новую запись и заменяя ее на желаемую, вводим полный список репозиториев.




    Теперь жмем ОК для сохранения этого псевдонима, и еще раз ОК, чтобы сохранить квест.
    Сохраняем нашу работу - жмем пиктограмму Сохранить.


    На сегодня это все, но хотелось бы увидеть результат, поэтому захожу в игру, и с удовлетворением вижу репозитории:




    Продолжение здесь.
  8. Umbakano Jr
    Начало здесь.
    Продолжаю дневник о разработке мода, создаем хранилища.


    Загружаем Creation Kit, жмем пиктограмму Открыть, находим и выделяем в списке файл, который сохранили вчера.
    Дважды кликнув по нему, ставим флажок и обязательно кликаем по кнопке внизу Set as Active File, статус файла меняется на активный. Только активный плагин можно редактировать, иначе он будет выступать в роли мастер-файла!

    При открытии удобно заполнить "шапку" нашего мода, которая будет отображаться в различных менеджерах загрузки модов.
    Указываю автора - себя, и в окошке ниже - краткое описание мода и, при желании, номер версии мода (номер придумал сам).






    Вчера мы создали контейнер с названием CB_Container, он послужит нам образцом, шаблоном для создания хранилищ-репозиториев. Но есть важная задача, которую необходимо решить прежде, чем двигаться дальше - где размещать хранилища?

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


    В первой версии мода я использовал для этих целей служебную ячейку QASmoke, но это не самый удобный вариант. Хотя бы потому что заставляет рядового игрока использовать консоль и запоминать "необязательную" информацию.

    В этот раз я собираюсь рассмотреть два варианта - размещение в известном, доступном игроку месте и создание собственной ячейки исключительно для размещения хранилищ.
    Итак, первый вариант, размещение контейнеров в уже известном мире. Плюсы - легкодоступность для игрока и простая реализация. Минусы - несомненная конфликтность с модами, изменяющими эту ячейку. Чем популярнее ячейка, тем больше вероятность ее "улучшения", а значит и конфликт с хранилищами.
    Вариант второй, собственная ячейка. Плюсы - полная "неконфликтность". Минусы - относительная сложность реализации, ведь доступ в ячейку возможен только через телепортацию (дверь, заклинание).
    И все-таки, прикинув свои возможности, я выбираю второй, сложный вариант, для обеспечения неконфликтности с любым модом, включая даже экзотический "Тропический Скайрим"! И пусть это потребует больше работы, но я постараюсь обойтись даже без телепортации.
    Механизм будет следующий - создание хранилищ в собственной ячейке и их динамическое размещение в доступном игроку месте.

    Теперь понятно что и где делать и я приступаю...

    Создаем ячейку. Поскольку ячейка будет служебной, без доступа игрока и без телепортации в нее ГГ, то нет необходимости в каких-либо "излишествах", она будет абсолютно пустой! Чтобы сделать такую "пустую" ячейку, выбираем меню World -- Cells... и в открывшемся окне, в списке кликаем ПКМ и выбираем пункт New.














    Вносим название ячейки, не забывая применять префикс.



    И убеждаемся, в окне Cell View, есть наша ячейка и она абсолютно пуста.





    Вызываем ячейку CB_Cell в окне Render Window, просто дважды кликнув по ней в окне Cell View. Для создания наших хранилищ перетягиваем в окно Render Window, созданный ранее контейнер CB_Container из окна Object Window. Перетягиваем контейнер столько раз сколько хранилищ нам необходимо!




    Чтобы различать наши хранилища присваиваем им имя. Для этого или дважды кликнуть по объекту в окне Render Window, или в окне Cell View выбрать пункт Edit.






    После добавления и переименования вот что получилось у меня - 12 хранилищ для всех категорий на которые я хочу делить попадаемые в инвентарь объекты.





    Жмем пиктограмму Сохранить, чтобы не потерять нашу работу.
    Осталось прицепить фильтр на каждый контейнер, чтобы туда попадали объекты только определенной категории. Сделаем это с помощью скриптов и так как событие это однообразное для большинства хранилищ, то сделаем его на основе шаблона скрипта.


    Переходим в окно Object Window и находим наш контейнер CB_Container. Открываем его для редактирования, жмем кнопку Add.



    В открывшемся окне-списке выбираем первый пункт [New Script] и жмем кнопку ОК.



    Нам предложат назвать новый скрипт. Я использую составное название, чтобы понимать к чему относится этот скрипт. Вы можете называть скрипты произвольно, но рекомендуется придерживаться хотя бы простейших правил, чтобы избежать беспорядка. Плюс, в данном случае, я заполнил поле документации - краткое описание назначения этого скрипта.




    После нажатия кнопки ОК, в свойствах контейнера, в окошке Скрипты появится добавленный скрипт. Взаимодействуют с ним с помощью ПКМ. Я использую Notepad++ как редактор скриптов Папирус, поэтому выбираю пункт Open in External Editor, вы можете использовать встроенный редактор, тогда для вас пункт Edit Source.






    В данном случае я собираюсь писать "универсальный" скрипт, который выступит шаблоном-образцом для всех моих хранилищ, поэтому методы его создания будут отличаться от создания "стандартного", обычного скрипта. Я не буду использовать возможности автоматического заполнения свойств скрипта, используемые мной названия свойств носят описательный характер. И да, мне придется использовать функцию SKSE.


    В "переводе" на человеческий язык, скрипт звучит так:
    Если в контейнер попал объект не соответствующий указанному типу, то вернуть его "отправителю". Если объект соответствует указанному типу, но является специальным объектом для активации данного контейнера, то вернуть его в инвентарь ГГ. Как вы заметили, хотя мы еще не создали эти "специальные объекты", но уже можем на них ссылаться. Это потому, что скрипты в Скайриме изолированы от игры. Именно поэтому применяются свойства (Property), как механизм передачи данных между скриптом и игрой.
    [spoiler="Сначала хотел листинг выкладывать тоже картинками, для "визуальности", но потом передумал"].

    [/spoiler] Scriptname CB_Box_Weapon_Script extends ObjectReference {Фильтр для контейнера} Form Property CB_Object Auto {специальный объект для активации этого контейнера} Int Property TypeObject Auto {тип объекта по списку SKSE 41 - Weapon 26 - Armor 46 - Potion 23 - Scroll - Food 30 - Ingredient 27 - Book 32 - Misc - Gem 52 - Soul - Ore - Anim} Event OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer) If akBaseItem.GetType() == TypeObject If akBaseItem == CB_Object Self.RemoveItem(akBaseItem, aiItemCount, True, Game.GetPlayer()) EndIf Else Self.RemoveItem(akBaseItem, aiItemCount, True, akSourceContainer) EndIf EndEvent


    А теперь обратите внимание, хотя скрипт мы прицепили к контейнеру (базовому объекту), каждое из 12 наших хранилищ тоже "обзавелось" копией этого скрипта. Нам осталось только заполнить свойства подходящими для них значениями. Открываем хранилище для редактирования, переключаемся на закладку Script, и пользуясь подсказкой в описании к свойствам, присваиваем нужное значение типа объекта.
    Например, для хранилища оружия под названием CB_Box_Weapon указываем тип объекта 41, для брони - 26 и так далее.





    Вы, наверное, уже заметили что не все типы объектов можно так определить. Например, еду (Food) или драгоценные камни (Gem) с помощью этой функции не обнаружить. Не страшно - применим для их определения другую функцию, а значит напишем и прицепим новый скрипт!


    В этот раз скрипт нужно цеплять непосредственно на хранилище. Переходим в окно Cell View, находим нашу ячейку CB_Cell, выбираем хранилище еды CB_Box_Food, открываем для редактирования, переходим на вкладку Script, выделяем имеющийся там скрипт и жмем кнопку Remove. Скрипт отмечается как удаленный - красным минусом.
    Добавляем новый скрипт - жмем кнопку Add, выбираем пункт New Script, вписываем новое название для скрипта и ОК. Новый скрипт добавится в список со знаком "плюс".




    Открываем скрипт для редактирования - ПКМ, пункт Edit Source или Open in External Editor.



    Скрипт для контейнера с едой "переводится" так - если объект не имеет ключевого слова или не является едой (функция SKSE), то вернуть его "отправителю". А если имеет ключевое слово или является едой, но при этом является и специальным объектом, то вернуть его в инвентарь ГГ. Scriptname CB_Box_FilterFood_Script extends ObjectReference {Фильтр по ключевым словам для контейнера} Potion Property CB_FOOD Auto {специальный объект для активации этого контейнера} Keyword Property VendorItemFood Auto {ключевое слово} Event OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer) If akBaseItem.HasKeyword(VendorItemFood) || (akBaseItem as Potion).IsFood() If akBaseItem == CB_FOOD Self.RemoveItem(akBaseItem, aiItemCount, True, Game.GetPlayer()) EndIf Else Self.RemoveItem(akBaseItem, aiItemCount, True, akSourceContainer) EndIf EndEvent
    После компиляции и сохранения скрипта, заходим в его свойства и, кликнув на кнопку Auto Fill, заполняем его значение. Это возможно потому, что название свойства (Property) и название ключевого слова (Keyword) совпадают!






    Для двух хранилищ, драгоценных камней CB_Box_Gem и руды и слитков CB_Box_Ore, скрипт одинаков, поэтому используем один на двоих!
    Открываем хранилище CB_Box_Gem, удаляем имеющийся скрипт и создаем новый. Scriptname CB_Box_FilterGemOre_Script extends ObjectReference {Фильтр по ключевым словам для контейнера} Keyword Property VendorItemGem Auto {ключевое слово} Event OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer) If akBaseItem.HasKeyword(VendorItemGem) Else Self.RemoveItem(akBaseItem, aiItemCount, True, akSourceContainer) EndIf EndEvent

    Открываем хранилище CB_Box_Ore, удаляем имеющийся скрипт и добавляем скрипт сделанный выше. Для этого жмем кнопку Add, и в списке по названию находим скрипт.




    А вот когда заполняем их свойства, то используем разные значения!





    Осталось "обработать" последнее хранилище CB_Box_Anim, предназначенное для хранения шкур, кожи и прочих частей животных.

    [success]
    В этом случае скрипт ничем не отличается от предыдущих, но использует два ключевых слова (Keyword). Когда есть возможность, я всегда использую названия объектов из Creation Kit, это позволяет автоматически заполнять свойства. Scriptname CB_Box_FilterAnim_Script extends ObjectReference {Фильтр по ключевым словам для контейнера} Keyword Property VendorItemAnimalHide Auto Keyword Property VendorItemAnimalPart Auto Event OnItemAdded(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer) If akBaseItem.HasKeyword(VendorItemAnimalHide) || akBaseItem.HasKeyword(VendorItemAnimalPart) Else Self.RemoveItem(akBaseItem, aiItemCount, True, akSourceContainer) EndIf EndEvent



    [/success]

    Жмем пиктограмму Сохранить.
    На этом этап создания хранилищ закончен. Половина мода сделана, ведь хранилища - основной компонент всего проекта! Остались мелочи - реализовать механизм по обслуживанию этих хранилищ, но это сделаем чуть позже...

    Продолжение здесь.
  9. Umbakano Jr
    Достаточно поигравшись с модом Репозитории (Collector bags v1.0) и столкнувшись с рядом проблем в совместимости, я понял, что надо менять концепцию мода. И менять кардинально. Поэтому, начинаю новый проект с "чистого листа". А поскольку задачи, которые я буду решать, могут заинтересовать начинающих мододелов, постараюсь как можно детальнее проиллюстрировать весь процесс создания мода.

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

    Главной проблемой первой версии мода стали объекты не подлежащие немедленной сортировке. И если задачу, например, с медвежьими шкурами, которые надо насобирать определенное количество, или Алыми корнями Нирна и тому подобное, можно решить путем создания "стоп-листа", то специальные объекты из DLC HearthFire вообще не видны игроку и не должны перемещаться из инвентаря! Таким образом, правильное решение - это отсутствие действия автосортировки по-умолчанию!

    Итак! Цели обозначены, проблемы определены. Попробую представить порядок действий мода, пока в общих чертах.

    Объекты попадающие в инвентарь остаются в нем. Игрок создает и редактирует список объектов для автосортировки. В результате, объекты из этого списка, попадая в инвентарь, автоматически сортируются по категориям в хранилища.
    Такой подход позволит "штатную" работу квестовым и "невидимым служебным" предметам. Это удобно для изучения новых ингредиентов, которые желательно "съесть", а потом уже собирать, а также для продуктов питания, например, порционные бурдюки с водой желательно оставлять в инвентаре.
    Доступ к хранилищам - через удаленную активацию контейнера.

    Необходимые шаги по созданию мода:

    * Создаю контейнеры для каждой категории, к которой хочу иметь отдельный доступ и размещаю в "мире". Необходимо продумать размещение для облегчения доступа игрока к ним.

    * На каждый контейнер вешаю скрипт, проверяющий поступающий объект на наличие "keyword" характеризующего данную категорию. Это исключит попадание "сторонних" объектов в это хранилище.

    * Если в первой версии, любой объект попавший в инвентарь подвергался сортировке, то теперь этого не будет. При попадании объекта в инвентарь ничего не происходит! Это позволит работать игровым скриптам в "штатном" режиме.

    * Автосортировка будет производится на основе списка объектов, выбранных игроком. Нужно придумать механизм создания такого списка. В первой версии это был динамически создаваемый FormList.

    * Имея список для сортировки, можно использовать функцию AddInventoryEventFilter() для реагирования на событие добавления объекта. Объекты из списка будут автоматически рассортированы по хранилищам.

    * Добавление в хранилище объектов "не из списка", т.е. одноразовое, сделать без открытия соответствующего хранилища. Просто выбрав в инвентаре объект и нажав "горячую клавишу" , отправляю его в нужное хранилище. Это значительно сэкономит время обработки и решит проблему с зависанием открытия сундука, время от времени появлявшуюся в первой версии мода.

    * Доступ к хранилищам для изъятия объектов. Если организовать доступ через меню, это получится слишком громоздко и не вместится в одно окно, что усложнит скрипт. Вероятно, использую метод из первой версии - создание специальных объектов инвентаря в каждой категории.

    * Автовыгрузка перед использованием станков крафтинга. Вероятно, использую метод из первой версии - создание специального объекта инвентаря в категории Разное.

    Ну вот, в общих чертах, алгоритм готов и можно приступать к созданию!

    Открываем Creation Kit, выбираем пиктограмму Открыть.
    В появившемся окошке выделяем флажком файл Skyrim.esm и жмем ОК.
    Некоторые модмейкеры выделяют и файл Update.esm, но делать это не нужно!
    Это не испортит ваш мод, но может добавить проблем в случае создания патчей на его основе.





    Первым шагом будет создание контейнеров. В окне Object Window выбираю категорию Container.
    Мне важно, как будут выглядеть контейнеры, ведь игроку, при обновлении мода, потребуется с ними взаимодействовать. Поэтому выбираю модель ларцов, они небольшие по размеру и это важно, ведь категорий, а значит и хранилищ, будет много.





    Для простоты создания, нахожу готовый контейнер, использующий модель StrongBox01 и очищаю его содержимое. Даю ему свое название и имя и при закрытии указываю - создать новую форму.




    Немного о названиях объектов внутри мода.
    Рекомендуется, хотя совсем не обязательно, использовать префиксы в названиях создаваемых объектов. Это значительно облегчает их поиск, выделяет среди встроенных игровых объектов! Префиксы - это произвольные сокращения или легко набираемые аббревиатуры, размещаемые в начале названия объекта и одинаковые в пределах одного мода. Например, xxxNewBox или aaaaNewBox.
    Для своих модов я применяю сокращения от английского названия файла плагина, в данном случае CB_, поскольку файл называется Collector bags.



    Создав этот объект, можно сохранить мод.
    Жмем на пиктограмму Сохранить и, в появившемся окне, вписываем название для своего плагина.
    Название должно быть на английском языке, точнее, использовать символы английского алфавита, и очень желательно, информативным - чтобы по названию можно было бы понять о чем он.




    Сохранив свою работу, закрываем Creation Kit. Продолжим завтра...
    Продолжение здесь.
  10. Umbakano Jr
    Сбылась мечта-идея, вынашиваемая около года!

    Очень хотелось сделать не просто улучшения колуна и кирки, а чтобы эти улучшения были логически обоснованы. В настоящий момент, разные моды, в том числе и мой, с подачи пользователя fr0d016, улучшают на точильном камне колун и кирку. Но, сами по себе эти улучшения ничего полезного не несут - незначительное увеличение урона, вот и вся польза!

    А теперь, встречайте!



    Теперь каждое улучшение инструмента приводит к изменениям не только его характеристик, но и внешнего вида, а также, увеличению производительности труда!
    Теперь у игрока есть стимул для улучшения инструментов! Ведь чем лучше инструмент, тем больше материала получаешь за один подход!
    Это ощутимое подспорье для заработка на дровах у персонажей начального уровня.

    Еще более привлекательно, смотрятся в этом свете, улучшенные кирки. Они совместимы с DLC, и значительно облегчат жизнь строителям собственного жилья!
    Имея при себе разные виды инструмента, вы можете "регулировать" количество добываемого материала. Например, вам не надо столько железной руды - используйте простейший инструмент, попалась жила с редкой рудой - грех не извлечь максимальное количество.

    Идеалом, пиком совершенства, при улучшении кирок, является Кирка геолога! Уже не нужно носится по всему краю в поисках конкретной, но такой редкой, руды! Кирка геолога позволит вам самим выбрать какую руду добывать из этой жилы!

    И это не все!
    Все улучшенные инструменты в процессе использования изнашиваются и превращаются в более простую модель! Вам придется заново использовать точильный станок, чтобы вернуть улучшенный вариант. И чем лучше инструмент, тем быстрее он изнашивается!

    А воспоминания о Нериме! Славный звук ломающихся инструментов...
    Да-да, все улучшенные инструменты не вечны и когда-нибудь сломаются совсем! И чем "дороже" инструмент, тем короче у него "срок жизни". И тогда вы услышите звук падающего из рук инструмента...

    Теперь о том, как эти инструменты сделать и как ими пользоваться.
    Для моей реализации, стандартная функция точильного камня не годилась. Но и добавлять еще один точильный камень не было смысла. Поэтому, был придуман вариант использования точильного камня в двух режимах! Чтобы включить такой режим нужно экипировать любой инструмент (колун, кирку). При этом название активации станка изменится на: "Точильный камень: Режим заточки". В этом режиме возможно улучшать инструменты. Параллельно доступен стандартный режим - для улучшения оружия. Вы можете выбирать между режимами, перед активацией, перемещая курсор с абразивного круга на место для сиденья.

    Перед колкой дров или добычей руды, теперь необходимо выбрать и экипировать нужный инструмент. Для индикации готовности, надпись на рубочной колоде или выходе руды изменится, например на "Колун (Хорош.) готов"

    Вот, собственно, и все! Я доволен как паровоз.
    Осталось только "обкатать" пару дней, чтобы убедиться что инструменты изнашиваются и ломаются правильно и не слишком часто/редко.
  11. Umbakano Jr
    По моим ощущениям - я на финишной прямой!

    Конечно, времени потрачено много, но и сделано немало. Тройка дней потрачена на создание коллизий для новых объектов, потом столько же на попытки их использовать! Мог ли я подумать, что объекты типа Misc не годятся для "призыва на себя" статиков! После выбрасывания в мир объекта типа Misc его координаты положения сохраняются в точке появления, обычно это на высоте роста ГГ. И потом независимо куда я его потащил и где активировал, его координаты продолжают ссылаться на ту точку и, естественно, новый объект проявляется там, а не в месте активации. Поэтому пришлось прибегнуть к другим типам объектов, в частности, экстрактор и куб, до своей установки, будут иметь тип BOOK. Но результат достигнут - где активировал, там и получил новый объект!

    Итак, что мы имеем. По сюжету, вся аппаратура и необходимая литература, сосредоточена в Хижине Алхимика. В дневник Алхимика сделана приписка о спрятанных вещах. Сами предметы "замаскированы" в самой хижине и рядом с ней. Точный указаний давать не буду, но найти придется следующее:
    1. крышка алх. котла (рис.1)
    2. алх. куб (рис. 2)
    3. алх. экстрактор( рис. 3)
    4. Молчащая книга (книга рецептов создания вышеперечисленного) (рис. 4)
    5, Чертеж топки



    Работать с аппаратурой, на мой взгляд, просто.

    Алхимический котел собирается из трех частей (топка, обычный казан и крышка на него). Раскладываете чертеж топки в нужном месте, активируете и получаете топку. При наличии в инвентаре казана, активация топки установит его, аналогичные действия и для крышки. Чтобы котел заработал нужно в топку загрузить уголь. Одного бруска угля хватает на определенное время, по истечении которого огонь тухнет и котел перестает работать. Уголь можно добавлять/закладывать/забирать в любых количествах. Котел принимает только ванильные зелья в двух экземплярах и выдает один пузырек с усиленным эффектом.

    Куб принимает ванильные продукты питания естественного происхождения (сырые овощи, фрукты, мясо) и ванильные вино-водочные напитки и возвращает их же, но уже в качестве ингредиентов (операция действует в обоих направлениях). В таком виде их можно использовать на обычном алхимическом столе.

    В экстрактор можно загрузить ванильные продукты питания не подвергавшиеся термической обработке и получить соответствующую вытяжку. Количество и ассортимент одновременной закладки не ограничен! Агрегат выдаст правильное количество каждого типа.

    Молчащая книга необходима при крафтинге вышеперечисленных изделий. Только при ее наличии в инвентаре будут "видны" рецепты. Рецепты не сложные, двух-трех составные.

    Единственный предмет существующий в одном экземпляре - чертеж топки, но его можно (и нужно) забирать после создания самой топки.
    Таким образом, можно обеспечить себя любым количеством алхимической аппаратуры и установить ее в любом удобном для вас месте.

    Обращаю ваше внимание, что магические чернила на данной аппаратуре создаваться не будут. Для них я планирую создать собственный оригинальный агрегат в рамках модуля Scrolls.

    Что осталось сделать:
    Планирую разместить статическую (нерабочую) модель котла где-нибудь в районе Университета Волшебства, просто чтобы при случае она "сообщала", где искать все эти предметы. К сожалению, на то что должно уходить ровно минуту, я потрачу пару часов. Мой старый компьютер "не тянет" рендер в редакторе, поэтому размещаю все объекты "по старинке" - в таблицах с помощью TESVSnip, что требует многократного зайти/выйти в игру.
    Плюс, меняю структуру папок и файлов в архиве мода, для поддержки Мастера-Установщика.

    После этого, скорее всего выложу то что получится, и сразу займусь следующими модулями, в первую очередь - дробилками.
  12. Umbakano Jr
    Итак, главный котел закончен - звуки и эффекты "прикручены", меню крафтинга прицеплено. Все работает, все нравится, но...
    Мне показалось это слишком просто! Захотелось большего!

    Почему бы не задействовать готовые зелья при создании новых на стандартном алхимическом столе? Почему бы не применять вина/бренди в алхимических опытах? Для этого нужно лишь "превратить" группу ALCH в группу INGR!

    Идея показалась интересной и вот этим я и занимался эти дни.

    Как оказалось, группы INGR(ингредиенты) и ALCH(Potion) по своей структуре практически идентичны! Отличие только в размере одного поля Data - остальное все совпадает! Даже окошки свойств для этих объектов содержат одинаковые поля, хотя я точно помню, что в первых версиях конструктора для объектов Potion невозможно было прицепить скрипт. Значит, Беседка развивает формат, стремясь к какой-то своей цели! Может быть даже планирует объединить эти группы?

    Для меня же, задача упростилась и свелась к дублированию записей Potion и смене принадлежности на группу INGR. Для этого, я открыл skyrim.esm в TES5Edit, выделил все записи из группы зелий и скопировал их в новый плагин. TES5Edit, в случае групповых операций, предлагает переименовывать объекты используя префиксы и суффиксы, что очень удобно! Таким образом я получил список с новыми объектами, но идентичные по свойствам группе зелий.

    Далее, имея новый плагин с новым списком зелий, я воспользовался программой TESVSnip. Она предоставляет низкоуровневый доступ к структуре мода, так что можно отредактировать служебные поля, недоступные изменению в других программах. Таким образом, я заменил для каждой записи заголовок ALCH на INGR, и получил список новых ингредиентов по свойствам идентичными своим "образцам"! Исключение составило поле Data, содержимое которого, скорее всего "испортилось", но я надеялся его восстановить в последствии.

    Следующим шагом стала загрузка этого списка в конструктор. КК при загрузке нормально обработал эти новые записи и я получил "новые ингредиенты". Единственной информацией, потерянной из-за несовпадение поля Data, стали вес и цена! Но их легко я внес прямо в конструкторе.

    Итак, я получил зелья, напитки и "сырые" продукты питания как ингредиенты и мог их использовать на обычном алхимическом столе! Но, предстояло решить задачу внедрения этих новых объектов в "жизнь" (в игру).

    Я пошел по пути "наименьшего сопротивления" и ввел в игру "алхимический куб", который при активации "конвертирует" добавляемые в него объекты ALCH в INGR и наоборот! Это значит, что если вы захотите использовать корзину яблок или готовые яды в своих алхимических опытах, вам придется конвертировать их в ингредиенты. Остатки можно конвертировать обратно в исходные объекты, а можно носить и пользоваться ими и в таком виде - эффект идентичен!

    Не буду описывать подробно весь процесс создания скрипта для такого "куба", это та еще песня! Ведь пришлось работать с большим количеством объектов, а это значит, с большим количеством Property и еще большим количеством однообразных блоков кода скрипта. Но упомяну основные этапы этой работы.

    Использовать КК для ввода большого количества Property нецелесообразно! Это займет несколько дней! Поэтому, я использовал SkyEdit для экспорта нужных записей в файл csv(таблица). Открыл этот файл редактором электронных таблиц и операциями замены текста и применением формул, сформатировал список Property и целые блоки кода с нужными Property. А потом вставил их в файл скрипта и применил Autofill. Таким образом, скрипт размером более чем в 3200 строк я изготовил чуть более за час!

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

    Из запланированного осталось сделать аппарат для получения эссенций. Да-да! Я решил сделать эту функцию отдельным агрегатом и несколько другим способом нежели котел.

    Так что работы продолжаются!
  13. Umbakano Jr
    Наконец-то я "добрался" до своего главного мода и могу поправить некоторые "шероховатости".
    В данный момент, уже готовы модели для нового алхимического котла, который будет собираться из топки, казана и специальной крышки:


    Квестов, как таковых, на их получение не планирую. Полагаю, будет документ описывающий возможность создать/собрать такой котел и этого достаточно. Размещение котла - произвольное, но без возможности разобрать/передвинуть.

    В результате должен получится вот такой агрегат:


    Топится будет углем, соответствующие модели костров в топке будут.
    Планирую изменить алгоритм создания зелий и вернуться к стандартному меню крафтинга - это быстрее в реализации и привычнее пользователю, хотя теряется эффект визуализации...

    P.S. Блоги для меня дело новое непривычное, возможны некие "накладки" пока осваиваюсь...
×
×
  • Создать...