В этом уроке будет рассказано, как создать Spell Tome (или проще говоря, книгу, после прочтения которой игроку будет добавлено заклинание). Вам нужно создать книгу, вставить в нее какой-нибудь текст, и добавить скрипт, который будет добавлять игроку заклинание. Если вы ничего не знаете о скриптинге, или вы новичок в TES CS, я надеюсь, что вы сначала почитаете другие обучающие материалы, а затем вернетесь, когда изучите основы. Мой первый скрипт – это прекрасный обучающий материал для изучения азов скриптинга.
Начало
Откройте TES CS и загрузите Oblivion.esm (и какой-нибудь существующий файл .esp, если вы хотите добавить книгу, обучающую заклинанию, в него). Если вы планируете создать новый плагин, тогда перейдите в главное меню (File>Save) и сразу сохраните его, назвав, например, SpellTomeTutorial. Это позволит вам избежать возможных проблем с падением редактора при попытке создания нового файла плагина позже, когда вы проделаете большой объем работы и захотите её сохранить.
Создание тома (книги)
Откройте Object Window (Окно объектов) и раскройте категории 'Items' > 'Book' > 'Clutter' и выберите 'Book'. Теперь выберите одну из книг в списке (например, 'Book1CheapGuideAnvil'), правый клик на ней и в появившемся меню выберите edit (редактировать). Измените ID на что-то вроде 'aaaSpellTome' (таким образом, ее будет легко найти вверху списка книг. Прим. Если используется расширитель редактора CSE, то добавлять ааа в начало ID нет необходимости, т.к. все записи, добавляемые вашим модом, будут и так на самом верху в своих категориях, к тому же выделены цветом.) и измените name (название) на такое, которое вам нравиться. Также, пока вы еще здесь, очистите весь текст в окне справа, и убедитесь, что у книги нет зачарования (Enchanting), обучения (Teaches) или скрипта (на данный момент). Жмите OK, и когда у вас спросят, желаете ли создать новый объект, выбирайте yes (да).
Заклинание
Вы не сможете создать книгу, обучающую заклинанию, без самого заклинания. В этот момент вы можете выбрать, использовать уже существующее в игре заклинание, или создать новое. Я не буду здесь рассказывать, как создать новое заклинание, но вы можете почитать об этом, например, здесь. Неважно, какой вариант вы выберете, главное то, что вам нужен будет ID заклинания. В этом обучающем материале я буду использовать существующее заклинание 'StandardFrostDamageTarget1Novice'.
Скрипт
Нам нужно создать скрипт, который мы прикрепим к нашей книге, и благодаря которому игроку будет добавляться заклинание. Вернемся к главному меню, перейдем Gameplay>Edit Scripts… Идем вперед, открываем окно для написания скриптов и создаем новый скрипт (Script>New). Наберите в окошке текст, который вы видите ниже, и нажмите Save (Сохранить). Далее я объясню, как это работает.
scn aaaSpellTomeScript short doonce short buttonpressed int button begin onActivate if doonce == 0 MessageBox "Вы желаете изучить заклинание Снежный заряд?", "Да", "Нет, возможно позднее" set doonce to 1 set buttonpressed to 1 else Message "Вы уже получили все знания, которые содержатся в этой книге" endif end begin GameMode if buttonpressed == 1 set button to GetButtonPressed if button == 1 set doonce to 0 set buttonpressed to 0 Message "Хорошо, возможно вы пожелаете учиться позднее" elseif button == 0 set buttonpressed to 0 Player.AddSpell StandardFrostDamageTarget1Novice Message "Используй эти знания мудро" endif endif end
Как работает скрипт
Первая часть скрипта содержит его название и объявляет переменные.
scn aaaSpellTomeScript ;название скрипта short doonce ;переменная, для того, чтобы скрипт сработал только один раз short buttonpressed ;помогает знать, нажал или нет игрок на кнопку int button ;здесь будем запоминать какая кнопка была нажата
Блок OnActivate исполняется каждый раз, когда вы открываете (активируете) книгу, и спрашивает вас, не желаете ли изучить заклинание, если вы его еще не изучили.
begin onActivate if doonce == 0 ;если указан 0, значит игрок еще не знает заклинание, предлагаем его выучить MessageBox "Вы желаете изучить заклинание Снежный заряд?", "Да", "Нет, возможно позднее" set doonce to 1 ;ставим 1, чтобы более не спрашивать игрока set buttonpressed to 1 ;указываем скрипту, что игрок что-то выбрал else ;иначе - говорим игроку, что он уже знает это заклинание. Message "Вы уже получили все знания, которые содержатся в этой книге" endif end
Блок GameMode исполняется каждый фрейм игры, проверяет, была ли нажата кнопка, и срабатывает, если это так.
begin GameMode if buttonpressed == 1 set button to GetButtonPressed ;смотрим, какая кнопка была нажат if button == 1 ;если игрок решил отказаться от изучения set doonce to 0 ;говорим скрипту, что мы должны позже спросить игрока вновь set buttonpressed to 0 ;указываем, что игрок пока что ничего не выбрал Message "Хорошо, возможно вы пожелаете учиться позднее" ;подтверждаем выбор игрока elseif button == 0 ;если игрок выбрал вариант "Да", то есть хочет выучить заклинание set buttonpressed to 0 ;говорим скрипту, что хотим закончить проверку нажатий кнопок ;добавляем заклинание игроку (не забудьте изменить EditorID на свое заклинание) Player.AddSpell StandardFrostDamageTarget1Novice Message "Используй эти знания мудро" ; подтверждаем выбор игрока endif endif end
Собираем все вместе
Теперь всё, что нам осталось сделать, это собрать сделанное ранее в кучу. Давайте этим и займемся.
Откройте окно редактирования своей книги, выберите в раскрывающемся списке script название своего скрипта (он должен быть в самом вверху). Если вы не можете его найти, перейдите вновь к редактированию своего скрипта и убедитесь, что вы установили тип скрипта как 'object', и сохраните свой скрипт (при этом не должно появится никаких ошибок).
В этот моменты вы также можете добавить текст в книгу, чтобы описать, что именно дает книга, или просто что-то сказать игроку, который будет это читать. Имейте ввиду, что читать текст игрок будет только после того, как решит, учиться заклинанию или нет. Нажмите OK в окне и сохраните свой мод.
Тестирование
Прежде всего, вам нужно убедиться, что вы сохранили свой плагин, после чего вам нужно узнать FormID вашей новой книги заклинаний. Как только вы сделаете это, запустите OblivionLauncher и выберите «Файлы данных». Убедитесь, что ваш плагин
отмечен и закройте окно.
Как только вы окажетесь в игре, открывайте консоль (кнопка ~ (тильда)) и набирайте следующее:
player.addItem [YOURFORMID] 1
замените [YOURFORMID] на Form ID книги, который вы нашли ранее. Откройте книгу и посмотрите на результат.
Очень важное отступление от переводчика
Есть пара важных моментов, на которых вы, наверняка, споткнетесь, если вы еще не являетесь хорошими знатоками редактора (а если вы таковыми являетесь, зачем вы это читаете?). Как узнать Form ID книги и что это вообще такое? Смотрим на картинку:
Справа от столбца Editor ID идет на самом деле не столбец Count, как может показаться на первый взгляд. Вы можете видеть там рядом две полоски. Растяните их и увидите, что это скрытый еще один столбец - Form ID. Если вы поспешили записать его для вашей книги и уже готовы мчаться в игру проверять свой мод, я вас еще немного задержу. Посмотрите внимательно на рисунок. Если я зайду в игру и попробую для тестового вызова ввести в консоли что-то вроде этого:
player.addItem 01000ED3 1
То, скорее всего, у меня ничего не выйдет. И я сейчас объясню почему. Form ID состоит из восьми цифр в шестнадцатиричной системе исчисления. Первые две это порядковый номер мода. Так как у меня в редакторе загружен мастер-файл Обливиона и мой мод, то первые две цифры предметов из моего мода будут показываться как 01. 00 – это предметы из мастер-файла, можете на рисунке и в редакторе в этом убедиться.
Однако и это еще не всё. Дело в том, что у вас наверняка стоит Золотое издание Обливиона. А если так, то уже установлены официальные моды. А порядковые номера модов предметам раздаются в момент загрузки их в игру. То есть вот эта запись
player.addItem 01000ED3 1
говорит игре – дай мне такой-то предмет из первого загруженного мода (01). Однако, у меня в Золотом издании мой мод стоит после всех официальных. И он получается аж двенадцатым esp-файлом. И чтобы вызвать предмет из него, мне нужно указать в
порядковом номере цифру 12. Это будет выглядеть вот так:
player.addItem 0С000ED3 1
С – это 12 в шестнадцатиричной системе исчисления. Конечно же, есть еще вариант сортировки модов при загрузке с помощью сторонних программ (например, OBMM). В этом случае вы можете принудительно поставить свой мод первым в загрузке и
протестировать его не задумываясь обо всех этих цифрах.
Кстати, то, что первые две цифры задают порядковый номер модов – одна из причин, почему мы не можем загрузить в игру более 255 модов. Две шестнадцатиричные цифры, выделеные для нумерации, в сумме могут давать всего лишь 256 комбинаций. Одна из них уже занята мастер-файлом (00). Остается 255.
Проблемы
Блок GameMode не выполняется, когда открыто какое-нибудь меню. Поэтому некоторые сообщения могут приходить немного с опозданием, когда вы закроете книгу и выйдете из инвентаря. Лучше (и проще) всего было бы давать игроку заклинание автоматически при активации книги (так как блок OnActivate не выполняется в меню), как бы то ни было, я хотел показать, как использовать MessageBox в данном контексте.
Скрипт не учитывает, есть ли у игрока уже заклинание или нет. Это можно изменить, используя вместо переменной 'doonce', проверку на наличие у игрока заклинания.
Книга
Еще одна проблема – вы не сможете книгу взять или прочитать (кроме тестов, когда вы добавляете книгу в инвентарь через консоль). Если вы хотите, чтобы книгу можно было брать, открывать и читать, нужно просто добавить Activate после OnActivate:
begin onActivate Activate if doonce == 0 MessageBox "Вы желаете изучить заклинание Снежный заряд?", "Да", "Нет, возможно позднее" set doonce to 1 set buttonpressed to 1 else Message "Вы уже получили все знания, которые содержатся в этой книге" endif end
Теперь вы сможете читать книгу.
Решение
Мы можем решить эти проблемы, немного изменив и упростив наш скрипт:
scn aaaSpellTomeScript short doonce begin onActivate Activate if doonce == 0 Player.AddSpell StandardFrostDamageTarget1Novice Message "Используй эти знания мудро" set doonce to 1 endif end
Как видите скрипт стал проще, мы убрали несколько переменных, полностью выкинули второй блок. В этом варианте у нас не будут спрашивать, хотим мы изучить заклинание или не хотим. При первой активации этой книги мы автоматически выучим новое
заклинание (при этом сможем сделать это лишь один раз) и сможем брать и читать книгу.
Дополнение от авторов сайта
На самом деле, данный скрипт, а именно его расширенная версия, не учитывает тот момент, что если книга взята, а заклинание не изучено, чтобы снова появился диалог с предложение изучить заклинание, книгу нужно выбросить из инвентаря и снова активировать. Решить проблему поможет дополнительный блок OnEquip:
begin OnEquip player if doonce == 0 MessageBox "Вы желаете изучить заклинание Снежный заряд?", "Да", "Нет, возможно позднее" set doonce to 1 set buttonpressed to 1 else Message "Вы уже получили все знания, которые содержатся в этой книге" endif end
И раз уж мы затронули эту тему, то нельзя не вспомнить про официальный DLC - SpellTomes. Он так же добавляет книги с заклинаниями, который игрок может изучить при прочтении. Давайте взглянем на один из его скриптов:
scn DLCTomeSCRIPTDLCTomeSpellAundaesAura2Apprentice short button short used begin OnEquip player if used == 0 MessageBox "Do you want to add 'Aundae's Aura' to your spell list?", "Yes", "No" endif end begin OnActivate Activate if isActionRef player == 1 && used == 0 MessageBox "Do you want to add 'Aundae's Aura' to your spell list?", "Yes", "No" endif end begin menumode set button to getbuttonpressed if button > -1 if button == 0 ; add the spell to the player's spellbook player.addspell DLCTomeSpellAundaesAura2Apprentice playsound SPLRestorationCast set used to 1 endif endif end
Как мы видим, отличий не много. Здесь отсутствуют лишние строчки с выводом сообщений, количество кнопок уменьшено до 2-х. Это, в итоге, позволяет нам отказаться от одной дополнительной переменной в коде. Но, в целом, смысл тот же. Работать будут оба варианта.
Статья взята отсюда: https://modder.ucoz.ru/load/tutorial_po_skriptingu_kniga_obuchajushhaja_zaklinaniju/3-1-0-182, автор: Игорь Лютый (Igor Ra), которая, в свою очередь, является переводом данной статьи.
Recommended Comments
There are no comments to display.
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now