генерацию нпс - т.е. чтобы нпс появлялись через определённый период времени. ну например был тут скрипт появления нпс при касании предмета, типа охранник появился... а как это ввести в цыкл? активировал и начали появляться нпс...
auto state DefaultState Event OnCellAttach() ; или OnActivate UnregisterForUpdateGameTime() gotoState("WaitState") endEvent endState
state WaitState Event OnBeginState() RegisterForUpdateGameTime(5.0) ; 5 часов EndEvent Event OnUpdateGameTime() akMarker.PlaceAtMe(akActorBase) endEvent endState
Скрипт вешается на любой статик/активатор в локации, если надо "при активации", то на активатор. При первом посещении локации запустится таймер и каждые 5 часов у маркера будет появляться/создаваться НПС из базового объекта. Можно поменять событие на активацию. Но тут такое: если долго не посещать локацию, то там наплодится этих НПС ... много.
Поэтому сперва хорошенько продумай сам механизм появления НПС (не скрипт, а сам механизм/принцип, скрипт будет таким, какой выберешь принцип).
ActorBase Property akActorBase auto ObjectReference Property akMarker auto
PlaceAtMe замени на PlaceActorAtMe
Не забудь этим свойствам назначить своего базового актёра и указать на маркер, где именно будет появляться созданный актёр. (кнопка Prorerties рядом со скриптом)
****** variable akActorBase is undefined - это в переводе: "свойство akActorBase не определено", т.е. нет такого свойства.
Антон, режим Ghost не делает НПС невидимым, он только перестаёт быть подвержен воздействию оружия и магии (у тебя с НПС получился баг при создании, вот он и невидимый) и ещё АИ меняется.
Отключение коллизии лучше делать не через настройки, а простой командой: debug.ToggleCollisions() Но при варианте полного отключения коллизии все неписи перестают перемещаться, это неестественно смотрится. Лучше попробуй поиграться с таким вариантом: привяжи своего НПС к маркеру и потом транслируй его.
Создаётся маркер под ногами НПС. На этот маркер привязывается НПС. Потом его транслируешь по нужному маршруту. Коллизия должна будет остаться на маркере, а сам НПС "пойдёт" по маршруту. Для выключения привязки: akActor.SetVehicle(none)
Так у тебя только один твой НПС окажется без коллизии, остальные будут "жить полноценной жизнью". (на ГГ этот метод отлично работает) ****************
StanislavD, чтобы актёры ходили по маршруту, надо давать пакет не SandBox, а Patrol и там назначать маркеры маршрута.
как сделать у себя в мире карту как в тамриэле?ато я делаю и у меня выходит карта как в городах разных,пещерах и т.п.
У тебя карта изначально "включена", т.к. мир отдельный и не имеет родителя (Parent World). Я сам картами в Скае не занимался, но судя по всему, в СК нет "строки или галочки" на создание/назначение карты, она как бы по умолчанию прилагается. И это не просто текстура DDS, а куча сопряжённых файлов. Есть мод, который делает карту Скайрима "плоской" как в Обливионе. Найди его и скачай, там посмотрим, как приладить тебе в мод нечто подобное.
не могли бы высоздать этот файл со скриптом и сказать куда его скопировать
1. Создаёшь Outfit в одноимённом разделе СК. Назначаешь ему ID, например aamyOutfitManaken. Ничего добавлять в него не надо, он должен быть пустым. 2. Тыркаешь по манекену, в последней вкладке Scripts нажимаешь Add, выскочит табличка со списком скриптов. 3. Выбираешь первый [New Script], откроется окошко, там название и тип скрипта. Пишешь название (оно же и ID и название самого файла скрипта, который надо обязательно прилагать к своему моду), например aamyManakenXScript, тип скрипта ObjectReference стираешь и пишешь Actor. ОК. 4. В окне Scripts появился твой скрипт aamyManakenXScript, правой кнопкой Edit Source, скрипт откроется. 5. Строку с названием оставляешь и под ней пишешь сам скрипт:
6. Рядом с кнопкой Add есть кнопка Properties, нажимай её, выскочит окно свойств. 7. Нажимай Auto-Fill All, если ID написал как у меня, то свойство само заполнится. ОК.
Всё готово. И не забывай добавлять этот файл к своему моду по аналогии с текстурами и нифами. Если всё сделано так, то работать будет.
***** Делать отдельно файл скрипта крайне нежелательно, хоть и можно.
Помню когда про это читал, были высказывания что типа объекты исчезают, но фактически не удаляется и накапливаются в Сейве.
Disable() - это да, здесь только прорисовка отключается, а сам объект остаётся в игре. Но Delete() удаляет объект из игры навсегда, т.е. не остаётся записей в сохранке (это в теории, на практике проверить такое крайне затруднительно).
Как я понял речь идет о файле "aamyOutfitManaken", так вот как его выдрать из Creation Kit? И по какому адресу копировать? По аналогиии с текстурами это по адресу: \Skyrim\Data\Textures, но ведь не в текстуры же его пихать
Не-не, aamyOutfitManaken - это "список одежды", просто "параметр" в моде. Речь ведь шла о скриптах, так в Скайриме скрипты не просто объект, но и отдельный файл (!). Ты писал скрипт с названием aamyManakenXScript, так вот в папке Scripts лежит файл твоего скрипта под названием aamyManakenXScript.pex Его надо добавлять вместе с ESP, текстурами, нифами, и естественно, в своей папке Data\Scripts\aamyManakenXScript.pex (текстуры ты добавляешь так: Data\Textures\myMod\LaLaLa.dds)
Антон, должен тебя огорчить - скрипт не рабочий, точнее некорректно работающий. При такой системе неизбежны рывки камеры, толком вращения не будет, равномерность под очень большим сомнением.
1. "сразу блокируем возможность повторного каста этого заклинания до его завершения " - это заблуждение, статусы ничего не заблокируют. При повторном запуске заклинания возникает новый эффект с новым скриптом, и поэтому никакие статусы или переменные на второй скрипт не повлияют. Получится два параллельно работающих скрипта, результат очевиден.
2. "ждём, пока камера выполнит перемещение к маркеру Utility.Wait(TimeToWaitForTranslationComplete) " - отсутствие синхронизации, полностью переместилась или ещё где-то в пути, а таймер отработал и запустил новое перемещение. Неизбежны рывки. Для синхронизации можно использовать событие OnTranslationComplete() на актёре-камере, которое будет запускать следующее перемещение.
3. Событие финиша надо удалить, оно даст ненужный баг, а толку от него ноль.
4. Сам расчёт кругового движения сделан не совсем правильно, толком вращения не будет. Если у тебя вращается, то это исключительно частный случай и на другом железе будет лажа.
5. Скорее всего, актёр-камера не будет удаляться из помещения, MoveTo не отработает (сделай камеру видимой и проверь). Возможно, это и есть твой полтергейст.
Если будет время, то я попробую изменить/поправить скрипт.
Други, я, конечно, дико извиняюсь, но для Скриптов есть отдельная спец. тема. Нахфига всё в кучу тут валить, а? Потом замучаешься искать нужное.
Здесь ведь есть модератор, надо чтобы он перенёс эти посты в нужную тему.
******* mayor, практически любое действие: переключение, добавление и удаление, одевание и снятие, включение и выключение, и т.д. - всё это делается на основе скриптов (даже стадии квестов переключаются скриптами).
Это интересно, проверю обязательно ... это может быть из за использования другой ячейки для хранения объектов ? (я не уверен что смогу сделать своего Актёра назад видимым, я там столько всего наменял, когда пытался избавить его от коллизии... )
Нет, другая ячейка не причём, там скорее проблема в привязке к маркеру + неотработка трансляции + телепортация. Они иногда получаются "несовместимы", т.е. мешают друг другу. Телепортацию можно исключить из скрипта - просто создавать нового актёра и маркеры, потом удалять. Трансляцию заменить на другой принцип (напишу ниже). Чтобы увидеть невидимого актёра, надо повесить на него способность типа Ghost, тогда по шлейфу эффекта можно определить наличие оного в локации.
Антон, у трансляции есть особенность или баг (?) : когда транслируешь не по координатам, а на цель, то объект начинает как бы следовать за перемещающейся целью. Возможно, что это баг, но у меня такое срабатывало. Попробуй этот вариант. Делаешь маленькую скорость трансляции (100-250) на цель-маркер, а саму эту цель постепенно перемещаешь по маршруту не давая её догнать, тогда возможно, что будет достаточно одного запуска трансляции на весь процесс. Более плавного варианта придумать сложно.
Могу еще добавить, что когда я в "Quest" добавляю оружие (у меня стоит "Mannequin Script") то оружие манекен - берет, а одеваться не хочет?
И не будет сам одевать, это надо делать принудительно. Например: манекен.AddItem(akSmotka1) манекен.EquipItem(akSmotka1) манекен.AddItem(akSmotka2) манекен.EquipItem(akSmotka2) ... и т.д. Т.е. после добавления шмотки манекену её надо на него одеть.
Подскажите пож. возможно сделать на кровать скрипт, чтобы когда на ней засыпали просыпались на другой кровати в другом месте?
При засыпании ГГ на любой кровати он проснётся на определённой другой кровати. Сделать просыпание на любой произвольной кровати нельзя, ведь движок Ская не имеет понятия, куда конкретно надо переместить ГГ. Для этого надо конкретно указать все возможные референсы кроватей. (в теории это можно сделать, но сложно, да и придётся всё равно прописывать хотя бы локации)
Вот сам принцип. Делается такой скрипт на любом постоянном предмете или в своём квесте:
ObjectReference Property akObjectBed auto ; кровать, на которой должен проснуться ГГ
Можно сделать форм-лист, в котором будут прописаны хоть двести разных кроватей из игрового мира, которые стоят где-то в помещениях, т.е. имеют референс. Тогда можно рендомно выбирать одну из этих кроватей.
FormList Property kListReferenceBed auto ; форм-лист с референсами кроватей
Event OnInit() RegisterForSleep() endEvent
Event OnSleepStop(bool abInterrupted) int iIndex = kListReferenceBed.GetSize() - 1 int irandom = Utility.RandomInt(0, iIndex) ObjectReference akReferenceBed = ListArmorPL.GetAt(irandom) as ObjectReference Game.GetPlayer().MoveTo(akReferenceBed) endEvent
Создание форм-листа: создаёшь новый форм-лист, в его окно просто перетаскиваешь нужную кровать из окна Cell View (правая часть окна, там список объектов этой ячейки). И так все понравившиеся кровати из разных локаций добавляются в этот список.
ГГ будет просыпаться на кровати как простой НПС, т.е. будет реально лежать на ней. Для подъёма с кровати надо нажать "E", т.е. активировать.
Добавлено (14.09.2013, 06:00) --------------------------------------------- Если надо чтобы только на определённой кровати был такой эффект, то надо повесить скрипт на эту кровать:
ObjectReference Property akObjectBed auto ; кровать, на которой должен проснуться ГГ
Event OnActivate(ObjectReference akActionRef) if akActionRef == Game.GetPlayer() RegisterForSleep() endif endEvent
№1 Сделать квест с запуском по событию Change Location Event, это делается так:
1. Сделать свой квест с запуском по событию Change Location Event. 2. В разделе SM Event Node зарегистрировать свой квест. 3. Для регистрации квеста открываем SM Event Node, находим Change Location Event и открываем его. 4. В самой верхней строке правой кнопкой выбираем позицию New Quest Node. 5. Появится новый Stacked Quest Node. В его настройках привсаиваем ID и необходимые условия для запуска квеста. В данном случае "определённая новая локация" - Subject -> GetEventDate -> GetIsId - New Location - ID_myLocation -> == 1 6. Добавляем другие условия, если необходимо (стадия квеста и т.д.) 7. Правой кнопкой на свою только что сделанную позицию Stacked Quest Node и выбираем Add Quests. Там выбираем свой квест. 8. Жмём ОК.
В этом квесте можно сделать: Алиас на ГГ с вложенной в него способностью, а в её маг.эффекте вложить перк. Повесить квестовый скрипт Event OnStoryChangeLocation(ObjectReference akActor, Location akOldLocation, Location akNewLocation) ; добавляем, удаляем, меняем и всё прочее endEvent Добавить алиасу скрипт с нужными командами и т.д.
Для автоудаления спелла/перка и выключения квеста в скрипте алиаса или в способности добавляется событие на смену локации, а в способности можно использовать OnEffectFinish с командами "Удалить способность" и "Стоп квест".
**Все квесты, запускаемые по какому-либо событию, должны быть зарегистрированы в менеджере событий, иначе запуска не будет.** ******************** №2 - самый простой.
Любым удобным способом добавить ГГ способность с условием на эффекте: Player -> GetCurrentLocation() -> ID_myLocation == 1
В маг.эффекте повесить скрипт:
Event OnEffectStart(Actor Target, Actor Caster) if !Game.GetPlayer().HasPerk(myPerk) Game.GetPlayer().AddPerk(myPerk) endif EndEvent
Event OnEffectFinish(Actor Target, Actor Caster) if Game.GetPlayer().HasPerk(myPerk) Game.GetPlayer().RemovePerk(myPerk) endif EndEvent
В этой же способности можно добавить и другие эффекты (повышение чего-то, понижение... и т.д.) и с таким же условием.
В квестовых скриптах все события, которые ты применяла, не работают. OnCellLoad/OnCellAttach/OnCellDetach/OnReset - это событие работает на конкретном объекте, находящимся в игровом мире. Квест не находится в игровом мире и не может быть загружен/присоединён к локации. Если нужен квестовый объект, то для этого применяют алиасы, а вот они уже реальные объекты из игрового мира и все эти события будут на них работать.
Добавлено (14.09.2013, 17:04) --------------------------------------------- №3 вообще самый простой.
На любом постоянном объекте (статик, активатор и т.д.) в нужной локации повесить скрипт:
Event OnCellAttach() if !Game.GetPlayer().HasPerk(myPerk) Game.GetPlayer().AddPerk(myPerk) endif EndEvent
Event OnCellDetach() if Game.GetPlayer().HasPerk(myPerk) Game.GetPlayer().RemovePerk(myPerk) endif EndEvent
Добавлено (14.09.2013, 17:13) --------------------------------------------- №4 самый-самый простой
Любым удобным способом добавить ГГ способность с условием на эффекте: Player -> GetCurrentLocation() -> ID_myLocation == 1 В маг.эффект в графе Perk to Apply назначить свой перк. Скриптов не надо.
Подскажите, как задать отдельный период респауна для контейнера?
Надо повесить скрипт на этот контейнер:
Респаун будет через 5 дней при условии, что ГГ не будет посещать эту локацию с объектом, иначе отсчёт начинается снова.
Event OnCellDetach() UnregisterForUpdateGameTime() RegisterForSingleUpdateGameTime(120.0) ; 24 часа * 5 дней EndEvent
Event OnUpdateGameTime() self.Reset() endEvent ----------------------------------------------------- Респаун через 5 дней произойдёт в любом случае, бывал в той локации ГГ или нет.
auto state StateDefault Event OnCellDetach() RegisterForSingleUpdateGameTime(120.0) ; 24 часа * 5 дней gotoState("StateWait") EndEvent endState
state StateWait Event OnUpdateGameTime() self.Reset() gotoState("StateDefault") endEvent endState
Подскажите, как задать отдельный период респауна для контейнера?
"Кнопок" и настроек на респаун для отдельных объектов нет (по крайней мере мне такие не известны). Это можно сделать, повесив скрипт на сам контейнер, тем более, нужно респаснить именно определённые контейнеры (общий респаун есть в настройках). Пример такого скрипта написан в теме про скрипты.
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №111
| Тема: Вопросы по скриптам Papyrus
написано: 14 сентября 2013, 20:19
| Отредактировано: AleksTirex - 14 сентября 2013, 20:27
Нужен был именно такой вариант. Все прекрасно скомпилировалось, но не работает
А ты так и стоял около сундука все 5 дней?
Так вышел бы погулять на улицу, в игре именно так и делают. Но если тебе надо обязательно иметь возможность дождаться респауна не отходя от сундука, то замени событие OnCellDetach() на OnActivate().
***************** Кстати, а ты проверил наличие галочки Respawns на сундуке?
Alliria, не-е, Subject в способе №1 вообще ни в каком виде не прокатывает, ведь Subject == "Я", поэтому квест или менеджер ну никак не может находиться в той же локации, что и игрок. *(Subject == "Я" когда условие относится к конкретному объекту/референсу - GetAV, IsDisabled, в противном случае параметр Subject игнорируется - GetStage, GetGlobalValue, т.к. сами объекты будут определяться в самих условиях)
Запуск квестов (в способе №1 используется именно такой вариант) происходит по событию, в нашем варианте по смене локации, вот и надо применять условия событий - GetEventData, а уже это условие можно расширить. Например: 1. Можно определить не одну локацию, а сразу кучу, прописав их в форм-лист и тогда вместо GetIsId надо выставить GetInList и указать свой форм-лист. Тогда квест запустится в любой из этих локаций. 2. Можно использовать кейворд - HasKeyword, например LocTypeHouse, тогда квест запустится, если ГГ зайдёт в любой дом (все жилые дома отмечены этим кейвордом). 3. При необходимости можно дополнить другими условиями, например "если на ГГ одета шапка" и т.д. *** "нужно вообще в любой, в которую зайдет игрок" - это не имеет смысла, тогда этот перк всегда будет у ГГ, а для этого достаточно просто добавить ГГ этот перк на постоянку. Надо обязательно определять конкретную локацию или группу локаций.
********** **********
Alliria, ты когда выставляешь условия или пишешь скрипт, то смотри, на чём именно они работают. Если условия или скрипт для квеста, то и Subject == квест и скрипт == квест. Т.е. и условия и события будут относится к этому квесту. Поэтому событие OnLoad() никогда не отработает, т.к. квест не может загрузится в игровой мир, а GetInSameCell никогда не будет "==1", т.к. квест не может находиться в одной ячейке с чем-нибудь.
И вещи оделись на дефолтный манекен, а когда я попробывал таким способом на мной созданый манекен одеть вещи - ничего не получилось
И не получится, ведь ты сразу удаляешь все вещи у манекена скриптом и назначаешь пустой оутфит. Если хочешь, чтобы твой манекен стоял в твоей одежде, то должен сперва решить - можно ли эту одежду брать ГГ, должна ли она быть в инвентаре у манекена, для каких именно целей этот манекен: для показа этой одежды или он просто манекен с возможностью надевать на него любую броню. От всех этих условий и будет зависеть принцип одевания той твоей брони.
Так ведь этот скрипт с пустым оутфитом, который мы сделали, он ведь только на дефолтный манекен распространяется, верно? Или на мой созданный рядом также этот скрипт действует?
Скрипт действует на тот манекен, на который ты его повесил. Если на твоём манекене скрипта нет, то он на него не действует. А в инвентаре у манекена появляется эта броня? В любом случае, проверь на чистом сейве: сохранись, выключи мод, загрузи и сохрани, потом включи мод и загружайся.
Созданные "Reference Alias" с вещами, которые нужно одеть называются: DLC1MyJobMannequinQuest1 и DLC1MyJobMannequinQuest2 Манекен, который не хочет одеваться - возле кровати игрока.
А где ты нашёл такую броню? У тебя в моде её нет. (для начала кинь ссылку на этот мод с бронёй).
Или ты ошибся скринами, т.к. на твоём скриншоте добавлена броня, которой нет в моде, что ты прислал. Или перепутал моды/архивы. Но у меня в твоём моде одеваются оба манекена в дефолтную броню.
****** Не забудь скинуть ссылку на броню из твоего скриншота.
Я убрал привязку к выполнению квестов, поэтому мой манекен сразу одевается в нужную броню. Зашёл в замок в первый раз, поэтому по дефолту манекены были выключены. Я убрал привязку и манекены сразу появляются без прохождения квестов и броня нормально одевается.
В твоём варианте я стартовал уже с пройденным квестом (Харкона уже грохнул). Манекены были включены, но одет только дефолтный в дефолтную броню.
***************** Сделай следующее: Убери с дефолтного манекена скрипт, пусть одевает что положено. Сделай второй свой манекен и поставь в третий угол. НО! Открой на своих манекенах вкладку Enable Parent и обнули данные. Потом открой эту вкладку на "триггер-боксе" MannequinActivateTrig и тоже удали данные. И так на обоих своих манекенах. Тем самым они будут появляться сразу и будут оба нормально одеваться.
Set Enable State Opposite of Parent- установить состояние противоположное родителю. Если парент выключен, то этот объект включён.
Initially Disabled- при инициализации объект выключен. Т.е. если есть галочка, то объект всегда выключен, и чтобы он появился в игре его надо включать. Эта галочка не работает, если у этого объекта есть парент (родитель), тогда он принимает состояния как и этот родитель.
как правильно удалить привязанные к Х-маркеру предметы? Что бы они больше в игре не появлялись?
Если ты удалил предмет, то он не должен появится в игре, даже если не снял привязку. Нет никаких хитростей с удалением предметов. Но вот если ты забрал ту же капусту в инвентарь, то удалять её бесполезно, она так и останется в инвентаре.
в каком формате должна быть музыка?в вав делаю и меня выкидывает при включении ее в игре..
Я использую .xmw , но его не видит СК, поэтому надо прописать аудиофайл в формате .wav и потом в папке заменить на .xmw с тем же названием. (Bit Rate Mode - Constant, 32k) Если используешь как музыку, а не звуковой эффект, то файл надо вкладывать в папку music.