Привет, не могу сделать так, чтобы Физ.Ганом могли трогать только в админ профе, уже что только не перепробовал, много хуков брал с форума , но все равно.
Если кто знает, буду очень благодарен!
Привет, не могу сделать так, чтобы Физ.Ганом могли трогать только в админ профе, уже что только не перепробовал, много хуков брал с форума , но все равно.
-- addons/sam/lua/sam/modules/physgun.lua
hook.Add("Initialize", "Custom_SAM_Physgun", function()
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)
end)
Можно пойти дальше и еще немного улучшить, но твой вариант уже лучше изначального
Я не знаю как работает под капотом 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)
Но это уже мысли вслух
Куда кидать?
Будь внимательнее:
[adminmode] addons/adminmode/lua/sam/modules/physgun.lua:4: attempt to call method ‘Lock’ (a nil value)
замени тут на ply:Freeze()
понял, зря быканул
Как исправить то?
не ко мне вопрос же. Не мой скрипт
А можешь скинуть, который работает, пожайлуста.
у меня его нет
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)
ну как-то так
Можна брать superadmin, в админ профе.
-- 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)
Ошибка в твоем коде. Как исправить?
[sam-144] addons/sam-144/lua/sam/modules/physgun.lua:14: attempt to call field ‘hook’ (a nil value)