Physgun Wiki

Структура геймода

Геймод живёт в gamemodes/darkrp/, общие библиотеки — в lua/autorun/: они загружаются раньше геймода и доступны везде, включая другие геймоды.

roleplay/ ├── lua/autorun/ # самостоятельные библиотеки │ ├── netvar.lua # nw — сетевые переменные │ ├── rndx.lua # RNDX — скруглённая отрисовка │ ├── animations.lua # LuaAnim — анимация костей │ ├── entity.lua # ENTITY:IsDoor / IsProp │ └── file.lua # file.AutoInclude └── gamemodes/darkrp/ ├── entities/ │ ├── entities/ # money, roleplay_base │ └── weapons/ # keys └── gamemode/ ├── init.lua # точка входа сервера, полный список include/AddCSLuaFile ├── cl_init.lua # точка входа клиента + все клиентские хуки GM:* ├── sh_init.lua # метаданные, PLAYER/ENTITY, таблица roleplay ├── config.lua # GM.Config ├── lang.lua # GM.Lang и roleplay.L ├── netvars.lua # регистрация сетевых переменных ├── teams.lua # TEAM_* ├── sh_jobs.lua # базовый класс профессии и флаги JOB_FLAG_* ├── sh_registrator.lua # сканирует jobs/, наполняет roleplay.Jobs ├── sh_player.lua # PLAYER:Job, PLAYER:HasJobFlag ├── sv_player.lua # все серверные хуки GM:* ├── sv_entities.lua # хуки сущностей ├── sv_jobs.lua # смена профессии, /become, /demote ├── jobs/ # файлы профессий (JOB.*) ├── chat/ # команды и вывод в чат ├── economy/ # деньги и зарплата ├── doors/ # владение дверьми ├── building/ # пропы, лимиты, гост и солид ├── death/ # смерть, возрождение, камера на трупе ├── voting/ # голосования ├── hud/ # HUD └── vgui/ # шрифты и скин интерфейса

Точки входа

init.lua (сервер) и cl_init.lua (клиент) вызывают хук RolePlay.Loading, подключают все модули и после загрузки вызывают RolePlay.Loaded. На эти два хука могут подписываться внешние аддоны.

Автозагрузки по папкам нет: списки include и AddCSLuaFile ведутся вручную. Новый файл не заработает, пока его туда не добавили — см. Как подключить свой модуль.

sh_init.lua сведён к минимуму — метаданные, метатаблицы и корень пространства имён:

PLAYER = FindMetaTable("Player") ENTITY = FindMetaTable("Entity") roleplay = roleplay or {}

Порядок загрузки

Порядок в init.lua не косметический, он отражает зависимости:

  1. netvars.lua, config.lua, lang.lua — база: сетевые переменные, настройки и строки, от них зависят все модули.
  2. teams.lua, sh_jobs.lua, sh_registrator.lua — команды и профессии. Регистратор выполняет файлы из jobs/, поэтому TEAM_* должны существовать раньше.
  3. sh_player.lua, sv_entities.lua, sv_player.lua — ядро и все серверные хуки.
  4. chat/sv_chat.lua — регистрация команд, от неё зависят команды остальных модулей.
  5. voting/sv_init.lua — голосования, используются сменой профессии.
  6. sv_jobs.lua — смена профессии, /become, /demote.
  7. 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 умеет выбирать реалм по префиксу автоматически, но геймод её для собственной загрузки не использует.