Revisions for ⁨Infinity bypass⁩

View the changes made to this paste.

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

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