Добрый день всем, нужна помощь по скриптину, если эта тема ещё жива. Идея такая - при касте заклинания на призыв существа шанс успешного каста будет зависеть от наличия некоторых условий, как уровень навыка и наличия отсутствия перка. Насколько я понял, алгоритм должен быть следующий: 1. активировать скрипт на старте эффекта 2. проверить есть ли у кастера нужный перк (или другие условия) 2.1. если нет, дать getrandompercent для заклинания 2.2. если да, ничего не делать, т.к. по умолчанию спелл кастуется 100процентно
Почему я не сделаю это через creationkit, используя в одном заклинание два маг. эффекта, один из которых содержит условие на getrandompercent и отсутствие перка, а другой 100% шанс и условие на наличие перка? Потому что это работает не совсем корректно - процент вычисляется как нужно, и условия срабатывают так как должны, НО после получения нужных условий спелл призывает ВСЕХ кто не был призван когда условие не срабатывало. Т.е. если ДО взятия условий мы сколдовали 10 раз, из которых 7 были успешными, а 3 нет, то ПОСЛЕ взятия условий 3ое существ всё равно будут призваны, причем в то самое место, куда мы их призывали до взятия условий.
Предполагаю, что скрипты такой проблемы не имеют. Если же всё таки проблема останется, вижу другой алгоритм 1. осуществить призыв 2. проверить условия у кастера 2.1. если да, ничего не делать 2.2. если нет, убить призванное существо через какое-то время с каким-то шансом
Накидал вот что
Scriptname blabla extends activemagiceffect Int ChanceRandom; переменная для шанса Int ChanceRandomWaiting; переменная для времени ожидания event onEffectStart(Actor Target, Actor Caster) ; запускаем на старте маг. эффекта Actor Player=Game.GetPlayer() ;актер это игрок ChanceRandom=Utility.RandomInt(0,2) ;присваиваем 1 из 3ёх значений, использую как 33% шанс ChanceRandomWaiting=Utility.RandomInt(3,7) ;выбираем значение ожидание от 3 до 7 сек If Caster.GetBaseActorValue("Conjuration")<25 && ChanceRandom>0 ; ставим условия - уровень скила и 33% шанс Utility.Wait(ChanceRandomWaiting) ; ждём от 3 до 7 сек ВОТ здесь должно быть убийство призванного существа endif endevent
Изменение репутации для пользователя asdklghl
asdklghlOffline
Сообщение №2
| Тема: Вопросы по скриптам Papyrus
написано: 17 июня 2018, 18:17
| Отредактировано: Multigone - 21 апреля 2020, 20:43
Не верно, multigone В таком случае заклинание ВООБЩЕ не будет кастоваться до тех пор, ПОКА обозначенные условия не будут выполнены. Да, и лучше использовать getBASEactorValue - оно берёт базовое значение, а getActorValue возвращает текущее значение, со всеми бафами и дебафами.
Нужно писать скрипт, убедился в этом пока экспериментировал последние два дня - кит не позволяет создать полноценную динамическую систему условий. Он, собственно, почти написан. Не хватает только функции, которая позволит мне получить доступ к призванному существу. Скрипт будет проверять условия, и убивать призванное существо через какое-то время, давая нам попользоваться призванным небольшое время. Работает корректно, проверил с другими командами, например с placeatme, restoreAV и target.kill (которая, к слову, убивает кастера - видимо когда мы кастуем призыв, мы и target, и caster сразу, не смотря на то, что заклинание колдуется на землю). Единственное, что нужно добавить строку, дающую нам доступ к призванному существу.
ActorBase property summoned auto Actor summoned1 Int ChanceRandom; переменная для шанса Int ChanceRandomWaiting; переменная для шанса ожидания
event onEffectStart(Actor Target, Actor Caster) Actor Player=Game.GetPlayer(); актёр это игрок ChanceRandom=Utility.RandomInt(0,2); присвоить переменной для шанса 1 из 3 значений ChanceRandomWaiting=Utility.RandomInt(3,7); присвоить переменной для ожидания значение от 3 до 7 секунд If Caster.GetBaseActorValue("Conjuration")<25 && ChanceRandom>0; если уровень навыка колдовства меньше 25, шанс рандома 66% Debug.Notification("Функция сработает через " +ChanceRandomWaiting); выводим сообщение сработало ли условие и когда оно включится Utility.Wait(ChanceRandomWaiting); ждём случайное время, от 3 до 7 секунд summoned1 .kill(); вот эта строчка должна убивать призванное существо, но НЕ РАБОТАЕТ endif endevent
Касательно условий в ките, заклинание просто не кастуется, если ты не удовлетворяешь условиям. Моя задача сделать так чтобы выполнение условий выдавало тебе бонус в успешном касте, условно говоря, с 10% без условий и до 100% со всеми условиями. В любом случае, проблема решена, просто и универсально. Spell property theSpell auto Caster.DispelSpell(theSpell)
Не знаю что сразу не сообразил, все так просто было.
А теперь академический интерес. Чтобы summoned1 заработала, надо было ей присвоить значение призванного актёра? Если да, то знаешь как? Может быть, в будущем пригодится.
Как изменить количество отмычек в тюрьме? Мб за это отвечает какая-то global, или скрипт? Есть желание поменять их количество. На нексусе информации не нашёл по этому вопросу.