[SAM] Как запретить человеку тп к выше стоящему и тд?

command.new("tp")
	:DisallowConsole()
	:SetPermission("goto", "admin")

	:AddArg("player", {single_target = true, allow_higher_target = true, cant_target_self = true})

	:Help("goto_help")

	:OnExecute(function(ply, targets)
		if ply:sam_get_exclusive(ply) then
			return ply:sam_send_message(ply:sam_get_exclusive(ply))
		end

		if not ply:Alive() then
			ply:Spawn()
		end

		local target = targets[1]
		ply.sam_tele_pos, ply.sam_tele_ang = ply:GetPos(), ply:EyeAngles()

		ply:ExitVehicle()
		ply:SetVelocity(Vector(0, 0, 0))
		ply:SetPos(find_empty_pos(target:GetPos(), ply))
		ply:SetEyeAngles((target:EyePos() - ply:EyePos()):Angle())

		sam.player.send_message(nil, "goto", {
			A = ply, T = targets
		})
	end)
:End()

command.new("return")
	:SetPermission("return", "admin")

	:AddArg("player", {single_target = true, optional = true})

	:Help("return_help")

	:OnExecute(function(ply, targets)
		local target = targets[1]

		local last_pos, last_ang = target.sam_tele_pos, target.sam_tele_ang
		if not last_pos then
			return sam.player.send_message(ply, "no_location", {
				T = targets
			})
		end

		if target:sam_get_exclusive(ply) then
			return ply:sam_send_message(target:sam_get_exclusive(ply))
		end

		if not target:Alive() then
			return ply:sam_send_message(target:Name() .. " is dead!")
		end

		target:ExitVehicle()
		target:SetVelocity(Vector(0, 0, 0))
		target:SetPos(last_pos)
		target:SetEyeAngles(last_ang)

		target.sam_tele_pos, target.sam_tele_ang = nil, nil

		sam.player.send_message(nil, "returned", {
			A = ply, T = targets
		})
	end)
:End()

У меня нет нормальной SAM админки и некуда ее поставить, так что скачал с брокенкора, дабы чекнуть функции имунок
На, попробуй это

command.new("tp")
	:DisallowConsole()
	:SetPermission("goto", "admin")

	:AddArg("player", {single_target = true, allow_higher_target = true, cant_target_self = true})

	:Help("goto_help")

	:OnExecute(function(ply, targets)
		if ply:sam_get_exclusive(ply) then
			return ply:sam_send_message(ply:sam_get_exclusive(ply))
		end

		local target = targets[1]

		if ply:sam.ranks.get_immunity() < target:sam.ranks.get_immunity() then
			if SERVER then ply:ChatPrint('Вы не можете телепортироваться к старшему по званию администратору') end
			return
		end

		if not ply:Alive() then
			ply:Spawn()
		end

		ply.sam_tele_pos, ply.sam_tele_ang = ply:GetPos(), ply:EyeAngles()

		ply:ExitVehicle()
		ply:SetVelocity(Vector(0, 0, 0))
		ply:SetPos(find_empty_pos(target:GetPos(), ply))
		ply:SetEyeAngles((target:EyePos() - ply:EyePos()):Angle())

		sam.player.send_message(nil, "goto", {
			A = ply, T = targets
		})
	end)
:End()

Если не будет работать, то принти что выводит

sam.ranks.get_immunity() 

и дальше уже сравнивай полученные значения от ply с target
Ибо функция возвращает ранг и иммунитет

allow_higher_target = false,

попробуй

1 лайк

[_admin_system] addons/_admin_system/lua/sam/modules/teleport.lua:136: function arguments expected near ‘.’ (x2)

if ply:sam.ranks.get_immunity() < target:sam.ranks.get_immunity() then

Помогло?

1 лайк

Да спасибо!

1 лайк

Не за что

1 лайк

Можешь помочь сделать такое же, только с физганом? Типа, тебе нужно иметь професию администратор?

\addons\sam-148\lua\sam\modules\util.lua

найди там SAM.CanPhysgunPlayer и замени хук на

	sam.hook_first("PhysgunPickup", "SAM.CanPhysgunPlayer", function(ply, target)
		if sam.type(target) == "Player" && ply:HasPermission("can_physgun_players") && ply:CanTarget(target) && IsValid(ply) && ply:IsPlayer() && ply:Team() == TEAM_ADMIN or ply:IsSuperAdmin() then
			freeze_player(target)
			return true
		end
	end)

Как сделать для ulx? Очень хочу разобраться, как делать из кодов Sam ulx!

По аналогии
Ищи там хук PhysgunPickup

написал код… Подумал… Переделал на сам (ну почти) ахзпхзпа

А как сделать что бы наоборот нельзя было телепортировать к себе?

меняешь goto на bring