- •Задачник по скриптам Обливиона Автор: Visman
- •Вступление
- •Задача 1: Автодобавление предметов
- •Задача 2: Записи в квестовом журнале
- •Задача 3: Автоактивация
- •Задача 4: Множественность ядовитости (ф-ии obse)
- •Задача 5: Ловушка (простая)
- •Задача 6: Почувствуй себя богом :) (заклинания и анимация)
- •Задача 7: Автоподбор (ф-ии obse)
Задача 3: Автоактивация
Задача:
Требуется заставить фонарь зажигать пламя при приближении и тушить его при удалении игрока.
Решение:
Используем ф-ию GetDistance для определения расстояния от объекта до игрока.
Сначала подготовим фонарь. Его создадим из объекта IronOutdoorLampPostYellow256, который находится в источниках света Light.
Переименуем его Editor ID в svaLampPostTestQ3 и на вопрос "Create a new object?" ответим "Да".
Далее создаем и сохраняем новый скрипт svaScriptTestQ3. Тип скрипта Object (задаем в поле Script Type).
scn svaScriptTestQ3
short flag; переменная будет отвечать за пламя (горит или нет)
; при загрузке объекта в игру
Begin OnLoad
; производим первоначальную настройку пламени
if ( GetDistance Player >= 300 ); если игрок далеко
RemoveFlames ; удаляем пламя
Set flag to 0 ; и переводим флаг в 0
else ; иначе игрок близко
AddFlames; значит добавляем пламя
Set flag to 1 ; и переводим флаг в 1
endif
End
; в игровом режиме
Begin GameMode
if ( flag == 0 ) ; если флаг указывает на то, что пламя не горит
if ( GetDistance Player < 300 ) ; проверяем положение игрока на близость к фонарю и если он близко
AddFlames ; включаем пламя
Set flag to 1 ; и флаг
endif
else ; иначе флаг указывает на горение пламени
if ( GetDistance Player > 400 ) ; тогда проверяем положение игрока на удаленность и если он далеко
RemoveFlames ; выключаем пламя
Set flag to 0 ; и флаг
endif
endif
End
Затем вернитесь к объекту svaLampPostTestQ3 в источниках света и пропишите в его свойствах скрипт svaScriptTestQ3. И установите радиус освещения Radius данного источника света равным 16 (чтобы не смущал :) ).
После этого поставьте два таких фонаря недалеко друг от друга в Торговом районе Имперского города и протестируйте их работу.
Задания:
1. Измените скрипт так, чтобы пламя пропадало не сразу после удаления игрока от фонаря, а через 10 секунд. (Смотрите ф-ию GetSecondsPassed)
2. Измените скрипт так, чтобы каждый раз при включении пламени на игрока кастовался огненный шар (заклинание StandardFireDamageArea3Journeyman). (Смотрите ф-ию Cast)
3. Создайте новый сундук и разместите на нем этот скрипт. Скрипт измените так, чтобы при приближении игрока к сундуку, сундук активировался автоматически (т.е. открывалось меню обмена вещами). (Смотрите ф-ию Activate)
4. Переделайте скрипт так, чтобы при первом посещении сундука возле него появлялось два бандита. (Смотрите ф-ию PlaceAtMe)
Задача 4: Множественность ядовитости (ф-ии obse)
Задача:
Нужно оружие, которое бы заряжалось ядом на три удара (такую задачу мне поставил JUMPER в свое время).
Решение:
Думаю стандартные средства КС не подойдут. Скрипт для оружия будем писать с помощью ф-ий OBSE.
Создаем и сохраняем новый скрипт svaScriptTestQ4. Тип скрипта Object (задаем в поле Script Type).
scn svaScriptTestQ4
ref rBO ; хранит ссылку на базовый объект (оружие)
ref Templar ; хранит ссылку на контейнер в котором лежит оружие
ref rPoison ; хранит ссылку на яд, который присутствует на оружие
ref rPoison2 ; хранит ссылку на яд, который присутвует на оружие при последующих проверках
short kolvo ; число использования яда
; в игровом режиме
Begin GameMode
; определяем ссылку на контейнер в котором находится оружие с этим скриптом
; НПС и игрок - это контейнеры, как и сундуки, и существа
Set Templar to GetContainer
If ( Templar.IsActor != 1 ) ; если оружие не у актера
Return ; прерываем выполнения скрипта, т.к. нет ни какого смысла тратить проц. время
endif
Set rBO to GetBaseObject ; определяем базовое оружие того на котором висит скрипт
If ( Templar.GetEquipped rBO == 1 ) ; если оружие в руке актера, будем обрабатывать ситуации
if ( kolvo == 0 ) ; если еще не был определен яд
Set rPoison to Templar.GetEquippedWeaponPoison ; то определяем на него ссылку
if ( rPoison != 0 ) ; и если он действительно присутсвует на оружие
Set kolvo to 1 ; включаем отчет числа использований яда
endif
elseif ( kolvo > 0 ) ; значит яд на оружие уже присутвует
Set rPoison2 to Templar.GetEquippedWeaponPoison ; какой на данный момент яд наложен на оружие
if ( kolvo > 3 ) ; яд уже использовался более 3 раз в атоматическом режиме
Set kolvo to 0 ; значит сбрасываем кол-во и начинаем обрабатывать ситуации с самого начала
elseif ( rPoison2 == 0 ) ; яд отсутсвует сейчас на оружие, значит он был использовать при ударе
Set kolvo to kolvo + 1 ; увеличиваем число использований на 1
if ( kolvo > 3 ) ; яд уже использовался более 3 раз в атоматическом режиме
Set kolvo to 0 ; значит сбрасываем кол-во и начинаем обрабатывать ситуации с самого начала
else ; иначе яд можно еще использовать в атоматическом режиме
Templar.SetEquippedWeaponPoison rPoison ; накладываем на оружие еще один раз тот же самый яд
endif
elseif ( rPoison2 != rPoison ) ; возникла ситуация - на оружие появился новый яд
Set kolvo to 0 ; значит сбрасываем кол-во использований яда и начинаем обрабатывать ситуации с самого начала
endif
endif
endif
End
Теперь создадим новое оружие svaWeapSwordTestQ4 из даэдрического короткого меча WeapDaedricShortsword путем переименовывания его Editor ID (на вопрос "Create a new object?" ответим "Да").
В свойствах нового меча в поле Script пропишите svaScriptTestQ4.
Киньте меч в игровой мир (например, в Торговый район Имперского города) и вперед на тестирование ядовитости :)
P.S. Об установке OBSE и использовании его с КС можете прочитать тут.
Скрипт на оружие должен работать не только в руках игрока, но и у любого актера.
Задания:
1. Измените скрипт так, чтобы число ударов оружием с ядом изменялось в зависимости от уровня Алхимии у актера держащего это оружие. При Алхимии<10 - скрипт себя не проявляем, ..., при Алхимии>90 - скрипт добавляет 9 ударов с тем же ядом. (Смотрите ф-ию GetActorValue)
