- •Скрипты Морровинда для чайников
- •Предисловие к восьмому изданию
- •Вступление Как использовать это руководство.
- •Что такое скрипт?
- •Что могут скрипты?
- •Чего не могут скрипты:
- •Обучающий курс
- •Поехали!
- •Окно редактора скриптов
- •Чего мы хотим?
- •Написание скрипта
- •Имя для скрипта: Begin и End
- •Обнаружение действий игрока
- •Вывод текста и получение решений игрока
- •Как выполняются локальные скрипты
- •Ваш первый баг
- •Наложение заклинания на игрока
- •Как узнать больше?
- •Синтаксис
- •Начало и завершение скриптов
- •Общий синтаксис функций:
- •Общий синтаксис: запятые, скобки и пробелы.
- •Комментарии
- •Отступы / использование табуляторов
- •Переменные Типы переменных
- •Локальные переменные
- •Глобальные переменные
- •Использование переменных в других локальных скриптах и объектах
- •Использование переменных в функциях
- •Операторы / математические расчеты
- •Проверка условий Использование условий if… elseif
- •Условия While
- •Создание булевых операторов в скриптах tes
- •Список функций tes Объяснение формата
- •Работа с объектами Работа с вещами в инвентаре Добавление и удаление вещей из инвентаря
- •Сброс предмета на пол
- •Отслеживание активности инвентаря: Добавление, сброс и использование камней душ
- •Надевание предметов
- •Отслеживание, был ли надет предмет
- •Выключение возможности надеть предмет
- •Проверка присутствия предметов в инвентаре
- •Починка предметов
- •Информация о надетых объектах
- •Функция UsedOnMe
- •Движение и создание объектов
- •Движение вдоль оси объекта
- •Движение вдоль оси мира
- •Установка позиции (другой путь, чтобы сгенерировать движение)
- •Позиционирование объектов в мире или во внутренних ячейках
- •Перемещение объекта в его оригинальную позицию
- •Помещение предмета рядом с игроком
- •Создание предметов рядом с объектом
- •Создание копий объектов с помощью PlaceItem
- •Вращение и углы
- •Вращение объектов
- •Установка углов
- •Функции размеров
- •Определения локации, относительного положения и движения Определение нахождения игрока в интерьере или в экстерьере
- •Определения ячейки игрока
- •Расстояние от одного объекта до другого
- •Определяем позицию и поворот объекта
- •Линия видимости
- •Определяем, замечен ли один актер другим
- •Определяем, когда игрок покинул ячейку
- •Определяем, путешествует ли игрок
- •Триггеры для актеров, стоящих на объектах
- •Повреждение актера, стоящего на объекте
- •Функции сталкивания объектов
- •Проверка активации предмета и его активация
- •Запирание и отпирание дверей или сундуков
- •Анимирование объектов
- •Доступные и недоступные объекты
- •Полное удаление копии
- •Не сохранять изменений объекта
- •Скрипты для npc: ии и движение npc идет в новую локацию
- •Проверка, завершил ли npc свое движение
- •Поворачиваем актера в нужном направлении
- •Задание случайного перемещения Актера
- •Актеры активируют объекты
- •Следование и эскорт
- •Определение текущего пакета ии
- •Заставляем актера красться
- •Заставляем актера бегать и прыгать: Движения в Трибунале
- •Проверка действий игрока: бежит, прыгает, крадется?
- •Определение готовности к бою
- •Заставляем кого-то падать
- •Доля в экипировке и другие функции компаньонов
- •Раса, Фракция и Ранг Определение расы
- •Определение статуса игрока во фракции
- •Изменение реакции и положения во фракции
- •Определение и изменение реакции
- •Функции для оборотней Установка атрибутов оборотня
- •Специальные глобальные переменные для оборотней
- •Текст и Диалог Краткая инструкция по диалогам
- •Концепция диалогов в Морре
- •Как работает диалог
- •Несколько золотых правил
- •Диалог 101
- •Функции для диалогов
- •Показ сообщений
- •Показ переменных и предопределенного текста в окне сообщения
- •Пример: Дурацкий простой скрипт, демонстрирующий весь возможный синтаксис:
- •Добавление темы для диалога
- •Начало и окончание диалога
- •Инициация диалога с оборотнем (Bloodmoon)
- •Множественный выбор – как задавать вопросы
- •Добавление записей в журнал и тест записей журнала
- •Специальные диалоговые функции
- •Изменение значения Hello
- •Полезные диалоговые переменные
- •Изменяем и проверяем Навыки, Атрибуты и другие характеристики Get, Set, and Mod Stats – общие замечания
- •Определение и изменение характеристик игрока и актеров: Определение и изменение атрибутов:
- •Определение и изменение Здоровья, Магии и Усталости:
- •Определяем и изменяем скиллы:
- •Определение и изменение уровня
- •Начало и конец боя
- •Обнаружение атак
- •Функции Get/Mod/Set ии для Боя: Fight, Flee, Alarm
- •Отслеживание убийств и нокаутов
- •Воскрешение мертвого Актера
- •Преступления Определение и изменение уровня преступлений
- •Заключение игрока в тюрьму
- •Очистка игрока от преступлений
- •Уровень преступления игрока
- •Полезные глобальные переменные
- •Магия Ограничение на телепортацию
- •Ограничение левитации
- •Проверка и работа с душами и камнями душ
- •Id камней душ:
- •Добавление и удаление заклинаний и проклятий
- •Кастование заклинаний
- •Управление и тестирование заклинаний
- •Управление и тестирование эффектов заклинаний
- •Тестирование болезней
- •Функции Get/Mod/Set для магии:
- •Звук Пусть актеры говорят
- •Проигрывание музыки
- •Проигрывание звуков
- •Управление звуком
- •Форматы звуковых файлов:
- •Следим за временем
- •Глобальные переменные, зависящие от времени
- •Течение дней
- •Фазы лун
- •Погода Изменение погоды
- •Изменение установок погоды для региона
- •Определение текущей погоды
- •Определение скорости ветра
- •Средства управления игрока Игрок спит
- •Включение и выключение средств управления и интерфейса Отключение средств управления
- •Включение средств управления
- •Проверка статуса средств управления
- •Переключение в вид от первого и от третьего лица
- •Функции для меню генерации персонажа
- •Определение открыл ли игрок меню
- •Использование MenuTest, чтобы открыть и закрыть меню
- •Различные функции и переменные Прерывание выполнения скрипта
- •Управление глобальными скриптами
- •Уменьшение и увеличение яркости
- •Добавление локации на карту
- •Присваивание случайных значений переменным
- •Проигрывание видео
- •Функции Уровневых Списков
- •Квадратный корень
- •Функции уровня воды
- •Советы и трюки Маленькие помощники: поиск, копирование и вставка текста
- •Альтернативные скриптовые редакторы
- •Используйте стиль для написания нормальных скриптов
- •Чистка вашего мода
- •Ограничения редактора скриптов
- •Сохранение процессорного времени
- •Нацеленные скрипты: запуск «глобальных» скриптов, привязанных к объекту
- •Проверяем, когда игрок загружает игру
- •Использование переменной CharGenState – отключение сохранения и меню
- •Обнаружение использования свитков или книг
- •Заставляем Актеров переключать оружие
- •Магические и механические ловушки
- •Скриптовая телепортация
- •Тестируем на присутствие другого мода
- •Безопасный старт глобальных скриптов — избегая скрипт main
- •Использование звука для обнаружения событий
- •Большие сражения
- •Руководство по созданию объектов для езды
- •Выбор объектов
- •Создание/Удаление объектов
- •Падение с объектов
- •Обнаружение столкновений
- •Проблема с сохранением
- •Скрипт по тригонометрии – быстрый синус и косинус
- •Манекены
- •Она на меня смотрит?
- •Кинематическая последовательность
- •Решение проблем Основные советы
- •Консоль Использование консоли для проверки переменных:
- •Использование консоли для быстрой проверки скриптов:
- •Сообщения об ошибках, неправильная работа и обычные причины в игре, когда исполняется скрипт: в редакторе
- •Внутриигровые сообщения:
- •AiTravel не работает
- •Вылет при исполнении скрипта
- •Вылет при загрузке плагина
- •Приложение Новые функции Трибунала
- •Изменения / исправления скриптов Морровинда:
- •Список новых функций Трибунала:
- •Новые функции Бладмуна
- •Список новых функций и переменных Бладмуна:
- •Ранее недокументированные функции
- •Единицы измерения:
- •Список магических эффектов
- •Список консольных команд
- •Игровые установки
- •Алфавитный указатель
Повреждение актера, стоящего на объекте
HurtStandingActor, float_HP/s
HurtStandingActor –3
Object_ID -> HurtStandingActor 1
Float hurt_variable
HurtStandingActor, hurt_variable
Эта функция влияет на здоровье актера (включая игрока), который стоит на объекте. Отрицательное значение лечит, положительное значение уменьшает здоровье (очков в секунду). Использование отрицательных значений может привести к увеличению здоровья больше максимального значения. Эта функция может принимать переменные типа float в качестве значений.
Пример: Эффект хорошо знаком по лаве:
begin lava
if ( menumode == 1 )
return
endif
if ( CellChanged == 0 )
if ( GetSoundPlaying "lava layer" == 0 )
PlayLoopSound3DVP "lava layer", 1.0, 1.0
endif
endif
HurtStandingActor, 20.0 ;20 ед повреждения в сек
end lava
Функции сталкивания объектов
GetCollidingPC (returns Boolean/short)
GetCollidingActor (returns Boolean/short)
if ( GetCollidingPC == 1 )
HurtCollidingActor, damage_enum
HurtCollidingActor, 100
Object_ID -> HurtCollidingActor, 100
Эти функции, вызванные на объекте, позволяют определять, взаимодействует (сталкивается) ли объект с актером. GetCollidingPC возвращает 1, если игрок сталкивает с объектом, и 0 в противном случае. GetCollidingActor делает тоже самое, только для всех актеров (включая игрока). HurtCollidingActor повреждает дотронувшегося до объекта актера (как HurtStandingActor).
Пример:
Когда этот скрипт помещен на объект, любой актер, дотронувшийся до объекта, будет получать повреждения. Сообщение при этом зависит от того, игрок ли это или другой актер.
Begin hurtActor
if ( GetCollidingPC == 1 )
MessageBox "Вы кричите от боли, когда дотрагиваетесь до скалы."
Elseif ( GetCollidingActor == 1 )
MessageBox "Кто-то рядом кричит от боли."
Endif
HurtCollidingActor 100
End
Проверка активации предмета и его активация
Обычно предмет активируется, когда вы нажимаете кнопку пробел, чтобы “использовать” его. У большинства предметов есть стандартные действия, которые происходят при их активации: двери открываются, сундуки показывают свое содержимое, актеры начинают диалог и т.д. Функция OnActivate позволяет перехватить вызов стандартного действия и сделать что-то другое или в начале проверить условия:
OnActivate
If ( OnActivate == 1 )
Принимает значение 1 в том кадре, когда объект активирован. OnActivate сбрасывается, после вызова, так что только один скрипт может его обработать. Также используйте только один вызов OnActivate в скрипте. Чтобы выполнить стандартное действие над объектом при вызове OnActivate, вы должны использовать команду активации:
Activate
activate (если скрипт на активированном объекте)
Activate может использоваться как инициатор стандартного действия после вызова OnActivate.
Стандартные действия, вызываемые Activate:
Двери -> Открыть (Возможно, не работает с оригинальным Мором, в версии 1.6.1820 работает).
Загружающие двери -> Ничего (сломана?25)
Контейнеры -> Открыть (показать содержимое)
Книги/свитки -> Показывает текст для чтения*.
Активаторы -> Ничего
Актеры -> Диалог
Оружие -> Подбор
Броня -> Подбор
Разное -> Подбор
Не тестировалось, но я предполагаю:
Надеваемый свет -> Подбор
Другой свет -> Ничего
Щупы -> Подбор
Алхим. аппараты -> Подбор
*(Но, похоже, это отключает опцию «взять». Также может создавать проблемы без использования однократных условий. См раздел Советов и Трюков для решения этих проблем)
Пример:
Следующий скрипт хорошо демонстрирует использование функции OnActivate. Он присоединен к контейнеру (сундуку), который НЕ показывает, что на нем установлена ловушка, как обычные внутриигровые контейнеры:
Begin Trap_script short done if ( OnActivate == 1 ) if ( done == 1 ) ;однократное условие Activate return else Cast, "flame", Player ;повредить игрока set done to 1 Activate ; Вызвать стандартное действие: сундук открывается endif endif End trap_script
Примечание: Согласно моим тестам, Activate не может использоваться без OnActivate в одном и том же скрипте. OnActivate и Activate могут быть в разных частях скрипта. Однако Activate не будет работать, если OnActivate не была вызвана перед этим. Также есть сообщения, что объект должен быть вручную активизирован хотя бы раз в 72 часа, иначе игра забывает, что OnActivate было вызвано перед этим. Попробуйте этот скрипт, чтобы узнать все самим (я его применил к двери26):
Short done
if ( OnActivate == 1 )
MessageBox "Спасибо за активацию"
endif
if ( done == 0 )
If ( GetDistance, Player < 100 )
set done to 1
MessageBox "Игрок закрывает"
endif
endif
if ( done == 1 )
If ( GetDistance, Player > 200 )
MessageBox "Sesame"
Activate
set done to 0
endif
endIf
End
MessageBox "Игрок закрывает"
endif
endif
if ( done == 1 )
If ( GetDistance, Player > 200 )
MessageBox "Sesame"
Activate
set done to 0
endif
endIf
End
Begin GBG_closing_door
Begin GBG_activate
Short done
if ( OnActivate == 1 )
MessageBox "Спасибо за активацию"
endif
if ( done == 0 )
If ( GetDistance, Player < 100 )
set done to 1
MessageBox "Игрок закрывает"
endif
endif
if ( done == 1 )
If ( GetDistance, Player > 200 )
MessageBox "Sesame"
Activate
set done to 0
endif
endIf
End
Также были сообщения, что существует другие трудности с функцией OnActivate. Исходя из моего опыта, использование только одного OnActivate - самый безопасный способ обойти их. Также используйте OnPCEquip, когда хотите использовать предмет из инвентаря на себя, OnActivate при этом не вызывается.
Информация от UESP: существует недокументированная особенность Activate, которая заключается в указании игрока после функции, например
begin RemoteContainer
short OnPCEquip
if ( OnPCEquip == 1 )
set OnPCEquip to 0
"dh_remote_chest_01"->Activate, player
endif
end
Если контейнер имеет свойство references persist, этот скрипт должен открыть его, где бы игрок ни был. Это великолепная возможность создавать переносные контейнеры и т.п.