как заставлять ГГ или НПС проигрывать анимацию, подскажите функцию?
akActor.PlayIdle(akIdle)
Но в данном случае получится лажа, а точнее - ничего не получится, т.к. в условиях анимации есть "если это кровать", а выполнить его с такими командами нельзя.
Если надо "положить" ГГ на кровать, то это делается через пакет Activate (ActivateSpecialFurniture). Добавить временный пакет можно так: http://tiarum.com/wiki....%82_NPC Подойдёт второй вариант.
Effect Archetype - это тип эффекта, и если тип Script, то сам скрипт не обязан там присутствовать. (это как пивная бутылка - хоть она и пивная, а пива в ней может и не быть )
**************
"Нет не думаю что можно скрипт к другому месту прикрутить" - в теории - можно прикрутить. Например, к перку прикрутить, который используется в маг.эффекте в качестве "добавки" (Perk to Apply). На практике я использую позицию Assotiation Item, в него добавляю другие эффекты, в которых есть свои скрипты, и они работают как бы на этом маг.эффекте.
PaukSama, для простой анимации - да, но sansuli нужна анимация фурнитуры (сон на кровати). В данной анимации есть условия - наличие кровати (!). Анимация не запустится. Но если добавить свою такую анимацию без условий, то актёр будет "спать" в том месте, где стоял, т.к. PlayIdle запускает голимую анимацию без привязки к объекту (любому).
Поэтому для нормальной анимации, где актёр будет ложится именно на кровать надо запускать "использование объекта". Для этого надо отобрать у игрока управление, кинуть команду Game.SetPlayerAIDriven() и запустить на ГГ пакет сна с привязкой к любой кровати, прокрутить время и т.д. По окончании пакета, когда ГГ встанет - Game.SetPlayerAIDriven(false), вернуть управление и т.д.
PaukSama, это тебе: Для визуальной "ломки" при действии эффекта надо создать сцену с пакетом.
Создание своего пакета на использование фурнитуры: 1. Создаёшь пакет "ActivateAfterFinding", сохраняешь его. 2. Открываешь этот пакет, в "Package Template" выставляешь None, окно "Procedure Tree" станет активным. 3. Выделяешь блок "Sequence", снимаешь галочку "Repeat When Complite". 4. Настраиваешь пакет: Search Loc -> Near Self 200, Target Criteria -> Anny Object -> Wounded02FloorMarker, все остальные позиции - false. Все флаги тоже снимай. 5. ОК. Всё готово.
************************
Создание простой сцены на использование пакета: 1. Создаёшь новый квест для этой сцены (разрабы делают так же). Все галочки снять (автозапуска не должно быть). 2. Создаёшь алиас, ему назначаешь своего уникального актёра (в твоём случае Player). Никаких галочек не надо. 3. Создаёшь сцену. Ставишь две галочки "Begin on quest start" и "Stop quest on end". 4. В сцене добавляешь актёра (твой алиас), создаёшь фазу. 5. В фазе делаешь акцию "Package" и добавляешь свой созданный пакет на использование фурнитуры. 6. В настройке фазы включаешь "End on conditions" и добавляешь условие "Subject -> HasMagicEffect -> эффект_ломки -> == 0"
7. Если в качестве актёра должен быть игрок, тогда надо добавить ещё одну фазу с дефолтным пакетом "DefaultStayAtCurrentLocationScene". Иначе ГГ не сможет закончить пакет "ломки". 8. ОК. Готово.
************************* В маг.эффекте "ломки" в скрипт надо добавить:
Scriptname ...
Quest Property QuestWounded Auto ; квест со сценой Furniture Property Wounded02FloorMarker Auto ObjectReference BoxMarker
Event OnEffectStart(Actor Target, Actor Caster) ; if ; ... Game.DisablePlayerControls(abMenu = false) ; abMenu = false - чтобы актёр мог выпить зелья Game.SetPlayerAIDriven() Game.ForceThirdPerson() BoxMarker = Target.PlaceAtMe(Wounded02FloorMarker) QuestWounded.Start() ; ... ; endif EndEvent
********************************** Если всё сделано именно так, то работать будет 100%.
**********************************
Добавлено (05.07.2013, 21:18) --------------------------------------------- Я где-то здесь видел вопросы по созданию точной копии/дубликата ГГ или любого актёра, и чтобы, и броня, и оружие были бы как на оригинале. Если этот вопрос ещё актуален, то могу рассказать как это делается (тут нужен SKSE).
Мостик, если разберёшься с созданием пакетов, то создание сцен тебе покажется самым простым в СК. Пакеты на два порядка сложнее сцены. В Скайриме разрабы дали возможность модмейкерам самим делать свои собственные пакеты со своими процедурами. Можно создать пакет с кучей своих процедур и так, что один пакет будет заменять большую сцену (естественно, для одного актёра).
Такую сцену уже создали разрабы (почти такую) - возьми любой из квестов Dialogue... и на его основе сделай свой (например DialogueDawnstarInnKaritaThoringScene02).
Переделать надо два алиаса - Actor1 и Actor2, у них изменить условия на "наличие кейворда ActorTypeNPC", можно ввести проверку на расстояние. В сцене использовать эти алиасы, а не "уникальные". Изменить топики на топики с рендомом. Включать этот квест через SN Event Node, в Actor Dialogue Event создаётся свой бранч с нужными условиями: локация, актёры (Event) и их дистанция и т.д. Этот бранч будет запускать твой квест на разговор.
Тогда получится рендом на срабатывание сцены разговора и рендом на говорящих актёров (и рендом на темы разговора). Но делай это сам, это вполне реально сделать.
****Вернее не переделать дефолтный квест, а сделать свой по принципу дефолтного.
AleksTirex, я проверял на обычных драконах, которые "летают" по Скайриму.
Обычные драконы тоже должны оживляться. Почему у тебя они не оживляются, я не знаю. Возможно потому, что на них не должны действовать стандартные крики. Ты в своём маг.эффекте у этого крика удали кейворд MagicShout, тогда крик должен будет заработать и на драконе.
Добавлено (11.07.2013, 18:54) --------------------------------------------- Всё правильно, драконы не будут реагировать на крики/заклинания, ведь при смерти им даётся статус Ghost, поэтому маг.эффект не действует.
Надо при старте крика проверять наличие в округе дохлых драконов и снимать Ghost (akActor.SetGhost(false)). Или наглым и грубым способом редактировать дефолтный скрипт MQKillDragonScript, что крайне не желательно.
Иsкатель, но ведь у тебя будут свои драконы, а с ними и так будет всё работать. Ты ведь не собираешься оживлять дохлых скайримских драконов, ведь это удел исключительно Алдуина.
Добавлено (11.07.2013, 19:00) --------------------------------------------- Для пробы, можешь в консоли тыркнуть по дохлому дракону и вбить SetGhost 0, тогда он станет оживать.
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №41
| Тема: Вопросы по скриптам Papyrus
написано: 12 июля 2013, 12:08
| Отредактировано: AleksTirex - 12 июля 2013, 20:58
Создание точной копии актёра или ГГ, с той же бронёй и оружием, что и у оригинала:
<http://tiarum.com/wiki/Skyrim_CK:%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BA%D0%BE%D0%BF%D0%B8%D0%B8_%D0%B0%D0%BA% D1%82%D0%B5%D1%80%D0%B0> Копируйте адрес и вставляйте в адресную строку. Спасибо хозяевам сайта за их заботу о левых порталах, куда ведут любые ссылки, или за их прямые руки.
Можно проверить экипировано ли оружие или магия, какое оружие экипировано(меч, лук, топор, кинжал и т.д.), в каком кол-ве экипированно(2 меча или 2 топора и т.д.) или какая магия(тоже в 2 руках или нет)?
И если оружие не экипировано, то экипировать какое либо имеющиеся у игрока оружие или магию?
Вот тебе несколько команд, а дальше сам их сортируй и составляй нужный скрипт:
int iNumR = Game.GetPlayer().GetEquippedItemType(1) ; что экипировано на правой руке int iNumL = Game.GetPlayer().GetEquippedItemType(0) ; что экипировано на левой руке 0: Nothing (Hand to hand) 1: One-handed sword 2: One-handed dagger 3: One-handed axe 4: One-handed mace 5: Two-handed sword 6: Two-handed axe/mace 7: Bow 8: Staff 9: Magic spell 10: Shield 11: Torch 12: Crossbow ******************************************* Spell akSpell = Game.GetPlayer().GetEquippedSpell(1) ; какое заклинание в правой руке Spell akSpell = Game.GetPlayer().GetEquippedSpell(0) ; какое заклинание в левой руке Shout akShout = Game.GetPlayer().GetEquippedShout() ; какой крик экипирован ******************************************* Weapon akWeaponR = Game.GetPlayer().GetEquippedWeapon() ; оружие в правой руке Weapon akWeaponL = Game.GetPlayer().GetEquippedWeapon(true) ; оружие в левой руке ******************************************* if akWeaponR == None ; оружия в правой руке нет ; elseif akWeaponR.IsDagger() ; это кинжал ; elseif akWeaponR.IsBow() ; это лук ; elseif akWeaponR.IsSword() ; это меч ; ... ; endif ****************************************** Game.GetPlayer().EquipShout(akShout) ; экипировать крик Game.GetPlayer().EquipSpell(akSpell, 1) ; экипировать заклинание на правую руку Game.GetPlayer().EquipSpell(akSpell, 0) ; экипировать заклинание на левую руку Game.GetPlayer().EquipSpell(akSpell, 2) ; экипировать заклинание на кнопку "Z" (голос) Game.GetPlayer().EquipItemEx(akWeapon) ; экипировать оружие по дефолту Game.GetPlayer().EquipItemEx(akWeapon, 1) ; экипировать оружие в правую руку Game.GetPlayer().EquipItemEx(akWeapon, 2) ; экипировать оружие в левую руку ******************************************* Function CheckWeaponActor() ; проверка наличия оружия в инвентаре и магии у ГГ Actor akActor = Game.GetPlayer() int iFormIndex = akActor.GetNumItems() While iFormIndex > 0 iFormIndex -= 1 Form kForm = akActor.GetNthForm(iFormIndex) if kForm.GetType() == 41 ; Weapon if Game.GetPlayer().GetEquippedItemType(1) && Game.GetPlayer().GetEquippedItemType(0) ; если хоть что-то экипировано iFormIndex = 0 elseif Game.GetPlayer().GetEquippedItemType(1) == 0 ; akActor.EquipItemEx(kForm, 1, true) elseif Game.GetPlayer().GetEquippedItemType(0) == 0 ; akActor.EquipItemEx(kForm, 2, true) endif endif EndWhile ;-------; Spell int iSpellIndex = akActor.GetSpellCount() While iSpellIndex > 0 iSpellIndex -= 1 Spell akSpell = akActor.GetNthSpell(iSpellIndex) ; это заклинание есть у ГГ if ; akSpell. - ппроверяем что за заклинание, если "правильное", то можно экипипровать ; EquipSpell endif EndWhile endFunction ****************************************** При проверке оружия у ГГ в инвентаре можно его проверить (меч, лук и т.д.) и если он вас устраивает, то можно экипировать. Так же надо определиться, что для ГГ лучше - магия или оружие, и от этого экипировать или то или другое.
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №42
| Тема: Вопросы по скриптам Papyrus
написано: 12 июля 2013, 13:54
| Отредактировано: AleksTirex - 12 июля 2013, 13:39
Уважаемые, никто не подскажет скрипт для воды (активатора), который при погружении в нее добавляет эффект? А то поисковик не хочет как-либо помогать, а единственный скрипт, который я нашла в СК, послал меня лесом и отказался открываться...
Event OnTriggerEnter(ObjectReference akActionRef) ; akActionRef.AAA() ; добавляем эффект EndEvent
Event OnTriggerLeave(ObjectReference akActionRef) ; akActionRef.BBB() ; удаляем эффект EndEvent
AAA() и BBB() зависят от вида эффекта.
Изменение репутации для пользователя AleksTirex
AleksTirexOffline
Сообщение №43
| Тема: Вопросы по скриптам Papyrus
написано: 12 июля 2013, 16:00
| Отредактировано: AleksTirex - 12 июля 2013, 16:09
То есть скоро эта возможность появится? И кстати как добавлять новые формы. Просто в properties можно создать объект типа form но на выбор предлагаются всего лишь две какие то непонятные формы.
Как скоро появится - зависит от разрабов SKSE , возможно, у них уже есть такой механизм, но... пока нет никаких сведений об этом (или они хитрят, или забыли нас оповестить об этом). Теми командами, что есть в их скриптах, создать полноценные события невозможно.
Добавить именно формы никак, надо обязательно инициализировать эти объекты (Armor, Weapon и т.д.). Но эти свойства всегда можно преобразовать в форму: akArmor as Form
Но вот смысл в добавлении именно форм? Обычно, приходится проводить обратное преобразование - форма в объект. К тому же, все функции/команды работающие с формой, могут работать и с объектом из этой формы.
И не поможет. На воде не может сработать событие триггера.
В разделе "Активаторы" создаёшь активатор со своим скриптом, меши назначать не надо. Потом тыркаешь по своей воде и нажимаешь кнопочку "Create Trigger" (кубик с буковкой "Т" по центру), появится список, в нём выбирай свой активатор, ОК. На месте воды появится красненький плоский "кубик", чтобы он стал объёмным в графе Primitive выставь размер Z как тебе нужно. Тогда в размер твоей воды будет триг.зона со скриптом, в которой всё это будет работать.
народ, подскажите пожалуйста где находится параметр отвечающий за скрытные атаки. Проблема в том, что если натравить спутника на врага и окуратненько в стелсе подойти сзади и ударить, то скрытная атака не пройдет, потому что цель находиться в комбате.
Если цель уже в режиме боя, то полноценная скрытная атака уже не получится, по определению. И что либо крутить бесполезно. Можно лишь имитировать скрытную атаку, т.е. через перк ГГ увеличить урон, при условиях в перке "если в стелсе", "если цель не видит" и "если в бою" (чтобы не было чрезмерного урона в стандартном варианте).
Если в стелсе должен атаковать спутник, то его не надо натравливать, а надо дать пакет "использовать оружие". Тогда он сможет в стелсе подкрасться и зарезать врага. ***(я на своём компаньоне такое сделал, весьма эффектно смотрится)
Я создаю диалог и хочу использовать для ответа подходящие по смыслу ванильные фразы. Вычислил путь к ним в папке с голосами, нашел искомые fuz-файлы, а как добавить их - не знаю. СК предлагает либо записать свой голос, либо выбрать звуковые файлы, среди которых фразы диалогов отсутствуют.
Не надо ничего конвертировать, "вавки" тоже не нужны. Вот ты пишешь ответ-реплику, значит, ты создаёшь свои топики, и тебе надо только их озвучить? Если да, то после написания текста и сохранения топика, открываешь его ещё раз и в окошке Voice Filename копируй название твоего звукового файла. Чуть ниже будет путь, где должен лежать этот файл. (Data\Sound\Voice\myMod.esp\TypeVoice) Создаёшь папку согласно этому пути и кидаешь туда нужные звуковые файлы, предварительно скопировав нужные дефолтные и переименовав их в эти самые названия, что написаны в Voice Filename.
Если пути нет (такое может быть из-за неопределённого актёра, это нормально), то создаёшь папку как написано выше: Data\Sound\Voice\название мода\тип голоса этого актёра.
***В топиках переназначить путь или название файла нельзя, там можно только копировать, но не изменять.
пробовал, не работает(( мб чет не правильно сделал?
Скорее всего, но не здесь. Если написать условия в перке как у тебя + вкладка Perk Owner - Subject - IsSneaking == 1, и потом дать этот перк ГГ, то всё будет работать. (я специально только что проверил в игре, работает) Проверь вкладку Weapon, и дал ли ты этот перк ГГ.
Тип оружия, которым производится удар. В Скайриме это обычно кинжалы, но можно и любой другой меч, секиру и т.д. (или вообще ничего, тогда будет действовать с любым оружием). Дело вкусов.
Нужно, чтобы актер после сидения на стуле получал эффект. Прикрутил к стулу скрипт Event onActivate, все работает, но актер получает эффект дважды - когда садится и когда встает. Выходит, что стул активируется и при посадке на него, и при вставании. Как этого избежать, есть идеи? Может условие какое добавить?
Мне тут для скрипта пара строк понадобилась. Никто не знает как будет выглядеть такое: if Game.GetPlayer() обнажил оружие(боевая стойка) Game.GetPlayer() убирает оружие
If Game.GetPlayer().IsWeaponDrawn() Game.GetPlayer().SheatheWeapon() ; SKSE EndIf
чтобы их найти, надо знать конкретное название квеста
Проще всего найти этот квест через "поиск" в СК: Edit - Find Text. Там вставляешь свой искомый текст и СК его находит. Далее всё предельно просто и понятно.
А куда именно это скрипт вставлять, не подскажете? У меня квесты, не то чтобы квесты, а просто диалоги с персонажами. То бишь никаких событий для запуска там просто нет.
Значит, квест есть, раз есть диалоги. В самой последней вкладке настройки квеста (Scripts) нажимаешь кнопочку Add, потом в списке выбираешь [New_Script] , в появившемся окне в графе Name пишешь название своего скрипта (лучше всего - название квеста + Script, например aaMyBardQuestScript), ОК. Потом правой кнопкой по появившемуся в окне скрипту Edit Source, скрипт откроется. Вставляй туда написанное выше и Ctrl+S, скрипт скомпилится. Но потом не забывай вкладывать этот скрипт к своему моду в соответствующей папке (Data\Scripts), т.к. скрипты идут отдельными файлами.
Обе команды правильные, обе работают, и обе работают без анимации. Если надо, чтобы актёр кастовал "махая руками", то тут нужен пакет UseMagic, в котором указывается цель и спелл. Добавляются пакеты через алиас. tiarum.com/wiki/Skyrim_CK: Как добавить АИ пакет NPC (ссылку никак не вставить, поэтому пройдите сами по этому пути)
Возникла следующая проблемка. Создаю маг эффект с прикрученным скриптом для запуска анимации, а анимация работает только со свободными руками. Каждый раз снимать все вручную неудобно. Подскажите, плиз, скриптовую команду для полной разэкипировки слотов левой и правой руки (чтобы снималось все, будь то факел, оружие, щит или спелл).
Такой вариант не хочет компилировать. Пробовал по-всякому
Это команда, а не свойство, поэтому такое писать надо только в теле события или функции, точно также, как все остальные команды. (а ты писал вне тела, рядом со свойствами, поэтому и не компилировалось) К тому же, если в скрипте уже есть свойство akActor, то здесь надо было переименовать эту данную переменную.
Цитата:
Все указывает на то, что факел занимает 11-й слот.
У факела нет слота, он не одежда. (слоты с 30 по 61, а 11 - это номер типа объекта, а не слот) Факел одевается как оружие.
************************************
Raser0919, сделай функцию запуска в пусковом скрипте:
ObjectReference Property akObject auto ; объект float fDistanc = 100.0 ; дистанция объекта от актёра float fHight = 75.0 ; высота объекта от земли float fSpeed = 650.0 ; скорость движения 300-1000
Это подтянет к актёру твой объект и запустит цикл на его удержание около актёра. Если объекта нет рядом и/или его надо создать, то в теле функции ObjectReference akObject = akActor.PlaceAtMe(akObjectBase) ; (свойство на объект удалить и эту строку писать сразу под Actor akActor = Game.GetPlayer())
На самом объекте вешается скрипт:
float fDistanc = 100.0 ; дистанция объекта от актёра float fHight = 75.0 ; высота объекта от земли float fSpeed = 650.0 ; скорость движения 300-1000
Так объект будет "стремиться" постоянно оставаться на нужном расстоянии от актёра ровно перед ним. Это не будет работать на предметах (череп, одежда, меч и т.д.) Если будешь перемещаться по локациям, то можешь применить функцию с SetPosition, а после неё обязательно опять пусковую функцию, чтобы по новой запустить цикл удержания объекта.
Actor Actor = Game.GetPlayer() - это да, так компилятор сразу пошлёт подальше.
Скорее всего, ты забыл, что UnequipItemEx - это функция SKSE, поэтому без установленного SKSE компилятор тоже пошлёт, а игра не обработает такой скрипт.
"менял akActor на Game.GetPlayer()" - правильный вариант.
"Я думал, что у оружия тоже есть слоты, только скрытые." - скорее всего так и есть, но Папирус ведь не знает о существовании этих слотов, поэтому при любом раскладе ничего делать с такими слотами не станет.
Товарищи, возникла проблемка. Решила сделать автономного спутника, со своими текстурами и мешами то бишь. Эту часть, вроде, прошли - все получилось, однако спутник у меня без брони. И именно по броне у меня вопрос: как добавит ьспутнику броню из другого мода, чтобы она тоже стала "автономной", неснимаемой? Как не тыкалась в редакторе - без толку. Если кто сможет подробно все объяснить - буду весьма признательна.
Если свои текстуры и меши, то значит, и раса своя. Тогда в расе (первая вкладка) в позициях Morph Race и Armor Race выставляешь из списка DafaultRace. Теперь НПС сможет носить любую броню из любого мода.
****
"броню из другого мода, чтобы она тоже стала "автономной", неснимаемой"
Если надо сделать броню неснимаемой/неудаляемой, то это делается через Outfit. Создаёшь свой Outfit и туда заносишь нужную броню. Потом назначаешь этот Outfit своему актёру (вкладка Inventory). Тогда вся эта броня будет постоянно на актёре и её нельзя будет найти в инвентаре этого актёра. Чтобы компаньон не мог снять/переодеть броню, надо ему не давать новой брони или снять статус PlayerTeammate (скриптом akActor.SetPlayerTeammate(false)).
Раз броня из другого мода (!), то её вообще никак не добавить своему спутнику через СК, ведь в твоём моде нет такого ID этой брони. Это сделать можно только скриптом.
Если ты со скриптами "на Вы", то этого сделать не удастся (без посторонней помощи), а сделать это только через СК вообще нельзя.
Или посоветуйте, плиз, ванильную модель кубической формы уже с коллизиями.
В статиках есть кубические ящики. Возьми этот ящик, добавь в него свой сделанный кубик NiTriShape и подгони размер через масштаб этого NiTriShape до размера ящика. Потом удали NiTriShape ящика. Теперь у тебя кубик с коллизией от ящика. Если нужен катающийся кубик, то смени в bhkRigidBody тип коллизии на OL_CLUTTER. Если нужен маленький кубик, то можно взять за основу "Словарь", он тоже квадратный.
Делать наоборот - добавлять коллизию в кубик хуже, т.к. коллизия не масштабируется.