From a278f8093364aa6126afaec13a8716309429493a Mon Sep 17 00:00:00 2001 From: Vitroze Date: Wed, 22 Apr 2026 21:09:47 +0200 Subject: [PATCH 1/3] Add vehicle check to PhysgunPickup and CanTarget functions Co-authored-by: Copilot --- lua/glide/sh_player.lua | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/lua/glide/sh_player.lua b/lua/glide/sh_player.lua index 2e027a7d..1e879243 100644 --- a/lua/glide/sh_player.lua +++ b/lua/glide/sh_player.lua @@ -96,4 +96,30 @@ if SERVER then ply.GlideCameraAngles = angles ply.GlideCameraAimPos = EntEyePos( ply ) + angles:Forward() * cmd:GetUpMove() end, HOOK_HIGH ) + + local function checkInVehicle( ply ) + if not IsValid( ply ) or not ply:IsPlayer() then return false end + + local vehicle = GetNWEntity( ply, "GlideVehicle", NULL ) + return IsValid( vehicle ) + end + + hook.Add( "PhysgunPickup", "Glide.PhysgunPickup", function( _, ent ) + if not checkInVehicle( ent ) then return end + + return false + end, HOOK_HIGH ) + + if SAM then + Glide._OriginalCanTarget = Glide._OriginalCanTarget or PlayerMeta.CanTarget + local CanTarget = Glide._OriginalCanTarget + + function PlayerMeta:CanTarget( target ) + if checkInVehicle( target ) then + return false + end + + return CanTarget( self, target ) + end + end end From 20d1970dd6f699d0487eb98e4239314c2e3bd316 Mon Sep 17 00:00:00 2001 From: Vitroze Date: Wed, 22 Apr 2026 21:12:32 +0200 Subject: [PATCH 2/3] Rename checkInVehicle function to CheckInVehicleGlide for consistency and clarity Co-authored-by: Copilot --- lua/glide/sh_player.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lua/glide/sh_player.lua b/lua/glide/sh_player.lua index 1e879243..a2338d17 100644 --- a/lua/glide/sh_player.lua +++ b/lua/glide/sh_player.lua @@ -97,7 +97,7 @@ if SERVER then ply.GlideCameraAimPos = EntEyePos( ply ) + angles:Forward() * cmd:GetUpMove() end, HOOK_HIGH ) - local function checkInVehicle( ply ) + local function CheckInVehicleGlide( ply ) if not IsValid( ply ) or not ply:IsPlayer() then return false end local vehicle = GetNWEntity( ply, "GlideVehicle", NULL ) @@ -105,7 +105,7 @@ if SERVER then end hook.Add( "PhysgunPickup", "Glide.PhysgunPickup", function( _, ent ) - if not checkInVehicle( ent ) then return end + if not CheckInVehicleGlide( ent ) then return end return false end, HOOK_HIGH ) @@ -115,7 +115,7 @@ if SERVER then local CanTarget = Glide._OriginalCanTarget function PlayerMeta:CanTarget( target ) - if checkInVehicle( target ) then + if CheckInVehicleGlide( target ) then return false end From bb86c91ba94d437fdd57d72b0cdc108b64c265e6 Mon Sep 17 00:00:00 2001 From: Vitroze Date: Wed, 22 Apr 2026 21:38:46 +0200 Subject: [PATCH 3/3] Implement player freezing in PhysgunPickup for SAM integration Co-authored-by: Copilot --- lua/glide/sh_player.lua | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/lua/glide/sh_player.lua b/lua/glide/sh_player.lua index a2338d17..75693c2c 100644 --- a/lua/glide/sh_player.lua +++ b/lua/glide/sh_player.lua @@ -104,22 +104,26 @@ if SERVER then return IsValid( vehicle ) end - hook.Add( "PhysgunPickup", "Glide.PhysgunPickup", function( _, ent ) - if not CheckInVehicleGlide( ent ) then return end - - return false - end, HOOK_HIGH ) - - if SAM then - Glide._OriginalCanTarget = Glide._OriginalCanTarget or PlayerMeta.CanTarget - local CanTarget = Glide._OriginalCanTarget + if sam then + local freeze_player = function( ply ) + if SERVER then + ply:Lock() + end + ply:SetMoveType( MOVETYPE_NONE ) + ply:SetCollisionGroup( COLLISION_GROUP_WORLD ) + end - function PlayerMeta:CanTarget( target ) - if CheckInVehicleGlide( target ) then - return false + 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 not CheckInVehicleGlide( target ) then + freeze_player( target ) + return true end + end ) + else + hook.Add( "PhysgunPickup", "Glide.PhysgunPickup", function( _, ent ) + if not CheckInVehicleGlide( ent ) then return end - return CanTarget( self, target ) - end + return false + end, HOOK_HIGH ) end end