Здравствуйте! Многие сейчас пробуют играть в Скайрим без убийств, чтобы в статистике убийств были красивые нули. Но вот беда - есть некоторые заскриптованные квестовые персонажи, их не так много, которых может убить только ГГ. Приходится убивать, и в статистике появляеся убийство. Родилась идея мода - некий алтарь, молясь перед которым ГГ мог бы "очистить свою совесть", то есть стереть из статистики вынужденное убийство. В консоли есть для этого команда ModMiscStat "people killed" -1 А есть ли в Папирусе подобные команды? Может кто-то исследовал этот вопрос? Например при обращении к алтарю проходит проверка на убийство персонажа, и если персонаж был из списка заскриптованных, то статистика убийства очищается, если персонаж обычный, не Protected, то нет.
Моральная сторона меня мало волнует. Все равно противников так или иначе приходится лишать жизни - будь то кастование на них бешенства, чтобы убили другие, сбрасывание их криком ФусРоДа с высоты, заманивание в ловушки, и т.д., главное, чтобы убийство не попало в статистику игрока. Чисто спортивный интерес. Но есть некоторые персонажи, которых может убить только Главный Герой собственными руками, иначе квест будет не пройденным. Некоторые персы так заскриптованы, совершенно необоснованно, например Диджа в квесте "Туши свет!", или Энодий Папий в квестах Темного братства. Или другой случай - Дюрневир в Каирне душ. Его убийство записывается на игрока, даже если игрок сидел курил в сторонке во время боя. И потом этот Дюрневир оказывается жив-здоров, его можно даже призывать в Тамриэль, а убийство в статистике остается. Поэтому и придумал такой способ с алтарем. Ну или еще как-нибудь красиво это обыграть. Чистить консолью не хочется, и оставлять так тоже. Я в скриптах могу самое большее написать примитивный скрипт на включение выключение или на добавление предмета и всё. Нашел функцию в скрипте Game
Function IncrementStat(string asStatName, int aiModAmount = 1) native global
Но даже воспользоваться ею правильно у меня не хватает ума. всё, что я ни пытался написать, даже не компилируется, потому что я асолютно не понимаю, что делаю. Темный лес. javascript:// Потому и спрашиваю.
Dsion, вот я написал крохотный тестовый скриптик, повешал на переключатель в Доме теплых ветров в качестве эксперимента. Скриптик работает, убирает статистику убитых существ (у меня там висело одно убийство Дюрневира)
Но я понимаю, что нужно как-то сделать проверку, что это было убийство именно заскриптованного актера. Внести всех таких актеров в форм-лист? Кроме этого как то надо сделать чтобы статистика опускалась до нуля и не уходила в минус. Я нифига не понимаю реально в этих скриптах, хотя прочел все учебники, прочел эту ветку в форуме, пересмотрел кучу чужих скриптов. В голове каша.
Огромное спасибо за ответ. В принцепе стало понятно в общем, в каком направлении двигаться, но для моих познаний это реально трудно))) Может и забью, а может, на карантине делать нечего, и попробую что-то. Щас на алиас Энодия Папия повешал скрипт на событие OnDeath, чтобы счетчик убийств щелкнул -1, в игре сработало, убийство не засчитали, но на каждого такого актера вешать скрипт тоже как то не очень.
Myprism, так это и так квестовые персонажи, и они и так находятся в алиасе. и убивать их приходится по ходу квеста. Тот же Энодий появляется в игре только на время квеста "убить Энодия Папия"
Я сейчас поковырялся в Creation Kit и подумал, что проще сделать esp плагин без всяких скриптов, где снять галочки Protected с алиасов этих персонажей в квестах. Попробовал на Гае Мароне, Дидже и Энодии - работает. Все же esp файл напрямую не затрагивает ваниль, мод делаю для себя, так что ну иво нафиг эти скрипты, я уже понял, что скриптер из меня никакой. Огромное спасибо за участие и помощь.
Изменение репутации для пользователя emelya8307
emelya8307Offline
Сообщение №5
| Тема: Вопросы по скриптам Papyrus
написано: 13 апреля 2020, 14:52
| Отредактировано: emelya8307 - 13 апреля 2020, 14:53
Dsion Фух, возился долго, но сделал по твоему совету квест, запускающийся ивентом OnStoryKillActor, написал Скрипт (на пределе своих умственных возможностей), который при убийстве актера выводит сообщение "вы убили человека" либо "вы убили животное", по кейворду определяет, что в алиас жертвы попало. По началу срабатывал через раз, либо вообще переставал срабатывать. Потом сделал алиас на игрока, указал его как киллера, и все поехало как по маслу. Но я рано радовался, потому что идея с форм-листом не проходит. Потому что если заносить жертву в формлист, то при загрузке более раннего сохранения, получится ерунда. Надо брать данные именно из сохранения. Я могу менять статистику функцией IncrementStat, но я не знаю, какой функцией добыть MiscStat из игры.
Dsion, это я понял. Такой способ будет работать, если очищать статистику прямо на месте убийства. А с задумкой типа алтаря уже не получится. Особенно если жертва не одна, а две или три. Эти данные где хранить? Если в каком то форм листе, то если задумаешь загрузить более раннее сохранение и переиграть по другому, а в формлисте уже 2 жертвы. Или я чего-то не понимаю?
Вообще очень интересно, особенно когда что-то начинает получаться. Да, я допер вчера, что нужно после функции писать команду Stop()
Изменение репутации для пользователя emelya8307
emelya8307Offline
Сообщение №7
| Тема: Вопросы по скриптам Papyrus
написано: 13 апреля 2020, 21:06
| Отредактировано: Multigone - 21 апреля 2020, 19:23
Нашел функцию int Function QueryStat(string asStat) native global
Возвращает статистику, в том числе и убитых людей, но опять же без разделения на вип-персон и простых смертных... Похоже надо изучать что такое глобальная переменная.. Блин я столько много нового на карантине узнал
Изменение репутации для пользователя emelya8307
emelya8307Offline
Сообщение №8
| Тема: Вопросы по скриптам Papyrus
написано: 16 апреля 2020, 21:34
| Отредактировано: Multigone - 21 апреля 2020, 18:56
Dsion, еще один вопрос можно? Вот я создал квест, запускающийся при убийстве актера. Написал скрипт (ух как долго бился)При убийстве выходит сообщение "Вы убили человека" или "Вы убили животное" или "Вы убили нежить". Проверяется по кейворду ActorType... скриптовых персонажей забил в формлист и они отправляются в GlobalVariable, вобщем всё работает)) Но блин, убийство КУРИЦЫ не высвечивается на экране, хотя в статистику попадает, как убийство животного. У курицы Кейворд ActorTypeAnimal , как и у остальных животных. Не подскажешь тупому, почему не появляется сообщение? (Эти сообщения мне необходимы, чтобы вовремя заметить убийство, так как я играю прохождение без убийств).
Изменение репутации для пользователя emelya8307
emelya8307Offline
Сообщение №9
| Тема: Вопросы по скриптам Papyrus
написано: 18 апреля 2020, 19:08
| Отредактировано: Multigone - 21 апреля 2020, 18:54
Емеля, если Вы в Яндексе погуглите "Скайрим Курица", то в первой же статье прочтёте вот такое примечание.
Нет, просто у курицы, оказывается, стоит флаг "Simple Actor", а это значт в том числе, что "Also disables the Story Manager's Death and Assault events".
То есть убийство курицы, как я понял, отключено в ивентах Story Manager, а у меня как раз этот квест построен на событии OnStoryKillActor, Стори Менеджер просто его не фиксирует. А как фиксировать я не знаю, я всего лишь третью неделю изучаю скрипты и квесты.
Уважаемые скриптеры. Хочу сделать, чтобы в сообщениях квеста отображалось количество убитых определенных персонажей. В игровых квестах это делается через тег <Global=MyGlobal>, тег заменяется значением из глобальной переменной MyGlobal . Но у меня всегда цифра 0. В Quest Data в окне Text Display Globals я эту переменную вписал. При убийстве определенные персонажи вносятся в эту глобальную переменную. Другие скрипты её значение нормально видят и работают с ней правильно. А в тексте сообщения, выводимого квестом всегда "убито 0". Пишу так: "Убито <Global=MyGlobal>" Смотрел в игровых квестах, например, про виноград джазби - точно так же сделано. Но там нормально выводится значение. Вносить значение в переменную пробовал разными командами, например: MyGlobal.SetValue(MyGlobal.GetValue() +1) или ModObjectiveGlobal(1, MyGlobal) или MyGlobal.Value +=1 и еще другими способами. У меня совсем нет опыта, многое делаю наугад или по аналогии с другими скриптами.
Изменение репутации для пользователя emelya8307
emelya8307Offline
Сообщение №11
| Тема: Вопросы по скриптам Papyrus
написано: 28 апреля 2020, 13:30
| Отредактировано: emelya8307 - 28 апреля 2020, 13:31
Dsion, Myprism, Multigone, спасибо за отклик. Заставил-таки отображаться значение переменной в сообщениях. Оно отбражается при условии, что значение переменной было изменено в этом же квесте. А у меня при событии убийства заносилось значение в переменную, затем стартовал другой квест, из которого я пытался выцепить это значение переменной. Но оно почему-то из другого квеста не читается. Хотя квесты связаны, и в пропертях ее обьявил, и в первой вкладке квеста прописал.
Multigone, да, я использовал UpdateCurrentInstanceGlobal(), но это ничего не давало. Квест читает только переменные, которые сам изменяет. Не знаю, как сделать по другому. Ну хотя бы так.
Изменение репутации для пользователя emelya8307
emelya8307Offline
Сообщение №13
| Тема: Вопросы по скриптам Papyrus
написано: 3 января 2021, 14:22
| Отредактировано: Multigone - 8 февраля 2021, 20:21
Приветствую! Друзья, не могу разобраться с пакетами АИ. Почему не работает пакет в алиасе? Создал квест, алиас актера. Алиас заполняется случайным уникальным персонажем, список персонажей есть в кондишенах алиаса. В алиасе создал пакет. Актер должен при страте квеста прийти в определенную локацию и находиться там. Дело в том, что актер при старте квеста продолжают заниматься своими делами, и никуда не идёт. Алиас заполняется как надо, случайным персонажем из кондишенов. В пакете прописана локация и референс, возле которого он должен находиться и юзать маркеры. Если его принудительно фрагментом скрипта отправить в эту локацию, он там появляется и юзает маркеры, как положено. Не идет. Смотрел похожий мод, там все работает, делал точно так же. Вобщем долго рассказывать, может кто-то сталкивался с похожей проблемой?
UPD: разобрался. На двери в локацию висел скрипт. Убрал скрипт с двери - актеры стали заходить, пакет заработал.
Изменение репутации для пользователя emelya8307
emelya8307Offline
Сообщение №14
| Тема: Вопросы по скриптам Papyrus
написано: 11 января 2021, 22:20
| Отредактировано: emelya8307 - 11 января 2021, 22:20
Скажите, пожалуйста, как получить день недели? Мне нужно, чтобы событие происходило регулярно в определенный день недели. (Сандас, например). Как игра это вычисляет? Единственное, что нашел, это глобальная переменная GameDaysPassed, количество дней с начала игры. Как из нее вычислить текущий день недели? Заранее, спасибо.
Здравствуйте! Помогите горе-скриптописателю. Делаю для себя мод наподобие "Северных бань Скайрима". Чтобы НПС не расхаживали в бане нагишом, при входе им экипируется полотенце. Когда входят в бассейн - там триггер, полотенце снимается, при выходе - снова надевается. НПС у меня не специально созданные. Пустые алиасы заполняются случайными городскими персонажами, которые играют роль посетителей бани, когда игрок принимает водные процедуры. Проблема в чем - если я выйду из этой локации, а затем снова зайду - НПС сидят в бассейне в полотенцах.
Пока что на триггер бассейна прицепил скрипт:
Код
Event OnLoad() Self.Disable() Utility.Wait(0.15) Self.Enable() End Event
Скрипт работает, при перезаходе в локацию, НПС, которые сидят в бассейне, на долю секунды надевают полотенца, затем снова снимают. Есть ли более элегантное и правильное решение? Скрипты изучаю методом тыка, соответствующего образования нет. Но научиться хочется.
Да, проще было бы удалять и экипировать полотенце при входе-выходе в триггер. Но сложность в том, что это рандомное полотенце, их несколько видов, и требуется, чтоб какое полотенце НПС снял при входе, то же самое он и надел при выходе.
Скрипт вот такой: (Подглядел в других модах, адаптировал под себя). Там используется формлист, в который занесены все полотенца.
Код
Scriptname aaaBathPoolScript extends ObjectReference FormList Property aaaBathTowel Auto
Event OnTriggerEnter(ObjectReference triggerRef) Actor akactionRef = triggerRef as Actor Int i =0 While i < aaaBathTowel.GetSize() Form MyForm = aaaBathTowel.GetAt(i) If (MyForm&& akActionRef.GetItemCount(MyForm)>0) akActionRef.UnequipItem(MyForm) Endif i+=1 EndWhile EndEvent
Ну и на выходе аналогично. То есть если из инвентаря удалить полотенце, то неизвестно потом, какое добавлять обратно. Вот такой бред.
Изменение репутации для пользователя emelya8307
emelya8307Offline
Сообщение №16
| Тема: Вопросы по скриптам Papyrus
написано: 6 февраля 2021, 21:27
| Отредактировано: emelya8307 - 6 февраля 2021, 21:27
Multigone, спасибо, сейчас тупо скопировал ваши скрипты, не вникая в суть(время позднее), запустил мод. При входе в бассейн НПС раздеваются. При входе-выходе игрока из локации так и сидят в бассейне раздетыми (это хорошо). Но при выходе из бассейна один надел свою дефолтную одежду, второй просто вышел голый, а третий надел полотенце)))
Изменение репутации для пользователя emelya8307
emelya8307Offline
Сообщение №17
| Тема: Вопросы по скриптам Papyrus
написано: 7 февраля 2021, 18:37
| Отредактировано: emelya8307 - 7 февраля 2021, 19:35
Multigone, А ларчик, оказывается, просто открывался! В ваших скриптах увидел условие
Код
If !MyActor RETURN
У меня триггер бассейна расположен внутри большого триггера, который как раз и выдает и экипирует полотенца при входе в интерьер. Когда в условии события OnTriggerEnter я прописал IF !MyActor то сразу скрипты (мои) стали работать как надо. Видимо при загрузке локации большой триггер экипировал всех НПС в полотенца. Век живи, век учись!!! Огромное спасибо за помощь!
UPD Хотя нет, щас потестил, все-таки глюки случаются. Дело не в скриптах, дело скорее всего в конфликте триггеров находящихся один в другом и претендующих на одни и те же переменные. Едрить я бестолочь
Здравствуйте. Подскажите, пожалуйста, как мне в моем квесте отследить событие диалога, ну например, когда Лидия говорит "Целительные чары? Ты что, из храма?". Мне нужно, чтобы после этих слов сработала функция в моем квесте. Но вроде бы ванильные скрипты диалогов править нежелательно. Как мне поймать это событие? Но необязательно этот диалог. Любой другой ванильный диалог.
Multigone , да, спасибо. Щас посмотрел SM Event Node, там есть ActorDialogueEvent, как я понял, надо создать квест который будет запускаться при событии диалога. Короче пока для меня тут много непонятного, как все работает
Допускю, что этот скрипт дичь полнейшая, потому что теоретического образования по программированию у меня ноль. Нужно, чтобы бессмертный актер после нападения на него игрока становился смертным. Флаг Essential стоит на актере, не на алиасе.