Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
49 lines (32 sloc) 14.1 KB

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

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

Важно! В данном руководстве не будет объясняться, как пользоваться 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.

Важно! Во время включенного тестового режима на некоторых серверах может не отображаться иконка администратора (флаг ГМа). После выключения иконка будет видна.

Важно! Тестовый режим также включает трансляцию в чат множество другой информации: урон, который нанесли вам монстры или игроки или вы им, затраты маны и прочую информацию. Не пугайтесь :)