pastefile1
@@ -0,0 +1,568 @@
+
+
+-- I Know it is dutch :)
+-- Bc Infinity obfuscated the code I remade it for VAG.gg
+-- By Sympact06
+
+
+
+
+
+
+
+
+function splitString(inputstr, sep)
+ local t= {}; i=1
+ for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
+ t[i] = str
+ i = i + 1
+ end
+ return t
+end
+local restartingstate = false
+AddEventHandler('txAdmin:events:scheduledRestart', function(eventData)
+ if eventData.secondsRemaining > 3600 then
+ TriggerClientEvent('chatMessage', -1, "SYSTEM", "error", "🚨 De server heeft een geplande restart over "..string.format("%01.f", math.floor(eventData.secondsRemaining/3600)).." uur.")
+ elseif eventData.secondsRemaining > 60 then
+ TriggerClientEvent('chatMessage', -1, "SYSTEM", "error", "🚨 De server heeft een geplande restart over "..math.floor((tonumber(eventData.secondsRemaining) / 60)+ 0.5*0).." minuten.")
+ elseif eventData.secondsRemaining == 60 then
+ TriggerClientEvent('chatMessage', -1, "SYSTEM", "error", "🚨 De server heeft een geplande restart over "..(tonumber(eventData.secondsRemaining)-15).." seconden!")
+ Citizen.CreateThread(function()
+ Citizen.Wait(45000)
+ TriggerClientEvent('chatMessage', -1, "SYSTEM", "error", "🚨 De server heeft een geplande restart over 5 seconden!")
+ restartingstate = true
+ Citizen.Wait(5000)
+ SaveVehicles()
+ for k, v in pairs(JRMEngine.Functions.GetPlayers()) do
+ local Player = JRMEngine.Functions.GetPlayer(v)
+ if Player ~= nil then
+ DropPlayer(Player.PlayerData.source, "\n🔌 "..JRMEngine.Config.Server.CityName.." Geplande Server Restart, de snelwegen zijn z.s.m weer geopend!\n🔸 Kijk op onze Discord voor meer informatie: "..JRMEngine.Config.Server.Discord)
+ end
+ end
+ Citizen.Wait(500)
+ print('^2[JRMEngine]^7 COMPLETED SHUTDOWN, BYE!')
+ end)
+ end
+end)
+AddEventHandler('JRMEngine:vehicles:server:forcedSave', function(shutdown)
+ SaveVehicles()
+ if shutdown ~= nil then
+ print('^2[JRMEngine]^7 COMPLETED SAVING VEHICLES, YOU CAN NOW TERMINATE THE PROGRAM.')
+ end
+end)
+RegisterServerEvent("JRMEngine:PlayerJoined")
+AddEventHandler('JRMEngine:PlayerJoined', function()
+ local src = source
+end)
+AddEventHandler('playerDropped', function(reason)
+ local src = source
+ if src ~= nil then
+ print('^2[JRMEngine]^7 '..GetPlayerName(src)..' has disconnected!')
+ local identf = GetPlayerIdentifiers(src)
+ if identf ~= nil then
+ TriggerEvent("jrm-log:server:CreateLog", "joinleave", "Dropped", "red", "**".. GetPlayerName(src) .. "** ("..identf[1]..") left.. `"..json.encode(reason).."`")
+ TriggerEvent("jrm-log:server:sendLog", identf[1], "joined", {})
+ end
+ if JRMEngine.Players[src] ~= nil then -- possible fix for duplicating items on console quit when creating a new drop or putting something in a stash.
+ JRMEngine.Players[src].Functions.Save()
+ end
+ if reason ~= "Reconnecting" and src > 60000 then return false end
+ if JRMEngine.Players[src] == nil then return false end
+ --if reason ~= "Exiting" and reason:sub(1, 36) ~= "Server->client connection timed out." then
+ exports['ghmattimysql']:execute('UPDATE jrm_player_vehicles SET state = @state, depotprice = @depotprice WHERE state = @crst AND citizenid = @citizenid LIMIT 1', {['@state'] = 3, ['@citizenid'] = JRMEngine.Players[src].PlayerData.citizenid, ['@depotprice'] = math.random(95, 105), ['@crst'] = 0})
+ --end
+ TriggerEvent("JRMEngine:Server:OnPlayerDisconnect", src, JRMEngine.Players[src].PlayerData.citizenid)
+ JRMEngine.Players[src].Functions.Save()
+ JRMEngine.Players[src] = nil
+ else
+ print('^2[JRMEngine]^7 Unknown player (empty source) has disconnected!')
+ end
+end)
+AddEventHandler('playerConnecting', function(playerName, setKickReason, deferrals)
+ deferrals.defer()
+ local src = source
+ deferrals.update("\nFiveM Account Controle...")
+ local steamid = ""
+ local license = ""
+ local discord = ""
+ local xbl = ""
+ local liveid = ""
+ local ip = ""
+ for k,v in pairs(GetPlayerIdentifiers(src)) do
+ if string.sub(v, 1, string.len("steam:")) == "steam:" then
+ steamid = v
+ elseif string.sub(v, 1, string.len("license:")) == "license:" then
+ license = v
+ elseif string.sub(v, 1, string.len("xbl:")) == "xbl:" then
+ xbl = v
+ elseif string.sub(v, 1, string.len("ip:")) == "ip:" then
+ ip = v
+ elseif string.sub(v, 1, string.len("discord:")) == "discord:" then
+ discord = v
+ elseif string.sub(v, 1, string.len("live:")) == "live:" then
+ liveid = v
+ end
+ end
+ local name = GetPlayerName(src)
+ if name == nil then
+ JRMEngine.Functions.Kick(src, 'Gebruik geen leeg steam naam.', setKickReason, deferrals)
+ CancelEvent()
+ return false
+ end
+ if(string.match(name, "[*%%'=`\"]")) then
+ JRMEngine.Functions.Kick(src, 'Je hebt een teken in je steam naam ('..string.match(name, "[*%%'=`\"]")..') dat niet geldig is.\nVerwijder deze a.u.b uit je steam naam om verder te gaan.', setKickReason, deferrals)
+ CancelEvent()
+ return false
+ end
+ if (string.match(name, "drop") or string.match(name, "table") or string.match(name, "database")) then
+ JRMEngine.Functions.Kick(src, 'Je hebt in je naam een woord (drop/table/database) zitten wat niet is toegestaan.\nGelieven je steam naam te veranderen.', setKickReason, deferrals)
+ CancelEvent()
+ return false
+ end
+ deferrals.update("\nProfiel Controleren...")
+ if (JRMConfig.IdentifierType == "steam" and (steamid:sub(1,6) == "steam:") == false) then
+ JRMEngine.Functions.Kick(src, 'Je moet steam open hebben om met '..JRMEngine.Config.Server.CityName..' te verbinden.\n📡 Het kan ook zijn dat de server nog aan het opstarten is..', setKickReason, deferrals)
+ CancelEvent()
+ return false
+ elseif (JRMConfig.IdentifierType == "license" and (license:sub(1,8) == "license:") == false) then
+ JRMEngine.Functions.Kick(src, 'Geen Social Club license gevonden.', setKickReason, deferrals)
+ CancelEvent()
+ return false
+ end
+ deferrals.update("\nBanlijst Controleren...")
+ local isBanned, Reason = JRMEngine.Functions.IsPlayerBanned(src)
+ if(isBanned) then
+ JRMEngine.Functions.Kick(src, Reason, setKickReason, deferrals)
+ CancelEvent()
+ return false
+ end
+ deferrals.update("\nDiscord Controleren...")
+ if (JRMConfig.IdentifierType == "discord" and (discord:sub(1,8) == "discord:") == false) then
+ JRMEngine.Functions.Kick(src, '🌍 Geen Discord account gevonden, je hebt Discord nodig om de stad te betreden!', setKickReason, deferrals)
+ CancelEvent()
+ return false
+ elseif (not JRMEngine.Functions.IsRolePresent(discord, name)) then
+ JRMEngine.Functions.Kick(src, '🌍 Je hebt de Burger Rol op Discord nodig om de stad te betreden...', setKickReason, deferrals)
+ CancelEvent()
+ return false
+ end
+ deferrals.update("\nServer Status Controleren...")
+ if(JRMEngine.Config.Server.Closed) then
+ local EnterAllowed = JRMEngine.Functions.HasPermission(src, "betatester") -- not sure if helpdesk rlly needed
+ if(not EnterAllowed) then
+ JRMEngine.Functions.ExecuteSql(false, "SELECT * FROM `jrm_closed_queue` WHERE `name` = '"..JRMEngine.EscapeSqli(name).."'", function(result)
+ if result[1] == nil then
+ JRMEngine.Functions.ExecuteSql(false, "INSERT INTO `jrm_closed_queue` (`name`, `steam`, `license`) VALUES ('"..JRMEngine.EscapeSqli(name).."', '"..JRMEngine.EscapeSqli(steamid).."', '"..JRMEngine.EscapeSqli(license).."')")
+ end
+ end)
+ TriggerEvent("jrm-log:server:CreateLog", "joinleave", "ClosedS", "orange", "**"..name.. "** ("..json.encode(GetPlayerIdentifiers(src))..") rejected, not allowed to join closed server..")
+ JRMEngine.Functions.Kick(src, JRMEngine.Config.Server.ClosedReason, setKickReason, deferrals)
+ CancelEvent()
+ return false
+ end
+ end
+ TriggerEvent("jrm-log:server:CreateLog", "joinleave", "Queue", "orange", "**"..name .. "** ("..json.encode(GetPlayerIdentifiers(src))..") in queue..")
+ TriggerEvent("jrm-log:server:sendLog", GetPlayerIdentifiers(src)[1], "left", {})
+ local level = nil --JRMEngine.Functions.GetDonatorsRole(discord)
+ -- if level ~= nil and tonumber(level) < 3 then
+ -- level = nil
+ -- end
+ if JRMEngine.Functions.HasPermission(src, "moderator") then
+ level = 1
+ end
+ TriggerEvent("connectqueue:playerConnect", src, setKickReason, deferrals, level)
+end)
+RegisterServerEvent("JRMEngine:server:CloseServer")
+AddEventHandler('JRMEngine:server:CloseServer', function(reason)
+ local src = source
+ local Player = JRMEngine.Functions.GetPlayer(src)
+
+ if JRMEngine.Functions.HasPermission(source, "admin") or JRMEngine.Functions.HasPermission(source, "god") then
+ local reason = reason ~= nil and reason or "Geen reden opgegeven..."
+ JRMEngine.Config.Server.Closed = true
+ JRMEngine.Config.Server.ClosedReason = reason
+ TriggerClientEvent("jrm-admin:client:SetServerStatus", -1, true)
+ else
+ JRMEngine.Functions.Kick(src, "Je hebt hier geen permissie voor..", nil, nil)
+ end
+end)
+RegisterServerEvent("JRMEngine:server:OpenServer")
+AddEventHandler('JRMEngine:server:OpenServer', function()
+ local src = source
+ local Player = JRMEngine.Functions.GetPlayer(src)
+ if JRMEngine.Functions.HasPermission(source, "admin") or JRMEngine.Functions.HasPermission(source, "god") then
+ JRMEngine.Config.Server.Closed = false
+ TriggerClientEvent("jrm-admin:client:SetServerStatus", -1, false)
+ else
+ JRMEngine.Functions.Kick(src, "Je hebt hier geen permissie voor..", nil, nil)
+ end
+end)
+RegisterServerEvent("JRMEngine:UpdatePlayer")
+AddEventHandler('JRMEngine:UpdatePlayer', function(data)
+ local src = source
+ local Player = JRMEngine.Functions.GetPlayer(src)
+
+ if Player ~= nil then
+ Player.PlayerData.position = data.position
+
+ local newHunger = Player.PlayerData.metadata["hunger"] - 4.2
+ local newThirst = Player.PlayerData.metadata["thirst"] - 3.8
+ if newHunger <= 0 then newHunger = 0 end
+ if newThirst <= 0 then newThirst = 0 end
+ Player.Functions.SetMetaData("thirst", newThirst)
+ Player.Functions.SetMetaData("hunger", newHunger)
+
+ if Player.PlayerData.job.payment > 0 and Player.PlayerData.job.onduty then
+ Player.Functions.AddMoney("bank", Player.PlayerData.job.payment)
+ TriggerClientEvent('JRMEngine:Notify', src, "Je hebt je salaris ontvangen van €"..Player.PlayerData.job.payment)
+ end
+ TriggerClientEvent("hud:client:UpdateNeeds", src, newHunger, newThirst)
+
+ Player.Functions.Save()
+ end
+end)
+RegisterServerEvent("JRMEngine:UpdatePlayerPosition")
+AddEventHandler("JRMEngine:UpdatePlayerPosition", function(position)
+ local src = source
+ local Player = JRMEngine.Functions.GetPlayer(src)
+ if Player ~= nil then
+ Player.PlayerData.position = position
+ end
+end)
+RegisterServerEvent("JRMEngine:Server:TriggerCallback")
+AddEventHandler('JRMEngine:Server:TriggerCallback', function(name, ...)
+ local src = source
+ JRMEngine.Functions.TriggerCallback(name, src, function(...)
+ TriggerClientEvent("JRMEngine:Client:TriggerCallback", src, name, ...)
+ end, ...)
+end)
+RegisterServerEvent("JRMEngine:Server:TriggerCall")
+AddEventHandler('JRMEngine:Server:TriggerCall', function(name, ...)
+ local src = source
+ JRMEngine.Functions.TriggerCall(name, src, ...)
+end)
+RegisterServerEvent("JRMEngine:Server:UseItem")
+AddEventHandler('JRMEngine:Server:UseItem', function(item)
+ local src = source
+ local Player = JRMEngine.Functions.GetPlayer(src)
+ if item ~= nil and item.amount > 0 then
+ if JRMEngine.Functions.CanUseItem(item.name) then
+ JRMEngine.Functions.UseItem(src, item)
+ end
+ end
+end)
+-- todo: 42 times in client side, must be sure src is current player.
+RegisterServerEvent("JRMEngine:Server:RemoveItem")
+AddEventHandler('JRMEngine:Server:RemoveItem', function(itemName, amount, slot)
+ local src = source
+ local Player = JRMEngine.Functions.GetPlayer(src)
+ Player.Functions.RemoveItem(itemName, amount, slot)
+end)
+-- todo: deprecated function security risk! "JRMEngine:Server:SetMetaData" is used 11 times in client side that needs to be changed to server sided!
+RegisterServerEvent('JRMEngine:Server:SetMetaData')
+AddEventHandler('JRMEngine:Server:SetMetaData', function(meta, data)
+ local src = source
+ if meta ~= "currentapartment" and meta ~= "hunger" and meta ~= "thirst" then
+ TriggerEvent("jrm-log:server:CreateLog", "anticheat", "Banned player!", "red", "** @everyone " ..GetPlayerName(src).. "** triggert `JRMEngine:Server:SetMetaData` with unknown meta `"..tostring(json.encode({meta, data})).."` this can only be triggered by menu's.")
+ TriggerEvent("jrm-anticheat:server:wipemeakab", src)
+ else
+ local Player = JRMEngine.Functions.GetPlayer(src)
+ if meta == "hunger" or meta == "thirst" then
+ if data > 100 or data < 0 then
+ data = 100
+ end
+ end
+ if Player ~= nil then
+ Player.Functions.SetMetaData(meta, data)
+ TriggerClientEvent("hud:client:UpdateNeeds", src, Player.PlayerData.metadata["hunger"], Player.PlayerData.metadata["thirst"])
+ end
+ end
+end)
+AddEventHandler('chatMessage', function(source, n, message)
+ if string.sub(message, 1, 1) == "/" then
+ local args = JRMEngine.Shared.SplitStr(message, " ")
+ local command = string.gsub(args[1]:lower(), "/", "")
+ CancelEvent()
+ if JRMEngine.Commands.List[command] ~= nil then
+ local Player = JRMEngine.Functions.GetPlayer(tonumber(source))
+ if Player ~= nil then
+ table.remove(args, 1)
+ if (JRMEngine.Functions.HasPermission(source, "god") or JRMEngine.Functions.HasPermission(source, JRMEngine.Commands.List[command].permission)) then
+ if (JRMEngine.Commands.List[command].argsrequired and #JRMEngine.Commands.List[command].arguments ~= 0 and args[#JRMEngine.Commands.List[command].arguments] == nil) then
+ TriggerClientEvent('chatMessage', source, "SYSTEM", "error", "Alle argumenten moeten ingevuld worden!")
+ local agus = ""
+ for name, help in pairs(JRMEngine.Commands.List[command].arguments) do
+ if help.name ~= nil then
+ agus = agus .. " ["..help.name.."]"
+ end
+ end
+ TriggerClientEvent('chatMessage', source, "/"..command, false, agus)
+ else
+ JRMEngine.Commands.List[command].callback(source, args)
+ end
+ else
+ TriggerClientEvent('chatMessage', source, "SYSTEM", "error", "Geen toegang tot dit command!")
+ end
+ end
+ end
+ end
+end)
+RegisterServerEvent('JRMEngine:CallCommand')
+AddEventHandler('JRMEngine:CallCommand', function(command, args)
+ if JRMEngine.Commands.List[command] ~= nil then
+ local Player = JRMEngine.Functions.GetPlayer(tonumber(source))
+ if Player ~= nil then
+ if (JRMEngine.Functions.HasPermission(source, "god")) or (JRMEngine.Functions.HasPermission(source, JRMEngine.Commands.List[command].permission)) or (JRMEngine.Commands.List[command].permission == Player.PlayerData.job.name) then
+ if (JRMEngine.Commands.List[command].argsrequired and #JRMEngine.Commands.List[command].arguments ~= 0 and args[#JRMEngine.Commands.List[command].arguments] == nil) then
+ TriggerClientEvent('chatMessage', source, "SYSTEM", "error", "Alle argumenten moeten ingevuld worden!")
+ local agus = ""
+ for name, help in pairs(JRMEngine.Commands.List[command].arguments) do
+ agus = agus .. " ["..help.name.."]"
+ end
+ TriggerClientEvent('chatMessage', source, "/"..command, false, agus)
+ else
+ JRMEngine.Commands.List[command].callback(source, args)
+ end
+ else
+ TriggerClientEvent('chatMessage', source, "SYSTEM", "error", "Geen toegang tot dit command!")
+ end
+ end
+ end
+end)
+RegisterServerEvent("JRMEngine:ToggleDuty")
+AddEventHandler('JRMEngine:ToggleDuty', function()
+ local src = source
+ local Player = JRMEngine.Functions.GetPlayer(src)
+ if Player.PlayerData.job.onduty then
+ Player.Functions.SetJobDuty(false)
+ TriggerClientEvent('JRMEngine:Notify', src, "Je bent nu uit dienst!")
+ else
+ Player.Functions.SetJobDuty(true)
+ TriggerClientEvent('JRMEngine:Notify', src, "Je bent nu in dienst!")
+ end
+ TriggerClientEvent("JRMEngine:Client:SetDuty", src, Player.PlayerData.job.onduty)
+end)
+Citizen.CreateThread(function()
+ JRMEngine.Functions.UpdateWhitelists()
+ JRMEngine.Functions.ExecuteSql(true, "SELECT * FROM `jrm_permissions`", function(result)
+ if result[1] ~= nil then
+ for k, v in pairs(result) do
+ JRMEngine.Config.Server.PermissionList[v.steam] = {
+ steam = v.steam,
+ license = v.license,
+ permission = v.permission,
+ optin = true,
+ }
+ end
+ end
+ end)
+end)
+JRMEngine.Functions.CreateCallback('JRMEngine:HasItem', function(source, cb, itemName)
+ local retval = false
+ local Player = JRMEngine.Functions.GetPlayer(source)
+ if Player ~= nil then
+ if Player.Functions.GetItemByName(itemName) ~= nil then
+ retval = true
+ end
+ end
+ cb(retval)
+end)
+JRMEngine.Functions.CreateCallback("JRMEngine:vehicles:server:getPlayerVehicles", function(source, cb)
+ local src = source
+ local pData = JRMEngine.Functions.GetPlayer(src)
+ local plyped = GetPlayerPed(src)
+ local coords = GetEntityCoords(plyped)
+ local streetpos = json.encode(vector4(coords.x, coords.y, coords.z, GetEntityHeading(plyped)))
+ exports['ghmattimysql']:execute('SELECT * FROM jrm_player_vehicles WHERE citizenid = @citizenid', {['@citizenid'] = pData.PlayerData.citizenid}, function(result)
+ if result[1] ~= nil then
+ for k, v in pairs(result) do
+ if v.streetpos ~= nil and v.state == 1 then
+ v.streetpos = json.decode(v.streetpos)
+ if #(coords-vector3(v.streetpos.x, v.streetpos.y, v.streetpos.z)) < 10 then
+ if v.status ~= nil then
+ v.status = json.decode(v.status)
+ end
+ else
+ result[k] = nil
+ end
+ else
+ result[k] = nil
+ end
+ end
+ cb(result)
+ else
+ cb(nil)
+ end
+ end)
+end)
+JRMEngine.Functions.CreateCallback("JRMEngine:vehicles:server:getHouseVehicles", function(source, cb, garage)
+ local src = source
+ local pData = JRMEngine.Functions.GetPlayer(src)
+ local plyped = GetPlayerPed(src)
+ local coords = GetEntityCoords(plyped)
+ local streetpos = json.encode(vector4(coords.x, coords.y, coords.z, GetEntityHeading(plyped)))
+ exports['ghmattimysql']:execute('SELECT * FROM jrm_player_vehicles WHERE garage = @garage', {['@garage'] = garage}, function(result)
+ if result[1] ~= nil then
+ for k, v in pairs(result) do
+ if v.streetpos ~= nil and v.state == 1 then
+ v.streetpos = json.decode(v.streetpos)
+ if #(coords-vector3(v.streetpos.x, v.streetpos.y, v.streetpos.z)) < 10 then
+ if v.status ~= nil then
+ v.status = json.decode(v.status)
+ end
+ else
+ result[k] = nil
+ end
+ else
+ result[k] = nil
+ end
+ end
+ cb(result)
+ else
+ cb(nil)
+ end
+ end)
+end)
+JRMEngine.Functions.CreateCallback("JRMEngine:vehicles:server:GetVehicleProperties", function(source, cb, plate)
+ local src = source
+ local properties = {}
+ JRMEngine.Functions.ExecuteSql(false, "SELECT `mods` FROM `jrm_player_vehicles` WHERE `plate` = '"..JRMEngine.EscapeSqli(plate).."'", function(result)
+ if result[1] ~= nil then
+ properties = json.decode(result[1].mods)
+ end
+ cb(properties)
+ end)
+end)
+
+JRMEngine.Functions.CreateCall("JRMEngine:vehicles:server:SetVehicleReturned", function(source, plate)
+ local src = source
+ JRMEngine.Functions.ExecuteSql(false, "SELECT `citizenid` FROM `jrm_player_vehicles` WHERE `plate` = '"..JRMEngine.EscapeSqli(plate).."'", function(result)
+ if result[1] ~= nil then
+ local pData = JRMEngine.Functions.GetPlayerByCitizenId(result[1].citizenid)
+ if pData ~= nil then
+ exports['ghmattimysql']:execute('UPDATE jrm_player_vehicles SET state = @state, depotprice = @depotprice WHERE plate = @plate', {['@state'] = 3, ['@plate'] = plate, ['@depotprice'] = 500})
+ TriggerClientEvent('JRMEngine:Notify', source, "Het voertuig is nu beschikbaar bij het depot voor €500,- euro!", "primary", 8000)
+ TriggerClientEvent('JRMEngine:Notify', pData.PlayerData.source, "Uw voertuig is afgeleverd bij het depot, u kunt nu uw voertuig komen ophalen..", "primary", 8000)
+ else
+ TriggerClientEvent('JRMEngine:Notify', source, "Deze persoon is niet meer online!", "error")
+ end
+ end
+ end)
+end)
+
+RegisterServerEvent('JRMEngine:vehicles:server:updateVehicleState')
+AddEventHandler('JRMEngine:vehicles:server:updateVehicleState', function(state, plate, vehcoords, netId)
+ local src = source
+ local pData = JRMEngine.Functions.GetPlayer(src)
+ local streetpos = nil
+ if vehcoords ~= nil then
+ local plyped = GetPlayerPed(src)
+ if #(GetEntityCoords(plyped)-vehcoords) < 20 then
+ streetpos = json.encode(vector4(vehcoords.x, vehcoords.y, vehcoords.z, GetEntityHeading(plyped)))
+ end
+ end
+ if state == 0 then
+ JRMEngine.OutsideVehicles[plate] = netId
+ elseif state == 1 then
+ JRMEngine.OutsideVehicles[plate] = nil
+ end
+ exports['ghmattimysql']:execute('UPDATE jrm_player_vehicles SET state = @state, depotprice = @depotprice, streetpos = @streetpos, garage = null WHERE plate = @plate', {['@state'] = state, ['@plate'] = plate, ['@depotprice'] = 0, ['@streetpos'] = streetpos})
+end)
+local housevehicle = {}
+RegisterServerEvent('JRMEngine:vehicles:server:updateGroupVehicleState')
+AddEventHandler('JRMEngine:vehicles:server:updateGroupVehicleState', function(garage, state, plate, vehcoords, netId)
+ local src = source
+ local pData = JRMEngine.Functions.GetPlayer(src)
+ local streetpos = nil
+ if vehcoords ~= nil then
+ local plyped = GetPlayerPed(src)
+ if #(GetEntityCoords(plyped)-vehcoords) < 20 then
+ streetpos = json.encode(vector4(vehcoords.x, vehcoords.y, vehcoords.z, GetEntityHeading(plyped)))
+ end
+ end
+ if state == 0 then
+ housevehicle[plate] = garage
+ JRMEngine.OutsideVehicles[plate] = netId
+ elseif state == 1 then
+ housevehicle[plate] = nil
+ JRMEngine.OutsideVehicles[plate] = nil
+ end
+ exports['ghmattimysql']:execute('UPDATE jrm_player_vehicles SET state = @state, depotprice = @depotprice, streetpos = @streetpos, garage = @garage WHERE plate = @plate', {['@state'] = state, ['@garage'] = garage, ['@plate'] = plate, ['@depotprice'] = 0, ['@streetpos'] = streetpos})
+end)
+function CheckVehNets(vehicles, netId)
+ for i = 1, #vehicles do
+ if NetworkGetNetworkIdFromEntity(vehicles[i]) == netId then
+ return vehicles[i]
+ end
+ end
+ return false
+end
+function SaveVehicles()
+ local vehicles = GetAllVehicles()
+ local c=0
+ local b = #(JRMEngine.OutsideVehicles)
+ for plate, netId in pairs(JRMEngine.OutsideVehicles) do
+ local entity = CheckVehNets(vehicles, netId)
+ if not entity and JRMEngine.OutsideVehicles[plate] ~= nil then
+ c=(c+1)
+ JRMEngine.OutsideVehicles[plate] = nil
+ exports['ghmattimysql']:execute('UPDATE jrm_player_vehicles SET state = @state, depotprice = @depotprice WHERE plate = @plate AND state = @offst', {['@state'] = 3, ['@plate'] = plate, ['@depotprice'] = math.random(150, 200), ['@offst'] = 0})
+ end
+ end
+ print('^2[JRMEngine]^7 Completed vehicle check with '..c..' changed state from '..b..'/'..#(vehicles)..' total vehicles!')
+end
+Citizen.CreateThread(function()
+ Citizen.Wait(1000 * 10)
+ exports['ghmattimysql']:execute('UPDATE jrm_player_vehicles SET state = @state, depotprice = @depotprice WHERE state = @offst', {['@state'] = 3, ['@depotprice'] = 0, ['@offst'] = 0})
+ print('^2[JRMEngine]^7 Started vehicles check, setting all state 0 to 3 completed.')
+ while not restartingstate do
+ SaveVehicles()
+ Citizen.Wait(1000 * 300)
+ end
+end)
+RegisterServerEvent('JRMEngine:vehicles:server:updateVehicleStatus')
+AddEventHandler('JRMEngine:vehicles:server:updateVehicleStatus', function(fuel, engine, body, plate)
+ local src = source
+ local pData = JRMEngine.Functions.GetPlayer(src)
+ if engine > 1000 then
+ engine = engine / 1000
+ end
+ if body > 1000 then
+ body = body / 1000
+ end
+ exports['ghmattimysql']:execute('UPDATE jrm_player_vehicles SET fuel = @fuel, engine = @engine, body = @body WHERE plate = @plate AND citizenid = @citizenid', {
+ ['@fuel'] = fuel,
+ ['@engine'] = engine,
+ ['@body'] = body,
+ ['@plate'] = plate,
+ ['@citizenid'] = pData.PlayerData.citizenid
+ })
+end)
+JRMEngine.Functions.CreateCallback("JRMEngine:vehicles:server:checkVehicleOwner", function(source, cb, plate)
+ local src = source
+ local pData = JRMEngine.Functions.GetPlayer(src)
+ exports['ghmattimysql']:execute('SELECT * FROM jrm_player_vehicles WHERE plate = @plate AND citizenid = @citizenid', {['@plate'] = plate, ['@citizenid'] = pData.PlayerData.citizenid}, function(result)
+ if result[1] ~= nil then
+ cb(true)
+ else
+ cb(false)
+ end
+ end)
+end)
+JRMEngine.Functions.CreateCallback("JRMEngine:vehicles:server:checkHouseVehicleOwner", function(source, cb, plate, garage)
+ local src = source
+ local pData = JRMEngine.Functions.GetPlayer(src)
+ exports['ghmattimysql']:execute('SELECT * FROM jrm_player_vehicles WHERE plate = @plate AND citizenid = @citizenid', {['@plate'] = plate, ['@citizenid'] = pData.PlayerData.citizenid}, function(result)
+ if result[1] ~= nil then
+ cb(true)
+ elseif next(housevehicle) ~= nil then
+ if housevehicle[plate] == garage then
+ cb(true)
+ else
+ cb(false)
+ end
+ else
+ cb(false)
+ end
+ end)
+end)
\ No newline at end of file