Вы спросите, зачем нужна эта статья? Разве нельзя использовать скриптовые заклинания?Конечно можно, но у них есть некоторые ограничения. Например, вы хотите сделать комбинацию из нижеследующего:
- «Тихо» нанести повреждения NPC, то есть не видя никаких магических эффектов.
- Сделать игрока невидимым так, чтобы не было видно руку, колдующую заклинание.
- Какое-то заклинание считается враждебным, только стражник видит, как я его колдую.
- Колдовать заклинание аля Morrowind, которое может не сработать, или нанести случайное кол-во повреждений оружием.
- Колдовать заклинание, которое наносит огненное повреждение инеевым атронахам, а огненным атронахам наносит повреждение холодом.
- Узнать, кто колдовал заклинание на меня или на другого актера.
Теперь все это можно сделать! Нижеследующее основано на том, что заклинания-способности колдуются сразу же, как только добавляются в список заклинаний, а также они не вызывают никаких визуальных изменений на колдующем или его цели. А необходимые визуальные эффекты вы можете добавить через PlayMagicShaderEffect или PlayMagicVisualEffects и т.д.
Вот простейший пример, как создать простейшее «тихое» заклинание, наносящее 10 ед. повреждений мгновенно на избранную цель.
- Шаг 1 – создайте заклинание типа Способность, скажем "SilentDm10" с эффектом: "Понижение здоровья 10" и скриптовым эффектом: "StopSilentDm10" .
- Шаг 2 – создайте следующей скрипт для магических эффектов "StopSilentDm10" :
scn StopSilectDm10 short doOnce Begin ScriptEffectUpdate if doOnce Dispel SilentDm10 endif set doOnce to 1 End Begin ScriptEffectFinish RemoveSpell SilentDm10 End
- Шаг 3 – используйте это заклинание в каком либо другом скрипте:
; target – ссылка на актера (или игрока) target.AddSpell SilentDm10
Примечание: добавление способности игроку вызовет появление сообщения, и заклинание не будет «тихим». Поэтому я бы изменил имя заклинания на что-нибудь более подходящее, например, "Отравление" . Вы не увидите больше одного сообщения "Добавлено Отравление" , если у всех ваших заклинаний-способностей будет одно имя.
Настоящие программируемые заклинания более полезны. По сути, они являются комбинацией внутриигровых функций и нескольких обычных заклинаний.
Вот простой пример. Он позволяет вам нанести цели случайные повреждения от X до X+Y:
scn WildDamageSpell ; это внутриигровая функция на объекте 'FIGWildDamageSpell' ref target short baseDamage short wildDamage short isPlayerHostile short dam Begin OnActivate ; обнаруживаем цель set target to GetActionRef if target.IsActor == 0 || target.GetDead == 1 Return endif ; считаем кол-во повреждений set dam to baseDamage+wildDamage*0.01*GetRandomPercent ; если заклинание враждебное – простая проверка, только для игрока if dam > 0 && isPlayerHostile > 0 if target.IsGuard == 0 target.Startcombat player endif SendTrespassAlarm player player.ModCrimeGold 35 endif ; добавляем какой-нибудь нетипичный графический эффект (не обязательно!) if dam > 0 target.PME DTCT 1 endif ; наносит повреждения – здесь они ограничены от 0 до 31 ; dam <= 0 ничего не делает, dam > 31 дает 31 if dam >= 16 target.AddSpell SilentDm16 ; тот же SilentDm10, что и в предыдущем пример, но дает 16 повреждений set dam to (dam)-16 endif if dam >= 8 target.AddSpell SilentDm08 ; дает 8 повреждений, и так далее... set dam to (dam)-8 endif if dam >= 4 target.AddSpell SilentDm04 set dam to (dam)-4 endif if dam >= 2 target.AddSpell SilentDm02 set dam to (dam)-2 endif if dam >= 1 target.AddSpell SilentDm01 endif End
Чтобы колдовать это заклинание:
; target – ссылка на актера, предполагается, что заклинание колдует игрок set FIGWildDamageSpell.baseDamage to 10 set FIGWildDamageSpell.wildDamage to 20 set FIGWildDamageSpell.isPlayerHostile to 1 FIGWildDamageSpell.Activate target 1
Продвинутые эффекты:
Здесь все ограничено вашей смекалкой и воображением. Вот несколько вещей, которое можно сделать:
1) Заклинания-таймеры: Поскольку внутриигровые функции могут использовать блок GameMode, небольшая модификация скрипта позволит запускать его каждую секунду (или каждый кадр) в течение любого времени.
2) Эффекты для касания/цели/области: Поскольку внутри игровые функции могут вызываться где угодно, можно создать обычное заклинание с нужным набором целей, а потом в скриптовом эффекте вызывать нужную функцию на целях.
3) Заклинания с центром на игроке: Можно использовать заклинания, кастующиеся с активатора на игрока, а использование внутриигровых функцию дает вам полный контроль над ними.
4) Отслеживание колдующего: Добавьте ref-переменную в скрипт функции под названием 'caster' и устанавливайте ее перед вызовом функции. (можно также задать переменные для целей.)
5) Симулирование сопротивления, цены заклинания: Все это можно запрограммировать с помощью условий!
6) NPC колдуют заклинания: Заставить актера X немедленно колдовать заклинание на цель Y просто. Заставить его колдовать, когда это бы сделал RAI, может быть потруднее. Можно попробовать самому симулировать AI (AAI), с помощью постоянного заклинания.
Постоянные заклинания:
Самое смешное, что заклинания-способности не годятся для наложения постоянных эффектов – даже для игрока! Дело в том, что при смене ячейки заклинание удаляется и накладывается снова, то есть все переменные в скриптовом эффекте сбрасываются.
Конечно, для игрока не все так страшно, поскольку для него можно использовать глобальные переменные в блоке ScriptEffectUpdate. Еще хуже то, что добавление способности добавляет ее всем актерам этого типа в игре. (Вот почему в примере заклинание удаляется после 1 фрейма.)
Конечно, это хорошо, если вам надо, чтобы заклинание наложилось на всех актеров и исполнялось, только когда рядом игрок.
Данная статья взята с неработающего ныне сайта tiarum wiki. Статья является переводом данной статьи http://cs.elderscrolls.com/index.php?title=Programmable_Spell_Effects за авторством GuidoBot. Переводчик Gwathlobal (OSFM team).
Рекомендуемые комментарии
Комментариев нет
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти