Можно пойти дальше и еще немного улучшить, но твой вариант уже лучше изначального
Я не знаю как работает под капотом sam.hook_first(), но предположим, что там просто hook.Add
Тогда можно упростить до этого:
if not sam.PhysgunPickup_orig then
sam.PhysgunPickup_orig = hook.GetTable()["PhysgunPickup"]["SAM.CanPhysgunPlayer"]
end
sam.hook_first("PhysgunPickup", "SAM.CanPhysgunPlayer", function(pl, targ) -- заменяем оригинальный хук
local allowed = sam.PhysgunPickup_orig(pl, targ) -- вызываем функцию оригинального хука
if allowed == true and pl:Team() ~= TEAM_STAFF then -- если в ней разрешено трогать игрока, но профа не подходит, то запрещаем
return false
else
return allowed -- иначе возвращаем то, что вернула оригинальная функция
end
end)
local allowed = {
["superadmin"] = true,
["iventer"] = true,
["Sled"] = true,
["Support"] = true,
["sudoroot"] = true, -- и т.д.
}
hook.Add("PhysgunPickup", "restrict_physgun", function(ply, ent)
if !ent:IsPlayer( ) then return end
if ply:Team( ) != TEAM_ADMIN -- тут нужно поменять на название профы админа у вас
and !allowed[ply:GetUserGroup()] then
return false
end
end)
-- addons/sam/lua/sam/modules/physgun.lua
if SAM_LOADED then return end
local function freeze_player(ply)
if SERVER then
ply:Lock()
end
ply:SetMoveType(MOVETYPE_NONE)
ply:SetCollisionGroup(COLLISION_GROUP_WORLD)
end
sam.hook_first("PhysgunPickup", "SAM.CanPhysgunPlayer", function(ply, target)
if sam.type(target) == "Player" and
ply:HasPermission("can_physgun_players") and
ply:CanTarget(target) and
ply:Team() == TEAM_STAFF -- обязательньно к редактированию
then
freeze_player(target)
return true
end
end)
local function freezePlayer(ply)
if SERVER then
ply:Lock()
end
ply:SetMoveType(MOVETYPE_NONE)
ply:SetCollisionGroup(COLLISION_GROUP_WORLD)
end
local function isStaffPlayer(ply)
return ply:Team() == TEAM_STAFF
end
sam.hook("PhysgunPickup", "SAM.RestrictPhysgun", function(ply, target)
if sam.isplayer(target) and ply:HasPermission("can_physgun_players") and isStaffPlayer(ply) then
freezePlayer(target)
return true
end
end)
sam.hook("PlayerSpawn", "SAM.UnfreezeOnSpawn", function(ply)
if SERVER then
ply:UnLock()
ply:SetMoveType(MOVETYPE_WALK)
ply:SetCollisionGroup(COLLISION_GROUP_PLAYER)
end
end)