Physgun Wiki

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

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

roleplay/ ├── lua/autorun/ # глобальные библиотеки (nw, file.AutoInclude, расширения Entity) │ ├── netvar.lua │ ├── file.lua │ └── entity.lua └── gamemodes/darkrp/ ├── entities/entities/ # money, roleplay_base └── gamemode/ ├── init.lua # точка входа сервера ├── cl_init.lua # точка входа клиента ├── sh_init.lua # общий список модулей ├── config.lua # GM.Config ├── netvars.lua # регистрация сетевых переменных ├── sv_player.lua # хуки геймода, дефолтные реализации On*-хуков ├── sv_entities.lua ├── economy/ ├── doors/ └── building/

Точки входа

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

sh_init.lua задаёт метаданные геймода (GM.Name, GM.Version), кеширует метатаблицы в глобальные PLAYER и ENTITY и перечисляет все модули через file.AutoInclude:

PLAYER = FindMetaTable("Player") ENTITY = FindMetaTable("Entity") file.AutoInclude('netvars.lua') file.AutoInclude('config.lua') -- ... и так далее по модулям

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

Порядок в sh_init.lua имеет значение:

  1. netvars.lua, config.lua. База, сетевые переменные и конфиг, от них зависят все модули.
  2. sv_entities.lua, sv_player.lua. Хуки геймода и дефолтные реализации блокирующих On*-хуков.
  3. economy/. Деньги (двери при покупке списывают деньги через PLAYER:AddMoney).
  4. doors/. Система дверей.
  5. building/. Лимиты, спавн пропов, APS.

Реалмы по имени файла

file.AutoInclude сам решает, где выполнять файл, по префиксу имени: sv_*: только сервер, cl_*: только клиент (с автоматическим AddCSLuaFile), остальные (sh_* и без префикса): оба реалма.