• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Изменение репутации для пользователя Dsion
DsionOffline
Сообщение №2311
написано: 20 января 2017, 12:31
| Отредактировано: Dsion - 20 января 2017, 12:37
- нельзя вызвать GetItemCount() без аргумента (объект) - нельзя вызвать HasKeyword() на типе "целое число" - нелогично выполнять >= 1 на булевой переменной
AlexeyVN, Lexo тоже нормально придумал. GetItemCount, если верить creationkit.com, поддерживает и простые базовые объекты, и формлисты, и кейворды. Так что действительно можно было бы повесить на маски уникальный кейворд, а потом выполнять:
Код
GetItemCount(someKeyword) > 0
Ну и еще дофига вариантов было... А когда без длинной строки реально никак, её можно красиво разделить символом "\". Как-то так:
По идее это событие должно срабатывать каждый раз, когда что-то попадает игроку в инвентарь, а akSourceContainer - откуда (из какого контейнера) оно попадает к игроку. Если akSourceContainer действительно работает, можно при помощи каста или кейворда проверить, что это NPC, что он жив и не является спутником игрока. Нет, это всё фигня, если подумать... Будет ложно срабатывает даже если игрок просто берет подарок у НИП... Можно добавить проверку, что игрок в режиме скрытности.. Но все-равно не надежно...
2. Сделать перк, перехватывающий активацию NPC в режиме скрытности, устанавливающий переменную типа "игрокГрабитТого-то", выполнять настоящую активацию, очищать переменную. А в ивенте OnItemAdded проверять эту переменную. В принципе, такое работало бы, но: 1) сложновато 2) будет ложное срабатываение, если игрок откроет воровство, а потом откроет консоль и добавит что-то себе...
А нормального варианта не знаю
Если объект уникальный или квестовый, то кражу легко отследить. Проблемы только с отслеживанием любой кражи.
Изменение репутации для пользователя PitrPokir
PitrPokirOffline
Сообщение №2316
написано: 20 января 2017, 15:47
| Отредактировано: PitrPokir - 20 января 2017, 16:09
Dsion, вот 2 скрина и 2 кода их скриптов. Возможно, так будет проще избежать недопонимания в дальнейшем и не придется читать так много моих нубских объяснений)
Event OnEffectFinish(Actor akTarget, Actor akCaster) akCaster.ModActorValue("Magicka", necroMana) EndEvent
Касательно вопросов: 1) Ты уверен, что второй эффект накладывается именно на труп? А первый - именно на игрока? - Насчет первого уверен. Я проверял лог папируса, с трудом нашел нужную строчку из всего хлама, но там в Таргете и Кастере было ID игрока и предмет удаляется у него. А вот второй работает на оживленного мертвеца, как я понял. Ранее я делал отдельный спелл на удаление предметов и он на трупов не работал. 2) Если на первый эффект (реанимация) повесить условия типа "subject isdead", то на ком оно будут проверяться: на игроке или на цели? - Думаю, что на цели, потому что есть условие проверки ингредиента и проверяет именно у цели. 3) Если на второй эффект повесить условия, на ком они будут проверяться? - Проверяются на том, что указано.
Изменение репутации для пользователя Dsion
DsionOffline
Сообщение №2317
написано: 20 января 2017, 16:09
| Отредактировано: Dsion - 20 января 2017, 16:31
Да что-то не стало намного проще Скрины не отображаются, а скрипты нет смысла читать, пока не будет ясно, на кого вешается эффект. Можешь временно заменить скрипты на первом и втором эффекте на вот такие:
только во втором "1 " заменить на "2 ". После этого хоть станет ясно, на кого накладываются эффекты. Вернее, с какими аргументами вызывается oneffectstart,
Добавлено (20 Января 2017, 19:09) --------------------------------------------- Ну если ты точно уверен (без предложенной проверки), что: 1. Скрипт первого эффекта срабатывает с taget=игрок и caster=игрок 2. Скрипт второго эффекта срабатывает с target=труп и caster=игрок 3. При проверке условий на всех эффектах subject=труп. то никаких проблем. Условия на эффектах нужны одинаковые. Проверка мертвости, проверка наличия пыли, проверки пригодности к реанимированию, проверка того, не реанимирован ли он уже. А скрипт только на второй эффект: akTarget.RemoveItem(NecroRiseIngr, 1) и всё... Просекаешь, да? Только тогда, когда цель реально валяется мертвая и без дела (и с пылью), тогда оба эффекта срабатывают (всегда только вместе). Один реанимирует, а втрой - удаляет пыль.
Изменение репутации для пользователя PitrPokir
PitrPokirOffline
Сообщение №2318
написано: 20 января 2017, 17:15
| Отредактировано: PitrPokir - 20 января 2017, 17:23
Dsion, скрины поправил, предложенную проверку сделал. 1. Да. Игрок и игрок. 2. ID трупа и ID таргета совпадают, так что осмелюсь предположить, что работает таки на труп. Да. 3. Да. Сейчас проверю.
Добавлено (20 Января 2017, 20:15) --------------------------------------------- Наконец-то, работает как надо! Может, конечно, если поизвращаться, то можно будет найти такое состояние цели, когда реанимация не сработает, а удаление предмета сработает, но я ничего не могу придумать Спасибо большое за помощь, я почему-то недосмотрел все условия, начал какие-то глобальные переменные вводить, а ведь истина была близко. Еще сбило с толку то, что отдельное заклинание с удалением предмета не работало на трупы. До сих пор не могу понять почему, может архетип заклинания опять был неподходящий, то ли в условиях ошибся... ну да ладно. Еще раз спасибо.
Может, нужна галочка no death dispel (позволяет эффекту работать на трупе)... Лично я вообще не пробовал накладывать эффекты на трупы... И не уверен, как там всё работает...
Как можно при клонировании актера выделить клона, что бы проводить над ним дальнейшие операции, а не над целью, которую клонировали? Хотелось бы наложить несколько эффектов на клона. Использую функцию PlaceActorAtMe, альтернатив не встречал:
Код
Actor Property GhostActor Auto ActorBase Property GhostActorBase Auto
Event OnEffectStart(Actor Target, Actor Caster) GhostActor = Target GhostActorBase = GhostActor.GetBaseObject() as ActorBase GhostActor.PlaceActorAtMe(GhostActorBase) EndEvent
И реально ли сделать клон с такой же внешностью, экипировкой и параметрами, как и у цели? Если клонировать уникального НПС, то так и работает, а если какого-то бандита или драугра, то клон другой.
Это часть скрипта он висит на Allias игрока, проблема в том что NewMagnitude меняется на всех предметах с таким же зачарованнием Можно ли это как нибудь исправить?
AlexeyVN, вряд ли... Энчант-то один и тот же... И я не уверен, что это сохраняется после перезапуска игры... Можешь посмотреть перковую энтри пойни "Mod Incoming Spell Magnitude". Её, вроде, можно настроить, чтоб усиливать энчант на каком-то конкретном предмете...
Изменение репутации для пользователя AlexeyVN
AlexeyVNOffline
Сообщение №2324
написано: 23 января 2017, 19:17
| Отредактировано: AlexeyVN - 23 января 2017, 19:37
AlexeyVN, в Обливионе можно было, а в Скайриме - вроде, нет. Да и предмет тоже пришлось бы клонировать. Иначе заменится зачарование на всех таких предметах. Лучше почеши репу на Mod Incoming Spell Magnitude... Наверняка как-то можно прикрутить... Или расскажи, что делаешь там такое...
Изменение репутации для пользователя AlexeyVN
AlexeyVNOffline
Сообщение №2326
написано: 23 января 2017, 20:19
| Отредактировано: Multigone - 23 апреля 2020, 09:31
Dsion, Суть такая Есть Алтарь который открывает GifMenu c выбором усилить чары или снять чары, при выборе одного из пунктов предмет выбрасывается на алтарь и там происходят чудеса. Скрипт на Alias Игрока:
Код
Event OnItemRemoved(Form akBaseItem, Int aiItemCount, ObjectReference akItemReference, ObjectReference akDestContainer)
If bL && Ui.IsMenuOpen("GiftMenu") akItemReference = akDestContainer.DropObject(akBaseItem, 1) If akItemReference.GetEnchantment() Button = AlexDisenchantMessage.Show() If Button == 0 Input.TapKey(0x1) AnimPlayer = True Debug.sendAnimationEvent(Game.GetPlayer(), "IdleEnchantingCraft") Translation(akItemReference) DisenchantAltarFX.PlayAnimation("PlayAnim02") Utility.Wait(8)
AlexeyVN, мне кажется, если ты возьмешь какой-то меч типа "Стальной мечь огня" и снимешь с него зачарование таким способом, то зачарование снимется со всех Стальных мечей огня во всём мире... Вроде, уже пару раз тут эту тему поднимали, чесали репу и пришли к выводу, что снять зачарование чуть посложнее...
Dsion, GiftMenu Открывается с предметами которые не имеют базовых чар, то есть те предметы которые не имеют чар и те которые игрок зачаровал вот с тех предметов которые зачаровал игрок и снимаются чары. в игре проверял со снятием чар вроде всё нормально а вот с усилением походу придётся поломать голову
Изменение репутации для пользователя Dsion
DsionOffline
Сообщение №2329
написано: 23 января 2017, 20:51
| Отредактировано: Dsion - 23 января 2017, 20:52
А как алтарь проверят, что зачарование еще не усилено? Или можно усиливать бесконечно? С перком нормально работало бы, мне кажется. Ладно-ладно, не моё дело...
Изменение репутации для пользователя AlexeyVN
AlexeyVNOffline
Сообщение №2330
написано: 23 января 2017, 21:02
| Отредактировано: AlexeyVN - 23 января 2017, 21:09
Dsion, Я думал сделать ограничения но это позже сначала разберусь с этой проблемой А как через перк можно определить чары предмета который выкидываешь?
Перк без условий усилит для игрока все зачарования на всех предметах и все входящие заклинания. Так что вопрос, скорее, такой: какие повесить условия, чтоб он усиливал только зачарования и только на вещах, побывавших на алтаре. Ответ: пока не знаю У меня сейчас нету доступа к СК и я не помню, что там.
Dsion, Вопрос пряма с языка сняли Буду думать над условиями, а будут какие нибудь предложения c удовольствием их рассмотрю
Добавлено (24 Января 2017, 01:35) --------------------------------------------- Dsion, Mod Incoming Spell Magnitude это не работает, а Mod Spell Magnitude работает с Entry point разобрался теперь условия остались
Изменение репутации для пользователя Lexo
LexoOffline
Сообщение №2333
написано: 26 января 2017, 10:35
| Отредактировано: Lexo - 26 января 2017, 11:32
У меня очередной тупой вопрос... уж извините, но я на него так и не нашёл ответа...
А есть способ отслеживания успешного взлома замка? И отслеживание начала взлома, что бы какой-то эффект мог сработать перед тем, как взлом начался. Как вы могли догадаться, добрался до изменения талантов взлома и эта функция пригодилась бы в нескольких случаях...
Добавлено (26 Января 2017, 13:35) --------------------------------------------- Dsion, AlexeyVN, а не легче сделать через кейворд что бы усиливались только чары с определённым кейвордом? или формлист? Сделать скрипт, который, когда алтарь усилит какое-то зачарование, оно (или он - предмет) кидается в специальный формлист?
Lexo, есть более-менее нормальный способ запускать квест при взломе замка. Не подойдет? А второй вариант (не такой нормальный) - это перк с перехватом активации закрытых референсов. В скрипте перка можно что-то сделать и перед активацией, и после. Блин, что у тебя за идеи такие всегда, что нормально не реализовать Ну, в принципе, перк - не так и плохо.
Да, вот с перком самое то... хочу сделать вероятность того, что закрытый замок окажется... не до конца закрытым, и когда игрок попытается его взломать - он просто откроется...
Да вот... последствия бурной фантазии и обязательств, в связи с начатым модом... обещал сделать по 20 талантов в каждой ветке - пытаюсь сделать... буквально из пальца уже...
Добавлено (26 Января 2017, 22:59) --------------------------------------------- И то, это я ещё отвергаю самые безумные или невыполнимые идеи...
Фигово, что большинство дверей ведут в другую локацию с загрузкой. Можно было бы сделать крутой перк для подглядывания в замочную скважину. Ну оно, конечно, и так можно, наверное, но будет загрузка перед и после
В скрипте перка можно что-то сделать и перед активацией, и после
А ссылочку хотя бы можно? А то я сколько не искал, так и не понял, что нужно искать... а если я сам начну что-то писать, сами знаете - такое сочиню, что Скайрим просто блюванёт...
Lexo, я особо помочь не смогу - сейчас нету СК. Могу только по памяти. Сначала создаешь перк с Entry Point: Add Activation Choice. Потом убеждаешься, что этот перк попадает к игроку. Можно просто запомнить id и добавлять его игроку консольной командой addperk. В Add Activation Choice, по моему, нужно поставить галочки replace default и еще там какую-то. В поле скрипта сначала вписываешь просто Debug.MessageBox("Siski"); Потом проверяешь в игре. Активация абсолютно любого объекта или NPC должна выбивать сообщение Siski. И всё, сама активация не должна срабатывать. Потом навешиваешь на перк условий, чтоб срабатывал только на закрытые двери и контейнеры. GetIsObjectType,GetLocked, GetLocklevel. В таком духе. А потом изменяешь скрипт на перке вот так:
Добавлено (27 Января 2017, 20:16) --------------------------------------------- Вместо сообщения "start" можно добавить открывание двери с каким-то шансом. А вместо "finish", по идее, можно сделать проверку того, открыл ли игрок замок и сделать что-то, в зависимости от результата. Выглядит мутновато, но ничего лучше в голову не приходит.
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)