Структура геймода
Геймод живёт в gamemodes/darkrp/, общие библиотеки — в lua/autorun/: они загружаются раньше геймода и доступны везде, включая другие геймоды.
Точки входа
init.lua (сервер) и cl_init.lua (клиент) вызывают хук RolePlay.Loading, подключают все модули и после загрузки вызывают RolePlay.Loaded. На эти два хука могут подписываться внешние аддоны.
Автозагрузки по папкам нет: списки include и AddCSLuaFile ведутся вручную. Новый файл не заработает, пока его туда не добавили — см. Как подключить свой модуль.
sh_init.lua сведён к минимуму — метаданные, метатаблицы и корень пространства имён:
Порядок загрузки
Порядок в init.lua не косметический, он отражает зависимости:
- netvars.lua, config.lua, lang.lua — база: сетевые переменные, настройки и строки, от них зависят все модули.
- teams.lua, sh_jobs.lua, sh_registrator.lua — команды и профессии. Регистратор выполняет файлы из
jobs/, поэтомуTEAM_*должны существовать раньше. - sh_player.lua, sv_entities.lua, sv_player.lua — ядро и все серверные хуки.
- chat/sv_chat.lua — регистрация команд, от неё зависят команды остальных модулей.
- voting/sv_init.lua — голосования, используются сменой профессии.
- sv_jobs.lua — смена профессии,
/become,/demote. - economy/, doors/, death/, building/ — игровые системы.
Где что искать
| Что | Где |
|---|---|
Реализация любого GM:* |
sv_player.lua, sv_entities.lua, cl_init.lua |
| Настраиваемое число | config.lua, таблица GM.Config.Defaults |
| Текст, который видит игрок | lang.lua |
| Публичное API модуля | подтаблица roleplay.* в файле модуля |
| Методы игрока и сущностей | метатаблицы PLAYER и ENTITY |
Хуки собраны в корневых файлах намеренно — так их видно все сразу и не возникает конфликта определений. Подробнее: Хуки геймода.
Базовый геймод
В darkrp.txt указано "base" "base" — геймод наследуется от base, а не от sandbox. Спавнменю, тулменю и сандбоксовых команд спавна здесь нет: единственная точка спавна пропов — свой concommand gm_spawn в building/.
Обратная сторона: всё, что даёт base, наследуется, а DEFINE_BASECLASS в проекте не используется. Реализуя GM:X, который уже есть в базовом геймоде, вы замещаете его целиком — вызвать родительскую версию неоткуда.
Реалмы по имени файла
Префикс файла задаёт реалм: sv_ — только сервер, cl_ — только клиент, sh_ — оба. Это не стиль, а размер загрузки у игроков — см. Реалмы и разделение кода.
Библиотека file.AutoInclude умеет выбирать реалм по префиксу автоматически, но геймод её для собственной загрузки не использует.
