Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задачник по скриптам Обливиона.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.02 Mб
Скачать

Задача 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)