Модератор форума: 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? Пиши не в ЛС, а в эту тему.
anton  Offline  Сообщение №511 написано: 21 ноября 2013, 09:40 | Отредактировано: anton - 21 ноября 2013, 09:52



362
Kepper,
1. Про тюрьму не знаю, до сих пор туда ни разу не попал :) . Function EquipItem() - это если скриптом надевать, а если игрок сам это делает ?

2. Event OnEffectFinish() не подходит, он срабатывает в момент завершающей анимации, когда когти только начали прятаться. А мне нужно чтобы анимация полностью завершилась + АртОбьект когтей пропал. И только тогда стартовать другой маг. эффект. "HasMagicEffect" должна была быть отличным решением, но она совсем не работает.

Мой Блог
Kepper  Offline  Сообщение №512 написано: 21 ноября 2013, 09:56



860
1)
-Игрок одевает армор со скриптом.
-Скрипт вешает маг эффект.
-Маг эффект переодевает правильно и анигилируется(возможно перед этим придётся вещь снять)
Возможно будет лучше если одеваться будет другой армор.

anton  Offline  Сообщение №513 написано: 21 ноября 2013, 10:06



362
Kepper,  надо будет попробовать ... наверно снимать тогда тоже скриптом придётся.

Мой Блог
Kepper  Offline  Сообщение №514 написано: 21 ноября 2013, 11:31



860
Перечитал твой ворос.
Раз у тебя игрок может снимать когти
то мне кажется что надо копать в сторону квестовых предметов(одел когти - и они стали квестовыми, снял - вернулись в нормальное состояние).
То, что я говорил ранее блокирует снятие предмета игроком

LordVadim  Offline  Сообщение №515 написано: 21 ноября 2013, 17:06 | Отредактировано: LordVadim - 21 ноября 2013, 17:09



139
Цитата anton

2. Event OnEffectFinish() не подходит, он срабатывает в момент завершающей анимации, когда когти только начали прятаться. А мне нужно чтобы анимация полностью завершилась + АртОбьект когтей пропал. И только тогда стартовать другой маг. эффект. "HasMagicEffect" должна была быть отличным решением, но она совсем не работает.


А что мешает посмотреть длительность анимации и в OnEffectFinish() поставить Wait(...) на это время, а после уже выполнять ваши действия?

anton  Offline  Сообщение №516 написано: 21 ноября 2013, 18:02 | Отредактировано: anton - 21 ноября 2013, 18:06



362
Цитата Kepper

надо копать в сторону квестовых предметов


Попробую разобраться ... (надеюсь для этого не надо сами квесты создавать)

Мой Блог
AleksTirex  Offline  Сообщение №517 написано: 22 ноября 2013, 00:29 | Отредактировано: AleksTirex - 22 ноября 2013, 00:34


Архимаг


371
Цитата anton

И главное в игре же есть спец функция HasMagicEffect для этого, но увы, она совсем не работает.



anton, а кто мешает сымитировать данную функцию? Сделай, как написал LordVadim, а после задержки не команду ставь, а меняй свойство, и уже это свойство пропиши как условие вместо HasMagicEffect.
Например, меняй свойство bMag01 в квесте из своего маг.эффекта (скрипт квеста и свойство сделай conditional).
При старте первого маг.эффекта в его скрипте (myQuest as myQuestScript).bMag01 = true
при его завершении
 Utility.Wait(№№)
 (myQuest as myQuestScript).bMag01 = false
 
В условии второго маг.эффекта ставишь GetVMQuestVariable - myQuest - ::bMag01_var == 0
(+ остальные нужные условия)
 
Тогда второй маг.эффект сможет запуститься только после окончания первого + своё назначенное время (это не помешает запускаться второму эффекту при не запущенном первом, т.к. bMag01 будет всегда false). Т.е. запускать эффект будет движок.

anton  Offline  Сообщение №518 написано: 22 ноября 2013, 19:23



362
AleksTirex, спасибо за подсказку! не знал что свои переменные тоже можно включать в такие проверки.
Поэтому я полистал список условий и по аналогии нашёл ещё "GetGlobalValue" и "GetQuestRunning", которые тоже должны подойти для этой цели. В итоге "GetGlobalValue" заработал именно так как нужно ! (и очень просто, и без квестов).
Я надеюсь такое решение не будет иметь "подводных камней", пока что всё чётко работает...

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

Мой Блог
Myprism  Offline  Сообщение №519 написано: 23 ноября 2013, 01:25


Физик


anton, ещё можно вмешаться в процесс ареста. Там наверняка при отборе вещей можно поставить некий FormList, в котором прописать неотбираемые вещи. Теоретическая возможность есть, надо разбираться с квестами...

LordVadim  Offline  Сообщение №520 написано: 23 ноября 2013, 04:47 | Отредактировано: LordVadim - 23 ноября 2013, 05:02



139
Цитата anton

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


В скрипте отслеживать событие OnItemRemoved:

Event OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer)
    if (akBaseItem == ваш предмет) && (akDestContainer  == Значение при аресте)
        Game.GetPlayer().AddItem(akBaseItem, 1, True)
    EndIf
EndEvent

Чтобы иметь возможность снимать предмет надо выяснить значение akDestContainer при аресте и включить в условие.
Узнать значение можно вставив в событие Debug.MessageBox(akDestContainer) и сдаться властям.

Myprism  Offline  Сообщение №521 написано: 23 ноября 2013, 06:16


Физик


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

LordVadim  Offline  Сообщение №522 написано: 23 ноября 2013, 10:28



139
Цитата Myprism

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


Добавить проверку в Event OnItemAdded()

anton  Offline  Сообщение №523 написано: 23 ноября 2013, 12:58



362
LordVadim, тут ещё проблемка будет, нельзя чтобы движок самостоятельно снимал когти с игрока (ГГ так и помереть случайно может). Я думаю можно найти скрипт, отвечающий за раздевание при попадании в тюрьму, и попробовать модифицировать его. Конечно нехорошо ванильные скрипты править, но как вариант... Вот если бы ещё мне кто подсказал, как найти этот скрипт ? blush

Мой Блог
LordVadim  Offline  Сообщение №524 написано: 23 ноября 2013, 13:51 | Отредактировано: LordVadim - 23 ноября 2013, 13:53



139
Цитата anton

Я думаю можно найти скрипт, отвечающий за раздевание при попадании в тюрьму, и попробовать модифицировать его.


Не самый простой вариант. Я на 90% уверен, что там используется функция RemoveAllItems - то есть у игрока забираются сразу все предметы и переносятся в EvidenceChestPlayerInventory (Сундук с имуществом пленных). По крайней мере возврат предметов игроку реализован так.
И как это модифицировать? Список инвентаря игрока для выборочного перемещения предметов не получить без SKSE. А использовать ли SKSE в ванильных скриптах - это уже тебе решать (я бы не стал).

DarkVetal  Сообщение №525 написано: 23 ноября 2013, 13:55 | Отредактировано: DarkVetal - 23 ноября 2013, 13:56

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

LordVadim  Offline  Сообщение №526 написано: 23 ноября 2013, 14:12 | Отредактировано: LordVadim - 23 ноября 2013, 14:16



139
Цитата DarkVetal

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


Со Static такой вариант не пройдет. Можно использовать MiscItem с отключенным свойством Playable и без имени. Для вызова использовать функцию PlaceAtME() для удаления Delete().

Artem13  Offline  Сообщение №527 написано: 23 ноября 2013, 15:36 | Отредактировано: Artem13 - 23 ноября 2013, 15:47


Mercenaries. Со смертью на ты.


LordVadim, вполне себе пройдёт. Только они должны быть изначально размещены в мире. Если должны быть невидимы, то Initially Disabled. А потом включаются или через родительский маркер, или напрямую reference.Enable. Аналогично дизайблятся изначально видимые. Перемещаются они вроде бы тоже без проблем через SetPosition, например. Во всяком случае, контейнеры в ФНВ я так двигал.

<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
LordVadim  Offline  Сообщение №528 написано: 23 ноября 2013, 19:17



139
Цитата Artem13

LordVadim, вполне себе пройдёт. Только они должны быть изначально размещены в мире. Если должны быть невидимы, то Initially Disabled. А потом включаются или через родительский маркер, или напрямую reference.Enable. Аналогично дизайблятся изначально видимые. Перемещаются они вроде бы тоже без проблем через SetPosition, например. Во всяком случае, контейнеры в ФНВ я так двигал.


Согласен. Я имел ввиду, что создать из скрипта их не получится. Если ставить из Creation Kit, то да - управлять можно.

AleksTirex  Offline  Сообщение №529 написано: 24 ноября 2013, 01:11


Архимаг


371
Цитата LordVadim

Согласен. Я имел ввиду, что создать из скрипта их не получится. Если ставить из Creation Kit, то да - управлять можно.



Да нет, статики можно и создавать из скрипта, и потом управлять ими, и перемещать, и... всё, что угодно делать. Надо просто получать референс создаваемого объекта в момент его создания, и после этого уже нет разницы, скриптом или в СК он был добавлен.
 
Если надо статик вкл/выкл в определённом и заранее известном месте, то проще это в СК добавлять, а если местоположение неопределённое или рендомное, то можно и скриптом всё это делать.
(у меня компаньонка в лесу и костры разжигает куда ГГ пальцем ткнёт, и фурнитуру на них ставит, и маркеры с анимацией вокруг костра расставляет и т.д., а потом всё это убирает за собой, т.е. ограничений на управление никаких нет)

Artem13  Offline  Сообщение №530 написано: 24 ноября 2013, 06:13


Mercenaries. Со смертью на ты.


Цитата AleksTirex

Надо просто получать референс создаваемого объекта в момент его создания, и после этого уже нет разницы, скриптом или в СК он был добавлен.


Эээ, не уловил. Коротенький пример можно? Со статиком, желательно.

<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
DarkVetal  Сообщение №531 написано: 24 ноября 2013, 07:15

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

LordVadim  Offline  Сообщение №532 написано: 24 ноября 2013, 11:38



139
Цитата LordVadim

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


В конструкторе создаешь объект sFire с отмеченным свойством Initially Disabled и активатор. На активатор вешаешь следующий скрипт:

ScriptName ActivateFireSCRIPT extends ObjectReference

Static Property sFire Auto
Bool Property bFireOnOFF = False Auto Hidden

Event OnActivate(ObjectReference akActionRef)
    if bFireOnOFF
        sFire.Disable()
        bFireOnOFF = False 
    else
        sFire.Enable()
        bFireOnOFF = True
    endif
EndEvent

Скрипт сохранить с именем: ActivateFireSCRIPT.psc

Не забудь в конструкторе свойству скрипта sFire присвоить объект sFire.
По аналогии и с водой...

AleksTirex  Offline  Сообщение №533 написано: 24 ноября 2013, 11:41


Архимаг


371
Цитата Artem13

Ну вот например я размещаю объекты "вода" и "огонь" под краном и котелком, и нажимая на соответствующие рычаги, предмет должен появляться там, будто я включаю газ или душ,



Делаешь в СК кран и добавляешь к нему воду, объект воды выключаешь (ставишь галочку), получится в игре просто кран, а воду видно не будет. На рычаге скрипт, который будет включать и выключать воду:
 
ObjectReference Property akWater  Auto

Event OnActivate(ObjectReference akActionRef)
  if akWater.IsDisabled()
    akWater.Enable()
  else
    akWater.Disable()
  endif
endEvent

 
 
 
Свойству akWater надо назначить эту воду (объект воды под краном).

Если кранов и прочего такого будет много, то можно сделать один скрипт на все краны и его вешать на свой рычаг:
 
Event OnActivate(ObjectReference akActionRef)
  if GetLinkedRef().IsDisabled()
    GetLinkedRef().Enable()
  else
    GetLinkedRef().Disable()
  endif
endEvent


На каждом рычаге во вкладке LinkedRef назначается свой объект (вода или другое, что надо вкл/выкл).

LordVadim  Offline  Сообщение №534 написано: 24 ноября 2013, 12:04 | Отредактировано: LordVadim - 24 ноября 2013, 12:05



139
Кто знает как в message на кнопке отобразить символ "<" ?
В тексте отображается, а на кнопке не хочет.
Символ ">" отображается нормально.

Artem13  Offline  Сообщение №535 написано: 24 ноября 2013, 13:23


Mercenaries. Со смертью на ты.


LordVadim, попробуй пробелами ограничить.

<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
LordVadim  Offline  Сообщение №536 написано: 24 ноября 2013, 18:56 | Отредактировано: LordVadim - 24 ноября 2013, 18:58



139
Цитата Artem13

LordVadim, попробуй пробелами ограничить.


Пробовал ограничивать пробелами, кавычками, слешами, ставить символ < два, три раза - ничего не помогает. Всё что стоит после этого символа, включая и его - не отображается на кнопке.
Может кто нибудь видел этот символ "<" на кнопке в message в каком нибудь моде?

nine-dragon-art  Offline  Сообщение №537 написано: 24 ноября 2013, 21:01



341
Может я не в тему попаду, но относится ли формат .pex к скриптам и если да то чем открыть ?

border="0" alt=""/
LordVadim  Offline  Сообщение №538 написано: 25 ноября 2013, 05:14 | Отредактировано: LordVadim - 25 ноября 2013, 05:15



139
Цитата nine-dragon-art

Может я не в тему попаду, но относится ли формат .pex к скриптам и если да то чем открыть ?


Формат PEX - это скомпилированный скрипт. Чтобы получить исходник PSC нужно .pex файл декомпилировать.
В архиве есть декомпилятор и инструкция по настройке: Инструкции по работе с ESP и BSA

Artem13  Offline  Сообщение №539 написано: 25 ноября 2013, 09:54


Mercenaries. Со смертью на ты.


LordVadim,  а конструкция в стиле С тоже не канаеть? " \< "

<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
nine-dragon-art  Offline  Сообщение №540 написано: 25 ноября 2013, 11:47



341
LordVadim, о, спасибо)

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





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