• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Помогите разобраться со структурой мода FusRoDoor - который позволяет открывать двери Безжалостной силой. Если я переношу в TES5Edit все его изменения в другой мод, то почему-то эффект в другом моде не появляется. Спрашиваю в разделе скриптов, потому как сами скрипты, используемые модом, понятны - но непонятно, почему они не работают в другом моде.
Еще подобный же вопрос - есть мод на морровиндские заклинания, в т.ч. на открытие замков. В магическиъх эффектах используется архетип Скрипт, но почему-то сам скрипт к магическому эффекту не привешен.
Ну и самое простое - возможно ли использовать тот же принцип, что и в Обливионе - то есть просто прописать скрипт, что дверь как мишень заклинания должна открыться, навесить этот скрипт на магический эффект и все отлично - в Обливионе я потратил на это 5 минут, написав простенький скрипт и навесив его на заклинание.
В общем, как вы поняли, я ищу самый простой способ сделать заклинание, открывающее двери.
Изменение репутации для пользователя Dsion
DsionOffline
Сообщение №2074
написано: 29 апреля 2016, 18:05
| Отредактировано: Dsion - 29 апреля 2016, 18:06
В скайриме магический эффект может накладываться только на живых акторов. И нормального способа определить, во что попадает заклинание, если это не актор, вообще нету... Только если к самой двери каким-то образом (к базовому объекту, референсу или алиасу) прикреплен скрипт, он может узнать о попадании в дверь заклинания...
Добавлено (29 Апреля 2016, 21:05) --------------------------------------------- Мне только два варианта приходить в голову: 1. Через задницу (заполнение алиасов всеми дверями поблизости игрока при касте, вешание скриптов на все базовые двери или что-то такого типа) 2. Через перк с перехватом активации. Когда игрок клацает на закрытую дверь, ему дается выбор: открыть отмычкой или заклинанием. При выборе заклинания можно даже спецэффекты добавить.
Изменение репутации для пользователя valambar
valambarOffline
Сообщение №2075
написано: 30 апреля 2016, 01:29
| Отредактировано: valambar - 30 апреля 2016, 01:33
В скайриме магический эффект может накладываться только на живых акторов.
Вот этого я и боялся. Тогда в моде FusRoDoor придется разбираться глубоко. Там как раз скрипт именно ищет двери в ячейке, где игрок, и присваивает их алиасам. В общем, кто разбирался в этом моде сам, отпишитесь, что вы там в его структуре нашли и как это воспроизвести самому.
Хотя для ленивых, конечно, есть вариант - превратить esp этого мода в esm и свой мод делать, используя уже имеющуюся структуру.
В общем, скриптование в Папирусе меня все больше и больше разочаровывает - ничего не добьешься прямым написанием скрипта.
Изменение репутации для пользователя Reboroda
ReborodaOffline
Сообщение №2076
написано: 2 мая 2016, 18:42
| Отредактировано: Reboroda - 2 мая 2016, 19:36
Приветствую мастеров скриптинга, надеюсь что тема еще актуальна. Я плоховато шарю в скриптах папируса, прошу помощи. Имеется кустарный огород с пшеницей, на котором по айдл-маркерам снуют рабочие - неписи. На моем скрине вид из окна CK. Суть проблемы: Никак не соображу, как заставить неписей активировать снопы пшеницы с маркеров. Хотелось бы некий образец кода. Нужно ли обязательно добавлять триггер (на скрине...
- куб оранжевого цвета), или можно как-то обыграть активацией с маркеров? Обычно я просто делал большой триггер и прописывал в него скрипт с проверкой => является ли нпс с элиасом "рабочий" субъектом фракции рабочих:
Код
Actor worker = akActionRef as Actor if worker == worker.isInFaction(WorkersGenericFaction)
Ставил срок сбора урожая по времени c помощью функций:
Код
function HarvTime() self.RegisterForUpdateGameTime(10 as Float) HarvTime = true endFunction
function OnupdateGameTime() if HarvTime gotoState("harvest") endIf endFunction
И по прошествии 10 игро-часов врубался стэйт "harvest". Когда НПС покидал зону триггера => грубо закидывался "урожай" в контейнер, расположенный рядом. Пшеница из FormList'а.
Общий урожай из контейнера, если он в нем имеется, перемалывается в муку на мельнице теми же рабочими (так он возрастает в цене), и автоматом продается в течении 24 часов управляющим поместья. Потом управдом бежит к ГГ, если тот в нескольких метрах от дома, и вручает ему вырученный доход (минус небольшой процент налога). С этим кодом я уже кое как справился, у управдома спец элиас + пак на поиск ГГ и принудительный диалог с отдачей всей суммы накопленных денег.
Однако это очень грубо и хотелось бы что-то похитрее и покреативнее. Чтобы каждый сноп НПС мог "пожать", активировав его с айдл-маркера, как это делает ГГ (главное чтобы у стога снялась "шапка", было видно), закинуть в контейнер 3 шт пшеницы с этого действия, ну а уже как спрятать-деактивировать сами маркеры вокруг пожатого снопа я соображу и сам. И так я хочу сделать для каждого стога пшеницы и его маркеров. Ну а спустя 10 часов чтобы "шапки" снопов пшеницы снова "отрастали" и были готовы для повторения цикла работы. Такая вот "трудотерапия" , может ли кто-нибудь набросать как провернуть подобное в коде? Заранее спасибо!
Изменение репутации для пользователя Lexo
LexoOffline
Сообщение №2077
написано: 4 мая 2016, 19:46
| Отредактировано: Lexo - 4 мая 2016, 19:47
Короче, придётся со снятием зачарований с артефактов поступить обходным путём - сделать проверку наличия артефакта и добавить в инвентарь артефакт с таким же зачарованием, но без кейворда DisallowEnchanting. Но боюсь, без вашей помощи никак... не подскажите, как правильно написать такой скрипт:
Event [когда активируем пентаграмму зачарований] if [в инвентаре есть предмет1] [добавить предмет1+] endif if [в инвентаре есть предмет2] [добавить предмет2+] endif endevent
ScriptName _TestSCPTREFA Extends ReferenceAlias ; На алиас игрока.
FormList Property ArtifactFLST Auto ; Лист с арт. FormList Property CopyFLST Auto ; Лист с копиями. В том же порядке, такое же кол-во. Keyword Property CopyKYWD Auto ; Каждая копия должна содержать это ключ. слово. Оптимизирует скрипт. Keyword Property IsEnchanting Auto ; Заполнить.
Bool bL
EVENT OnSit(ObjectReference xR) IF xR.HasKeyword(IsEnchanting) bL = true GoToState("S") Actor xA = GetActorRef() IF xA.GetItemCount(ArtifactFLST) Int iC = ArtifactFLST.GetSize() WHILE iC iC -= 1 IF xA.GetItemCount(ArtifactFLST.GetAt(iC)) xA.AddItem(CopyFLST.GetAt(iC), 1, true) ENDIF ENDWHILE ENDIF bL = false ENDIF ENDEVENT
STATE S EVENT OnItemRemoved(Form xF, Int iN, ObjectReference xR, ObjectReference xD) IF xF.HasKeyword(CopyKYWD) Int iC = CopyFLST.GetSize() - 1 WHILE iC > 0 && xF != CopyFLST.GetAt(iC) iC -= 1 ENDWHILE GetRef().RemoveItem(ArtifactFLST.GetAt(iC), 1, true) ENDIF ENDEVENT
Добавлено (09 Мая 2016, 16:34) --------------------------------------------- То ли я опять что-то не так делаю, то ли не работает... лично я склоняюсь к первому, поэтому, если не сложно, можете проверить, что не так?
в общем, повесил скрипт просто на игрока, заполнил все - не работает...
потом создал квест, как алиас выбрал игрока - тоже не сработало...
Lexo, похоже, дело обстоит так: после активации стола игра создает список всех доступных для снятия чар предметов. Поскольку это происходит одновременно с добавлением копий, то они уже не будут учитываться в первоначальном списке. После того, как чары с любого предмета будут сняты (возможно, также после зачарования любого предмета), список будет обновлен, и в нем появятся копии. Далее по накатанной - изучаем чары с копии, копия уничтожается, уничтожается первоначальный артефакт в инвентаре.
Что делать, чтобы копии попали в инвентарь ДО активации стола - пока хз. Возможно, попробовать перк Entry - Activate, как предлагал Dsion...
Цитата Lexo
повесил скрипт просто на игрока
Он не будет работать, т.к. предназначен исключительно для ReferenceAlias.
Lexo, новая версия. Итак:
ScriptName _TestSCPTREFA Extends ReferenceAlias ; На алиас игрока.
Perk Property ActivatePERK Auto ; Перк. FormList Property ArtifactFLST Auto ; Лист с арт. FormList Property CopyFLST Auto ; Лист с копиями. В том же порядке, такое же кол-во. Keyword Property CopyKYWD Auto ; Каждая копия должна содержать это ключ. слово. Оптимизирует скрипт. Keyword Property IsEnchanting Auto ; Заполнить.
FUNCTION F(ObjectReference xR) IF !bL bL = true GoToState("S") Actor xA = GetActorRef() IF xA.GetItemCount(ArtifactFLST) Int iC = ArtifactFLST.GetSize() WHILE iC iC -= 1 IF xA.GetItemCount(ArtifactFLST.GetAt(iC)) xA.AddItem(CopyFLST.GetAt(iC), 1, true) ENDIF ENDWHILE ENDIF xR.Activate(xA) ENDIF ENDFUNCTION
STATE S EVENT OnItemRemoved(Form xF, Int iN, ObjectReference xR, ObjectReference xD) IF xF.HasKeyword(CopyKYWD) Int iC = CopyFLST.GetSize() - 1 WHILE iC > 0 && xF != CopyFLST.GetAt(iC) iC -= 1 ENDWHILE GetRef().RemoveItem(ArtifactFLST.GetAt(iC), 1, true) ENDIF ENDEVENT
1) Тип: Entry -> Activate. Отметить флаги: Run Immediately, Replace Default. 2) Условия: Target -> (S) (HasKeyword) (IsEnchanting) (==) (1.0)
Чтобы правильно повесить скрипт на перк, нужно в точности повторить следующие действия:
- повесить на алиас основной скрипт. - открыть Entry перка и в поле Papyrus Fragment написать:
Код
akactor.kill()
- сохранить перк, нажав OK -> OK. - открыть папку Scripts / Source и найти там свежесозданный скрипт. Он будет наименован как "PRKF_(EditorID перка)_(FormID перка).psc" (в моем случае это был PRKF__MGTTestPERK_031662DB.psc). - открыть этот скрипт редактором текста и написать в конце:
Код
<Имя твоего основного скрипта> Property L Auto
... в моем случае это было так:
Код
;END FRAGMENT CODE - Do not edit anything between this and the begin comment _TestSCPTREFA Property L Auto
- сохранить скрипт. - СКОМПИЛИРОВАТЬ этот скрипт штатными средствами СК (через Gameplay -> Compile). - открыть перк и в поле Papyrus Scripts заполнить Property L, указав твой квест и содержащийся в нем алиас, на который навешен основной скрипт. Нажать ОК. - открыть Entry перка и в поле Papyrus Fragment написать:
Код
L.F(akTargetRef)
- сохранить перк, нажав OK -> OK. Сохранить мод.
PS: Оба скрипта являются неотъемлемой частью мода, что следует учитывать. PPS: У меня все работает. PPPS: На скрине под спойлером перепутаны предметы в листах, но в целях теста это не важно. PPPPS: Долбаные bb-коды.
Ого, не думал, что кто-то мне так серьёзно решит помочь. Прям не знаю, как благодарить. Пойду попробую сделать это... очень надеюсь, что справлюсь. Спасибо огромное!
Добавлено (10 Мая 2016, 00:24) ---------------------------------------------
Цитата Multigone
- открыть Entry перка и в поле Papyrus Fragment написать:Код L.F(akTargetRef)
- сохранить перк, нажав OK -> OK. Сохранить мод.
После того, как вписываю L.F(akTargetRef) и нажимаю ОК выдаёт ошибку, что нельзя закомпилировать
Вроде, всё делаю по написанному... что же не так?
Добавлено (10 Мая 2016, 00:36) --------------------------------------------- А да... и ещё после взятия перка пентаграмма душ убивает игрока... я так понял, это последствия той самой некомпилирующейся команды...
Lexo, скрин не показывает саму ошибку, там после (8, 2... есть еще текст. Скорей всего, переменная L не содержит функцию F. Возможно, имя Property L выбрано неправильно (не соотв. имени осн. скрипта).
Lexo, а, еще кое-что: если тот перк можно выбирать в меню повышения уровня, то следующие элементы надо убрать из скрипта (с последующей компиляцией):
Понятно. Сейчас поправим. Но скрипт я сохраню на всякий случай...
И попутно ещё вопрос: мне тут в теме моего мода предложили забавную идею - сделать возможность воровать во время боя... как думаете, это возможно? Хотя бы даже появляющимся окном с вариантами посреди экрана...
Добавлено (13 Мая 2016, 14:07) --------------------------------------------- И ещё сразу накину умным людям... возможно ли сделать, что бы обычные стрелы начали взрываться? Я знаю, что стрелам можно прописать взрыв в Projectile, но тогда это изменит стрелы навсегда. А возможно ли взрывать их только при определённых условиях (ну, как вы понимаете, опять перк)? Наверное, надо навешивать скрипт OnHit с (selfref.GetEquippedItemType(1) == 8) || \ (selfref.GetEquippedItemType(1) == 12) да?
1) OpenInventory(). Даже если игрок находится в скрытности, все равно открывается обычное контейнер-меню, как при осмотре трупа этого НПС (надеялся, что скрытность повлияет на режим меню).
2) Через такой фрагмент на перке Activation (условия - игрок в скрытности, цель в бою):
Actor xA = akTargetRef AS Actor Actor xT = xA.GetCombatTarget() xA.StopCombat() Utility.Wait(0.001) xA.Activate(akActor) Utility.Wait(0.5) IF xT xA.StartCombat(xT) ELSE xA.SetAlert(true) ENDIF
При активации выводится сообщение, мол, вас уже поймали, и меню не открывается.
Пока только такие идеи были.
Lexo, по поводу стрел - скорее всего, да, через OnHit(). Только скрипт должен быть на маг. эффекте заклинания, которое творится от имени игрока через опред. интервалы времени, действует в большом радиусе и игнорирует преграды.
PS: Вместо selfref надо использовать akAggressor, впрочем, все это нюансы.
И ещё сразу накину умным людям... возможно ли сделать, что бы обычные стрелы начали взрываться?Я знаю, что стрелам можно прописать взрыв в Projectile, но тогда это изменит стрелы навсегда. А возможно ли взрывать их только при определённых условиях (ну, как вы понимаете, опять перк)? Наверное, надо навешивать скрипт OnHit с (selfref.GetEquippedItemType(1) == 8) || \ (selfref.GetEquippedItemType(1) == 12) да?
он вешает эффект "при касании"... к сожалению, взрывов они не вызывают... по крайней мере, я пытался, но у меня не вышло... пойду попробую ещё раз, а то опытом замечена такая тенденция, что когда кто-то что-то советует, это начинает получатся, даже если раньше не получалось...
Ни радиус, ни эксплоушен не помогают... заклинания "при ударе" действуют только на 1 цель... очевидно, придётся пробовать скриптом... но с этим я, надеюсь, справлюсь...
Зато теперь у меня другой вопрос - возможно ли сделать:
1) Заклинание, которое на расстоянии будет производить карманные кражи (эдакое телекинетическое обваровывание), или что бы телекинез мог воровать (хотя это я, по-моему, уже спрашивал); 2) Заклинание, которое будет открывать замки на сундуках и дверях с рандомом (т.е. каждую секунду кидает рандом от 1 до 100 и проверяет равенство)?
1) Думаю, да. Но реализация может быть разной. Вот какие идеи, когда игрок в скрытности действует телекинезом на актера: - он активирует его на расстоянии (процесс по умолчанию). - он заставляет его выбросить случайный (не экипированный) предмет из инвентаря, который затем можно подобрать. Игроку наносится урон магии, скажем, 50 ед., или перезарядка Х сек. Нужен SKSE. - открывается контейнер-меню для этого НПС. Первый предмет, который выберет игрок, выбрасывается из инвентаря актера (можно выбирать экипированное), меню закрывается и НПС переходит в состояние тревоги (если выбран экипированный предмет, то атакует). Нужен SKSE.
2) На пред. странице Dsion уже говорил про двери и заклинания. Есть еще вариант - искать ближайший референс указанного типа - FindClosestReferenceOfAnyTypeInListFromRef(). Но кол-во дверей и сундуков в сумме больше 400 (или около того), так что искать будет долго. Плюс, модные типы учитываться не будут. Не знаю, стоит ли оно того...
Lexo, можно создать отдельное заклинание FF - Target Actor, длительностью 5с и условием "этого заклинания нет на актере". На телекинез повесить скрипт с постоянным апдейтом и кастом этого заклинания (цель не указывать). Тогда, как только игрок наведет прицел на актера, следующее заклинание в апдейте сработает и выполнит повешенный на него скрипт с Activate. Следующие 5с оно срабатывать не будет (типа кулдаун). Конечно, было бы проще, если б скриптом можно было узнавать референс, на который смотрит игрок. Но я такой функции не нашел (плохо искал?).
- открывается контейнер-меню для этого НПС. Первый предмет, который выберет игрок, выбрасывается из инвентаря актера (можно выбирать экипированное), меню закрывается и НПС переходит в состояние тревоги (если выбран экипированный предмет, то атакует). Нужен SKSE.
а когда цель в бою (и не важно крадётся кастующий или нет), то появляется шанс выбить у противника из рук оружие и щит (чем меньше у цели запаса сил, тем больше шанс [учитывая 5 секундный кулдаун, то 100% при 0 запаса сил, и 50% при 100% запаса сил)?
Dsion, как ты знаешь, в Form есть SKSE-событие OnCrosshairRefChange(), но если в момент запуска скрипта с ним игрок уже смотрит на к.-л. референс, то его получить не выйдет. Событие полезное, но не в том конкретном случае.
Lexo, а? Я бы не стал на одно заклинание накручивать много разных вещей. Ванильные тем и хороши, что они простые и игроку легко запомнить, что какое делает. К тому же то, что ты предложил, уже есть в оригинале у крика... Эм, не помню название. К тому же, первое уже содержит второе (т.е. до боя можно снять экипированное оружие). К тому же, эта идея не слишком простая в реализации. Но если надо...
Изменение репутации для пользователя Aksyonov
AksyonovOffline
Сообщение №2096
написано: 16 мая 2016, 00:44
| Отредактировано: Aksyonov - 16 мая 2016, 00:45
Всем снова привет подскажите пожалуйста в общем и по короче - как сделать персонажа который бы становился в боевую стойку при подход гг а при приближении говорил не подходи, вот как в игре уже такое было, сложно сделать? мне вот сейчас надо подобное какие то скрипты используются?
STATE S EVENT OnBeginState() ; Debug.Notification("OnBeginState") IF fW Actor xP = Game.GetPlayer() xP.DamageAV("Magicka", 50.0) Int iC WHILE !bE && iC < 50 Utility.Wait(0.01) iC += 1 ENDWHILE xP.CreateDetectionEvent(xA, iMin((10.0 * fW + 50.0 * (bE AS Int)) AS Int, 100)) IF xP.GetRelationshipRank(xA) < 0 ELSEIF bE ; Друж. НПС теряет дружбу с игроком. ELSE ; Друж. НПС говорит WI и поднимает (?) предмет. ENDIF ENDIF ENDEVENT ENDSTATE
EVENT OnEffectStart(Actor xT, Actor xC) ; Debug.Notification("OnEffectStart") xA = xT RegisterForMenu("ContainerMenu") xA.OpenInventory(true) ENDEVENT
EVENT OnItemAdded(Form xF, Int iN, ObjectReference xR, ObjectReference xS) IF xS F(xF, iN, xA, xS) ENDIF ENDEVENT
EVENT OnItemRemoved(Form xF, Int iN, ObjectReference xR, ObjectReference xD) IF xD F(xF, -iN, xD, xA) ENDIF ENDEVENT
EVENT OnObjectUnequipped(Form xF, ObjectReference xR) bE = true ENDEVENT
EVENT OnMenuClose(String sN) ; Debug.Notification("OnMenuClose") WHILE iS Utility.Wait(0.01) ENDWHILE GoToState("S") ENDEVENT
FUNCTION F(Form xF, Int iN, ObjectReference xS, ObjectReference xD) iS += iN IF iS * iN <= 0 ELSEIF iN < 0 && !fW fW = xF.GetWeight() + 1.0 Input.TapKey(0x1) ; в Input нет Valid controls для ESC? xS.RemoveItem(xF, Math.Abs(iN) AS Int, true, xD) xD.DropObject(xF, 1) ELSE xS.RemoveItem(xF, Math.Abs(iN) AS Int, true, xD) ENDIF ENDFUNCTION
Int FUNCTION iMin(Int A, Int B = 0) IF A < B RETURN A ENDIF RETURN B ENDFUNCTION
Как работает: при касте телекинеза на актера открывается его инвентарь. Первый выбранный игроком предмет выбрасывается, игроку наносится урон магии 50 ед. за перенапряжение, создается шумовое событие амплитудой (от 10 + 10 за каждый 1 ед. веса выброшенного предмета + 50 за экипированный предмет, максимум 100; нужен тест события). Кулдаун 3с. Не проработана реакция дружественного НПС на такую кражу.
Что учтено: - игрок не может положить предмет в инвентарь актеру или напрямую взять его оттуда. - нельзя одновременно взять предмет телекинезом и копаться в инвентаре актера. - если игрок просто закроет меню, не выбрав предмет, ничего не произойдет.
PS: Возможно, я что-нибудь забыл указать, т.к. сказывается недостаток времени. Как я и говорил, этот идея не слишком простая в реализации.
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)