[SAM] Разрешить использовать физган в одной профе

Привет, не могу сделать так, чтобы Физ.Ганом могли трогать только в админ профе, уже что только не перепробовал, много хуков брал с форума , но все равно.


image
Если кто знает, буду очень благодарен!

Переместил пост в support раздел

1 симпатия

спасибо

1 симпатия

return true в этом (и большинстве других) хуков использовать нежелательно

hook.Add("PhysgunPickup", "restrict_physgun", function(pl, targ)
	if pl:Team() ~= TEAM_STAFF and targ:IsPlayer() then
		return false
	end
end)

Код выше запретит воздействовать на игроков из любой профы, кроме TEAM_STAFF

UPD. Заметка для разработчиков. В этом хуке return true допустим, поскольку там false по умолчанию

К сожалению не работает, работа верна, игрок что в админ профе, что в рп может трогать Физ.Ганом, попытался отключить функцию can_psyhgun_players, но теперь игрок вообще не может трогать Физ.Ганом, может где то надо включить вообще функцию в sandbox Физ.Гана?

Просто вообще не знаю , что делать

А все, я сделал все права для SAM, кому надо могу скинуть сюда, в хуке запрет использования Физ.Гана в рп профе, так же чтобы одинаковые группы не могли друг друга трогать Физ.Ганом

скинь, я удалю таймер удаления темы

	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  and ply:GetUserGroup() != target:GetUserGroup() or ply:IsSuperAdmin() then
            freeze_player(target)
            return true
        end
    end)

Расположение : server/garrysmod/addons/sam/modules/unit.lua 232 строчка, заменить TEAM_STAFF на свою работу

это очень плохое решение…

  1. Если вдруг захочется обновить SAM и забыть об этой правке, то по сути она “удалится”
  2. Модификация чужих аддонов прямиком в самих аддонах, когда правку можно сделать за его пределами это нелогичное поведение и может запутать второго разработчика (наемного или твой товарища)
  3. Подобные правки забываются. Если поступать так с разными чужими аддонами по умолчанию, то рано или поздно на тебя обрушится снежный ком технического долга из-за костылей, которые как-то потом придется рефакторить

Как вариант, можно сделать hook.Remove этого хука, затем во внешнем аддоне (каком-нить sam_modules или mini_utils) написать этот хук так, как нужно. Сам оригинальный SAM не трогать

Понятно, что способ не самый лучший, но главное, что он работает

-- addons\sam\lua\sam\modules

physgun.lua (591 Байт)

1 симпатия

Можно пойти дальше и еще немного улучшить, но твой вариант уже лучше изначального

Я не знаю как работает под капотом 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)

Но это уже мысли вслух

1 симпатия