Неймспейс roleplay и утилиты
У геймода нет голых глобальных переменных. Всё API живёт в таблице roleplay, объявленной в sh_init.lua. Единственное исключение — метатаблицы PLAYER и ENTITY: они остаются глобальными, чтобы методы писались коротко.
Подтаблица на модуль
Каждый модуль заводит свою подтаблицу в собственном файле:
| Подтаблица | Где объявлена | Что внутри |
|---|---|---|
roleplay.Jobs |
sh_registrator.lua |
реестр профессий по идентификатору |
roleplay.Chat |
chat/sv_chat.lua, chat/cl_chat.lua |
AddCommand, RunCommand, Commands |
roleplay.Vote |
voting/ |
Start, Finish, Cancel, Cleanup |
roleplay.Kit |
vgui/cl_skin.lua |
Fonts, ButtonHeight, DrawButton |
roleplay.HUD |
hud/ |
Hidden, Draw, UpdateCursor |
roleplay.Death |
death/ |
Handle, TryRespawn, CalcView, Draw |
Конструкция roleplay.X = roleplay.X or {} нужна потому, что серверный и клиентский файлы модуля наполняют одну и ту же подтаблицу и не должны затирать друг друга.
nw, RNDX и LuaAnim в roleplay не входят — это самостоятельные библиотеки из lua/autorun/, они живут своей жизнью и доступны другим геймодам.
Методы вместо функций
Если функция работает с игроком или сущностью, она пишется методом на метатаблице, а не функцией в roleplay:
В roleplay идёт то, что не привязано к конкретной сущности: реестры, запуск голосования, разбор аргументов.
Общего файла утилит нет
Хелпер живёт там, где инициализируется его модуль. Свалки вида sh_util.lua в проекте нет и заводить её не надо — функция должна лежать рядом с тем, что она обслуживает.
| Хелпер | Файл | Зачем |
|---|---|---|
roleplay.L(key, ...) |
lang.lua |
строка из GM.Lang + string.format |
roleplay.Colors |
sh_init.lua |
цвета ответов: Error, Success, Money |
roleplay.FindPlayer(arg) |
chat/sv_chat.lua |
игрок по номеру из аргумента команды |
roleplay.ParseAmount(arg) |
chat/sv_chat.lua |
целая положительная сумма или nil |
roleplay.CountJobPlayers(job) |
sv_jobs.lua |
сколько игроков занимает профессию |
Ответы игроку
Четыре метода снимают повтор «цвет + строка из Lang + string.format». Первым аргументом всегда ключ локализации:
Chat* пишет строку в чат, Notify* показывает всплывающее уведомление. Писать Color(...), GAMEMODE.Lang[...] и string.format вручную больше не нужно.
