Т.е. при входе в локацию скрипт их открыл и открыл только их!
Такое ощущение, что в этих дверях как-то спутаны фазы, нет синхронности отработки модели и состояния двери. Коллизия это только как пример одной из лаж самой модели. Что-то мне подсказывает, что бороться с этим не стоит, хотя можешь попробовать.
добавил.. новую игру начинал. дубасил и что тока я не делал - не появляются вещи... может как то влияет уровень? проверяю персом 1 уровня...
А на шмотках кейворд VendorItemClothing поставлен? Если на шмотках кейворд VendorItemArmor, то такими шмотками в том магазине торговать не будут, там бронёй не торгуют. Только одежда и украшения. Всё броню надо другому торговцу отдавать, хоть в соседний магазин, там старушка точно будет торговать.
Можно ли без SKSE получить в скрипте список всех предметов в инвентаре актёра/контейнера?
Можно, но геморойно. Для этого надо удалить/переместить все вещи в другой контейнер, и в этот момент отслеживать события (OnItemRemoved) на удаление предметов. При каждом срабатывании этого события ID записывается в массив. Желательно "организовать очередь" из событий. Потом все вещи возвращаются в исходный контейнер. Если это актёр, то одеваются вещи, которые были до этого одеты. Это и муторно и некрасиво смотрится.
Поэтому тот вариант с SKSE на два порядка проще и удобнее.
Это право игрока решать, что ему ставить, а что нет. Если моду что нужно, то оно должно быть включено в мод.
Это бесспорно, что ставить и что нет, решает сам игрок. Но причём тут SKSE? Ведь полная аналогия с этим - использование ресурсов из DLC, в этом случае игрок так же вынужден ставить этот DLC для использования мода. Сам же DLC никто не внедряет в свой мод, а просто пишут в требованиях к моду его наличие. Дальше уже сам игрок решает, есть ли смысл ставить этот DLC (если он не стоит), чтобы использовать данный мод. Точно так же и с SKSE - это простое требование к моду, т.е. это ресурс, которым будет пользоваться мод.
Зависимость SKSE от версии игры - полная аналогия с версиями самой игры. Более свежая версия SKSE будет работать со всеми модами, сделанными на ранних версиях.
Единственный реальный фактор - это для чего именно делается мод. Если для себя, для своего хобби и своего желания заниматься любимым делом, то какая разница автору, поставит ли "Вася и т.д." этот мод или нет, из-за применения в нём SKSE. Главное, чтобы мод работал именно так, как хочет автор. Но если мод делать для кого-то или по другим соображениям, тогда да, надо учитывать желания потребителей.
Собственно мне нужен был не сам перебор, а проверка какие вещи одеты в момент снятия вещи. Ради эксперимента прикручиваю к своему моду одевание трусов и лифа при снятии вещей с мёртвых НПС. Пока придумал решение: добавить keyword в вещи и проверять наличие этих keyword. Благо НПС используют одежду из моего мода.
Ну так это совсем другой вариант, здесь не надо узнавать содержание инвентаря. Всё гораздо проще: 1. Делаешь перк Activate и даёшь ГГ. Условия: если цель == НПС и цель мертва. 2. В перке скрипт, он передаёт референс НПС алиасу, на котором висит скрипт. 3. В этом скрипте событие на снятие предмета. Когда ГГ снимает с НПС шмотку, то это событие отдаёт ID снятой шмотки. Вот её и можно проверить и при совпадении параметров (типа слот боди) одевает на НПС лифт. И т.д. 4. Чтобы отследить закрытие инвентаря, достаточно после команды на назначение НПС алиасу поставить Utility.Wait(1.0), тогда любая команда отработает только после закрытия инвентаря. Этой командой выключаешь режим слежения за снятием шмоток (алиас.Clear()).
И не надо SKSE.
******** Возможно, и вторая задумка может быть реализована на другом принципе, это уже от самой задумки зависит.
Моды делают с применением SKSE не от удовольствия, а от того, что дефолтными методами добиться желаемых результатов никак. А это значит, что мод уже сложнее простого "добавить-удалить", а грамотно написать такое могут далеко не многие, и ещё меньше - учесть все возможные последствия вносимые своим модом/командами/действиями. Вот такие моды и могут давать наибольшие глюки в игре, а простенькие моды, естественно, и глючат меньше, хоть и не всегда. Надо иметь талант, чтобы сделать меч или броню, которая сможет загубить игру или сохранение. :D
есть в разделе match Condition раздел где можно создать вещь только после того как прочитал книгу? я хочу чтобы я прочитал книгу и после этого в разделе да пустим кожаное появился предмет?
Можно так сделать: Делаешь свой ConstructibleObject и графу "Результат" оставляешь пустой. В книге вешаешь скрипт:
ConstructibleObject Property myConstObject Auto WEAPON Property kResult Auto
Event OnRead() if myConstObject.GetResult() == none myConstObject.SetResult(kResult) endif endEvent
Свойству kResult назначаешь свой меч, а свойству myConstObject - свой ConstructibleObject.
При прочтении книги в соответствующем разделе появится этот меч. НО! Подобные функции, как правило, работают только одну игровую сессию (до первого выхода из игры), и эта тоже. Поэтому при старте игры надо обновлять данные (опять применять эту команду). Или можно носить с собой книгу, типа изготовление этого предмета сложное и без шпаргалки не обойтись, тогда книгу опять прочитал и пошёл делать свой меч.
Важно!!! Требуется SKSE!
Добавлено (11 Ноября 2013, 19:07) --------------------------------------------- Но можно и не мудрить, а просто в условиях ConstructibleObject поставить нужное условие: глобалку, наличие у ГГ предмета, наличие заклинания/способности, и т.д.
Можно сделать добавление ГГ этих "условий" через скрипт (Event OnRead()) или как при стандартном изучении заклинаний.
При создании в квесте алиаса на уникальный персонаж Грелод Добрая, квест перестаёт работать. Просто от создания Алиаса, который ещё даже нигде в квесте не используется. Почему это может происходить?
При запуске квеста заполняются его алиасы, и если какой-то алиас заполнить не удаётся и на нём нет галочки Optional, то квест запускаться не должен. Поставь галочки Allow Dead, Allow Disabled, Allow Reserved, и проверь квест, возможно, всё заработает.
Собственно, на диске С у меня ничего и нет. Подскажите пожалуйста, что можно сделать?
Файлы локализации на Драконборн есть в ...\Steam\SteamApps\common\Skyrim\Data\Strings ? (Dragonborn_Russian.DLSTRINGS, Dragonborn_Russian.ILSTRINGS и Dragonborn_Russian.STRINGS)
СК их не видит. (BSA архивы здесь ни причём)
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №220
| Тема: Вопросы по скриптам Papyrus
написано: 22 ноября 2013, 00:29
| Отредактировано: AleksTirex - 22 ноября 2013, 00:34
И главное в игре же есть спец функция HasMagicEffect для этого, но увы, она совсем не работает.
anton, а кто мешает сымитировать данную функцию? Сделай, как написал LordVadim, а после задержки не команду ставь, а меняй свойство, и уже это свойство пропиши как условие вместо HasMagicEffect. Например, меняй свойство bMag01 в квесте из своего маг.эффекта (скрипт квеста и свойство сделай conditional). При старте первого маг.эффекта в его скрипте (myQuest as myQuestScript).bMag01 = true при его завершении Utility.Wait(№№) (myQuest as myQuestScript).bMag01 = false
В условии второго маг.эффекта ставишь GetVMQuestVariable - myQuest - ::bMag01_var == 0 (+ остальные нужные условия)
Тогда второй маг.эффект сможет запуститься только после окончания первого + своё назначенное время (это не помешает запускаться второму эффекту при не запущенном первом, т.к. bMag01 будет всегда false). Т.е. запускать эффект будет движок.
Доброго дня. Делаю собаку-компаньона, которая живет в созданном мной доме. Собака выглядит как Хаски (без брони), но на базе хаски с броней (так как собаки-компаньоны в Страже Рассвета проходят, как хаски в броне). Сделала собаку по уроку Кальяна, и появились проблемы. 1) Вместо "Следуй за мной" выдает "Жди здесь/Нам пора расстаться". И второе. Когда я жму "Пора нам расстаться" собака идет на свое место, но после этого взять ее ещё раз невозможно. Все скрипты стандартные - свои я создавала через копирование и заменяла меняла только одно условие (вместо расы - собака, ставила конкретного персонажа). Можно ли с этим что-нибудь сделать?
Можно - надо сделать это правильно. Это не сарказм и не шутка, просто изначально сделано не верно. (и не смотрите и не читайте уроки, а делайте сами, можно даже методом проб и ошибок, и тогда не будет таких непоняток типа "сделал по учебнику, но не работает...")
Надо всё сделать заново:
1. Не надо вообще трогать квест компаньона. 2. Копируешь стандартную собаку TrainedDog со своим ID, удаляешь фракцию MarkarthStablesFaction и пакет MarkarthDogOutsidePackage8x12. Если надо, то добавляешь свой пакет. 3. Делаешь скин для собаки на основе своего нифа (из Даунгарда). Можно так же скопировать дефолтный и поменять путь к своему нифу. 4. Назначаешь этот скин своей собаке. (меняешь имя собаке и остальное по необходимости) 5. На собаку вешаешь скрипт:
ScriptName myAnimalDogScript extends Actor
Quest Property DialogueFollower Auto Faction Property CurrentFollowerFaction Auto GlobalVariable Property PlayerAnimalCount Auto
Event OnActivate(ObjectReference akActionRef) if akActionRef == Game.GetPlayer() if !self.IsInFaction(CurrentFollowerFaction) && PlayerAnimalCount.value == 0 (DialogueFollower as DialogueFollowerScript).SetAnimal(self) endif endif endEvent
6. Собаку добавляешь в свой дом - компаньон готов.
**** Скрипт на собаке нужен для взятия её в компаньоны (название скрипта напиши своё). Заполнить свойства можно нажатием кнопки Auto-Fill All Работать будет стандартный дефолтный квест без каких либо переделок.
Вот почему 255 плагинов можно подключить и всё работает, а 256 - однозначно вылет? 256 ESP + 1 ESM > 256 (!) - вот почему. Всему виной дискретность/разрядность, просто не хватает "ячеек", куда всё это прописать.
Я не поленился и добавил в пустую комнату бриллианты, в игре всё работает до момента... 512 шт. На 513 сразу вылет. Удалил один - вылета нет, добавил - вылет. И так раз 10 пробовал, даже в кармане приносил и там выбрасывал (сразу вылет), всегда жёсткий порог всего в один камень (!). И уж больно циферка знакомая, не правда ли? Возможно, что это только совпадение с цифрой, но граница для вылета реально жёсткая - один предмет. (винда x64)
СК пишет, что ему не нравится кол-во связанное с альфа, и поэтому шейдер №№ зависает/выключается.
Скорее всего, есть какая-то граничная цифра чего-то (полигоны, кол-во альфа-каналов или хз), которую движок может переварить, а дальше вылет. (и железо компа тут вообще ни причём, это только сам движок Ская во всём виноват)
**** И не зря в окне мира СК есть %% заполнения ячейки, дальше вылет (я такое встречал, и реально был вылет).
*К используемым файлам плагин LB blood mage не прицеляется, что кажется странным*
ESP не может использовать ID из другого ESP. Если хочешь использовать объект, он должен находиться или в мастер-файле (ESM) или в твоём моде (в твоём ESP).
Согласен. Я имел ввиду, что создать из скрипта их не получится. Если ставить из Creation Kit, то да - управлять можно.
Да нет, статики можно и создавать из скрипта, и потом управлять ими, и перемещать, и... всё, что угодно делать. Надо просто получать референс создаваемого объекта в момент его создания, и после этого уже нет разницы, скриптом или в СК он был добавлен.
Если надо статик вкл/выкл в определённом и заранее известном месте, то проще это в СК добавлять, а если местоположение неопределённое или рендомное, то можно и скриптом всё это делать. (у меня компаньонка в лесу и костры разжигает куда ГГ пальцем ткнёт, и фурнитуру на них ставит, и маркеры с анимацией вокруг костра расставляет и т.д., а потом всё это убирает за собой, т.е. ограничений на управление никаких нет)
Ну вот например я размещаю объекты "вода" и "огонь" под краном и котелком, и нажимая на соответствующие рычаги, предмет должен появляться там, будто я включаю газ или душ,
Делаешь в СК кран и добавляешь к нему воду, объект воды выключаешь (ставишь галочку), получится в игре просто кран, а воду видно не будет. На рычаге скрипт, который будет включать и выключать воду:
ObjectReference Property akWater Auto
Event OnActivate(ObjectReference akActionRef) if akWater.IsDisabled() akWater.Enable() else akWater.Disable() endif endEvent
Свойству akWater надо назначить эту воду (объект воды под краном).
Если кранов и прочего такого будет много, то можно сделать один скрипт на все краны и его вешать на свой рычаг:
Event OnActivate(ObjectReference akActionRef) if GetLinkedRef().IsDisabled() GetLinkedRef().Enable() else GetLinkedRef().Disable() endif endEvent
На каждом рычаге во вкладке LinkedRef назначается свой объект (вода или другое, что надо вкл/выкл).
Касательно критичных цифр, мне кажется что если к примеру эти 100 предметов распределить по локации, а потом оптимизировать ее (руммаркеры, порталы), то наверно получится избежать неминуемого вылета.
Естественно. Предметы должны быть загружены в игру, тогда их кол-во имеет значение, иначе да хоть миллион незагруженных никак ни на что не скажется.
По поводу ванильных локаций и вылетов... я бы опять посоветовал не торопиться с выводами, и вот почему: в игре очень много дефолтной лажи/недоработок и прочего, которые на первый взгляд не видны, пока что-то не тронешь. Так например, 35-65% всех ячеек в Скайриме с битыми навмешами (!).
Если кто пробовал менять/изменять/добавлять в экстерьере Скайрима навмеши, то в половине, а то и больше, ячеек получал рефинализацию ячейки, даже просто при нажатии финализации ячейки. Дело в том, что в ячейках очень криво расположены пограничные навмеши, и повторная финализация не проходит.
С этим делом появляется глюк, когда сделал свои статик, под ним удалил навмеши, а неписи всё равно пытаются "пробить лбом стену", как будто там есть навмеши. Но они там действительно есть, хоть в СК их не видно. Т.к. при рефинализации ячейки игнорируется удаление дефолтных навмешей и они там присутствуют независимо от вашего мода. В самом СК всё красиво, зелёное вокруг ячеек присутствует, но рефинализация дефолта остаётся навсегда (и сообщение об этом идёт при загрузки мода в СК).
Такое лечится тяжело, только с полным удалением всех навмешей из ячейки и восстановлением дефолта (кнопка Detalies при загрузке). Далее... определённый алгоритм действий, который сейчас описывать не буду, это долго. И всё это из-за кривого дефолта.
Вот на сайте кто-то выкладывал мод, где у него респавнились животные (лошадь и т.д.) то в дереве, то в телеге, хоть все навмеши там были сделаны "правильно", так вот этот и есть тот самый эффект рефинализации ячейки.
************** Это только один пример дефолтных багов, если глубже капнуть... можно накопать приличную горку.
У меня такая проблема однозначно есть, я уже не один раз в одном месте переделывал, и все равно неписи исполняют танец с бубном вместо того, чтобы прямо пройти через готовый участок. По поводу того, как это лечится: чтобы долго не описывать, может быть, есть материал для самостоятельного изучения? Если поделитесь ссылкой, с удовольствием изучу.
К сожалению нигде не видел подобных инструкций, и у разрабов тоже (кто же признает, что сам накосячил, а это косяки разрабов). Вот примерно как делал я, и естественно, вы можете попробовать упростить алгоритм, если получится:
Для лечения этого бага, надо:
1. Полностью удалить все навмеши из ячейки через NavMesh – Remove Cell NavMeshes. Сохраняетесь и выключаете СК. Если в ini стоит режим «Всегда пропускать предупреждения» и подобное, то это надо обязательно выключить/убрать. 2. Потом надо восстановить дефолт навмешей в этой ячейке. При запуске СК выделяется свой ESP и нажимается Detalies. Там находите удалённый ID навмеша и Delete, тогда эта запись об удалении будет стёрта из ESP. ОК и после загрузки сохраняетесь. 3. Далее после каждого удачного шага-сохранения обязательно делайте резервную копию своего ESP, дабы при неудачном действии не повторять все шаги заново. При загрузки ESP в СК ни в коем случае не нажимайте «Отмена» при предупреждениях о дефекте навмешей и всего связанного с ними, жмите «Да». 4. Открывайте свою ячейку в Скайриме, включайте режим навмешей, ваша ячейка должна быть в дефолтном состоянии (навмеши). 5. Переключите в режим «Отображать только навмеши», всё кроме них показываться не будет. 6. Теперь пройдите по периметру ячейки и максимально совместите пограничные вершины с вершинами сопрягаемой ячейки. 7. Финализируйте ячейку. Сохранитесь. Если при сохранении выскакивает любое предупреждение о навмешах – жмите «Нет» (не сохраняйте), далее «Да», т.е. перезапустить СК. Иначе ESP опять будет испорчен. 8. По новой загружайтесь, и опять по новой проходите периметр. НО в этот раз надо будет также пройти и по соседним ячейкам, поправить там пограничные вершины. Опять финализируем свою ячейку и сохраняем. 9. Если и в этот раз при сохранении будут предупреждения о битых навмешах, то перепишите ID навмеша и его номер, и естественно, опять жмём «Нет» и не сохраняемся. 10. Опять загружаемся, проходим по периметру свою и соседние ячейки, но не финализируем. 11. На панели навмешей жмём Find triangle (красный треугольник с вопросиком). Здесь мы будем искать нужный навмеш, так же там будет выводится информация о выделенном навмеше (это может пригодится в процессе, как минимум, по ID можно узнать, дефолтный это навмешь или свой – по первым двум цифрам). 12. Находим битый навмеш (ранее записанный из предупреждения). При попадании курсора на битый навмеш сразу будет выскакивать предупреждение, всегда жмём «Да» (отмену и нет не нажимаем). Потом проходим так по всей ячейке и смотрим битые навмеши (достаточно просто водить курсором ничего не выделяя). 13. При обнаружении битых выключаем режим «выделять плоскость», иначе сообщения ничего сделать не дадут. Смотрим причину «битости», как правило, это пограничные навмеши. Поправляем их. 14. Когда ячейка полностью пройдена – финализируем её. Не сохраняемся. 15. И так все соседние ячейки вокруг своей. После этого финализируем свою и сохраняемся. При удачном сохранении обязательно делаем резервную копию ESP. 16. И так делаем до тех пор, пока не будет сохраняться без предупреждения о битых навмешах. Как это получилось - можно приступать к переделке навмешей по своим нуждам. 17. Далее, чтобы не получать рефенализации, постарайтесь по мере возможности не трогать пограничные треугольники. Удалять или дробить их нельзя (ставить точки на их рёбрах), а вот двигать свободные вершины можно как угодно. Так же не трогайте треугольники, которые являются последними в данной ячейке, хоть и зелёных связующих навмешей на них нет, они всё равно являются пограничными. 18. Все треугольники внутри ячейки можно смело удалять, если это надо. Зелёные связующие навмеши никогда вручную не удаляйте, получите СТД. 19. Если надо удалить именно пограничные навмеши, то возможно, после этого придётся так же восстанавливать и соседние ячейки с той, в которой будут удалены пограничные навмеши. 20. После нескольких действий сохраняйтесь, тем самым будете проверять наличие битых навмешей, и в этом случае – кнопка «Нет» и загрузка по новой. Чем чаще сохраняетесь и делаете резервные копии ESP, тем меньше пустой работы. Конечно, перезагружаться иногда приходится по многу-многу раз, это муторно и долго, но после этого ваши НПС будут там ходить именно так, как вам надо.
А с битыми навмешами я так и не решил, что делать. Вот построил летающий остров, проложил там навмеши, а проверка показывает ошибки не там, а на ванильной земле. Расстроенный проверяю чистую ваниль - все ошибки там на месте. Лезу их смотреть - да, реальные ошибки и расстыковки на границе. Вот и что с этим делать? В пылу модостроительства пошёл исправлять. Но ведь это же вмешательство в игру, которое, к тому же, моему моду на фиг не нужно. Решил для совместимости всё, что не касается непосредственно меня, откатить в ваниль. Ведь я же не могу предсказать, кто их ещё как будет исправлять и куда и сколько раз.
Убрать косяки разрабов - это не лишнее вмешательство в дефолт, а только польза. А вот "моему моду на фиг не нужно" - это заблуждение, ведь с этим дефолтным косяком и твой мод будет работать неверно, значит, это нужно твоему моду.
Возможно, что эту ячейку ещё кто-то будет трогать, и скорее всего, получит рефинализацию, ведь практически никто не занимается такой "фигнёй" с исправлением дефолтных навмешей, а на предупреждение о рефинализации практически все "закрывают глаза" и жмут кнопку "Отмена". В этом случае, скорее всего (т.к. не проверял подобные совместимости, хотя, принцип приоритета загрузок может и здесь сработать), это скажется и на твоём моде, но если рассчитывать, что кто-то обязательно что-то испортит, и поэтому можно и самому сделать "криво" или "забить" на это дело... это как-то не правильная логика. (Криста хоть и не делает так, как говорит, но говорит она правильно - "Или делать хорошо, или никак." (с) И я с этим согласен.)
"стыковка мода с ванильной игрой всё равно должна быть, иначе мод ничего не будет делать" - это ни есть факт, легко можно сделать мод, который не затронет ни единого дефолтного ID и будет работать, да хоть новый мир с кучей квестов, даже привязку Скайрима с этим своим миром можно сделать не затрагивая вообще ничего (я такой принцип использую для сопряжения своей компаньонки с Даунгардом, при этом сам DLC Даунгард для мода не нужен, нет привязки к нему, но если он подключён, то мод сам берёт из него нужное себе без прямого взаимодействия с ним).
Myprism, чтобы попасть в свой мир не надо никаких порталов в Скайриме - player.MoveTo(MarkerInMyWorld), и нет никаких привязок к Скайриму. Запуск этой команды из своего спелла, свитка и т.д. Не давай дефолтным неписям свой квест или свой предмет, а дай их своему НПС, и привязки к дефолту тут никакой не будет, всё своё. Свои квесты и свои скрипты никогда не будут в ванили, если они ничем не касаются этой ванили. Сами же квесты и скрипты не могут быть по определению в игровом мире и влиять на этот мир, путь и хоть трижды запущены. Они хоть и объекты, но они виртуальные объекты, их реально не существует в игре, пока они не начинают на что-то конкретное воздействовать. (это точно также, как геймер перед компом, он для компа и игры не существует, пока не вмешается в игру кнопками или мышкой) Сами по себе квесты и скрипты не могут как-либо менять ваниль только самим своим наличием.
Можно вообще удалить из ESP мастер-файл Skyrim.esm или сразу создавать мод на чистом СК без загрузки ESM (и я, и многие другие так делали и всё прекрасно работает), и мод будет работать сам по себе. Как известно, без мастер-файла нельзя воспользоваться/изменить ни один объект или ID, если его нет в данном ESP. А поскольку мастер-файла нет вообще, то и воздействия на этот файл не может быть, т.е. ничего ванильного данный ESP изменить не сможет (если не стараться это специально сделать).
И даже в игре, если ГГ дать спелл с командой телепортации в свой мир, то при его касте ГГ... окажется в своём мире и будет воздействовать и что-то менять только там, а Сиродилл и всё-всё дефолтное останется без изменений. Ни ГГ, ни ESP не смогут хоть как-то воздействовать/изменить ваниль.
Кстати, скажи, пожалуйста коротко, как ты связываешь свой мод с Даунгардом не привязывая его в редакторе? Наверное, через цифру ID некоторого портала в скрипте?
Конечно, только скриптами. Для начала, при запуске игры идёт проверка установленных/загруженных плагинов, и если загружен интересующий плагин, то делается отметка (свойство), что в наличии есть ля-ля.esp. Далее это свойство используется в определённых слежениях за ГГ или определёнными объектами, и если "свойство == true", то при обнаружении определённых не ванильных изменений делаются нужные действия. Например, если установлен Даунгард, и ГГ стал вампиром-лордом, то скрипт видит изменения расы ГГ (там далее свои проверки идут) и мой компаньон тоже становится вампиром-лордом (если этот режим ему позволен в настройках). Можно напрямую "вытащить" из Даунгарда расу вампира-лорда, а можно и просто newRace = ГГ.GetRace() и далее уже понятно. Т.е. можно "вытаскивать" ID из других ESP командами напрямую, а можно и определять воздействие сторонних модов на объекты и уже с них копировать базовые объекты/ID из того мода. В обоих вариантах максимальная бесконфликтность - отсутствие привязки к тому моду и отсутствие изменения того мода/ESP.
Естественно, без SKSE такое крайне сложно сделать.
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №229
| Тема: Вопросы по скриптам Papyrus
написано: 25 ноября 2013, 14:31
| Отредактировано: AleksTirex - 25 ноября 2013, 14:36
Символ "<" - это служебный символ, он используется для форматирования сообщений, и чем его ни "замазывай", само его наличие воспринимается Папирусом как команда. Он как раз и служит для того, чтобы отсекать/оставлять всё то, что до и после него, поэтому он и отсекает, и ему по барабану что именно отсекать. Это типа "точки с запятой", как её ни замазывай, но всё, что после неё Папирус всегда будет игнорировать.
Используй стандартные Up и Down вместо < и > (ведь именно это ты хотел написать на кнопках?).
************** Посмотрите на сайте у разрабов, и если я не ошибаюсь, то там написан принцип форматирования сообщений, и там < фигурирует в этом процессе (но это было давно, я мог и что-то забыть/перепутать).
если я отвяжу мастер файл от своего плагина просто отметив его и нажав ctrl+del проблем не возникнет потом?ресурсы того мастер файла не использую.
Проблем не будет. Но сперва проверь, затрагивается хоть что-то дефолтное или нет, типа погоды, кейвордов, заклинаний и прочее. В твоём ESP не должно быть вообще ничего из дефолта, ни единой сноски на что-то дефолтное.
Самое надёжное - создавать мод на чистом СК без загрузки в него ESM, тогда 100% всё будет в порядке. Сложности могут возникнуть именно в кейвордах, ведь без них тяжело сделать правильную привязку к свойствам игры/движка, например одежды или оружия. Как именно решить проблему кейвордов я пока не думал, но наверняка, выход есть.
DarkVetal, а строка Scriptname myObjectScript extends ObjectReference есть в твоём скрипте? Я ведь писал "нужен полный скрипт". (myObjectScript - это ID скрипта, оно должно быть своим и уникальным)
Совет: когда что-то делаешь в СК или пишешь скрипты, то думай, что и главное зачем это делаешь. Вот зачем в твоём скрипте строка со свойством akWater? Если имеется написанное свойство, то значит, на него надо что-то назначить, иначе это только буковки и не более. Ты назначил что-нибудь на него? Зачем назначать рычагуLinkedRef, если он не используется? Во втором скрипте есть такое GetLinkedRef(), так разве нет сходства буковок "LinkedRef" во втором скрипте и твоих действиях с назначение в одноимённой вкладке какой-то ссылки?
Ты не обижайся на такой ответ, я просто лишь хочу научить думать, чтобы ты сам смог что-то создавать и это после того оно ещё бы и работало. Если будешь только копировать написанное кем-то, то ничему не научишься. Ты почитай внимательно совет, и попробуй сам найти свои ошибки, так пользы будет больше, для тебя.
Для желающих сделать охранника-центуриона, или любого другого НПС, а так же понять сам принцип создания "НПС в засаде". Это для охранника, для враждебных НПС надо немного изменить, на принцип тот же.
1. Делается актёр центурион (можно копировать). Все фракции удаляются и добавляются PlayerFaction и CurrentFollowerFaction. Агрессия "Unagressive". 2. Удаляются пакеты и добавляются ambushSleepPackage (он наверху) и defaultTravelToLinkCustom01 (он внизу). 3. Удаляется дефолтный скрипт (если есть) и добавляется свой:
ScriptName aaDwarvenAmbushScript extends Actor
string property sActorVariable = "Variable01" auto hidden float property fActorVariable = 1.0 auto hidden float property fActorVariableOnReset = 0.0 auto hidden float property fAggression = 2.0 auto hidden float property fAggressionOnReset = 0.0 auto hidden Package property defaultTravelToLinkCustom01 Auto
Свойство defaultTravelToLinkCustom01 можно заполнить Auto-Fill All
4. В локации ставится дефолтная арка с дефолтным скриптом. 5. Ставится центурион в арку. 6. По центру арки к центуриону ставится XMarkerHeading (к нему будет возвращаться центурион после боя). 7. В разделе Активаторов делается свой активатор и вешается на него скрипт:
Faction property PlayerFaction Auto Faction property CurrentFollowerFaction Auto Package property Follow Auto Package property FollowerPackageTemplate Auto
auto State waiting Event onTriggerEnter(objectReference triggerRef) Actor actorRef = triggerRef as Actor if actorRef && GetLinkedRef() != triggerRef if actorRef != Game.GetPlayer() && IsPlayerAlly(triggerRef) == false gotoState("allDone") activate(self) endif endif endEvent endState
State allDone Event OnCellDetach() gotoState("waiting") endEvent endState
Все свойства можно так же автоматически заполнять.
8. Выделяется арка или центурион и нажимается кнопка "добавить триггер" (кубик с буквой "Т"). В окошке выбирается свой созданный активатор. Далее триггер растягивается на нужные габариты. 9. Теперь привязываем объекты друг к другу: а. Триггеру в графе Linked Ref назначаем центуриона. б. Центуриону в графе Linked Ref назначаем арку. Потом там же назначаем новый линкед, но с кейвордом. Для этого жмём "добавить" и сразу в окошке выбираем кейворд LinkCustom01 и потом назначаем маркер (XMarkerHeading). в. Центуриону в графе Activate Parent назначаем триггер. 10. Всё готово, можно тестить. Все тесты делать только на чистых сейвах (!).
******** Центурион будет реагировать на всех НПС, которые не в дружеских отношениях с ГГ, не только враги, но и просто "левые" НПС будут убиты, он не реагирует только на друзей. По окончании боя вернётся в арку. Возможно, с первого раза ему будет не попасть в арку, но в итоге он в неё влезет (это уже проблема габаритов НПС и арки).
Если сделано всё в точности как написано, тогда всё будет работать. Возможно, что на злых врагов или при начале боя ГГ центурион сможет и без триггера кидаться в бой (хоть и навряд ли), тогда фракцию игрока у него надо будет удалить (если это надо).
mallik, так чистить не обязательно. Полная чистка не нужна. "Чистое сохранение" - это то сохранение, которое сделано тогда, когда ещё данный мод ни разу не подключался, т.е. в сохранке нет упоминания о моде. Для данного теста можно использовать ту сохранку, где ещё не было центуриона, т.е. он ещё не был создан.
LordVadim, сесть/лечь - это "активировать" данную мебель актёром (эту команду ты знаешь - activate). Хотя, обычно для этого используют пакеты ActivateSpecialFurniture.
**** У меня сейчас в голове "каша", поэтому не смогу точно сказать, будет ли НПС именно садиться при активации мебели, а с пакетом точно будет. По крайней мере, при активации мебели, если НПС сидит, то он точно встанет.
Добавил ActivateSpecialFurniture - НПС садится только если в СК назначить референс мебели в Public Package Data. Вопрос как этот референс менять скриптом?
Пакет должен быть у алиаса. (галочки Optional и пустая позиция SpecificRefererce) Пакет делается собственностью этого квеста. Делается второй алиас (настройки как у первого). В пакете для цели выбирается позиция алиас, и там назначается второй алиас.
Перед использованием фурнитуры на второй алиас назначается референс этой фурнитуры. akAlias02.ForceRefTo(akObjectRef) Для запуска пакета первому алиасу назначается этот актёр. akAlias01.ForceRefTo(akActor)
По окончании или для окончания сидения оба алиаса очищаются.
Такая схема работает для одного НПС, а мне нужно для произвольного количества.
Один алиас - один пакет и один стул. Если надо 20 стульев и НПС задействовать одновременно, тогда надо делать 20 алиасов. Как именно делается такое количество - надо смотреть в этой теме или в теме по скриптам, в этом месяце (или в прошлом) я приводил подробную инструкцию со скриптом. Разница с тем вариантом только в разных пакетах, но это в принципе вообще не разница. Поищи. (вряд ли у тебя одновременно будут сидеть более 20-30 НПС)
К сожалению, с пакетами работают только алиасы и сцены, а в сценах опять алиасы, вот и всё упирается в алиасы. В Скайриме нельзя добавить пакет скриптом, как это было в Обливионе, вот и приходится использовать что есть.
mallik, изначально центурион не должен быть активированным, у меня всё правильно работает, проверил. А вот после боя да, он остаётся с паром, но после перезагрузки локации он должен замереть. Я вышел из локации, перезапустил игру, зашёл в локацию и центурион был в дефолтном состоянии. Можно попробовать выключать пар после боя, вот только надо ли? Попробуй поиграть с включением и выключением АИ.
Со сферами... выкатываться то они будут, но вот потом сам процесс "залезания в трубу", как-то смутно представляю.
Изменить референс добавленного пакета ActivateSpecialFurniture я так понимаю тоже в скрипте не получиться, только СK?
О как! Менять ID базовых объектов... сильно, но увы, не получится, а равно добавлять и удалять сами пакеты. А зачем, если не секрет? Один пакет можно использовать на множество разных целей, просто меняется референс на алиасе, который является целью пакета.
****** референс - ссылка на объект, а ActivateSpecialFurniture - ID базового объекта, к тому же это Package Template, т.е. базовый объект для других базовых объектов. Пакеты, квесты, заклинания и подобное, по определению не могут иметь референса (в его истинном значении), т.к. не могут находиться в игровом мире.