⁨ByteDev⁩ avatar
ByteDev

Infinity bypass

Never try to get money out of leaks ty.

public ⁨1⁩ ⁨file⁩ 2022-09-29 18:33:21 UTC

pastefile1

Raw


-- 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)