diff --git a/lua/glide/client/lock_on.lua b/lua/glide/client/lock_on.lua index d5fbac21..383f0f8b 100644 --- a/lua/glide/client/lock_on.lua +++ b/lua/glide/client/lock_on.lua @@ -153,22 +153,50 @@ function LockOnHandler:Think() end end -local isInVehicle = false +local glideVehicle = nil +local GetParent = FindMetaTable( "Entity" ).GetParent +local GetVehicle = FindMetaTable( "Player" ).GetVehicle +local IsValid = IsValid + +local function EnterVehicle( vehicle ) + if not IsValid( vehicle ) then return end + local vehicleSelect = IsValid( GetParent( vehicle ) ) and GetParent( vehicle ) or vehicle + if glideVehicle == vehicleSelect then return end + + LockOnHandler:Setup( vehicleSelect ) + glideVehicle = vehicleSelect +end -timer.Create( "Glide.LockOnEnableCheck", 0.5, 0, function() - local user = LocalPlayer() - if not IsValid( user ) then return end +hook.Add( "Glide_OnLocalEnterVehicle", "Glide.LockOnHandlerSetup", EnterVehicle ) +hook.Add( "Glide_OnLocalEnterNotGlideVehicle", "Glide.LockOnHandlerSetup", function( vehicle ) + -- In vehicle systems, a passenger's GetParent is nil. Moving to the next frame isn't enough; you need to add 0.1 seconds. + timer.Create( "Glide.LockOnHandlerSetup", 0.1, 1, function() + EnterVehicle( vehicle ) + end ) +end ) - local veh = user:GetVehicle() +local function ExitVehicle( bIsGlide ) + timer.Simple( 0.5, function() + local ply = LocalPlayer() + if not IsValid( ply ) then return end - if IsValid( veh ) then - if not isInVehicle then - isInVehicle = true - LockOnHandler:Setup( veh ) + local vehicle = ply:GlideGetVehicle() + if not bIsGlide then + local vehicleTarget = GetVehicle( ply ) + vehicle = IsValid( vehicleTarget ) and GetParent( vehicleTarget ) or vehicleTarget end - elseif isInVehicle then - isInVehicle = false + if IsValid( vehicle ) and glideVehicle == vehicle then return end + LockOnHandler:Cleanup() - end + glideVehicle = nil + end ) +end + +hook.Add( "Glide_OnLocalExitVehicle", "Glide.LockOnHandlerCleanup", function() + ExitVehicle( true ) end ) + +hook.Add( "Glide_OnLocalExitNotGlideVehicle", "Glide.LockOnHandlerCleanup", function() + ExitVehicle( false ) +end ) \ No newline at end of file diff --git a/lua/glide/client/network.lua b/lua/glide/client/network.lua index 3143e110..130f4091 100644 --- a/lua/glide/client/network.lua +++ b/lua/glide/client/network.lua @@ -66,6 +66,19 @@ commands[Glide.CMD_FORCE_THIRDPERSON] = function() Glide.Camera:SetFirstPerson( not useThirdPerson ) end +commands[Glide.CMD_MANAGE_VEHICLE] = function() + local action = net.ReadUInt( 2 ) + local seat = net.ReadEntity() + + if not IsValid( seat ) then return end + + if action == 1 then + hook.Run( "Glide_OnLocalEnterNotGlideVehicle", seat, LocalPlayer() ) + elseif action == 2 then + hook.Run( "Glide_OnLocalExitNotGlideVehicle", seat, LocalPlayer() ) + end +end + net.Receive( "glide.command", function() local cmd = net.ReadUInt( Glide.CMD_SIZE ) diff --git a/lua/glide/server/events.lua b/lua/glide/server/events.lua index 9e4ba83c..05844285 100644 --- a/lua/glide/server/events.lua +++ b/lua/glide/server/events.lua @@ -32,7 +32,15 @@ hook.Add( "PlayerEnteredVehicle", "Glide.OnEnterSeat", function( ply, seat ) -- Make sure this seat was created by Glide local seatIndex = seat.GlideSeatIndex - if not seatIndex then return end + if not seatIndex then + + Glide.StartCommand( Glide.CMD_MANAGE_VEHICLE, false ) + net.WriteUInt( 1, 2 ) -- 1 = Entered + net.WriteEntity( seat ) + net.Send( ply ) + + return + end -- Is this seat's parent a Glide vehicle? local parent = seat:GetParent() @@ -61,7 +69,15 @@ end ) -- Once a player leaves a Glide vehicle, cleanup network variables -- and trigger the `Glide_OnExitVehicle` hook. hook.Add( "PlayerLeaveVehicle", "Glide.OnExitSeat", function( ply, seat ) - if not ply.IsUsingGlideVehicle then return end + if not ply.IsUsingGlideVehicle then + + Glide.StartCommand( Glide.CMD_MANAGE_VEHICLE, false ) + net.WriteUInt( 2, 2 ) -- 2 = Exited + net.WriteEntity( seat ) + net.Send( ply ) + + return + end local seatIndex = seat.GlideSeatIndex if not seatIndex then return end diff --git a/lua/glide/sh_network.lua b/lua/glide/sh_network.lua index ea249ce0..e8015796 100644 --- a/lua/glide/sh_network.lua +++ b/lua/glide/sh_network.lua @@ -19,7 +19,7 @@ Glide.CMD_VIEW_PUNCH = 5 Glide.CMD_SET_HEADLIGHTS = 6 Glide.CMD_NOTIFY = 7 Glide.CMD_SHOW_KEY_NOTIFICATION = 8 --- Slot 9 is free +Glide.CMD_MANAGE_VEHICLE = 9 Glide.CMD_UPLOAD_ENGINE_STREAM_PRESET = 10 Glide.CMD_UPLOAD_MISC_SOUNDS_PRESET = 11 Glide.CMD_RELOAD_VSWEP = 13