• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
; Sets whether the player knows this form ; Should only be used for Magic Effects, ; Words of Power, and Enchantments Function SetPlayerKnows(bool knows) native
Добавлено (19 Октября 2016, 01:53) --------------------------------------------- Multigone, Скажите может в каком нибудь в другой меню будут отображаться новые зачарованные предметы
Эх, решил я не заваливать тему вопросами, и выложить всю идею одним сообщением. Идея заключается в заклинании, мне нужно что бы при активации заклинания за спиной появлялся циферблат и отсчитывал минуту, а спустя минуту происходил эффект заклинания. Для понятности заклинание массового убийства. Как мне сказали, задержку заклинания можно сделать скриптом, и я опять прошу помощь, помогите пожалуйста.
SoulDiablo, задержку сделать легко, циферблат - проблема.
Добавлено (19 Октября 2016, 19:18) --------------------------------------------- AlexeyVN, вот перечень всех меню, выбирай, что лучше подойдет (мое мнение - ничего):
Собственно, я и направил SoulDiablo, сюда, т.к. вы мне очень много раз помогали... на счёт циферблата - тоже особой проблемы нету... среди моделей в Скайриме я как-то раз обнаружил странную штуку, которую никогда не видел... в нифскопе это выглядит как какие-то цифры, а в СК это представляет из себя как раз-таки таймер с обратным отсчётом... забавно выглядит... но суть не в этом...
Эффект заклинания SoulDiablo - на себя. Так что, скрипт с предыдущей страницы вполне подойдёт...
+ Заклинание должно иметь архетип Scripts. + Должно иметь продолжительность не меньше 61 с (лучше 1 день или больше, чтобы иметь гарантированные 60 сек. работы, даже если другие моды перками снижают общую Duration всех заклинаний - я так перестраховываюсь). + Если повторно скастовать его, а таймер не дошел до нуля, отсчет пойдет заново.
Код
Scriptname _TESTTEST20 Extends ActiveMagicEffect
Spell Property ThisSpell Auto ; Заклинание с этим эффектом. Заполняется обязательно. Spell Property MyDevastatingSpell Auto ; Заклинание, уничтожающее все живое. Activator Property MyClock Auto ; Активатор с моделью-часами. Если оставить none, ничего плохого не случится (таймера не будет). Float Property MyStartTime = 60.0 Auto ; Начальный отсчет часов.
EVENT OnUpdate() IF fTimer > 0.0 ClockRef.SetAnimationVariableFloat("UcknownAnim", fTimer) ; Нужно знать название анимации для модели таймера. fTimer -= 1.0 RegisterForSingleUpdate(1.00) ELSE GetTargetActor().DispelSpell(ThisSpell) ENDIF ENDEVENT
EVENT OnEffectFinish(Actor xT, Actor xC) IF fTimer <= 0.0 MyDevastatingSpell.Cast(xT) ENDIF ClockRef.Delete() ENDEVENT
2)
+ Заклинание может иметь любой архетип. + Его продолжительность не имеет значения. + Если повторно скастовать его, появится новый таймер, каждый сработает в соотв. время.
Код
Scriptname _TESTTEST21 Extends ActiveMagicEffect
Spell Property MyDevastatingSpell Auto ; Заклинание, уничтожающее все живое. Activator Property MyClock Auto ; Активатор с моделью-часами. Если оставить none, ничего плохого не случится (таймера не будет). Float Property MyStartTime = 60.0 Auto ; Начальный отсчет часов.
EVENT OnEffectStart(Actor xT, Actor xC) ObjectReference ClockRef = xT.PlaceAtMe(MyClock) WHILE MyStartTime > 0.0 ClockRef.SetAnimationVariableFloat("UcknownAnim", MyStartTime) ; Нужно знать название анимации для модели таймера. Utility.Wait(1.0) MyStartTime -= 1.0 ENDWHILE MyDevastatingSpell.Cast(xT) ClockRef.Delete() ENDEVENT
Ничего не проверял, кроме компилируемости. Если модели таймера нет, отсчет не будет показан, а заклинание сработает в положенное время.
***
PS: Если вообще не учитывать модель таймера, варианты могут быть упрощены до:
1)
+ Теперь эффект должен иметь архетип ValueMod (с параметром "Morality", к примеру). + Поставить заклинанию нужную продолжительность, по окончании действия оно сработает.
Код
Scriptname _TESTTEST20 Extends ActiveMagicEffect
Spell Property MyDevastatingSpell Auto ; Заклинание, уничтожающее все живое.
EVENT OnEffectFinish(Actor xT, Actor xC) MyDevastatingSpell.Cast(xT) ENDEVENT
2)
Код
Scriptname _TESTTEST21 Extends ActiveMagicEffect
Spell Property MyDevastatingSpell Auto ; Заклинание, уничтожающее все живое.
EVENT OnEffectStart(Actor xT, Actor xC) Utility.Wait(60.0) MyDevastatingSpell.Cast(xT) ENDEVENT
AlexeyVN, эх, ты сам запутался и нас запутал... Давай начнем с начала.
Во-первых, ты точно понимаешь, что делаешь? (akBaseItem as Armor).SetEnchantment(none) Я не использую SKSE, но я почти уверен, что такая команда снимет зачарование не с конкретного капюшона, а со всех капюшонов данного типа во всём мире.
Вот есть, к примеру: - не зачарованный стальной клинок - стальной клинок с уроном огнем - стальной клинок с уроном льдом - стальной клинок с шансом паралича итд. итп. И у каждого свой базовый предмет и свой базовый ID. Имея в инвентаре клинок с шансом паралича фиг получишь ID обычного не зачарованного клинка. А как ты его получишь..? Вот и я не знаю... Разве что создавать кучу формлистов, связывающих зачарованные предметы с незачарованным.
Dsion, ясно моя затея провалилась(((( спасибо за подсказку)))
Добавлено (20 Октября 2016, 04:21) --------------------------------------------- Dsion, Ну а всё таки Можно добавить в форм лист новые зачарованные предметы?
Добавлено (20 Октября 2016, 04:23) --------------------------------------------- Dsion, или как определить что предмет был зачарован игроком
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №2237
написано: 20 октября 2016, 11:39
| Отредактировано: Multigone - 20 октября 2016, 11:44
AlexeyVN, в общем, сделал, хотя не совсем так, как планировалось. Итак:
- игрок активирует алтарь. - опционально показывается сообщение, что нужно выбросить из инвентаря зачарованный предмет. - открывается инвентарь. - если игрок выбрасывает незачарованный предмет, он возвращается обратно в инвентарь. - если зачарованный, то меню закрывается, он теряет зачарование, плюс: - самопальные оружие и доспех - нормальный процесс. - уровневое оружие теряет заточку. - уровневый доспех никак не обрабатывается (нужно дополнять скрипт форм-листами, проблема в SKSE). - уникальные предметы не обрабатываются (нужно дополнять списком всех уникальных вещей). - если игрок выбрасывает стек из нескольких зачарованных предметов (от 5 по дефолту), то они теряют зачарование, один из них помещается на алтарь, остальные будут брошены рядом. - когда игрок закрывает меню вручную, ничего не происходит.
Код
Scriptname _TESTTEST22 Extends ObjectReference ; На алтарь.
Message Property MyMessage Auto ; Опционально сообщение (можно не заполнять). Должно иметь строки: 0 - да, 1 - нет. _TESTTEST23 Property L Auto ; Вместо _TESTTEST23 указать реальное название скрипта, присоединенного к алиасу игрока! И обязательно заполняется в СК!
EVENT OnActivate(ObjectReference xR) GoToState("S") IF xR AS Actor && (!MyMessage || !MyMessage.Show()) L.GoToState("S") L.Altar = Self Input.TapKey(Input.GetMappedKey("Quick Inventory")) ENDIF GoToState("") ENDEVENT
STATE S EVENT OnActivate(ObjectReference xR) ENDEVENT ENDSTATE
Код
Scriptname _TESTTEST23 Extends ReferenceAlias ; На алиас игрока.
STATE S Event OnItemRemoved(Form akBaseItem, Int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer) IF !akItemReference || akDestContainer ELSEIF akBaseItem as Weapon && (akBaseItem as Weapon).GetEnchantment() Form xF = ((akItemReference.GetBaseObject()) AS Weapon).GetTemplate() IF xF Input.TapKey(0x1) akItemReference.Delete() akItemReference = Altar.PlaceAtMe(xF, aiItemCount) akItemReference.MoveTo(Altar, 0.0, 0.0, 200.0) ; Доработать так, как необходимо. ELSE Debug.Notification("Предмет уникален.") ; Предмет имеет зачарование, но не имеет основополагающего оружия. Нужно рассматривать каждый случай отдельно (создавать лист). ENDIF ELSEIF akBaseItem as Armor && (akBaseItem as Armor).GetEnchantment() Form xF ;= ((akItemReference.GetBaseObject()) AS Armor).GetTemplate() ; На текущий момент такой функции в SKSE нет, нужно создавать несколько листов. IF xF Input.TapKey(0x1) akItemReference.Delete() akItemReference = Altar.PlaceAtMe(xF, aiItemCount) ; Доработать так, как необходимо. akItemReference.MoveTo(Altar, 0.0, 0.0, 200.0) ELSE Debug.Notification("Предмет уникален.") ENDIF ELSEIF akItemReference.GetEnchantment() Input.TapKey(0x1) akItemReference.MoveTo(Altar, 0.0, 0.0, 200.0) ; Доработать так, как необходимо. akItemReference.SetEnchantment(none, 0.0) ELSE GetRef().AddItem(akItemReference, aiItemCount, true) ENDIF ENDEVENT
Multigone, спасибо большое работает нормально))) а можно как нибудь подсветку сделать как в меню зачарования то есть если предмет не имеет зачарование оно тёмное а если да то светлое
Добавлено (20 Октября 2016, 20:05) --------------------------------------------- Multigone, И вопрос не скромный откуда у вас такие познания в скриптах?))))
... много лишних аргументов. В SKSE 1.7.3 такого нет (Upd: есть в WornObject.psc).
Идея понятна. Перебираются все надетые на актера вещи, и если какая-либо из них зачарована, зачарование снимается (что такое WornObject?). Это в теории.
Еще: все операции c зачарованием (Get / Set) для ObjectReference могут проводиться только в случае, если это зачарование было наложено игроком. Если зачарование указано в базовом объекте, то попытка применить на таком референсе akItemReference.SetEnchantment(none, 0.0) приведет к вылету из игры.
А пробовали не удалить зачарование с референса, а заменить? Зачаровать референс, база которого уже и так зачарована. Тоже вылетает? Еще я бы попробовал разобраться с этой функцией: http://www.creationkit.com/index.php?title=TempClone_-_Form
Есть ли какая-то возможность скриптом выводить на экран список с возможностью выбора из него? Например, я нажимаю кнопку и на экране появляется список из 10 пунктов (именно список, а не 10 кнопок). Выбрав определенный пункт в этом списке, происходит некое действие. Или, как вариант, вместо списка появляется поле ввода с предложением вписать туда цифру от 1 до 10, которая затем обрабатывается скриптом.
Изменение репутации для пользователя Dsion
DsionOffline
Сообщение №2244
написано: 2 ноября 2016, 12:33
| Отредактировано: Multigone - 23 апреля 2020, 14:27
Всем привет вопрос такой, почему на лошадь в игре садишься а с человеком разговариваешь? хотелось бы узнать где это прописывается и если есть скрипт то просмотреть и его, как вы думаете есть ли возможность заставить лошадь говорить как персонажа человека? появилась идея реализовать разговор с лошадью когда игрок принимает скуму, возможно ли это?
Всем привет вопрос такой, почему на лошадь в игре садишься а с человеком разговариваешь?
Насколько я знаю это в движке прописано. Скорей всего идет проверка по horserace. К тому же в самой horserace, если не ошибаюсь не стоит галка - allow pc dialogue. Можно конечно попроболвать сделать отдельную рассу и перекинуть на нее всех лошадей, но конфликтов не избежать.
Народ, а есть в скриптах функция, которая отвечает за то, что бы спутник был в группе? И ещё, что бы определить расстояние до спутника...
Просто делаем спутника, который, как бы это банально не звучало, должен лечить... всё есть, всё работает... осталось только сделать наличие его в спутниках и близко.
Есть несколько модов на таких спутников, но... там ТАКАЯ куча скриптов и они такие огромные, что запутаться легко...
Lexo, добавление стандартных компаньонов происходит в квесте DialogueFollower. Еще можно изучить это. Расстояние между объектами определяется функцией...
; Calculates the distance between this reference and another - both must either be in the same interior, or same worldspace float Function GetDistance(ObjectReference akOther) native
Код
Float f = Ref1.GetDistance(Ref2)
PS: Расстояние следования за игроком задается в FollowerPackageTemplate, однако ничто не мешает сделать свой пакет.
Изменение репутации для пользователя Aksyonov
AksyonovOffline
Сообщение №2250
написано: 7 ноября 2016, 23:50
| Отредактировано: Aksyonov - 8 ноября 2016, 00:01
Есть несколько модов на таких спутников, но... там ТАКАЯ куча скриптов и они такие огромные, что запутаться легко...
Я делал в одном из своих модов помню реализовывал лечение магией тоже в определенном расстоянии через радиус в спеле без каких либо скриптов, указываете условие просто в спеле Condition Functions и всё работает, указать нужно несколько условий, а каст заклинания делаем постоянным, так и получается что работать оно будет только когда компаньон допустим рядом с главным героем, можно попробовать в общем.
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)