Physgun Wiki

Неймспейс roleplay и утилиты

У геймода нет голых глобальных переменных. Всё API живёт в таблице roleplay, объявленной в sh_init.lua. Единственное исключение — метатаблицы PLAYER и ENTITY: они остаются глобальными, чтобы методы писались коротко.

roleplay = roleplay or {}

Подтаблица на модуль

Каждый модуль заводит свою подтаблицу в собственном файле:

roleplay.Vote = roleplay.Vote or {} function roleplay.Vote.Start(id, text, delay, onPass) ... end
Подтаблица Где объявлена Что внутри
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:

function PLAYER:CountDoors() return table.Count(self._OwnedDoors) end

В 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». Первым аргументом всегда ключ локализации:

sender:ChatError('NotEnoughMoney') sender:ChatSuccess('MoneyGiven', amount, target:Nick()) sender:NotifyError('DoorNameTooLong', limit) sender:NotifyInfo('DoorSold', refund)

Chat* пишет строку в чат, Notify* показывает всплывающее уведомление. Писать Color(...), GAMEMODE.Lang[...] и string.format вручную больше не нужно.