From bd2e34d708adf85ac76bd5f609c89b7c7685e137 Mon Sep 17 00:00:00 2001 From: Strange <41299185+megascan@users.noreply.github.com> Date: Thu, 23 Jan 2025 16:49:56 +0200 Subject: [PATCH 1/5] Hooks --- lua/entities/base_glide/cl_init.lua | 2 ++ lua/entities/base_glide_car/cl_init.lua | 1 + lua/glide/server/ragdoll.lua | 9 +++++++++ lua/glide/server/util.lua | 14 ++++++++++---- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/lua/entities/base_glide/cl_init.lua b/lua/entities/base_glide/cl_init.lua index 1297ae8..4aaedc9 100644 --- a/lua/entities/base_glide/cl_init.lua +++ b/lua/entities/base_glide/cl_init.lua @@ -402,6 +402,8 @@ do local seats = self.seats if not seats then return end + if hook.Run( "Glide_CanDrawHUDSeats", self ) == false then return end + local t = RealTime() local localPly = LocalPlayer() diff --git a/lua/entities/base_glide_car/cl_init.lua b/lua/entities/base_glide_car/cl_init.lua index 342c421..d821aeb 100644 --- a/lua/entities/base_glide_car/cl_init.lua +++ b/lua/entities/base_glide_car/cl_init.lua @@ -582,6 +582,7 @@ local w, h, x, y --- Override this base class function. function ENT:DrawVehicleHUD( screenW, screenH ) + if hook.Run( "Glide_CanDrawHUD", self ) == false then return end BaseClass.DrawVehicleHUD( self, screenW, screenH ) if not Config.showHUD then return end diff --git a/lua/glide/server/ragdoll.lua b/lua/glide/server/ragdoll.lua index 7cd3e1d..6c07654 100644 --- a/lua/glide/server/ragdoll.lua +++ b/lua/glide/server/ragdoll.lua @@ -153,6 +153,8 @@ local function PoseRagdollBones( ragdoll, bones, velocity ) end function Glide.RagdollPlayer( ply, velocity, unragdollTime ) + if hook.Run( "Glide_CanRagdollPlayer", ply, velocity, unragdollTime) == false then return end + if ply.GlideRagdoll then return end local bones = GetAllBones( ply ) @@ -170,6 +172,7 @@ function Glide.RagdollPlayer( ply, velocity, unragdollTime ) return end + hook.Run( "Glide_PrePlayerRagdoll", ply) -- Create ragdoll local ragdoll = ents.Create( "prop_ragdoll" ) if not IsValid( ragdoll ) then return end @@ -228,6 +231,8 @@ function Glide.RagdollPlayer( ply, velocity, unragdollTime ) Glide.UnRagdollPlayer( ply ) end ) end + + hook.Run( "Glide_PostPlayerRagdoll", ply) end local traceData = { @@ -261,6 +266,8 @@ end function Glide.UnRagdollPlayer( ply, restoreCallback ) if not IsValid( ply ) then return end + hook.Run( "Glide_PrePlayerUnRagdoll", ply) + timer.Remove( "Glide_Ragdoll_" .. ply:EntIndex() ) -- Make sure this player is still ragdolled @@ -315,6 +322,8 @@ function Glide.UnRagdollPlayer( ply, restoreCallback ) -- Reset Custom Loadout workaround ply.GlideBlockLoadout = nil + + hook.Run( "Glide_PostPlayerUnRagdoll", ply) end hook.Add( "CanTool", "Glide.BlockPlayerRagdolls", function( _, tr ) diff --git a/lua/glide/server/util.lua b/lua/glide/server/util.lua index e37a05f..fcd0e43 100644 --- a/lua/glide/server/util.lua +++ b/lua/glide/server/util.lua @@ -140,6 +140,8 @@ end ) local IsValid = IsValid function Glide.CanSpawnVehicle( ply ) + if hook.Run( "Glide_CanSpawnVehicle", ply ) == false then return false end + if not IsValid( ply ) then return false end if not ply:CheckLimit( "glide_vehicles" ) then return false end @@ -182,17 +184,21 @@ function Glide.CanLockVehicle( ply, vehicle ) end end - return false + return hook.Run( "Glide_CanLockVehicle", ply, vehicle) or false end --- Check if a player can enter a locked vehicle. function Glide.CanEnterLockedVehicle( ply, vehicle ) - return Glide.CanLockVehicle( ply, vehicle ) + return hook.Run( "Glide_CanEnterLockedVehicle", ply, vehicle ) or Glide.CanLockVehicle( ply, vehicle ) end --- Make a player switch to another seat --- while inside a Glide vehicle. function Glide.SwitchSeat( ply, seatIndex ) + if hook.Run( "Glide_CanSwitchSeat", ply, seatIndex ) == false then return end + + hook.Run( "Glide_PreSwitchSeat", ply, seatIndex ) + local vehicle = ply:GlideGetVehicle() if not IsValid( vehicle ) then return end @@ -210,9 +216,9 @@ function Glide.SwitchSeat( ply, seatIndex ) ply:ExitVehicle() ply:SetAllowWeaponsInVehicle( false ) ply:EnterVehicle( seat ) -end -local GetHumans = player.GetHumans + hook.Run( "Glide_PostSwitchSeat", ply, seatIndex ) +end --- Finds and returns all human players near a certain position. function Glide.GetNearbyPlayers( pos, radius ) From 733c8573aba8f5438a199c3d317c40d17a0982be Mon Sep 17 00:00:00 2001 From: Strange <41299185+megascan@users.noreply.github.com> Date: Thu, 23 Jan 2025 16:50:09 +0200 Subject: [PATCH 2/5] Optimizations --- lua/glide/server/ragdoll.lua | 2 +- lua/glide/server/util.lua | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lua/glide/server/ragdoll.lua b/lua/glide/server/ragdoll.lua index 6c07654..19529aa 100644 --- a/lua/glide/server/ragdoll.lua +++ b/lua/glide/server/ragdoll.lua @@ -351,7 +351,7 @@ hook.Add( "PlayerDisconnected", "Glide.CleanupPlayerRagdolls", function( ply ) end ) hook.Add( "PreCleanupMap", "Glide.CleanupPlayerRagdolls", function() - for _, ply in ipairs( player.GetAll() ) do + for _, ply in player.Iterator() do Glide.UnRagdollPlayer( ply ) end end ) diff --git a/lua/glide/server/util.lua b/lua/glide/server/util.lua index fcd0e43..e222284 100644 --- a/lua/glide/server/util.lua +++ b/lua/glide/server/util.lua @@ -226,7 +226,9 @@ function Glide.GetNearbyPlayers( pos, radius ) local found, count = {}, 0 - for _, ply in ipairs( GetHumans() ) do + for _, ply in player.Iterator() do + if ply:IsBot() then continue end + local dist = pos:DistToSqr( ply:GetPos() ) if dist < radius then From 4896c31eed6c6c5f284b6c43dbd4596991c8586f Mon Sep 17 00:00:00 2001 From: Strange <41299185+megascan@users.noreply.github.com> Date: Thu, 23 Jan 2025 16:50:24 +0200 Subject: [PATCH 3/5] Improved vehicle entering by entering nearest available seat --- lua/entities/base_glide/init.lua | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/lua/entities/base_glide/init.lua b/lua/entities/base_glide/init.lua index 046fabf..e5357d8 100644 --- a/lua/entities/base_glide/init.lua +++ b/lua/entities/base_glide/init.lua @@ -168,7 +168,7 @@ function ENT:Use( activator ) if not IsValid( activator ) then return end if not activator:IsPlayer() then return end - local freeSeat = self:GetFreeSeat() + local freeSeat = self:GetClosestAvailableSeat( activator:GetShootPos() ) if freeSeat then activator:SetAllowWeaponsInVehicle( false ) activator:EnterVehicle( freeSeat ) @@ -348,6 +348,22 @@ function ENT:GetFreeSeat() end end +--- Gets the closest available seat to a position. +function ENT:GetClosestAvailableSeat( pos ) + local closestSeat = nil + local closestDistance = math.huge + for _, seat in ipairs( self.seats ) do + if IsValid( seat:GetDriver() ) then continue end + local distance = seat:GetPos():Distance( pos ) + if distance < closestDistance then + closestSeat = seat + closestDistance = distance + end + end + + return closestSeat +end + --- Create a new seat. --- --- `offset` is the seat's position relative to the chassis. From 14f5168b338b6141bd42c5b19871c5e6dc46b665 Mon Sep 17 00:00:00 2001 From: Strange <41299185+megascan@users.noreply.github.com> Date: Thu, 23 Jan 2025 16:54:49 +0200 Subject: [PATCH 4/5] Replaced Distance -> DistToSqr --- lua/entities/base_glide/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/entities/base_glide/init.lua b/lua/entities/base_glide/init.lua index e5357d8..1a8793a 100644 --- a/lua/entities/base_glide/init.lua +++ b/lua/entities/base_glide/init.lua @@ -354,7 +354,7 @@ function ENT:GetClosestAvailableSeat( pos ) local closestDistance = math.huge for _, seat in ipairs( self.seats ) do if IsValid( seat:GetDriver() ) then continue end - local distance = seat:GetPos():Distance( pos ) + local distance = seat:GetPos():DistToSqr( pos ) if distance < closestDistance then closestSeat = seat closestDistance = distance From cc24683d7acdc217f4f614888a4a79e21e709d35 Mon Sep 17 00:00:00 2001 From: Strange <41299185+megascan@users.noreply.github.com> Date: Thu, 23 Jan 2025 20:04:38 +0200 Subject: [PATCH 5/5] Styling Changes --- lua/glide/server/ragdoll.lua | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lua/glide/server/ragdoll.lua b/lua/glide/server/ragdoll.lua index 19529aa..2ffa548 100644 --- a/lua/glide/server/ragdoll.lua +++ b/lua/glide/server/ragdoll.lua @@ -153,7 +153,11 @@ local function PoseRagdollBones( ragdoll, bones, velocity ) end function Glide.RagdollPlayer( ply, velocity, unragdollTime ) - if hook.Run( "Glide_CanRagdollPlayer", ply, velocity, unragdollTime) == false then return end + local success, velocity_override, unragdollTimeOverride = hook.Run( "Glide_CanRagdollPlayer", ply, velocity, unragdollTime ) + if success == false then return end + + velocity = velocity_override or velocity + unragdollTime = unragdollTimeOverride or unragdollTime if ply.GlideRagdoll then return end @@ -172,7 +176,7 @@ function Glide.RagdollPlayer( ply, velocity, unragdollTime ) return end - hook.Run( "Glide_PrePlayerRagdoll", ply) + hook.Run( "Glide_PrePlayerRagdoll", ply ) -- Create ragdoll local ragdoll = ents.Create( "prop_ragdoll" ) if not IsValid( ragdoll ) then return end @@ -232,7 +236,7 @@ function Glide.RagdollPlayer( ply, velocity, unragdollTime ) end ) end - hook.Run( "Glide_PostPlayerRagdoll", ply) + hook.Run( "Glide_PostPlayerRagdoll", ply ) end local traceData = { @@ -266,7 +270,7 @@ end function Glide.UnRagdollPlayer( ply, restoreCallback ) if not IsValid( ply ) then return end - hook.Run( "Glide_PrePlayerUnRagdoll", ply) + hook.Run( "Glide_PrePlayerUnRagdoll", ply ) timer.Remove( "Glide_Ragdoll_" .. ply:EntIndex() ) @@ -323,7 +327,7 @@ function Glide.UnRagdollPlayer( ply, restoreCallback ) -- Reset Custom Loadout workaround ply.GlideBlockLoadout = nil - hook.Run( "Glide_PostPlayerUnRagdoll", ply) + hook.Run( "Glide_PostPlayerUnRagdoll", ply ) end hook.Add( "CanTool", "Glide.BlockPlayerRagdolls", function( _, tr )