Skip to main content

access

Права как именованные ноды, группы и иммунитет. Право — именованная нода: admin.kick, shop.vip.buy.
У консоли и rcon прав нет — им разрешено всё. ctx.player там nil, любая проверка проходит.
Методы игрока — p:can, p:groups, p:group, p:weight, p:outranks.

Файлы

data/groups.lua правится руками, модуль его только читает.
data/users.lua — кто есть кто. Ключ записи: steamid или name:<ник>.
Оба файла необязательны: без groups.lua работают встроенные default, admin и owner. Битый файл даёт ошибку в консоль и пустую половину прав, а не половинчатые права.
Вход по нику годится только для LAN: ник подделывается тривиально, а пароль передаётся открытым текстом. На публичном сервере выдавай права по steamid.

Разрешение конфликтов

Нода в выдаче может быть с хвостовой звёздочкой (shop.vip.*, *) и с минусом впереди — -admin.ban означает явный запрет. Порядок в файле роли не играет. Побеждает запись, которая выигрывает по признакам, в этом порядке:
  1. источник — личная запись > своя группа > унаследованная > default ноды;
  2. вес — среди групп одного уровня выигрывает более тяжёлая;
  3. точностьshop.vip.buy > shop.vip.* > shop.* > *;
  4. запрет — при полном равенстве выигрывает deny.
Поэтому admin с allow = {"admin.*"} и deny = {"admin.rcon"} получает всё кроме rcon, а личный allow = {"admin.rcon"} в записи игрока это перебивает.

Иммунитет

Иммунитет — это weight группы. Действие против другого игрока требует строго большего веса, поэтому два админа одного ранга друг друга не тронут. Вручную — p:outranks. Декларативно — opts.target в cmd.add. Права считаются лениво и кешируются на слот. Кеш сбрасывается сам: на player_authorized, при смене карты, по истечении срока и при любом изменении прав.

Объявление

Выдача

Чтение