• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Есть ли скриптовая команда, позволяющая установить курсор (камеру) на указанную цель? После диалога применяется функция Spell.Cast (Player, Target1), Spell.Cast (Player, Target2) и т.д. на несколько рядом стоящих целей, но срабатывает только на спикере, так как остальные спеллы пролетают тупо мимо своих целей (все летят в спикера, т.к. на него сфокусирована камера). Или можно как-то по-другому это реализовать?
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №2252
написано: 8 ноября 2016, 15:06
| Отредактировано: Multigone - 8 ноября 2016, 15:16
grumpos, если заклинание модное и известно, можно поменять его Delivery на Target Actor, тогда Cast() будет накладывать заклинание на указанную цель, а не туда, куда смотрит игрок.
А по сути, есть вот что:
; Sets this actor's head tracking target, optionally forcing it as their pathing look-at target Function SetLookAt(ObjectReference akTarget, bool abPathingLookAt = false) native
Код
Actor1.SetLookAt(Ref1) Actor1.SetLookAt(none)
Не работает с оружием в руках (?) или в режиме от первого лица.
Еще в Dialogue Scene Action есть отделение с 3 настройками Headtracking, но не знаю, будет ли в этом случае вращаться камера. Для примера можно посмотреть квест DB09.
Еще можно попробовать (не проверял, не уверен) установить угол камеры игрока функцией SetAngle(), если игрок находится в режиме первого лица, но думаю, выглядеть это будет не очень (если вообще будет работать).
Еще можно (?) заставить игрока творить заклинание пакетом UseMagic.
Всем привет нужен срочно скрипт - если тело затаскивается в тригер внутри дома - оно исчезает и появляется точно такое же тело на другом тригере снаружи дома возможно кому нибудь будет не трудно написать для меня подобный скрипт.
Lexo, можно лишь с помощью SKSE узнать, содержал ли камень душу изначально, т.е. что было указано в строке "Soul" этой формы. Если камень изначально пуст, нельзя вообще никак узнать, заполнен ли он, когда: 1) он содержит душу меньшей величины, чем камень, или... 2) он содержит душу соотв. величины, но форма не имеет ссылки на изначально полную версию (Linked to).
Артефакт Азуры всегда подходит под один из этих случаев, значит, определить величину души, или факт содержания души, невозможно.
Есть ли функция, закрывающая текущее открытое меню? А конкретней, можно ли скриптом закрыть открытый инвентарь?
И вдогонку, вопрос по Creation Kit тогда сразу - как сделать "невыбрасываемый" предмет? Я привязал его к квесту через Alias, по триггеру в инвентарь он добавляется, но игрок всё равно может его выбрость вручную.
Crunatus, пробовал галочку Quest Item в настройках алиаса? Это единственный не кривой способ. Чтоб закрыть меню без SKSE ничего что-то не припоминаю А с SKSE наверняка есть, но я его не использую.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №2258
написано: 23 ноября 2016, 18:37
| Отредактировано: Multigone - 23 ноября 2016, 18:38
Всем привет, вопрос такой - как выглядит скрипт который бы выводил сообщение если в тригер занесли труп NPC?
Подобный код компилируется но в игре ничего не происходит:
Event OnTriggerEnter(ObjectReference akActionRef) ;- Произошло событие - вход в зону триггера If ( akActionRef != Game.GetPlayer() && (akActionRef as Actor).IsDead() )
И ещё - нужно запустить стадию квеста №26 когда игрок зайдет в тригер но сделать это только если игрок уже дошел до стадии №25, по поводу стадии правильно ли я понимаю мне подсказали что нужно написать что то вроде:
If (QuestName.GetStage() == 26) и в проперти указать на нужный квест? проверил но почему то не декомпилируется - со скриптами всё ещё не знаком достаточно хорошо, планирую заняться этим в ближайшее время после завершения квеста, что бы не надоедать людям, но сейчас очень нужно ваша помощь.
Изменение репутации для пользователя Kepper
KepperOffline
Сообщение №2260
написано: 26 ноября 2016, 11:42
| Отредактировано: Kepper - 26 ноября 2016, 11:43
Да вроде более менее правильно. If (QuestName.GetStage() == 26) -> If (QuestName.GetStage() == 25) Я в этих делаю полную трассировку, чтобы посмотреть в логе папируса по какому извилистому пути идёт выполнение кода. Если не использует SKSE то замени GetName() на GetFormID()
Quest Property QuestName auto
Event OnTriggerEnter(ObjectReference akActionRef) Debug.Notification("Ахтунг! В меня попал инородный предмет "+akActionRef.GetName()) Debug.Trace("Marker_1 "+akActionRef.GetName())
If ( akActionRef != Game.GetPlayer() && (akActionRef as Actor).IsDead() ) Debug.Trace("Marker_2 "+akActionRef.GetName()) EndIf
Debug.Trace("Marker_3 "+akActionRef.GetName() +" "+QuestName.GetStage()) If akActionRef == Game.GetPlayer() && (QuestName.GetStage() == 25) QuestName.SetStage(26) Debug.Trace("Marker_4 Это ты вовремя пришёл "+akActionRef.GetName()) endif Debug.Trace("Marker_5 "+akActionRef.GetName() +" "+QuestName.GetStage())
EndEvent
Изменение репутации для пользователя AlexeyVN
AlexeyVNOffline
Сообщение №2261
написано: 27 ноября 2016, 08:04
| Отредактировано: AlexeyVN - 27 ноября 2016, 08:07
Здравствуйте, у меня вопрос не совсем по скриптам. Идея такая: После того как NPC упал на колени- начался разговор. Вопрос: Можно ли это реализовать через SM Event Node?
Изменение репутации для пользователя Aksyonov
AksyonovOffline
Сообщение №2262
написано: 6 декабря 2016, 09:52
| Отредактировано: Aksyonov - 6 декабря 2016, 09:53
Всем привет пожалуйста подскажите как можно заставить давакина (игрока) следовать по пути ( может нужно назначить AI пакет ) а как это делается? Нужно ли использовать сцены?
Создавал вот по типу с NPC AI пакет назначал пакет игроку NPC (PLAYER) указывал в пакете что работает пакет только на стадии 91, саму стадию назначал через диалог в квесте, а в итоге давакин никуда не идет, что делать, пересмотрел многое но видимо не там ищу.
Всем привет пожалуйста подскажите как можно заставить давакина (игрока) следовать попути ( может нужно назначить AI пакет ) а как это делается? Нужно ли использовать сцены?
Создавал вот по типу с NPC AI пакет назначал пакет игроку NPC (PLAYER) указывал в пакете что работает пакет только на стадии 91, саму стадию назначал через диалог в квесте, а в итоге давакин никуда не идет, что делать, пересмотрел многое но видимо не там ищу.
Привет, дружище) На самом деле это легко. Используй эту ФУНКЦИЮ в скрипте. Как точно сделать все это - посмотри в начальном квесте (когда в Хелгене ГГ выходит из повозки, или следует за капитаном после успешного выбора своей рассы).
Так же, по моему, нужно указать обязательно нужный IDLE, с которым ГГ будет двигаться. Но опять же, у меня в данный момент нет доступа к конструктору, потому изучи указанный мной выше квест.
Удачи.
Изменение репутации для пользователя Aksyonov
AksyonovOffline
Сообщение №2264
написано: 9 декабря 2016, 02:09
| Отредактировано: Aksyonov - 9 декабря 2016, 02:12
1. Нашел скрипт который запускает стандартное интро от BETHESDA когда начинается игра, Bethesda Preset и так далее. 2. Нашел ссылку в самом файле sfx на объект типа Sequence1 Sequence2 на 2d картинку, но ссылку в Flash изменить нельзя. 3. Вопрос можно ли запустить sfx анимацию в игре на прямую, указав на файл через Property? как изменить ссылку на Sequence1? 4. Я хотел в Flash создать новую форму типа Sequence 10 и указать в sfx ссылку на новый элемент, но параметры ссылок _root.Sequence1.gotoEndStop(1); не меняются в sfx.
5. В sfx мне не понятно каким образом игра понимает что строка _root.Sequence1.gotoEndStop(1); относиться к форме под номером 1 а не скажем 12 которая есть в sfx.
4. Хочется создать такое же начало как и у разработчиков в своём квесте, но пока что таким способом как у Bethesda сделать ничего не получается. 5. Буду рад любым мыслям на этот счет, заменить элементы текста в интро не проблема, но мне нужно не портить существующую заставку при начале игры а добавить свою.
Не помню, задавался ли тут такой вопрос, но... возможно ли проверить, какой тип оружия экипирован? Конкретно, проверить, экипирован ли боевой молот? Пытался сделать эффект отбрасывания, как при Безжалостной силе, но... молоты почему-то вообще не хотят воспринимать никакие эффекты через Apply Combat Hit Spell... вот я и подумал сделать эффект через скрипт... не подскажете способ, как это сделать?
Добавлено (15 Декабря 2016, 08:24) --------------------------------------------- Опа... заметил, что проблемы с молотами возникли только в моём моде, потому что без него всё работает... надо понять, что я натворил с молотами...
Но вопрос всё-ровно интересный - можно ли в скрипте сделать проверку на тип оружия?
Lexo, ничё он не интересный... Можно использовать на акторе метод GetEquippedItemType - возвращает число, соответствующие типу оружия. Можно вызывать на акторе GetEquippedWeapon - возвращает оружие и проверить наличие на оружии кейворда, обозначающего тип. Наверняка так же можно вызывать WornHasKeyword - проверяет, надето ли на акторе что-то с указанным кейвордом. Любой новичок это всё видел на creationkit.com
Здравствуйте. Подскажите как сделать чтобы VisualEffect играл на оружие а не на игрока? в оригинале так TargetVFX.Play(NPC,4.7, ГГ) CasterVFX.Play(ГГ,5.9,NPC) а надо чтобы так TargetVFX.Play(NPC,4.7, Оружие) CasterVFX.Play(Оружие,5.9,NPC) Оружие = экипированный лук
Но вопрос всё-ровно интересный - можно ли в скрипте сделать проверку на тип оружия?
Думаю да, мне на ум приходит использовать уникальные editor id предметов, открываем настройки предмета там есть ID их что то вроде:
Armor Boots - Armor Curas, потом в скрипте нужно написать проверку по этим ключевым словами всё, я уже так делал и всё успешно работало, но правда я не писал прямо в скрипте - а делал это через условия в заклинаниях но всё же в направлении в этом стоит копать.
Изменение репутации для пользователя Lexo
LexoOffline
Сообщение №2269
написано: 21 декабря 2016, 06:57
| Отредактировано: Lexo - 21 декабря 2016, 08:12
Теперь у меня новый вопрос... вот нашёл способ, как кидать заклинание во время атаки оружием... а можно сделать различие между атакой правой рукой и левой?
Keyword property _LEXO_Agni Auto Spell Property _LEXO_FireWave auto
Actor xP Bool bL
EVENT OnInit() xP = GetActorReference() ENDEVENT
EVENT OnRaceSwitchComplete() xP = GetActorReference() ENDEVENT
EVENT OnObjectEquipped(Form xF, ObjectReference xR) IF xF AS Weapon && xF.HasKeyword(_LEXO_Agni) && !bL bL = true Utility.Wait(0.001) ; IF xP.GetEquippedWeapon(0).GetEnchantment().HasKeyword(_LEXO_Agni) || WornObject.GetEnchantment(xP, 1, 0).HasKeyword(_LEXO_Agni) ; Если чары оружия имеют кейворд (SKSE). IF xP.GetEquippedWeapon(0).HasKeyword(_LEXO_Agni) ; Если оружие имеет кейворд. RegisterForAnimationEvent(xP, "weaponSwing") ELSE UnRegisterForAnimationEvent(xP, "weaponSwing") ENDIF
; IF xP.GetEquippedWeapon(1).GetEnchantment().HasKeyword(_LEXO_Agni) || WornObject.GetEnchantment(xP, 0, 0).HasKeyword(_LEXO_Agni) IF xP.GetEquippedWeapon(1).HasKeyword(_LEXO_Agni) RegisterForAnimationEvent(xP, "weaponLeftSwing") ELSE UnRegisterForAnimationEvent(xP, "weaponLeftSwing") ENDIF bL = false ENDIF ENDEVENT
Если найдешь события, которые будут срабатывать на неписях: в любом случае, можно отслеживать либо экипирование конкретного оружия любым актером (скрипт на базовое оружие и заклинание), или экипирование любого оружия конкретным актером (скрипт на алиас / заклинание - как здесь). Сделать, чтобы отслеживание анимации было связано только с зачарованием (например, снимаемые чары, позволяющие любому оружию кидать фаербол при махании), таким методом нельзя.
Lexo, еще проверь:
- вешается на алиас игрока. - квест алиаса должен быть запущен. - заполняются Property (для проверки можно взять Firerball). - у экипированного оружия должно быть это ключ. слово (для проверки WeapMaterialIron).
Изменение репутации для пользователя Lexo
LexoOffline
Сообщение №2273
написано: 8 января 2017, 19:38
| Отредактировано: Lexo - 8 января 2017, 19:56
Народ, простите мою тупость, но я уже 2 дня голову себе ломаю, никак не могу добиться желаемого результата...
Заклинание должно убирать из инвентаря предмет, кидать прожектайл. Когда прожектайл взрывается, на месте взрыва должен появиться тот самый предмет (желательно реф, а не базовый).
Примерно так делаю:
Event OnEffectStart(actor B, actor A) Selfref = A Selfref.RemoveItem(_LEXO_Item) RegisterForSingleUpdate(1) EndEvent
Прожектайл этого заклинания создаёт взрыв. Взрыв создаёт активатор.
GlobalVariable property _LEXO_Drop Auto
Event OnLoad()
If (_LEXO_Drop.GetValue() == 0) _LEXO_Drop.SetValue(1) EndIf
EndEvent
Но у меня всё время проблема... либо он не хочет компилировать - проблема в "ActivatorRef = _LEXO_PlacedActivator.Getref()".
А если что-то и закомпилируется, то не работает. Заклинание кидается, предмет удаляется, но валяться на месте не хочет... подскажите, пожалуйста, что не так...
Господа, подскажите, почему в игре указанный предмет пропадает у Caster'a, а не у Target'a? Более того, предмет в обоих вариантах удаляется у игрока из инвентаря, а не у цели, на ком бы функция не работала. Весь день ковыряюсь в этих строчках, ума не приложу в чем беда.
Lexo, можешь повесить на активатор вот такое и всё:
Код
Scriptname SionActScript extends ObjectReference
Actor Property PlayerRef Auto; Weapon Property IronSword Auto;
Event OnInit()
If (PlayerRef.GetItemCount(IronSword) > 0) Debug.Notification("Placing sword!"); PlayerRef.RemoveItem(IronSword, 1); PlaceAtMe(IronSword); Else Debug.Notification("You have no swords!"); EndIf
PitrPokir, у Magic Effect, на котором висит твой скрипт, в свойстве Delivery указано что эффект накладывается на себя или на цель? Надо чтобы был на цель.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №2277
написано: 9 января 2017, 09:25
| Отредактировано: Multigone - 9 января 2017, 09:28
Чтобы управлять референсом предмета, нужно его знать. Значит, предмет должен быть в алиасе. На активатор:
Код
Scriptname _TESTTEST27 extends objectReference ; если предмет создается алиасом (или находится там).
ReferenceAlias Property ItemAlias auto
Event OnLoad() objectReference ItemRef = ItemAlias.GetReference() IF Game.GetPlayer().GetItemCount(ItemRef) ItemRef.MoveTo(Self, 0.0, 0.0, 25.0) ; располагает предмет на 25 юнитов выше активатора. while !ItemRef.is3dloaded() utility.wait(0.05) endwhile ItemRef.setMotionType(Motion_Keyframed) ; если нужно, чтобы предмет не улетел куда-нибудь. ENDIF endEvent
Активатор должен иметь модель, можно Effects\FXEmptyObject.nif.
Dsion, если накрутить много действий на oninit (или просто вставить ожидание), он сработает несколько раз. Проверь свой скрипт через debug.notification(utility.randomfloat()), и там спавнится 3-4 меча. У меня это так работает для всех oninit.
Изменение репутации для пользователя PitrPokir
PitrPokirOffline
Сообщение №2278
написано: 9 января 2017, 11:56
| Отредактировано: PitrPokir - 9 января 2017, 14:12
Выдало в лог папируса вполне адекватное сообщение: TEST akTarget=[Actor < (000B6CE1)>] akCaster=[Actor < (00000014)>] akCaster - главный герой akTarget - какой-то актёр, которому ты хочешь облегчить карманы.
Добавь в свой скрипт Debug.Trace("TEST akTarget="+akTarget+" akCaster="+akCaster) и посмотри.
Изменение репутации для пользователя PitrPokir
PitrPokirOffline
Сообщение №2280
написано: 10 января 2017, 00:20
| Отредактировано: PitrPokir - 10 января 2017, 00:22
Kepper, у меня в логах папируса почему-то одинаковый ID и у цели, и у кастера. В чем может быть проблема? Скрипт лежит в эффекте "Оживление трэлла". Я его дублировал, назвал по-своему и добавил этот скрипт. Спелл тоже почти не менял, разве что оставил только этот маг.эффект и длительность урезал, что бы не убивать раз за разом оживленный труп. Игру и СК переустанавливал, плагин заново создавал, всё тоже самое. P.S.Может дело в самом маг.эффекте? Трэлл же типа принадлежит игроку, может поэтому и ссылается на него. Но даже если так, я не знаю что с этим делать P.P.S. игра чистая, только официальные DLC
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)