• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №2131
написано: 27 июня 2016, 21:32
| Отредактировано: Multigone - 24 апреля 2020, 10:30
Здравствуйте дорогие мододелы, давненько я модингом уже не занимался и решил зайти сюда поискать помощи. Может кто помочь мне и проинструктировать в вопросах моего мода, скажем по скайпу? Был бы вам очень признателен.
Как ни странно, но именно этого я и хочу. Главное, что бы перед ним враг был, а так, скрипт, который кастует через несколько секунд заклинания я уже сделал (знаю, это очень простой скрипт, но для меня и это подвиг). А то странно будет, что в бою он кидает заклинания каждые 8 секунд куда-попало.
Lexo, я пытался сделать, чтобы молнии били из актера в стоящих рядом и в пространство под произвольными углами. Если поместить внутри актера маркер и использовать его как источник заклинания, то молнии будут ударять в самого актера. Надо смещать источник от центра в направлении заклинания на некоторое расстояние. Но тогда будет видно, что снаряд вылетает из пустого места. Короче, я к тому, что "кидает куда попало" еще и достаточно проблемно сделать.
Multigone, боюсь, без вашей помощи никак не обойтись...
Сделал Способность (постоянный эффект на себя), которая постоянно висит на существе (для проб создал амулет с зачарованием). На способности висит скрипт:
Idle property TuumIdle auto Sound property DragonFireBreath auto Spell property CheckActorSpell auto Perk property ActorYesPerk auto Spell property DragonTuumSpell auto
Event OnEffectStart(actor T, actor Ca)
CheckEffect(T, Ca)
EndEvent
Function CheckEffect(Actor T, Actor Ca)
If (Ca.IsInCombat()) CheckActorSpell.Cast(Ca) If (Ca.HasPerk(ActorYesPerk)) Ca.PlayIdle(TuumIdle) DragonFireBreath.play(Ca) DragonTuumSpell.Cast(Ca) Else ;(ничего) EndIf
Else ;(ничего) EndIf
Utility.Wait(3) CheckEffect(T, C)
EndFunction
CheckActorSpell - это заклинание, которое он кидает для проверки (скопированный Захват Душ). На заклинании скрипт:
Event OnEffectStart(actor X, actor Y) Y.AddPerk(_LEXO_Perk) endEvent
Event OnEffecFinish(actor X, actor Y) Y.RemovePerk(_LEXO_Perk) endEvent
Т.е. летит заклинание. Если попало по кому-то, то даётся перк, необходимый для кастования заклинания из скрипта. Через секунду перк отбирается, поскольку эффект заканчивается.
Теперь проблема: когда нет боя - он ничего не кастует. Как только наступает бой, он каждые 3 секунды пуляет заклинание, и не важно, есть перед ним враг или нет. Как только бой заканчивается - всё проходит. Не подскажете, в чём я промахнулся?
1) НПС (не игрок) могут иметь только перки, унаследованные от ActorBase. Т.е. ни скриптом, ни с помощью ApplyPerk нельзя их добавить / удалить. 2) Значит, он не может проверить, есть ли в направлении его взгляда актер или нет.
Стоп. Как это? Я создал "Яд некроза", в котором прописано "Perk to Apply" мой перк, который сводит к нулю действие лечебных заклинаний и зелий. Проверял на врагах - и действительно они не лечатся. Или то, что ты написал относится только к скриптам?
EVENT OnEffectStart(Actor xT, Actor xC) S2.Cast(xT, xC) ENDEVENT
ScriptName _TESTTEST12 Extends ActiveMagicEffect ; Основной скрипт.
Actor Property pA Auto ; Актер-источник, которому необходима проверка. Spell Property pS1 Auto ; Заклинание 1. Spell Property pS2 Auto ; Заклинание 2. MagicEffect Property pM2 Auto ; Эффект заклинания 2.
EVENT OnEffectStart(Actor xT, Actor xC) pA = xT OnUpdate() ; Старт. ENDEVENT
EVENT OnUpdate() IF F() Debug.Notification("ХА!") ; Делаем что хотим - отжигаем заклинаниями. ENDIF RegisterForSingleUpdate(1.0) ; ENDEVENT
Bool FUNCTION F() ; Основная функция-проверка. pS1.Cast(pA) ; Бьем заклинанием и ждем ответа. Int iC = 50 ; Даем 0.5с на возврат. WHILE iC && !pA.HasMagicEffect(pM2) ; Ждем, пока эффект ответа не будет на источнике или не истечет время. Utility.Wait(0.01) iC -= 1 ENDWHILE IF iC ; Если время не истекло. pA.DispelSpell(pS2) ; Снимаем. RETURN true ENDIF ; По умолчанию возвр. false. ENDFUNCTION
Принцип: третье заклинание основное. Когда накладывается на актера, запускается вся байда. Первое заклинание ударяет в направлении взгляда источника. Цель (если есть) возвращает второе заклинание обратно. Производится проверка и, если удачно, делаются необходимые действия.
Хм... вот как... спасибо большое! Но на счёт "Perk to Apply" - он работает на НИПов. Просто эта штука работает только на эффектах "На себя". Создай яд (все зелья действуют "на себя") и повесь на него эффект с перком... убедись, что это работает...
Lexo, эту тему поднимали уже давно. У нескольких человек не работало. У меня не работает. Я сейчас еще раз проверил. Проверь, поставь эффекту Ability, который указываешь в перке, какой-нибудь шейдер, например, LifeDetected. У меня он не отображался на НПС.
Изменение репутации для пользователя Lexo
LexoOffline
Сообщение №2143
написано: 30 июня 2016, 17:45
| Отредактировано: Lexo - 30 июня 2016, 18:21
Кстати, Multigone, проблема... Когда скрипт кидает заклинание для проверки, то, даже если заклинание попадёт, есть же вероятность, что враг будет смотреть куда-нибудь в сторону. Тогда эффект не возвратится и скрипт не сработает. Что делать?
К тому же у меня какая-то байда... я слегка переделал скрипт:
Spell property CheckActorSpell auto ; заклинание-проверка Spell property ActorYesSpell auto ; ответ на заклинание-проверку MagicEffect Property pM2 Auto ; Эффект заклинания-проверки.
Spell property DragonTuumSpell auto ; драконий крик Idle property DragonTuumIdle auto ; анимация Sound property DragonTorShul auto ; звук крика
Actor FollowersDrago ; Дракон
Actor selfref
Event OnEffectStart(actor T, actor C)
selfref = T OnUpdate() ; Старт.
ENDEVENT
EVENT OnUpdate() IF CheckEffect() ;Debug.Notification("Зажигаем!") FollowersDrago.PlayIdle(DragonTuumIdle) DragonTorShul.play(FollowersDrago) DragonTuumSpell.Cast(FollowersDrago) ENDIF
RegisterForSingleUpdate(1.0) ; ENDEVENT
Bool FUNCTION CheckEffect() ; Основная функция-проверка. If (FollowersDrago.IsInCombat()) CheckActorSpell.Cast(FollowersDrago) ; Бьем заклинанием и ждем ответа. Int iC = 50 ; Даем 0.5с на возврат.
WHILE iC && !FollowersDrago.HasMagicEffect(pM2) ; Ждем, пока эффект ответа не будет на источнике или не истечет время. Utility.Wait(0.01) iC -= 1 ENDWHILE
IF iC ; Если время не истекло. FollowersDrago.DispelSpell(ActorYesSpell) ; Снимаем. RETURN true ENDIF EndIf ; По умолчанию возвр. false. ENDFUNCTION
Проблема в том, что он не кидает заклинание. Не пойму почему... специально делал заклинание с видимым эффектом для проверки и ставил не на актёра, а на цель... не кидает, и всё тут. Если убираю всё, кроме проверки на бой - то в бою он постоянно "дышит" заклинанием... а как только добавляю остальные - перестаёт.
EVENT OnUpdate() IF !FollowersDrago.IsInCombat() ; Боя нет - проверяем редко. RegisterForSingleUpdate(5.0) ELSEIF !CheckEffect() ; Бой есть, цели под носом нет - проверяем часто. RegisterForSingleUpdate(1.0) ELSE ; Сработало - следующая проверка по заказу. FollowersDrago.PlayIdle(DragonTuumIdle) DragonTorShul.play(FollowersDrago) DragonTuumSpell.Cast(FollowersDrago) RegisterForSingleUpdate(10.0) ENDIF ENDEVENT
Bool FUNCTION CheckEffect() ; CheckActorSpell.Cast(FollowersDrago) ; Int iC = 3 ; Даем 0.35с на возврат. Снизил число неэффективных проверок. Utility.Wait(0.05) WHILE iC && !FollowersDrago.HasMagicEffect(pM2) ; Utility.Wait(0.1) iC -= 1 ENDWHILE IF iC ; FollowersDrago.DispelSpell(ActorYesSpell) ; RETURN true ENDIF ENDFUNCTION
***
А, разобрался. Первое заклинание не работало. Если не указывать цель заклинания, то оно будет ударять по линии взгляда актера, за исключением, когда имеет TargetActor и актер - НПС. Тогда просто ничего происходить не будет. Поэтому, нужно изменить первое заклинание на Aimed, его эффекту указать невидимый снаряд (луч?). У меня заработало на НПС.
Извините, народ, но не могу не написать - очень интересный вопрос возник.
Возможно ли сделать такой скрипт, который брал бы имя одного персонажа и назначал его на другого?
Хочу сделать ритуал воскрешения, но в другом облике, что бы исчезал полностью старый персонаж, на его месте появлялся другой, но с таким же именем.
P.S.: Думаю, подобную вещь можно произвести с помощью команды SetRace и добавления невидимой брони (всё как у вампира-лорда), но вдруг можно сделать так, как я описал выше?
Добрый день! В общем, хотелось бы сделать, чтобы благословения от алтарей в игре были бесконечные по длительности, да еще и не удаляли друг друга. То есть если на тебе висит благословение, скажем, Акатоша, то при активации алтаря, скажем, Кинарет, добавлялось блаогсловение Кинарет, и оставалось благословление Акатоша, и так со всем алтарями. Но каким образом это реализовать не совсем понимаю. Скачал Creaation Kit, покапался, натункулся, что вроде все алтари активируются скриптом TempleBlessingScript, то есть если этот скрипт подредактировать, то и все алтари будут работать как я хочу. Но не совсем понятно как скрипт работает. В идеале хотел сделать так, чтобы при активации алтаря игроку накидывалось благословение, но если благословение этого алтаря уже висит на игроке, то оно снималось. Можете посоветовать как реализовать, пожалуйста?
Изменить тип благословений на Ability, отредактировать все затронутые маг. эффекты - вместо FF указать Constant (нужно сделать копии, т. к. те эффекты используются и в др. заклинаниях). Использовать этот скрипт в активаторах (заполнить переменные). Можно просто поменять текст ванильного (его заголовок не трогать) и скомпилировать (не рекомендую):
Scriptname _temp extends ObjectReference
Spell Property TempleBlessing Auto Message Property BlessingMessage Auto Message Property AltarRemoveMsg Auto
Event OnActivate(ObjectReference akActionRef) Actor xActor = akActionRef AS Actor IF !xActor ELSEIF !xActor.HasSpell(TempleBlessing) xActor.AddSpell(TempleBlessing, false) if xActor == Game.GetPlayer() BlessingMessage.Show() endif ELSE xActor.RemoveSpell(TempleBlessing) if xActor == Game.GetPlayer() AltarRemoveMsg.Show() endif ENDIF EndEvent
За снятие одних благословений при наложении других отвечает флаг Dispel Effects в их маг. эффектах. Сомневаюсь , что флаг сработает (???), когда эффекты станут Сonstant, но лучше его убрать (во всех).
PS: Скрипты, добавленные модами на базовые объекты (в данном случае это активаторы), не будут работать на конкретных референсах, если референсы уже записаны в сохранение, с которого стартует мод. Это означает, что все уже встреченные алтари не будут изменены. Проверь, может, я не прав.
Изменение репутации для пользователя qwertynosik
qwertynosikOffline
Сообщение №2150
написано: 14 июля 2016, 09:42
| Отредактировано: qwertynosik - 15 июля 2016, 15:53
Изменить тип благословений на Ability, отредактировать все затронутые маг. эффекты - вместо FF указать Constant (нужно сделать копии, т. к. те эффекты используются и в др. заклинаниях). Использовать этот скрипт в активаторах (заполнить переменные)
Тип благословения нужно менять в файле типа AltarAkatoshSpell (что соответствует благословению Акатоша), да? Там есть типы: малая способность, особая способность и просто способность. В чем их разница? По поводу копий эффектов не очень понимаю как сделать, можно поподробнее? И со скриптом, просто сделать новый скрипт и заменить стандартный "TempleBlessingScript" в файле "ShrineofAkatosh" новым, так?
Даешь ему в шапке свое название (вместо _tеmp); файл .psc должен называться так же. Компилируешь. Открываешь активатор, удаляешь старый, добавляешь новый. Указываешь все Property, как они были. Не укажешь, работать не будет. Сохраняешь. Повторяешь для других активаторов. Как я уже говорил, можно тупо заменить текст в ванильном. Для этого делаешь бекап .psc, в ванильном пишешь свой текст (шапку не трогать), сохраняешь и компилируешь, возвращаешь бекап на место ванильного .psc. В результате у тебя будет модифицированный .pex и ванильный исходник. Это не лучший путь, но он позволяет не трогать активаторы.
Изменение репутации для пользователя Lexo
LexoOffline
Сообщение №2152
написано: 15 июля 2016, 18:23
| Отредактировано: Multigone - 23 апреля 2020, 15:22
Слушайте, у меня тут проблема... создаём заклинание... планировалось сначала создать призыв существа (блуждающий огонёк), который будет всё время находиться рядом и лечить (только лечить, и ничего больше)... получилось всё, кроме одного - существо в бою начинает убегать куда-подальше... пробовали ставить пакет Follow, пробовали Follow to Player - ничего не помогает, поэтому, решили изменить идею:
Сделали заклинание призыв магического света, который будет лечить игрока... и всё было хорошо - когда эффект висит, он лечит игрока при повреждении... когда эффект заканчивается - не лечит... но... когда кастуешь эффект второй раз - он лечит 2 раза и перестаёт... в чём может быть проблема?
Spell Property HealOther Auto ;- Лечение Spell Property GrandHealing Auto ;- Великое Лечение Actor Property Player auto MagicEffect Property _WisplHealerLightFFSelf auto float property Health95 = 0.95 auto float property Health50 = 0.5 auto
Event OnEffectStart(actor target, actor caster) RegisterForSingleUpdate(2) EndEvent
Event onupdate() if (Player.HasMagicEffect_WisplHealerLightFFSelf)) if (Player.GetActorValuePercentage("health") < Health95) && \ (Player.GetActorValuePercentage("health") > Health50) HealOther.Cast(Player, Player) ;- Лечим elseif (Player.GetActorValuePercentage("health") <= Health50) GrandHealing.Cast(Player, Player) ;- Сильно Лечим RegisterForSingleUpdate(2) EndIf else ;ничего не происходит EndIf EndEvent
Event onupdate() if (Player.HasMagicEffect_WisplHealerLightFFSelf)) ; Это маг. эффект со скриптом? Если да, эта проверка не нужна. Обновление авто-отменяется после завершения эффекта. if (Player.GetActorValuePercentage("health") < Health50) GrandHealing.Cast(Player, Player) ; Сильно Лечим elseif (Player.GetActorValuePercentage("health") < Health95) HealOther.Cast(Player, Player) ; Лечим EndIf EndIf RegisterForSingleUpdate(2.0) EndEvent
Я бы добавил заклинанию еще один эффект со слабым постепенным лечением (и условием в заклинании "здоровье < 95%"), тогда HealOther вообще не нужен. А проверку привязал бы не только к обновлению, но и к получению урона, чтобы после удара лечение срабатывало мгновенно, затем следовала перезарядка 2с. Но хозяин - барин. К тому же, может, так и задумано.
Всем привет скажите пожалуйста можно ли в диалоге с NPC в момент диалога - скриптом сделать или ещё чем нибудь - что бы после завершения диалога наш игрок Player убил ( сам по себе ) того с кем говорил, желательно от первого лица.
Такое вообще реально реализовать, ума не приложу каким образом, может использовать cat сцены? а как из диалога запустить Cat сцену?
Уважаемые знатоки, ответьте пожалуйста: каким образом можно снять заклинании наложенное на ГГ при помощи функции Cast? Что-то не нашел... Конструкция Game.GetPlayer().RemoveSpell(SleepDis) - не работает.
Доброго времени суток , Multigone и ко. Давненько не заходил на форум и не задавал вам глупых вопросов Не знаю , соскучились вы или нет , но я хотел бы посоветоваться насчёт одного скрипта , который недавно нашёл в моде на перки Ordinator и он меня очень заинтересовал , как и весь мод. Понравились несколько перково-скриптовых механик , они показались мне уникальными.
Сейчас хочу обсудить одну из них.
Вообщем это перк-заклинание - Двемерские автопушки. При изучении перка , нам выдаётся абилка-талант , с помощью которого мы можем вызывать около себя двемерскую установку , которая стоит на месте и стреляет , как артиллерия. Сам скрипт:
Activator Property FXEmptyActivator Auto Activator Property ORD_Smh_DwarvenAutocannon_Activator Auto Float Property ORD_ShootZ Auto Float Property ORD_DistanceInFront Auto Float Property ORD_UpdateRate Auto Float Property ORD_DistanceZ Auto Spell Property ORD_Smh_DwarvenAutocannon_Spell_Proc Auto Sound Property ORD_Smh_DwarvenAutocannon_Marker_Deploy Auto Sound Property ORD_Smh_DwarvenAutocannon_Marker_Destroyed Auto
; remote control Perk Property ORD_Smh30_RemoteControl_Perk_30 Auto Activator Property ORD_Smh_DwarvenAutocannon_Activator_RemoteControl Auto Float Property ORD_RemoteControlDist Auto
; electrobolt Int Property ORD_Electrobolt Auto Spell Property ORD_Smh_DwarvenAutocannon_Spell_Proc_Electrobolt Auto Explosion Property ORD_Smh_DwarvenAutocannon_Explosion_Electrobolt Auto Perk Property ORD_Smh50_Electrobolt_Perk_50 Auto
; spin up Perk Property ORD_Smh80_SpinUp_Perk_80 Auto Float Property ORD_SpeedUpDelta Auto
; firing line Perk Property ORD_Smh70_FiringLine_Perk_70 Auto Float Property ORD_AngleDelta Auto Float Property ORD_Min Auto
; ingredient MiscObject Property ORD_Smh_DwarvenAutocannon_Misc Auto
; -----
Float ShootRate Bool SpinUp Int ShotCount ObjectReference ShootStart ObjectReference ShootAim ObjectReference TheCannon Actor TargetActor Bool IsRemoteControl
; -----
Event OnEffectStart(Actor akTarget, Actor akCaster)
Преследую сразу несколько целей , по его усовершенствованию и адоптации под себя. Что-то подобное я уже обсуждал на этом форуме с АлексТирексом , там были невидимые маркеры , которые путём скрипта кастовали спеллы. Этот же скрипт выглядит как-то разнообразнее и поинтереснее.
Первое , что хотелось бы сделать , это добавить 2 , 3 , 4 , 5 пушку в этот скрипт так , чтобы они стреляли. пока у меня это ну вообще никак не получается , вернее получается с помощью дополнительной функции: TheCannon = akTarget.PlaceAtMe(ORD_Smh_DwarvenAutocannon_Activator, 5) или: сделать новый objectreference TheCannon2 и прописать: TheCannon2 = akTarget.PlaceAtMe(ORD_Smh_DwarvenAutocannon_Activator) так добавляется столько , сколько мне нужно , но они ни в какую не хотят стрелять чтобы я не делал. Максимум , чего удалось добиться : это делать дубликаты этого MGEF и добавлять разные эффекты с дубликатов MGEF в ту самую абилку-талант.