Исходный код скайрима
Guten Abend, meine liebe Genossen и сегодня очередная часть "повествования" о том, как идет процесс "подгонки" Скайрима под мои нужды.
И, прежде чем продолжить, хотелось бы обратиться к новым подписчикам, которые успели появиться с момента выхода прошлой части:
Товарищи, мне не известно, насколько вам интересны мои публикации. Если вы подписались потому, что вам интересен мой контент - спасибо и добро пожаловать, я всегда рад новым "целевым" подписчикам.
Однако, иногда бывает так, что подписывается совершенно случайный человек, который "оказался рядом", увидев, к примеру, мой комментарий в совершенно стороннем посте. Если вы - один из таких, убедительная просьба - не ставьте минусов публикациям лишь по той причине, что их содержание не пересекается с вашими интересами. Поверьте, это не только нагоняет тоску, но и отбивает всякое желание дальше публиковать что-то.
А теперь мы продолжаем. Как вы уже успели заметить из моих предыдущих постов - я медленно, но, верно, делаю дом игрока на манер локации "Туманная роща".
Обливион - это не пещера, не дом и не замок. Простому смертному туда не попасть через дверь. Разорвать ткань Обливиона могут лишь те, кто познал мастерство магии.
Блин, да кому вообще интересен весь этот напыщенный пафос? В общем, господа, сегодня мы будем делать заклинание, которое будет телепортировать игрока в локацию и обратно. Причем не абы как, а с сохранением исходной точки! Откуда ушли, туда и пришли. А в этом нам поможет Папирус - скриптовый язык Скайрима.
Итак, начнем с простого. У нас уже имеется так называемый COCMarkerHeading, вот его и задействуем. Для тех, кто далек от этой темы - данный маркер обозначает место, в которое игрок будет телепортирован при использовании консольной команды "сос имялокации". К слову, в обычных помещениях используются схожие маркеры, определяющие, где окажется игрок после прохождения через дверь.
Также для для реализации данной задумки понадобится вспомогательная локация. Для чего она нужна? Чтобы не плодить мусор в основной локации, все объекты, которые задействованы в работе, отправляются в неё.
Таковая у меня уже имеется. В неё мы помещаем так называемый XMarkerHeading, и переименовываем в MGHMarkTeleport - так нам будет удобнее. Для чего он нужен? Об этом расскажу ниже. Также в этой локации можно заметить кучу суровых нордских мужичков - это NPC которые необходимы для нормального функционирования плодородной земли - каждая "грядка" ссылается на своего NPC. 30 посадочных мест - 30 немытых нордов. И, собственно, наш маркер:
Топаем в раздел Magic - Spell. Тут хранятся все имеющиеся заклинания. Создаем новое. Вписываем ID, имя, временный placeholder для описания, а также назначаем эффект.
Стоп, что? Какой эффект?
Ах, да, все заклинания устроены весьма интересным образом.
Spell - заклинание, которое появляется, собственно, в разделе заклинаний.
При чтении заклинания активируется привязанный эффект. Этот самый эффект и надо будет создать. Для этого топаем в Magic - Magic Effect и создаем новый. Видим кучу всего непонятного:
На самом деле, всё довольно понятно.
ID - собственно, ID.
Name - пока не разобрался, замещено placeholderom, потом глянем, где всплывет.
Effect Archetype - выставлено "Скрипт". Это значит, что магический эффект сам не будет делать ничего, а отдаст эту обязанность скрипту.
Casting type - "Выстрелил и забыл". И ежу понятно - один раз прочитали, скрипт активировался и всё. После этого можно читать еще раз.
Delivery - v subbotu указывает, на кого применяется результат заклинания - на цель, или же на себя.
Magic Skill - колдовство. Отвечает за сортировку - в какой вкладке будет заклинание.
Minimum Skill Level - пока не разобрался, что это и на что влияет.
Визуальные эффекты - подглядываем в какое-нибудь готовое заклинание и повторяем. Собственно, это и есть визуальные эффект - для огненного шторма будут эффекты огня, для ледяного лед, у нас же эффекты призыва.
Звуки - они и в Африке звуки.
А теперь самое интересное - скрипт!
Добавляется он кнопочкой Add, что справа внизу.
Но, для начала, давайте разберемся с логикой работы скрипта.
Вот, собственно, и он сам. Кому надо - забирайте.
Scriptname MGHScriptTeleport extends ActiveMagicEffect
ObjectReference Property Marker Auto
ObjectReference Property Mark Auto
Cell Property TargetCell Auto
Event OnEffectStart(Actor Caster, Actor Target)
If Caster.GetParentCell() != TargetCell
Utility.Wait(1.0)
Mark.MoveTo(Caster)
Caster.MoveTo(Marker)
Что это вообще такое? Ну, если понимать что к чему, то всё довольно понятно:
Scriptname - служебная фраза, обозначает начало скрипта.
MGHScriptTeleport - имя скрипта.
extends - служебная фраза. Дословно - "Расширяет" или же "Основывается"
extends ActiveMagicEffect - основывается на "Родителе" ActiveMagicEffect
А теперь немного логики. Вот как работает скрипт:
Для начала мы объявим "свойства":
ObjectReference Property Marker Auto
ObjectReference Property Mark Auto
Cell Property TargetCell Auto
Что есть свойства? Свойства позволяют использовать один скрипт множество раз.
К примеру, я хочу сделать два заклинания - первое телепортирует в первый дом, а второе - во второй.
Тогда бы мне пришлось писать два разных скрипта:
Игрок.ТелепортироватьВ - Дом_1
Игрок.ТелепортироватьВ - Дом_2
Через свойства это можно сделать одним скриптом:
Игрок.ТелепортироватьВ - СвойствоДом
И после этого уже сделать два заклинания и каждому сослаться:
Не понятно, да? Ладно, продолжим.
Предположим, игрок стоит в Вайтране и читает скрипт первый раз, дабы перенестись в локацию.
"Стоит в Вайтране" - то есть, стоит где угодно, но не в конечной локации.
Для того, чтобы проверить это условие, впишем строку:
If Caster.GetParentCell() != TargetCell
ПозицияИгрока НеРавна СвойствоЛокация - вот тут просто ссылаемся на нашу локацию, а не жестко прописываем её имя.
Utility.Wait(1.0) - подождать одну секунду, дабы сперва мы увидели графический эффект от чтения заклинания.
Mark.MoveTo(Caster) - "Метка" - тот самый маркер MGHMarkTeleport, который находился ранее во вспомогательной локации и на который мы ссылаемся в свойствах, передвигается на место игрока. Всё! Метка размещена и игра помнит, где она находится!
Caster.MoveTo(Marker) - Заклинатель, то есть игрок, перемещается на место, где расположен другой маркер - COCMarkerHeading, то есть, который расположен в основной локации и при перемещении на него, игрок перемещается в локацию.
С этим всё! Но, помните строчку?
"Стоит в Вайтране" - то есть, стоит где угодно, но не в конечной локации.
Эту работу осуществляет всё та же строчка кода:
If Caster.GetParentCell() != TargetCell
А нужный код помещает под условием Иначе
Utility.Wait(1.0) - ждем секунду
Caster.MoveTo(Mark) - игрок перемещается обратно на метку, которая расположилась в месте первого чтения заклинания и ждет не дождется, когда когда мы на неё вернемся.
EndIf - конец цикла "Если/То/Иначе"
EndEvent - конец кода (события, вообще-то - это немного другое)
Ничего не понятно, да?
Ладно, попробую рассказать это всё нормальным, человеческим языком:
Вот вам три свойства:
Читаем заклинание первый раз:
Нет! Значит, мы хотим туда попасть!
Размещаем Метку туда, где стоим, пусть дожидается нас.
Отправляемся в Локацию.
Читаем заклинание второй раз:
Угууу! Значит, мы хотим попасть обратно.
Тогда просто перемещаемся на метку, которая нас уже ждет.
Дело осталось за малым.
Вставляем текст нашего скрипта и компилируем.
Переходим в Свойства скрипта и начинаем связывать Свойста с нужными объектами:
Mark ссылается на Маркер, который будет ставиться нам под ноги.
Marker ссылается на Маркер, который расположен там, где мы окажемся после чтения заклинания.
TargetCell - ссылаемся на нашу локацию - AAAMGHaven. ААА - временный префикс для сортировки локации вверх списка. MGHaven - Misty Grove Haven, то бишь "Убежище в Туманной роще"
Консольные команды предназначены для выявления и устранения багов и добавляют большое количество возможностей для игрока. Данные команды доступны только в PC версии.
Во время игры нажмите клавишу [
] («тильда») для того, чтобы вызвать консоль. После чего вводите один из нижеприведённых кодов для активации необходимого действия.
Квестовые команды
Команда | Описание |
---|---|
sqs <ID квеста> | Показать все стадии квеста. |
getstage <ID квеста> | Показать номер текущей стадии квеста. |
setstage <ID квеста> <стадия> | Перейти к стадии квеста по её номеру. |
completeallobjectives <ID квеста> | Пометить все задачи квеста как выполненные. |
resetquest <ID квеста> | Перейти к стартовой стадии квеста. |
setobjectivecompleted <ID квеста> <стадия> <состояние> | Установить все задачи стадии квеста в состояние «выполнено» (1) или «не выполнено» (0). |
setobjectivedisplayed <ID квеста> <стадия> <состояние> | Установить состояние задач стадии квеста (0 - выключено, 1 - включено). |
movetoqt <ID квеста> | Переместить героя к текущей цели квеста. |
StartQuest <ID квеста> | Начать квест. |
CompleteQuest <ID квеста> | Завершить квест. |
showquesttargets | Показать ID и цели активных квестов. |
sqt | То же самое. |
saq | Начать все квесты игры (может вызвать сбой игры). |
caqs | Завершить все квесты игры (может вызвать сбой игры). |
Навигатор по ID кодам
Общие команды
Команды изменения персонажа
На The Elder Scrolls Wiki есть два режима редактирования: визуальный редактор и исходный код (далее ИК). Все данные располагаются в ИК, а визуальный редактор лишь преобразует викитекст для наглядности.
Викитекст — это комбинация разных команд, как оригинальных, так и взятых из HTML. В сумме он предоставляет весьма широкий спектр возможностей, поэтому полную инструкцию уместить в одну статью сложно. Здесь описаны наиболее частые приёмы, используемые при работе с исходным кодом.
Если вы не найдёте здесь описание нужного метода, можете оставить комментарий на стене обсуждения одного из администраторов или техников проекта.
Сворачиваемая таблица
Цвета в спойлерах можно менять, как и цвет текста. Если вам нужен сложный цвет, его можно подобрать в палитре GIMP или Photoshop. В примечаниях ниже приведена ссылка на подборку цветов и их коды. Также в спойлеры можно добавлять изображения и к тексту в них применимы все перечисленные выше способы форматирования.
Содержание
Спойлер
Спойлер — это тип оформления, при котором часть текста по умолчанию скрыта.
Дополнительные функции
Подпись
В основном используется код
Разделительная линия
Это разделительная линия.
Акроним
Исходный код, комментарии
- ↑ В тег <pre> нельзя заключать много текста, так как в подавляющем большинстве браузеров он будет «уезжать» за правый край страницы и для его прокручивания будет появляться горизонтальный скролл.
- ↑ Эффекта, аналогичного <pre>…</pre> можно добиться, просто начав строку с пробела.
- ↑ Комментарии используются для того, чтобы спрятать часть кода или сообщить что-либо следующим редакторам.
Переключатели
Переменные
Второй уровень
Третий уровень
Четвёртый уровень
Одиночные переносы
не влияют
на разметку.
Строка один
Строка два
Без отступа
:С отступом
::С двойным отступом
Списки
* Первый уровень
** Второй уровень
**: Пример отступа для второго уровня
- ↑ 1,01,1 В большинстве случаев применяют именно ненумерованный список. Нумерованный список нужен лишь тогда, когда действительно нужно перечисление.
Колонки
- первое слово
- второе слово
- третье слово
- четвёртое слово
- пятое слово
- шестое слово
- седьмое слово
- ↑ Так как на небольших экранах страницы The Elder Scrolls Wiki довольно узкие (минимальная ширина 700 пикселей), не рекомендуется разбивать текст на четыре и более колонок.
Форматирование текста
Использование консоли
Ввод команд
- Команды не восприимчивы к регистру: «A» и «a» идентичны;
- Для навигации используются кнопки PgUp и PgDn ;
- Нули в начале кода можно игнорировать, например:
Данный метод не работает с объектами из дополнений, так как в их командах в первых двух цифрах используется указатель порядка XX.
Объектные команды
Данные команды работают только с объектами. Для выбора объекта нужно кликнуть по нему в консоли. Желательно, чтобы объект был виден без помех, типа тумана, снега и прочего. Также можно выбрать объект с помощью команды prid <RefID> .
Префиксные команды
Некоторые команды требуют префикса в начале. Для примера:
Основное наполнение статей
Ссылки
Разделы, абзацы и строки
Работа с изображениями
Простая вставка
- ↑ Команды можно писать по-русски:
- thumb = мини
- left = слева
- right = справа
- center = центр
- px = пкс
Галерея
Несколько однотипных изображений, используемых для оформления статьи можно оформить в галерею. Обычно галереи располагаются внизу страницы. Для того чтобы оформить самую простую галерею достаточно перечислить в столбик названия файлов изображений (без уточнения Файл:) и заключить их в теги <gallery> … </gallery>, которые нужно поставить, соответственно, над и под списком названий файлов.
<gallery>
Высасование жизненных сил Даунгард.jpg|Подпись 1
VampireLord.jpg|Подпись 2
</gallery>
Однако, как видно из примера, такое оформление зачастую выглядит не самым эстетичным образом. Для того, чтобы облагородить галерею существует ряд дополнительных переменных для тега <gallery> … </gallery>, с помощью которых можно изменять размеры изображений галереи, расположение галереи на странице, превратить галерею в слайд-шоу и многое другое. Рассмотрим эти переменные в таблице ниже.
Объектные команды
- <% × 10> Процентное соотношение уровня к главному герою (1000 = 100.0%)-
- <1 уровень +/-> На сколько выше или ниже уровня.
- <начальный уровень> Самый начальный уровень неигрового персонажа.
- <предельный уровень> Максимальный уровень неигрового персонажа, до которого он может развиваться.
Заплатить штраф во владениях. Либо при выбранном неигровом персонаже, либо нужно добавить в начале player. .
X = 1: Убрать похищенные предметы. 0: Не убирать. Y = 1: Пойти в тюрьму. 0: Не идти в тюрьму.
Добавить персонажу фракцию. Либо при выбранном неигровом персонаже, либо нужно добавить в начале player. . Возможные значения для ранга фракции могут быть различными, но 0 — это всегда добавления персонажа в фракцию с минимально возможным рангом, а –1 — удаление персонажа из фракции.
Примеры некоторых фракций, которые можно добавить персонажам, приведены ниже:
Запятые в шаблонах
- В шаблоне вместо запятой введите %2C (Пример: Дверь%2C которая шепчет). Именно так сделана ссылка на уже упоминавшийся квест в статье Нелкир.
- В шаблоне вместо запятой используем Шаблон:, (Пример: Анасси> особый друг.) Тогда Шаблон:Персонаж проигнорирует эту запятую как разделитель и результат будет как в статье Анасси.
Читайте также: