-
Постов
3 967 -
Зарегистрирован
-
Посещение
-
Победитель дней
9
Тип контента
Профили
Новости
Статьи
Мемы
Видео
Форумы
Блоги
Загрузки
Галерея
Весь контент Umbakano Jr
-
По-хорошему, надо ставить менеджер модов (NMM или Wrye Bash) и провести повторную установку модов (хотя бы тех, которые отвечают за текстуры деревьев). Но, можно попробовать, зайти стандартным лаунчером сначала в Файлы, потом в игру. Может поправит...
-
Нужно не только отключать водные моды, но и деинсталлировать их, чтобы забрать файлы из папки Data. И обязательно, после каждого отключения мода, нужно пересоздавать башед патч, иначе он "помнит" удаленные моды.
-
Тогда получается правильно... наверное, на мастер-файл завязан. Все перечисленные вами глюки - явные признаки конфликтов модов, вот только определить каких тяжело!
-
Чем или как удаляли моды? Похоже моды удалились, но перерегистрации архивов bsa не произошло... поэтому неизвестно откуда брать текстуры!
-
Я, все таки, не уверен в вашей сортировке! Первое что бросается в глаза патч 13 All Natural - MMM Patch.esp грузится значительно раньше самого МММ! Это вызыввает недоверие ко всему порядку загрузки...
-
Скачать программу TES5Edit Указанные модели и, не указанные здесь текстуры, обычно запакованы в архив bsa этого мода. Вам нужно открыть эти архивы, найти нужные файлы моделей и текстур и распаковать их прямиком в папку Data, так чтобы путь, указанный на картинках, соблюдался!
-
Вот это же полностью заменяет воду! Может с этим что-то связано? И я не понял, башед патч создавался или просто "для красоты"?
-
Ты отключи, и если где в игре "розовое" увидишь, будет понятно!
-
Если точно известно, что новых текстур там нет, а только дублируются имеющиеся с иным качеством, то можно отключить. Иначе, новые не будут отображаться.
-
Дату изменить можно справа/вверху окна, там где она отображается. Начните ее редактировать и чуть ниже появятся кнопки Сохранить/Отмена. Проблемы потому, что "скачал". На лицензии таких проблем нет. Скорее всего, вам нужно просто отсортировать порядок модов, для этого есть программа BOSS.
- 780 ответов
-
- bashed patch
- башед патч
-
(и ещё 2 )
C тегом:
-
Есть "лицо компании", а булочка у нас - "голос сайта"!
- 583 ответа
-
Пароль могут восстановить, выслав сообщение на ваш электронный ящик, если его не забыли...
- 583 ответа
-
- 1
-
-
Да, только почему у этой новости борода аж с 11/12/2012?
-
Начало здесь. Приступим к "прикручиванию" скриптов к репозиториям для придания им функциональности. Иначе говоря, заставим их делать то, для чего они предназначены - открывать хранилища! Из предыдущего опыта я знаю, что скрипты можно повесить прямиком на репозитории и они будут замечательно работать, но... Поскольку это объекты инвентаря, которые мы "одеваем", возникнет необходимость "снять", и эта процедура из самого объекта не работает и придется прикручивать ее к "игроку". А раз так, то логичнее все сразу "расписать" в одном скрипте, а не "распылять" по множеству объектов! В окне 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(), чтобы когда удаляется один из репозиториев, восстанавливать его количество в инвентаре. Дабы не "раздувать" скрипт однотипными командами, добавил функцию - она нужна только для компактности кода. На этом этапе мы получили полноценный рабочий мод! Бездонные хранилища для каждой категории отдельно! И хотя на этом останавливаться я не собираюсь, но уже можно гордиться результатом... Продолжение здесь.
-
Начало здесь. Пару дней ушло на "творческие метания"! Пытался совместить свои желания с возможностями игровой механики. Я совершенно точно знаю, что хочу видеть в моде - перемещение объекта из инвентаря в нужное хранилище без открытия последнего! И хотя 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] Продолжение здесь
-
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 Может этот туториал чем поможет? На том сайте есть где "порыться" среди туториалов...
- 3 846 ответов
-
- 2
-
-
- как создать торговца
- oblivion cs торговец
- (и ещё 3 )
-
Тогда, скорее всего, они запакованы в Oblivion - Textures - Compressed.bsa
- 3 846 ответов
-
- 1
-
-
- как создать торговца
- oblivion cs торговец
- (и ещё 3 )
-
Заведи себе еще один ящик, на gmail и сможешь регаться на нексусе...
-
Начало здесь. Вчера мы закончили создавать хранилища, а ночью, пока все спали, я зашел в игру, "телепортировался" в ячейку 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. Появится запись, которую надо изменить на желаемую нам. Вот так, добавляя новую запись и заменяя ее на желаемую, вводим полный список репозиториев. Теперь жмем ОК для сохранения этого псевдонима, и еще раз ОК, чтобы сохранить квест. Сохраняем нашу работу - жмем пиктограмму Сохранить. На сегодня это все, но хотелось бы увидеть результат, поэтому захожу в игру, и с удовлетворением вижу репозитории: Продолжение здесь.
-
Ага, только в блогах такой мульки функции нет!
-
Постоянно слетает форматирование! За это время я бы уже закончил мод... вот это круто! P.S. Вот опять... пока одно исправлял, другое слетело!
-
Достаточно поигравшись с модом Репозитории (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. Продолжим завтра... Продолжение здесь.
-
Начало здесь. Продолжаю дневник о разработке мода, создаем хранилища. Загружаем 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] Жмем пиктограмму Сохранить. На этом этап создания хранилищ закончен. Половина мода сделана, ведь хранилища - основной компонент всего проекта! Остались мелочи - реализовать механизм по обслуживанию этих хранилищ, но это сделаем чуть позже... Продолжение здесь.