diff --git a/resources/[sna]/sna-alpr/client/client.js b/resources/[sna]/sna-alpr/client/client.js new file mode 100644 index 0000000..6f98582 --- /dev/null +++ b/resources/[sna]/sna-alpr/client/client.js @@ -0,0 +1,51 @@ +"use strict"; + +// integrations/alpr/client/client.ts +onNet("sn:cadBoloResults" /* ALPRCadBoloResults */, (plate, body) => { + if (!body || body === "failed") + return; + if (body.bolos.length > 0) { + emit("sna-sync:create-notification" /* CreateNotification */, { + title: "Active Bolo Notice", + message: `${plate} has an active BOLO. Open SnailyCAD for more details.` + }); + } +}); +onNet("sn:cadPlateResults" /* ALPRCadPlateResults */, (plate, body) => { + var _a, _b, _c, _d; + if (!body || body === "failed") { + return emit("sna-sync:create-notification" /* CreateNotification */, { + message: "Unable to fetch plate search results: failed to fetch.", + title: "Plate Search Results" + }); + } + const [vehicle] = body; + if (!vehicle) { + return emit("sna-sync:create-notification" /* CreateNotification */, { + message: `Plate is not registered: ${plate}`, + title: "Plate Search Results" + }); + } + const owner = vehicle.citizen ? `${vehicle.citizen.name} ${vehicle.citizen.surname}` : "Unknown"; + const message = [ + `
${T0(new Date)}
+SnailyCAD
+${e.title}
+i.test(_);function s(){const{protocol:_,hostname:w,port:S}=window.location;return _+"//"+w+(S?":"+S:"")}function a(){const{href:_}=window.location,w=s();return _.substring(w.length)}function l(_){return typeof _=="string"?_:_.displayName||_.name||"Unknown"}function u(_){return _.finished||_.headersSent}function d(_){const w=_.split("?");return w[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(w[1]?"?"+w.slice(1).join("?"):"")}async function p(_,w){const S=w.res||w.ctx&&w.ctx.res;if(!_.getInitialProps)return w.ctx&&w.Component?{pageProps:await p(w.Component,w.ctx)}:{};const P=await _.getInitialProps(w);if(S&&u(S))return P;if(!P){const x='"'+l(_)+'.getInitialProps()" should resolve to an object. But found "'+P+'" instead.';throw new Error(x)}return P}const g=typeof performance<"u",m=g&&["mark","measure","getEntriesByName"].every(_=>typeof performance[_]=="function");class y extends Error{}class h extends Error{}class E extends Error{constructor(w){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message="Cannot find module for page: "+w}}class c extends Error{constructor(w,S){super(),this.message="Failed to load static file for page: "+w+" "+S}}class f extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function v(_){return JSON.stringify({message:_.message,stack:_.stack})}}(Nl)),Nl}var Ol={},Al={},tp;function Na(){return tp||(tp=1,function(e){Object.defineProperty(e,"__esModule",{value:!0});function t(s,a){for(var l in a)Object.defineProperty(s,l,{enumerable:!0,get:a[l]})}t(e,{searchParamsToUrlQuery:function(){return r},urlQueryToSearchParams:function(){return i},assign:function(){return o}});function r(s){const a={};return s.forEach((l,u)=>{typeof a[u]>"u"?a[u]=l:Array.isArray(a[u])?a[u].push(l):a[u]=[a[u],l]}),a}function n(s){return typeof s=="string"||typeof s=="number"&&!isNaN(s)||typeof s=="boolean"?String(s):""}function i(s){const a=new URLSearchParams;return Object.entries(s).forEach(l=>{let[u,d]=l;Array.isArray(d)?d.forEach(p=>a.append(u,n(p))):a.set(u,n(d))}),a}function o(s){for(var a=arguments.length,l=new Array(a>1?a-1:0),u=1;u{Array.from(d.keys()).forEach(p=>s.delete(p)),d.forEach((p,g)=>s.append(g,p))}),s}}(Al)),Al}var rp;function Ff(){return rp||(rp=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"parseRelativeUrl",{enumerable:!0,get:function(){return n}});const t=Co(),r=Na();function n(i,o){const s=new URL(typeof window>"u"?"http://n":(0,t.getLocationOrigin)()),a=o?new URL(o,s):i.startsWith(".")?new URL(typeof window>"u"?"http://n":window.location.href):s,{pathname:l,searchParams:u,search:d,hash:p,href:g,origin:m}=new URL(i,a);if(m!==s.origin)throw new Error("invariant: invalid relative URL, router received "+i);return{pathname:l,query:(0,r.searchParamsToUrlQuery)(u),search:d,hash:p,href:g.slice(s.origin.length)}}}(Ol)),Ol}var Ll={},kl={},tr={},np;function fv(){if(np)return tr;np=1,Object.defineProperty(tr,"__esModule",{value:!0});function e(m){for(var y=[],h=0;h Køretøj Status"u"&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)}(Zo,Zo.exports)),Zo.exports}var nS=Sv();(function(e){Object.defineProperty(e,"__esModule",{value:!0});var t=m1,r=nS;function n(l){return l&&typeof l=="object"&&"default"in l?l:{default:l}}var i=n(le);function o(){return o=Object.assign?Object.assign.bind():function(l){for(var u=1;uAbout Us
+We're a team with experience in FiveM and UI development, we've played FiveM for thousands of hours, and have a clear understanding of the players needs. That caused us to start Simplified Studios.
+
+[Simplified Studios Discord](https://discord.gg/KucTZ2nvET) is where you can find all of our updates, new scripts and maybe some sneak peaks if you're lucky!
+
+[Simplified Studios Tebex](https://simplified-studios.tebex.io/) is where you can buy our paid scripts!
+
+# Installation
+
+This script is really just plug n play, unless you want to use the Renewed Phone, then you need to follow the instructions below.
+If you want pictures on the garages, you need to take pictures rename them as they are called in the config and put them into the html/img folder.
+
+# Use of Renewed Phone
+
+if you're using the default qb-phone you dont need to do anything, just plug n play.
+if you're using Renewed Phone, you need to navigate to server/garage.lua and replace the current Callback "qb-phone:server:GetGarageVehicles" with this:
+
+```lua
+QBCore.Functions.CreateCallback('qb-phone:server:GetGarageVehicles', function(source, cb)
+ local Player = QBCore.Functions.GetPlayer(source)
+ local Vehicles = {}
+ local vehdata
+ local result = exports.oxmysql:executeSync('SELECT * FROM player_vehicles WHERE citizenid = ?', {Player.PlayerData.citizenid})
+ local garages = exports['ss-garage']:GetGarages()
+ if result[1] then
+ for _, v in pairs(result) do
+ local VehicleData = QBCore.Shared.Vehicles[v.vehicle]
+ local VehicleGarage = "None"
+ local enginePercent = round(v.engine / 10, 0)
+ local bodyPercent = round(v.body / 10, 0)
+ if v.garage then
+ if garages[v.garage] then
+ VehicleGarage = garages[v.garage]["label"]
+ else
+ VehicleGarage = v.garage
+ end
+ end
+
+ local VehicleState = "In"
+ if v.state == 0 then
+ VehicleState = "Out"
+ elseif v.state == 2 then
+ VehicleState = "Impounded"
+ end
+
+ if VehicleData["brand"] then
+ vehdata = {
+ fullname = VehicleData["brand"] .. " " .. VehicleData["name"],
+ brand = VehicleData["brand"],
+ model = VehicleData["name"],
+ plate = v.plate,
+ garage = VehicleGarage,
+ state = VehicleState,
+ fuel = v.fuel,
+ engine = enginePercent,
+ body = bodyPercent,
+ paymentsleft = v.paymentsleft
+ }
+ else
+ vehdata = {
+ fullname = VehicleData["name"],
+ brand = VehicleData["name"],
+ model = VehicleData["name"],
+ plate = v.plate,
+ garage = VehicleGarage,
+ state = VehicleState,
+ fuel = v.fuel,
+ engine = enginePercent,
+ body = bodyPercent,
+ paymentsleft = v.paymentsleft
+ }
+ end
+ Vehicles[#Vehicles+1] = vehdata
+ end
+ cb(Vehicles)
+ else
+ cb(nil)
+ end
+end)
+```
diff --git a/resources/[ss]/ss-garage/client/cl_functions.lua b/resources/[ss]/ss-garage/client/cl_functions.lua
new file mode 100644
index 0000000..396bd17
--- /dev/null
+++ b/resources/[ss]/ss-garage/client/cl_functions.lua
@@ -0,0 +1,313 @@
+local QBCore = exports['qb-core']:GetCoreObject()
+local garageZones = {}
+
+function GetSpawnPoint(garage)
+ local location = nil
+ for k,v in pairs(Config.Garages[garage].spawnPoint) do
+ local isOccupied = IsPositionOccupied( v.x, v.y, v.z, 5.0, false, true, false, false, false, 0, false )
+ if not isOccupied then
+ location = v
+ break
+ end
+ end
+ if not location then
+ QBCore.Functions.Notify(Lang:t('error.vehicle_occupied'), 'error')
+ end
+ return location
+end
+
+function doCarDamage(currentVehicle, stats, props)
+ local engine = stats.engine + 0.0
+ local body = stats.body + 0.0
+ SetVehicleEngineHealth(currentVehicle, engine)
+ SetVehicleBodyHealth(currentVehicle, body)
+ if not next(props) then return end
+ if props.doorStatus then
+ for k, v in pairs(props.doorStatus) do
+ if v then SetVehicleDoorBroken(currentVehicle, tonumber(k), true) end
+ end
+ end
+ if props.tireBurstState then
+ for k, v in pairs(props.tireBurstState) do
+ if v then SetVehicleTyreBurst(currentVehicle, tonumber(k), true) end
+ end
+ end
+ -- Buggy, så slået fra.
+ -- if props.windowStatus then
+ -- for k, v in pairs(props.windowStatus) do
+ -- if not v then SmashVehicleWindow(currentVehicle, tonumber(k)) end
+ -- end
+ -- end
+end
+
+local function CreateBlips(setloc)
+ local Garage = AddBlipForCoord(setloc.takeVehicle.x, setloc.takeVehicle.y, setloc.takeVehicle.z)
+ SetBlipSprite(Garage, setloc.blipNumber)
+ SetBlipDisplay(Garage, 4)
+ SetBlipScale(Garage, 0.60)
+ SetBlipAsShortRange(Garage, true)
+ SetBlipColour(Garage, setloc.blipColor)
+ BeginTextCommandSetBlipName('STRING')
+ AddTextComponentSubstringPlayerName(setloc.blipName)
+ EndTextCommandSetBlipName(Garage)
+end
+
+function CheckPlayers(vehicle)
+ for i = -1, 5, 1 do
+ local seat = GetPedInVehicleSeat(vehicle, i)
+ if seat then
+ TaskLeaveVehicle(seat, vehicle, 0)
+ end
+ end
+ Wait(1500)
+ QBCore.Functions.DeleteVehicle(vehicle)
+end
+
+function IsVehicleAllowed(classList, vehicle)
+ for _, class in ipairs(classList) do
+ if GetVehicleClass(vehicle) == class then
+ return true
+ end
+ end
+ return false
+end
+
+function DepositVehicle(veh, data)
+ local plate = QBCore.Functions.GetPlate(veh)
+ QBCore.Functions.TriggerCallback('qb-garages:server:canDeposit', function(canDeposit)
+ if canDeposit then
+ local bodyDamage = math.ceil(GetVehicleBodyHealth(veh))
+ local engineDamage = math.ceil(GetVehicleEngineHealth(veh))
+ local totalFuel = exports[Config.FuelSystem]:GetFuel(veh)
+ TriggerServerEvent('qb-mechanicjob:server:SaveVehicleProps', QBCore.Functions.GetVehicleProperties(veh))
+ TriggerServerEvent('qb-garages:server:updateVehicleStats', plate, totalFuel, engineDamage, bodyDamage)
+ CheckPlayers(veh)
+ if plate then TriggerServerEvent('qb-garages:server:UpdateOutsideVehicle', plate, nil) end
+ QBCore.Functions.Notify(Lang:t('success.vehicle_parked'), 'success', 4500)
+ else
+ QBCore.Functions.Notify(Lang:t('error.not_owned'), 'error', 3500)
+ end
+ end, plate, data.type, data.indexgarage, 1)
+end
+
+function CreateZone(index, garage, zoneType)
+ local zone = CircleZone:Create(garage.takeVehicle, 10.0, {
+ name = zoneType .. '_' .. index,
+ debugPoly = false,
+ data = {
+ indexgarage = index,
+ type = garage.type,
+ category = garage.category
+ }
+ })
+ return zone
+end
+
+function CreateBlipsZones()
+ PlayerData = QBCore.Functions.GetPlayerData()
+ PlayerGang = PlayerData.gang
+ PlayerJob = PlayerData.job
+
+ for index, garage in pairs(Config.Garages) do
+ local zone
+ if garage.showBlip then
+ CreateBlips(garage)
+ end
+ if garage.type == 'job' and (PlayerJob.name == garage.job or PlayerJob.type == garage.jobType) then
+ zone = CreateZone(index, garage, 'job')
+ elseif garage.type == 'gang' and PlayerGang.name == garage.job then
+ zone = CreateZone(index, garage, 'gang')
+ elseif garage.type == 'depot' then
+ zone = CreateZone(index, garage, 'depot')
+ elseif garage.type == 'public' then
+ zone = CreateZone(index, garage, 'public')
+ end
+
+ if zone then
+ garageZones[#garageZones + 1] = zone
+ end
+ end
+
+ local comboZone = ComboZone:Create(garageZones, { name = 'garageCombo', debugPoly = false })
+
+ comboZone:onPlayerInOut(function(isPointInside, _, zone)
+ if isPointInside then
+ listenForKey = true
+ currentZone = zone
+ CreateThread(function()
+ while listenForKey do
+ Wait(0)
+ if IsControlJustReleased(0, 38) then
+ if GetVehiclePedIsUsing(PlayerPedId()) ~= 0 then
+ if zone.data.type == 'depot' then return end
+ local currentVehicle = GetVehiclePedIsUsing(PlayerPedId())
+ if not IsVehicleAllowed(zone.data.category, currentVehicle) then
+ QBCore.Functions.Notify(Lang:t('error.not_correct_type'), 'error', 3500)
+ return
+ end
+ DepositVehicle(currentVehicle, zone.data)
+ else
+ TriggerEvent('ss-garage:client:openGarage')
+ end
+ end
+ end
+ end)
+
+ local displayText = Lang:t('info.car_e')
+ if zone.data.vehicle == 'sea' then
+ displayText = Lang:t('info.sea_e')
+ elseif zone.data.vehicle == 'air' then
+ displayText = Lang:t('info.air_e')
+ elseif zone.data.vehicle == 'rig' then
+ displayText = Lang:t('info.rig_e')
+ elseif zone.data.type == 'depot' then
+ displayText = Lang:t('info.depot_e')
+ end
+ exports['qb-core']:DrawText(displayText, 'top')
+ else
+ listenForKey = false
+ currentZone = nil
+ exports['qb-core']:HideText()
+ end
+ end)
+end
+
+local houseGarageZones = {}
+local listenForKeyHouse = false
+local houseComboZones = nil
+
+function CreateHouseZone(index, garage, zoneType)
+ local houseZone = CircleZone:Create(garage.takeVehicle, 5.0, {
+ name = zoneType .. '_' .. index,
+ debugPoly = false,
+ data = {
+ indexgarage = index,
+ type = zoneType,
+ label = garage.label
+ }
+ })
+
+ if houseZone then
+ houseGarageZones[#houseGarageZones + 1] = houseZone
+
+ if not houseComboZones then
+ houseComboZones = ComboZone:Create(houseGarageZones, { name = 'houseComboZones', debugPoly = false })
+ else
+ houseComboZones:AddZone(houseZone)
+ end
+ end
+
+ houseComboZones:onPlayerInOut(function(isPointInside, _, zone)
+ if isPointInside then
+ listenForKeyHouse = true
+ currentZone = zone
+ CreateThread(function()
+ while listenForKeyHouse do
+ Wait(0)
+ if IsControlJustReleased(0, 38) then
+ if GetVehiclePedIsUsing(PlayerPedId()) ~= 0 then
+ local currentVehicle = GetVehiclePedIsUsing(PlayerPedId())
+ DepositVehicle(currentVehicle, zone.data)
+ else
+ TriggerEvent('ss-garage:client:openGarage')
+ end
+ end
+ end
+ end)
+ exports['qb-core']:DrawText(Lang:t('info.house_garage'), 'top')
+ else
+ listenForKeyHouse = false
+ currentZone = nil
+ exports['qb-core']:HideText()
+ end
+ end)
+end
+
+local function ZoneExists(zoneName)
+ for _, zone in ipairs(houseGarageZones) do
+ if zone.name == zoneName then
+ return true
+ end
+ end
+ return false
+end
+
+local function RemoveHouseZone(zoneName)
+ local removedZone = houseComboZones:RemoveZone(zoneName)
+ if removedZone then
+ removedZone:destroy()
+ end
+ for index, zone in ipairs(houseGarageZones) do
+ if zone.name == zoneName then
+ table.remove(houseGarageZones, index)
+ break
+ end
+ end
+end
+
+RegisterNetEvent('qb-garages:client:setHouseGarage', function(house, hasKey) -- event sent periodically from housing
+ if not house then return end
+ local formattedHouseName = string.lower(house)
+ local zoneName = 'house_' .. formattedHouseName
+ if Config.Garages[formattedHouseName] then
+ if hasKey and not ZoneExists(zoneName) then
+ CreateHouseZone(formattedHouseName, Config.Garages[formattedHouseName], 'house')
+ elseif not hasKey and ZoneExists(zoneName) then
+ RemoveHouseZone(zoneName)
+ end
+ end
+ TriggerServerEvent('ss-garage:server:setHouseGarages', Config.Garages)
+end)
+
+RegisterNetEvent('qb-garages:client:houseGarageConfig', function(houseGarages)
+ for _, garageConfig in pairs(houseGarages) do
+ local formattedHouseName = _
+ if garageConfig.takeVehicle and garageConfig.takeVehicle.x and garageConfig.takeVehicle.y and garageConfig.takeVehicle.z and garageConfig.takeVehicle.w then
+ Config.Garages[formattedHouseName] = {
+ takeVehicle = vector3(garageConfig.takeVehicle.x, garageConfig.takeVehicle.y, garageConfig.takeVehicle.z),
+ spawnPoint = {
+ vector4(garageConfig.takeVehicle.x, garageConfig.takeVehicle.y, garageConfig.takeVehicle.z, garageConfig.takeVehicle.w)
+ },
+ label = garageConfig.label,
+ type = 'house',
+ }
+ end
+ end
+ TriggerServerEvent('ss-garage:server:setHouseGarages', Config.Garages)
+end)
+
+RegisterNetEvent('qb-garages:client:addHouseGarage', function(house, garageInfo) -- event from housing on garage creation
+ local formattedHouseName = string.lower(house)
+ Config.Garages[formattedHouseName] = {
+ takeVehicle = vector3(garageInfo.takeVehicle.x, garageInfo.takeVehicle.y, garageInfo.takeVehicle.z),
+ spawnPoint = {
+ vector4(garageInfo.takeVehicle.x, garageInfo.takeVehicle.y, garageInfo.takeVehicle.z, garageInfo.takeVehicle.w)
+ },
+ label = garageInfo.label,
+ type = 'house',
+ }
+ TriggerServerEvent('ss-garage:server:setHouseGarages', Config.Garages)
+end)
+
+RegisterNetEvent('qb-garages:client:removeHouseGarage', function(house)
+ Config.Garages[house] = nil
+end)
+
+-- Handlers
+
+AddEventHandler('QBCore:Client:OnPlayerLoaded', function()
+ CreateBlipsZones()
+end)
+
+AddEventHandler('onResourceStart', function(res)
+ if res ~= GetCurrentResourceName() then return end
+ CreateBlipsZones()
+end)
+
+RegisterNetEvent('QBCore:Client:OnGangUpdate', function(gang)
+ PlayerGang = gang
+end)
+
+RegisterNetEvent('QBCore:Client:OnJobUpdate', function(job)
+ PlayerJob = job
+end)
\ No newline at end of file
diff --git a/resources/[ss]/ss-garage/client/cl_main.lua b/resources/[ss]/ss-garage/client/cl_main.lua
new file mode 100644
index 0000000..dafdffc
--- /dev/null
+++ b/resources/[ss]/ss-garage/client/cl_main.lua
@@ -0,0 +1,65 @@
+local QBCore = exports['qb-core']:GetCoreObject()
+
+RegisterNetEvent('ss-garage:client:openGarage', function()
+ QBCore.Functions.TriggerCallback('ss-garage:server:GetVehicles', function(vehicles)
+ if not vehicles then QBCore.Functions.Notify('Du har ingen køretøjer i denne garage.', 'error') return end
+ SendNUIMessage({
+ type = "open",
+ vehicles = vehicles,
+ garages = Config.Garages,
+ garageindex = currentZone.data.indexgarage,
+ })
+ SetNuiFocus(true, true)
+ end, currentZone.data.indexgarage, currentZone.data.type, currentZone.data.category)
+end)
+
+RegisterNUICallback('takeOut', function(data, cb)
+ local dataveh = data.vehicle
+ local location = GetSpawnPoint(currentZone.data.indexgarage)
+ if not location then return end
+
+ if dataveh.depotprice ~= 0 then
+ local Player = QBCore.Functions.GetPlayerData()
+ local cash = Player.money["cash"]
+ local bank = Player.money["bank"]
+
+ if cash >= dataveh.depotprice then
+ Player.Functions.RemoveMoney("cash", dataveh.depotprice)
+ QBCore.Functions.Notify('Du betalte gebyret kontant', 'success', 4500)
+ elseif bank >= dataveh.depotprice then
+ Player.Functions.RemoveMoney("bank", dataveh.depotprice)
+ QBCore.Functions.Notify('Gebyret blev betalt gennem banken!', 'success', 4500)
+ else
+ QBCore.Functions.Notify('Du har ikke råd...', 'error', 3500)
+ return
+ end
+ end
+
+ QBCore.Functions.TriggerCallback('ss-garage:server:SpawnVehicle', function(success, netid, properties, plate, fuel, engine, body)
+ while not NetworkDoesNetworkIdExist(netid) do Wait(10) end
+ local veh = NetworkGetEntityFromNetworkId(netid)
+ QBCore.Functions.SetVehicleProperties(veh, properties)
+ exports[Config.FuelSystem]:SetFuel(veh, fuel)
+ doCarDamage(veh, {engine = engine, fuel = fuel, body = body}, properties)
+ TriggerEvent('vehiclekeys:client:SetOwner', plate)
+ end, dataveh.plate, dataveh.spawn, location)
+ SetNuiFocus(false, false)
+ cb('ok')
+end)
+
+RegisterNUICallback('transfer', function(data, cb)
+ TriggerServerEvent('ss-garage:server:TransferVehicle', data)
+ SetNuiFocus(false, false)
+ cb('ok')
+end)
+
+RegisterNUICallback('swap', function(data, cb)
+ TriggerServerEvent('ss-garage:server:SwapVehicle', data)
+ SetNuiFocus(false, false)
+ cb('ok')
+end)
+
+RegisterNUICallback('close', function(data, cb)
+ SetNuiFocus(false, false)
+ cb('ok')
+end)
\ No newline at end of file
diff --git a/resources/[ss]/ss-garage/config.lua b/resources/[ss]/ss-garage/config.lua
new file mode 100644
index 0000000..96bbe62
--- /dev/null
+++ b/resources/[ss]/ss-garage/config.lua
@@ -0,0 +1,610 @@
+Config = {}
+Config.realisticGarage = true -- If true, people can only take out vehicles the place they parked them.
+Config.ShouldTeleport = true -- If true, people will be teleported to the vehicle when they take it out.
+Config.FuelSystem = 'qb-fuel'
+Config.VehicleClass = {
+ all = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22 },
+ car = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 13, 18, 22 },
+ air = { 15, 16 },
+ sea = { 14 },
+ rig = { 10, 11, 17, 19, 20 }
+}
+
+Config.Garages = {
+ motelgarage = {
+ label = 'Motel Garage',
+ takeVehicle = vector3(274.29, -334.15, 44.92),
+ spawnPoint = {
+ vector4(265.96, -332.3, 44.51, 250.68),
+ vector4(282.883, -342.1992, 44.2761, 250.8604),
+ vector4(267.5406, -328.8379, 44.2761, 250.7557),
+ vector4(269.149, -325.8365, 44.2763, 67.0302),
+ vector4(269.6346, -322.39, 44.2762, 249.4603),
+ vector4(271.4303, -319.1182, 44.2765, 244.1053),
+ vector4(283.509, -323.7081, 44.2763, 70.6249),
+ vector4(282.0807, -327.1404, 44.2763, 75.4733),
+ vector4(280.4306, -330.3371, 44.2763, 62.2022),
+ vector4(279.1444, -333.3873, 44.2763, 69.1845),
+ vector4(278.8283, -336.8015, 44.2758, 69.7977),
+ vector4(277.2846, -340.1966, 44.2764, 67.612),
+ vector4(294.4673, -346.4664, 44.2763, 69.6834),
+ vector4(295.1735, -342.9712, 44.2762, 68.7405),
+ vector4(296.5222, -339.7621, 44.276, 70.7631),
+ vector4(297.9995, -336.6969, 44.2759, 70.5789),
+ vector4(299.3056, -333.4106, 44.2764, 70.6955),
+ vector4(300.1339, -330.0648, 44.2764, 70.6679),
+ },
+ showBlip = true,
+ blipName = 'Garage',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'public', -- public, gang, job, depot
+ canTransfer = true,
+ category = Config.VehicleClass['car']
+ },
+ casinogarage = {
+ label = 'Kasino Garage',
+ takeVehicle = vector3(883.96, -4.71, 78.76),
+ spawnPoint = {
+ vector4(895.39, -4.75, 78.35, 146.85),
+ },
+ showBlip = true,
+ blipName = 'Garage',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = true,
+ category = Config.VehicleClass['car']
+ },
+ sapcounsel = {
+ label = 'San Andreas Garage',
+ takeVehicle = vector3(-330.01, -780.33, 33.96),
+ spawnPoint = {
+ vector4(-341.57, -767.45, 33.56, 92.61),
+ vector4(-357.4557, -775.9738, 33.3235, 270.8601),
+ vector4(-356.9517, -770.8321, 33.3236, 89.8937),
+ vector4(-357.679, -767.6159, 33.3235, 270.2125),
+ vector4(-357.679, -767.6159, 33.3235, 270.2125),
+ vector4(-342.1111, -760.3303, 33.3249, 270.4968),
+ vector4(-337.5381, -751.2196, 33.324, 357.0646),
+ vector4(-357.6219, -753.699, 33.324, 270.6099),
+ vector4(-331.7151, -750.8432, 33.3236, 182.1149),
+ vector4(-323.2357, -752.1731, 33.3236, 333.9358),
+ vector4(-317.3772, -754.2914, 33.3236, 158.9068),
+ vector4(-308.8079, -757.314, 33.3236, 337.8231),
+ vector4(-302.6512, -742.9934, 33.3204, 339.1781),
+ vector4(-302.6133, -759.8962, 33.3238, 342.1106),
+ vector4(-296.9796, -744.9661, 33.3198, 340.7576),
+ vector4(-307.0268, -772.5587, 33.3199, 339.7787),
+ vector4(-314.5116, -770.5553, 33.3195, 180.3153),
+ },
+ showBlip = true,
+ blipName = 'Garage',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = true,
+ category = Config.VehicleClass['car']
+ },
+ spanishave = {
+ label = 'Spanish Ave Garage',
+ takeVehicle = vector3(-1160.86, -741.41, 19.63),
+ spawnPoint = {
+ vector4(-1145.2, -745.42, 19.26, 108.22)
+ },
+ showBlip = true,
+ blipName = 'Garage',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = true,
+ category = Config.VehicleClass['car']
+ },
+ caears24 = {
+ label = 'Caears 24 Garage',
+ takeVehicle = vector3(69.84, 12.6, 68.96),
+ spawnPoint = {
+ vector4(60.8, 17.54, 68.82, 339.7),
+ },
+ showBlip = true,
+ blipName = 'Garage',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = true,
+ category = Config.VehicleClass['car']
+ },
+ caears242 = {
+ label = 'Caears 24 Garage',
+ takeVehicle = vector3(-453.7, -786.78, 30.56),
+ spawnPoint = {
+ vector4(-472.39, -787.71, 30.14, 180.52),
+ vector4(-467.3271, -794.2883, 29.9037, 271.1952),
+ vector4(-460.5847, -797.3, 29.9009, 270.1559),
+ vector4(-457.2117, -780.4339, 29.917, 272.5331),
+ vector4(-457.2724, -774.8185, 29.9175, 92.8342),
+ vector4(-465.1874, -774.9702, 29.9173, 90.0228),
+ vector4(-465.6922, -780.3431, 29.9172, 270.9347),
+ vector4(-477.4666, -787.4562, 29.9184, 271.7519),
+ },
+ showBlip = true,
+ blipName = 'Garage',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = true,
+ category = Config.VehicleClass['car']
+ },
+ lagunapi = {
+ label = 'Laguna Garage',
+ takeVehicle = vector3(364.37, 297.83, 103.49),
+ spawnPoint = {
+ vector4(375.09, 294.66, 102.86, 164.04)
+ },
+ showBlip = true,
+ blipName = 'Garage',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = true,
+ category = Config.VehicleClass['car']
+ },
+ airportp = {
+ label = 'Lufthavn Garage',
+ takeVehicle = vector3(-773.12, -2033.04, 8.88),
+ spawnPoint = {
+ vector4(-779.77, -2040.18, 8.47, 315.34)
+ },
+ showBlip = true,
+ blipName = 'Garage',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = true,
+ category = Config.VehicleClass['car']
+ },
+ beachp = {
+ label = 'Strand Garage',
+ takeVehicle = vector3(-1185.32, -1500.64, 4.38),
+ spawnPoint = {
+ vector4(-1188.14, -1487.95, 3.97, 124.06)
+ },
+ showBlip = true,
+ blipName = 'Garage',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = true,
+ category = Config.VehicleClass['car']
+ },
+ themotorhotel = {
+ label = 'The Motor Hotel Garage',
+ takeVehicle = vector3(1137.77, 2663.54, 37.9),
+ spawnPoint = {
+ vector4(1127.7, 2647.84, 37.58, 1.41)
+ },
+ showBlip = true,
+ blipName = 'Garage',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = true,
+ category = Config.VehicleClass['car']
+ },
+ liqourparking = {
+ label = 'Liqour Garage',
+ takeVehicle = vector3(883.99, 3649.67, 32.87),
+ spawnPoint = {
+ vector4(898.38, 3649.41, 32.36, 90.75)
+ },
+ showBlip = true,
+ blipName = 'Garage',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = true,
+ category = Config.VehicleClass['car']
+ },
+ shoreparking = {
+ label = 'Shore Garage',
+ takeVehicle = vector3(1737.03, 3718.88, 34.05),
+ spawnPoint = {
+ vector4(1725.4, 3716.78, 34.15, 20.54)
+ },
+ showBlip = true,
+ blipName = 'Garage',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = true,
+ category = Config.VehicleClass['car']
+ },
+ haanparking = {
+ label = 'Bell Farms Garage',
+ takeVehicle = vector3(76.88, 6397.3, 31.23),
+ spawnPoint = {
+ vector4(62.15, 6403.41, 30.81, 211.38)
+ },
+ showBlip = true,
+ blipName = 'Garage',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = false,
+ category = Config.VehicleClass['car']
+ },
+ dumbogarage = {
+ label = 'Dumbo Private Garage',
+ takeVehicle = vector3(165.75, -3227.2, 5.89),
+ spawnPoint = {
+ vector4(168.34, -3236.1, 5.43, 272.05)
+ },
+ showBlip = true,
+ blipName = 'Garage',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = false,
+ category = Config.VehicleClass['car']
+ },
+ pillboxgarage = {
+ label = 'Pillbox Garage',
+ takeVehicle = vector3(213.2, -796.05, 30.86),
+ spawnPoint = {
+ vector4(208.0369,-795.8985,30.3507,249.2093),
+ vector4(210.226, -791.0077, 30.3061, 248.5806),
+ vector4(211.5416, -786.0048, 30.2899, 248.165),
+ vector4(213.4844, -780.8046, 30.2643, 248.5822),
+ vector4(215.5396, -775.9241, 30.2391, 249.4368),
+ vector4(217.0861, -770.852, 30.2283, 249.9718),
+ vector4(219.1092, -765.7935, 30.2166, 249.7753),
+ vector4(216.5972, -801.837, 30.3747, 69.672),
+ vector4(218.286, -796.6944, 30.3539, 68.0749),
+ vector4(220.107, -791.6907, 30.3425, 69.9591),
+ vector4(222.7271, -786.7191, 30.3557, 69.189),
+ vector4(223.9891, -781.738, 30.1123, 67.8247),
+ vector4(225.7642, -776.7175, 30.1225, 69.919),
+ vector4(227.3384, -771.6263, 30.1372, 68.7111),
+ vector4(220.683, -809.4442, 30.0114, 249.1702),
+ vector4(222.1926, -804.1495, 30.0272, 250.0585),
+ vector4(223.7662, -799.1116, 30.0173, 248.7341),
+ vector4(225.7113, -794.1168, 30.023, 250.1617),
+ vector4(227.6714, -789.1185, 30.0382, 249.4263),
+ vector4(229.8159, -784.0559, 30.0515, 249.9496),
+ vector4(231.3116, -778.8309, 30.0669, 251.3097),
+ vector4(233.2657, -773.8463, 30.0939, 248.8269),
+ vector4(234.9788, -800.2876, 29.8276, 68.0544),
+ vector4(236.8822, -795.0956, 29.8564, 68.6202),
+ vector4(238.6287, -790.1068, 29.8856, 69.3068),
+ vector4(240.3504, -785.0618, 29.9364, 68.9169),
+ vector4(242.1495, -779.8129, 29.9797, 67.5336),
+ vector4(243.9969, -774.7357, 30.0432, 69.2771),
+ },
+ showBlip = true,
+ blipName = 'Garage',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = true,
+ category = Config.VehicleClass['car']
+ },
+ grapeseedgarage = {
+ label = 'Grapeseed Garage',
+ takeVehicle = vector3(2552.68, 4671.8, 33.95),
+ spawnPoint = {
+ vector4(2550.17, 4681.96, 33.81, 17.05)
+ },
+ showBlip = true,
+ blipName = 'Garage',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = true,
+ category = Config.VehicleClass['car']
+ },
+ depotLot = {
+ label = 'Depot Lot',
+ takeVehicle = vector3(401.76, -1632.57, 29.29),
+ spawnPoint = {
+ vector4(396.55, -1643.93, 28.88, 321.91)
+ },
+ showBlip = true,
+ blipName = 'Depot Lot',
+ blipNumber = 68,
+ blipColor = 3,
+ type = 'depot',
+ canTransfer = false,
+ category = Config.VehicleClass['car']
+ },
+ ballas = {
+ label = 'Ballas',
+ takeVehicle = vector3(87.51, -1969.1, 20.75),
+ spawnPoint = {
+ vector4(93.78, -1961.73, 20.34, 319.11)
+ },
+ showBlip = false,
+ blipName = 'Ballas',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'gang',
+ canTransfer = false,
+ category = Config.VehicleClass['car'], --car, air, sea, rig
+ job = 'ballas',
+ jobType = 'ballas'
+ },
+ families = {
+ label = 'Families',
+ takeVehicle = vector3(-23.89, -1436.03, 30.65),
+ spawnPoint = {
+ vector4(-25.47, -1445.76, 30.24, 178.5)
+ },
+ showBlip = false,
+ blipName = 'Families',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'gang',
+ canTransfer = false,
+ category = Config.VehicleClass['car'], --car, air, sea, rig
+ job = 'families',
+ jobType = 'families'
+ },
+ lostmc = {
+ label = 'Lost MC',
+ takeVehicle = vector3(985.83, -138.14, 73.09),
+ spawnPoint = {
+ vector4(977.65, -133.02, 73.34, 59.39)
+ },
+ showBlip = false,
+ blipName = 'Lost MC',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'gang',
+ canTransfer = false,
+ category = Config.VehicleClass['car'], --car, air, sea, rig
+ job = 'lostmc',
+ jobType = 'lostmc'
+ },
+ cartel = {
+ label = 'Cartel',
+ takeVehicle = vector3(1411.67, 1117.8, 114.84),
+ spawnPoint = {
+ vector4(1403.01, 1118.25, 114.84, 88.69)
+ },
+ showBlip = false,
+ blipName = 'Cartel',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'gang',
+ canTransfer = false,
+ category = Config.VehicleClass['car'],
+ job = 'cartel',
+ jobType = 'cartel'
+ },
+ police = {
+ label = 'Police',
+ takeVehicle = vector3(462.83, -1019.52, 28.1),
+ spawnPoint = {
+ vector4(446.16, -1025.79, 28.23, 6.59)
+ },
+ showBlip = false,
+ blipName = 'Police',
+ blipNumber = 357,
+ blipColor = 3,
+ type = 'job',
+ canTransfer = false,
+ category = Config.VehicleClass['car'], --car, air, sea, rig
+ job = 'police',
+ jobType = 'leo'
+ },
+ intairport = {
+ label = 'Airport Hangar',
+ takeVehicle = vector3(-979.06, -2995.48, 13.95),
+ spawnPoint = {
+ vector4(-998.37, -2985.01, 13.95, 61.09)
+ },
+ showBlip = true,
+ blipName = 'Hangar',
+ blipNumber = 360,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = false,
+ category = Config.VehicleClass['air']
+ },
+ higginsheli = {
+ label = 'Higgins Helitours',
+ takeVehicle = vector3(-722.15, -1472.79, 5.0),
+ spawnPoint = {
+ vector4(-745.22, -1468.72, 5.39, 319.84),
+ vector4(-724.36, -1443.61, 5.39, 135.78)
+ },
+ showBlip = true,
+ blipName = 'Hangar',
+ blipNumber = 360,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = false,
+ category = Config.VehicleClass['air']
+ },
+ airsshores = {
+ label = 'Sandy Shores Hangar',
+ takeVehicle = vector3(1737.89, 3288.13, 41.14),
+ spawnPoint = {
+ vector4(1742.83, 3266.83, 41.24, 102.64)
+ },
+ showBlip = true,
+ blipName = 'Hangar',
+ blipNumber = 360,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = false,
+ category = Config.VehicleClass['air']
+ },
+ airzancudo = {
+ label = 'Fort Zancudo Hangar',
+ takeVehicle = vector3(-1828.25, 2975.44, 32.81),
+ spawnPoint = {
+ vector4(-1828.25, 2975.44, 32.81, 57.24)
+ },
+ showBlip = true,
+ blipName = 'Hangar',
+ blipNumber = 360,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = false,
+ category = Config.VehicleClass['air']
+ },
+ airdepot = {
+ label = 'Air Depot',
+ takeVehicle = vector3(-1270.01, -3377.53, 14.33),
+ spawnPoint = {
+ vector4(-1270.01, -3377.53, 14.33, 329.25)
+ },
+ showBlip = true,
+ blipName = 'Air Depot',
+ blipNumber = 359,
+ blipColor = 3,
+ type = 'depot',
+ canTransfer = false,
+ category = Config.VehicleClass['air']
+ },
+ lsymc = {
+ label = 'LSYMC Boathouse',
+ takeVehicle = vector3(-785.95, -1497.84, -0.09),
+ spawnPoint = {
+ vector4(-796.64, -1502.6, -0.09, 111.49)
+ },
+ showBlip = true,
+ blipName = 'Bådhus',
+ blipNumber = 356,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = false,
+ category = Config.VehicleClass['sea']
+ },
+ paleto = {
+ label = 'Paleto Boathouse',
+ takeVehicle = vector3(-278.21, 6638.13, 7.55),
+ spawnPoint = {
+ vector4(-289.2, 6637.96, 1.01, 45.5)
+ },
+ showBlip = true,
+ blipName = 'Bådhus',
+ blipNumber = 356,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = false,
+ category = Config.VehicleClass['sea']
+ },
+ millars = {
+ label = 'Millars Boathouse',
+ takeVehicle = vector3(1298.56, 4212.42, 33.25),
+ spawnPoint = {
+ vector4(1297.82, 4209.61, 30.12, 253.5)
+ },
+ showBlip = true,
+ blipName = 'Bådhus',
+ blipNumber = 356,
+ blipColor = 3,
+ type = 'public',
+ canTransfer = false,
+ category = Config.VehicleClass['sea']
+ },
+ seadepot = {
+ label = 'LSYMC Depot',
+ takeVehicle = vector3(-742.95, -1407.58, 5.5),
+ spawnPoint = {
+ vector4(-729.77, -1355.49, 1.19, 142.5)
+ },
+ showBlip = true,
+ blipName = 'LSYMC Depot',
+ blipNumber = 356,
+ blipColor = 3,
+ type = 'depot',
+ canTransfer = false,
+ category = Config.VehicleClass['sea']
+ },
+ rigdepot = {
+ label = 'Big Rig Depot',
+ takeVehicle = vector3(2334.42, 3118.62, 48.2),
+ spawnPoint = {
+ vector4(2324.57, 3117.79, 48.21, 4.05)
+ },
+ showBlip = true,
+ blipName = 'Big Rig Depot',
+ blipNumber = 68,
+ blipColor = 2,
+ type = 'depot',
+ canTransfer = false,
+ category = Config.VehicleClass['rig']
+ },
+ dumborigparking = {
+ label = 'Dumbo Big Rig Parking',
+ takeVehicle = vector3(161.23, -3188.73, 5.97),
+ spawnPoint = {
+ vector4(167.0, -3203.89, 5.94, 271.27)
+ },
+ showBlip = true,
+ blipName = 'Big Rig Parking',
+ blipNumber = 357,
+ blipColor = 2,
+ type = 'public',
+ canTransfer = false,
+ category = Config.VehicleClass['rig']
+ },
+ popsrigparking = {
+ label = 'Pop\'s Big Rig Parking',
+ takeVehicle = vector3(137.67, 6632.99, 31.67),
+ spawnPoint = {
+ vector4(127.69, 6605.84, 31.93, 223.67)
+ },
+ showBlip = true,
+ blipName = 'Big Rig Parking',
+ blipNumber = 357,
+ blipColor = 2,
+ type = 'public',
+ canTransfer = false,
+ category = Config.VehicleClass['rig']
+ },
+ ronsrigparking = {
+ label = 'Ron\'s Big Rig Parking',
+ takeVehicle = vector3(-2529.37, 2342.67, 33.06),
+ spawnPoint = {
+ vector4(-2521.61, 2326.45, 33.13, 88.7)
+ },
+ showBlip = true,
+ blipName = 'Big Rig Parking',
+ blipNumber = 357,
+ blipColor = 2,
+ type = 'public',
+ canTransfer = false,
+ category = Config.VehicleClass['rig']
+ },
+ ronsrigparking2 = {
+ label = 'Ron\'s Big Rig Parking',
+ takeVehicle = vector3(2561.67, 476.68, 108.49),
+ spawnPoint = {
+ vector4(2561.67, 476.68, 108.49, 177.86)
+ },
+ showBlip = true,
+ blipName = 'Big Rig Parking',
+ blipNumber = 357,
+ blipColor = 2,
+ type = 'public',
+ canTransfer = false,
+ category = Config.VehicleClass['rig']
+ },
+ ronsrigparking3 = {
+ label = 'Ron\'s Big Rig Parking',
+ takeVehicle = vector3(-41.24, -2550.63, 6.01),
+ spawnPoint = {
+ vector4(-39.39, -2527.81, 6.08, 326.18)
+ },
+ showBlip = true,
+ blipName = 'Big Rig Parking',
+ blipNumber = 357,
+ blipColor = 2,
+ type = 'public',
+ canTransfer = false,
+ category = Config.VehicleClass['rig']
+ },
+}
\ No newline at end of file
diff --git a/resources/[ss]/ss-garage/fxmanifest.lua b/resources/[ss]/ss-garage/fxmanifest.lua
new file mode 100644
index 0000000..52d7fc9
--- /dev/null
+++ b/resources/[ss]/ss-garage/fxmanifest.lua
@@ -0,0 +1,35 @@
+fx_version 'cerulean'
+game 'gta5'
+lua54 'yes'
+description 'Simplified Studios Garage'
+version '1.2.0'
+
+ui_page 'html/index.html'
+
+shared_scripts {
+ '@qb-core/shared/locale.lua',
+ 'locales/en.lua',
+ 'locales/*.lua',
+ 'config.lua',
+}
+
+client_scripts {
+ '@PolyZone/client.lua',
+ '@PolyZone/CircleZone.lua',
+ '@PolyZone/ComboZone.lua',
+ 'client/cl_functions.lua',
+ 'client/cl_main.lua',
+}
+
+server_scripts {
+ 'server/sv_main.lua',
+ 'server/sv_functions.lua',
+}
+
+files {
+ 'html/img/*.png',
+ 'html/img/*.jpg',
+ 'html/index.html',
+ 'html/style.css',
+ 'html/script.js',
+}
\ No newline at end of file
diff --git a/resources/[ss]/ss-garage/html/img/caears24.png b/resources/[ss]/ss-garage/html/img/caears24.png
new file mode 100644
index 0000000..58f6c14
Binary files /dev/null and b/resources/[ss]/ss-garage/html/img/caears24.png differ
diff --git a/resources/[ss]/ss-garage/html/img/default.png b/resources/[ss]/ss-garage/html/img/default.png
new file mode 100644
index 0000000..bda1b1f
Binary files /dev/null and b/resources/[ss]/ss-garage/html/img/default.png differ
diff --git a/resources/[ss]/ss-garage/html/img/motelgarage.png b/resources/[ss]/ss-garage/html/img/motelgarage.png
new file mode 100644
index 0000000..869d740
Binary files /dev/null and b/resources/[ss]/ss-garage/html/img/motelgarage.png differ
diff --git a/resources/[ss]/ss-garage/html/img/pillboxgarage.png b/resources/[ss]/ss-garage/html/img/pillboxgarage.png
new file mode 100644
index 0000000..f556a63
Binary files /dev/null and b/resources/[ss]/ss-garage/html/img/pillboxgarage.png differ
diff --git a/resources/[ss]/ss-garage/html/img/sapcounsel.png b/resources/[ss]/ss-garage/html/img/sapcounsel.png
new file mode 100644
index 0000000..b604d2b
Binary files /dev/null and b/resources/[ss]/ss-garage/html/img/sapcounsel.png differ
diff --git a/resources/[ss]/ss-garage/html/index.html b/resources/[ss]/ss-garage/html/index.html
new file mode 100644
index 0000000..7c29840
--- /dev/null
+++ b/resources/[ss]/ss-garage/html/index.html
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${vehicle.plate}
+
+
Ude' :
+ vehicle.state === 1 ?
+ `
${event.data.garages[event.data.garageindex].label}` :
+ vehicle.state === 2 ?
+ `
Impounded - Gebyr: ${formatNumber(vehicle.impoundPrice)},-` :
+ ''
+ }
+
+
+
+
+
+
+