mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 05:43:46 +03:00
Upload
This commit is contained in:
251
lua/sam/sh_restrictions.lua
Normal file
251
lua/sam/sh_restrictions.lua
Normal file
@@ -0,0 +1,251 @@
|
||||
--[[
|
||||
| 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)
|
||||
Reference in New Issue
Block a user