• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней. • Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней. • При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС. • При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "+" полезного сообщения.
Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.
Красное солнце Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
Тоже столкнулся с таким. Такая команда в моём квесте отказалась запускать ванильный. Причём, именно с моими квестами таких проблем не было. Безуспешно пытался найти разницу и отказался от этого запуска, благо он и не очень был нужен. Дополнительные команды типа startquest мне там не помогали.
Dsion, не не не, ничего такого , сами команды есть (я уже проверил), просто на том сайте где я смотрел они почему то небыли задокументированы.
Myprism, а у меня наоборот, мой квест не запускается ни через startquest ни через setstage. Что меня очень радует, так как это мне и нужно ! (наверное старта нету из за условий запуска квеста, прописанных в SM Event Node)
Ребят, подскажите скрипт запуска квеста каждый определённый день недели =) Я так понял надо 2 квеста, 1 постоянный будет отслеживать день недели и запускать 2-й квест...
Int Property iFriday = 0 Auto ; Желаемый день в неделе, в который будет происходить запуск. По умолчанию: понедельник (0). Диапазон: [0 - 6] ; Принималось, что старт новой игры происходил в понедельник (я хз, что там на самом деле). ; Т.е. GetCurrentGameTime() == 0.0 по этому алгоритму должно соответствовать понедельнику, 00:00 чч.мм. ; В противном случае все будет работать, просто дни недели (указанный здесь и в действительности в игре) могут не совпадать. Float Property fDesirableHour = 0.0 Auto ; Желаемое время дня (в часах), в которое будет происходить запуск. По умолчанию: (0 ч 0 мин). Диапазон: [0 - 24] ; Если сегодня 21:00, а запуск должен был произойти в 6:00 этого дня, он произойдет через 153 ч., т.е. почти через неделю после момента инициализации этого квеста. ; После первого запуска квест будет запускаться повторно ровно через неделю, т.е. через 168 часов.
Очень нужно чтобы создание персонажа при начале новой игры происходило в строго обозначенном мною месте, в новой локации то бишь. Попытки найти скрипт или нечто подобное в других модах результата мне не дало (Не нашёл короче говоря).
Очень нужно чтобы создание персонажа при начале новой игры происходило в строго обозначенном мною месте, в новой локации то бишь. Попытки найти скрипт или нечто подобное в других модах результата мне не дало (Не нашёл короче говоря).
По-моему, игрок вообще нигде не появляется, если не использовать на нем MoveTo. В одном из первых скриптов главного квеста, есть строчка, которая перемещает игрока на стартовую позицию. Если эту строчку закомментировать, то игра вообще не начинается.
Не так, чтоб "вшит"... На одной из стадий игрока просто одевают в одежду заключенного и перемещают на стартовую позицию. Тебе, наверное, нужно: 1) Предотвратить запуск главного квеста. 2) Сделать свой квест, который будет перемещать игрока в нужную тебе позицию. 3) На каком-то этапе запустить таки главный квест, но не с начала, а с той стадии, которая тебе нужна.
1) Предотвратить запуск главного квеста. 2) Сделать свой квест, который будет перемещать игрока в нужную тебе позицию. 3) На каком-то этапе запустить таки главный квест, но не с начала, а с той стадии, которая тебе нужна.
Ой ёй, звучит страшно для меня. Попробую что-нибудь сделать.
Изменение репутации для пользователя Dsion
DsionOffline
Сообщение №1271
написано: 8 октября 2014, 17:14
| Отредактировано: Dsion - 8 октября 2014, 17:15
Если вариант с отключением главного квеста через ini не подходит, можно еще отредактировать стадию 0 на главном квесте (MQ101), чтоб она останавливала ванильный квест и запускала твой. Я оба варианта проверил.
Добавлено (08 Октября 2014, 21:14) --------------------------------------------- После [General]там новая линия начинается. Не знаю, почему чертов форум не дает её поставить.
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №1272
написано: 8 октября 2014, 17:32
| Отредактировано: Multigone - 8 октября 2014, 17:39
EVENT OnSpellCast(Form akSpell) IF akSpell == MySpell IF GetRef().GetAnimationVariableBool("MyString") MyGLOB.Mod(100.0) RegisterForSingleUpdate(1.0) ENDIF ENDIF ENDEVENT
EVENT OnUpdate() IF MyGLOB.GetValue() >= 100.0 MyGLOB.Mod(-100.0) ENDIF ENDEVENT
Игрок последовательно создает 2 заклинания и интервалом 0.5 секунд. Событие обновления произойдет тоже дважды? Или оно произойдет один раз через (0.5 + 1) секунд после создания первого заклинания? Этот момент мне не совсем ясен.
Просто если второй вариант, значение глобальной будет ломаться полностью. Вариант с Utility.Wait(1.0) мне не подходит, т.к. после MyGLOB.Mod(100.0) будет еще объемный кусок кода (его необходимо выполнить, не ожидая), который добавит к этой секунде доп. время, затраченное на расчеты. А мне нужно, чтобы значение глобальной менялось строго на 1.0 секунд реального времени.
На creationkit.com написано вот такое: Subsequent calls to ResisterForSingleUpdate will override previous ones - i.e. calling it back to back will result in the second registered update occurring, but not the first. It will not interfere with updates started by RegisterForUpdate however.
То есть, вторая регистрация полностью выбивает первую. По идее, событие сработает через секунду после второго каста...
Ребята, хочу создать магический эффект, который скриптом вешается на игрока. Так вот, нужен такой эффект, который НЕ БУДЕТ позволять ГГ пользоваться криками и магией. Тоесть они будут не активны, ну или что то типа такого. Это вообще возможно реализовать?
Как можно для ванильной расы назначить заданный слот брони для отображения в виде от первого лица? Подробнее так: тем слотам брони, которые должны отображаться в виде от первого лица, надо поставить галочку в свойствах расы. Всё будет хорошо, кроме одного - раса будет изменена и это чревато конфликтами с другими модами, меняющими эту расу. Да и в принципе это неправильно, без нужды менять ванильный объект. Вот поэтому я хочу это делать скриптом. В этом случае, раса бы модифицировалась но не заменялась на изменённую.
Ребят помогите у меня есть кольцо которое души драконов превращает в перки. Но с проходом времени золота становиться столько что кажется ты и императора купить можешь как дописать выбор-за души или золото? Это чисто для себя. Ещо интересно а можно сделать покупку стотов типа здоровья-манны и запас сил?
Зачем заморачиваться? Раз уж ты забил на честность и решил читерить, просто установи себе 100000 хп, маны и выносливости через консоль. И добавь все перки.
Добавлено (23 Октября 2014, 19:01) --------------------------------------------- Можно еще завершить все квесты через консоль... Ну чтоб хвалиться, что прошел Скайрим.
Надо вычислить сколько было затрачено маны пока игрок применял произвольное заклинание с типом Концентрация. Никак не могу сообразить как это провернуть, не изменяя все заклинания на концентрацию(мало ли какие модовские заклинания установлю).
Есть событие OnSpellCast. С его помощью я узнаю стоимость заклинаний типа Fire and Fogot. Но для заклинаний с типом концентрация выдает только стоимость 1 секунды, а не всего периода работы заклинания.
Sovetski, самый простой вариант: сделать зелье Poton, к нему прицепить MagicEffect с таким скриптом. Scriptname AddHeal Extends ActivemagicEffect Event OnEffectStart(Actor akTarget, Actor akCaster) akTarget.ModActorValue("Health", 10.0) EndEvent И дать это зелье торговцу. Для повышения маны и выносливости замени в скрипте Health на Magicka или Stamina
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №1282
написано: 23 октября 2014, 19:42
| Отредактировано: Multigone - 23 октября 2014, 19:16
Sovetski, вот скрипт, его нужно прицепить к своему кольцу. Какой у тебя был до этого способ, я без понятия, поэтому лучше создай новое кольцо. Или прицепи к тому самому кольцу, предварительно удалив у него скрипт, ответственный за предыдущий способ получения очков способностей.
Scriptname _MySCRIPT extends ObjectReference
Import Game
MiscObject Property Gold001 Auto ; Золото. Автозаполнение. Message Property MyMESG Auto ; Сообщение. Заполнение вручную.
Event OnEquipped(Actor akActor) ; Событие при экипировании предмета с прикрепленным к нему данным скриптом. IF akActor == GetPlayer() ; Если экипирующий = игрок. Int iChoice = MyMESG.Show() ; Показать сообщение, запомнив выбор ответа игрока. IF iChoice == 0 ; Если выбор = 0 GetPlayer().ModAV("DragonSouls", -5) ; Уменьшить атрибута игрока "драконьи души" на величину 5 ед. По желанию - любое значение, но не забыть изменить и в сообщении. AddPerkPoints(1) ; Добавить (игроку) очков способностей в кол-ве 1 ед. Debug.Notification("Добавлено 1 ед. очков способностей.") ; Показать сообщение. В кавычках можно писать любой текст по желанию. ELSEIF iChoice == 1 ; Иначе, если выбор = 1 GetPlayer().RemoveItem(Gold001, 25000) ; Удалить у игрока предмет "золото" в кол-ве 25000 ед. По желанию - любое значение, но не забыть изменить и в сообщении. AddPerkPoints(1) Debug.Notification("Добавлено 1 ед. очков способностей.") ENDIF ; Конец проверки. ENDIF ENDEVENT ; Конец события.
Как будет в игре: при экипировании кольца появится окно с сообщением и вариантами выбора. Варианты доступны, если игрок имеет золото или души больше, чем указано. После выбора одного из вариантов добавляется 1 ед. очков способностей и удаляются души / золото. Нужен тест. Все.
Добавлено (23 Октября 2014, 23:42) --------------------------------------------- Kepper, попробуй так:
EVENT OnUpdate() IF GetRef().GetAnimationVariableBool("IsCastingRight") || GetRef().GetAnimationVariableBool("IsCastingLeft") || GetRef().GetAnimationVariableBool("IsCastingDual") RegisterForSingleUpdate(0.2) ELSE fCurrent -= GetRef().GetAV("Magicka") IF fCurrent > 0 ; Значение fCurrent определяет, сколько было потрачено маны в процессе каста. ENDIF ENDIF ENDEVENT
Суть - кол-во затраченной маны определяется по разнице между значениями маны в начале каста и в конце. Недостатки: возможна некорректное определение результата, если в процессе каста с одной руки референс-алиас вдруг вздумает кастовать со второй (ну и так далее). По-идее, для каждого типа каста (с одной, с другой или с обеих) нужно делать свои расчеты. Во всяком случае, для этого способа никакого SKSE не нужно.
...или если он выпьет зелье в процессе каста, или если по нему попадет шок-магия, или если на нем закончится бафф или дебафф, изменяющий количество маны.
Но предложить нечего... Можно сделать функцию аналогичную ивенту OnSpellCast, но которая будет вызываться каждую секунду пока персонаж колдует. Но это не надежно и данные получатся только приблизительные...
Добавлено (24 Октября 2014, 00:31) --------------------------------------------- Вспомнил еще про знак атронаха и перк "Ward Absorb", которые тоже запросто могут добавить ману в процессе каста...
Изменение репутации для пользователя Multigone
MultigoneOffline
Сообщение №1284
написано: 23 октября 2014, 20:36
| Отредактировано: Multigone - 23 октября 2014, 20:37
Dsion, кстати, я с помощью этого метода сделал то, что не удавалось долгое время - замутил заклинание "огненный барьер" из Dungeon Siege 3. Его описание: поглощает суммарный урон в размере 75% здоровья заклинателя, после чего взрывается и прочее. Как сосчитать полученный урон? Вот только таким образом.
А вот и сам скрипт (он несовершенен, писал давно):
EVENT OnMagicEffectApply(ObjectReference akCaster, MagicEffect akEffect) IF akCaster as Actor == Target IF (akEffect.HasKeyword(MagicArmorSpell) || akEffect.HasKeyword(MagicCloak)) && !(akEffect.HasKeyword(_MVABarrierKYWD)) _MVABarrierDispelSPEL.Cast(Target) ENDIF ENDIF ENDEVENT
Правда, заклинатель погибал, если величина хита была больше, чем его здоровье. Теперь я понимаю, что нужно было бы еще давать 90% сопротивление уронам (или повышать ХП) на время действия эффекта.
Multigone, Dsion, спасибо за наводку. Вариант с СКСЕ и подсчётом времени с помощью EVENT OnUpdate() будет оптимальным.
Добавлено (31 Октября 2014, 19:16) --------------------------------------------- Никак не могу забороть кракозябры в выводимом сообщении. Такое сообщение выводится в читаемом виде: Debug.MessageBox("Компаньон предпочитает носить обувь на каблуках") (кодировка UTF-8)
Но хочется сделать покрасивее чтобы подставлялось имя актёра. Debug.MessageBox(tgActor.GetLeveledActorBase().GetName() + " предпочитает носить обувь на каблуках") На выходе же получаю нормальное имя НПС и кракозябры.
Столкнулся с такой проблемой - как мне создать обычный xmarker под ногами ГГ, что бы тот, смог телепортироваться в него обратно? Тоесть не в него а на его месторасположение? Скажем так - "метка возврата".
Изменение репутации для пользователя Dsion
DsionOffline
Сообщение №1289
написано: 6 ноября 2014, 19:01
| Отредактировано: Dsion - 6 ноября 2014, 19:02
Создать что-то: ObjectReference MarkerRef = PlayerRef.PlaceAtMe(XMarker)
Но если что-то создал, нужно не забыть удалить. Тебе это действительно надо? Можно ведь просто сохранить координаты игрока, а потом его туда перемещать методом SetPosition. Или хоть не создавать новый маркер каждый раз, а создать один единственный и перемещать его.
Dsion, да мне нужно, что бы игрок к примеру на стадии квеста 10 перемещался по нужному мне маркеру, неважно откуда, а потом, к примеру, сос тадии 20 премещался обратно на то же место, где и был в момент 10 стадии.
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)