Регистрация и отправка
Сеть регистрируется на сервере один раз:
if SERVER then
util.AddNetworkString("GML_RequestAction")
endКлиент может отправить любое зарегистрированное сообщение вручную. Поэтому net.Receive — это публичная точка входа, а не доверенный вызов интерфейса.
Серверная проверка
net.Receive("GML_RequestAction", function(_, ply)
if not IsValid(ply) or not ply:Alive() then return end
if (ply.GMLNextAction or 0) > CurTime() then return end
ply.GMLNextAction = CurTime() + 1
local target = net.ReadEntity()
if not IsValid(target) then return end
if ply:GetPos():DistToSqr(target:GetPos()) > 160000 then return end
-- действие выполняется только после всех проверок
end)Проверяйте тип, диапазон, длину строки, существование сущности, расстояние, роль игрока, кулдаун и текущее состояние. Не принимайте от клиента SQL, имя функции, путь файла или готовую сумму операции.
Ограничивайте трафик
Не отправляйте большие таблицы каждый кадр. Передавайте только изменившиеся данные, задавайте разумные лимиты и не используйте net.WriteTable для сложных неограниченных структур.
