diff --git a/client/events.lua b/client/events.lua index fa6db1662..a47b072e6 100644 --- a/client/events.lua +++ b/client/events.lua @@ -176,6 +176,8 @@ RegisterNetEvent('QBCore:Client:VehicleInfo', function(info) } TriggerEvent('QBCore:Client:' .. info.event .. 'Vehicle', data) + data.vehicle = NetworkGetEntityIsNetworked(info.vehicle) and NetworkGetNetworkIdFromEntity(info.vehicle) or 0 + TriggerServerEvent('QBCore:Server:' .. info.event .. 'Vehicle', data) end) -- Other stuff @@ -274,3 +276,77 @@ end) RegisterNetEvent('QBCore:Client:SharedUpdate', function(table) QBCore.Shared = table end) + +local lastVehicleData = {} +local THREAD_INTERVAl_CHECKER = 1000 + +-- Thread for vehicle entering event +CreateThread(function() + local entering = false + while true do + if LocalPlayer.state.isLoggedIn then + local ped = PlayerPedId() + local vehicle = GetVehiclePedIsTryingToEnter(ped) + if vehicle ~= 0 then + if not entering then + entering = true + TriggerEvent('QBCore:Client:VehicleInfo', {vehicle = vehicle, seat = GetSeatPedIsTryingToEnter(ped), name = GetEntityModel(vehicle), event = 'Entering'}) + end + elseif entering then + entering = false + end + end + Wait(THREAD_INTERVAl_CHECKER) + end +end) + +--- Vehicle thread to check changes in player state (enter/exit vehicle, change seat) +--- @param inputVehicle number Vehicle entity +local inVehicleThread = function(inputVehicle) + if lastVehicleData.vehicle ~= nil then return end + lastVehicleData.vehicle = inputVehicle + CreateThread(function() + while lastVehicleData.vehicle ~= nil do + local vehicle = GetVehiclePedIsIn(PlayerPedId(), false) + + if vehicle == 0 then + TriggerEvent('QBCore:Client:VehicleInfo', {vehicle = lastVehicleData.vehicle, seat = lastVehicleData.seat, name = lastVehicleData.model, event = 'Left'}) + lastVehicleData = {} + break + end + + local currentSeat = QBCore.Functions.GetPedCurrentSeatInVehicle(vehicle) + if vehicle ~= lastVehicleData.vehicle then + TriggerEvent('QBCore:Client:VehicleInfo', {vehicle = lastVehicleData.vehicle, seat = lastVehicleData.seat, name = lastVehicleData.model, event = 'Left'}) + lastVehicleData = { + vehicle = vehicle, + seat = currentSeat, + model = GetEntityModel(vehicle) + } + TriggerEvent('QBCore:Client:VehicleInfo', {vehicle = lastVehicleData.vehicle, seat = lastVehicleData.seat, name = lastVehicleData.model, event = 'Entered'}) + end + + if currentSeat ~= lastVehicleData.seat then + TriggerEvent('QBCore:Client:VehicleInfo', {vehicle = lastVehicleData.vehicle, seat = lastVehicleData.seat, name = lastVehicleData.model, event = 'ChangedSeat'}) + lastVehicleData.seat = currentSeat + end + + Wait(THREAD_INTERVAl_CHECKER) + end + end) +end + +AddEventHandler('gameEventTriggered', function (name, args) + if name ~= "CEventNetworkPlayerEnteredVehicle" then return end + local vehicle = args[2] + + if vehicle == lastVehicleData.vehicle then return end + + lastVehicleData = { + seat = QBCore.Functions.GetPedCurrentSeatInVehicle(vehicle), + model = GetEntityModel(vehicle) + } + + TriggerEvent('QBCore:Client:VehicleInfo', {vehicle = vehicle, seat = lastVehicleData.seat, name = lastVehicleData.model, event = 'Entered'}) + inVehicleThread(vehicle) +end) diff --git a/client/functions.lua b/client/functions.lua index 75d2db999..929f1c6ab 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -167,6 +167,22 @@ function QBCore.Functions.IsWearingGloves() return true end +--- Returns the current seat of the player +--- @param vehicle? number|nil The vehicle to check (if not specified, the player's current vehicle is used) +--- @return number|nil seat The current seat of the player (nil if player is not in that vehicle) +function QBCore.Functions.GetPedCurrentSeatInVehicle(vehicle) + local ped = PlayerPedId() + if not vehicle then vehicle = GetVehiclePedIsIn(ped, false) end + + for i = -1, 6 do + if GetPedInVehicleSeat(vehicle, i) == ped then + return i + end + end + + return nil +end + -- NUI Calls function QBCore.Functions.Notify(text, texttype, length, icon) diff --git a/server/events.lua b/server/events.lua index 49a4c1bfb..80f9c125f 100644 --- a/server/events.lua +++ b/server/events.lua @@ -208,47 +208,6 @@ AddEventHandler('QBCore:Server:OnPlayerUpdated', function(src, key, val) end end) --- BaseEvents - --- Vehicles -RegisterServerEvent('baseevents:enteringVehicle', function(veh, seat, modelName) - local src = source - local data = { - vehicle = veh, - seat = seat, - name = modelName, - event = 'Entering' - } - TriggerClientEvent('QBCore:Client:VehicleInfo', src, data) -end) - -RegisterServerEvent('baseevents:enteredVehicle', function(veh, seat, modelName) - local src = source - local data = { - vehicle = veh, - seat = seat, - name = modelName, - event = 'Entered' - } - TriggerClientEvent('QBCore:Client:VehicleInfo', src, data) -end) - -RegisterServerEvent('baseevents:enteringAborted', function() - local src = source - TriggerClientEvent('QBCore:Client:AbortVehicleEntering', src) -end) - -RegisterServerEvent('baseevents:leftVehicle', function(veh, seat, modelName) - local src = source - local data = { - vehicle = veh, - seat = seat, - name = modelName, - event = 'Left' - } - TriggerClientEvent('QBCore:Client:VehicleInfo', src, data) -end) - -- Non-Chat Command Calling (ex: qb-adminmenu) RegisterNetEvent('QBCore:CallCommand', function(command, args)