Модератор форума: 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? Пиши не в ЛС, а в эту тему.
m4mk203  Offline  Сообщение №2551 написано: 7 ноября 2017, 20:55



29
Всем доброго времени суток.

Назрела задача реализовать такую фишку: ограбление ГГ при поражении в бою.

Конкретнее: если во время боя здоровье ГГ падает ниже отметки 10% то бой прекращается, гг вырубается и его шмот отбирает тот НПС, хит которого был последним.

Не могу понять каким способом отловить момент падения здоровья ниже заданной планки? За какие события цепляться и на что их вешать? ОнХит не универсальный вариант ибо не учитывает урона от магов (вроде бы).

Dsion  Offline  Сообщение №2552 написано: 7 ноября 2017, 21:00



m4mk203, OnHit срабатывает и от магии тоже. Больше ничего и нету. Разве что каждую секунду проверять ХП. А не хочешь сделать игрока неубиваемым? Тогда можно будет попробовать подцепиться к событию OnEnterBleedout()

m4mk203  Offline  Сообщение №2553 написано: 8 ноября 2017, 17:27 | Отредактировано: m4mk203 - 8 ноября 2017, 17:27



29
Dsion, неубиваемым? Да. Это вариант. Как пилить в таком случае?

Все, про OnBleedOut понял. Дальше знаю что делать.

Добавлено (08 Ноября 2017, 20:27)
---------------------------------------------
Как в скрипте получить список референсов активных в данный момент фоловеров ГГ ?

Суть: ГГ проиграл бой = фолловеры разбежались.

Dsion  Offline  Сообщение №2554 написано: 8 ноября 2017, 20:58



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

m4mk203  Offline  Сообщение №2555 написано: 9 ноября 2017, 00:50 | Отредактировано: m4mk203 - 9 ноября 2017, 01:01



29
Dsion, ну... А если их (нпс) отсканить по радиусу вокруг ГГ на свойство isTeammate?  Какимнить скриптом с 20-ю заранее вбитыми пустыми алиасами и эти самые алиасы заполнить.

Цитата Dsion

А что будет, если игрока победят с твоим модом?

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

Lexo  Offline  Сообщение №2556 написано: 9 ноября 2017, 11:13 | Отредактировано: Lexo - 9 ноября 2017, 11:16


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


223
У меня странный вопрос... делаю скрипт на проверку цены предмета - если цена слишком мала, то она считается неподходящей и возвращается обратно игроку... но проблема - проверка срабатывает неверно: я поставил проверку цены >= 30, а он принимает вещи только 3000+... и то не все... не пойму, что не так... не подскажете, может, эта функция работает иначе?




Никаких фильтров, ничего, вроде бы, нету... что не так?

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

Multigone  Offline  Сообщение №2557 написано: 9 ноября 2017, 15:37



832
Lexo, проблема в переменной akItemReference, которая не передает корректно данные, когда они есть (предмет обладает постоянным референсом / находится в алиасе / референс создан движком при крафте). Еще, GetGoldValue() возвращает только стоимость базового предмета.


Код
IF akBaseItem.GetGoldValue() >= Price

Lexo  Offline  Сообщение №2558 написано: 13 ноября 2017, 06:12


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


223
вон оно что... спасибо!

Добавлено (13 Ноября 2017, 09:12)
---------------------------------------------
m4mk203, по поводу того, что бы спутники разбегались... тебя же, по-идее, должны грабить только вне города, правильно? В городе либо стражники тебя в тюрягу ведут, либо защищают от нападающих и никто тебя не выкинет за город... можно сделать проверку IsHostileToActor, т.е. любой, кто тебе не враг, будет бежать во время твоего поражения...


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

m4mk203  Offline  Сообщение №2559 написано: 15 ноября 2017, 14:49



29
Lexo, да, логика правильная, но есть нюансы: мне нужен список референсов текущих фоловеров, находящихся рядом с игроком, по ряду причин:

1. Не все активные фоловеры могут быть со мной в этот момент. Может я некоторых дома оставил.
2. Их всех при поражении гг нужно вывести из боя иначе они будут продолжать рубилово (вроде бы)
3. Часть из них будет уходить в момент поражения от гг (аналог освобождения фоловера через диалог), а часть будет оставаться. По вероятностной схеме.
4. Ну и тех, кто остался с гг тоже должны бы грабануть.

Так что референсы нужны однозначно. Вешать на ГГ заклинание-плащ с детектом таргетов на хостайл тиммейт пока единственное, что придумывается.

Еще один вопрос (меня это поставило в тупик): а есть ли способ определить на уровне скрипта на алиасе игрока момент, когда ГГ уходит в сник или выходит из сника? Имеено как событие, а не маркер isSneaking.

Dsion  Offline  Сообщение №2560 написано: 15 ноября 2017, 17:40



m4mk203, ну получишь ты референсы и что дальше? Как ты их "отпустишь"? Фолловеры управляются пакетами на квестах. Ванильного спутника или наемника отпустить - запросто. Серану - тоже. Но если установлены какие-то моды, но хрен ты им чо сделаешь.

m4mk203  Offline  Сообщение №2561 написано: 15 ноября 2017, 18:42 | Отредактировано: m4mk203 - 15 ноября 2017, 19:24



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

Так стоп... А в чем пробьема отпустить фоловера? Есть же строка диалога на отпускание. Провернуть по актору тотже кусок скрипта да ыоловер и отпущен. И на сколько я помню там идет жонглирование фракциями, а не пакетами. Имеется в виду FollowerDialog

Lexo  Offline  Сообщение №2562 написано: 17 ноября 2017, 16:39


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


223
Цитата m4mk203

есть ли способ определить на уровне скрипта на алиасе игрока момент, когда ГГ уходит в сник или выходит из сника


Event OnAnimationEvent

Анимационные ивенты - раздел Movement & World Interaction Events

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

Vicson  Offline  Сообщение №2563 написано: 2 декабря 2017, 20:14



10
Всем здрасте! Есть скрипт, который при активации контейнера выводит Message, в котором 3 кнопки, первая - просто открыть контейнер, вторая - подобрать контейнер, третья - отмена, которая тоже приводит к простому открыванию контейнера. Вооот, ближе к телу, хочу добавить 4 кнопку, "Пометка", которая при активации вешает плавающий маркер над контейнером, а при повторной активации этот маркер убирала. Но ни как не могу понять как это сделать, это конечно из-за того что я жесткий нуб в этих вопросах, но все же, может кто подскажет?

Dsion  Offline  Сообщение №2564 написано: 3 декабря 2017, 01:48



Князь_Далик, скорее всего, нужен квест, в квесте Objective с маркером, а потом включать и отключать его через
https://www.creationkit.com/index.p....-_Quest

Lexo  Offline  Сообщение №2565 написано: 4 декабря 2017, 16:32 | Отредактировано: Lexo - 6 декабря 2017, 07:42


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


223
К сожалению без вас, Гуру-скриптеры, я никак... очередной вопрос:

Можно добавить новое зачарование прямиком в изученные? Хочу создать зачарования, которые нигде в мире нельзя было найти... если нет, то придётся просто добавлять новые зачарованные предметы в возможность создания...

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

refusepit  Offline  Сообщение №2566 написано: 6 декабря 2017, 19:57 | Отредактировано: refusepit - 6 декабря 2017, 20:00



650
Ребят, нужна помощь. :(
Теоретически - простая штука: перенос референса (не актера) с помощь moveTo. В одной локации стоит стул, в другой ГГ в режме мастерской кладет на пол коврик - стул должен перенестись на этот коврик.

Я пишу коврику вот так:


Код
Event OnWorkshopObjectPlaced(ObjectReference akReference)

    objStul.Disable()
    objStul.moveTo(akReference, abMatchRotation = true)    ; на каком-то англоязычном форуме советовали такую форму при проблемах
    objStul.Enable()

EndEvent

Ну не работает же! Консолью прекрасно переносится, скриптом - нет.
Думал, дело в unloaded cell, дал референсу стула имя, пусть будет "персистент" (потом еще скрипт-заглушку на него повесил - чтобы еще персистентнее был) - ни фига. Более того, референс уникального актора (который, вроде, стопудовый персистент) тоже не переносится (это я уже пробовал разное-всякое). Что за беда с этим moveTo? Спасайт-помогайт, а?

ЗЫ. Само событие срабатывает: я в него msg.show() запихал - показывает.

Lexo  Offline  Сообщение №2567 написано: 7 декабря 2017, 06:31


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


223
refusepit, ты где вообще такой ивент нашёл?

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

Dsion  Offline  Сообщение №2568 написано: 7 декабря 2017, 06:41



Lexo, в фоллауте 4 :)

Добавлено (07 Декабря 2017, 09:41)
---------------------------------------------
refusepit, не знаю, как в фоллауте, но в скайриме нельзя функцией moveto перемещать статические объекты, созданные в редакторе. Можно перемещать те, что были созданы уже во время игры функицей placeatme и у которых id начинается с ff. Если твой стул в редакторе поставлен, можешь поробовать создать перемещаемого клона.


refusepit  Offline  Сообщение №2569 написано: 7 декабря 2017, 08:52



650
Lexo, это Фоллаут 4. Классный ивент - срабатывает, когда в режиме мастерской ты установил какой-то объект (нажал "Е"). Есть еще ивент на "я таскаю объект туда-сюда, выбирая, куда поставить" и "я уничтожил уже установленный объект потому что люблю разрушееееение". Удобные ивенты.

Dsion, спасибо за ответ. Беда в том, что я тоже не знаю, как в Фоллауте. :( За прошедший год в русскоязычном интернете инфы кот наплакал, английского я не знаю, но, похоже, там тоже не так много.
В принципе, интуитивно я полагаю, что ты прав. Меня смущает только, что через консоль этот moveTo работает на ура. Не знаешь, в Скайриме тоже через консоль работает? Это как бы контрольный замер на схожесть ситуации. :)

Dsion  Offline  Сообщение №2570 написано: 7 декабря 2017, 09:29 | Отредактировано: Dsion - 7 декабря 2017, 09:32



refusepit, не, в Скайриме в консоли тоже не работает, если id не c FF начинается.
Попробуй еще вывести id форм перед moveto. В скайример это делается как-то так:
Debug.MessageBox(objStul);
Debug.MessageBox(akReference);
Вдруг ты забыл заполнить objStul и там NULL.

Ну и без disable|enable можно попробовать.
Должно работать... Ошибка явно в какой-то мелочи.

refusepit  Offline  Сообщение №2571 написано: 7 декабря 2017, 14:14



650
Dsion, попробую. Я, правда, уже все поудалял, смирившись с поражением, но попробую написать заново.
Мне кажется, тут глюк какой-то самого движка - ну  никаким мелочам тут появляться негде, "программа"-то по сути из одной строки: moveTo(стул), все остальное - костыли для "вдруг так получится".
В англоязычном инете тоже есть такая проблема, но решения, кажется, не нашли общего - или я не понял.
Кто-то советует делать так:

moveTo(x)
Utility.Wait(2.0)
moveTo(x)

Типа после первого moveTo ячейка прогрузится (2 сек даем ей на это) и вторая moveTo сработает. У меня не работает все равно... В общем, спасибо за участие, буду пробовать - действительно, надо убедиться, что он этот стул вообще видит.

Lexo  Offline  Сообщение №2572 написано: 7 декабря 2017, 16:40


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


223
Я-то понял, что это из фоллаута... просто мне интересно, почему это написано в теме про Скайрим?

А вообще, у меня вопрос всё тот же - можно как-то "выучить" новое зачарование? Т.е. предмета такого не существует, но игроку добавляет новое зачарование, которое он может накладывать...

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

Multigone  Offline  Сообщение №2573 написано: 7 декабря 2017, 19:28



832
Lexo, может, это (Form):


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

Vicson  Offline  Сообщение №2574 написано: 8 декабря 2017, 00:30



10
Ну а мне кто-то сможет помочь? Папирус мой самый жуткий кошмар...


Уважаемый Dsion подсказал, что нужен квест, в квесте Objective с маркером, а далее уже при помощи SetObjectiveDisplayed делать вкл/выкл. Но я на столько туп в квесто-папирусной теме, что просто не смог понять как это всё построить и связать друг с другом. Пожалуйста, кто-нибудь, помогите...

Вот, кстати, этот мод. В нем уже есть квест, в котором, как я понял прописан Alias с фракцией игрока для создаваемых контейнеров (наверно). Можно ли к этому квесту прикрутить возможность создания маркера?

Dsion  Offline  Сообщение №2575 написано: 8 декабря 2017, 10:28 | Отредактировано: Dsion - 8 декабря 2017, 10:30



Князь_Далик,
1. Создаешь новый квест. Прописываешь ему ID и имя. Сохраняешь.
2. Открываешь снова квест, переходишь во вкладку Quest Aliases.
3. Создаешь новый Reference Alias. Прописываешь имя. Fill type изменяешь на Specific Reference, ставишь галочку Optional. Сохраняешь.
4. Переходишь во вкладку Quest Objectives. Создаешь новую Objective. В Target Ref добавляешь свой алиас. Запомнинаешь Index Objective. Сохраняешь.

5. В любом другом скрипте в любом другом месте создаешь Property типа Quest. Заполняешь своим квестом. Создаешь проперти типа ReferenceAlias заполняешь своим алиасом из своего квеста.
6. В любом месте этого скрипта пишешь:
myAlias.ForceRefTo(myTarget);
myQuest.SetObjectiveDisplayed(0, true);
Заменив myAlias и myQuest на имена, которые ты дал пропертям. myTarget - на цель (твой сундук). А ноль на id обджективы.

Если сундук есть и может быть только один, то можно сразу в алиасе указать конкретный объект. Тогда проперти алиаса и ForceRefTo не нужны.

Vicson  Offline  Сообщение №2576 написано: 9 декабря 2017, 14:33



10
Ну конечно же я не мог так просто отстать... :)
Сейчас маркер может отображаться только над одним контейнером. Как сделать так что бы можно было вешать маркер над несколькими контейнерами (Н-р: 100 контейнеров-100 маркеров)?

И еще вопрос, как все-таки реализовать систему "вкл-выкл маркер". Я написал так, но, естественно, ни чего не работает.



Dsion  Offline  Сообщение №2577 написано: 9 декабря 2017, 14:54 | Отредактировано: Multigone - 22 апреля 2020, 13:20



Князь_Далик, лично мне чо-то не приходит в голову способов, которые бы не включали создание 100 алиасов...

Можно вот так попробовать, но я сейчас не могу проверить, работает ли:
Код
MMarker.SetObjectiveDisplayed(0, !MMarker.IsObjectiveDisplayed(0));

Ritimlaj  Offline  Сообщение №2578 написано: 11 декабря 2017, 15:05 | Отредактировано: Multigone - 22 апреля 2020, 13:02



1
Добрый вечер. Пытаюсь скомпилировать скрипт на получение предмета в виде LeveledItem при завершении квеста и компилятор выдает ошибку:
Код
Starting 1 compile threads for 1 files...Compiling "F01FalmerTamer"...F:\Games\Steam\steamapps\common\skyrim\Data\Scripts\Source\F01FTamerQuestScript.psc(11,9): missing ID at '('
No output generated for F01FalmerTamer, compilation failed.Batch compile of 1 files finished. 0 succeeded, 1 failed.
Failed on F01FalmerTamer


Скрипт:
Код
Scriptname F01FTamerQuestScript extends Quest

ConditionalLeveledItem Property p1FalmerFWolf  Auto
LeveledItem Property p1FalmerFSpider  Auto
LeveledItem Property p1FalmerFCorus  Auto  
LeveledItem Property p1FalmerFCorusZhnets  Auto  
LeveledItem Property p1FalmerFTroll  Auto Quest Property p01Falmer1F  Auto   
GlobalVariable Property pF01FalmerTamerG  

AutoFunction ()
Debug.Trace("pF01FalmerTamerG: " + pF01FalmerTamerG)  
if pF01FalmerTamerG.GetValue() > 0     
if pF01FalmerTamerG.GetValue() == 1       
   Game.GetPlayer().OnStage(p01Falmer1F,6)      
   Game.GetPlayer().AddItem(p1FalmerFWolf,1)      
   pF01FalmerTamerG.SetValue(0)    
  elseif pF01FalmerTamerG.GetValue() == 2       
   Game.GetPlayer().OnStage(p01Falmer1F,12)     
   Game.GetPlayer().AddItem(p1FalmerFSpider,1)       
    pF01FalmerTamerG.SetValue(0)   
  elseif pF01FalmerTamerG.GetValue() ==3    
    Game.GetPlayer().OnStage(p01Falmer1F,18)      
    Game.GetPlayer().AddItem(p1FalmerFCorus,1)      
    pF01FalmerTamerG.SetValue(0)   
   elseif pF01FalmerTamerG.GetValue() == 4   
     Game.GetPlayer().OnStage(p01Falmer1F,24)       
     Game.GetPlayer().AddItem(p1FalmerFCorusZhnets,1)    
     pF01FalmerTamerG.SetValue(0)   
   elseif pF01FalmerTamerG.GetValue() == 5       
     Game.GetPlayer().OnStage(p01Falmer1F,30)    
     Game.GetPlayer().AddItem(p1FalmerFTroll,1)    
     pF01FalmerTamerG.SetValue(0)   
   endif  
   endif

   endFunction


делаю скрипт на основе с квеста Морвена Страуда из Каирна Душ, только у меня награда из LItem дается на определенных уровнях квеста. В квесте Морвена Страуда в настройках скрипта Global Variable, а в моем случае вообще нужен Global Variable?
https://cdn1.savepice.ru/uploads....ull.jpg

Multigone  Offline  Сообщение №2579 написано: 11 декабря 2017, 18:08



832
Ritimlaj, я не понимаю, о чем речь. На всякий случай:

- если глобальная используется в коде - нужна
- если глобальная не используется в коде - не нужна

Что за OnStage()? Так вообще можно? Функция применяется к Actor, но в ванильных ее нет, как и в SKSE. Хотя, может в SSE что-то намутили нового...

Vicson  Offline  Сообщение №2580 написано: 11 декабря 2017, 20:35



10
Код
int button = chestMess.Show()
        
        if button == 0

            ;Open

            Self.Activate(Game.GetPlayer(), true)

        elseif button == 1

            ;Disassemble

            Self.removeAllItems(Game.GetPlayer(), true)
            Game.GetPlayer().AddItem(chestparts)
            Self.Delete()

        elseif button == 2

            ;Пометка
            
            int MMarkBut = MMarkMess.Show()
                
                if MMarkBut == 0
                    
                    ;Отметить на карте
                    
                    if MMarker.IsObjectiveDisplayed(0) == false
               
                        MMarkerAlias.ForceRefTo(self)
                        MMarker.SetObjectiveDisplayed(0, abDisplayed = true, abForce = true)
                        
                    elseif MMarker.IsObjectiveDisplayed(5) == false
                    
                        MMarkAl2.ForceRefTo(self)
                        MMarker.SetObjectiveDisplayed(5, abDisplayed = true, abForce = true)
                        
                    endif
                    
                elseif MMarkBut == 1
                    
                    ;Стереть пометку
                    
                    if MMarker.IsObjectiveDisplayed(0) == true
               
                        MMarker.SetObjectiveDisplayed(0, abDisplayed = false)
                        
                    elseif MMarker.IsObjectiveDisplayed(5) == true
                    
                        MMarker.SetObjectiveDisplayed(5, abDisplayed = false)
                        
                    endif
                    
                else
                
                    ;Обратно
                    
                    button = chestMess.Show()
                    
                endif

        else

            ;Nothing

        endif
И так, намутил систему "вкл/выкл маркер", за что низкий поклон Dsion. Но теперь проблема в другом :) И их две как обычно.

1. При выборе пункта "стереть маркер" отключаются все активные маркеры, ну это и из кода видно, как бы так замутить, что бы отключался только тот маркер который нужен? Придется доп меседж боксы мутить под каждый маркер или можно что-то лучше сделать?

2. При нажатии кнопки "отмена" в окне "пометка" открывается меседж бокс, но он не активен. Можно ли как-то сделать так, что бы при нажатии "отмены" происходил возврат к меню?

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





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