Квесты в Метине — это не просто набор заданий «принеси-подай». Это целые системы. С помощью квестов можно писать целые подземелья со сложной механикой, системы и даже эвенты. Дабы не быть голословным, вот несколько примеров из каждой категории: Башня Демонов, система питомцев и ОХ-эвент. В принципе в Метине много чего написано через квесты и много чего уникального и интересного можно реализовать, имея достаточно фантазии и навыков. А все потому, что квесты пишутся на языке программирования под названием Lua, который является очень простым в освоении. Более того, в интернете можно даже найти руководства, помогающие выучить язык за 15 минут, но вам их читать не рекомендую, т.к. те руководства ориентированы на программистов, знающих другие языки программирования, а также наш Lua чутка отличается от классического.
В данном руководстве и внутри документации используются термины, которые не используются в оригинальном Lua. Если в документации наткнетесь на непонятное слово, то загляните в этот список:
- Триггер — это квестовое событие, которое запускается пользователем. Например, при убийстве монстра. В коде триггеры встречаются в выражениях, начинающихся с ключевого слова
when
. Например, в выраженииwhen kill begin
триггером будет kill. Данный термин также может носить название «событие». - Семейство функций — это функции, сгруппированные по своему названию. Допустим, функции pc.give_item2() и pc.get_name() принадлежат к семейству pc, а функции item.get_id() и item.get_size() — к семейству item. Вроде понятно. Также данный термин может носить название «библиотека» и употребляться, например, как «библиотека pc».
- Vnum — это неуникальный ID объекта, о котором идет речь. Например, когда говорится «vnum предмета», то подразумевается поле (столбец)
vnum
в таблицеplayer.item_proto
. У предмета «Меч+8» vnum равен18
. Тоже самое касается и монстров. - VID — это уникальный идентификатор игрока или монстра. Каждый игрок и монстр на сервере имеет уникальный идентификатор (не путайте с ID персонажа и vnum монстра!). Некоторые функции требуют передачи в них VID. Узнать VID можно только с помощью функций, возвращающих его.
- При написании квеста убедитесь, что файл находится в кодировке ANSI или Windows-1251 (также известна как cp1251). Если файл будет сохранен в другой кодировке, то в игре будут возможны проблемы с отображением кириллицы и некоторых символов. В Notepad++ кодировка указывается в правом нижнем углу.
- В строках старайтесь всегда добавлять пробел перед закрывающей кавычкой, как это демонстрируется во всех примерах в документации. Из-за неизвестного бага строка, у которой нет пробела на конце, может сделать так, что вся секция, в которой она была объявлена, просто не сработает. Это касается в основном кириллицы и некоторых специальных символов на конце строки. Следующие примеры могут привести к ошибке:
syschat("привет")
иsyschat("сообщение №" .. (5 * 5))
, а эти примеры не приведут к ней:syschat("hello")
,syschat("привет.")
иsyschat("привет ")
. Точный список символов, которые могут привести к ошибке, неизвестен, поэтому лучше всегда ставьте пробел в конце. - Последняя строка в файле с квестом всегда должна быть пустой.
Для того, чтобы начать работать с квестами, необходимы следующие программы:
- Notepad++ — достаточно простой текстовый редактор с подстветкой синтаксиса языка
- PuTTY — программа для доступа к серверу по протоколу SSH; через неё вы будете компилировать квесты
- FileZilla — FTP-клиент для загрузки файлов на сервер; через него вы будете загружать квесты
Важно! В данном руководстве не будет объясняться, как пользоваться SSH и FTP. Предполагается, что вы умеете работать с консолью сервера и загружать на него файлы.
Все квесты находятся в директории (папке) /usr/home/game/share/locale/germany/quest
. Обычно используется именно такой путь, но он может отличаться. Внутри директории quest
находится директория object
— тут находятся скомпилированные квесты.
Компиляция квестов — это процесс преобразования файлов с расширением .quest
в понятную для сервера информацию. Компиляция происходит путем вызова команды cd /usr/home/game/share/locale/germany/quest && sh make
(путь может отличаться) в консоли сервера. Данная команда запускает файл make
(без расширения) в папке quest
. Данный файл перебирает файл quest_list
(без расширения) и каждый квест отправляет в компилятор, который находится в той же папке и имеет имя qc
(без расширения). Далее компилятор уже проверяет quest-файлы и преобразует их содержимое в понятный серверу код, который затем помещается в папку object
. Перед компиляцией рекомендуется удалять папку object
.
Важно! Вы можете где-нибудь узнать о «чудо-методе», который позволяет компилировать квесты без перезагрузки сервера путем вызова чат-команды
/reload q
сразу после компиляции. Якобы после компиляции, вызвав эту команду, не придется перезагружать сервер и все изменения вступят в силу сразу же. Это правда, но у этого метода есть подводные камни. Во-первых, этот метод нарушает работу таймеров. Во-вторых, данный метод может повлиять на квестовые флаги (хранимые квестами данные об игроках). В-третьих, данный метод может повлиять на стадии квестов игроков (например, вернуть к стадииstart
). В-четвертых, данный метод может положить ваш сервер. Использование данного метода — плохая практика. Использовать его крайне не рекомендуется.
Чтобы квест скомпилировался, его необходимо занести в файл quest_list
. Синтаксис файла предельно прост: по одному квестовому файлу на строку. Последняя строка в файле должна быть пустой. Если вы указали неверное имя файла, то при компиляции вы увидите возле вашего квеста ошибку Segmentation fault, core dumped. Если такая ошибка появилась и вы на 100% уверены, что не ошиблись в имени файла, то проверьте правильность переноса строк. Для этого в Notepad++ вверху нажмите кнопку «Показать все символы» и убедитесь, что все строки заканчиваются символами LF
на чёрном фоне (других символов на черном фоне быть не должно). Чтобы исправить проблему с переносами строк, сделайте замену в файле с \r
на пустоту.
Для работы с квестами, да и вообще в любое время, пока сервер не находится в открытом для публики состоянии, я рекомендую перевести его в тестовый режим, который также может быть известен как «режим отладки». Пока сервер находится в этом режиме, в чате будут высвечиваться уведомления, если во время выполнения квеста произойдет какая-то ошибка, а также некоторые функции ядра (которые в том числе могут являться частью исходного кода квестовых функций) будут сообщать некоторую информацию, которая может быть вам полезна, особенно если вдруг что-то сломается. Более того, существуют квестовые функции, определяющие, что сервер находится в тестовом режиме, поэтому можно писать специальные сценарии в одном квесте и для отладки, и для релизной версии. Допустим, у вас есть какая-то возможность на сервере, пользоваться которой можно всего лишь раз в сутки. Но вы можете переписать условие так, чтобы в тестовом режиме время ожидания было не 24 часа, а, скажем, 15 секунд, чтобы было удобно тестировать эту самую возможность.
Итак. Чтобы включить тестовый режим, вам надо в конфиге каждого канала (даже 99 канала) добавить такую строчку, если ее там нет:
TEST_SERVER: 1
Если строчка с параметром TEST_SERVER
уже есть, но значение равно 0
, то просто поменяйте 0
на 1
. Не забывайте про то, что последняя строка в файле должна быть пустой. При необходимости выключить тестовый режим надо 1
поменять на 0
.
Важно! Во время включенного тестового режима на некоторых серверах может не отображаться иконка администратора (флаг ГМа). После выключения иконка будет видна.
Важно! Тестовый режим также включает трансляцию в чат множество другой информации: урон, который нанесли вам монстры или игроки или вы им, затраты маны и прочую информацию. Не пугайтесь :)