Модератор форума: Kris†a™  
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)

Вопросы по скриптам Papyrus
sansuli  Offline  Сообщение №1 написано: 31 августа 2012, 13:29 | Отредактировано: Multigone - 23 апреля 2020, 14:24


The Red Sun


193
Уроки по скриптованию на языке Papyrus
Прежде чем задать вопрос просмотрите вышеуказанные уроки.
ok


Тема регламентирована.


• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней.
• Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней.
• При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС.
• При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "
+" полезного сообщения.

Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.

Красное солнце
Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
AleksTirex  Offline  Сообщение №271 написано: 30 мая 2013, 04:40


Архимаг


371
Effect Archetype - это тип эффекта, и если тип Script, то сам скрипт не обязан там присутствовать. (это как пивная бутылка - хоть она и пивная, а пива в ней может и не быть ;) )
 
**************
 
"Нет не думаю что можно скрипт к другому месту прикрутить" - в теории - можно прикрутить. Например, к перку прикрутить, который используется в маг.эффекте в качестве "добавки" (Perk to Apply).
На практике я использую позицию Assotiation Item, в него добавляю другие эффекты, в которых есть свои скрипты, и они работают как бы на этом маг.эффекте.

PaukSama  Offline  Сообщение №272 написано: 30 мая 2013, 06:41 | Отредактировано: PaukSama - 30 мая 2013, 06:41


Прячущий свое сердце


Цитата sansuli

Понятно, с помощью айдла

вот тут не лишним будет сказать что лучше всего сделать две анимации, два playidle. Первый должен иметь свойство IdleForceDefaultState, мало ли чего делает гг пред тем как проигрывает анимацию, лучше так сделать чтобы сбросить анимки все.

Отними у меня апельсин - и я тебя убью
Съешь мой апельсин - и я тебя убью
Подари мне апельсин - и... я тебя убью
Мне не нужен никто, лишь мой апельсин
А тот кто не пойман - не ассасин!
AleksTirex  Offline  Сообщение №273 написано: 30 мая 2013, 08:31


Архимаг


371
PaukSama, для простой анимации - да, но sansuli нужна анимация фурнитуры (сон на кровати). В данной анимации есть условия - наличие кровати (!). Анимация не запустится. Но если добавить свою такую анимацию без условий, то актёр будет "спать" в том месте, где стоял, т.к. PlayIdle запускает голимую анимацию без привязки к объекту (любому).
 
Поэтому для нормальной анимации, где актёр будет ложится именно на кровать надо запускать "использование объекта".
Для этого надо отобрать у игрока управление, кинуть команду Game.SetPlayerAIDriven() и запустить на ГГ пакет сна с привязкой к любой кровати, прокрутить время и т.д. По окончании пакета, когда ГГ встанет - Game.SetPlayerAIDriven(false), вернуть управление и т.д.

sansuli  Offline  Сообщение №274 написано: 30 мая 2013, 08:56 | Отредактировано: sansuli - 30 мая 2013, 08:57


The Red Sun


193
Цитата PaukSama

вот тут не лишним будет сказать что лучше всего сделать две анимации, два playidle. Первый должен иметь свойство IdleForceDefaultState, мало ли чего делает гг пред тем как проигрывает анимацию, лучше так сделать чтобы сбросить анимки все.


Ну на счет этого я придумал вот что, я просто укажу условия чтобы ГГ не был в бою, снике и пт, и если бежал поставлю wait() после того как отключу управление. Но все равно спасибо за подсказку))

Красное солнце
Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
PaukSama  Offline  Сообщение №275 написано: 30 мая 2013, 09:10


Прячущий свое сердце


sansuli, а ведь еще анимации могут быть разные. Например я эксперементировал - брал анимку выпивание из пивной кружки - она работает одноразово, то есть проигрывается и все. А вот когда я поставил анимацию шатающейся походки типа пьяный то ее как раз нужно прерывать скриптом, сама по себе она не останавливается. Так что в этом случае всетаки придется использовать второе playidle сброс анимации. Ну я думаю ты и так все это знаешь просто вспомнилось что анимации по дефолту тоже разные.

Отними у меня апельсин - и я тебя убью
Съешь мой апельсин - и я тебя убью
Подари мне апельсин - и... я тебя убью
Мне не нужен никто, лишь мой апельсин
А тот кто не пойман - не ассасин!
m0nk0  Offline  Сообщение №276 написано: 30 мая 2013, 16:44



25
Всем доброго времени суток. Делаю модик, есть такая большая просьба, так как со скриптами еще совсем не разбирался, осваиваю пока Creation Kit. В доме лежит прикрученная книга. Нужно, чтобы после использования ГГ крика Безжалостная Сила книгу можно было взять в руки. Если кто поможет, заранее огромное спасибо.

Вместо того, чтобы брать слово, я хотел бы, чтобы оно само окутало меня и унесло как можно дальше, за любое возможное начало. (Поль-Мишель Фуко)
toozikoos  Offline  Сообщение №277 написано: 31 мая 2013, 05:15



21
m0nk0, примерно так
к книге привязать скрипт SuperPuperBookScript.psc

Код
Scriptname SuperPuperBookScript extends ObjectReference
MagicEffect Property meFusRoDa  Auto
bool bIsBlocked = true
event OnInit()
   BlockActivation(bIsBlocked)
endEvent
event OnMagicEffectApply(ObjectReference akCaster, MagicEffect akEffect)
   if(bIsBlocked && (akCaster as actor) == game.getPlayer() && akEffect == meFusRoDa)
     bIsBlocked = false
     BlockActivation(false)
   endif
endEvent


в плагине заполнить свойство meFusRoDa магэффектом "Безжалостнай Силы"

mxac  Offline  Сообщение №278 написано: 31 мая 2013, 07:18



178
Ребята, а можно скрипт работающий на объекте, бочке например, прикрепить к перку чтобы не впихивать скрипт во все бочки(разобрался уже как оно с маг эффектом связывается  ;) )?


m0nk0  Offline  Сообщение №279 написано: 31 мая 2013, 13:13 | Отредактировано: m0nk0 - 31 мая 2013, 19:48



25
toozikoos, спасибо, буду пробовать. "в плагине заполнить свойство meFusRoDa магэффектом "Безжалостнай Силы" - вот это поподробнее, пожалуйста, ибо СK по сравнению с инструментами, которыми я ранее пользовался (преимущественно блокнот :) и декомпиляторы), поражает с одной стороны обилием возможностей, с другой их неупорядоченным нагромождением....

Вместо того, чтобы брать слово, я хотел бы, чтобы оно само окутало меня и унесло как можно дальше, за любое возможное начало. (Поль-Мишель Фуко)
toozikoos  Offline  Сообщение №280 написано: 1 июня 2013, 04:37



21
m0nk0
посмотри видеоуроки, в частности "Выключатель света".

m0nk0  Offline  Сообщение №281 написано: 1 июня 2013, 13:40



25
Цитата toozikoos

m0nk0,  посмотри видеоуроки, в частности "Выключатель света".

Я их в первую очередь начал смотреть. Увы, автор (при всем уважении к проделанной работе) часто слабо себе представляет о чем идет речь.  И ПОЧЕМУ надо делать именно так а не иначе...

Вместо того, чтобы брать слово, я хотел бы, чтобы оно само окутало меня и унесло как можно дальше, за любое возможное начало. (Поль-Мишель Фуко)
mxac  Offline  Сообщение №282 написано: 1 июня 2013, 20:35



178
Ребятаа, вот у меня есть скрипт который впихнут в объект, мжно ли его переписать так чтобы его прикрутить к заклинанию/перку(чтобы оно работало со всеми объектами такого же типа, а не впихивать скрипт в каждый объект)?


PaukSama  Offline  Сообщение №283 написано: 1 июня 2013, 21:09


Прячущий свое сердце


mxac, да это можно, изменить тип скрипта ObjectReference на ActiveMagicEffect, затем события соответствующие этому типу...мда короче показывай скрипт, надо точно знать.

Отними у меня апельсин - и я тебя убью
Съешь мой апельсин - и я тебя убью
Подари мне апельсин - и... я тебя убью
Мне не нужен никто, лишь мой апельсин
А тот кто не пойман - не ассасин!
mxac  Offline  Сообщение №284 написано: 6 июня 2013, 13:59 | Отредактировано: mxac - 6 июня 2013, 14:24



178
Создал перк с записью Entry Point - Activate -  Add Actovate Choice , и хочу чтобы выполнялся мой скрипт, что нужно вписать в Papyrus Fragment , если скрипт такой:



Кстати скрипт правильно хоть написан? Он должен при выборе моего варианта активации учить перк если он не выучен...


И ещё помогите переписать скрипт так чтобы он был прикреплён не к контейнерам и дверям, а к магическому эффекту или перку(если это возможно), чтобы не впихивать его в каждый контейнер и дверь, а только в маг.эффект/перк...


toozikoos  Offline  Сообщение №285 написано: 6 июня 2013, 15:16



21
Код
;BEGIN FRAGMENT CODE - Do not edit anything between this and the end comment
;NEXT FRAGMENT INDEX 13
Scriptname myHelperAutoOpenPerkScript Extends Perk Hidden
;BEGIN FRAGMENT Fragment_2
Function Fragment_2(ObjectReference akTargetRef, Actor akActor)
;BEGIN CODE
akActor.removeItem(Lockpick, 1)
akTargetRef.lock(false)
akTargetRef.activate(akActor)
;END CODE
EndFunction
;END FRAGMENT
;END FRAGMENT CODE - Do not edit anything between this and the begin comment

MiscObject Property Lockpick  Auto


в перке проверяется что есть отмычки и что это дверь/сундук и что заперто

kicrup  Offline  Сообщение №286 написано: 14 июня 2013, 08:25 | Отредактировано: kicrup - 14 июня 2013, 08:26



53
у меня просьба, напишите пожалуйста скрипт для двери, который бы срабатывал при входе и закрывал дверь через секунду, на ключ.
И еще скрипт на оружие, чтобы при ударе по двери, дверь открывалась. Буду благодарен.
Заранее спасибо :)


Прошло
valambar  Offline  Сообщение №287 написано: 26 июня 2013, 19:51



513
Нужны следующие скрипты:

1. При открытии разных копий контейнера должен открываться один и тот же инвентарь одного определенного контейнера. То есть где бы мы ни находились, если есть копия данного контейнера - то вещи взять-положить в один и тот же контейнер. Это нужно для создания нескольких копий одной локации, чтобы не было разницы в разных копиях локации при открытии одинаковых контейнеров.

2. При активации активатора должно всплывать меню (мессажбокс) из нескольких пунктов, при выборе каждого пункта дизейблятся все объекты из определенной группы (например, несколько дверей), кроме одного, который энейблится. Для каждого пункта - энейблится соответствующий только ему объект. Подозреваю, что во втором случае должен быть не один скрипт, а несколько результирующих скриптов мессажбокса.

3. При открытии двери сначала проигрывается видео, а потом только дверь перемещает игрока в локацию связанной с ней двери. То есть чтобы дверь работала как обычно, но с добавлением видео перед перемещением.

Иsкатель  Offline  Сообщение №288 написано: 8 июля 2013, 12:12



71
Вот скрипт крика "Оживление дракона": 

Но на драконов он не действует(да и вообще не на кого). В чем причина?


AleksTirex  Offline  Сообщение №289 написано: 8 июля 2013, 14:03


Архимаг


371
if akTarget.IsDead() == 1 && Game.GetPlayer().GetActorValue("dragonsouls") >= 1 && akTarget.GetRace() == "DragonRace"
 
и проверь на дохлом бандите/животном. Если ничего не сработает, значит, неправильно сделан крик (маг.эффект).

Иsкатель  Offline  Сообщение №290 написано: 10 июля 2013, 14:00 | Отредактировано: Иsкатель - 10 июля 2013, 14:03



71
AleksTirex, проверил на NPC и все норм сработало, но на драконов все равно не действует. В чем проблема?

Добавлено (10.07.2013, 18:00)
---------------------------------------------
Я скрипт изменил(изменил не из-за того, что  не действует на драконов(я не знаю в чем причина), а просто "модернизировал"):


Обнаружил еще один баг, а именно, если под крик попадут две или более цели, то они все тоже оживают. А мне нужно чтобы оживала только одна цель. Как это сделать?

Как сделать, чтобы цель после воздействия на нее крика сражалась за ГГ?

AleksTirex  Offline  Сообщение №291 написано: 10 июля 2013, 18:08 | Отредактировано: AleksTirex - 10 июля 2013, 18:10


Архимаг


371
Цитата Иsкатель

Как сделать, чтобы цель после воздействия на нее крика сражалась за ГГ?



Faction Property PlayerFaction  Auto
akTarget.StopCombat()
akTarget.RemoveFromAllFactions()
akTarget.AddToFaction(PlayerFaction)
akTarget.SetAV("Aggression", 1) ; можно 2

Иsкатель  Offline  Сообщение №292 написано: 10 июля 2013, 18:32



71
Цитата AleksTirex

На драконе не должно стоять галочки "Starts Dead", иначе его никогда не оживить. Дракона надо "убивать" при старте или загрузке, тогда он сможет ожить.

 AleksTirex, я проверял на обычных драконах, которые "летают" по Скайриму.

AleksTirex  Offline  Сообщение №293 написано: 11 июля 2013, 15:00


Архимаг


371
Цитата AleksTirex

AleksTirex, я проверял на обычных драконах, которые "летают" по Скайриму.


 
Обычные драконы тоже должны оживляться. Почему у тебя они не оживляются, я не знаю.
Возможно потому, что на них не должны действовать стандартные крики. Ты в своём маг.эффекте у этого крика удали кейворд MagicShout, тогда крик должен будет заработать и на драконе.

Добавлено (11.07.2013, 18:54)
---------------------------------------------
Всё правильно, драконы не будут реагировать на крики/заклинания, ведь при смерти им даётся статус Ghost, поэтому маг.эффект не действует.
 
Надо при старте крика проверять наличие в округе дохлых драконов и снимать Ghost (akActor.SetGhost(false)). Или наглым и грубым способом редактировать дефолтный скрипт MQKillDragonScript, что крайне не желательно.
 
Иsкатель, но ведь у тебя будут свои драконы, а с ними и так будет всё работать. Ты ведь не собираешься оживлять дохлых скайримских драконов, ведь это удел исключительно Алдуина.
 

 

Добавлено (11.07.2013, 19:00)
---------------------------------------------
Для пробы, можешь в консоли тыркнуть по дохлому дракону и вбить SetGhost 0, тогда он станет оживать.


Иsкатель  Offline  Сообщение №294 написано: 11 июля 2013, 18:20



71
Цитата AleksTirex

Надо при старте крика проверять наличие в округе дохлых драконов и снимать Ghost (akActor.SetGhost(false))

AleksTirex, пожалуйста напишите как это сделать.

AleksTirex  Offline  Сообщение №295 написано: 12 июля 2013, 12:08 | Отредактировано: AleksTirex - 12 июля 2013, 20:58


Архимаг


371
Создание точной копии актёра или ГГ, с той же бронёй и оружием, что и у оригинала:

<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> Копируйте адрес и вставляйте в адресную строку. Спасибо хозяевам сайта за их заботу о левых порталах, куда ведут любые ссылки, или за их прямые руки.

Добавлено (12.07.2013, 16:06)
---------------------------------------------

Цитата Иsкатель

Можно проверить экипировано ли оружие или магия, какое оружие экипировано(меч, лук, топор, кинжал и т.д.), в каком кол-ве экипированно(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
******************************************
При проверке оружия у ГГ в инвентаре можно его проверить (меч, лук и т.д.) и если он вас устраивает, то можно экипировать.
Так же надо определиться, что для ГГ лучше - магия или оружие, и от этого экипировать или то или другое.

Arin  Offline  Сообщение №296 написано: 12 июля 2013, 12:13



570
Доброго времени суток.

Уважаемые, никто не подскажет скрипт для воды (активатора), который при погружении в нее добавляет эффект? А то поисковик не хочет как-либо помогать, а единственный скрипт, который я нашла в СК, послал меня лесом и отказался открываться...

Наука всегда оказывается не права. Она не в состоянии решить ни одного вопроса, не поставив при этом десятка новых.
Джордж Бернард Шоу
Raser0919  Offline  Сообщение №297 написано: 12 июля 2013, 12:43



409
Я заметил что есть возможность создавать свои события и функции. В общем свои библиотеки. Вопрос в том где прописать область и способ действия этих событий и функций.

AleksTirex  Offline  Сообщение №298 написано: 12 июля 2013, 13:54 | Отредактировано: AleksTirex - 12 июля 2013, 13:39


Архимаг


371
Цитата Arin

Уважаемые, никто не подскажет скрипт для воды (активатора), который при погружении в нее добавляет эффект? А то поисковик не хочет как-либо помогать, а единственный скрипт, который я нашла в СК, послал меня лесом и отказался открываться...


 
Event OnTriggerEnter(ObjectReference akActionRef)
  ; akActionRef.AAA() ; добавляем эффект
EndEvent
 
Event OnTriggerLeave(ObjectReference akActionRef)
  ; akActionRef.BBB() ; удаляем эффект
EndEvent

AAA() и BBB() зависят от вида эффекта.

Raser0919  Offline  Сообщение №299 написано: 12 июля 2013, 14:35 | Отредактировано: Raser0919 - 12 июля 2013, 14:38



409
Цитата AleksTirex

Но вот создать своё событие... это никак (пока)


То есть скоро эта возможность появится? И кстати как добавлять новые формы. Просто в properties можно создать объект типа form но на выбор предлагаются всего лишь две какие то непонятные формы.

AleksTirex  Offline  Сообщение №300 написано: 12 июля 2013, 16:00 | Отредактировано: AleksTirex - 12 июля 2013, 16:09


Архимаг


371
Цитата Raser0919

То есть скоро эта возможность появится? И кстати как добавлять новые формы. Просто в properties можно создать объект типа form но на выбор предлагаются всего лишь две какие то непонятные формы.



Как скоро появится - зависит от разрабов SKSE ;) , возможно, у них уже есть такой механизм, но... пока нет никаких сведений об этом (или они хитрят, или забыли нас оповестить об этом). Теми командами, что есть в их скриптах, создать полноценные события невозможно.

Добавить именно формы никак, надо обязательно инициализировать эти объекты (Armor, Weapon и т.д.). Но эти свойства всегда можно преобразовать в форму: akArmor as Form

Но вот смысл в добавлении именно форм? Обычно, приходится проводить обратное преобразование - форма в объект. К тому же, все функции/команды работающие с формой, могут работать и с объектом из этой формы.

akActor.EquipItem(Form akItem, bool abPreventRemoval = false, bool abSilent = false) == akActor.EquipItem(akArmor)

kForm.GetFormID() == akActor.GetFormID()

Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)
Поиск:





Ответ на жалобу смотрите в разделе жалоб