Skip to content

Commit 1e8f36d

Browse files
committed
fix(server): invalid players
1 parent 1bf112f commit 1e8f36d

File tree

1 file changed

+92
-41
lines changed

1 file changed

+92
-41
lines changed

server/main.lua

+92-41
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
-----------------------
22
---- Variables ----
33
-----------------------
4+
45
local vehicleList = {}
56

67
-----------------------
7-
---- Threads ----
8+
---- Functions ----
89
-----------------------
910

10-
CreateThread(function()
11-
local vehicles = MySQL.query.await('SELECT * FROM player_vehicles')
11+
---Loads a players vehicles to the vehicleList
12+
---@param src integer
13+
local function addPlayer(src)
14+
local player = exports.qbx_core:GetPlayer(src)
15+
if not player then return end
16+
17+
local vehicles = MySQL.query.await('SELECT * FROM player_vehicles WHERE citizenid = ?', { player.PlayerData.citizenid })
1218
for i = 1, #vehicles do
1319
local data = vehicles[i]
1420
vehicleList[data.plate] = {}
@@ -17,7 +23,50 @@ CreateThread(function()
1723
vehicleList[data.plate][data.citizenid] = true
1824
end
1925
end
20-
end)
26+
end
27+
28+
---Removes a players vehicles from the vehicleList
29+
---@param src integer
30+
local function removePlayer(src)
31+
local player = exports.qbx_core:GetPlayer(src)
32+
if not player then return end
33+
34+
for k, v in pairs(vehicleList) do
35+
if v[player.PlayerData.citizenid] then
36+
vehicleList[k][player.PlayerData.citizenid] = nil
37+
end
38+
end
39+
end
40+
41+
function GiveKeys(id, plate)
42+
local player = exports.qbx_core:GetPlayer(id)
43+
if not player then return false end
44+
45+
if not vehicleList[plate] then vehicleList[plate] = {} end
46+
vehicleList[plate][player.PlayerData.citizenid] = true
47+
48+
exports.qbx_core:Notify(id, locale('notify.keys_taken'))
49+
TriggerClientEvent('qb-vehiclekeys:client:AddKeys', id, plate)
50+
51+
return true
52+
end
53+
54+
exports('GiveKeys', GiveKeys)
55+
56+
function RemoveKeys(id, plate)
57+
local player = exports.qbx_core:GetPlayer(id)
58+
if not player or not vehicleList[plate] or not vehicleList[plate][player.PlayerData.citizenid] then return false end
59+
60+
vehicleList[plate][player.PlayerData.citizenid] = nil
61+
TriggerClientEvent('qb-vehiclekeys:client:RemoveKeys', id, plate)
62+
63+
return true
64+
end
65+
66+
function HasKeys(id, plate)
67+
local player = exports.qbx_core:GetPlayer(id)
68+
return player and vehicleList[plate] and vehicleList[plate][player.PlayerData.citizenid]
69+
end
2170

2271
-----------------------
2372
---- Server Events ----
@@ -36,12 +85,11 @@ end)
3685
-- Must already have keys to the vehicle, trigger the event from the server, or pass forcegive paramter as true.
3786
RegisterNetEvent('qb-vehiclekeys:server:GiveVehicleKeys', function(receiver, plate)
3887
local giver = source
39-
4088
if HasKeys(giver, plate) then
4189
exports.qbx_core:Notify(giver, locale("notify.gave_keys"))
4290
if type(receiver) == 'table' then
43-
for _,r in ipairs(receiver) do
44-
GiveKeys(receiver[r], plate)
91+
for i = 1, receiver do
92+
GiveKeys(receiver[i], plate)
4593
end
4694
else
4795
GiveKeys(receiver, plate)
@@ -52,8 +100,7 @@ RegisterNetEvent('qb-vehiclekeys:server:GiveVehicleKeys', function(receiver, pla
52100
end)
53101

54102
RegisterNetEvent('qb-vehiclekeys:server:AcquireVehicleKeys', function(plate)
55-
local src = source
56-
GiveKeys(src, plate)
103+
GiveKeys(source, plate)
57104
end)
58105

59106
RegisterNetEvent('qb-vehiclekeys:server:breakLockpick', function(itemName)
@@ -78,38 +125,6 @@ lib.callback.register('qbx-vehiclekeys:server:getVehicleKeys', function(source)
78125
return keysList
79126
end)
80127

81-
-----------------------
82-
---- Functions ----
83-
-----------------------
84-
function GiveKeys(id, plate)
85-
local citizenid = exports.qbx_core:GetPlayer(id).PlayerData.citizenid
86-
87-
if not vehicleList[plate] then vehicleList[plate] = {} end
88-
vehicleList[plate][citizenid] = true
89-
90-
exports.qbx_core:Notify(id, locale('notify.keys_taken'))
91-
TriggerClientEvent('qb-vehiclekeys:client:AddKeys', id, plate)
92-
end
93-
exports('GiveKeys', GiveKeys)
94-
95-
function RemoveKeys(id, plate)
96-
local citizenid = exports.qbx_core:GetPlayer(id).PlayerData.citizenid
97-
98-
if vehicleList[plate] and vehicleList[plate][citizenid] then
99-
vehicleList[plate][citizenid] = nil
100-
end
101-
102-
TriggerClientEvent('qb-vehiclekeys:client:RemoveKeys', id, plate)
103-
end
104-
105-
function HasKeys(id, plate)
106-
local citizenid = exports.qbx_core:GetPlayer(id).PlayerData.citizenid
107-
if vehicleList[plate] and vehicleList[plate][citizenid] then
108-
return true
109-
end
110-
return false
111-
end
112-
113128
---Gives a key to an entity based on the player's CitizenID.
114129
---@param id integer The player's ID.
115130
---@param netId number The network ID of the entity.
@@ -121,6 +136,7 @@ RegisterNetEvent('qb-vehiclekeys:server:GiveKey', function(id, netId, doorState)
121136
-- drop player
122137
end
123138
end)
139+
124140
exports('GiveKey', GiveKey)
125141

126142
---Removes a key from an entity based on the player's CitizenID.
@@ -133,6 +149,7 @@ RegisterNetEvent('vehiclekeys:server:RemoveKey', function(id, netId)
133149
-- drop player
134150
end
135151
end)
152+
136153
exports('RemoveKey', RemoveKey)
137154

138155
---Sets the door state to a desired value.
@@ -146,8 +163,26 @@ RegisterNetEvent('vehiclekeys:server:SetDoorState', function(netId, doorState)
146163
-- drop player
147164
end
148165
end)
166+
149167
exports('SetDoorState', SetDoorState)
150168

169+
AddEventHandler('QBCore:Server:OnPlayerLoaded', function()
170+
addPlayer(source --[[@as integer]])
171+
end)
172+
173+
---@param src integer
174+
AddEventHandler('QBCore:Server:OnPlayerUnload', function(src)
175+
removePlayer(src)
176+
end)
177+
178+
AddEventHandler('playerDropped', function()
179+
removePlayer(source --[[@as integer]])
180+
end)
181+
182+
-----------------------
183+
---- Callbacks ----
184+
-----------------------
185+
151186
---Gives a key to an entity based on the target player's CitizenID but only if the owner already has a key.
152187
---@param source number ID of the player
153188
---@param netId number The network ID of the entity.
@@ -182,4 +217,20 @@ end)
182217
---@return boolean
183218
lib.callback.register('vehiclekeys:server:IsPlayerOwned', function(_, plate)
184219
return not not vehicleList[plate]
220+
end)
221+
222+
-----------------------
223+
---- Threads ----
224+
-----------------------
225+
226+
CreateThread(function()
227+
local vehicles = MySQL.query.await('SELECT * FROM player_vehicles')
228+
for i = 1, #vehicles do
229+
local data = vehicles[i]
230+
vehicleList[data.plate] = {}
231+
232+
if data.citizenid then
233+
vehicleList[data.plate][data.citizenid] = true
234+
end
235+
end
185236
end)

0 commit comments

Comments
 (0)