mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
251 lines
6.0 KiB
Lua
251 lines
6.0 KiB
Lua
|
|
--[[
|
||
|
|
| This file was obtained through the combined efforts
|
||
|
|
| of Madbluntz & Plymouth Antiquarian Society.
|
||
|
|
|
|
||
|
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||
|
|
| Maloy, DrPepper10 @ RIP, Atle!
|
||
|
|
|
|
||
|
|
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||
|
|
--]]
|
||
|
|
|
||
|
|
if SAM_LOADED then return end
|
||
|
|
|
||
|
|
local loaded = false
|
||
|
|
local load_restrictions = function()
|
||
|
|
local sam = sam
|
||
|
|
local config = sam.config
|
||
|
|
local hook = hook
|
||
|
|
local SERVER = SERVER
|
||
|
|
|
||
|
|
if CLIENT then
|
||
|
|
local add_setting = function(body, title, key)
|
||
|
|
local setting = body:Add("SAM.LabelPanel")
|
||
|
|
setting:Dock(TOP)
|
||
|
|
setting:SetLabel(title)
|
||
|
|
|
||
|
|
local enable = setting:Add("SAM.ToggleButton")
|
||
|
|
enable:SetConfig(key, true)
|
||
|
|
|
||
|
|
return setting
|
||
|
|
end
|
||
|
|
|
||
|
|
config.add_menu_setting("Restrictions", function(body)
|
||
|
|
local setting = body:Add("SAM.LabelPanel")
|
||
|
|
setting:Dock(TOP)
|
||
|
|
setting:DockMargin(8, 6, 8, 0)
|
||
|
|
setting:SetLabel("Restrictions (Check these settings in ranks' permissions)")
|
||
|
|
|
||
|
|
local setting_body = body:Add("Panel")
|
||
|
|
setting_body:Dock(TOP)
|
||
|
|
setting_body:DockMargin(8, 6, 8, 0)
|
||
|
|
setting_body:DockPadding(8, 0, 8, 0)
|
||
|
|
|
||
|
|
add_setting(setting_body, "Tool (Eg. using button tool)", "Restrictions.Tool")
|
||
|
|
add_setting(setting_body, "Spawning (Eg. spawning props)", "Restrictions.Spawning")
|
||
|
|
add_setting(setting_body, "Limits (Eg. how many props can you spawn)", "Restrictions.Limits")
|
||
|
|
|
||
|
|
function setting_body:PerformLayout()
|
||
|
|
setting_body:SizeToChildren(false, true)
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
end
|
||
|
|
|
||
|
|
local tools = weapons.GetStored("gmod_tool")
|
||
|
|
if sam.istable(tools) then
|
||
|
|
if config.get("Restrictions.Tool", true) then
|
||
|
|
for k, v in pairs(tools.Tool) do
|
||
|
|
sam.permissions.add(v.Mode, "Tools - " .. (v.Category or "Other"), "user")
|
||
|
|
end
|
||
|
|
|
||
|
|
hook.Add("CanTool", "SAM.Module.Restrictions", function(ply, _, tool)
|
||
|
|
if not ply:HasPermission(tool) then
|
||
|
|
if CLIENT and sam.player.check_cooldown(ply, "ToolNoPermission", 0.1) then
|
||
|
|
ply:sam_send_message("You don't have permission to use this tool.")
|
||
|
|
end
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
else
|
||
|
|
for k, v in pairs(tools.Tool) do
|
||
|
|
sam.permissions.remove(v.Mode)
|
||
|
|
end
|
||
|
|
|
||
|
|
hook.Remove("CanTool", "SAM.Module.Restrictions")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
sam.permissions.add("admin_weapons", "Spawning", "superadmin")
|
||
|
|
|
||
|
|
local function no_permission(ply, name)
|
||
|
|
ply:sam_play_sound("buttons/button10.wav")
|
||
|
|
ply:sam_send_message("You don't have permission to spawn {S Blue}.", {
|
||
|
|
S = name
|
||
|
|
})
|
||
|
|
end
|
||
|
|
|
||
|
|
local spawning = {
|
||
|
|
PlayerSpawnProp = {
|
||
|
|
name = "props",
|
||
|
|
permission = "user",
|
||
|
|
call_gm = true,
|
||
|
|
},
|
||
|
|
PlayerGiveSWEP = {
|
||
|
|
name = "give_weapons",
|
||
|
|
cb = function(_, ply, _, wep)
|
||
|
|
if wep.sam_AdminOnly and not ply:HasPermission("admin_weapons") then
|
||
|
|
no_permission(ply, "admin weapons")
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
return true
|
||
|
|
end,
|
||
|
|
hook = sam.hook_first,
|
||
|
|
},
|
||
|
|
PlayerSpawnSWEP = {
|
||
|
|
name = "spawn_weapons",
|
||
|
|
cb = function(_, ply, _, wep)
|
||
|
|
if wep.sam_AdminOnly and not ply:HasPermission("admin_weapons") then
|
||
|
|
no_permission(ply, "admin weapons")
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
return true
|
||
|
|
end,
|
||
|
|
hook = sam.hook_first,
|
||
|
|
},
|
||
|
|
-- PlayerSpawnSENT = {
|
||
|
|
-- name = "entities",
|
||
|
|
-- check_limit = "sents"
|
||
|
|
-- },
|
||
|
|
PlayerSpawnNPC = {
|
||
|
|
name = "npcs",
|
||
|
|
check_limit = "npcs",
|
||
|
|
},
|
||
|
|
PlayerSpawnVehicle = {
|
||
|
|
name = "vehicles",
|
||
|
|
check_limit = "vehicles",
|
||
|
|
},
|
||
|
|
PlayerSpawnRagdoll = {
|
||
|
|
name = "ragdolls",
|
||
|
|
permission = "user",
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
local override_lists = {
|
||
|
|
"Weapon",
|
||
|
|
-- "SpawnableEntities"
|
||
|
|
}
|
||
|
|
|
||
|
|
local function LimitReachedProcess(ply, str)
|
||
|
|
if not IsValid(ply) then return true end
|
||
|
|
return ply:CheckLimit(str)
|
||
|
|
end
|
||
|
|
|
||
|
|
local GAMEMODE = GAMEMODE
|
||
|
|
if config.get("Restrictions.Spawning", true) then
|
||
|
|
for k, v in pairs(spawning) do
|
||
|
|
local name = v
|
||
|
|
local permission = "superadmin"
|
||
|
|
local check
|
||
|
|
local check_limit
|
||
|
|
local hook = sam.hook_last
|
||
|
|
if istable(v) then
|
||
|
|
name = v.name
|
||
|
|
permission = v.permission or permission
|
||
|
|
if v.call_gm then
|
||
|
|
check = GAMEMODE[k]
|
||
|
|
elseif v.cb then
|
||
|
|
check = v.cb
|
||
|
|
end
|
||
|
|
hook = v.hook or hook
|
||
|
|
check_limit = v.check_limit
|
||
|
|
end
|
||
|
|
|
||
|
|
sam.permissions.add(name, "Spawning", permission)
|
||
|
|
|
||
|
|
if SERVER then
|
||
|
|
hook(k, "SAM.Spawning." .. k .. name, function(ply, ...)
|
||
|
|
if not ply:HasPermission(name) then
|
||
|
|
no_permission(ply, name)
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
if check_limit then
|
||
|
|
return LimitReachedProcess(ply, check_limit)
|
||
|
|
end
|
||
|
|
|
||
|
|
if check then
|
||
|
|
return check(GAMEMODE, ply, ...)
|
||
|
|
end
|
||
|
|
|
||
|
|
return true
|
||
|
|
end)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
for i = 1, #override_lists do
|
||
|
|
for k, v in pairs(list.GetForEdit(override_lists[i])) do
|
||
|
|
v.sam_AdminOnly = v.sam_AdminOnly or v.AdminOnly
|
||
|
|
v.AdminOnly = false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
else
|
||
|
|
sam.permissions.add("admin_weapons")
|
||
|
|
|
||
|
|
for k, v in pairs(spawning) do
|
||
|
|
sam.permissions.remove(istable(v) and v.name or v)
|
||
|
|
|
||
|
|
if SERVER then
|
||
|
|
hook.Remove(k, "SAM.Spawning." .. k)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
for i = 1, #override_lists do
|
||
|
|
for k, v in pairs(list.GetForEdit(override_lists[i])) do
|
||
|
|
if v.sam_AdminOnly then
|
||
|
|
v.AdminOnly = v.sam_AdminOnly
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local PLAYER = FindMetaTable("Player")
|
||
|
|
if config.get("Restrictions.Limits", true) then
|
||
|
|
local get_limit = sam.ranks.get_limit
|
||
|
|
function PLAYER:GetLimit(limit_type)
|
||
|
|
return get_limit(self:sam_getrank(), limit_type)
|
||
|
|
end
|
||
|
|
|
||
|
|
sam.hook_first("PlayerCheckLimit", "SAM.PlayerCheckLimit", function(ply, limit_type, count)
|
||
|
|
local ply_limit = ply:GetLimit(limit_type)
|
||
|
|
if ply_limit < 0 then return true end
|
||
|
|
|
||
|
|
if count > ply_limit - 1 then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
return true
|
||
|
|
end)
|
||
|
|
|
||
|
|
sam.limit_types = {}
|
||
|
|
for _, limit_type in SortedPairs(cleanup.GetTable(), true) do
|
||
|
|
local cvar = GetConVar("sbox_max" .. limit_type)
|
||
|
|
if cvar then
|
||
|
|
table.insert(sam.limit_types, limit_type)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
else
|
||
|
|
sam.limit_types = nil
|
||
|
|
PLAYER.GetLimit = nil
|
||
|
|
hook.Remove("PlayerCheckLimit", "SAM.PlayerCheckLimit")
|
||
|
|
end
|
||
|
|
|
||
|
|
if not loaded then
|
||
|
|
loaded = true
|
||
|
|
hook.Call("SAM.LoadedRestrictions")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
timer.Simple(5, function()
|
||
|
|
if GAMEMODE.IsSandboxDerived then
|
||
|
|
sam.config.hook({"Restrictions.Tool", "Restrictions.Spawning", "Restrictions.Limits"}, load_restrictions)
|
||
|
|
end
|
||
|
|
end)
|