Модератор форума: 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? Пиши не в ЛС, а в эту тему.
Dsion  Offline  Сообщение №1381 написано: 2 февраля 2015, 11:28



А в чем проблема-то? На предмете, который лежит в инвентаре, не срабатывает OnUpdate()? Так оно и не должно. У него же ID нету.

Myprism  Offline  Сообщение №1382 написано: 2 февраля 2015, 12:35


Физик


Dsion, а у кольца на пальце? Когда оно приобретает ID?

Добавлено (02 Февраля 2015, 15:35)
---------------------------------------------
Я уже говорил, что при обновлении мода в таком же кольце, но сохранённом в старом сейве не работает новый скрипт. Т.е. в новом и в старом кольце один и тот же скрипт работает по-разному. Это разные кольца. Различаться они могут только своим ID.


Dsion  Offline  Сообщение №1383 написано: 2 февраля 2015, 13:33 | Отредактировано: Dsion - 2 февраля 2015, 13:31



Если на кольце энчант с магическим эффектом и скриптом, то RegisterForSingleUpdate должно работать (для эффекта, не для кольца). А если просто обычное кольцо без дополнительных мер, то у него нету своего ID, пока оно в контейнере. Регистрация для каких-то событий - это только малая часть того, чего с ним нельзя будет сделать...

Добавлено (02 Февраля 2015, 16:33)
---------------------------------------------
На пальце - тоже нету...
Выбросить в мир - появится...
Можно в скрипт на кольце в любом месте добавить Debug.MessageBox(Self), чтоб проверить, есть ли у ниго личное ID.


Myprism  Offline  Сообщение №1384 написано: 2 февраля 2015, 16:42


Физик


Multigone@pertureDsion, большое спасибо!
Сделал как посоветовал @perture: кольцо включает заклинание, а все свои функции я засунул в скрипт магического эффекта. Они работают и Update тоже работает. Это я проверил, просто вставив в его обработчик обратное переодевание и убедился, что оно происходит через 2 секунды :) Скорее всего, теперь и этот Update может быть уже не нужен. Те прежние слетания могли происходить в силу специфики скриптов на кольце. Но всё равно оставлю для надёжности :)

@perture  Offline  Сообщение №1385 написано: 2 февраля 2015, 17:02


$cience innov@tor


Цитата Myprism

Это я проверил, просто вставив в его обработчик обратное переодевание и убедился, что оно происходит через 2 секунды


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

"Не спорьте с идиотами! Вы опуститесь до их уровня, а там они вас задавят своим опытом!" ©
Myprism  Offline  Сообщение №1386 написано: 2 февраля 2015, 17:44


Физик


А это совсем не сложно закопипастить пару строк и наблюдать именно в игре :)

Revil  Offline  Сообщение №1387 написано: 8 февраля 2015, 12:02 | Отредактировано: Revil - 8 февраля 2015, 12:05


Evil Eye


Нид хелп. предупреждаю сразу: понятие о скриптах у меня нулевое, так что объяснять мне что-то и давать советы бесполезно, поэтому прошу добровольца написать мне скрипт (желательно без SKSE, но не принципиально).
Скрипт должен вешаться на контейнер. И вот что делать: все помещенные в контейнер вещи заменять золотым эквивалентом спустя сутки (или двое, или трое неважно).
Буду очень благодарна.  smile2

Dsion  Offline  Сообщение №1388 написано: 8 февраля 2015, 12:39



Я проверил функцию, которая выдает стоимость предмета. Но, к сожалению, она не учитывает даже стоимость зачарования на предмете.
Нужно подумать...

Revil  Offline  Сообщение №1389 написано: 8 февраля 2015, 13:00


Evil Eye


Dsion, В общем-то точность определения цены не так уж и важна, особенно если это вызвает трудности.

Dsion  Offline  Сообщение №1390 написано: 8 февраля 2015, 13:05



Вряд ли Вас устроит точность в +/- 300% :)
Вот, к примеру, эбонитовые перчатки с зачарованием стоят 1000 монет, а функция показывает базовую стоимость перчаток - 275 монет.

Если что-то полезное придет в голову, я обязательно напишу. Ну или кто-то еще.

Revil  Offline  Сообщение №1391 написано: 8 февраля 2015, 13:19 | Отредактировано: Revil - 8 февраля 2015, 13:19


Evil Eye


Цитата Dsion

Вряд ли Вас устроит точность в +/- 300%


В общем-то идея такая:
Складывая в этот сундук лут гг не должен дико багатеть. Если бы он хотел дико багатеть он мог сам сходить и продать, а заодно и прокачать красноречие. Так что погрешность в меньшую сторону приветствуется, правда.
Этот "сундук" будет открываться через диалог с компаньоном. И будет правильно, если вещи будут "перевариваться" с меньшим коэфициентом полезного действия, чем обычно.

Dsion  Offline  Сообщение №1392 написано: 8 февраля 2015, 13:48



Я бы предпочел сделать качественно... Чтоб этот коэффициент задавался вручную, а не оказался таким "как получится"...
Но если ничего не придет в голову и никто другой не возьмется...

Revil  Offline  Сообщение №1393 написано: 8 февраля 2015, 13:55


Evil Eye


Цитата Dsion

Я бы предпочел сделать качественно... Чтоб этот коэффициент задавался вручную, а не оказался таким "как получится"... Но если ничего не придет в голову и никто другой не возьмется...

Ваша воля. А я лучше молча подожду... так от меня точно будет больше пользы.

Dsion  Offline  Сообщение №1394 написано: 8 февраля 2015, 15:34



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

Лично мне недостаток скрипта кажется не очень-то приемлемым, но, если хотите, я сделаю. Это не сложно.

Только уточните:
1. Должны ли 2 суток отсчитываться для каждого предмета отдельно. Или просто всё разом должно продаваться.
2. Какой должен быть коэффициент полезного действия сундука. И должен ли он зависеть от каких-то умений/перков игрока.

Revil  Offline  Сообщение №1395 написано: 8 февраля 2015, 16:10


Evil Eye


Dsion, Нет торговец мне не нужен.. нужен переносной конвератор шмота в деньги)
Уточняю:
1. Не принципиально.
2. 0,7. Нет от умению не зависит.

Dsion  Offline  Сообщение №1396 написано: 8 февраля 2015, 18:57 | Отредактировано: Dsion - 8 февраля 2015, 19:03



Понял... Посмотрим, что получится.

Добавлено (08 Февраля 2015, 21:52)
---------------------------------------------
Сделал пока два простеньких варианта. В обеих нужно заполнить три Property:
Gold001 --> Gold001 (можно Auto-Fill)
Period - это промежуток между продажами лута в игровых часах (например 48.0 - это двое суток) - меньше 0.05 лучше не ставить.
Efficiency - это КПД (например, 0.7 - это 70% от базовой цены предметов)

На всякий случае предупреждаю, что предусмотреть все возможные проблемы сразу бывает сложно даже для маленьких программок. Если что-то не так, пишите. Ну и если появятся новые требования к функционалу.


Код
Scriptname RevilChestScript extends ObjectReference

MiscObject Property Gold001 Auto
Float Property Period Auto
Float Property Efficiency Auto

Int TotalValue = 0
Bool Selling = False

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

Event OnInit()
    Utility.Wait(1.0)
    RegisterForSingleUpdateGameTime(Period)
EndEvent

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

Event OnUpdateGameTime()

    TotalValue = 0

    Selling = True
    RemoveAllItems()
    Utility.Wait(2.0)
    Selling = False

    AddItem(Gold001, TotalValue)

    RegisterForSingleUpdateGameTime(Period)
EndEvent

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

Event OnItemRemoved(Form akBaseItem, Int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer)

    If (!Selling || akDestContainer)
        Return
    EndIf

    If (akBaseItem == Gold001)
        TotalValue = TotalValue + aiItemCount
    Else
        TotalValue = TotalValue + Math.Floor(akBaseItem.GetGoldValue() * Efficiency) * aiItemCount
    EndIf

EndEvent

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



Код
Scriptname RevilChestScript extends ObjectReference

MiscObject Property Gold001 Auto
Float Property Period Auto
Float Property Efficiency Auto

Int TotalValue = 0

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

Event OnInit()
    Utility.Wait(1.0)
    RegisterForSingleUpdateGameTime(Period)
EndEvent

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

Event OnUpdateGameTime()

    Int Temp = TotalValue

    RemoveAllItems()
    Utility.Wait(2.0)
    TotalValue = 0

    AddItem(Gold001, Temp)

    RegisterForSingleUpdateGameTime(Period)
EndEvent

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

Int Function CalculateItemValue(Form akBaseItem)

    Int Value = 0

    If (akBaseItem == Gold001)
        Value = 1
    Else
        Value = Math.Floor(akBaseItem.GetGoldValue() * Efficiency)
    EndIf

    Return Value

EndFunction

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

Event OnItemAdded(Form akBaseItem, Int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer)
    TotalValue = TotalValue + CalculateItemValue(akBaseItem) * aiItemCount
EndEvent

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

Event OnItemRemoved(Form akBaseItem, Int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer)
    TotalValue = TotalValue - CalculateItemValue(akBaseItem) * aiItemCount
EndEvent

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

Revil  Offline  Сообщение №1397 написано: 8 февраля 2015, 19:20


Evil Eye


Dsion, Огромное спасибо! Как опробую отпишусь.

valambar  Offline  Сообщение №1398 написано: 18 февраля 2015, 13:39 | Отредактировано: valambar - 18 февраля 2015, 13:39



513
Помогите найти - где в скриптах модов на альтернативный старт игрока отправляют куда-нибудь случайным образом и как этот фрагмент скрипта изменить, чтобы игрок отправлялся строго в одну указанную локацию.

Пример такого мода:

http://www.nexusmods.com/skyrim/mods/25404/? 

А если кто-то уже поменял, то может, покажете мод - и где это изменено.

Добавлено (18 Февраля 2015, 16:39)
---------------------------------------------
В  в общем, продолжаю разбираться с альтернативными началами. После некоторых советов и поисков создал новый квест, сделал его стартовым и исполняющимся однажды, привесил к нему вот такой скрипт:


Еще я в глобалах нашел переменную MQQuickStart и присвоил ей значение, которое не фигурирует в главном квесте - там от 0 до 4, а я поставил 5. Соответственно и условие выполнения стадии моего квеста поставил тоже значение переменной 5.

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

Что мне еще нужно сделать, чтобы альтернативный старт заработал?

lolososo  Offline  Сообщение №1399 написано: 18 февраля 2015, 13:43 | Отредактировано: lolososo - 18 февраля 2015, 13:44



36
Цитата valambar

Помогите найти - где в скриптах модов на альтернативный старт игрока отправляют куда-нибудь случайным образом и как этот фрагмент скрипта изменить, чтобы игрок отправлялся строго в одну указанную локацию.

Я же писал как сделать старт игрока) и не надо таких замудреностей)

valambar  Offline  Сообщение №1400 написано: 18 февраля 2015, 13:49 | Отредактировано: valambar - 18 февраля 2015, 13:49



513
Цитата lolososo

Я же писал как сделать старт игрока) и не надо таких замудреностей)


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

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



36
Цитата valambar

Если делать так - то начало действительно начинается в выбранной локации, но... игрок не может посмотреться в виде ни от первого, ни от третьего лица, ни посмотреть инвентарь нельзя.


Код
Game.EnablePlayerControls()

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



513
Цитата lolososo

Game.EnablePlayerControls()


Я знаю, только не в консоли же его вводить. Вводить надо в стадию квеста. В общем, есть варианты - быстрые старты нескольких видов уже предусмотрены в игре, можно их отредактировать.

lolososo  Offline  Сообщение №1403 написано: 18 февраля 2015, 14:38



36
Цитата valambar

Я знаю, только не в консоли же его вводить. Вводить надо в стадию квеста. В общем, есть варианты - быстрые старты нескольких видов уже предусмотрены в игре, можно их отредактировать.

Ну я и имел ввиду, что в стадии, либо в скрипте специальном.

Dsion  Offline  Сообщение №1404 написано: 18 февраля 2015, 14:43



Если отменить старт главного квеста и переместить игрока куда-то своим собственным квестом, то всё будет нормально. Он будет нордом в железной броне с полным контролем. А потом уже можно поменять одежду и сменить расу.

lolososo  Offline  Сообщение №1405 написано: 18 февраля 2015, 14:57



36
Цитата Dsion

Если отменить старт главного квеста и переместить игрока куда-то своим собственным квестом, то всё будет нормально. Он будет нордом в железной броне с полным контролем. А потом уже можно поменять одежду и сменить расу.

Можно скриптом все это сделать)

Dsion  Offline  Сообщение №1406 написано: 18 февраля 2015, 15:42



Некоторые предпочитают не лезть клешнями в ванильные записи :)
Клац-клац

valambar  Offline  Сообщение №1407 написано: 21 февраля 2015, 09:13 | Отредактировано: valambar - 21 февраля 2015, 09:13



513
Цитата lolososo

Можно скриптом все это сделать)


Дело в том, что я как раз пытаюсь - и получаю неудовлетворительный результат. Сейчас меня интересует - что нужно ОБЯЗАТЕЛЬНО, чтобы начальное помещение игрока в нужную локацию ВСЕГДА работало в начале игры.

Получается не так, как надо (загрузочный экран не уходит) - даже если я копирую результирующий скрипт стадии из варианта быстрого старта самогО главного квеста и меняю только имя маркера на тот, что предварительно создал. Выходит, что-то теряю, чего нельзя было терять.

Добавлено (21 Февраля 2015, 09:28)
---------------------------------------------
Проблему решил. Теперь знаю, что команда moveto не работает, если маркер не указан в пропертях скрипта. Сменил маркер на свой не где-нибудь, а в менюшке редактирования проперти (саму проперть при этом оставляя в скрипте как есть) - игрок послушно возникает в начале игры в выбранной локации.

Теперь следующий вопрос. Как правильно оформить действие, аналогичное обливионовскому - объявить переменную (допустим, назвав ее short button), а потом создать мессажбокс с вариантами и написав set button to getbuttonpressed. Это в Обливионе. В Скайриме эта функция тоже есть. Вот у меня есть активатор, который при активации уже выдает мессажбокс. У него есть три варианта ответа. Как теперь присвоить эти варианты объявленной переменной?

Добавлено (21 Февраля 2015, 12:13)
---------------------------------------------
Аналогичный вопрос - с функцией unloсk. Как ее оформить, чтобы она работала?

Dsion  Offline  Сообщение №1408 написано: 21 февраля 2015, 09:26



valambar, полезный сайт:
http://www.creationkit.com/Message_Script

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



36
Цитата valambar

Аналогичный вопрос - с функцией unloсk. Как ее оформить, чтобы она работала?

PrivateDoor.Lock(false, false)

valambar  Offline  Сообщение №1410 написано: 21 февраля 2015, 10:26



513
Цитата lolososo

Если что-то не понятно в скрипе, скажи я объясню тебе.


Сейчас попробую - если сработает (подставлю свои варианты вместо дебугнотификашен ;) ), то заранее благодарю. Там надо, чтобы при одном из вариантов открылась дверь, которая сейчас закрыта, а в двух других на игрока я наложу эффект поражения морозом, чтобы замерз медленно, но насмерть  :D

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





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