local QBCore = exports['qb-core']:GetCoreObject() RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function() QBCore.Functions.GetPlayerData(function(PlayerData) PlayerJob = PlayerData.job end) end) RegisterNetEvent('QBCore:Client:OnJobUpdate', function(JobInfo) PlayerJob = JobInfo end) AddEventHandler('onResourceStart', function(r) if GetCurrentResourceName() ~= r then return end QBCore.Functions.GetPlayerData(function(PlayerData) PlayerJob = PlayerData.job end) end) for i = 1, #Config.Locations do -- Convert trunk items to usable stashes for k, v in pairs(Config.Locations[i].garage.list) do if v.trunkItems then local items = {} for _, item in pairs(v.trunkItems) do local itemInfo = QBCore.Shared.Items[item.name:lower()] items[item.slot] = { name = itemInfo["name"], amount = tonumber(item.amount), info = item.info, label = itemInfo["label"], description = itemInfo["description"] and itemInfo["description"] or "", weight = itemInfo["weight"], type = itemInfo["type"], unique = itemInfo["unique"], useable = itemInfo["useable"], image = itemInfo["image"], slot = item.slot, } end Config.Locations[i].garage.list[k].trunkItems = items end end end local Targets = {} local Parking = {} --Garage Locations CreateThread(function() for k, v in pairs(Config.Locations) do if v.garage then local out = v.garage.out if v.garage.ped then Parking[#Parking+1] = makePed(v.garage.ped.model, out, 1, 1, v.garage.ped.scenario) else Parking[#Parking+1] = makeProp({prop = `prop_parkingpay`, coords = vector4(out.x, out.y, out.z, out.w-180.0)}, 1, false) end Targets["JobGarage: "..k] = exports['qb-target']:AddBoxZone("JobGarage: "..k, vector3(out.x, out.y, out.z-1.03), 0.8, 0.5, { name="JobGarage: "..k, heading = out.w+180.0, debugPoly=Config.Debug, minZ=out.z-1.05, maxZ=out.z+0.80 }, { options = { { event = "jim-jobgarage:client:Garage:Menu", icon = "fas fa-clipboard", label = "Firmabiler", job = v.job, coords = v.garage.spawn, list = v.garage.list, prop = Parking[#Parking] }, }, distance = 2.0 }) end end end) local currentVeh = { out = false, current = nil } RegisterNetEvent('jim-jobgarage:client:Garage:Menu', function(data) if not IsPedInAnyVehicle(PlayerPedId()) then lookEnt(data.prop) loadAnimDict("amb@prop_human_atm@male@enter") TaskPlayAnim(PlayerPedId(), 'amb@prop_human_atm@male@enter', "enter", 1.0,-1.0, 1500, 1, 1, true, true, true) end local vehicleMenu = { { icon = "fas fa-car-tunnel", header = PlayerJob.label.." ".."Firmagarage", isMenuHeader = true } } vehicleMenu[#vehicleMenu+1] = { icon = "fas fa-circle-xmark", header = "", txt = "Luk", params = { event = "jim-jobgarage:client:Menu:Close" } } if currentVeh.out and DoesEntityExist(currentVeh.current) then vehicleMenu[#vehicleMenu+1] = { icon = "fas fa-clipboard-list", header = "Køretøj ude af garage", txt = "Køretøj: "..currentVeh.name.."
Plate: ["..GetVehicleNumberPlateText(currentVeh.current).."]", params = { event = "jim-jobgarage:client:Garage:Blip", }, } vehicleMenu[#vehicleMenu+1] = { icon = "fas fa-car-burst", header = "Fjern køretøj", params = { event = "jim-jobgarage:client:RemSpawn" } } else currentVeh = { out = false, current = nil } table.sort(data.list, function(a, b) return a:lower() < b:lower() end) for k, v in pairsByKeys(data.list) do local showButton = false if v.grade then if v.grade <= PlayerJob.grade.level then showButton = true end end if v.rank then for _, b in pairs(v.rank) do if b == PlayerJob.grade.level then showButton = true end end end if not v.grade and not v.rank then showButton = true end if showButton == true then local spawnName = k local spawnHash = GetHashKey(spawnName) --k = data.list[spawnName].CustomName or searchCar(spawnName) local classtable = { [8] = "fas fa-motorcycle", -- Motorcycle icon [9] = "fas fa-truck-monster", -- Off Road icon [10] = "fas fa-truck-front", -- Van / Truck icon [11] = "fas fa-truck-front", -- Van / Truck icon [12] = "fas fa-truck-front", -- Van / Truck icon [13] = "fas fa-bicycle", -- Bike [14] = "fas fa-ship", -- Boats [15] = "fas fa-helicopter",-- Helicopter [16] = "fas fa-plane", -- Planes [18] = "fas fa-kit-medical", -- Emergency } local seticon = classtable[GetVehicleClassFromName(spawnHash)] or "fas fa-car" vehicleMenu[#vehicleMenu+1] = { icon = seticon, header = (data.list[k].CustomName or searchCar(k)), params = { event = "jim-jobgarage:client:SpawnList", args = { spawnName = spawnName, coords = data.coords, list = v } } } end end end showButton = nil if #vehicleMenu <= 2 then triggerNotify(nil, "Ingen køretøjer tilgængelig") return end exports['qb-menu']:openMenu(vehicleMenu) unloadAnimDict("amb@prop_human_atm@male@enter") end) RegisterNetEvent("jim-jobgarage:client:SpawnList", function(data) local oldveh = GetClosestVehicle(data.coords.x, data.coords.y, data.coords.z, 2.5, 0, 71) local name = "" if oldveh ~= 0 then name = searchCar(GetEntityModel(oldveh)) triggerNotify(nil, name.." er i vejen", "error") else QBCore.Functions.SpawnVehicle(data.spawnName, function(veh) local name = data.list.CustomName or searchCar(data.spawnName) currentVeh = { out = true, current = veh, name = name } SetVehicleModKit(veh, 0) NetworkRequestControlOfEntity(veh) SetVehicleNumberPlateText(veh, string.sub(PlayerJob.label, 1, 5)..tostring(math.random(100, 999))) --SetVehicleNumberPlateText(veh, "PD-"..QBCore.Functions.GetPlayerData().metadata.callsign) SetEntityHeading(veh, data.coords.w) TaskWarpPedIntoVehicle(PlayerPedId(), veh, -1) if data.list.colors then SetVehicleColours(veh, data.list.colors[1], data.list.colors[2]) end if data.list.bulletproof then SetVehicleTyresCanBurst(veh, false) end if data.list.extras then for _, v in pairs(data.list.extras) do SetVehicleExtra(veh, v, 0) end end if data.list.livery then if GetNumVehicleMods(veh, 48) == 0 and GetVehicleLiveryCount(veh) ~= 0 then SetVehicleLivery(veh, data.list.livery) SetVehicleMod(veh, 48, -1, false) else SetVehicleMod(veh, 48, (data.list.livery - 1), false) SetVehicleLivery(veh, -1) end end if data.list.turbo then ToggleVehicleMod(veh, 18, data.list.turbo) end if data.list.xenon then ToggleVehicleMod(veh, 22, data.list.xenon) end if data.list.mod42 then SetVehicleMod(veh, 42, (data.list.mod42-1), false) end if data.list.mod43 then SetVehicleMod(veh, 43, (data.list.mod43-1), false) end if data.list.mod44 then SetVehicleMod(veh, 44, (data.list.mod44-1), false) end if data.list.mod45 then SetVehicleMod(veh, 45, (data.list.mod45-1), false) end if data.list.mod49 then SetVehicleMod(veh, 49, (data.list.mod49-1), false) end if data.list.performance then if type(data.list.performance) ~= "table" then SetVehicleMod(veh, 11, GetNumVehicleMods(veh, 11)-1) -- Engine SetVehicleMod(veh, 12, GetNumVehicleMods(veh, 12)-1) -- Brakes SetVehicleMod(veh, 15, GetNumVehicleMods(veh, 15)-1) -- Suspension SetVehicleMod(veh, 13, GetNumVehicleMods(veh, 13)-1) -- Transmission SetVehicleMod(veh, 16, GetNumVehicleMods(veh, 16)-1) -- Armour ToggleVehicleMod(veh, 18, true) -- Turbo else SetVehicleMod(veh, 11, data.list.performance[1]-1) -- Engine SetVehicleMod(veh, 12, data.list.performance[2]-1) -- Brakes SetVehicleMod(veh, 15, data.list.performance[3]-1) -- Suspension SetVehicleMod(veh, 13, data.list.performance[4]-1) -- Transmission SetVehicleMod(veh, 16, data.list.performance[5]-1) -- Armour ToggleVehicleMod(veh, 18, data.list.performance[6]) -- Turbo end end if data.list.trunkItems then TriggerServerEvent("jim-jobgarage:server:addTrunkItems", QBCore.Functions.GetPlate(veh), data.list.trunkItems) end TriggerEvent("vehiclekeys:client:SetOwner", QBCore.Functions.GetPlate(veh)) exports['qb-fuel']:SetFuel(veh, 100.0) SetVehicleEngineOn(veh, true, true) Wait(250) SetVehicleDirtLevel(veh, 0.0) triggerNotify(nil, "Tog "..name.." ["..GetVehicleNumberPlateText(currentVeh.current).."]", "success") end, data.coords, true) end end) RegisterNetEvent("jim-jobgarage:client:RemSpawn", function(data) if Config.CarDespawn then SetVehicleEngineHealth(currentVeh.current, 200.0) SetVehicleBodyHealth(currentVeh.current, 200.0) for i = 0, 7 do SmashVehicleWindow(currentVeh.current, i) Wait(150) end PopOutVehicleWindscreen(currentVeh.current) for i = 0, 5 do SetVehicleTyreBurst(currentVeh.current, i, true, 0) Wait(150) end for i = 0, 5 do SetVehicleDoorBroken(currentVeh.current, i, false) Wait(150) end Wait(800) end QBCore.Functions.DeleteVehicle(currentVeh.current) currentVeh = { out = false, current = nil } end) local markerOn = false RegisterNetEvent("jim-jobgarage:client:Garage:Blip", function(data) triggerNotify(nil, "Firmabil markeret på kortet") if markerOn then markerOn = not markerOn end markerOn = true if not DoesBlipExist(garageBlip) then garageBlip = makeBlip({ coords = GetEntityCoords(currentVeh.current), sprite = 85, col = 8, name = "Firmabil" }) SetBlipRoute(garageBlip, true) SetBlipRouteColour(garageBlip, 3) end while markerOn do local time = 5000 local carLoc = GetEntityCoords(currentVeh.current) local playerLoc = GetEntityCoords(PlayerPedId()) if DoesEntityExist(currentVeh.current) then local dist = #(carLoc - playerLoc) if dist <= 30.0 and dist > 1.5 then time = 1000 elseif dist <= 1.5 then RemoveBlip(garageBlip) garageBlip = nil markerOn = not markerOn else time = 5000 end else RemoveBlip(garageBlip) garageBlip = nil markerOn = not markerOn end Wait(time) end end) AddEventHandler('onResourceStop', function(r) if r ~= GetCurrentResourceName() then return end for k in pairs(Targets) do exports['qb-target']:RemoveZone(k) end for i = 1, #Parking do unloadModel(GetEntityModel(Parking[i])) DeleteEntity(Parking[i]) end end)