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

Umbakano Jr

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

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

  • Посещение

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

    9

Весь контент Umbakano Jr

  1. По-хорошему, надо ставить менеджер модов (NMM или Wrye Bash) и провести повторную установку модов (хотя бы тех, которые отвечают за текстуры деревьев). Но, можно попробовать, зайти стандартным лаунчером сначала в Файлы, потом в игру. Может поправит...
  2. Нужно не только отключать водные моды, но и деинсталлировать их, чтобы забрать файлы из папки Data. И обязательно, после каждого отключения мода, нужно пересоздавать башед патч, иначе он "помнит" удаленные моды.
  3. Тогда получается правильно... наверное, на мастер-файл завязан.  Все перечисленные вами глюки - явные признаки конфликтов модов, вот только определить каких тяжело! 
  4. Чем или как удаляли моды? Похоже моды удалились, но перерегистрации архивов bsa не произошло... поэтому неизвестно откуда брать текстуры!
  5. Я, все таки, не уверен в вашей сортировке! Первое что бросается в глаза патч 13 All Natural - MMM Patch.esp грузится значительно раньше самого МММ! Это вызыввает недоверие ко всему порядку загрузки...
  6. Скачать программу TES5Edit                                                       Указанные модели и, не указанные здесь текстуры, обычно запакованы в архив bsa этого мода. Вам нужно открыть эти архивы, найти нужные файлы  моделей и текстур и распаковать их прямиком в папку Data, так чтобы путь, указанный на картинках, соблюдался!  
  7. Вот это же полностью заменяет воду! Может с этим что-то связано? И я не понял, башед патч создавался или просто "для красоты"?
  8. Ты отключи, и если где в игре "розовое" увидишь, будет понятно!
  9. Если точно известно, что новых текстур там нет, а только дублируются имеющиеся с иным качеством, то можно отключить. Иначе, новые не будут отображаться.
  10. Дату изменить можно справа/вверху окна, там где она отображается. Начните ее редактировать и чуть ниже появятся кнопки Сохранить/Отмена. Проблемы потому, что "скачал". На лицензии таких проблем нет. Скорее всего, вам нужно просто отсортировать порядок модов, для этого есть программа BOSS.
  11. Есть "лицо компании", а булочка у нас - "голос сайта"!
  12. Пароль могут восстановить, выслав сообщение на ваш электронный ящик, если его не забыли... 
  13. Да, только почему у этой новости борода аж с 11/12/2012?
  14. Начало здесь. Приступим к "прикручиванию" скриптов к репозиториям для придания им функциональности. Иначе говоря, заставим их делать то, для чего они предназначены - открывать хранилища! Из предыдущего опыта я знаю, что скрипты можно повесить прямиком на репозитории и они будут замечательно работать, но... Поскольку это объекты инвентаря, которые мы "одеваем", возникнет необходимость "снять", и эта процедура из самого объекта не работает и придется прикручивать ее к "игроку". А раз так, то логичнее все сразу "расписать" в одном скрипте, а не "распылять" по множеству объектов! В окне 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(), чтобы когда удаляется один из репозиториев, восстанавливать его количество в инвентаре. Дабы не "раздувать" скрипт однотипными командами, добавил функцию - она нужна только для компактности кода. На этом этапе мы получили полноценный рабочий мод! Бездонные хранилища для каждой категории отдельно! И хотя на этом останавливаться я не собираюсь, но уже можно гордиться результатом... Продолжение здесь.
  15. Начало здесь. Пару дней ушло на "творческие метания"! Пытался совместить свои желания с возможностями игровой механики. Я совершенно точно знаю, что хочу видеть в моде - перемещение объекта из инвентаря в нужное хранилище без открытия последнего! И хотя 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] Продолжение здесь
  16. http://tiarum.com/wiki/Oblivion:%D0%9C%D0%B5%D1%87_%D0%B7%D0%B0_%D1%87%D0%B0%D1%81_-_%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC_%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82%D1%8B_%D0%B8_%D0%9D%D0%BE%D0%B6%D0%BD%D1%8B Может этот туториал чем поможет? На том сайте есть где "порыться" среди туториалов...
  17. Автор темы явно использует мод skyBirds. Я тоже его использую, к тому же, в сочетании с рекомендованными плагинами. И получается очень живенько и натурально, особенно озвучка атмосферна! С птичек "насобирал" немало всякого, но вот зелья еще не варил... не добрался.
  18. Заведи себе еще один ящик, на gmail и сможешь регаться на нексусе...
  19. Начало здесь. Вчера мы закончили создавать хранилища, а ночью, пока все спали, я зашел в игру, "телепортировался" в ячейку 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. Появится запись, которую надо изменить на желаемую нам. Вот так, добавляя новую запись и заменяя ее на желаемую, вводим полный список репозиториев. Теперь жмем ОК для сохранения этого псевдонима, и еще раз ОК, чтобы сохранить квест. Сохраняем нашу работу - жмем пиктограмму Сохранить. На сегодня это все, но хотелось бы увидеть результат, поэтому захожу в игру, и с удовлетворением вижу репозитории: Продолжение здесь.
  20. Ага, только в блогах такой мульки функции нет!
  21. Постоянно слетает форматирование! За это время я бы уже закончил мод... вот это круто!   P.S. Вот опять... пока одно исправлял, другое слетело!
  22. Достаточно поигравшись с модом Репозитории (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. Продолжим завтра... Продолжение здесь.
  23. Начало здесь. Продолжаю дневник о разработке мода, создаем хранилища. Загружаем 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] Жмем пиктограмму Сохранить. На этом этап создания хранилищ закончен. Половина мода сделана, ведь хранилища - основной компонент всего проекта! Остались мелочи - реализовать механизм по обслуживанию этих хранилищ, но это сделаем чуть позже... Продолжение здесь.
  24. Прямых конфликтов не должно быть ни с одним модом, ведь я не изменяю, а добавляю рецепты "ломания" предметов. Даже если какой-либо мод занимается тем же, будут просто дублированы рецепты, но это даже не проблема!
×
×
  • Создать...