Модератор форума: 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? Пиши не в ЛС, а в эту тему.
VALKNUT  Offline  Сообщение №1231 написано: 29 сентября 2014, 18:31



Цитата Multigone

VALKNUT, я не при делах, идея была Dsion'a.

Эх.. а счастье было так близко... не сработало щясте :)

Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ
<a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Multigone  Offline  Сообщение №1232 написано: 29 сентября 2014, 18:45



832
VALKNUT, сейчас проверил. Как:

- скомпилировал скрипт.
- добавил его к точильному камню, который скинул в окно рендера.
- запустил игру и побежал в Ривервуд.
- мой модный НПС начал пользоваться этой фурнитурой (у него пакет Сэндбокс).
- пока НПС пользовался им, периодически выводилось уведомление (я его добавил).
- когда НПС слез, вывелось Off.
- проверил с игроком, все то же самое.

У меня скрипт работает.

VALKNUT  Offline  Сообщение №1233 написано: 29 сентября 2014, 20:18



Цитата Multigone

VALKNUT, сейчас проверил.

Да, у меня тоже работает.. сам напортачил... :)
Вот теперь щясте :) Благодарю однако!

Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ
<a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Multigone  Offline  Сообщение №1234 написано: 30 сентября 2014, 18:32



832
У меня не работает следующее событие в скрипте на квесте:

EVENT OnStoryRemoveFromPlayer(ObjectReference akOwner, ObjectReference akItem, Location akLocation, Form akItemBase, int aiRemoveType)
    Debug.Notification("Удалено!")
ENDEVENT

Я так понимаю, событие должно срабатывать при удалении любого предмета из инвентаря игрока. Однако, это не работает. У кого-нибудь есть какие-нибудь идеи-нибудь?

Dsion  Offline  Сообщение №1235 написано: 30 сентября 2014, 18:51



Скорее, когда квест запускается ивеном Player Remove Item. Должно быть в первой вкладке квеста указано.

Multigone  Offline  Сообщение №1236 написано: 30 сентября 2014, 18:57



832
Dsion, большое спасибо :) . Только что (в эту самую минуту) я вспомнил о каком-то Event Manager и решил внимательно изучить вкладки квеста.

Можно ли как-то выбрать несколько событий в этой вкладке, которые будут отслеживаться? Или только одно? Хотя, я, кажется, уже догадывась...

Dsion  Offline  Сообщение №1237 написано: 30 сентября 2014, 19:02 | Отредактировано: Dsion - 30 сентября 2014, 19:03



А, еще надо квест в SM Event Node добавить.

Добавлено (30 Сентября 2014, 23:02)
---------------------------------------------
Оно-то работает, но не вижу особого смысла... Можно же просто сделать алиас игрока с ивентом OnItemRemoved.
Но эти StoryManager ивенты чуть больше информации получают об ивенте.

Multigone  Offline  Сообщение №1238 написано: 30 сентября 2014, 19:06 | Отредактировано: Multigone - 30 сентября 2014, 19:11



832
Dsion, что-то я первый раз с этим сталкиваюсь. Спасибо, буду разбираться ИЛИ попробую пока обойтись событием

EVENT OnItemRemoved(Form akBaseItem, int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer)

на алиасе игрока.

------------------

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

IF !akDestContainer && !akItemReference
    ; предмет удаляется бесследно.

IF akDestContainer
    ; В контейнер.

IF !akDestContainer && akItemReference
    ; В мир.

А мне нужно еще отследить, когда он удаляется движком (это камни душ), скриптом (у меня несколько скриптов удаляют их), а также для того, чтобы при удалении скриптами др. модов (если таковые будут) это тоже можно было определить.

Dsion  Offline  Сообщение №1239 написано: 30 сентября 2014, 19:10



В SM Event Node список ивентов, а в каждом ивенте список квестов, которые он может запускать... Если там будет твой квест и в квесте тоже прописан запуск по этому ивенту, то он запустится и выскочит OnStory...

Multigone  Offline  Сообщение №1240 написано: 30 сентября 2014, 19:15



832
Dsion, теперь понятно все мне. Там еще была идея с

Event OnStoryCastMagic(ObjectReference akCastingActor, ObjectReference akSpellTarget, Location akLocation, Form akSpell)

Жаль, что нельзя это отслеживать в одном квесте, а надо делать для каждого события свой...

anton  Offline  Сообщение №1241 написано: 30 сентября 2014, 20:01



362
MultigoneDsion, покажите мне глупому, где этот SM Event Node находится ?  а то весь СК перерыл и нигде его не нашёл :(

Мой Блог
Multigone  Offline  Сообщение №1242 написано: 30 сентября 2014, 20:52



832
anton, Object Window -> Character -> SM Event Node.

Aksyonov  Offline  Сообщение №1243 написано: 1 октября 2014, 02:19



937
Всем привет нужен простой скрипт > надеваешь доспех добавляется заклинание из свитка, снимаешь доспех удаляется, напишите пожалуйста  ^_^

Kepper  Offline  Сообщение №1244 написано: 1 октября 2014, 05:01



860
Aksyonov, если заклинание известно то вешаешь на доспех

ScriptName someScript extends ObjectReference

Spell Property ДобавляемоеЗаклинание Auto

Event OnEquipped(Actor akActor)
akActor.AddSpell(ДобавляемоеЗаклинание)
endEvent

Event OnUnequipped(Actor akActor)
akActor.RemoveSpell(ДобавляемоеЗаклинание)
endEvent

Если верить вики, то из свитка(scroll) заклинание вытащить нельзя. Максимум что можно, это скастовать его в игре или получить параметру при помощи SKSE/

anton  Offline  Сообщение №1245 написано: 1 октября 2014, 08:01



362
Multigone, спасибо, вечером попробую.

А тем временем ещё вопросик задам:
Кто то пробовал делать квест, запускающийся по событию "Craft Item" ?
Хочется словить эвент OnStoryCraftItem() и по нему определить, что создано в кузнице.
Но вот в Вики написано что эта функция неработоспособна, а сам я пока не смог проверить т .к "SM Event Node" вчера не нашёл.

И ещё, нужно ли удалять референсы обьектов типа Explosion, или они сами пропадают из мира Игры ?

Мой Блог
Multigone  Offline  Сообщение №1246 написано: 1 октября 2014, 09:00 | Отредактировано: Multigone - 1 октября 2014, 09:28



832
AksyonovKepper, только один момент:

Если заклинание не имеет тип "Ability", надо делать проверку, экипировано ли оно в руках, перед тем, как удалять.


anton,

По поводу крафта:

1) Можно попробовать действовать через скрипт др. квеста:


2) Через скрипт алиаса игрока:


Myprism  Offline  Сообщение №1247 написано: 1 октября 2014, 12:47


Физик


anton, то, что создано в кузне, попадает сразу в инвентарь игрока. Можно отслеживать попадание в инвентарь.

Aksyonov  Offline  Сообщение №1248 написано: 2 октября 2014, 03:19 | Отредактировано: Aksyonov - 2 октября 2014, 05:48



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

anton  Offline  Сообщение №1249 написано: 2 октября 2014, 06:56



362
Multigone, спасибо за примеры, второй мне больше нравится, т.к. через OnStoryAddToPlayer() я так понял не получится узнать, что предмет появился именно из кузницы.

Myprism, если проверять попадание инвентарь, то проблема будет узнать что предмет попал именно из кузницы, а не подобран с земли например. Ведь через событие OnItemAdded() нельзя это узнать. Хотя если делать как подсказал Multigone во втором примере, то может получится.

Теперь хочу поделится результатами своих экспериментов:
Квест с типом запуска "Craft Item" запустить через SM Event Node у меня получилось, но проблема в том, что он не способен выполнять обычные скрипты висящие на нём (происходят CTD), а выполняет только скрипты-фрагменты. Из чего следует, что событие OnStoryCraftItem() поймать таким квестом не получится.
Но зато для запуска этого квеста можно прописать условие в SM Event Node, и тогда квест можно запустить при создании только определённого предмета, а это уже почти то, что мне нужно.

Ещё хочу уточнить одну вещь, есть ли консольная команда для запуска квеста ?
(я попробовал player.SetStage _MyQuest 0 , но скрипт-фрагмент висящий на этом нулевом состоянии не отработал)

Мой Блог
Kepper  Offline  Сообщение №1250 написано: 2 октября 2014, 07:29



860
Цитата anton

Квест с типом запуска "Craft Item" запустить через SM Event Node у меня получилось, но проблема в том, что он не способен выполнять обычные скрипты висящие на нём (происходят CTD),


А если перед этим запускать квест отслежывающий, что ГГ находится с меню крафта

Multigone  Offline  Сообщение №1251 написано: 2 октября 2014, 10:09 | Отредактировано: Multigone - 2 октября 2014, 14:17



832
anton, еще такая идея (вкратце):

- пост. обновление на игроке.
- в малом радиусе ищется ближайший реф. с типом нужной фурнитуры.
- при нахождении - этот реф. добавляется в алиас (Optional), на котором есть скрипт и событие ПриАктивации().
- когда игрок активирует его, переводит булевую переменную (или глобальную на значения 0 и 1) на true, когда уходит с фурнитуры - на false.
- событие добавления предмета на алиасе игрока.
- если при добавлении предмета переменная = true, запустить квест.

Как видишь, непросто.

Dsion  Offline  Сообщение №1252 написано: 2 октября 2014, 10:48



Еще идея:
Код
Scriptname SionAliasScript extends ReferenceAlias

Keyword Property CraftingSmithingForge Auto
Bool Crafting = False

Event OnSit(ObjectReference akFurniture)
     If (akFurniture.HasKeyword(CraftingSmithingForge))
         Crafting = True
     EndIf
EndEvent

Event OnGetUp(ObjectReference akFurniture)
     Crafting = False
EndEvent

Event OnItemAdded(Form akBaseItem, Int aiItemCount, ObjectReference akItemReference, ObjectReference akSourceContainer)
     If (Crafting)
         Debug.MessageBox(akBaseItem)
     EndIf
EndEvent


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

anton  Offline  Сообщение №1253 написано: 2 октября 2014, 12:56 | Отредактировано: anton - 2 октября 2014, 13:09



362
Kepper, "квест.start()" в скрипте можно, а в консоли по моему так нельзя. Отслеживающий квест сегодня попробую, а то вчера весь вечер на глючные скрипты-фрагменты потратил.

Multigone, да тут и правда сложновато.

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

Точнее если ГГ получит их таким образом, мод перестанет правильно работать и начинает насылать на ГГ всякие болячки :)
Те эксперименты, что я провёл, подтверждают что всё должно работать.
Единственное, что меня смущает, так это то, что квест запускаемый через "SM Event Node" можно запустить и вручную. Хотя на данный момент мне самому это не удалось, чему я очень рад, но вдруг всё таки как то можно.

А то я такой многоуровневый крафт замутил, будет печально если пользователи не захотят его оценить :D

Мой Блог
Multigone  Offline  Сообщение №1254 написано: 2 октября 2014, 13:27



832
anton, Dsion подсказал самый оптимальный вариант. А мой пост нужно выпилить большой пилой.

ЗЫ: Если игрок хочет получить предмет или запустить квест консолью, зачем ему в этом препятствовать?

anton  Offline  Сообщение №1255 написано: 2 октября 2014, 14:35



362
Multigone, точно, вариант очень хороший и понятный.

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

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

Мой Блог
Dsion  Offline  Сообщение №1256 написано: 2 октября 2014, 17:47



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

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

Multigone  Offline  Сообщение №1257 написано: 2 октября 2014, 17:58



832
Dsion, и делать хард-ресет компу и выкидывать его в форточку.

anton  Offline  Сообщение №1258 написано: 3 октября 2014, 06:29



362
Dsion, да, именно для защиты мода :)
Тут не всё так просто, ведь условие - это создание в кузнице, а никакая команда в скрипте на предмете не позволяет это определить, нужен только запуск квеста типа "Craft Item" через "SM Event Node". Вот когда этот квест стартует, выполняется мой скрипт, заполняющий спец. переменную, которая в дальнейшем и позволяет определить был ли реально крафт именно этой вещицы или нет.

Вот если бы при этом на таком квесте работал обычный скрипт ловящий событие OnStoryCraftItem(), то всё вообще было бы идеально. Но увы, там работают только скрипты-фрагменты, которые писать то ещё удовольствие.

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

Мой Блог
Dsion  Offline  Сообщение №1259 написано: 3 октября 2014, 10:57



Цитата anton

нет команды, запускающей квест через консоль


Всё там есть: startquest, stopquest, setstage (тоже выполняет фрагмент). Многие переменные (даже скриптовые) также можно менять через консоль.
Предложение было не в том, чтоб легальность предмета подтверждалась фактом крафта в кузне, а чтоб подтверждалась прохождением всех субквестов:
1. Игрок нашел чертеж - поставилась переменная "игрокНашелЧертеж"
2. Игрок собрал ресурсы - поставилась переменная "игрокСобралРесурсы"
3. Игрок выслушал занудную болтовню какого-то скелета, предостерегающего от крафта - поставилась переменная. А потом это всё проверяется.

Или другой вариант. Особый крафт через скрипт, а не стандартными методами. Когда игрок всё собрал и всё выполнил, он активирует кузню (обычную или особую) и ему выскакивает выбор: "обычный крафт" или "скрафтить адскую хрень". Такое можно, например, через временный перк сделать.

Но если кто-то моё мнение спросит, мне идея защиты от читерства вообще не нравится...

anton  Offline  Сообщение №1260 написано: 3 октября 2014, 12:02 | Отредактировано: anton - 3 октября 2014, 12:06



362
Dsion, я тоже подозреваю, что мало кто мне за это спасибо скажет :) но всё равно интересно как это будет, ведь я ещё нигде не видел ничего подобного.
В крайнем случае отключить всё это хозяйство много времени не займёт.

Ещё раз посмотрел Вики, нету startquest и stopquest но я проверю в игре мало ли... , а setstage однозначно мой квест не запускает (по крайней мере скрипт-фрагмент точно не срабатывает)

А особый крафт (через скрипт) это как ? :
- подходим к любой стандартной кузне
- активируем её и получаем МесседжБокс про "скрафтить адскую хрень"
- нажимаем ОК и при наличии ресурсов получает предмет ?
(а временный перк - это перк на событие Activate со своим скриптом-фрагментом вызывающим этот МесседжБокс ?)
Просто интересно, как такое делается.

В моём моде есть что то похожее, но в качестве кузницы используется обычный активатор и по событию OnActivate() он создаёт предмет.

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





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