Jump to content

Player Freezing


Recommended Posts

This is a more admin-orientated suggestion, but I notice and have actually fallen victim to this, but a lot of staff will use "ulx freeze @" or "ulx jail @" which always ends up accidentally missing the intended target, and hitting an innocent player. What I'm suggesting is this; it allows admins, mods, or anyone who have access to ulx physgunplayers to simply freeze someone with their right mouse button. Although not needed, this can be very helpful in the future and can avoid mistakes. Please consider this.

if CLIENT then return end; if not SERVER then return end

hook.Remove( "PhysgunDrop", "ulxPlayerDrop") -- We don't need this hook since we have a better hook here.
local function isPlayer(ent) return (IsValid(ent) && ent.GetClass && ent:GetClass() == "player") end

local function playerPickup( ply, ent )
	local access, tag = ULib.ucl.query( ply, "ulx physgunplayer" )
	if isPlayer(ent) and access then
		local restrictions = {}
		ULib.cmds.PlayerArg.processRestrictions( restrictions, ply, {}, tag and ULib.splitArgs( tag )[ 1 ] )
		if restrictions.restrictedTargets == false or (restrictions.restrictedTargets and not table.HasValue( restrictions.restrictedTargets, ent )) then
			return false
		end
		return true
	end
end

timer.Simple(0.01, function()
	hook.Add("PhysgunPickup", "_ply_physgungrab", function(ply, targ)
		if IsValid(ply) and isPlayer(targ) then
			if ply:query("ulx physgunplayer") and playerPickup( ply, targ ) then
				local allowed = ULib.getUser( "@", true, ply )
				if isPlayer(allowed) then
					if allowed.frozen && ply:query( "ulx unfreeze" ) then 
						allowed.phrozen = true; 
						allowed.frozen = false;
					end
					 
					allowed._ulx_physgun = {p=targ:GetPos(), b=true, a=ply}
				end
			end
		end
	end, tonumber(HOOK_HIGH)-2); MsgAll('LOADED! 1')
end)

hook.Add("PlayerSpawn", "_ply_physgungrab", function(ply)
	timer.Simple(0.001, function() 
		if IsValid(ply) and ply._ulx_physgun then
			local admin = ply._ulx_physgun.a
			if ply._ulx_physgun.b and ply._ulx_physgun.p and IsValid(admin) then 
				ply:SetPos(ply._ulx_physgun.p);
				ply:SetMoveType(MOVETYPE_NONE);
				timer.Simple(0.001, function()
					if not (IsValid(admin) and admin:KeyDown(IN_ATTACK)) then
						ply:SetMoveType( MOVETYPE_WALK )
						ply._ulx_physgun = nil
						ply:Spawn()
					end
				end)
			end
		end
	end)
end)

local function physgun_freeze( calling_ply, target_ply, should_unfreeze )
	local v = target_ply
	if v:InVehicle() then
		v:ExitVehicle()
	end

	if not should_unfreeze then
		v:Lock()
		v.frozen = true
		v.phrozen = true
		ulx.setExclusive( v, "frozen" )
	else
		v:UnLock()
		v.frozen = nil
		v.phrozen = nil
		ulx.clearExclusive( v )
	end

	v:DisallowSpawning( not should_unfreeze )
	ulx.setNoDie( v, not should_unfreeze )

	if v.whipped then
		v.whipcount = v.whipamt -- Will make it remove
	end
end

timer.Simple(0.01, function()
	hook.Add("OnPhysgunFreeze", "_ulx_physgunfreeze", function(pl, ent)
		if isPlayer(ent) then
			ent:SetMoveType( MOVETYPE_WALK )
			ent._ulx_physgun = nil
		end
	end)
	hook.Add("PhysgunDrop", "_ulx_physgunfreeze", function(pl, ent)
		if isPlayer(ent) then
			ent:SetMoveType( MOVETYPE_WALK )
			ent._ulx_physgun = nil
		end

		if IsValid(pl) and isPlayer(ent) then
			if pl:query("ulx freeze") then
				local isFrozen = ( ent:IsFrozen() or ent.frozen or ent.phrozen );
				ent:SetMoveType(pl:KeyDown(IN_ATTACK2) and MOVETYPE_NONE or MOVETYPE_WALK);
				timer.Simple(0.001, function()
					if pl:KeyDown(IN_ATTACK2) and not isFrozen then
						if pl:query( "ulx freeze" ) then
							ent:SetVelocity(ent:GetVelocity()*-1); 
							ulx.freeze( pl, {ent}, false );
							if ent.frozen then ent.phrozen = true end;
						end
					elseif pl:query( "ulx unfreeze" ) and isFrozen then
						if pl:KeyDown(IN_ATTACK2) and pl:query( "ulx freeze" ) then
							physgun_freeze(pl, ent, true)
							timer.Simple(0.001, function() physgun_freeze(pl, ent, false) end);
						else
							ulx.freeze( pl, {ent}, true );
							if not ent.frozen then ent.phrozen = nil end;
						end
					end
				end);
			else
				ent:SetMoveType( MOVETYPE_WALK )
			end
		end
	end); MsgAll('LOADED! 2')
end)

 

Link to comment

Non ULX version (works better, no command echo.)

hook.Add("PhysgunPickup", "PhysgunFreeze.PhysgunPickup", function(pl, ent)
	if ent:IsPlayer() and pl:IsAdmin() then
		--ent.physAdmin = pl
		ent:Freeze(true)
		ent:SetMoveType(MOVETYPE_NOCLIP)
		return true
	end
end)

hook.Add("PhysgunDrop", "PhysgunFreeze.PhysgunDrop", function(pl, ent)
	if ent:IsPlayer() and pl:IsAdmin() then
		if pl:KeyPressed(IN_ATTACK2) then return end

		--ent.physAdmin = nil
		ent:DropToFloor()
		ent:Freeze(false)
		ent:SetMoveType(MOVETYPE_WALK)
	end
end)

hook.Add("playerCanChangeTeam", "PhysgunFreeze.playerCanChangeTeam", function(ply)
	if ply:IsFrozen() then
		return false, "Unable to change job while frozen."
	end
end)

print("PhysFreeze Loaded")

 

Edited by ๖ۣۜJuice
fixed code
Link to comment

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.