Files
VnUtest/garrysmod/gamemodes/militaryrp/plugins/warn/sv_plugin.lua
2026-03-31 10:27:04 +03:00

94 lines
3.3 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
local PLUGIN = PLUGIN
print("[Warn System] Server Side Loaded")
-- Load warnings on startup
function PLUGIN:Initialize()
self.warns = ix.data.Get("warns", {})
end
-- Save warnings to permanent storage
function PLUGIN:SaveWarns()
ix.data.Set("warns", self.warns)
end
net.Receive("ixWarnAdd", function(length, client)
if (!client:IsSuperAdmin()) then return end
local targetSteamID = net.ReadString()
local reason = net.ReadString() or "No reason provided"
PLUGIN.warns = ix.data.Get("warns", {})
PLUGIN.warns[targetSteamID] = PLUGIN.warns[targetSteamID] or {count = 0, history = {}}
local targetData = PLUGIN.warns[targetSteamID]
targetData.count = targetData.count + 1
table.insert(targetData.history, {
admin = client:Name(),
adminSteamID = client:SteamID(),
reason = reason,
time = os.time(),
type = "add"
})
local targetPlayer = player.GetBySteamID(targetSteamID)
if (IsValid(targetPlayer)) then
targetData.name = targetPlayer:Name()
targetData.rank = targetPlayer:GetUserGroup()
targetPlayer:Notify("Вы получили выговор (" .. targetData.count .. "/3). Причина: " .. reason)
end
-- Automatic demotion (3/3 warnings) - Now works for offline players too
if (targetData.count >= 3) then
if (sam) then
-- Use SAM's Lua API for reliable rank setting (offline or online)
sam.player.set_rank_id(targetSteamID, "user", 0)
print("[Warn System] Initiated demotion for " .. targetSteamID .. " via SAM.")
else
-- Fallback for other systems
if (IsValid(targetPlayer)) then
targetPlayer:SetUserGroup("user")
else
-- If offline and not SAM, we attempt console command as last resort
RunConsoleCommand("ulx", "adduser", targetSteamID, "user")
end
end
PLUGIN.warns[targetSteamID] = nil -- Remove from system after demotion
if (IsValid(targetPlayer)) then
targetPlayer:Notify("Вы были автоматически сняты с админ-прав за достижение 3 выговоров.")
end
ix.util.Notify((targetData.name or targetSteamID) .. " был автоматически снят с админ-прав (3/3 выговоров).")
end
PLUGIN:SaveWarns()
ix.util.Notify(client:Name() .. " выдал выговор " .. (targetData.name or targetSteamID) .. ". Причина: " .. reason)
end)
net.Receive("ixWarnRemove", function(length, client)
if (!client:IsSuperAdmin()) then return end
local targetSteamID = net.ReadString()
local index = net.ReadInt(16)
PLUGIN.warns = ix.data.Get("warns", {})
local targetData = PLUGIN.warns[targetSteamID]
if (targetData and targetData.history[index]) then
targetData.count = math.max(0, targetData.count - 1)
table.insert(targetData.history, {
admin = client:Name(),
adminSteamID = client:SteamID(),
reason = "Снятие выговора #" .. index,
time = os.time(),
type = "remove"
})
PLUGIN:SaveWarns()
ix.util.Notify(client:Name() .. " снял выговор у " .. (targetData.name or targetSteamID))
end
end)