
Garry's Mod Development as it should be
Каждый из нас в yufu имеет огромный опыт за своей спиной, однако многие начинали с обычного администрирования серверов в Garry's Mod или не имели отношения к нему вовсе, но были увлечены разработкой игр, сайтов, создания моделей и прочего контента в IT-направлениях и именно упорное изучение различного софта, попытки изучить что-либо новое и позволили нам понять, что уже не 2005 год где всё, чем пользуются разработчики - это обычный notepad или vim. Время идёт, а с ним и появляется новой софт, а с ним меняются и правила разработки.
Софт
Крайне советую либо удалить старый софт, либо контролировать себя и учиться работать в новом. Первое время будет всё непонятно и неудобно, но это временно.
Редактор - Microsoft Visual Code
Используем вместо Notepad++, Sublime Text и пр.

Microsoft Visual Code крайне удобен в использовании, поддерживает тысячи расширений вплоть до одновременной разработки в реальном времени. Так же установим сразу несколько плагинов необходимых для разработки в Garry's Mod.

GLua Enhanced - это синтаксис Garry's Mod'овского Lua, ведь в GLua есть функции, которых нет в обычном Lua и именно благодаря этому плагину наш код станет не только красивее, но и правильнее, ведь GLua Enhanced указывает на устаревшие решения и подсказывает то, что стоит использовать на текущей версии Garry's Mod. Например, вместо umsg - net.
Установка крайне простая - достаточно нажать на Install.

GLua Linter - подсветка ошибок в реальном времени, что кардинально сэкономит время на поиске синтаксических ошибок (опять пропустил запятую?), однако он позволит ещё и сделать код чище указав на крайне глупые стилистические, и не только ошибки. Например, когда во всём коде используются двойные кавычки, а ты внезапно решил использовать одинарные.
Установка требует дополнительного модуля GLua Fixer в %PATH%, но сперва установи плагин через Install.
GLua Fixer - модуль, который необходимо скачать по ссылке. После разархивирования в нём будет находиться glualint.exe, который советую закинуть в ту папку из которой ты гарантированно его не удалишь по случайности.
Плохой пример: Рабочий стол или папка Загрузки.
Хороший пример: В папке с Microsoft Visual Code.
Распаковал? Папку создал? Умница, теперь открываешь Этот компьютер -> Свойства -> Дополнительные параметры системы -> Дополнительно -> Переменные среды.
Или просто найди "Изменение переменных среды текущего пользователя".
В окошке "Переменные среды" в блоке "Переменные среды пользователя %ТВОЙЮЗЕРНЕЙМ%" находишь строку PATH, выделяешь её кликом и жмёшь "Изменить...".
В открывшемся окошке нажимаешь "Создать" и добавляешь путь до папки где у тебя и находится glualint.exe. Готово!
LuaDev - позволит нам исполнять код как на сервере, так и на клиенте в реальном времени. Он так же требует модуля на сервере, но мы разбираем аспект разработки на наших серверах где все данные модули установлены заранее, поэтому разберём это чуть ниже.
Очень важный плагин, который ускоряет разработку в разы.
Установи через Install.
SFTP-клиент - Cyberduck
Используем вместо FileZilla, WinSCP и пр.

Cyberduck крайне удобен так как поддерживает и S3 Bucket, и SFTP (обычный FTP на yufu уже давно не поддерживается) и прочие.
Но нам не так это важно как разработчикам сервера в Garry's Mod, верно?
Именно этот SFTP-клиент удобен своей визуальной частью, более удобными инструментами для сохранения подключений и автоматическом входе при закрытии, но самое-то главное в нём - автозагрузка файла при изменениях.
Вам ещё не надоела FileZilla своими сообщениями о загрузке файлов и в самом деле бесполезными обновлениями выходящими каждые пару дней?
В качестве альтернативы так же могу посоветовать Mountain Duck, либо SFTP плагин для Microsoft Visual Code - Install.
Git Client - GitHub Dekstop

Позволит синхронизироваться в работе сразу нескольким разработчикам, а так же крайне удобен для отслеживания изменений на проекте.
Garry's Mod и всё, что связано с ним
Модули и скрипты
LuaDev уже был упомянут выше, но устанавливался лишь плагин для текстового редактора, а теперь речь о самом Garry's Mod.
Установка крайне простая - достаточно скачать архив и закинуть содержимое папки /lua/ прямо в /garrysmod/lua/ игры или сервера.

EPOE - это твой главный дружище в разработке сервера, который даст тебе отслеживать ошибки в реальном времени, ведь EPOE - это буквально серверная консоль на клиенте.
Установка такая же как и у LuaDev. Ничего сложного.

FProfiler - папа-профайлер. Отследит все вызовы функций, покажет задержки в исполнении кода, укажет на резкую потерю производительности при исполнении и так далее. Крайне полезная вещь, если есть подозрение на то, что ты накодил гадость из-за которой теперь садится FPS или есть задержки.
Установка, опять же, абсолютно такая же как и у LuaDev.

GMPublisher - твой лучший друг при работе с Workshop.
Особенности
Важно понимать их прежде чем приступать к разработке чего-либо в Garry's Mod, иначе потом можно неплохо потерять время на этом.
- Не используй античиты на сервере.
Античит на сервере скорее приносит боль и разочарование, чем пользу.
Многие из них блокируют большую часть http запросов, блокируют RunString, CompileString, многие net-функции тоже находятся под присмотром античитов, но по итогу-то игроков с С++ читом они не увидят. - Попрощайся с FastDL, поприветствуй WorkshopDL.
У FastDL, которым пользовались раньше в 2000-х, всегда была очень большая проблема - он передаёт всю информацию через тот же net канал через который игроки общаются с сервером находясь на нём из-за чего он очень сильно ограничен в скорости.
WorkshopDL же просто указывает игроку какой файл необходимо скачать и добавить в виртуальную файловую систему Garry's Mod, а там всё зависит исключительно от скорости подключения игрока к интернету. - Не стесняйся смотреть чужие аддоны, github и wiki от Facepunch
Нет ничего плохого в том, чтобы изучать чужие решения, ведь несмотря на проработанность wiki гмода многие функции и библиотеки остаются незадокументированными и если бы не умельцы с методом проб и ошибок, они так и остались бы без документации.
Один из отличных примеров - STENCIL о котором информации на вики толком нет по сей день.
Стилистика
Форматирование
Начнём с того, прекратим использовать любые операторы из GLua.
!= !var || && -- Не используй их
~= not var or and -- Используй их
Прекращай использовать скобки там, где они не нужны, а так же пользуйся одинарными кавычками.
if (dontdothis) then print('BAD') end
if dothis then print('GOOD') end
Короткие функции пиши без лишних строк.
function ThisIsExample() print('Hello World') end
Длинные же старайся делить на логические этапы пустыми строками.
local function LongExample(who)
if not isstring(who) then return false end
print('Hello ' .. who .. '!')
return true
end
Элементы таблицы всегда заканчивай запятой в конце.
local tbl = {
[1] = {
key = value,
},
key2 = value2,
key3 = value3,
}
Если в переборе не используется переменная, то называй её _
local players = player.GetAll()
for _, v in ipairs(players) do
print(v:Nick())
end
Имена хуков и net сообщений всегда называй в следующем формате
-- sv_attributes.lua
-- @Module: Attributes
-- @SubModule/Function: SpawnInit
hook.Add('PlayerSpawn', 'attributes.spawninit', function(ply)
net.Start('attributes.spawninit')
-- func
net.Send(ply)
end)
Локализуй статичные переменные и таблицы, а так же кэшируй элементы.
local mypic = yufu.util.DownloadImage('https://example.com/pic.png')
hook.Add('HUDPaint', 'pictureoverlay', function()
surface.SetMaterial(mypic)
surface.SetDrawColor(255, 255, 255, 255)
surface.DrawTexturedRect(50, 50, 128, 128)
end)
-- В данном примере, если бы мы скачивали картинку каждый тик,
-- который функция HUDPaint срабатывает,
-- то это сильно бы сказалось на производительности.
-- Даже на мощных ПК.
Нейминг
Для мета-таблиц и enum используй ALL_CAPS.
local PLAYER = FindMetaTable('Player')
MODULENAME_NUM = 1
Используй PascalCase для мета и обычных функций.
local function PLAYER:isplayer() end -- плохо
local function PLAYER:isPlayer() end -- всё ещё плохо
local function PLAYER:IsPlayer() end -- хорошо
local function printname() end -- плохо
local function PrintName() end -- хорошо
Используй camelCase для переменных.
local myVar = false
local plyNick = PLAYER:Nick()
Структура и логика
Если пишешь полноценный модуль в одном файле, то сохраняй структуру, чтобы разделить его в будущем.
if SERVER then
-- SERVERSIDE здесь (sv_module.lua)
elseif CLIENT then
-- CLIENTSIDE здесь (cl_module.lua)
end
-- SHARED здесь (sh_module.lua)
Крайне советую локализировать всё, что относится только к конкретному модулю.
То есть создаёшь глобальную таблицу и записываешь всё - переменные, функции и прочее.
yufu = yufu or {}
yufu.menu = yufu.menu or {}
yufu.menu.panel = yufu.menu.panel or nil
function yufu.menu.Create()
yufu.menu.panel = vgui.Create('DFrame')
yufu.menu.panel:MakePopup()
end
function yufu.menu.Destroy()
if yufu.menu.panel:IsValid() then
yufu.menu.panel:Remove()
end
end
Так же, настоятельно рекомендую изучить следующее:
Lua Performance - даст понимание о производительности Lua и основных ошибках, которые ты можешь допустить.
Lua Style Guide от Zaki, Olivine-Labs и Catwell во многом учили меня стилистике кода и вцелом правильному правописанию.
Некоторые аспекты могут в гайдах трактоваться отлично от моего, поэтому наш - приоритетный.
yufu.us 🍣 Newsletter
Join the newsletter to receive the latest updates in your inbox.