Модератор форума: 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? Пиши не в ЛС, а в эту тему.
Multigone  Offline  Сообщение №2221 написано: 18 октября 2016, 22:19



816
AlexeyVN, можно этой SKSE-функцией:

; Sets whether the player knows this form
; Should only be used for Magic Effects,
; Words of Power, and Enchantments
Function SetPlayerKnows(bool knows) native


Код
MySomethingEnchantment.SetPlayerKnows(true)

AlexeyVN  Offline  Сообщение №2222 написано: 18 октября 2016, 22:53



52
Multigone, Спасибо буду разбираться

Добавлено (19 Октября 2016, 01:53)
---------------------------------------------
Multigone, Скажите может в каком нибудь в другой меню будут отображаться новые зачарованные предметы


grumpos  Offline  Сообщение №2223 написано: 19 октября 2016, 11:47



24
Можно как-нибудь увеличить время показа Debug.Notification, а то очень быстро сообщения пропадают. MessageBox не предлагать )

Multigone  Offline  Сообщение №2224 написано: 19 октября 2016, 11:53



816
grumpos, по дефолту время показа около 5 с. Возможно, это настраивается где-то в Settings.

SoulEx  Offline  Сообщение №2225 написано: 19 октября 2016, 14:25


Ashes to ashes, dust to dust


25
Эх, решил я не заваливать тему вопросами, и выложить всю идею одним сообщением. Идея заключается в заклинании, мне нужно что бы при активации заклинания за спиной появлялся циферблат и отсчитывал минуту, а спустя минуту происходил эффект заклинания. Для понятности заклинание массового убийства. Как мне сказали, задержку заклинания можно сделать скриптом, и я опять прошу помощь, помогите пожалуйста.

Multigone  Offline  Сообщение №2226 написано: 19 октября 2016, 16:18



816
SoulDiablo, задержку сделать легко, циферблат - проблема.

Добавлено (19 Октября 2016, 19:18)
---------------------------------------------
AlexeyVN, вот перечень всех меню, выбирай, что лучше подойдет (мое мнение - ничего):



Код
;    "InventoryMenu"
;    "Console"
;    "Dialogue Menu"
;    "HUD Menu"
;    "Main Menu"
;    "MessageBoxMenu"
;    "Cursor Menu"
;    "Fader Menu"
;    "MagicMenu"
;    "Top Menu"
;    "Overlay Menu"
;    "Overlay Interaction Menu"
;    "Loading Menu"
;    "TweenMenu"
;    "BarterMenu"
;    "GiftMenu"
;    "Debug Text Menu"
;    "MapMenu"
;    "Lockpicking Menu"
;    "Quantity Menu"
;    "StatsMenu"
;    "ContainerMenu"
;    "Sleep/Wait Menu"
;    "LevelUp Menu"
;    "Journal Menu"
;    "Book Menu"
;    "FavoritesMenu"
;    "RaceSex Menu"
;    "Crafting Menu"
;    "Training Menu"
;    "Mist Menu"
;    "Tutorial Menu"
;    "Credits Menu"
;    "TitleSequence Menu"
;    "Console Native UI Menu"
;    "Kinect Menu"

Lexo  Offline  Сообщение №2227 написано: 19 октября 2016, 17:01


Всепознающий мододел


223
Собственно, я и направил SoulDiablo, сюда, т.к. вы мне очень много раз помогали... на счёт циферблата - тоже особой проблемы нету... среди моделей в Скайриме я как-то раз обнаружил странную штуку, которую никогда не видел... в нифскопе это выглядит как какие-то цифры, а в СК это представляет из себя как раз-таки таймер с обратным отсчётом... забавно выглядит... но суть не в этом...

Эффект заклинания SoulDiablo - на себя. Так что, скрипт с предыдущей страницы вполне подойдёт...

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Dsion  Offline  Сообщение №2228 написано: 19 октября 2016, 18:27



AlexeyVN, новые зачарованные игроком вещи отлично отображаются в GiftMenu. Проблема в скрипте, а не в меню.

Multigone  Offline  Сообщение №2229 написано: 19 октября 2016, 21:11 | Отредактировано: Multigone - 23 апреля 2020, 14:35



816
SoulDiablo, вот варианты:

1)

+ Заклинание должно иметь архетип 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 ; Начальный отсчет часов.

ObjectReference ClockRef
Float fTimer

EVENT OnEffectStart(Actor xT, Actor xC)
    ClockRef = xT.PlaceAtMe(MyClock)
    fTimer = MyStartTime
    OnUpdate()
ENDEVENT

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  Offline  Сообщение №2230 написано: 19 октября 2016, 23:41



52
Dsion, Случайно не знаете как добавить новые зачарованные вещи в форм лист

Добавлено (20 Октября 2016, 02:41)
---------------------------------------------
Multigone, Я доверюсь вашему мнению, буду искать другие варианты


Dsion  Offline  Сообщение №2231 написано: 20 октября 2016, 00:09



AlexeyVN, эх, ты сам запутался и нас запутал... Давай начнем с начала.

Во-первых, ты точно понимаешь, что делаешь?
(akBaseItem as Armor).SetEnchantment(none)
Я не использую SKSE, но я почти уверен, что такая команда снимет зачарование не с конкретного капюшона, а со всех капюшонов данного типа во всём мире.

AlexeyVN  Offline  Сообщение №2232 написано: 20 октября 2016, 00:20



52
Dsion, В моём случае это команда снимает зачарование с предмета который я выкидываю на алтарь

Dsion  Offline  Сообщение №2233 написано: 20 октября 2016, 00:34 | Отредактировано: Dsion - 20 октября 2016, 00:35



И со всех таких же предметов с тем же зачарованием в мире...

AlexeyVN  Offline  Сообщение №2234 написано: 20 октября 2016, 00:51



52
Dsion, ДА  Об этом я не подумал(((((   а если новые зачарованые предметы такой же эффект будет?

Добавлено (20 Октября 2016, 03:51)
---------------------------------------------
Dsion, буду думать как решить эту прблему


Dsion  Offline  Сообщение №2235 написано: 20 октября 2016, 01:02



Вот есть, к примеру:
- не зачарованный стальной клинок
- стальной клинок с уроном огнем
- стальной клинок с уроном льдом
- стальной клинок с шансом паралича
итд. итп.
И у каждого свой базовый предмет и свой базовый ID.
Имея в инвентаре клинок с шансом паралича фиг получишь ID обычного не зачарованного клинка. А как ты его получишь..? Вот и я не знаю...
Разве что создавать кучу формлистов, связывающих зачарованные предметы с незачарованным.

AlexeyVN  Offline  Сообщение №2236 написано: 20 октября 2016, 01:23



52
Dsion, ясно моя затея провалилась(((( спасибо  за подсказку)))

Добавлено (20 Октября 2016, 04:21)
---------------------------------------------
Dsion, Ну а всё таки Можно добавить в форм лист новые зачарованные предметы?

Добавлено (20 Октября 2016, 04:23)
---------------------------------------------
Dsion, или как определить что предмет был зачарован игроком


Multigone  Offline  Сообщение №2237 написано: 20 октября 2016, 11:39 | Отредактировано: Multigone - 20 октября 2016, 11:44



816
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 ; На алиас игрока.

ObjectReference Property Altar Auto Hidden

EVENT OnInit()
    RegisterForMenu("InventoryMenu")
ENDEVENT

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

    EVENT OnMenuClose(string menuName)
        GoToState("")
    ENDEVENT
ENDSTATE

AlexeyVN  Offline  Сообщение №2238 написано: 20 октября 2016, 17:05 | Отредактировано: AlexeyVN - 20 октября 2016, 17:00



52
Multigone, спасибо большое работает нормально))) а можно как нибудь подсветку сделать как в меню зачарования то есть если предмет не имеет зачарование оно тёмное а если да то светлое

Добавлено (20 Октября 2016, 20:05)
---------------------------------------------
Multigone, И вопрос не скромный откуда у вас такие познания в скриптах?))))


Multigone  Offline  Сообщение №2239 написано: 20 октября 2016, 18:18



816
AlexeyVN, т.е. то, что некоторые проблемы остались, не смущает?

Цитата AlexeyVN

можно как нибудь подсветку сделать

Вряд ли.

AlexeyVN  Offline  Сообщение №2240 написано: 20 октября 2016, 18:27 | Отредактировано: Multigone - 23 апреля 2020, 14:42



52
Multigone, Конечно не идеально Ну хоть что то Шаг за шагом с вашей помощью я добираюсь к цели)))

Может из этого можно что нибудь придумать?

Код
Event OnEffectStart(Actor akTarget, Actor akCaster)
Disenchant(akTarget)

EndEvent

Function Disenchant(Actor actorRef, int handSlots = 2, int firstSlot = 30, int lastSlot = 61) global

int i = firstSlot

if handSlots >= 0 && WornObject.GetEnchantment(actorRef, 0, 0) != None
WornObject.SetEnchantment(actorRef, 0, 0, None, 0)
Weapon item = actorRef.GetEquippedObject(0) as Weapon
Debug.Notification("Чары развеяны " )
endIf

if handSlots >= 1 && WornObject.GetEnchantment(actorRef, 1, 0) != None
WornObject.SetEnchantment(actorRef, 1, 0, None, 0)
Weapon item = actorRef.GetEquippedObject(1) as Weapon
Debug.Notification("Чары развеяны  " )
endIf

while i <= lastSlot ; Iterate through each equip slot.
int slotMask = Armor.GetMaskForSlot(i)
Armor item = actorRef.GetWornForm(slotMask) as Armor

if item != None
Enchantment ench = WornObject.GetEnchantment(actorRef, 0, slotMask)

if ench != None
WornObject.SetEnchantment(actorRef, 0, slotMask, None, 0)
Debug.Notification("Чары развеяны  " )
endIf
endIf

i += 1
endWhile
EndFunction

Multigone  Offline  Сообщение №2241 написано: 20 октября 2016, 19:02 | Отредактировано: Multigone - 28 октября 2016, 16:17



816
AlexeyVN, что-то у этого...


Код
WornObject.GetEnchantment(actorRef, 0, 0)

Код
WornObject.SetEnchantment(actorRef, 0, 0, None, 0)
... много лишних аргументов. В SKSE 1.7.3 такого нет (Upd: есть в WornObject.psc).

Идея понятна. Перебираются все надетые на актера вещи, и если какая-либо из них зачарована, зачарование снимается (что такое WornObject?). Это в теории.

Еще: все операции c зачарованием (Get / Set) для ObjectReference могут проводиться только в случае, если это зачарование было наложено игроком. Если зачарование указано в базовом объекте, то попытка применить на таком референсе akItemReference.SetEnchantment(none, 0.0) приведет к вылету из игры.

Dsion  Offline  Сообщение №2242 написано: 20 октября 2016, 23:18



А пробовали не удалить зачарование с референса, а заменить? Зачаровать референс, база которого уже и так зачарована. Тоже вылетает?
Еще я бы попробовал разобраться с этой функцией:
http://www.creationkit.com/index.php?title=TempClone_-_Form

grumpos  Offline  Сообщение №2243 написано: 2 ноября 2016, 11:54



24
Есть ли какая-то возможность скриптом выводить на экран список с возможностью выбора из него? Например, я нажимаю кнопку и на экране появляется список из 10 пунктов (именно список, а не 10 кнопок). Выбрав определенный пункт в этом списке, происходит некое действие. Или, как вариант, вместо списка появляется поле ввода с предложением вписать туда цифру от 1 до 10, которая затем обрабатывается скриптом.

Dsion  Offline  Сообщение №2244 написано: 2 ноября 2016, 12:33 | Отредактировано: Multigone - 23 апреля 2020, 14:27



Без SKSE - нету. Только 10 кнопок.

В SKSE дофига функций для создания менюшек и форм, но я его не использую и не шибко в теме...

Aksyonov  Offline  Сообщение №2245 написано: 6 ноября 2016, 02:16 | Отредактировано: Aksyonov - 6 ноября 2016, 02:16



937
Всем привет вопрос такой, почему на лошадь в игре садишься а с человеком разговариваешь? хотелось бы узнать где это
прописывается и если есть скрипт то просмотреть и его, как вы думаете есть ли возможность заставить лошадь говорить
как персонажа человека? появилась идея реализовать разговор с лошадью когда игрок принимает скуму, возможно ли это?

Gv1n  Offline  Сообщение №2246 написано: 6 ноября 2016, 12:43



15
Цитата Aksyonov

Всем привет вопрос такой, почему на лошадь в игре садишься а с человеком разговариваешь?

Насколько я знаю это в движке прописано. Скорей всего идет проверка по horserace. К тому же в самой horserace, если не ошибаюсь не стоит галка - allow pc dialogue. Можно конечно попроболвать сделать отдельную рассу и перекинуть на нее всех лошадей, но конфликтов не избежать.

Dsion  Offline  Сообщение №2247 написано: 6 ноября 2016, 22:51



Можно было бы попробовать вызвать на какой-то коняке AllowPCDialogue(True) и посмотреть, что будет...

Lexo  Offline  Сообщение №2248 написано: 7 ноября 2016, 17:34


Всепознающий мододел


223
Народ, а есть в скриптах функция, которая отвечает за то, что бы спутник был в группе? И ещё, что бы определить расстояние до спутника...

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

Есть несколько модов на таких спутников, но... там ТАКАЯ куча скриптов и они такие огромные, что запутаться легко...

"Всё слишком относительно, что бы утверждать столь однозначно..." ©

Multigone  Offline  Сообщение №2249 написано: 7 ноября 2016, 19:58



816
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  Offline  Сообщение №2250 написано: 7 ноября 2016, 23:50 | Отредактировано: Aksyonov - 8 ноября 2016, 00:01



937
Цитата Lexo

Есть несколько модов на таких спутников, но... там ТАКАЯ куча скриптов и они такие огромные, что запутаться легко...


Я делал в одном из своих модов помню реализовывал лечение магией тоже в определенном расстоянии
через радиус в спеле без каких либо скриптов, указываете условие просто в спеле Condition Functions и
всё работает, указать нужно несколько условий, а каст заклинания делаем постоянным, так и получается
что работать оно будет только когда компаньон допустим рядом с главным героем, можно попробовать в общем.

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





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