Введение в квесты

Квесты в Метине — это не просто набор заданий «принеси-подай». Это целые системы. С помощью квестов можно писать целые подземелья со сложной механикой, системы и даже эвенты. Дабы не быть голословным, вот несколько примеров из каждой категории: Башня Демонов, система питомцев и ОХ-эвент. В принципе в Метине много чего написано через квесты и много чего уникального и интересного можно реализовать, имея достаточно фантазии и навыков. А все потому, что квесты пишутся на языке программирования под названием 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 можно только с помощью функций, возвращающих его.

Основные правила

  1. При написании квеста убедитесь, что файл находится в кодировке ANSI или Windows-1251 (также известна как cp1251). Если файл будет сохранен в другой кодировке, то в игре будут возможны проблемы с отображением кириллицы и некоторых символов. В Notepad++ кодировка указывается в правом нижнем углу.
  2. В строках старайтесь всегда добавлять пробел перед закрывающей кавычкой, как это демонстрируется во всех примерах в документации. Из-за неизвестного бага строка, у которой нет пробела на конце, может сделать так, что вся секция, в которой она была объявлена, просто не сработает. Это касается в основном кириллицы и некоторых специальных символов на конце строки. Следующие примеры могут привести к ошибке: syschat("привет") и syschat("сообщение №" .. (5 * 5)), а эти примеры не приведут к ней: syschat("hello"), syschat("привет.") и syschat("привет "). Точный список символов, которые могут привести к ошибке, неизвестен, поэтому лучше всегда ставьте пробел в конце.
  3. Последняя строка в файле с квестом всегда должна быть пустой.

Необходимые программы

Для того, чтобы начать работать с квестами, необходимы следующие программы:

  • Notepad++ — достаточно простой текстовый редактор с подстветкой синтаксиса языка
  • PuTTY — программа для доступа к серверу по протоколу SSH; через неё вы будете компилировать квесты
  • FileZilla — 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.

Чтобы квест скомпилировался, его необходимо занести в файл quest_list. Синтаксис файла предельно прост: по одному квестовому файлу на строку. Последняя строка в файле должна быть пустой. Если вы указали неверное имя файла, то при компиляции вы увидите возле вашего квеста ошибку Segmentation fault, core dumped. Если такая ошибка появилась и вы на 100% уверены, что не ошиблись в имени файла, то проверьте правильность переноса строк. Для этого в Notepad++ вверху нажмите кнопку (Показать все символы) и убедитесь, что все строки заканчиваются символами LF на чёрном фоне (других символов на черном фоне быть не должно). Чтобы исправить проблему с переносами строк, сделайте замену в файле с \r на пустоту.

273