Модератор форума: 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? Пиши не в ЛС, а в эту тему.
lolososo  Offline  Сообщение №1411 написано: 21 февраля 2015, 10:53



36
Цитата valambar

чтобы замерз медленно, но насмерть

Ото ты жесткий  :D

valambar  Offline  Сообщение №1412 написано: 22 февраля 2015, 16:20 | Отредактировано: valambar - 22 февраля 2015, 16:20



513
В общем, двигаемся дальше. Команда setlocklevel может только УСТАНОВИТЬ уровень сложности замка, но там 0 - это уровень "новичок", я пробовал даже ставить -1 - все равно"новичок", а мне надо именно ОТКРЫТЬ замок скриптом, а команда unlock не компилируется  facepalm Ну и что теперь делать бедному крестьянину?

Это с какого же бодуна разработчики Папируса так нагадили бедным модмейкерам?  :(

В общем, у кого есть решение, как скриптом открываются замки?

Multigone  Offline  Сообщение №1413 написано: 22 февраля 2015, 16:39



816
valambar

Код
Lock(bool abLock = true, bool abAsOwner = false) native


Например,
Код
MyRef.Lock(false)

valambar  Offline  Сообщение №1414 написано: 22 февраля 2015, 18:17



513
Так, сейчас попробую...

Добавлено (22 Февраля 2015, 19:48)
---------------------------------------------
Благодарствую - работает!

Добавлено (22 Февраля 2015, 19:49)
---------------------------------------------
Сейас будем накладывать на другие варианты заморозку  :D

Добавлено (22 Февраля 2015, 21:17)
---------------------------------------------
Так, опять загвоздка. Создаю спелл "способность" с постоянным морозным эффектом "на себя". Указываю его в пропертях скрипта. Пишу Game.Getplayer().AddSpell(FrostEmergency). Скрипт компилируется. В игре - идет указание, что "Аварийная заморозка" добавлено игроку. Но у игрока никаких новых эффектов не появляется! 

Что-то опять не так...


Multigone  Offline  Сообщение №1415 написано: 22 февраля 2015, 19:17



816
valambar, если в маг. эффекте Ability установлен флаг "Hide in UI", в меню "Активные маг. эффекты" он отображаться не будет.

valambar  Offline  Сообщение №1416 написано: 22 февраля 2015, 19:22 | Отредактировано: valambar - 22 февраля 2015, 19:36



513
Цитата Multigone

valambar, если в маг. эффекте Ability установлен флаг "Hide in UI", в меню "Активные маг. эффекты" он отображаться не будет.


Но игрок и не замораживается по факту.

Может, есть примеры готового скрипта с наложением на игрока какой-нибудь смертельной гадости?

Кстати, проверил - нет такого флажка.

Увеличил мощность эффекта - игрок послушно сдох  :D

Все, строим локацию дальше. Первый активатор в треугольных числах заставил разбираться, следующий заставит игрока решать квадратные уравнения  lol А за неправильный ответ будем убивать его электрическим разрядом  :D

Multigone  Offline  Сообщение №1417 написано: 22 февраля 2015, 19:25 | Отредактировано: Multigone - 22 февраля 2015, 19:27



816
valambar, это проблема Ability, а не скрипта. Если в игре возникает уведомление в верхнем углу, значит, игрок получает это Ability.

Цитата valambar

смертельной гадости


Game.GetPlayer().Kill()

valambar  Offline  Сообщение №1418 написано: 22 февраля 2015, 19:40



513
Цитата Multigone

valambar, это проблема Ability, а не скрипта. Если в игре возникает уведомление в верхнем углу, значит, игрок получает это Ability.

Спасибо, все отлично - игрок при неправильном ответе дохнет за милую душу...

Holtof55  Offline  Сообщение №1419 написано: 23 февраля 2015, 16:18



49
Видимо не в той теме задавал вопросы, и ответа не получил вопросы такие:

1. Хочу добавить в скрипт команду на старт музыки, музыка сделана(движок ее воспроизводит), какую команду надо добавить, при старте анимации или сцены, и акую команду на стоп музыки, после завершения сцены или анимации
2. Нужен код на таймер по которому сценка будет запускаться в определенные часы, скажем в 14, в 18,и в  20 часов, либо каждый час или полчаса и где этот скрипт в сцене надо разместить

Пока все , большое спасибо всем, кто ответит good
Это уже наверняка все сделано, только надо знать где смотреть :D

Dsion  Offline  Сообщение №1420 написано: 23 февраля 2015, 20:17



Она действительно должна повторяться каждый час? Даже если игрока нету на континенте?

Holtof55  Offline  Сообщение №1421 написано: 24 февраля 2015, 23:03 | Отредактировано: Holtof55 - 24 февраля 2015, 23:04



49
Привет, всем! Вот соорудил скрипт который конечно же не хочет компилироваться(я только учусь скриптонаписанию unsure )

Код
Scriptname _BG001001A extends Quest

;BEGIN FRAGMENT Fragment_0
Function Fragment_0()
;BEGIN CODE
if(getstage.aaHiBrother == 160)
aaFleytaSvena.enable()
endif
elseif(getstage.aaHiBrother < 160)
aaFleytaSvena.disable()
endif
;END CODE
EndFunction
;END FRAGMENT

MiscObject Property aaFleytaSvena Auto

Quest Property aaHiBrother Auto

Задача очень простая, объект должен быть скрыт, до 160 стадии квеста
Кто-то может поправить мою ошибку?
вот чего кит пишет:

Код
[/code]Starting 1 compile threads for 1 files...
Compiling "_BG001001A"...
C:\Program Files (x86)\Steam\steamapps\common\skyrim\Data\Scripts\Source\temp\_BG001001A.psc(9,3): mismatched input 'elseif' expecting ENDFUNCTION
No output generated for _BG001001A, compilation failed.

Batch compile of 1 files finished. 0 succeeded, 1 failed.
Failed on _BG001001A


Multigone  Offline  Сообщение №1422 написано: 24 февраля 2015, 23:37 | Отредактировано: Multigone - 24 февраля 2015, 23:37



816
Holtof55,


Код
if aaHiBrother.getstage() == 160
     aaFleytaSvena.enable()
elseif aaHiBrother.getstage() < 160
     aaFleytaSvena.disable()
endif

Или так:


Код
IF aaHiBrother.GetStage() < 160
     aaFleytaSvena.Disable()
ELSE
     aaFleytaSvena.Enable()
ENDIF

Holtof55  Offline  Сообщение №1423 написано: 25 февраля 2015, 00:28 | Отредактировано: Holtof55 - 25 февраля 2015, 00:29



49
Multigone, Спасибо! Забрал, пошел проверять в игре!

Не не компилируется....может функция объявлена не правильно? closedeyes

valambar  Offline  Сообщение №1424 написано: 25 февраля 2015, 11:01



513
Как правильно прописывать функцию modactorvalue (конкретно - я хочу после скриптового действия изменить навык взлома)?

lolososo  Offline  Сообщение №1425 написано: 25 февраля 2015, 11:16 | Отредактировано: lolososo - 25 февраля 2015, 11:17



36
Цитата valambar

Как правильно прописывать функцию modactorvalue (конкретно - я хочу после скриптового действия изменить навык взлома)?



Код
Game.GetPlayer().ModActorValue("Lockpicking", число)

число - насколько увеличить взлом

slastik  Offline  Сообщение №1426 написано: 25 февраля 2015, 13:00


Жаждущий


209
Прошу помощи знатоков :)

Взялся за скрипт для часов. Имеется 24-часовой циферблат и 24 стрелки, которые изначально отключены. Смысл в том, что часы каждый час должны дисейблить предыдущую стрелку и энейблить следующую (типа стрелка переместилась на час). За основу взял скрипт из вики для автоматического включения/выключения света. Разобрался насколько смог и за два часа состряпал свой вариант. При компиляции выдает ошибки. Привожу сам скрипт:



Насколько я понимаю, через Event OnInit() часы при загрузке получают стартовую позицию (state) соответствующую текущему игровому времени. Эта позиция включает нужную стрелку и задает ожидание до срабатывания следующей позиции. Затем ситуация повторяется и идет по циклу, и в идеале каждый час стрелка перемещается на одно деление. Но компилятор выдает ошибку:

required (...)+ loop did not match anything at input 'auto'
mismatched input '\\r\\n' expecting STATE

Как я понял он ругается именно на позиции. Что у меня прописано неправильно?

- Что это за горы стоят?
- А, это орки бегут!
Holtof55  Offline  Сообщение №1427 написано: 25 февраля 2015, 14:36 | Отредактировано: Holtof55 - 25 февраля 2015, 14:42



49
Может кто подскажет, по моему сценарию надо нпс пригласить с собой, то есть после диалога нпс должен идти за игроком, после другого диалога- вернутся к своим делам..Какую функцию надо прописать в диалоге? (не повредив при этом работе AFT :)

lolososo  Offline  Сообщение №1428 написано: 25 февраля 2015, 14:42 | Отредактировано: lolososo - 25 февраля 2015, 14:42



36
Цитата slastik

Взялся за скрипт для часов. Имеется 24-часовой циферблат и 24 стрелки, которые изначально отключены. Смысл в том, что часы каждый час должны дисейблить предыдущую стрелку и энейблить следующую (типа стрелка переместилась на час). За основу взял скрипт из вики для автоматического включения/выключения света. Разобрался насколько смог и за два часа состряпал свой вариант. При компиляции выдает ошибки. Привожу сам скрипт:

 slastik, Массивы, не не слышал  :D

Holtof55  Offline  Сообщение №1429 написано: 25 февраля 2015, 15:10 | Отредактировано: Holtof55 - 25 февраля 2015, 15:16



49
lolososo, Ok, пакет создал, а как его добавлять и удалять при разговоре-то :( (я еще только учусь, не кидайтесь тапками)
я так понимаю, что в диалоге надо (в окне папируса) надо вписать чтоюто типо
Actor.AddPacgageIDпакета() -так?

Dsion  Offline  Сообщение №1430 написано: 25 февраля 2015, 15:26



slastik, про массивы Вам верно сказали.. Разберитесь как-нибудь под настроение.
А если вернуться к теме именно с часами. То там и вовсе не обязательно иметь 24 стрелки. В скриптах есть команды для перемещения и поворота объектов. Можно даже чтоб это делалось плавно. Часы даже с двумя стрелками и плавным их движением - не проблема...

lolososo  Offline  Сообщение №1431 написано: 25 февраля 2015, 16:19 | Отредактировано: lolososo - 25 февраля 2015, 16:21



36
Цитата Dsion

slastik, про массивы Вам верно сказали.. Разберитесь как-нибудь под настроение. А если вернуться к теме именно с часами. То там и вовсе не обязательно иметь 24 стрелки. В скриптах есть команды для перемещения и поворота объектов. Можно даже чтоб это делалось плавно. Часы даже с двумя стрелками и плавным их движением - не проблема...

Просто slastik`y нужно подучить папирус и все будет ок, я говорю про все функции и события ok

@perture  Offline  Сообщение №1432 написано: 25 февраля 2015, 16:26


$cience innov@tor


Цитата Dsion

В скриптах есть команды для перемещения и поворота объектов. Можно даже чтоб это делалось плавно.


Такие часы будут пространственно зависимы во первых, и трудоемки в настройке углов поворота стрелок во вторых. К тому же состоять должны из нескольких объектов и для каждой стрелки будет нужен свой скрипт. Если делать интерактивные часы, то ИМХО путем создания анимированной модели.

"Не спорьте с идиотами! Вы опуститесь до их уровня, а там они вас задавят своим опытом!" ©
Dsion  Offline  Сообщение №1433 написано: 25 февраля 2015, 16:51 | Отредактировано: Dsion - 25 февраля 2015, 16:52



Если есть возможность сделать всё прямо в nif файле, то это, конечно, намного лучше. Спору нет.
Но в защиту скриптовых часов тоже скажу слово: все названные @perture недостатки - не правда. Объектов действительно будет несколько, но скрипт только один, не сложный и работающий при любом размещение часов в пространстве.

slastik  Offline  Сообщение №1434 написано: 25 февраля 2015, 17:02


Жаждущий


209
Dsionlolososo@perture, я не могу пока похвастаться глубокими знаниями в скриптописании, учусь сам на собственных ошибках. Нашел способ, который, как показалось, смогу осилить. Анимированную модель я точно не создам, как сделать плавно движущиеся стрелки не знаю, о массивах действительно не слышал. Я думал, люди здесь помогают друг другу, а не повышают свой уровень самооценки, глядя на других сверху вниз с чувством собственного превосходства. Всего-лишь хотел, чтобы мне помогли найти ошибку. Простите, я наверно ошибся темой.

- Что это за горы стоят?
- А, это орки бегут!
valambar  Offline  Сообщение №1435 написано: 25 февраля 2015, 17:12 | Отредактировано: valambar - 25 февраля 2015, 17:23



513
Как вернуть состояние скрипта к начальному? Активатор выдает мессажбокс с несколькими вариантами, в нескольких прописан переход к следующему состоянию, а в одном по идее должен быть возврат в начало. Начало у меня Auto State Begin, выбор осуществляется в состоянии State Result, а конечное состояние State After. Так вот, GotoState "After" скрипт спокойно компилирует, а на GotoState "Begin" компилировать отказывается.

Какие еще варианты обнуления состояния есть?

Dsion  Offline  Сообщение №1436 написано: 25 февраля 2015, 17:14



Мы пытались вежливо и ненавязчиво направить тебя в нужном направлении. Потому что скрипт в текущем виде - одна большая ошибка.
Если разберешься с массивами или FormList, сможешь сократить его в 20 раз. Нам не стоило об этом говорить?

valambar  Offline  Сообщение №1437 написано: 25 февраля 2015, 17:22 | Отредактировано: valambar - 25 февраля 2015, 17:26



513
Цитата slastik

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



Ну не все так просто - я вот тоже не умею работать с массивами, а те, кто умеет - не всегда в состоянии объяснить  ;) В руководствах тоже много воды и тумана - ничего подобного OSFM (очень хорошая энциклопедия по скриптовому языку Обливиона) для Папируса я пока не видел.
Так что пока у меня выход один - учиться делать ОЧЕНЬ простые скрипты, чтобы они работали. А потом дойти и до сложностей.

Кстати, движение стрелки можно прописать и без массива - командой поворота, повторяющейся через заданное количество секунд. Сам не знаю, как это сделать, но это должно быть типа рекурсивной команды "градусная мера стрелки = градусная мера стрелки + 6 градусов". А задержку прописать выбором интервала, допустим, в одну игровую минуту.  Узнай, как это прописывается в Папирусе при помощи команд и переменных, и не надо будет никаких массивов. И модель не анимированная будет, а три статические модели - один статик циферблат и два активатора стрелки, на которые и будешь вешать скрипты с разной скоростью попорота. Я объясняю это не как знающий Папирус, а чисто умозрительно, но думаю, здравый смысл в этом есть.

lolososo  Offline  Сообщение №1438 написано: 25 февраля 2015, 18:05 | Отредактировано: lolososo - 25 февраля 2015, 18:07



36
Только вот стрелка то должна вращаться вокруг своей оси, да?

Вот функции которые помогут вращать стрелку
TranslateTo
SetPosition
SplineTranslateTo

Добавлено (25 Февраля 2015, 21:05)
---------------------------------------------
Цитата slastik

Я думал, люди здесь помогают друг другу, а не повышают свой уровень самооценки,

Все верно, мы помогаем людям и направляем их в правильное русло.

Вот почитай про массивы: [url=http://www.creationkit.com/Arrays_(Papyrus)]Arrays[/url]

slastik  Offline  Сообщение №1439 написано: 25 февраля 2015, 18:09 | Отредактировано: slastik - 25 февраля 2015, 18:15


Жаждущий


209
Цитата Dsion

Потому что скрипт в текущем виде - одна большая ошибка.

Спасибо за помощь всем, кто отозвался, но смог разобраться сам. Тело скрипта полностью рабочее, просто я неправильно прописал свойства на внешние объекты. Вместо ObjectReference MyObject auto нужно было всего лишь указать ObjectReference Property MyObject auto. После этих исправлений скрипт прекрасно скомпилировался и работает. Пусть без массивов и всего с одной стрелкой, но зато звук кукушки добавить получилось :)

- Что это за горы стоят?
- А, это орки бегут!
Dsion  Offline  Сообщение №1440 написано: 25 февраля 2015, 19:44



slastik, вот еще вариант:


Код
Scriptname SionChestScript extends ObjectReference

;================================================================================

Event OnLoad()
     RegisterForSingleUpdateGameTime(0.0)
EndEvent

;================================================================================

Event OnUpdateGameTime()

     If (!Is3DLoaded())
         Return
     EndIf

     Float AngleZ = Math.Floor(Utility.GetCurrentGameTime() * 720) % 360
     TranslateTo(X, Y, Z, GetAngleX(), GetAngleY(), AngleZ, 1.0, 360.0)

     RegisterForSingleUpdateGameTime(0.05)
EndEvent

;================================================================================

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





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