Job в DarkRP, как надо

Где на самом деле живут job, что делает каждое поле и пять ошибок, которые стоят вечера. В том числе та, что перезаписывает job вообще без ошибок.

5 минут чтения

DarkRP настраивается правкой Lua, и самый распространённый способ сломать сервер — править не тот Lua. Этот гайд о том, где на самом деле живут job, что делает каждое поле и какие ошибки дают именно те сообщения, на которые вы иначе потратите вечер.

Никогда не правьте сам DarkRP

Гейммод поставляется с папкой darkrpmodification. Именно туда идут ваши изменения.

garrysmod/addons/darkrpmodification/lua/darkrp_customthings/    jobs.lua    entities.lua    shipments.lua    doorgroups.lua    ...

Правьте gamemodes/darkrp напрямую — и ваша работа исчезнет со следующим обновлением. Правьте darkrpmodification — и она переживёт его, потому что обновление DarkRP этот аддон не трогает.

Если у вас нет darkrpmodification, поставьте его прежде всего остального. Это отдельная загрузка, не часть DarkRP, а править гейммод «просто пока не поставлю нормально» — это как люди теряют выходные.

Как устроен job

Job — это вызов DarkRP.createJob, присвоенный глобальной переменной TEAM_:

TEAM_POLICE = DarkRP.createJob("Police Officer", {    color = Color(25, 25, 170, 255),    model = {"models/player/police.mdl", "models/player/police_fem.mdl"},    description = [[Keep the peace and arrest criminals.]],    weapons = {"arrest_stick", "unarrest_stick", "stunstick", "weaponchecker"},    command = "policeofficer",    max = 4,    salary = 65,    admin = 0,    vote = true,    hasLicense = true,    candemote = true,    category = "Civil Protection",})

Генератор job для DarkRP напишет это за вас, включая вариант с whitelist, и не даст сделать имя TEAM_, которое не является корректной глобальной переменной Lua. Разобраться всё равно стоит, потому что чужие job вы будете читать постоянно.

Для чего на самом деле нужно каждое поле

ПолеЧто означает
colorЦвет в scoreboard и над головой.
modelОдна строка или таблица. Таблица даёт игроку выбор.
descriptionПоказывается в меню F4. Длинные скобки, а не кавычки.
weaponsLoadout при спавне, по классам оружия.
commandНабирается как /policeofficer. Только буквы и цифры.
max0 — без ограничений. 4 — четверо одновременно.
salaryВыплачивается каждый интервал payday.
admin0 все, 1 админы, 2 суперадмины.
voteГолосуют ли игроки за приём в job.
hasLicenseМожет выдавать лицензии на оружие.
candemoteМожно ли снять с этого job голосованием.

Классы оружия не угадывают: список классов оружия — это все классы, которые регистрирует игра, и в нём указано, какие из них существуют только когда смонтирован Half-Life: Source.

Пять ошибок, которые стоят вечера

1. Два job с одним именем TEAM

TEAM_POLICE = DarkRP.createJob("Police Officer", { ... })TEAM_POLICE = DarkRP.createJob("Police Chief", { ... })

Второй молча перезаписывает первый. Никаких ошибок, один пропавший job и час недоумения. Каждому job нужна своя глобальная переменная.

2. ]] внутри description

description = [[Guard the vault [[loot]] and stay alert.]],

Строка заканчивается на первом же ]], и всё, что идёт дальше, превращается в синтаксис, который парсер не может разобрать. Используйте [==[ ... ]==], когда в тексте есть квадратные скобки, или обойдитесь без них.

3. Модель, которая не смонтирована

Job, указывающий на модель, которой нет на сервере, спавнит игроков в виде знака ошибки. Список playermodel — это все модели, которые Garry's Mod регистрирует по умолчанию; всё остальное должно лежать в аддоне, реально установленном на сервере, а не только на вашем клиенте.

4. Правка на работающем сервере

DarkRP читает эти файлы при запуске. Сохранение jobs.lua на живом сервере ничего не меняет до перезапуска — вот почему на «мой job не появляется» чаще всего отвечают «перезапусти».

5. Command с пробелом или дефисом

command = "police officer",

command становится командой в чате. Пробелы, дефисы и буквы с диакритикой его ломают. Буквы и цифры, ничего больше.

Когда job не появляется, читайте консоль сервера при запуске, а не гадайте. DarkRP печатает понятную ошибку с файлом и строкой для всего, что не смог загрузить.

Категории, чтобы меню F4 не было стеной

После десятка job меню нужно группировать. Категория создаётся один раз, а потом на неё ссылаются по имени:

DarkRP.createCategory{    name = "Civil Protection",    categorises = "jobs",    startExpanded = true,    color = Color(25, 25, 170, 255),    canSee = fp{fn.Id, true},    sortOrder = 101,}

Поле category у job должно совпадать с name в точности, включая регистр. Несовпадение не даёт ошибки: job просто попадает в группу по умолчанию. Генератор категорий держит их согласованными.

Whitelist для job

Есть два способа, и они не равнозначны.

Встроенный whitelist — это customCheck, который выполняется, когда кто-то пытается взять job:

customCheck = function(ply)    return table.HasValue({"vip", "admin", "superadmin"}, ply:GetUserGroup())end,CustomCheckFailMsg = "This job is reserved for VIP members.",

Всегда задавайте CustomCheckFailMsg. Без него игрок получает отказ без объяснений и идёт спрашивать вас.

Поле admin проще, но грубее: admin = 1 ограничивает job админами, без сообщения и без места для донатерского ранга.

Когда job заработали

  • Door group, чтобы участком владела только полиция. Учтите, что функция — это глобальная AddDoorGroup, а не вызов DarkRP.create.
  • Agenda — текст с задачами, который босс пишет своей команде.
  • Shipment и entity — то, что продаёт торговец оружием.
  • Demote group, чтобы demote с одного полицейского job закрывал и остальные.

Инструменты, которые используются в этом гайде