From 8c9299f7b2f047261ab6c3088e3b8767577ca0c8 Mon Sep 17 00:00:00 2001 From: Kakarot <57848836+GhzGarage@users.noreply.github.com> Date: Tue, 31 Oct 2023 18:16:38 -0500 Subject: [PATCH] Garage 2.0 --- client/main.lua | 829 +++++++++++++++----------------------- config.lua | 952 ++++++++++++++++++++++++-------------------- database.sql | 29 -- fxmanifest.lua | 15 +- html/index.html | 19 + html/logo.png | Bin 0 -> 2613 bytes html/script.js | 260 ++++++++++++ html/style.css | 186 +++++++++ locales/ar.lua | 54 ++- locales/da.lua | 68 +--- locales/de.lua | 68 +--- locales/en.lua | 76 +--- locales/es.lua | 69 +--- locales/et.lua | 69 +--- locales/fa.lua | 52 ++- locales/fi.lua | 52 ++- locales/fr.lua | 69 +--- locales/ge.lua | 52 ++- locales/it.lua | 52 ++- locales/nl.lua | 68 +--- locales/pt-br.lua | 74 +--- locales/pt.lua | 68 +--- locales/ro.lua | 73 +--- locales/sk.lua | 52 ++- locales/sv.lua | 68 +--- locales/tr.lua | 68 +--- player_vehicles.sql | 26 ++ server/main.lua | 438 ++++++++------------ 28 files changed, 1909 insertions(+), 1997 deletions(-) delete mode 100644 database.sql create mode 100644 html/index.html create mode 100644 html/logo.png create mode 100644 html/script.js create mode 100644 html/style.css create mode 100644 player_vehicles.sql diff --git a/client/main.lua b/client/main.lua index 3ce7dd3..ac13735 100644 --- a/client/main.lua +++ b/client/main.lua @@ -2,461 +2,411 @@ local QBCore = exports['qb-core']:GetCoreObject() local PlayerData = {} local PlayerGang = {} local PlayerJob = {} - -local Markers = false -local HouseMarkers = false -local InputIn = false -local InputOut = false -local currentGarage = nil -local currentGarageIndex = nil local garageZones = {} -local lasthouse = nil -local blipsZonesLoaded = false +local listenForKey = false +-- Functions ---Menus -local function MenuGarage(type, garage, indexgarage) - local header - local leave - if type == "house" then - header = Lang:t("menu.header." .. type .. "_car", { value = garage.label }) - leave = Lang:t("menu.leave.car") - else - header = Lang:t("menu.header." .. type .. "_" .. garage.vehicle, { value = garage.label }) - leave = Lang:t("menu.leave." .. garage.vehicle) +local function round(num, numDecimalPlaces) + return tonumber(string.format('%.' .. (numDecimalPlaces or 0) .. 'f', num)) +end + +local 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 - exports['qb-menu']:openMenu({ - { - header = header, - isMenuHeader = true - }, - { - header = Lang:t("menu.header.vehicles"), - txt = Lang:t("menu.text.vehicles"), - params = { - event = "qb-garages:client:VehicleList", - args = { - type = type, - garage = garage, - index = indexgarage, - } +local function OpenGarageMenu(data) + QBCore.Functions.TriggerCallback('qb-garages:server:GetGarageVehicles', function(result) + if result == nil then return QBCore.Functions.Notify(Lang:t('error.no_vehicles'), 'error', 5000) end + local formattedVehicles = {} + for _, v in pairs(result) do + local enginePercent = round(v.engine, 0) + local bodyPercent = round(v.body, 0) + local vname = nil + pcall(function() + vname = QBCore.Shared.Vehicles[v.vehicle].name + end) + formattedVehicles[#formattedVehicles + 1] = { + vehicle = v.vehicle, + vehicleLabel = vname or v.vehicle, + plate = v.plate, + state = v.state, + fuel = v.fuel, + engine = enginePercent, + body = bodyPercent, + distance = v.drivingdistance or 0, + garage = Config.Garages[data.indexgarage], + type = data.type, + index = data.indexgarage, + depotPrice = v.depotprice or 0, + balance = v.balance or 0 } - }, - { - header = leave, - txt = "", - params = { - event = "qb-menu:closeMenu" - } - }, - }) + end + SetNuiFocus(true, true) + SendNUIMessage({ + action = 'VehicleList', + garageLabel = Config.Garages[data.indexgarage].label, + vehicles = formattedVehicles, + }) + end, data.indexgarage, data.type, data.category) end -local function ClearMenu() - TriggerEvent("qb-menu:closeMenu") +local 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.FuelResource]:GetFuel(veh) + TriggerServerEvent('qb-vehicletuning: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'), 'primary', 4500) + else + QBCore.Functions.Notify(Lang:t('error.not_owned'), 'error', 3500) + end + end, plate, data.type, data.indexgarage, 1) end -local function closeMenuFull() - ClearMenu() +local function IsVehicleAllowed(classList, vehicle) + if not Config.ClassSystem then return true end + for _, class in ipairs(classList) do + if GetVehicleClass(vehicle) == class then + return true + end + end + return false end -local function DestroyZone(type, index) - if garageZones[type .. "_" .. index] then - garageZones[type .. "_" .. index].zonecombo:destroy() - garageZones[type .. "_" .. index].zone:destroy() - 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 -local function CreateZone(type, garage, index) - local size - local coords - local heading - local minz - local maxz - - if type == 'in' then - size = 4 - coords = vector3(garage.putVehicle.x, garage.putVehicle.y, garage.putVehicle.z) - heading = garage.spawnPoint.w - minz = coords.z - 1.0 - maxz = coords.z + 2.0 - elseif type == 'out' then - size = 2 - coords = vector3(garage.takeVehicle.x, garage.takeVehicle.y, garage.takeVehicle.z) - heading = garage.spawnPoint.w - minz = coords.z - 1.0 - maxz = coords.z + 2.0 - elseif type == 'marker' then - size = 60 - coords = vector3(garage.takeVehicle.x, garage.takeVehicle.y, garage.takeVehicle.z) - heading = garage.spawnPoint.w - minz = coords.z - 7.5 - maxz = coords.z + 7.0 - elseif type == 'hmarker' then - size = 20 - coords = vector3(garage.takeVehicle.x, garage.takeVehicle.y, garage.takeVehicle.z) - heading = garage.takeVehicle.w - minz = coords.z - 4.0 - maxz = coords.z + 2.0 - elseif type == 'house' then - size = 2 - coords = vector3(garage.takeVehicle.x, garage.takeVehicle.y, garage.takeVehicle.z) - heading = garage.takeVehicle.w - minz = coords.z - 1.0 - maxz = coords.z + 2.0 - end - garageZones[type .. "_" .. index] = {} - garageZones[type .. "_" .. index].zone = BoxZone:Create( - coords, size, size, { - minZ = minz, - maxZ = maxz, - name = type, +local function CreateZone(index, garage, zoneType) + local zone = CircleZone:Create(garage.takeVehicle, 10.0, { + name = zoneType .. '_' .. index, debugPoly = false, - heading = heading + data = { + indexgarage = index, + type = garage.type, + category = garage.category + } }) - garageZones[type .. "_" .. index].zonecombo = ComboZone:Create({ garageZones[type .. "_" .. index].zone }, - { name = "box" .. type, debugPoly = false }) - garageZones[type .. "_" .. index].zonecombo:onPlayerInOut(function(isPointInside) - if isPointInside then - local text - if type == "in" then - if garage.type == "house" then - text = Lang:t("info.park_e") - else - text = Lang:t("info.park_e") .. "
" .. garage.label - end - exports['qb-core']:DrawText(text, 'left') - InputIn = true - elseif type == "out" then - if garage.type == "house" then - text = Lang:t("info.car_e") - else - text = Lang:t("info." .. garage.vehicle .. "_e") .. "
" .. garage.label - end + return zone +end - exports['qb-core']:DrawText(text, 'left') - InputOut = true - elseif type == "marker" then - currentGarage = garage - currentGarageIndex = index - CreateZone("out", garage, index) - if garage.type ~= "depot" then - CreateZone("in", garage, index) - Markers = true - else - HouseMarkers = true - end - elseif type == "hmarker" then - currentGarage = garage - currentGarage.type = "house" - currentGarageIndex = index - CreateZone("house", garage, index) - HouseMarkers = true - elseif type == "house" then - if IsPedInAnyVehicle(PlayerPedId(), false) then - exports['qb-core']:DrawText(Lang:t("info.park_e"), 'left') - InputIn = true - else - exports['qb-core']:DrawText(Lang:t("info.car_e"), 'left') - InputOut = true - end - end - else - if type == "marker" then - if currentGarage == garage then - if garage.type ~= "depot" then - Markers = false - else - HouseMarkers = false +local 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 + 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 + OpenGarageMenu(zone.data) + end end - DestroyZone("in", index) - DestroyZone("out", index) - currentGarage = nil - currentGarageIndex = nil end - elseif type == "hmarker" then - HouseMarkers = false - DestroyZone("house", index) - elseif type == "house" then - exports['qb-core']:HideText() - InputIn = false - InputOut = false - elseif type == "in" then - exports['qb-core']:HideText() - InputIn = false - elseif type == "out" then - closeMenuFull() - exports['qb-core']:HideText() - InputOut = false + 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, 'left') + else + listenForKey = false + exports['qb-core']:HideText() end end) end -local function doCarDamage(currentVehicle, veh) - local engine = veh.engine + 0.0 - local body = veh.body + 0.0 - - if Config.VisuallyDamageCars then - local data = json.decode(veh.mods) - - for k, v in pairs(data.doorStatus) do - if v then - SetVehicleDoorBroken(currentVehicle, tonumber(k), true) - end - end - for k, v in pairs(data.tireBurstState) do - if v then - SetVehicleTyreBurst(currentVehicle, tonumber(k), true) - end - end - for k, v in pairs(data.windowStatus) do - if not v then - SmashVehicleWindow(currentVehicle, tonumber(k)) - end - end +local function doCarDamage(currentVehicle, stats, props) + local engine = stats.engine + 0.0 + local body = stats.body + 0.0 + if not next(props) then return end + for k, v in pairs(props.doorStatus) do + if v then SetVehicleDoorBroken(currentVehicle, tonumber(k), true) end + end + for k, v in pairs(props.tireBurstState) do + if v then SetVehicleTyreBurst(currentVehicle, tonumber(k), true) end + end + for k, v in pairs(props.windowStatus) do + if not v then SmashVehicleWindow(currentVehicle, tonumber(k)) end end SetVehicleEngineHealth(currentVehicle, engine) SetVehicleBodyHealth(currentVehicle, body) end -local function CheckPlayers(vehicle, garage) - for i = -1, 5, 1 do - local seat = GetPedInVehicleSeat(vehicle, i) - if seat then - TaskLeaveVehicle(seat, vehicle, 0) - if garage then - SetEntityCoords(seat, garage.takeVehicle.x, garage.takeVehicle.y, garage.takeVehicle.z) +function GetSpawnPoint(garage) + local location = nil + if #garage.spawnPoint > 1 then + local maxTries = #garage.spawnPoint + for i = 1, maxTries do + local randomIndex = math.random(1, #garage.spawnPoint) + local chosenSpawnPoint = garage.spawnPoint[randomIndex] + local isOccupied = IsPositionOccupied( + chosenSpawnPoint.x, + chosenSpawnPoint.y, + chosenSpawnPoint.z, + 5.0, -- range + false, + true, -- checkVehicles + false, -- checkPeds + false, + false, + 0, + false + ) + if not isOccupied then + location = chosenSpawnPoint + break end end + elseif #garage.spawnPoint == 1 then + location = garage.spawnPoint[1] end - SetVehicleDoorsLocked(vehicle) - Wait(1500) - QBCore.Functions.DeleteVehicle(vehicle) + if not location then + QBCore.Functions.Notify(Lang:t('error.vehicle_occupied'), 'error') + end + return location end --- Functions -local function round(num, numDecimalPlaces) - return tonumber(string.format("%." .. (numDecimalPlaces or 0) .. "f", num)) -end +-- NUI Callbacks -RegisterNetEvent("qb-garages:client:VehicleList", function(data) - local type = data.type - local garage = data.garage - local indexgarage = data.index - local header - local leave - if type == "house" then - header = Lang:t("menu.header." .. type .. "_car", { value = garage.label }) - leave = Lang:t("menu.leave.car") +RegisterNUICallback('closeGarage', function(_, cb) + SetNuiFocus(false, false) + cb('ok') +end) + +RegisterNUICallback('takeOutVehicle', function(data, cb) + TriggerEvent('qb-garages:client:takeOutGarage', data) + cb('ok') +end) + +RegisterNUICallback('trackVehicle', function(plate, cb) + TriggerServerEvent('qb-garages:server:trackVehicle', plate) + cb('ok') +end) + +RegisterNUICallback('takeOutDepo', function(data, cb) + local depotPrice = data.depotPrice + if depotPrice ~= 0 then + TriggerServerEvent('qb-garages:server:PayDepotPrice', data) else - header = Lang:t("menu.header." .. type .. "_" .. garage.vehicle, { value = garage.label }) - leave = Lang:t("menu.leave." .. garage.vehicle) + TriggerEvent('qb-garages:client:takeOutGarage', data) end + cb('ok') +end) - QBCore.Functions.TriggerCallback("qb-garage:server:GetGarageVehicles", function(result) - if result == nil then - QBCore.Functions.Notify(Lang:t("error.no_vehicles"), "error", 5000) - else - local MenuGarageOptions = { - { - header = header, - isMenuHeader = true - }, - } - for _, v in pairs(result) do - local enginePercent = round(v.engine / 10, 0) - local bodyPercent = round(v.body / 10, 0) - local currentFuel = v.fuel - local vname = nil - pcall(function () - vname = QBCore.Shared.Vehicles[v.vehicle].name - end) - if v.state == 0 then - v.state = Lang:t("status.out") - elseif v.state == 1 then - v.state = Lang:t("status.garaged") - elseif v.state == 2 then - v.state = Lang:t("status.impound") - end - if type == "depot" and vname ~= nil then - MenuGarageOptions[#MenuGarageOptions + 1] = { - header = Lang:t('menu.header.depot', { value = vname, value2 = v.depotprice }), - txt = Lang:t('menu.text.depot', { value = v.plate, value2 = currentFuel, value3 = enginePercent, value4 = bodyPercent }), - params = { - event = "qb-garages:client:TakeOutDepot", - args = { - vehicle = v, - type = type, - garage = garage, - index = indexgarage, - } - } - } - else - -- - local txt = Lang:t('menu.text.garage', { value = v.state, value2 = currentFuel, value3 = enginePercent, value4 = bodyPercent }) - local menuHeader = Lang:t('menu.header.garage', { value = vname, value2 = v.plate }) - if vname == nil then - menuHeader = Lang:t('menu.header.unavailable_vehicle_model', { vehicle = string.upper(v.vehicle) }) - end - MenuGarageOptions[#MenuGarageOptions + 1] = { - header = menuHeader, - txt = txt, - disabled = vname == nil, - params = { - event = "qb-garages:client:takeOutGarage", - args = { - vehicle = v, - type = type, - garage = garage, - index = indexgarage, - } - } - } - end - end +-- Events - MenuGarageOptions[#MenuGarageOptions + 1] = { - header = leave, - txt = "", - params = { - event = "qb-menu:closeMenu", - } - } - exports['qb-menu']:openMenu(MenuGarageOptions) - end - end, indexgarage, type, garage.vehicle) +RegisterNetEvent('qb-garages:client:trackVehicle', function(coords) + SetNewWaypoint(coords.x, coords.y) end) RegisterNetEvent('qb-garages:client:takeOutGarage', function(data) local type = data.type local vehicle = data.vehicle local garage = data.garage - local index = data.index - QBCore.Functions.TriggerCallback('qb-garage:server:IsSpawnOk', function(spawn) + local plate = data.plate + local stats = data.stats + QBCore.Functions.TriggerCallback('qb-garages:server:IsSpawnOk', function(spawn) if spawn then - local location - if type == "house" then - if garage.takeVehicle.h then garage.takeVehicle.w = garage.takeVehicle.h end -- backward compatibility - location = garage.takeVehicle - else - location = garage.spawnPoint - end - QBCore.Functions.TriggerCallback('qb-garage:server:spawnvehicle', function(netId, properties) + local location = GetSpawnPoint(garage) + QBCore.Functions.TriggerCallback('qb-garages:server:spawnvehicle', function(netId, properties) local veh = NetToVeh(netId) QBCore.Functions.SetVehicleProperties(veh, properties) - exports['LegacyFuel']:SetFuel(veh, vehicle.fuel) - doCarDamage(veh, vehicle) - TriggerServerEvent('qb-garage:server:updateVehicleState', 0, vehicle.plate, index) - closeMenuFull() - TriggerEvent("vehiclekeys:client:SetOwner", QBCore.Functions.GetPlate(veh)) + exports[Config.FuelResource]:SetFuel(veh, vehicle.fuel) + TriggerServerEvent('qb-garages:server:updateVehicleState', 0, plate) + TriggerEvent('vehiclekeys:client:SetOwner', QBCore.Functions.GetPlate(veh)) + if Config.VisuallyDamageCars then doCarDamage(veh, stats, properties) end SetVehicleEngineOn(veh, true, true) - if type == "house" then - exports['qb-core']:DrawText(Lang:t("info.park_e"), 'left') - InputOut = false - InputIn = true - end - end, vehicle, location, true) + end, plate, vehicle, location, true) else - QBCore.Functions.Notify(Lang:t("error.not_impound"), "error", 5000) + QBCore.Functions.Notify(Lang:t('error.not_depot'), 'error', 5000) end - end, vehicle.plate, type) + end, plate, type) end) -local function enterVehicle(veh, indexgarage, type, garage) - local plate = QBCore.Functions.GetPlate(veh) - if GetVehicleNumberOfPassengers(veh) == 0 then - QBCore.Functions.TriggerCallback('qb-garage:server:checkOwnership', function(owned) - if owned then - local bodyDamage = math.ceil(GetVehicleBodyHealth(veh)) - local engineDamage = math.ceil(GetVehicleEngineHealth(veh)) - local totalFuel = exports['LegacyFuel']:GetFuel(veh) - TriggerServerEvent("qb-vehicletuning:server:SaveVehicleProps", QBCore.Functions.GetVehicleProperties(veh)) - TriggerServerEvent('qb-garage:server:updateVehicle', 1, totalFuel, engineDamage, bodyDamage, plate, indexgarage, type, PlayerGang.name) - CheckPlayers(veh, garage) - if type == "house" then - exports['qb-core']:DrawText(Lang:t("info.car_e"), 'left') - InputOut = true - InputIn = false - end +-- Housing calls + +local houseGarageZones = {} +local listenForKeyHouse = false +local houseComboZones = nil + +local function CreateHouseZone(index, garage, zoneType) + local houseZone = CircleZone:Create(garage.takeVehicle, 5.0, { + name = zoneType .. '_' .. index, + debugPoly = false, + data = { + indexgarage = index, + type = zoneType, + } + }) - if plate then - TriggerServerEvent('qb-garages:server:UpdateOutsideVehicle', plate, nil) + if houseZone then + houseGarageZones[#houseGarageZones + 1] = houseZone + + if not houseComboZones then + houseComboZones = ComboZone:Create(houseGarageZones, { name = 'houseComboZones', debugPoly = true }) + else + houseComboZones:AddZone(houseZone) + end + end + + houseComboZones:onPlayerInOut(function(isPointInside, _, zone) + if isPointInside then + listenForKeyHouse = true + 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 + OpenGarageMenu(zone.data) + end + end end - QBCore.Functions.Notify(Lang:t("success.vehicle_parked"), "primary", 4500) - else - QBCore.Functions.Notify(Lang:t("error.not_owned"), "error", 3500) - end - end, plate, type, indexgarage, PlayerGang.name) - else - QBCore.Functions.Notify(Lang:t("error.vehicle_occupied"), "error", 5000) + end) + exports['qb-core']:DrawText(Lang:t('info.house_garage'), 'left') + else + listenForKeyHouse = false + 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 CreateBlipsZones() - if blipsZonesLoaded then return end - PlayerData = QBCore.Functions.GetPlayerData() - PlayerGang = PlayerData.gang - PlayerJob = PlayerData.job - local function blipZoneGen(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) + +local function RemoveHouseZone(zoneName) + local removedZone = houseComboZones:RemoveZone(zoneName) + if removedZone then + removedZone:destroy() end - for index, garage in pairs(Config.Garages) do - if garage.showBlip then - blipZoneGen(garage); - end - if garage.type == "job" then - if PlayerJob.name == garage.job or PlayerJob.type == garage.jobType then - CreateZone("marker", garage, index) - end - elseif garage.type == "gang" then - if PlayerGang.name == garage.job then - CreateZone("marker", garage, index) - end - else - CreateZone("marker", garage, index) + for index, zone in ipairs(houseGarageZones) do + if zone.name == zoneName then + table.remove(houseGarageZones, index) + break end end - blipsZonesLoaded = true end -RegisterNetEvent('qb-garages:client:setHouseGarage', function(house, hasKey) - if Config.HouseGarages[house] then - if lasthouse ~= house then - if lasthouse then - DestroyZone("hmarker", lasthouse) - end - if hasKey and Config.HouseGarages[house].takeVehicle.x then - CreateZone("hmarker", Config.HouseGarages[house], house) - lasthouse = house - end +RegisterNetEvent('qb-garages:client:setHouseGarage', function(house, hasKey) -- event sent periodically from housing + if not house then return end + local formattedHouseName = string.gsub(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 end) -RegisterNetEvent('qb-garages:client:houseGarageConfig', function(garageConfig) - Config.HouseGarages = garageConfig +RegisterNetEvent('qb-garages:client:houseGarageConfig', function(houseGarages) + for _, garageConfig in pairs(houseGarages) do + local formattedHouseName = string.gsub(string.lower(garageConfig.label), ' ', '') + 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 end) -RegisterNetEvent('qb-garages:client:addHouseGarage', function(house, garageInfo) - Config.HouseGarages[house] = garageInfo +RegisterNetEvent('qb-garages:client:addHouseGarage', function(house, garageInfo) -- event from housing on garage creation + local formattedHouseName = string.gsub(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', + } end) +-- Handlers + AddEventHandler('QBCore:Client:OnPlayerLoaded', function() CreateBlipsZones() end) -AddEventHandler("onResourceStart", function(res) +AddEventHandler('onResourceStart', function(res) if res ~= GetCurrentResourceName() then return end CreateBlipsZones() end) @@ -468,122 +418,3 @@ end) RegisterNetEvent('QBCore:Client:OnJobUpdate', function(job) PlayerJob = job end) - -RegisterNetEvent('qb-garages:client:TakeOutDepot', function(data) - local vehicle = data.vehicle - - if vehicle.depotprice ~= 0 then - TriggerServerEvent("qb-garage:server:PayDepotPrice", data) - else - TriggerEvent("qb-garages:client:takeOutGarage", data) - end -end) - --- Threads -CreateThread(function() - local sleep - while true do - sleep = 2000 - if currentGarage ~= nil then - if Markers then - if currentGarage.putVehicle then - DrawMarker(2, currentGarage.putVehicle.x, currentGarage.putVehicle.y, currentGarage.putVehicle.z, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.2, 0.15, 255, 255, 255, 255, false, false, false, true, false, false, false) - end - DrawMarker(2, currentGarage.takeVehicle.x, currentGarage.takeVehicle.y, currentGarage.takeVehicle.z, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.2, 0.15, 200, 0, 0, 222, false, false, false, true, false, false, false) - sleep = 0 - elseif HouseMarkers then - DrawMarker(2, currentGarage.takeVehicle.x, currentGarage.takeVehicle.y, currentGarage.takeVehicle.z, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.2, 0.15, 200, 0, 0, 222, false, false, false, true, false, false, false) - sleep = 0 - end - if InputIn or InputOut then - if IsControlJustReleased(0, 38) then - if InputIn then - local ped = PlayerPedId() - local curVeh = GetVehiclePedIsIn(ped) - local vehClass = GetVehicleClass(curVeh) - --Check vehicle type for garage - if currentGarage.vehicle == "car" or not currentGarage.vehicle then - if vehClass ~= 10 and vehClass ~= 14 and vehClass ~= 15 and vehClass ~= 16 and vehClass ~= 20 then - if currentGarage.type == "job" then - if PlayerJob.name == currentGarage.job or PlayerJob.type == currentGarage.jobType then - enterVehicle(curVeh, currentGarageIndex, currentGarage.type) - end - elseif currentGarage.type == "gang" then - if PlayerGang.name == currentGarage.job or PlayerJob.type == currentGarage.jobType then - enterVehicle(curVeh, currentGarageIndex, currentGarage.type) - end - else - enterVehicle(curVeh, currentGarageIndex, currentGarage.type) - end - else - QBCore.Functions.Notify(Lang:t("error.not_correct_type"), "error", 3500) - end - elseif currentGarage.vehicle == "air" then - if vehClass == 15 or vehClass == 16 then - if currentGarage.type == "job" then - if PlayerJob.name == currentGarage.job or PlayerJob.type == currentGarage.jobType then - enterVehicle(curVeh, currentGarageIndex, currentGarage.type) - end - elseif currentGarage.type == "gang" then - if PlayerGang.name == currentGarage.job or PlayerJob.type == currentGarage.jobType then - enterVehicle(curVeh, currentGarageIndex, currentGarage.type) - end - else - enterVehicle(curVeh, currentGarageIndex, currentGarage.type) - end - else - QBCore.Functions.Notify(Lang:t("error.not_correct_type"), "error", 3500) - end - elseif currentGarage.vehicle == "sea" then - if vehClass == 14 then - if currentGarage.type == "job" then - if PlayerJob.name == currentGarage.job then - enterVehicle(curVeh, currentGarageIndex, currentGarage.type, currentGarage) - end - elseif currentGarage.type == "gang" then - if PlayerGang.name == currentGarage.job then - enterVehicle(curVeh, currentGarageIndex, currentGarage.type, currentGarage) - end - else - enterVehicle(curVeh, currentGarageIndex, currentGarage.type, currentGarage) - end - else - QBCore.Functions.Notify(Lang:t("error.not_correct_type"), "error", 3500) - end - elseif currentGarage.vehicle == "rig" then - if vehClass == 10 or vehClass == 11 or vehClass == 12 or vehClass == 20 then - if currentGarage.type == "job" then - if PlayerJob.name == currentGarage.job then - enterVehicle(curVeh, currentGarageIndex, currentGarage.type, currentGarage) - end - elseif currentGarage.type == "gang" then - if PlayerGang.name == currentGarage.job then - enterVehicle(curVeh, currentGarageIndex, currentGarage.type, currentGarage) - end - else - enterVehicle(curVeh, currentGarageIndex, currentGarage.type, currentGarage) - end - else - QBCore.Functions.Notify(Lang:t("error.not_correct_type"), "error", 3500) - end - end - elseif InputOut then - if currentGarage.type == "job" then - if PlayerJob.name == currentGarage.job then - MenuGarage(currentGarage.type, currentGarage, currentGarageIndex) - end - elseif currentGarage.type == "gang" then - if PlayerGang.name == currentGarage.job then - MenuGarage(currentGarage.type, currentGarage, currentGarageIndex) - end - else - MenuGarage(currentGarage.type, currentGarage, currentGarageIndex) - end - end - end - sleep = 0 - end - end - Wait(sleep) - end -end) diff --git a/config.lua b/config.lua index 9b48368..96cb7ad 100644 --- a/config.lua +++ b/config.lua @@ -1,446 +1,514 @@ -Config = Config or {} -Config.AutoRespawn = false --True == auto respawn cars that are outside into your garage on script restart, false == does not put them into your garage and players have to go to the impound -Config.SharedGarages = false --True == Gang and job garages are shared, false == Gang and Job garages are personal -Config.VisuallyDamageCars = true --True == Visually damage cars that go out of the garage depending of body damage, false == Do not visually damage cars (damage is still applied to car values) -Config.SharedPublicGarages = false --Ture All public garages can access all vehicle of player that parked in garage type "public", -- False player can't access another public garages from anywhere (this is original behavior of script) +Config = {} +Config.AutoRespawn = false -- true == stores cars in garage on restart | false == doesnt modify car states +Config.VisuallyDamageCars = true -- true == damage car on spawn | false == no damage on spawn +Config.SharedGarages = false -- true == take any car from any garage | false == only take car from garage stored in +Config.ClassSystem = true -- true == restrict vehicles by class | false == any vehicle class in any garage +Config.FuelResource = 'LegacyFuel' -- supports any that has a GetFuel() and SetFuel() export + +-- https://docs.fivem.net/natives/?_0x29439776AAA00A62 +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 Parking", - ["takeVehicle"] = vector3(273.43, -343.99, 44.91), - ["spawnPoint"] = vector4(270.94, -342.96, 43.97, 161.5), - ["putVehicle"] = vector3(276.69, -339.85, 44.91), - ["showBlip"] = true, - ["blipName"] = "Public Parking", - ["blipNumber"] = 357, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "car" --car, air, sea, rig - }, - ["casinogarage"] = { - ["label"] = "Casino Parking", - ["takeVehicle"] = vector3(925.3, 51.85, 81.11), - ["spawnPoint"] = vector4(918.77, 51.73, 80.16, 329.43), - ["putVehicle"] = vector3(914.92, 37.85, 80.07), - ["showBlip"] = true, - ["blipName"] = "Public Parking", - ["blipNumber"] = 357, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "car" --car, air, sea, rig - }, - ["sapcounsel"] = { - ["label"] = "San Andreas Parking", - ["takeVehicle"] = vector3(-330.01, -780.33, 33.96), - ["spawnPoint"] = vector4(-334.44, -780.75, 33.96, 137.5), - ["putVehicle"] = vector3(-336.31, -774.93, 33.96), - ["showBlip"] = true, - ["blipName"] = "Public Parking", - ["blipNumber"] = 357, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "car" --car, air, sea, rig - }, - ["spanishave"] = { - ["label"] = "Spanish Ave Parking", - ["takeVehicle"] = vector3(-1160.86, -741.41, 19.63), - ["spawnPoint"] = vector4(-1163.88, -749.32, 18.42, 35.5), - ["putVehicle"] = vector3(-1147.58, -738.11, 19.31), - ["showBlip"] = true, - ["blipName"] = "Public Parking", - ["blipNumber"] = 357, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "car" --car, air, sea, rig - }, - ["caears24"] = { - ["label"] = "Caears 24 Parking", - ["takeVehicle"] = vector3(69.84, 12.6, 68.96), - ["spawnPoint"] = vector4(73.21, 10.72, 68.83, 163.5), - ["putVehicle"] = vector3(65.43, 21.19, 69.47), - ["showBlip"] = true, - ["blipName"] = "Public Parking", - ["blipNumber"] = 357, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "car" --car, air, sea, rig - }, - ["caears242"] = { - ["label"] = "Caears 24 Parking", - ["takeVehicle"] = vector3(-475.31, -818.73, 30.46), - ["spawnPoint"] = vector4(-472.03, -815.47, 30.5, 177.5), - ["putVehicle"] = vector3(-453.6, -817.08, 30.61), - ["showBlip"] = true, - ["blipName"] = "Public Parking", - ["blipNumber"] = 357, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "car" --car, air, sea, rig - }, - ["lagunapi"] = { - ["label"] = "Laguna Parking", - ["takeVehicle"] = vector3(364.37, 297.83, 103.49), - ["spawnPoint"] = vector4(367.49, 297.71, 103.43, 340.5), - ["putVehicle"] = vector3(363.04, 283.51, 103.38), - ["showBlip"] = true, - ["blipName"] = "Public Parking", - ["blipNumber"] = 357, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "car" --car, air, sea, rig - }, - ["airportp"] = { - ["label"] = "Airport Parking", - ["takeVehicle"] = vector3(-796.86, -2024.85, 8.88), - ["spawnPoint"] = vector4(-800.41, -2016.53, 9.32, 48.5), - ["putVehicle"] = vector3(-804.84, -2023.21, 9.16), - ["showBlip"] = true, - ["blipName"] = "Public Parking", - ["blipNumber"] = 357, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "car" --car, air, sea, rig - }, - ["beachp"] = { - ["label"] = "Beach Parking", - ["takeVehicle"] = vector3(-1183.1, -1511.11, 4.36), - ["spawnPoint"] = vector4(-1181.0, -1505.98, 4.37, 214.5), - ["putVehicle"] = vector3(-1176.81, -1498.63, 4.37), - ["showBlip"] = true, - ["blipName"] = "Public Parking", - ["blipNumber"] = 357, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "car" --car, air, sea, rig - }, - ["themotorhotel"] = { - ["label"] = "The Motor Hotel Parking", - ["takeVehicle"] = vector3(1137.77, 2663.54, 37.9), - ["spawnPoint"] = vector4(1137.69, 2673.61, 37.9, 359.5), - ["putVehicle"] = vector3(1137.75, 2652.95, 37.9), - ["showBlip"] = true, - ["blipName"] = "Public Parking", - ["blipNumber"] = 357, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "car" --car, air, sea, rig - }, - ["liqourparking"] = { - ["label"] = "Liqour Parking", - ["takeVehicle"] = vector3(934.95, 3606.59, 32.81), - ["spawnPoint"] = vector4(941.57, 3619.99, 32.5, 141.5), - ["putVehicle"] = vector3(939.37, 3612.25, 32.69), - ["showBlip"] = true, - ["blipName"] = "Public Parking", - ["blipNumber"] = 357, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "car" --car, air, sea, rig - }, - ["shoreparking"] = { - ["label"] = "Shore Parking", - ["takeVehicle"] = vector3(1726.21, 3707.16, 34.17), - ["spawnPoint"] = vector4(1730.31, 3711.07, 34.2, 20.5), - ["putVehicle"] = vector3(1737.13, 3718.91, 34.04), - ["showBlip"] = true, - ["blipName"] = "Public Parking", - ["blipNumber"] = 357, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "car" --car, air, sea, rig - }, - ["haanparking"] = { - ["label"] = "Bell Farms Parking", - ["takeVehicle"] = vector3(78.34, 6418.74, 31.28), - ["spawnPoint"] = vector4(70.71, 6425.16, 30.92, 68.5), - ["putVehicle"] = vector3(85.3, 6427.52, 31.33), - ["showBlip"] = true, - ["blipName"] = "Public Parking", - ["blipNumber"] = 357, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "car" --car, air, sea, rig - }, - ["dumbogarage"] = { - ["label"] = "Dumbo Private Parking", - ["takeVehicle"] = vector3(157.26, -3240.00, 7.00), - ["spawnPoint"] = vector4(165.32, -3236.10, 5.93, 268.5), - ["putVehicle"] = vector3(165.32, -3230.00, 5.93), - ["showBlip"] = true, - ["blipName"] = "Public Parking", - ["blipNumber"] = 357, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "car" --car, air, sea, rig - }, - ["pillboxgarage"] = { - ["label"] = "Pillbox Garage Parking", - ["takeVehicle"] = vector3(215.9499, -809.698, 30.731), - ["spawnPoint"] = vector4(234.1942, -787.066, 30.193, 159.6), - ["putVehicle"] = vector3(218.0894, -781.370, 30.389), - ["showBlip"] = true, - ["blipName"] = "Public Parking", - ["blipNumber"] = 357, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "car" --car, air, sea, rig - }, - --[[ ["hayesdepot"] = { - ["label"] = "Hayes Depot", - ["takeVehicle"] = vector3(491.0, -1314.69, 29.25), - ["spawnPoint"] = vector4(491.0, -1314.69, 29.25, 304.5), - ["showBlip"] = true, - ["blipName"] = "Hayes Depot", - ["blipNumber"] = 68, - ["blipColor"] = 3, - ["type"] = "depot", --public, job, gang, depot - ["vehicle"] = "car" --car, air, sea, rig - }, --]] - ["impoundlot"] = { - ["label"] = "Impound Lot", - ["takeVehicle"] = vector3(409.89, -1623.51, 29.29), - ["spawnPoint"] = vector4(407.92, -1646.29, 29.29, 226.39), - ["showBlip"] = true, - ["blipName"] = "Impound Lot", - ["blipNumber"] = 68, - ["blipColor"] = 3, - ["type"] = "depot", --public, job, gang, depot - ["vehicle"] = "car" --car, air, sea, rig - }, - ["ballas"] = { - ["label"] = "Ballas", - ["takeVehicle"] = vector3(98.50, -1954.49, 20.84), - ["spawnPoint"] = vector4(98.50, -1954.49, 20.75, 335.73), - ["putVehicle"] = vector3(94.75, -1959.93, 20.84), - ["showBlip"] = false, - ["blipName"] = "Ballas", - ["blipNumber"] = 357, - ["blipColor"] = 3, - ["type"] = "gang", --public, job, gang, depot - ["vehicle"] = "car", --car, air, sea, rig - ["job"] = "ballas", - ["jobType"] = "ballas" - }, - ["families"] = { - ["label"] = "La Familia", - ["takeVehicle"] = vector3(-811.65, 187.49, 72.48), - ["spawnPoint"] = vector4(-818.43, 184.97, 72.28, 107.85), - ["putVehicle"] = vector3(-811.65, 187.49, 72.48), - ["showBlip"] = false, - ["blipName"] = "La Familia", - ["blipNumber"] = 357, - ["blipColor"] = 3, - ["type"] = "gang", --public, job, gang, depot - ["vehicle"] = "car", --car, air, sea, rig - ["job"] = "families", - ["jobType"] = "families" - }, - ["lostmc"] = { - ["label"] = "Lost MC", - ["takeVehicle"] = vector3(957.25, -129.63, 74.39), - ["spawnPoint"] = vector4(957.25, -129.63, 74.39, 199.21), - ["putVehicle"] = vector3(950.47, -122.05, 74.36), - ["showBlip"] = false, - ["blipName"] = "Lost MC", - ["blipNumber"] = 357, - ["blipColor"] = 3, - ["type"] = "gang", --public, job, gang, depot - ["vehicle"] = "car", --car, air, sea, rig - ["job"] = "lostmc", - ["jobType"] = "lostmc" - }, - ["cartel"] = { - ["label"] = "Cartel", - ["takeVehicle"] = vector3(1407.18, 1118.04, 114.84), - ["spawnPoint"] = vector4(1407.18, 1118.04, 114.84, 88.34), - ["putVehicle"] = vector3(1407.18, 1118.04, 114.84), - ["showBlip"] = false, - ["blipName"] = "Cartel", - ["blipNumber"] = 357, - ["blipColor"] = 3, - ["type"] = "gang", --public, job, gang, depot - ["vehicle"] = "car", --car, air, sea, rig - ["job"] = "cartel", - ["jobType"] = "cartel" - }, - ["police"] = { - ["label"] = "Police", - ["takeVehicle"] = vector3(454.6, -1017.4, 28.4), - ["spawnPoint"] = vector4(438.4, -1018.3, 27.7, 90.0), - ["putVehicle"] = vector3(452.88, -1006.98, 27.5), - ["showBlip"] = false, - ["blipName"] = "Police", - ["blipNumber"] = 357, - ["blipColor"] = 3, - ["type"] = "job", --public, job, gang, depot - ["vehicle"] = "car", --car, air, sea, rig - ["job"] = "police", - ["jobType"] = "leo" - }, - ["intairport"] = { - ["label"] = "Airport Hangar", - ["takeVehicle"] = vector3(-1025.92, -3017.86, 13.95), - ["spawnPoint"] = vector4(-979.2, -2995.51, 13.95, 52.19), - ["putVehicle"] = vector3(-1003.38, -3008.87, 13.95), - ["showBlip"] = true, - ["blipName"] = "Hangar", - ["blipNumber"] = 360, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "air" --car, air, sea, rig - }, - ["higginsheli"] = { - ["label"] = "Higgins Helitours", - ["takeVehicle"] = vector3(-722.15, -1472.79, 5.0), - ["spawnPoint"] = vector4(-724.83, -1443.89, 5.0, 140.1), - ["putVehicle"] = vector3(-745.48, -1468.46, 5.0), - ["showBlip"] = true, - ["blipName"] = "Hangar", - ["blipNumber"] = 360, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "air" --car, air, sea, rig - }, - ["airsshores"] = { - ["label"] = "Sandy Shores Hangar", - ["takeVehicle"] = vector3(1758.19, 3296.66, 41.14), - ["spawnPoint"] = vector4(1740.98, 3279.08, 41.75, 106.77), - ["putVehicle"] = vector3(1740.4, 3283.92, 41.1), - ["showBlip"] = true, - ["blipName"] = "Hangar", - ["blipNumber"] = 360, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "air" --car, air, sea, rig - }, - ["airdepot"] = { - ["label"] = "Air Depot", - ["takeVehicle"] = vector3(-1243.29, -3392.3, 13.94), - ["spawnPoint"] = vector4(-1269.67, -3377.74, 13.94, 327.88), - ["showBlip"] = true, - ["blipName"] = "Air Depot", - ["blipNumber"] = 359, - ["blipColor"] = 3, - ["type"] = "depot", --public, job, gang, depot - ["vehicle"] = "air" --car, air, sea, rig - }, - ["lsymc"] = { - ["label"] = "LSYMC Boathouse", - ["takeVehicle"] = vector3(-794.66, -1510.83, 1.59), - ["spawnPoint"] = vector4(-793.58, -1501.4, 0.12, 111.5), - ["putVehicle"] = vector3(-793.58, -1501.4, 0.12), - ["showBlip"] = true, - ["blipName"] = "Boathouse", - ["blipNumber"] = 356, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "sea" --car, air, sea, rig - }, - ["paleto"] = { - ["label"] = "Paleto Boathouse", - ["takeVehicle"] = vector3(-277.46, 6637.2, 7.48), - ["spawnPoint"] = vector4(-289.2, 6637.96, 1.01, 45.5), - ["putVehicle"] = vector3(-289.2, 6637.96, 1.01), - ["showBlip"] = true, - ["blipName"] = "Boathouse", - ["blipNumber"] = 356, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "sea" --car, air, sea, rig - }, - ["millars"] = { - ["label"] = "Millars Boathouse", - ["takeVehicle"] = vector3(1299.24, 4216.69, 33.9), - ["spawnPoint"] = vector4(1297.82, 4209.61, 30.12, 253.5), - ["putVehicle"] = vector3(1297.82, 4209.61, 30.12), - ["showBlip"] = true, - ["blipName"] = "Boathouse", - ["blipNumber"] = 356, - ["blipColor"] = 3, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "sea" --car, air, sea, rig - }, - ["seadepot"] = { - ["label"] = "LSYMC Depot", - ["takeVehicle"] = vector3(-772.98, -1430.76, 1.59), - ["spawnPoint"] = vector4(-729.77, -1355.49, 1.19, 142.5), - ["showBlip"] = true, - ["blipName"] = "LSYMC Depot", - ["blipNumber"] = 356, - ["blipColor"] = 3, - ["type"] = "depot", --public, job, gang, depot - ["vehicle"] = "sea" --car, air, sea, rig - }, - ["rigdepot"] = { - ["label"] = "Big Rig Depot", - ["takeVehicle"] = vector3(2373.64, 3104.58, 48.05), - ["spawnPoint"] = vector4(2373.63, 3110.19, 48.12, 123.26), - ["showBlip"] = true, - ["blipName"] = "Big Rig Depot", - ["blipNumber"] = 68, - ["blipColor"] = 2, - ["type"] = "depot", --public, job, gang, depot - ["vehicle"] = "rig" --car, air, sea, rig - }, - ["dumborigparking"] = { - ["label"] = "Dumbo Big Rig Parking", - ["takeVehicle"] = vector3(161.23, -3188.73, 5.97), - ["spawnPoint"] = vector4(172.59, -3178.28, 5.79, 269.66), - ["putVehicle"] =vector3(172.64, -3182.48, 5.79), - ["showBlip"] = true, - ["blipName"] = "Big Rig Parking", - ["blipNumber"] = 357, - ["blipColor"] = 2, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "rig" --car, air, sea, rig - }, - ["popsrigparking"] = { - ["label"] = "Pop's Big Rig Parking", - ["takeVehicle"] = vector3(121.05, 6587.59, 32.09), - ["spawnPoint"] = vector4(131.08, 6589.77, 31.99, 272.9), - ["putVehicle"] = vector3(126.08, 6595.23, 31.95), - ["showBlip"] = true, - ["blipName"] = "Big Rig Parking", - ["blipNumber"] = 357, - ["blipColor"] = 2, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "rig" --car, air, sea, rig - }, - ["ronsrigparking"] = { - ["label"] = "Ron's Big Rig Parking", - ["takeVehicle"] = vector3(-2523.99, 2319.13, 33.22), - ["spawnPoint"] = vector4(-2531.0, 2335.86, 33.13, 210.88), - ["putVehicle"] = vector3(-2526.56, 2335.61, 33.06), - ["showBlip"] = true, - ["blipName"] = "Big Rig Parking", - ["blipNumber"] = 357, - ["blipColor"] = 2, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "rig" --car, air, sea, rig - }, - ["ronsrigparking2"] = { - ["label"] = "Ron's Big Rig Parking", - ["takeVehicle"] = vector3(2567.7, 463.03, 108.6), - ["spawnPoint"] = vector4(2555.24, 446.92, 108.52, 314.79), - ["putVehicle"] = vector3(2558.69, 425.04, 108.52), - ["showBlip"] = true, - ["blipName"] = "Big Rig Parking", - ["blipNumber"] = 357, - ["blipColor"] = 2, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "rig" --car, air, sea, rig - }, - ["ronsrigparking3"] = { - ["label"] = "Ron's Big Rig Parking", - ["takeVehicle"] = vector3(-23.63, -2551.7, 6.14), - ["spawnPoint"] = vector4(-32.81, -2536.0, 6.07, 53.26), - ["putVehicle"] = vector3(-36.32, -2541.84, 6.07), - ["showBlip"] = true, - ["blipName"] = "Big Rig Parking", - ["blipNumber"] = 357, - ["blipColor"] = 2, - ["type"] = "public", --public, job, gang, depot - ["vehicle"] = "rig" --car, air, sea, rig + motelgarage = { + label = 'Motel Parking', + takeVehicle = vector3(274.29, -334.15, 44.92), + spawnPoint = { + vector4(265.96, -332.3, 44.51, 250.68) + }, + showBlip = true, + blipName = 'Public Parking', + blipNumber = 357, + blipColor = 3, + type = 'public', -- public, gang, job, depot + category = Config.VehicleClass['car'] + }, + casinogarage = { + label = 'Casino Parking', + takeVehicle = vector3(883.96, -4.71, 78.76), + spawnPoint = { + vector4(895.39, -4.75, 78.35, 146.85) + }, + showBlip = true, + blipName = 'Public Parking', + blipNumber = 357, + blipColor = 3, + type = 'public', + category = Config.VehicleClass['car'] + }, + sapcounsel = { + label = 'San Andreas Parking', + takeVehicle = vector3(-330.01, -780.33, 33.96), + spawnPoint = { + vector4(-341.57, -767.45, 33.56, 92.61) + }, + showBlip = true, + blipName = 'Public Parking', + blipNumber = 357, + blipColor = 3, + type = 'public', + category = Config.VehicleClass['car'] + }, + spanishave = { + label = 'Spanish Ave Parking', + takeVehicle = vector3(-1160.86, -741.41, 19.63), + spawnPoint = { + vector4(-1145.2, -745.42, 19.26, 108.22) + }, + showBlip = true, + blipName = 'Public Parking', + blipNumber = 357, + blipColor = 3, + type = 'public', + category = Config.VehicleClass['car'] + }, + caears24 = { + label = 'Caears 24 Parking', + takeVehicle = vector3(69.84, 12.6, 68.96), + spawnPoint = { + vector4(60.8, 17.54, 68.82, 339.7) + }, + showBlip = true, + blipName = 'Public Parking', + blipNumber = 357, + blipColor = 3, + type = 'public', + category = Config.VehicleClass['car'] + }, + caears242 = { + label = 'Caears 24 Parking', + takeVehicle = vector3(-453.7, -786.78, 30.56), + spawnPoint = { + vector4(-472.39, -787.71, 30.14, 180.52) + }, + showBlip = true, + blipName = 'Public Parking', + blipNumber = 357, + blipColor = 3, + type = 'public', + category = Config.VehicleClass['car'] + }, + lagunapi = { + label = 'Laguna Parking', + takeVehicle = vector3(364.37, 297.83, 103.49), + spawnPoint = { + vector4(375.09, 294.66, 102.86, 164.04) + }, + showBlip = true, + blipName = 'Public Parking', + blipNumber = 357, + blipColor = 3, + type = 'public', + category = Config.VehicleClass['car'] + }, + airportp = { + label = 'Airport Parking', + takeVehicle = vector3(-773.12, -2033.04, 8.88), + spawnPoint = { + vector4(-779.77, -2040.18, 8.47, 315.34) + }, + showBlip = true, + blipName = 'Public Parking', + blipNumber = 357, + blipColor = 3, + type = 'public', + category = Config.VehicleClass['car'] + }, + beachp = { + label = 'Beach Parking', + takeVehicle = vector3(-1185.32, -1500.64, 4.38), + spawnPoint = { + vector4(-1188.14, -1487.95, 3.97, 124.06) + }, + showBlip = true, + blipName = 'Public Parking', + blipNumber = 357, + blipColor = 3, + type = 'public', + category = Config.VehicleClass['car'] + }, + themotorhotel = { + label = 'The Motor Hotel Parking', + takeVehicle = vector3(1137.77, 2663.54, 37.9), + spawnPoint = { + vector4(1127.7, 2647.84, 37.58, 1.41) + }, + showBlip = true, + blipName = 'Public Parking', + blipNumber = 357, + blipColor = 3, + type = 'public', + category = Config.VehicleClass['car'] + }, + liqourparking = { + label = 'Liqour Parking', + takeVehicle = vector3(883.99, 3649.67, 32.87), + spawnPoint = { + vector4(898.38, 3649.41, 32.36, 90.75) + }, + showBlip = true, + blipName = 'Public Parking', + blipNumber = 357, + blipColor = 3, + type = 'public', + category = Config.VehicleClass['car'] + }, + shoreparking = { + label = 'Shore Parking', + takeVehicle = vector3(1737.03, 3718.88, 34.05), + spawnPoint = { + vector4(1725.4, 3716.78, 34.15, 20.54) + }, + showBlip = true, + blipName = 'Public Parking', + blipNumber = 357, + blipColor = 3, + type = 'public', + category = Config.VehicleClass['car'] + }, + haanparking = { + label = 'Bell Farms Parking', + takeVehicle = vector3(76.88, 6397.3, 31.23), + spawnPoint = { + vector4(62.15, 6403.41, 30.81, 211.38) + }, + showBlip = true, + blipName = 'Public Parking', + blipNumber = 357, + blipColor = 3, + type = 'public', + category = Config.VehicleClass['car'] + }, + dumbogarage = { + label = 'Dumbo Private Parking', + takeVehicle = vector3(165.75, -3227.2, 5.89), + spawnPoint = { + vector4(168.34, -3236.1, 5.43, 272.05) + }, + showBlip = true, + blipName = 'Public Parking', + blipNumber = 357, + blipColor = 3, + type = 'public', + category = Config.VehicleClass['car'] + }, + pillboxgarage = { + label = 'Pillbox Garage Parking', + takeVehicle = vector3(213.2, -796.05, 30.86), + spawnPoint = { + vector4(222.02, -804.19, 30.26, 248.19), + vector4(223.93, -799.11, 30.25, 248.53), + vector4(226.46, -794.33, 30.24, 248.29), + vector4(232.33, -807.97, 30.02, 69.17), + vector4(234.42, -802.76, 30.04, 67.2) + }, + showBlip = true, + blipName = 'Public Parking', + blipNumber = 357, + blipColor = 3, + type = 'public', + category = Config.VehicleClass['car'] + }, + grapeseedgarage = { + label = 'Grapeseed Parking', + takeVehicle = vector3(2552.68, 4671.8, 33.95), + spawnPoint = { + vector4(2550.17, 4681.96, 33.81, 17.05) + }, + showBlip = true, + blipName = 'Public Parking', + blipNumber = 357, + blipColor = 3, + type = 'public', + 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', + 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', + 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', + 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', + 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', + 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', + 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', + 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', + 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', + 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', + 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', + 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 = 'Boathouse', + blipNumber = 356, + blipColor = 3, + type = 'public', + 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 = 'Boathouse', + blipNumber = 356, + blipColor = 3, + type = 'public', + 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 = 'Boathouse', + blipNumber = 356, + blipColor = 3, + type = 'public', + 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', + 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', + 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', + 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', + 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', + 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', + 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', + category = Config.VehicleClass['rig'] }, } -Config.HouseGarages = {} diff --git a/database.sql b/database.sql deleted file mode 100644 index e00946c..0000000 --- a/database.sql +++ /dev/null @@ -1,29 +0,0 @@ -CREATE TABLE IF NOT EXISTS `player_vehicles` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `license` varchar(50) DEFAULT NULL, - `citizenid` varchar(50) DEFAULT NULL, - `vehicle` varchar(50) DEFAULT NULL, - `hash` varchar(50) DEFAULT NULL, - `mods` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, - `plate` varchar(15) NOT NULL, - `fakeplate` varchar(50) DEFAULT NULL, - `garage` varchar(50) DEFAULT 'pillboxgarage', - `fuel` int(11) DEFAULT 100, - `engine` float DEFAULT 1000, - `body` float DEFAULT 1000, - `state` int(11) DEFAULT 1, - `depotprice` int(11) NOT NULL DEFAULT 0, - `drivingdistance` int(50) DEFAULT NULL, - `status` text DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `plate` (`plate`), - KEY `citizenid` (`citizenid`), - KEY `license` (`license`) -) ENGINE=InnoDB AUTO_INCREMENT=1; - -ALTER TABLE `player_vehicles` -ADD UNIQUE INDEX UK_playervehicles_plate (plate); - -ALTER TABLE `player_vehicles` -ADD CONSTRAINT FK_playervehicles_players FOREIGN KEY (citizenid) -REFERENCES `players` (citizenid) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/fxmanifest.lua b/fxmanifest.lua index 8fba40b..8dd7523 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -1,8 +1,8 @@ fx_version 'cerulean' game 'gta5' - +lua54 'yes' description 'QB-Garages' -version '1.2.1' +version '2.0.0' shared_scripts { 'config.lua', @@ -13,7 +13,7 @@ shared_scripts { client_scripts { '@PolyZone/client.lua', - '@PolyZone/BoxZone.lua', + '@PolyZone/CircleZone.lua', '@PolyZone/ComboZone.lua', 'client/main.lua', } @@ -23,4 +23,11 @@ server_scripts { 'server/main.lua' } -lua54 'yes' +ui_page 'html/index.html' + +files { + 'html/index.html', + 'html/script.js', + 'html/style.css', + 'html/logo.png', +} diff --git a/html/index.html b/html/index.html new file mode 100644 index 0000000..00e8b93 --- /dev/null +++ b/html/index.html @@ -0,0 +1,19 @@ + + + + + Garage UI + + + + +
+
+
Legion Square
+ +
+
+
+ + + diff --git a/html/logo.png b/html/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..350c14c8b25ec6174f2e9c5d78fcad6ef77d97cf GIT binary patch literal 2613 zcmZ`*dpOgLAN_8#O|F^SkXs~|WFySn@0-`=5+%95F2yU>OfI7~E9O3VyD67gBt?`Y z#ZYW2^}0rArC%;Fyp&7KPk;XY_&uNJbI$Xe^PE4=^PDVCqN}8svKRmWl6ahx_b!L* zzJ@4l7Z*5bKD#7x%AQ~k01XA=TcOb3W*E+!001dE06@D40GqoKZ3X}mPyjF&0sz?S z0H8>^^~}p^*MR-`hpQ8?^ZUwQR2S_ka0;H_44)R0LjdrB>#f9H2^2>r`heb5Bo+g} zoWDd0W$&rgXg#Ic*(fqfwi$4nDV}CZc zPqwz=dnxs}rNN zSs)*FD3vJl?P8D(Y9GTwa^0XG3W|XqhU9-wR6I-3&UoONtLBW(o>`nVRTzbyK?RKx zFY?9s6CC3ZkSAmnQV)1Qc7PNyOo%wif+R)Kdx%3fa)MqZDPW=v!e+gs4teD^Lz?Vd z(4}6v0_LUTV8y$_6`FpzVv^Fj%92reJ#$`+AE-|Sd7c>!F=>&E^p;-=3ekH{qhwff zVw?U^XzF6d^dO##tSdis=!ogPx3p;aP>*?zQ_C^qBTS14kbB$-PMA|7Va2yVS}Q(- zz~IEoAg3YCnlc!R^!nful44_F#f()KYzS?Zq_AFEXUV?Pn<#_QOJBq+DPEb7n{*!! zNOoD@aO5!Tv{>0*hxa`9EnBd$^nJ9zH1`ArOxwM%Ia&+5uS-L_qBrT&h6e*gw!nUB zkM^?OOQDUkmu2`M?UdJH>%FX!7BEJ1zVZA{`53=*zZvFaggWRPxJ=}Hc1&j@vP}*_ zcuh~k9m&J+Q~A@J6AA<9a&cZ-6aES|v$d}13^}dT`wn^A z$`2hE4ZWv~n4B4AhhI8oyOtA^Q-3modR6GFPd#|K-$BKS8G|ay2bV-M+@^%#A!wG% zx$`Bj5}hL8U*o!KxH=c4P80TTBtsf29irjqGcG0`L}b6F{oqQ0@18v?Ad_NeB(37I zi!^T70*RnChzi}2dofj$1bO)0?`1RV`Ii2Yq;^ULYD~UT#;>}p%zM%Z^hlyjfqxLk zRri7$9^dXF9D}E-B!RMCN^)+%TyBo>y@s?NcTBT%*G(R(u475X9U~H3NW4c6Z5H?V zK9o3eDiYER8Ns}r?f#4YOTy>{EcMux<|s7c+w>*#4AEl$=k9@HhGl{O(eCQ_!cvY3 z6X{MhoulSbRal*yuH>d_NA!7hI$9j>2&dK3Gr3KJRN6a@rrs*jwM^nqx@j~&lXs^? zp{b)t1{u#{M*C(8nE_4$pzdhThsQo6sxE#Cev9DaO5JO8_3Pci11n!d9dwqO*I<(i zT_Re6PD*{2)fnDrpitumN4#jm8r=<_6>ZD<2ddeUXu5G}rxZC=nPXc{^ov4X5PjNp zq-`iV7Sxt=1gx>J;Kq0BTE8vnlH2~gmG=@;{_jzae8w`oFmJqu*jR7PG2#uiit+WU zEhauV98MItcFxltq{crhth%lCjB)#3#>=lg9vzT5VJK@(L%+NXf zor8Zr$(4#L&b@ifu9%V16?LZW@P774A<4>qX}s>OPYZsS5QUjkOrlC}FtplRIJr*Q znqcg9$CDU-(;BR+5b1VeLPm4waZKlspP3Cl*OeQ8PVSzXeUT=;~1HT-Z(VAK$IHb@N9J{c>bf+u~6F& zw_>#c{}(ZVO*aFW(j^^xYdCj$@q2+Q#Pl0kgG!lO9r604);`1f3X2J(=^5ey^QUyV z1t~U{G0%lj4t9sw)mcjpxI!)~7gw$xFUFs*9?HU4S-X8qfMoLC+IDfR`W>Sd9ru-M zWl_{uRwGrtx8tBzR7JhHIg!3CeRE#9`g?)&dd*AidWmX@@-h6dj}GFm!l)#T&eIx~ zE;KBssgN_|CTs1n$PDqQKSM&{C$hBv)dWl%fpJf`>`q4XY(f^#=dN7Q?wix@gSm>8 z;v+bwxE)nuuFaC@(n&V#62-LN;3M)sxZtz{{TFQ0zy4swf@43wtYqRjc^pLv$SSzK zlJq%O%Om-1{@gMC(QMn00C|o+`>BVqKpMN-MC~Oi_6I zwDu>vZQiGKQv7jd=2;W@nMToM5R_ajJz>+)XngCcUA{>j656fCm&I*@Mi z`-3%1wY-vL$RLhac_(WT_@kcI(=L5E_wsnDUFW#*}hbu-PHbLwNJ zd5m+lQXbbdECC^HaFp>A@{5JujATFjapKJhzO#1tibAwsv%H1Di2`<6ka!q?S4q^c zu!_!6^${lEHXG0|`6(j5k}H5F?a8V#+W!h2wj99{2n@J=<{l1&gMY6U4`=5uaC!2A7fsMPBe3?myrC)1IjC9vJx{o3hc;yq#@k z(N1MPHWV$B@&T#z>O)kRA4U0JL^XX}{DyV!NT{`?k_GHW-OmpNPJ>Ix;G4r*MH>NR zqwt{N1obB)3v!^GN@^jhH{Omu65nuSII-3XS^3$(d8BAr(25k?71~9JW+!k&^73_r zSIOB?zbA#xK2r8=HB#Gm6mjd8~|)iE9`zR~xwCwE8G0gAI9 zB|MZ8fej-^>=Iy%GBz response.json()) + .then((data) => { + if (data === "ok") { + return; + } else { + console.error("Failed to close Garage UI"); + } + }); +} + +function displayUI() { + const container = document.querySelector(".container"); + container.style.display = "block"; +} + +function populateVehicleList(garageLabel, vehicles) { + const vehicleContainerElem = document.querySelector(".vehicle-table"); + const fragment = document.createDocumentFragment(); + + while (vehicleContainerElem.firstChild) { + vehicleContainerElem.removeChild(vehicleContainerElem.firstChild); + } + + const garageHeader = document.getElementById("garage-header"); + garageHeader.textContent = garageLabel; + + vehicles.forEach((v) => { + const vehicleItem = document.createElement("div"); + vehicleItem.classList.add("vehicle-item"); + + // Vehicle Info: Name, Plate & Mileage + const vehicleInfo = document.createElement("div"); + vehicleInfo.classList.add("vehicle-info"); + + const vehicleName = document.createElement("span"); + vehicleName.classList.add("vehicle-name"); + vehicleName.textContent = v.vehicleLabel; + vehicleInfo.appendChild(vehicleName); + + const plate = document.createElement("span"); + plate.classList.add("plate"); + plate.textContent = v.plate; + vehicleInfo.appendChild(plate); + + const mileage = document.createElement("span"); + mileage.classList.add("mileage"); + mileage.textContent = `${v.distance}mi`; + vehicleInfo.appendChild(mileage); + + vehicleItem.appendChild(vehicleInfo); + + // Finance Info + const financeDriveContainer = document.createElement("div"); + financeDriveContainer.classList.add("finance-drive-container"); + const financeInfo = document.createElement("div"); + financeInfo.classList.add("finance-info"); + + if (v.balance && v.balance > 0) { + financeInfo.textContent = "Balance: $" + v.balance.toFixed(0); + } else { + financeInfo.textContent = "Paid Off"; + } + + financeDriveContainer.appendChild(financeInfo); + + // Drive Button + let status; + let isDepotPrice = false; + + if (v.state === 0) { + if (v.depotPrice && v.depotPrice > 0) { + isDepotPrice = true; + + if (v.type === "public") { + status = "Depot"; + } else if (v.type === "depot") { + status = "$" + v.depotPrice.toFixed(0); + } else { + status = "Out"; + } + } else { + status = "Out"; + } + } else if (v.state === 1) { + if (v.depotPrice && v.depotPrice > 0) { + isDepotPrice = true; + + if (v.type === "depot") { + status = "$" + v.depotPrice.toFixed(0); + } else if (v.type === "public") { + status = "Depot"; + } else { + status = "Drive"; + } + } else { + status = "Drive"; + } + } else if (v.state === 2) { + status = "Impound"; + } + + const driveButton = document.createElement("button"); + driveButton.classList.add("drive-btn"); + driveButton.textContent = status; + + if (status === "Depot" || status === "Impound") { + driveButton.style.backgroundColor = "#222"; + driveButton.disabled = true; + } + + if (status === "Out") { + driveButton.style.backgroundColor = "#222"; + } + + driveButton.onclick = function () { + if (driveButton.disabled) return; + + const vehicleStats = { + fuel: v.fuel, + engine: v.engine, + body: v.body, + }; + + const vehicleData = { + vehicle: v.vehicle, + garage: v.garage, + index: v.index, + plate: v.plate, + type: v.type, + depotPrice: v.depotPrice, + stats: vehicleStats, + }; + + if (status === "Out") { + fetch("https://qb-garages/trackVehicle", { + method: "POST", + headers: { + "Content-Type": "application/json; charset=UTF-8", + }, + body: JSON.stringify(v.plate), + }) + .then((response) => response.json()) + .then((data) => { + if (data === "ok") { + closeGarageMenu(); + } else { + return; + } + }); + } else if (isDepotPrice) { + fetch("https://qb-garages/takeOutDepo", { + method: "POST", + headers: { + "Content-Type": "application/json; charset=UTF-8", + }, + body: JSON.stringify(vehicleData), + }) + .then((response) => response.json()) + .then((data) => { + if (data === "ok") { + closeGarageMenu(); + } else { + console.error("Failed to pay depot price."); + } + }); + } else { + fetch("https://qb-garages/takeOutVehicle", { + method: "POST", + headers: { + "Content-Type": "application/json; charset=UTF-8", + }, + body: JSON.stringify(vehicleData), + }) + .then((response) => response.json()) + .then((data) => { + if (data === "ok") { + closeGarageMenu(); + } else { + console.error("Failed to close Garage UI."); + } + }); + } + }; + + financeDriveContainer.appendChild(driveButton); + vehicleItem.appendChild(financeDriveContainer); + + // Progress Bars: Fuel, Engine, Body + const stats = document.createElement("div"); + stats.classList.add("stats"); + + const maxValues = { + fuel: 100, + engine: 1000, + body: 1000, + }; + + ["fuel", "engine", "body"].forEach((statLabel) => { + const stat = document.createElement("div"); + stat.classList.add("stat"); + const label = document.createElement("div"); + label.classList.add("label"); + label.textContent = statLabel.charAt(0).toUpperCase() + statLabel.slice(1); + stat.appendChild(label); + const progressBar = document.createElement("div"); + progressBar.classList.add("progress-bar"); + const progress = document.createElement("span"); + const progressText = document.createElement("span"); + progressText.classList.add("progress-text"); + const percentage = (v[statLabel] / maxValues[statLabel]) * 100; + progress.style.width = percentage + "%"; + progressText.textContent = Math.round(percentage) + "%"; + + if (percentage >= 75) { + progress.classList.add("bar-green"); + } else if (percentage >= 50) { + progress.classList.add("bar-yellow"); + } else { + progress.classList.add("bar-red"); + } + + progressBar.appendChild(progressText); + progressBar.appendChild(progress); + stat.appendChild(progressBar); + stats.appendChild(stat); + vehicleItem.appendChild(stats); + }); + + fragment.appendChild(vehicleItem); + }); + + vehicleContainerElem.appendChild(fragment); +} diff --git a/html/style.css b/html/style.css new file mode 100644 index 0000000..d3c9d37 --- /dev/null +++ b/html/style.css @@ -0,0 +1,186 @@ +@import url("https://fonts.googleapis.com/css2?family=Roboto:wght@100;300;400;500;700;900&display=swap"); + +div { + font-family: "Roboto", sans-serif; +} + +::-webkit-scrollbar { + width: 5px; +} + +::-webkit-scrollbar-thumb { + border-radius: 50px; + background: #dc143c; +} + +.container { + margin: 0 auto; + padding: 20px; + background-color: #1e1e1e; + border-radius: 10px; + display: none; + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + max-height: 75vh; + width: 40vw; + overflow: hidden; +} + +.header { + display: flex; + justify-content: space-between; + align-items: center; +} + +.garage-header { + font-size: 18px; + margin-bottom: 20px; + text-align: left; + color: #fafafa; +} + +.garage-logo { + margin-left: auto; + margin-bottom: 20px; +} + +.vehicle-table { + max-height: 60vh; + overflow-y: auto; + width: 100%; + border-radius: 5px; +} + +.vehicle-item { + background-color: #2a2a2a; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + margin-bottom: 10px; + padding: 10px; + border-radius: 5px; +} + +.vehicle-info { + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + color: #fafafa; +} + +.plate, +.mileage, +.vehicle-name { + margin: 0; + flex: 1; +} + +.vehicle-name { + text-align: left; +} + +.plate { + text-align: center; +} + +.mileage { + text-align: right; +} + +.stats { + display: flex; + justify-content: space-between; + width: 100%; + margin: 10px auto; +} + +.stat { + flex: 0 0 calc(33.333% - 10px); + text-align: center; + display: flex; + flex-direction: column; + margin: 0 5px; +} + +.label { + color: #ffffff; + margin-bottom: 5px; +} + +.progress-bar { + width: 100%; + background-color: #3c3c3c; + border-radius: 5px; + height: 20px; + overflow: hidden; + position: relative; +} + +.progress-text { + font-size: 14px; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: #ffffff; +} + +.progress-bar span { + display: block; + height: 100%; +} + +.progress-bar span.bar-green { + background-color: #4caf50; +} + +.progress-bar span.bar-yellow { + background-color: #ffc107; +} + +.progress-bar span.bar-red { + background-color: #e53935; +} + +.finance-drive-container { + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; +} + +.finance-info { + color: #ffffff; + font-size: 13.3px; + background-color: #388e3c; + margin-top: 10px; + text-align: center; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + border: none; + border-radius: 5px; + padding: 4px 8px; +} + +.drive-btn { + font-family: "Roboto", sans-serif; + color: #ffffff; + background-color: #388e3c; + margin-top: 10px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + border: none; + border-radius: 5px; + padding: 4px 8px; + cursor: pointer; +} + +.drive-btn:hover { + background-color: #4caf50; +} + +.drive-btn:disabled { + background-color: #222; + cursor: not-allowed; +} diff --git a/locales/ar.lua b/locales/ar.lua index cefd174..ee4ce5a 100644 --- a/locales/ar.lua +++ b/locales/ar.lua @@ -1,36 +1,32 @@ local Translations = { error = { - not_enough = "مال غير كاف", - not_impound = "سيارتك ليست في الحجز", - not_owned = "مركبة غير مملوكة", - no_vehicles = "ليس لديك أي مركبات في هذا المرآب", - no_vehicles_impounded = "ليس لديك أي مركبات محجوزة", - vehicle_at_depot = "قد تكون سيارتك في المستودع", - impounded_by_police = "وقد احتجزت الشرطة هذه السيارة", - someone_inside = "المركبة غير مخزنة ، يرجى التحقق مما إذا كان شخص ما داخل السيارة.", + no_vehicles = 'لا يوجد مركبات في هذا المكان!', + not_depot = 'مركبتك ليست في المستودع', + not_owned = 'لا يمكن تخزين هذه المركبة', + not_correct_type = 'لا يمكنك تخزين هذا النوع من المركبات هنا', + not_enough = 'لا يوجد مال كافي', + no_garage = 'لا شيء', + vehicle_occupied = 'لا يمكنك تخزين هذه المركبة لأنها ليست فارغة', + vehicle_not_tracked = 'تعذر تعقب المركبة', + no_spawn = 'المنطقة مزدحمة جدًا' }, success = { - vehicle_parked = "تم تخزين السيارة", + vehicle_parked = 'تم تخزين المركبة', + vehicle_tracked = 'تم تعقب المركبة', }, - info = { -- you need font arabic -- - public_garage = "غراج عام", - gang_garage = "غراج العصابة", - job_garage = "غراج العمل", - house_garage = "غراج المنزل", - impound = "الحجز", - my_vehicles = "سيارتي", - view_stored = "عرض المركبات المخزنة الخاصة بك", - leave_garage = "⬅ خروج", - leave_depot = "⬅ خروج", - garage = "%{value} الغراج:", - depot = "%{value} الحجز:", - out = "خارج", - garaged = "الغراج", - impounded = "حجزتها الشرطة", - garage_line = "%{value}
البنزين: %{value2} | المحرك: %{value3} | الجسم: %{value4}", - depot_line = "%{value}
البنزين: %{value2} | المحرك: %{value3} | الجسم: %{value4}", - garage_e = "[E] ﺝﺍﺮﻏ", - park_e = "[E] ﺓﺭﺎﻴﺴﻟﺍ ﻦﻳﺰﺨﺗ", + status = { + out = 'خارج', + garaged = 'تم التخزين', + impound = 'مصادرة من قبل الشرطة', + house = 'منزل', + }, + info = { + car_e = 'E - المرآب', + sea_e = 'E - مرفأ القوارب', + air_e = 'E - الجناح', + rig_e = 'E - موقف الحفر', + depot_e = 'E - المستودع', + house_garage = 'E - مرآب المنزل', } } @@ -40,4 +36,4 @@ if GetConvar('qb_locale', 'en') == 'ar' then warnOnMissing = true, fallbackLang = Lang, }) -end +end \ No newline at end of file diff --git a/locales/da.lua b/locales/da.lua index 97a9041..c59c1d5 100644 --- a/locales/da.lua +++ b/locales/da.lua @@ -1,56 +1,32 @@ local Translations = { error = { - no_vehicles = "Du har ingen køretøjer i denne garage!", - not_impound = "Dit køretøj er ikke beslaglagt", - not_owned = "Du ejer ikke dette køretøj", - not_correct_type = "Du kan ikke parkere dette køretøj i denne garage", - not_enough = "Ikke nok penge", - no_garage = "Ingen", + no_vehicles = 'Der er ingen køretøjer på denne placering!', + not_depot = 'Dit køretøj er ikke i depotet', + not_owned = 'Dette køretøj kan ikke opbevares', + not_correct_type = 'Du kan ikke opbevare denne type køretøj her', + not_enough = 'Ikke nok penge', + no_garage = 'Ingen', + vehicle_occupied = 'Du kan ikke opbevare dette køretøj, da det ikke er tomt', + vehicle_not_tracked = 'Kunne ikke spore køretøjet', + no_spawn = 'Området er for overfyldt' }, success = { - vehicle_parked = "Køretøj Parkeret", - }, - menu = { - header = { - house_car = "Bolig Garage %{value}", - public_car = "Offentlig Garage %{value}", - public_sea = "Offentligt Bådhus %{value}", - public_air = "Offentlig Hangar %{value}", - job_car = "Job Garage %{value}", - job_sea = "Job Bådhus %{value}", - job_air = "Job Hangar %{value}", - gang_car = "Gang Garage %{value}", - gang_sea = "Gang Bådhus %{value}", - gang_air = "Gang Hangar %{value}", - depot_car = "Depot %{value}", - depot_sea = "Depot %{value}", - depot_air = "Depot %{value}", - vehicles = "Tilgængelige Køretøjer", - depot = "%{value} [ $%{value2} ]", - garage = "%{value} [ %{value2} ]", - }, - leave = { - car = "⬅ Forlad Garage", - sea = "⬅ Forlad Bådhus", - air = "⬅ Forlad Hangar", - }, - text = { - vehicles = "Se parkeret køretøjer!", - depot = "Plade: %{value}
Tank: %{value2} | Motor: %{value3} | Karosseri: %{value4}", - garage = "Stand: %{value}
Tank: %{value2} | Motor: %{value3} | Karosseri: %{value4}", - } + vehicle_parked = 'Køretøj opbevaret', + vehicle_tracked = 'Køretøj sporet', }, status = { - out = "Ude", - garaged = "Parkeret", - impound = "Beslaglagt af politiet", + out = 'Ude', + garaged = 'I garagen', + impound = 'Beslaglagt af politiet', + house = 'Hus', }, info = { - car_e = "[E] Garage", - sea_e = "[E] Bådhus", - air_e = "[E] Hangar", - park_e = "[E] Parker Køretøj", - house_garage = "Bolig garage", + car_e = 'E - Garage', + sea_e = 'E - Bådhus', + air_e = 'E - Hangar', + rig_e = 'E - Rig Parkeringsplads', + depot_e = 'E - Depot', + house_garage = 'E - Husgarage', } } @@ -60,4 +36,4 @@ if GetConvar('qb_locale', 'en') == 'da' then warnOnMissing = true, fallbackLang = Lang, }) -end +end \ No newline at end of file diff --git a/locales/de.lua b/locales/de.lua index b50deff..c41a801 100644 --- a/locales/de.lua +++ b/locales/de.lua @@ -1,56 +1,32 @@ local Translations = { error = { - no_vehicles = "In dieser Garage hast du kein Fahrzeug!", - not_impound = "Dein Auto wurde nicht abgeschleppt", - not_owned = "Das Fahrzeug gehört dir nicht", - not_correct_type = "Du kannst dieses Fahrzeug hier nicht parken. (Falscher Parkplatz)", - not_enough = "Nicht genu Geld", - no_garage = "None", + no_vehicles = 'Es gibt keine Fahrzeuge an diesem Ort!', + not_depot = 'Ihr Fahrzeug befindet sich nicht im Depot', + not_owned = 'Dieses Fahrzeug kann nicht eingelagert werden', + not_correct_type = 'Sie können diesen Fahrzeugtyp hier nicht abstellen', + not_enough = 'Nicht genug Geld', + no_garage = 'Keine', + vehicle_occupied = 'Sie können dieses Fahrzeug nicht einlagern, da es nicht leer ist', + vehicle_not_tracked = 'Fahrzeug konnte nicht verfolgt werden', + no_spawn = 'Bereich zu überfüllt' }, success = { - vehicle_parked = "Auto geparkt", - }, - menu = { - header = { - house_car = "Haus Garage %{value}", - public_car = "Öffentliche Garage %{value}", - public_sea = "Öffentlichtes Bootshaus %{value}", - public_air = "Öffentlicher Hangar %{value}", - job_car = "Job Garage %{value}", - job_sea = "Job Boathouse %{value}", - job_air = "Job Hangar %{value}", - gang_car = "Gang Garage %{value}", - gang_sea = "Gang Bootshaus %{value}", - gang_air = "Gang Hangar %{value}", - depot_car = "Abschlepphof %{value}", - depot_sea = "Abschlepphof %{value}", - depot_air = "Abschlepphof %{value}", - vehicles = "Verfügbare Fahrzeuge", - depot = "%{value} [ $%{value2} ]", - garage = "%{value} [ %{value2} ]", - }, - leave = { - car = "⬅ Verlasse Garage", - sea = "⬅ Verlasse Bootshaus", - air = "⬅ Verlasse Hangar", - }, - text = { - vehicles = "Deine geparkten Autos!", - depot = "Nummernschild: %{value}
Tank: %{value2} | Motor: %{value3} | Karosserie: %{value4}", - garage = "Status: %{value}
Tank: %{value2} | Motor: %{value3} | Karosserie: %{value4}", - } + vehicle_parked = 'Fahrzeug eingelagert', + vehicle_tracked = 'Fahrzeug verfolgt', }, status = { - out = "Ausgeparkt", - garaged = "Eingeparkt", - impound = "Abgeschleppt von der Polizei", + out = 'Draußen', + garaged = 'In der Garage', + impound = 'Von der Polizei beschlagnahmt', + house = 'Haus', }, info = { - car_e = "[E] Garage", - sea_e = "[E] Bootshause", - air_e = "[E] Hangar", - park_e = "[E] Fahrzeug einparken", - house_garage = "Haus Garage", + car_e = 'E - Garage', + sea_e = 'E - Bootshaus', + air_e = 'E - Hangar', + rig_e = 'E - Rig Parkplatz', + depot_e = 'E - Depot', + house_garage = 'E - Hausgarage', } } @@ -60,4 +36,4 @@ if GetConvar('qb_locale', 'en') == 'de' then warnOnMissing = true, fallbackLang = Lang, }) -end +end \ No newline at end of file diff --git a/locales/en.lua b/locales/en.lua index 97c65e0..d63dd13 100644 --- a/locales/en.lua +++ b/locales/en.lua @@ -1,68 +1,36 @@ local Translations = { error = { - no_vehicles = "There are no vehicles in this location!", - not_impound = "Your vehicle is not in impound", - not_owned = "This vehicle can't be stored", - not_correct_type = "You can't store this type of vehicle here", - not_enough = "Not enough money", - no_garage = "None", - vehicle_occupied = "You can't store this vehicle as it is not empty", + no_vehicles = 'There are no vehicles in this location!', + not_depot = 'Your vehicle is not in depot', + not_owned = 'This vehicle can\'t be stored', + not_correct_type = 'You can\'t store this type of vehicle here', + not_enough = 'Not enough money', + no_garage = 'None', + vehicle_occupied = 'You can\'t store this vehicle as it is not empty', + vehicle_not_tracked = 'Could not track vehicle', + no_spawn = 'Area too crowded' }, success = { - vehicle_parked = "Vehicle Stored", - }, - menu = { - header = { - house_car = "House Garage %{value}", - public_car = "Public Garage %{value}", - public_sea = "Public Boathouse %{value}", - public_air = "Public Hangar %{value}", - public_rig = "Public Rig Lot %{value}", - job_car = "Job Garage %{value}", - job_sea = "Job Boathouse %{value}", - job_air = "Job Hangar %{value}", - job_rig = "Rig Lot %{value}", - gang_car = "Gang Garage %{value}", - gang_sea = "Gang Boathouse %{value}", - gang_air = "Gang Hangar %{value}", - gang_rig = "Gang Rig Lot %{value}", - depot_car = "Depot %{value}", - depot_sea = "Depot %{value}", - depot_air = "Depot %{value}", - depot_rig = "Depot %{value}", - vehicles = "Available Vehicles", - depot = "%{value} [ $%{value2} ]", - garage = "%{value} [ %{value2} ]", - unavailable_vehicle_model = "%{vehicle} | Vehicle Unavailable", - }, - leave = { - car = "⬅ Leave Garage", - sea = "⬅ Leave Boathouse", - air = "⬅ Leave Hangar", - rig = "⬅ Leave Lot", - }, - text = { - vehicles = "View stored vehicles!", - depot = "Plate: %{value}
Fuel: %{value2} | Engine: %{value3} | Body: %{value4}", - garage = "State: %{value}
Fuel: %{value2} | Engine: %{value3} | Body: %{value4}", - } + vehicle_parked = 'Vehicle Stored', + vehicle_tracked = 'Vehicle Tracked', }, status = { - out = "Out", - garaged = "Garaged", - impound = "Impounded By Police", + out = 'Out', + garaged = 'Garaged', + impound = 'Impounded By Police', + house = 'House', }, info = { - car_e = "E - Garage", - sea_e = "E - Boathouse", - air_e = "E - Hangar", - rig_e = "E - Rig Lot", - park_e = "E - Store Vehicle", - house_garage = "House garage", + car_e = 'E - Garage', + sea_e = 'E - Boathouse', + air_e = 'E - Hangar', + rig_e = 'E - Rig Lot', + depot_e = 'E - Depot', + house_garage = 'E - House Garage', } } Lang = Lang or Locale:new({ phrases = Translations, warnOnMissing = true -}) +}) \ No newline at end of file diff --git a/locales/es.lua b/locales/es.lua index 7c6fcef..3ed1b51 100644 --- a/locales/es.lua +++ b/locales/es.lua @@ -1,57 +1,32 @@ local Translations = { error = { - no_vehicles = "No tienes ningún vehículo en este garaje!", - not_impound = "Tu Vehiculo no está en el depósito", - not_owned = "No eres dueño del vehiculo", - not_correct_type = "No puede almacenar este tipo de vehículo aquí.", - not_enough = "Dinero insuficiente", - no_garage = "Ninguno", - vehicle_occupied = "No puedes almacenar este vehículo ya que no está vacío.", + no_vehicles = '¡No hay vehículos en esta ubicación!', + not_depot = 'Tu vehículo no está en el depósito', + not_owned = 'Este vehículo no puede ser almacenado', + not_correct_type = 'No puedes guardar este tipo de vehículo aquí', + not_enough = 'No hay suficiente dinero', + no_garage = 'Ninguno', + vehicle_occupied = 'No puedes guardar este vehículo ya que no está vacío', + vehicle_not_tracked = 'No se pudo rastrear el vehículo', + no_spawn = 'Área demasiado concurrida' }, success = { - vehicle_parked = "vehículo estacionado", - }, - menu = { - header = { - house_car = "Garage de casa %{value}", - public_car = "Garage Público %{value}", - public_sea = "Boathouse Público %{value}", - public_air = "Hangar Público %{value}", - job_car = "Job Garage %{value}", - job_sea = "Job Boathouse %{value}", - job_air = "Job Hangar %{value}", - gang_car = "Gang Garage %{value}", - gang_sea = "Gang Boathouse %{value}", - gang_air = "Gang Hangar %{value}", - depot_car = "Deposito %{value}", - depot_sea = "Deposito %{value}", - depot_air = "Deposito %{value}", - vehicles = "Vehiculos Disponible ", - depot = "%{value} [ $%{value2} ]", - garage = "%{value} [ %{value2} ]", - }, - leave = { - car = "⬅ Abandonar Garage", - sea = "⬅ Abandonar Boathouse", - air = "⬅ Abandonar Hangar", - }, - text = { - vehicles = "Ver vehículos almacenados!", - depot = "Placa: %{value}
Gasolina: %{value2} | Motor: %{value3} | Carroceria: %{value4}", - garage = "Estado: %{value}
Gasolina: %{value2} | Motor: %{value3} | Carroceria: %{value4}", - } + vehicle_parked = 'Vehículo Almacenado', + vehicle_tracked = 'Vehículo Rastreado', }, status = { - out = "Afuera", - garaged = "en garaje", - impound = "incautado por la policía", + out = 'Fuera', + garaged = 'En el garaje', + impound = 'Embargado por la policía', + house = 'Casa', }, info = { - car_e = "[E] Garage", - sea_e = "[E] Boathouse", - air_e = "[E] Hangar", - park_e = "[E] Almacenar vehículo", - house_garage = "garaje de la casa", + car_e = 'E - Garaje', + sea_e = 'E - Garaje de barcos', + air_e = 'E - Hangar', + rig_e = 'E - Lote de plataforma', + depot_e = 'E - Depósito', + house_garage = 'E - Garaje de la casa', } } @@ -61,4 +36,4 @@ if GetConvar('qb_locale', 'en') == 'es' then warnOnMissing = true, fallbackLang = Lang, }) -end +end \ No newline at end of file diff --git a/locales/et.lua b/locales/et.lua index 7ad7b6f..1f07d9b 100644 --- a/locales/et.lua +++ b/locales/et.lua @@ -1,57 +1,32 @@ local Translations = { error = { - no_vehicles = "Selles kohas ei ole sõidukeid!", - not_impound = "Teie sõiduk ei ole arestitud!", - not_owned = "Seda sõidukit ei saa hoiustada", - not_correct_type = "Seda tüüpi sõidukeid siin hoida ei saa", - not_enough = "Pole piisavalt raha", - no_garage = "Mitte ühtegi", - vehicle_occupied = "Te ei saa seda sõidukit hoiustada, kuna see ei ole tühi", + no_vehicles = 'Selles kohas ei ole sõidukeid!', + not_depot = 'Teie sõiduk ei ole depoos', + not_owned = 'Seda sõidukit ei saa hoida', + not_correct_type = 'Te ei saa seda tüüpi sõidukit siia hoida', + not_enough = 'Piisavalt raha pole', + no_garage = 'Puudub', + vehicle_occupied = 'Te ei saa seda sõidukit hoida, kuna see pole tühi', + vehicle_not_tracked = 'Sõidukit ei õnnestunud jälgida', + no_spawn = 'Ala on liiga rahvarohke' }, success = { - vehicle_parked = "Sõiduk hoiustatud", - }, - menu = { - header = { - house_car = "Maja garaaž %{value}", - public_car = "Avalik garaaž %{value}", - public_sea = "Avalik paadimaja %{value}", - public_air = "Avalik angaar %{value}", - job_car = "Fraktsiooni garaaz %{value}", - job_sea = "Fraktsiooni paadikuuri %{value}", - job_air = "Fraktsiooni angaar %{value}", - gang_car = "Grupeeringu garaaz %{value}", - gang_sea = "Grupeeringu paadimaja %{value}", - gang_air = "Grupeeringu angaar %{value}", - depot_car = "Depoo %{value}", - depot_sea = "Depoo %{value}", - depot_air = "Depoo %{value}", - vehicles = "Saadaval olevad sõidukid", - depot = "%{value} [ $%{value2} ]", - garage = "%{value} [ %{value2} ]", - }, - leave = { - car = "⬅ Lahku garaazist", - sea = "⬅ Lahku paadimajast", - air = "⬅ Lahku angaarist", - }, - text = { - vehicles = "Vaata hoiustatud sõidukeid!", - depot = "Plaat: %{value}
Kütus: %{value2} | Mootor: %{value3} | Kere: %{value4}", - garage = "Olek: %{value}
Kütus: %{value2} | Mootor: %{value3} | Kere: %{value4}", - } + vehicle_parked = 'Sõiduk on salvestatud', + vehicle_tracked = 'Sõiduk on jälgitud', }, status = { - out = "Väljas", - garaged = "Garaazis", - impound = "Politsei poolt arestitud", + out = 'Väljas', + garaged = 'Garaažis', + impound = 'Politsei poolt konfiskeeritud', + house = 'Maja', }, info = { - car_e = "[E] Garaaz", - sea_e = "[E] Paadimaja", - air_e = "[E] Angaar", - park_e = "[E] Hoiusta sõiduk", - house_garage = "Majagaraaz", + car_e = 'E - Garaaž', + sea_e = 'E - Paadimaja', + air_e = 'E - Hangaar', + rig_e = 'E - Puurplatvormi parkimiskoht', + depot_e = 'E - Depoo', + house_garage = 'E - Maja garaaž', } } @@ -61,4 +36,4 @@ if GetConvar('qb_locale', 'en') == 'et' then warnOnMissing = true, fallbackLang = Lang, }) -end +end \ No newline at end of file diff --git a/locales/fa.lua b/locales/fa.lua index 83e9af0..530bdb2 100644 --- a/locales/fa.lua +++ b/locales/fa.lua @@ -1,36 +1,32 @@ local Translations = { error = { - not_enough = "Mojodi Kafi Nist", - not_impound = "Mashin Shoma Togif Nashode", - not_owned = "Vasile Nagliye Motealeg be Shoma Nist", - no_vehicles = "Shoma Hich Vasile Nagliyei dar in Garazh Nararid!", - no_vehicles_impounded = "Shoma Hich Vasile Nagliyei dar Togif Nararid!", - vehicle_at_depot = "Vasile Nagliye Shoma dar Anbar Ast!", - impounded_by_police = "In Vasile Nagliye Tavasote Police Togif Shode Ast!", - someone_inside = "Vasile Nagliye Park Nashod, Lotfat Barasi Konid Kasi Dakhel Mashin Nabashad..", + no_vehicles = 'ترددی در این مکان وجود ندارد!', + not_depot = 'وسیلهٔ شما در دیپو نیست', + not_owned = 'نمی‌توانید این وسیله را ذخیره کنید', + not_correct_type = 'نمی‌توانید این نوع وسیله را در اینجا ذخیره کنید', + not_enough = 'موجودی کافی نیست', + no_garage = 'ندارد', + vehicle_occupied = 'نمی‌توانید این وسیله را ذخیره کنید چون پر است', + vehicle_not_tracked = 'وسیله را نمی‌توان پیگیری کرد', + no_spawn = 'محل بسیار شلوغ است' }, success = { - vehicle_parked = "Vasile Nagliye Park Shod", + vehicle_parked = 'وسیله ذخیره شد', + vehicle_tracked = 'وسیله پیگیری شد', + }, + status = { + out = 'خارج', + garaged = 'در گاراژ', + impound = 'توسط پلیس ضبط شده', + house = 'خانه', }, info = { - public_garage = "Garazhe Omumi", - gang_garage = "Garazhe Band", - job_garage = "Garazhe Shogh", - house_garage = "Garazhe Khane", - impound = "Togif", - my_vehicles = "Vasayele Nagliye Man", - view_stored = "Vasayele Nagliye Park Shodeye Khod ra Moshahede Konid!", - leave_garage = "⬅ Tark Garazh", - leave_depot = "⬅ Tark Anbar", - garage = "Garazh: %{value}", - depot = "Anbar: %{value}", - out = "Birun", - garaged = "Dar Garazh", - impounded = "Togif Shode Tavasote Police", - garage_line = "Eyalat: %{value}
Sokht: %{value2} | Motor: %{value3} | Badane: %{value4}", - depot_line = "Pelak: %{value}
Sokht: %{value2} | Motor: %{value3} | Badane: %{value4}", - garage_e = "[E] Garazh", - park_e = "[E] Park Kardan Vasile Nagliye", + car_e = 'E - گاراژ', + sea_e = 'E - کشتی‌گیری', + air_e = 'E - هانگار', + rig_e = 'E - محل پارک پلتفرم حفاری', + depot_e = 'E - دیپو', + house_garage = 'E - گاراژ خانه', } } @@ -40,4 +36,4 @@ if GetConvar('qb_locale', 'en') == 'fa' then warnOnMissing = true, fallbackLang = Lang, }) -end +end \ No newline at end of file diff --git a/locales/fi.lua b/locales/fi.lua index 434cc66..3216442 100644 --- a/locales/fi.lua +++ b/locales/fi.lua @@ -1,36 +1,32 @@ local Translations = { error = { - not_enough = "Ei tarpeeksi rahaa!", - not_impound = "Ajoneuvosi ei ole takavarikossa", - not_owned = "Ajoneuvo ei ole omistuksessasi", - no_vehicles = "Sinulla ei ole ajoneuvoja tässä tallissa!", - no_vehicles_impounded = "Sinulla ei ole ajoneuvoja takavarikoituna!", - vehicle_at_depot = "Ajoneuvosi saattaa olla varikolla!", - impounded_by_police = "Ajoneuvo takavarikoitiin poliisin toimesta.", - someone_inside = "Ajoneuvoa ei voitu tallettaa: Tarkista onko joku sisällä.", + no_vehicles = 'Tässä sijainnissa ei ole ajoneuvoja!', + not_depot = 'Ajoneuvosi ei ole varikolla', + not_owned = 'Tätä ajoneuvoa ei voi säilyttää', + not_correct_type = 'Tätä ajoneuvotyyppiä ei voi säilyttää täällä', + not_enough = 'Ei tarpeeksi rahaa', + no_garage = 'Ei yhtään', + vehicle_occupied = 'Et voi säilyttää tätä ajoneuvoa, koska se ei ole tyhjä', + vehicle_not_tracked = 'Ajoneuvoa ei voitu jäljittää', + no_spawn = 'Alue on liian täynnä' }, success = { - vehicle_parked = "Ajoneuvo parkkeerattu", + vehicle_parked = 'Ajoneuvo tallennettu', + vehicle_tracked = 'Ajoneuvo jäljitetty', + }, + status = { + out = 'Ulkona', + garaged = 'Tallissa', + impound = 'Poliisin takavarikoima', + house = 'Talo', }, info = { - public_garage = "Julkinen talli", - gang_garage = "Jengitalli", - job_garage = "Työtalli", - house_garage = "Talon talli", - impound = "Takavarikko", - my_vehicles = "Ajoneuvoni", - view_stored = "Katso talletettuja ajoneuvoja!", - leave_garage = "⬅ Poistu tallista", - leave_depot = "⬅ Poistu varikolta", - garage = "Talli: %{value}", - depot = "Varikko: %{value}", - out = "Ulos", - garaged = "Talletettu", - impounded = "Takavarikoitu poliisin toimesta", - garage_line = "Tila: %{value}
Bensa: %{value2} | Moottori: %{value3} | Kori: %{value4}", - depot_line = "Rekisteritunnus: %{value}
Bensa: %{value2} | Moottori: %{value3} | Kori: %{value4}", - garage_e = "[E] Talli", - park_e = "[E] Parkkeeraa ajoneuvo", + car_e = 'E - Autotalli', + sea_e = 'E - Venevaja', + air_e = 'E - Lentokonehalli', + rig_e = 'E - Porapaikka', + depot_e = 'E - Varikko', + house_garage = 'E - Talon autotalli', } } @@ -40,4 +36,4 @@ if GetConvar('qb_locale', 'en') == 'fi' then warnOnMissing = true, fallbackLang = Lang, }) -end +end \ No newline at end of file diff --git a/locales/fr.lua b/locales/fr.lua index 9b01ac8..9bce8a8 100644 --- a/locales/fr.lua +++ b/locales/fr.lua @@ -1,57 +1,32 @@ local Translations = { error = { - no_vehicles = "Vous n'avez aucun véhicule dans ce garage!", - not_impound = "Votre véhicule n'est pas à la fourrière", - not_owned = "Le véhicule ne vous appartient pas", - not_correct_type = "Vous ne pouvez pas stocker ce type de véhicule ici.", - not_enough = "Pas assez d'argent", - no_garage = "Aucun", - vehicle_occupied = "Vous ne pouvez pas stocker ce véhicule car il n'est pas vide", + no_vehicles = 'Il n\'y a pas de véhicules à cet endroit !', + not_depot = 'Votre véhicule n\'est pas au dépôt', + not_owned = 'Ce véhicule ne peut pas être stocké', + not_correct_type = 'Vous ne pouvez pas stocker ce type de véhicule ici', + not_enough = 'Pas assez d\'argent', + no_garage = 'Aucun', + vehicle_occupied = 'Vous ne pouvez pas stocker ce véhicule car il n\'est pas vide', + vehicle_not_tracked = 'Impossible de suivre le véhicule', + no_spawn = 'Zone trop encombrée' }, success = { - vehicle_parked = "Véhicule garé !", - }, - menu = { - header = { - house_car = "Garage de propriété %{value}", - public_car = "Garage Public %{value}", - public_sea = "Hangar à bateaux Public %{value}", - public_air = "Hangar Public %{value}", - job_car = "Garage de fonction %{value}", - job_sea = "Hangar à bateaux de fonction %{value}", - job_air = "Hangar de fonction %{value}", - gang_car = "Garage de Gang %{value}", - gang_sea = "Hangar à bateaux de Gang %{value}", - gang_air = "Hangar de Gang %{value}", - depot_car = "Fourrière %{value}", - depot_sea = "Fourrière %{value}", - depot_air = "Fourrière %{value}", - vehicles = "Véhicules disponibles", - depot = "%{value} [ $%{value2} ]", - garage = "%{value} [ %{value2} ]", - }, - leave = { - car = "⬅ Quitter le garage", - sea = "⬅ Quitter le hangar à bateaux", - air = "⬅ Quitter le Hangar", - }, - text = { - vehicles = "Voir les véhicules stockés!", - depot = "Plaque: %{value}
Réservoir: %{value2} | Moteur: %{value3} | Carrosserie: %{value4}", - garage = "État: %{value}
Réservoir: %{value2} | Moteur: %{value3} | Carrosserie: %{value4}", - } + vehicle_parked = 'Véhicule stocké', + vehicle_tracked = 'Véhicule suivi', }, status = { - out = "Dehors", - garaged = "Garé", - impound = "En Fourrière par la Police", + out = 'Dehors', + garaged = 'Dans le garage', + impound = 'Saisi par la police', + house = 'Maison', }, info = { - car_e = "[E] Garage", - sea_e = "[E] Hangar à bateaux", - air_e = "[E] Hangar", - park_e = "[E] Ranger le véhicule", - house_garage = "Garage Personnel", + car_e = 'E - Garage', + sea_e = 'E - Hangar à bateaux', + air_e = 'E - Hangar', + rig_e = 'E - Emplacement de la plateforme de forage', + depot_e = 'E - Dépôt', + house_garage = 'E - Garage de maison', } } @@ -61,4 +36,4 @@ if GetConvar('qb_locale', 'en') == 'fr' then warnOnMissing = true, fallbackLang = Lang, }) -end +end \ No newline at end of file diff --git a/locales/ge.lua b/locales/ge.lua index 3b6ffb6..629d2fb 100644 --- a/locales/ge.lua +++ b/locales/ge.lua @@ -1,36 +1,32 @@ local Translations = { error = { - not_enough = "არ გააქვს საკმარისი თანხა", - not_impound = "შენი ავტომობილი არ არის საჯარიმოზე", - not_owned = "ავტომობილი არ არის საკუთრებაში", - no_vehicles = "არ გყავს არანაირი ავტომობილი გარაჟში!", - no_vehicles_impounded = "შენ არ გყავს მანაქანა საჯარიმოზე!", - vehicle_at_depot = "ავტომობილი შეიძლება იყოს საჯარიმოზე!", - impounded_by_police = "ეს ავტომობილი იქნა გადაყვანილი საჯარიმოზე პოლიციის მიერ!", - someone_inside = "ავტომობილი არ არის შენახული, გადაამოწმე თუ არის ვინმე შიგნით.", + no_vehicles = 'ამ ადგილზე არ გააქვს წარმოებული ტრანსპორტი!', + not_depot = 'თქვენი ტრანსპორტი არ არის დეპოში', + not_owned = 'ამ ტრანსპორტს ვერ შეინახავთ', + not_correct_type = 'ამ ტიპის ტრანსპორტი აქ არ შეიძლება შეინახოთ', + not_enough = 'არ არის საკმარისი თანხა', + no_garage = 'არ არის', + vehicle_occupied = 'ამ ტრანსპორტს შეუძლებელია შეინახოთ, რადგან ის ცარიელი არ არის', + vehicle_not_tracked = 'ტრანსპორტი ვერ იყო თვალის წინ', + no_spawn = 'არეული ზონაში ძალა არ არის' }, success = { - vehicle_parked = "ავტომობილი დაპარკინგებულია", + vehicle_parked = 'ტრანსპორტი შენახულია', + vehicle_tracked = 'ტრანსპორტი თვალის წინ', + }, + status = { + out = 'გარეთ', + garaged = 'გარეჯი', + impound = 'დაკონფისკირებული პოლიციის მიერ', + house = 'სახლი', }, info = { - public_garage = "საერთო პარკინგი", - gang_garage = "დაჯგუფების ფარეხი", - job_garage = "სამსახურეობრივი ფარეხი", - house_garage = "საცხოვრებელი ფარეხი", - impound = "საჯარიმო", - my_vehicles = "ჩემი ავტომობილები", - view_stored = "შენახული ავტომობილების ნახვა!", - leave_garage = "⬅ ფარეხიდან გასვლა", - leave_depot = "⬅ საჯარიმოდან გასვლა", - garage = "ფარეხი: %{value}", - depot = "საჯარიმო: %{value}", - out = "გარეთ", - garaged = "ფარეხში", - impounded = "საჯარიმოზე პოლიციის მიერ", - garage_line = "ნომერი: %{value}
ავზი: %{value2} | მატორი: %{value3} | მდგომარეობა: %{value4}", - depot_line = "ნომერი: %{value}
ავზი: %{value2} | მატორი: %{value3} | მდგომარეობა: %{value4}", - garage_e = "[E] ფარეხი", - park_e = "[E] ავტომობილის პარკირება", + car_e = 'E - გარეჟი', + sea_e = 'E - საზღვაო ბუნები', + air_e = 'E - ჰანგარი', + rig_e = 'E - ფლევარის პარკინგი', + depot_e = 'E - დეპო', + house_garage = 'E - სახლის გარეჟი', } } @@ -40,4 +36,4 @@ if GetConvar('qb_locale', 'en') == 'ge' then warnOnMissing = true, fallbackLang = Lang, }) -end +end \ No newline at end of file diff --git a/locales/it.lua b/locales/it.lua index 943438e..2bccdc9 100644 --- a/locales/it.lua +++ b/locales/it.lua @@ -1,36 +1,32 @@ local Translations = { error = { - not_enough = "Non hai abbastanza denaro", - not_impound = "Il tuo veicolo non è sequestrato", - not_owned = "Veicolo non posseduto", - no_vehicles = "Non hai veicoli in questo garage!", - no_vehicles_impounded = "Non hai nessun veicolo sequestrato!", - vehicle_at_depot = "Il tuo veicolo potrebbe essere al deposito!", - impounded_by_police = "Questo veicolo è stato sequestrato dalla polizia!", - someone_inside = "Veicolo non depositato, controlla se c\'è qualcuno all\'interno del veicolo.", + no_vehicles = 'Non ci sono veicoli in questa posizione!', + not_depot = 'Il tuo veicolo non è in deposito', + not_owned = 'Questo veicolo non può essere depositato', + not_correct_type = 'Non puoi depositare questo tipo di veicolo qui', + not_enough = 'Soldi insufficienti', + no_garage = 'Nessuno', + vehicle_occupied = 'Non puoi depositare questo veicolo perché non è vuoto', + vehicle_not_tracked = 'Impossibile tracciare il veicolo', + no_spawn = 'Area troppo affollata' }, success = { - vehicle_parked = "Veicolo Parcheggiato", + vehicle_parked = 'Veicolo depositato', + vehicle_tracked = 'Veicolo tracciato', + }, + status = { + out = 'Fuori', + garaged = 'In garage', + impound = 'Sequestrato dalla polizia', + house = 'Casa', }, info = { - public_garage = "Garage Pubblico", - gang_garage = "Garage Gang", - job_garage = "Garage Lavoro", - house_garage = "Garage Casa", - impound = "Sequestra", - my_vehicles = "Miei Veicoli", - view_stored = "Controlla i tuoi veicoli depostitati!", - leave_garage = "⬅ Lascia Garage", - leave_depot = "⬅ Lascia Deposito", - garage = "Garage: %{value}", - depot = "Deposito: %{value}", - out = "Fuori", - garaged = "Parcheggiato", - impounded = "Sequestrato Dalla Polizia", - garage_line = "Stato: %{value}
Carburante: %{value2} | Motore: %{value3} | Carrozzeria: %{value4}", - depot_line = "Targa: %{value}
Carburante: %{value2} | Motore: %{value3} | Carrozzeria: %{value4}", - garage_e = "[E] Garage", - park_e = "[E] Parcheggia Veicolo", + car_e = 'E - Garage', + sea_e = 'E - Rimessaggio barche', + air_e = 'E - Hangar', + rig_e = 'E - Piazzale', + depot_e = 'E - Deposito', + house_garage = 'E - Garage di casa', } } @@ -40,4 +36,4 @@ if GetConvar('qb_locale', 'en') == 'it' then warnOnMissing = true, fallbackLang = Lang, }) -end +end \ No newline at end of file diff --git a/locales/nl.lua b/locales/nl.lua index 8722e46..bd57e00 100644 --- a/locales/nl.lua +++ b/locales/nl.lua @@ -1,56 +1,32 @@ local Translations = { error = { - no_vehicles = "Er zijn geen voertuigen op deze locatie!", - not_impound = "Uw voertuig is niet in beslag genomen", - not_owned = "Dit voertuig kan niet gestald worden", - not_correct_type = "U kunt dit type voertuig hier niet stallen", - not_enough = "Niet genoeg geld", - no_garage = "Geen", + no_vehicles = 'Er zijn geen voertuigen op deze locatie!', + not_depot = 'Uw voertuig bevindt zich niet in het depot', + not_owned = 'Dit voertuig kan niet worden opgeslagen', + not_correct_type = 'Je kunt dit type voertuig hier niet opslaan', + not_enough = 'Niet genoeg geld', + no_garage = 'Geen', + vehicle_occupied = 'Je kunt dit voertuig niet opslaan omdat het niet leeg is', + vehicle_not_tracked = 'Kon voertuig niet volgen', + no_spawn = 'Gebied te druk' }, success = { - vehicle_parked = "Voertuig opgeslagen", - }, - menu = { - header = { - house_car = "Huis Garage %{value}", - public_car = "Openbaar Garage %{value}", - public_sea = "Openbaar Boot Garage %{value}", - public_air = "Openbaar Hangar %{value}", - job_car = "Werk Garage %{value}", - job_sea = "Werk Boot Garage %{value}", - job_air = "Werk Hangar %{value}", - gang_car = "Gang Garage %{value}", - gang_sea = "Gang Boot Garage %{value}", - gang_air = "Gang Hangar %{value}", - depot_car = "Depot %{value}", - depot_sea = "Depot %{value}", - depot_air = "Depot %{value}", - vehicles = "Beschikbare voertuigen", - depot = "%{value} [ $%{value2} ]", - garage = "%{value} [ %{value2} ]", - }, - leave = { - car = "⬅ Verlaat Garage", - sea = "⬅ Verlaat Boot Garage", - air = "⬅ Verlaat Hangar", - }, - text = { - vehicles = "Bekijk opgeslagen voertuigen!", - depot = "Kenteken: %{value}
Brandstof: %{value2} | Motor: %{value3} | Carrosserie: %{value4}", - garage = "Status: %{value}
Brandstof: %{value2} | Motor: %{value3} | Carrosserie: %{value4}", - } + vehicle_parked = 'Voertuig opgeslagen', + vehicle_tracked = 'Voertuig gevolgd', }, status = { - out = "Buiten", - garaged = "Garage", - impound = "In Beslag", + out = 'Uit', + garaged = 'In de garage', + impound = 'In beslag genomen door de politie', + house = 'Huis', }, info = { - car_e = "[E] Garage", - sea_e = "[E] Boot Garage", - air_e = "[E] Hangar", - park_e = "[E] Voertuig opslaan", - house_garage = "Huis garage", + car_e = 'E - Garage', + sea_e = 'E - Boothuis', + air_e = 'E - Hangar', + rig_e = 'E - Rig Lot', + depot_e = 'E - Depot', + house_garage = 'E - Huis garage', } } @@ -60,4 +36,4 @@ if GetConvar('qb_locale', 'en') == 'nl' then warnOnMissing = true, fallbackLang = Lang, }) -end +end \ No newline at end of file diff --git a/locales/pt-br.lua b/locales/pt-br.lua index 0e54a9b..4c1efe5 100644 --- a/locales/pt-br.lua +++ b/locales/pt-br.lua @@ -1,64 +1,32 @@ local Translations = { error = { - no_vehicles = "Não há veículos neste local!", - not_impound = "Seu veículo não está no depósito", - not_owned = "Este veículo não pode ser armazenado", - not_correct_type = "Você não pode armazenar este tipo de veículo aqui", - not_enough = "Dinheiro insuficiente", - no_garage = "Nenhum", - vehicle_occupied = "Você não pode armazenar este veículo, pois não está vazio", + no_vehicles = 'Não há veículos neste local!', + not_depot = 'Seu veículo não está no depósito', + not_owned = 'Este veículo não pode ser armazenado', + not_correct_type = 'Você não pode armazenar este tipo de veículo aqui', + not_enough = 'Dinheiro insuficiente', + no_garage = 'Nenhum', + vehicle_occupied = 'Você não pode armazenar este veículo, pois ele não está vazio', + vehicle_not_tracked = 'Não foi possível rastrear o veículo', + no_spawn = 'Área muito lotada' }, success = { - vehicle_parked = "Veículo armazenado", - }, - menu = { - header = { - house_car = "Garagem da Casa %{value}", - public_car = "Garagem Pública %{value}", - public_sea = "Marina Pública %{value}", - public_air = "Hangar Público %{value}", - public_rig = "Estacionamento Público %{value}", - job_car = "Garagem do Trabalho %{value}", - job_sea = "Marina do Trabalho %{value}", - job_air = "Hangar do Trabalho %{value}", - job_rig = "Estacionamento do Trabalho %{value}", - gang_car = "Garagem da Gangue %{value}", - gang_sea = "Marina da Gangue %{value}", - gang_air = "Hangar da Gangue %{value}", - gang_rig = "Estacionamento da Gangue %{value}", - depot_car = "Depósito %{value}", - depot_sea = "Depósito %{value}", - depot_air = "Depósito %{value}", - depot_rig = "Depósito %{value}", - vehicles = "Veículos Disponíveis", - depot = "%{value} [ $%{value2} ]", - garage = "%{value} [ %{value2} ]", - unavailable_vehicle_model = "%{vehicle} | Veículo Indisponível", - }, - leave = { - car = "⬅ Sair da Garagem", - sea = "⬅ Sair da Marina", - air = "⬅ Sair do Hangar", - rig = "⬅ Sair do Estacionamento", - }, - text = { - vehicles = "Ver veículos armazenados!", - depot = "Placa: %{value}
Combustível: %{value2} | Motor: %{value3} | Carroceria: %{value4}", - garage = "Estado: %{value}
Combustível: %{value2} | Motor: %{value3} | Carroceria: %{value4}", - } + vehicle_parked = 'Veículo armazenado', + vehicle_tracked = 'Veículo rastreado', }, status = { - out = "Fora", - garaged = "Garado", - impound = "Apreendido pela Polícia", + out = 'Fora', + garaged = 'Na garagem', + impound = 'Apreendido pela polícia', + house = 'Casa', }, info = { - car_e = "E - Garagem", - sea_e = "E - Marina", - air_e = "E - Hangar", - rig_e = "E - Estacionamento", - park_e = "E - Armazenar Veículo", - house_garage = "Garagem da Casa", + car_e = 'E - Garagem', + sea_e = 'E - Hangar de barco', + air_e = 'E - Hangar', + rig_e = 'E - Local de plataforma de perfuração', + depot_e = 'E - Depósito', + house_garage = 'E - Garagem de casa', } } diff --git a/locales/pt.lua b/locales/pt.lua index 4aac04f..18227ff 100644 --- a/locales/pt.lua +++ b/locales/pt.lua @@ -1,56 +1,32 @@ local Translations = { error = { - no_vehicles = "Não tens nenhum veículo nesta garagem!", - not_impound = "O teu veículo não está nos apreendidos", - not_owned = "Este veículo não te pertence", - not_correct_type = "Não podes guardar veículos deste tipo aqui", - not_enough = "Dinheiro insuficiente", - no_garage = "Nenhuma", + no_vehicles = 'Não existem veículos nesta localização!', + not_depot = 'O seu veículo não está no depósito', + not_owned = 'Este veículo não pode ser armazenado', + not_correct_type = 'Não pode armazenar este tipo de veículo aqui', + not_enough = 'Dinheiro insuficiente', + no_garage = 'Nenhum', + vehicle_occupied = 'Não pode armazenar este veículo, pois não está vazio', + vehicle_not_tracked = 'Não foi possível localizar o veículo', + no_spawn = 'Área demasiado congestionada' }, success = { - vehicle_parked = "Veículo guardado", - }, - menu = { - header = { - house_car = "Garagem Particular %{value}", - public_car = "Garagem %{value}", - public_sea = "Doca %{value}", - public_air = "Hangar %{value}", - job_car = "Garagem De Emprego %{value}", - job_sea = "Doca De Emprego %{value}", - job_air = "Hangar De Emprego %{value}", - gang_car = "Garagem De Gang %{value}", - gang_sea = "Doca De Gang %{value}", - gang_air = "Hangar De Gang %{value}", - depot_car = "Apreendidos %{value}", - depot_sea = "Apreendidos %{value}", - depot_air = "Apreendidos %{value}", - vehicles = "Veículos Disponíveis", - depot = "%{value} [ $%{value2} ]", - garage = "%{value} [ %{value2} ]", - }, - leave = { - car = "⬅ Sair Da Garagem", - sea = "⬅ Sair Da Doca", - air = "⬅ Sair Do Hangar", - }, - text = { - vehicles = "Ver veículos guardados!", - depot = "Placa: %{value}
Combu: %{value2} | Motor: %{value3} | Chassi: %{value4}", - garage = "Estado: %{value}
Combu: %{value2} | Motor: %{value3} | Chassi: %{value4}", - } + vehicle_parked = 'Veículo armazenado', + vehicle_tracked = 'Veículo localizado', }, status = { - out = "Fora", - garaged = "Guardado", - impound = "Apreendido Pela Polícia", + out = 'Fora', + garaged = 'Na garagem', + impound = 'Apreendido pela polícia', + house = 'Casa', }, info = { - car_e = "[E] Garagem", - sea_e = "[E] Doca", - air_e = "[E] Hangar", - park_e = "[E] Guardar Veículo", - house_garage = "Garagem Particular", + car_e = 'E - Garagem', + sea_e = 'E - Garagem para barcos', + air_e = 'E - Hangar', + rig_e = 'E - Local de plataforma', + depot_e = 'E - Depósito', + house_garage = 'E - Garagem da casa', } } @@ -60,4 +36,4 @@ if GetConvar('qb_locale', 'en') == 'pt' then warnOnMissing = true, fallbackLang = Lang, }) -end +end \ No newline at end of file diff --git a/locales/ro.lua b/locales/ro.lua index 84c0548..0d9b9bf 100644 --- a/locales/ro.lua +++ b/locales/ro.lua @@ -1,61 +1,32 @@ ---[[ -Romanian base language translation for qb-garages -Translation done by wanderrer (Martin Riggs#0807 on Discord) -]]-- local Translations = { error = { - no_vehicles = "Nu ai niciun vehicul parcat in aceasta locatie!", - not_impound = "Vehiculul tau nu a fost confiscat de stat", - not_owned = "Nu poti parca acest vehicul", - not_correct_type = "Acest tip de vehicul, nu poate fi parcat aici", - not_enough = "Nu ai suficienti bani", - no_garage = "Absolut nimic", - vehicle_occupied = "Nu poti parca acest vehicul, nu este gol :)", + no_vehicles = 'Nu există vehicule în această locație!', + not_depot = 'Vehiculul dvs. nu este în depozit', + not_owned = 'Acest vehicul nu poate fi stocat', + not_correct_type = 'Nu puteți stoca acest tip de vehicul aici', + not_enough = 'Nu aveți suficientă bani', + no_garage = 'Niciunul', + vehicle_occupied = 'Nu puteți stoca acest vehicul deoarece nu este gol', + vehicle_not_tracked = 'Nu s-a putut urmări vehiculul', + no_spawn = 'Zona este prea aglomerată' }, success = { - vehicle_parked = "Vehiculul a fost parcat cu succes", - }, - menu = { - header = { - house_car = "Garajul casei %{value}", - public_car = "Parcare publica %{value}", - public_sea = "Debarcader public %{value}", - public_air = "Hangar public %{value}", - job_car = "Garaj pentru %{value}", - job_sea = "Debarcader pentru %{value}", - job_air = "Hangar pentru %{value}", - gang_car = "Garaj pentru %{value}", - gang_sea = "Debarcader pentru %{value}", - gang_air = "Hangar pentru %{value}", - depot_car = "Depozit %{value}", - depot_sea = "Depozit %{value}", - depot_air = "Depozit %{value}", - vehicles = "Vehicule disponibile", - depot = "%{value} [ $%{value2} ]", - garage = "%{value} [ %{value2} ]", - }, - leave = { - car = "⬅ Paraseste garajul", - sea = "⬅ Paraseste debarcaderul", - air = "⬅ Paraseste Hangarul", - }, - text = { - vehicles = "Lista vehicule parcate!", - depot = "Numar: %{value}
Combustibil: %{value2} | Motor: %{value3} | Caroserie: %{value4}", - garage = "Stare: %{value}
Combustibil: %{value2} | Motor: %{value3} | Caroserie: %{value4}", - } + vehicle_parked = 'Vehiculul a fost depozitat', + vehicle_tracked = 'Vehiculul a fost urmărit', }, status = { - out = "Undeva pe strazi", - garaged = "Parcat", - impound = "Confiscat de Stat", + out = 'Ieșit', + garaged = 'În garaj', + impound = 'Confiscat de poliție', + house = 'Casa', }, info = { - car_e = "[E] Garaj", - sea_e = "[E] Debarcader", - air_e = "[E] Hangar", - park_e = "[E] Parcheaza vehicul", - house_garage = "Parcare domiciuliu", + car_e = 'E - Garaj', + sea_e = 'E - Hangar pentru bărci', + air_e = 'E - Hangar', + rig_e = 'E - Locul platformei de foraj', + depot_e = 'E - Depozit', + house_garage = 'E - Garaj de casă', } } @@ -65,4 +36,4 @@ if GetConvar('qb_locale', 'en') == 'ro' then warnOnMissing = true, fallbackLang = Lang, }) -end +end \ No newline at end of file diff --git a/locales/sk.lua b/locales/sk.lua index e903201..3435e07 100644 --- a/locales/sk.lua +++ b/locales/sk.lua @@ -1,36 +1,32 @@ local Translations = { error = { - not_enough = "Nemáš dostatok peňazí", - not_impound = "Vaše auto nie je zabavené", - not_owned = "Vozidlo nikto nevlastnení", - no_vehicles = "V tejto garáži nemáte žiadne vozidlá!", - no_vehicles_impounded = "Nemáte žiadne zabavené vozidlá!", - vehicle_at_depot = "Vaše vozidlo môže byť v depe!", - impounded_by_police = "Toto vozidlo zabavila polícia!", - someone_inside = "Vozidlo nie je uskladnené, skontrolujte, či niekto nie je v aute.", + no_vehicles = 'V tomto mieste nie sú žiadne vozidlá!', + not_depot = 'Vaše vozidlo nie je v depo', + not_owned = 'Toto vozidlo nie je možné uložiť', + not_correct_type = 'Tento druh vozidla nemôžete uložiť sem', + not_enough = 'Nedostatok peňazí', + no_garage = 'Žiadny', + vehicle_occupied = 'Toto vozidlo nemôžete uložiť, pretože nie je prázdne', + vehicle_not_tracked = 'Vozidlo sa nedá sledovať', + no_spawn = 'Príliš preplnené miesto' }, success = { - vehicle_parked = "Vozidlo je zaparkované", + vehicle_parked = 'Vozidlo uložené', + vehicle_tracked = 'Vozidlo sledované', + }, + status = { + out = 'Vonku', + garaged = 'V garáži', + impound = 'Zabavené políciou', + house = 'Dům', }, info = { - public_garage = "Verejná Garáž", - gang_garage = "Gang Garáž", - job_garage = "Pracovná Garáž", - house_garage = "Osobná Garáž", - impound = "Odťahovka", - my_vehicles = "Moje vozidlá", - view_stored = "Pozrieť si svoje uložené vozidlá!", - leave_garage = "⬅ Opustiť Garáž", - leave_depot = "⬅ Opustiť depo", - garage = "Garáž: %{value}", - depot = "Deop: %{value}", - out = "Von", - garaged = "Garážované", - impounded = "Zabavené políciou", - garage_line = "State: %{value}
Palivo: %{value2} | Motor: %{value3} | Body: %{value4}", - depot_line = "SPZ: %{value}
Palivo: %{value2} | Motor: %{value3} | Body: %{value4}", - garage_e = "[E] Garáž", - park_e = "[E] Zaparkovať Vozidlo", + car_e = 'E - Garáž', + sea_e = 'E - Lodný hangár', + air_e = 'E - Letecký hangár', + rig_e = 'E - Parkovisko pre vrtnú plošinu', + depot_e = 'E - Depo', + house_garage = 'E - Garáž domu', } } @@ -40,4 +36,4 @@ if GetConvar('qb_locale', 'en') == 'sk' then warnOnMissing = true, fallbackLang = Lang, }) -end +end \ No newline at end of file diff --git a/locales/sv.lua b/locales/sv.lua index 4396218..556c23c 100644 --- a/locales/sv.lua +++ b/locales/sv.lua @@ -1,56 +1,32 @@ local Translations = { error = { - no_vehicles = "Du har inga fordon i det här garaget!", - not_impound = "Ditt fordon är inte beslagtaget", - not_owned = "Du äger inte det här fordonet", - not_correct_type = "Du kan inte parkera den här typen av fordon här", - not_enough = "Inte tillräckligt med pengar", - no_garage = "Ingen", + no_vehicles = 'Det finns inga fordon på den här platsen!', + not_depot = 'Ditt fordon är inte i depån', + not_owned = 'Det går inte att lagra detta fordon', + not_correct_type = 'Du kan inte lagra den här typen av fordon här', + not_enough = 'Inte tillräckligt med pengar', + no_garage = 'Inget', + vehicle_occupied = 'Du kan inte lagra detta fordon eftersom det inte är tomt', + vehicle_not_tracked = 'Det gick inte att spåra fordonet', + no_spawn = 'Området är för trångt' }, success = { - vehicle_parked = "Fordon har parkerats", - }, - menu = { - header = { - house_car = "Husgarage %{value}", - public_car = "Offentligt Garage %{value}", - public_sea = "Offentlig Båthus %{value}", - public_air = "Offentlig Hangar %{value}", - job_car = "Arbetsgarage %{value}", - job_sea = "Arbetsbåthus %{value}", - job_air = "Arbetshangar %{value}", - gang_car = "Gänggarage %{value}", - gang_sea = "Gängbåthus %{value}", - gang_air = "Gänghangar %{value}", - depot_car = "Bilbeslag %{value}", - depot_sea = "Båtbeslag %{value}", - depot_air = "Helikopterbeslag %{value}", - vehicles = "Tillgängliga fordon", - depot = "%{value} [ $%{value2} ]", - garage = "%{value} [ %{value2} ]", - }, - leave = { - car = "⬅ Lämna garage", - sea = "⬅ Lämna båthus", - air = "⬅ Lämna Hangar", - }, - text = { - vehicles = "Visa dina parkerade fordon!", - depot = "Reg.plåt: %{value}
Bränsle: %{value2} | Motorhälsa: %{value3} | Karosshälsa: %{value4}", - garage = "Status: %{value}
Bränsle: %{value2} | Motorhälsa: %{value3} | Karosshälsa: %{value4}", - } + vehicle_parked = 'Fordon lagrat', + vehicle_tracked = 'Fordon spårat', }, status = { - out = "Ute", - garaged = "Parkerad", - impound = "Beslagtaget av Polis", + out = 'Ute', + garaged = 'I garaget', + impound = 'Beslagtaget av polisen', + house = 'Hus', }, info = { - car_e = "[E] Garage", - sea_e = "[E] Båthus", - air_e = "[E] Hangar", - park_e = "[E] Parkera Fordon", - house_garage = "Hus Garage", + car_e = 'E - Garage', + sea_e = 'E - Båthus', + air_e = 'E - Hangar', + rig_e = 'E - Plats för borrigg', + depot_e = 'E - Depå', + house_garage = 'E - Husgarage', } } @@ -60,4 +36,4 @@ if GetConvar('qb_locale', 'en') == 'sv' then warnOnMissing = true, fallbackLang = Lang, }) -end +end \ No newline at end of file diff --git a/locales/tr.lua b/locales/tr.lua index 8e4f90b..68fcb0d 100644 --- a/locales/tr.lua +++ b/locales/tr.lua @@ -1,56 +1,32 @@ local Translations = { error = { - no_vehicles = "Bu konumda ki garajda araç yok!", - not_impound = "Aracınız çekilmişlerde değil", - not_owned = "Bu araç park edilemez", - not_correct_type = "Bu tür bir aracı burada depolayamazsınız", - not_enough = "Yetersiz para", - no_garage = "Hiçbiri", + no_vehicles = 'Bu konumda araç yok!', + not_depot = 'Araç depoda değil', + not_owned = 'Bu araç depolanamaz', + not_correct_type = 'Bu tür bir aracı buraya depolayamazsınız', + not_enough = 'Yeterli para yok', + no_garage = 'Hiç yok', + vehicle_occupied = 'Bu aracı boş olmadığı için depolayamazsınız', + vehicle_not_tracked = 'Araç izlenemedi', + no_spawn = 'Bölge çok kalabalık' }, success = { - vehicle_parked = "Araç park edildi", - }, - menu = { - header = { - house_car = "Ev Garajı %{value}", - public_car = "Garaj %{value}", - public_sea = "Tekne Garajı %{value}", - public_air = "Uçak Garajı %{value}", - job_car = "Meslek Garajı %{value}", - job_sea = "Meslek tekne Garajı %{value}", - job_air = "Meslek uçak garajı %{value}", - gang_car = "Çete garajı %{value}", - gang_sea = "Çete tekne Garaj %{value}", - gang_air = "Çete uçak garajı %{value}", - depot_car = "Depo %{value}", - depot_sea = "Depo %{value}", - depot_air = "Depo %{value}", - vehicles = "Mevcut Araçlar", - depot = "%{value} [ $%{value2} ]", - garage = "%{value} [ %{value2} ]", - }, - leave = { - car = "⬅ Garajdan ayrıl", - sea = "⬅ Tekne garajından ayrıl", - air = "⬅ Uçak garajından ayrıl", - }, - text = { - vehicles = "Depolanan araçları görüntüle!", - depot = "Plaka: %{value} Yakıt: %{value2} | Motor: %{value3} | Gövde: %{value4}", - garage = "Durum: %{value} Yakıt: %{value2} | Motor: %{value3} | Gövde: %{value4}", - } + vehicle_parked = 'Araç depolandı', + vehicle_tracked = 'Araç izlendi', }, status = { - out = "Dışarda", - garaged = "Garajda", - impound = "Çekilmiş", + out = 'Dışarıda', + garaged = 'Garajda', + impound = 'Polis tarafından alıkonuldu', + house = 'Ev', }, info = { - car_e = "[E] Garaj", - sea_e = "[E] Botgarajı", - air_e = "[E] Uçak garajı", - park_e = "[E] Mağaza Aracı", - house_garage = "Ev garajı", + car_e = 'E - Garaj', + sea_e = 'E - Tekne garajı', + air_e = 'E - Hangar', + rig_e = 'E - Sondaj platformu yeri', + depot_e = 'E - Depo', + house_garage = 'E - Ev garajı', } } @@ -60,4 +36,4 @@ if GetConvar('qb_locale', 'en') == 'tr' then warnOnMissing = true, fallbackLang = Lang, }) -end +end \ No newline at end of file diff --git a/player_vehicles.sql b/player_vehicles.sql new file mode 100644 index 0000000..28ee11c --- /dev/null +++ b/player_vehicles.sql @@ -0,0 +1,26 @@ +CREATE TABLE IF NOT EXISTS `player_vehicles` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `license` varchar(50) DEFAULT NULL, + `citizenid` varchar(50) DEFAULT NULL, + `vehicle` varchar(50) DEFAULT NULL, + `hash` varchar(50) DEFAULT NULL, + `mods` longtext DEFAULT NULL, + `plate` varchar(50) NOT NULL, + `fakeplate` varchar(50) DEFAULT NULL, + `garage` varchar(50) DEFAULT NULL, + `fuel` int(11) DEFAULT 100, + `engine` float DEFAULT 1000, + `body` float DEFAULT 1000, + `state` int(11) DEFAULT 1, + `depotprice` int(11) NOT NULL DEFAULT 0, + `drivingdistance` int(50) DEFAULT NULL, + `status` text DEFAULT NULL, + `balance` int(11) NOT NULL DEFAULT 0, + `paymentamount` int(11) NOT NULL DEFAULT 0, + `paymentsleft` int(11) NOT NULL DEFAULT 0, + `financetime` int(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + KEY `plate` (`plate`), + KEY `citizenid` (`citizenid`), + KEY `license` (`license`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; \ No newline at end of file diff --git a/server/main.lua b/server/main.lua index 5be9dfe..fe27a10 100644 --- a/server/main.lua +++ b/server/main.lua @@ -1,330 +1,232 @@ local QBCore = exports['qb-core']:GetCoreObject() local OutsideVehicles = {} -QBCore.Functions.CreateCallback("qb-garage:server:GetGarageVehicles", function(source, cb, garage, type, category) - local src = source - local pData = QBCore.Functions.GetPlayer(src) - if type == "public" then --Public garages give player cars in the garage only - local sharedPublic = '' - if (not Config.SharedPublicGarages) then sharedPublic = sharedPublic..' AND garage = @garage' end - MySQL.query( - 'SELECT * FROM player_vehicles WHERE citizenid = @citizenid AND state = @state'..sharedPublic, - { - ["@citizenid"]= pData.PlayerData.citizenid, - ["@garage"]= garage, - ["@state"]= 1 - }, - function(result) - if result[1] then - cb(result) - else - cb(nil) - end - end - ) - elseif type == "depot" then --Depot give player cars that are not in garage only - MySQL.query('SELECT * FROM player_vehicles WHERE citizenid = ? AND (state = ?)', {pData.PlayerData.citizenid, 0}, function(result) - local tosend = {} - if result[1] then - --Check vehicle type against depot type - for _, vehicle in pairs(result) do - if not OutsideVehicles[vehicle.plate] or not DoesEntityExist(OutsideVehicles[vehicle.plate].entity) then - if category == "air" and ( QBCore.Shared.Vehicles[vehicle.vehicle].category == "helicopters" or QBCore.Shared.Vehicles[vehicle.vehicle].category == "planes" ) then - tosend[#tosend + 1] = vehicle - elseif category == "sea" and QBCore.Shared.Vehicles[vehicle.vehicle].category == "boats" then - tosend[#tosend + 1] = vehicle - elseif category == "car" and QBCore.Shared.Vehicles[vehicle.vehicle].category ~= "helicopters" and QBCore.Shared.Vehicles[vehicle.vehicle].category ~= "planes" and QBCore.Shared.Vehicles[vehicle.vehicle].category ~= "boats" then - tosend[#tosend + 1] = vehicle - end - end - end - cb(tosend) - else - cb(nil) - end - end) - else --House give all cars in the garage, Job and Gang depend of config - local shared = '' - if not Config["SharedGarages"] and type ~= "house" then - shared = " AND citizenid = '"..pData.PlayerData.citizenid.."'" +-- Handler + +AddEventHandler('onResourceStart', function(resource) + if resource == GetCurrentResourceName() then + Wait(100) + if Config['AutoRespawn'] then + MySQL.prepare('UPDATE player_vehicles SET state = 1 WHERE state = 0', {}) end - MySQL.query('SELECT * FROM player_vehicles WHERE garage = ? AND state = ?'..shared, {garage, 1}, function(result) - if result[1] then - cb(result) - else - cb(nil) - end - end) end end) -QBCore.Functions.CreateCallback("qb-garage:server:validateGarageVehicle", function(source, cb, garage, type, plate) - local src = source - local pData = QBCore.Functions.GetPlayer(src) - if type == "public" then --Public garages give player cars in the garage only - local sharedPublic = '' - if (not Config.SharedPublicGarages) then sharedPublic = sharedPublic..' AND garage = @garage' end - MySQL.query( - 'SELECT * FROM player_vehicles WHERE citizenid = @citizenid AND state = @state AND plate = @plate'..sharedPublic, - { - ["@citizenid"]= pData.PlayerData.citizenid, - ["@garage"]= garage, - ["@state"]= 1, - ["@plate"]= plate - }, - function(result) - if result[1] then - cb(true) - else - cb(false) - end - end - ) - elseif type == "depot" then --Depot give player cars that are not in garage only - MySQL.query('SELECT * FROM player_vehicles WHERE citizenid = ? AND (state = ? OR state = ?) AND plate = ?', {pData.PlayerData.citizenid, 0, 2, plate}, function(result) - if result[1] then - cb(true) - else - cb(false) - end - end) - else - local shared = '' - if not Config["SharedGarages"] and type ~= "house" then - shared = " AND citizenid = '"..pData.PlayerData.citizenid.."'" - end - MySQL.query('SELECT * FROM player_vehicles WHERE garage = ? AND state = ? AND plate = ?'..shared, {garage, 1, plate}, function(result) - if result[1] then - cb(true) - else - cb(false) - end - end) +-- Functions + +local vehicleClasses = { + compacts = 0, + sedans = 1, + suvs = 2, + coupes = 3, + muscle = 4, + sportsclassics = 5, + sports = 6, + super = 7, + motorcycles = 8, + offroad = 9, + industrial = 10, + utility = 11, + vans = 12, + cycles = 13, + boats = 14, + helicopters = 15, + planes = 16, + service = 17, + emergency = 18, + military = 19, + commercial = 20, + trains = 21, + openwheel = 22, +} + +local function arrayToSet(array) + local set = {} + for _, item in ipairs(array) do + set[item] = true end -end) + return set +end -QBCore.Functions.CreateCallback("qb-garage:server:checkOwnership", function(source, cb, plate, type, house, gang) - local src = source - local pData = QBCore.Functions.GetPlayer(src) - if type == "public" then --Public garages only for player cars - MySQL.query('SELECT * FROM player_vehicles WHERE plate = ? AND citizenid = ?',{plate, pData.PlayerData.citizenid}, function(result) - if result[1] then - cb(true) - else - cb(false) - end - end) - elseif type == "house" then --House garages only for player cars that have keys of the house - MySQL.query('SELECT * FROM player_vehicles WHERE plate = ?', {plate}, function(result) - if result[1] then - local hasHouseKey = exports['qb-houses']:hasKey(result[1].license, result[1].citizenid, house) - if hasHouseKey then - cb(true) - else - cb(false) - end - else - cb(false) - end - end) - elseif type == "gang" then --Gang garages only for gang members cars (for sharing) - MySQL.query('SELECT * FROM player_vehicles WHERE plate = ?', {plate}, function(result) - if result[1] then - --Check if found owner is part of the gang - local resultplayer = MySQL.single.await('SELECT * FROM players WHERE citizenid = ?', { result[1].citizenid }) - if resultplayer then - local playergang = json.decode(resultplayer.gang) - if playergang.name == gang then - cb(true) - else - cb(false) - end - else - cb(false) - end - else - cb(false) - end - end) - else --Job garages only for cars that are owned by someone (for sharing and service) or only by player depending of config - local shared = '' - if not Config["SharedGarages"] then - shared = " AND citizenid = '"..pData.PlayerData.citizenid.."'" +local function filterVehiclesByCategory(vehicles, category) + local filtered = {} + local categorySet = arrayToSet(category) + + for _, vehicle in pairs(vehicles) do + local vehicleData = QBCore.Shared.Vehicles[vehicle.vehicle] + local vehicleCategoryString = vehicleData and vehicleData.category or 'compacts' + local vehicleCategoryNumber = vehicleClasses[vehicleCategoryString] + + if vehicleCategoryNumber and categorySet[vehicleCategoryNumber] then + filtered[#filtered + 1] = vehicle end - MySQL.query('SELECT * FROM player_vehicles WHERE plate = ?'..shared, {plate}, function(result) - if result[1] then - cb(true) - else - cb(false) - end - end) + end + + return filtered +end + +-- Callbacks + +QBCore.Functions.CreateCallback('qb-garages:server:GetGarageVehicles', function(source, cb, garage, type, category) + local Player = QBCore.Functions.GetPlayer(source) + if not Player then return end + local citizenId = Player.PlayerData.citizenid + + local vehicles + + if type == 'depot' then + vehicles = MySQL.prepare.await('SELECT * FROM player_vehicles WHERE citizenid = ? AND depotprice > 0', { citizenId }) + elseif Config.SharedGarages then + vehicles = MySQL.prepare.await('SELECT * FROM player_vehicles WHERE citizenid = ?', { citizenId }) + else + vehicles = MySQL.prepare.await('SELECT * FROM player_vehicles WHERE citizenid = ? AND garage = ?', { citizenId, garage }) + end + if not vehicles then + cb(nil) + return + end + if Config.ClassSystem then + local filteredVehicles = filterVehiclesByCategory(vehicles, category) + cb(filteredVehicles) + else + cb(vehicles) end end) -QBCore.Functions.CreateCallback('qb-garage:server:spawnvehicle', function (source, cb, vehInfo, coords, warp) - local plate = vehInfo.plate - local veh = QBCore.Functions.SpawnVehicle(source, vehInfo.vehicle, coords, warp) +-- Spawns a vehicle and returns its network ID and properties. +QBCore.Functions.CreateCallback('qb-garages:server:spawnvehicle', function(source, cb, plate, vehicle, coords, warp) + local veh = QBCore.Functions.SpawnVehicle(source, vehicle, coords, warp) SetEntityHeading(veh, coords.w) SetVehicleNumberPlateText(veh, plate) local vehProps = {} - local result = MySQL.query.await('SELECT mods FROM player_vehicles WHERE plate = ?', {plate}) - if result[1] then vehProps = json.decode(result[1].mods) end + local result = MySQL.prepare.await('SELECT mods FROM player_vehicles WHERE plate = ?', { plate }) + if result and result[1] then vehProps = json.decode(result[1].mods) end local netId = NetworkGetNetworkIdFromEntity(veh) - OutsideVehicles[plate] = {netID = netId, entity = veh} + OutsideVehicles[plate] = { netID = netId, entity = veh } cb(netId, vehProps) end) -QBCore.Functions.CreateCallback("qb-garage:server:GetVehicleProperties", function(_, cb, plate) - local properties = {} - local result = MySQL.query.await('SELECT mods FROM player_vehicles WHERE plate = ?', {plate}) - if result[1] then - properties = json.decode(result[1].mods) +-- Checks if a vehicle can be spawned based on its type and location. +QBCore.Functions.CreateCallback('qb-garages:server:IsSpawnOk', function(_, cb, plate, type) + if OutsideVehicles[plate] and DoesEntityExist(OutsideVehicles[plate].entity) then + cb(false) + return end - cb(properties) + cb(true) end) -QBCore.Functions.CreateCallback("qb-garage:server:IsSpawnOk", function(_, cb, plate, type) - if type == "depot" then --If depot, check if vehicle is not already spawned on the map - if OutsideVehicles[plate] and DoesEntityExist(OutsideVehicles[plate].entity) then - cb(false) - else - cb(true) - end - else +QBCore.Functions.CreateCallback('qb-garages:server:canDeposit', function(source, cb, plate, type, garage, state) + local Player = QBCore.Functions.GetPlayer(source) + local isOwned = MySQL.scalar.await('SELECT citizenid FROM player_vehicles WHERE plate = ? LIMIT 1', { plate }) + if isOwned ~= Player.PlayerData.citizenid then + cb(false) + return + end + if type == 'house' and not exports['qb-houses']:hasKey(Player.PlayerData.license, Player.PlayerData.citizenid, Config.HouseGarages[garage].label) then + cb(false) + return + end + if state == 1 then + MySQL.update('UPDATE player_vehicles SET state = ?, garage = ? WHERE plate = ?', { state, garage, plate }) cb(true) + else + cb(false) end end) -RegisterNetEvent('qb-garage:server:updateVehicle', function(state, fuel, engine, body, plate, garage, type, gang) - QBCore.Functions.TriggerCallback('qb-garage:server:checkOwnership', source, function(owned) --Check ownership - if owned then - if state == 0 or state == 1 or state == 2 then --Check state value - if type ~= "house" then - if Config.Garages[garage] then --Check if garage is existing - MySQL.update('UPDATE player_vehicles SET state = ?, garage = ?, fuel = ?, engine = ?, body = ? WHERE plate = ?', {state, garage, fuel, engine, body, plate}) - end - else - MySQL.update('UPDATE player_vehicles SET state = ?, garage = ?, fuel = ?, engine = ?, body = ? WHERE plate = ?', {state, garage, fuel, engine, body, plate}) - end - end - else - TriggerClientEvent('QBCore:Notify', source, Lang:t("error.not_owned"), 'error') - end - end, plate, type, garage, gang) -end) +-- Events -RegisterNetEvent('qb-garage:server:updateVehicleState', function(state, plate, garage) - local type - if Config.Garages[garage] then - type = Config.Garages[garage].type - else - type = "house" - end +RegisterNetEvent('qb-garages:server:updateVehicleStats', function(plate, fuel, engine, body) + MySQL.prepare('UPDATE player_vehicles SET fuel = ?, engine = ?, body = ? WHERE plate = ?', { fuel, engine, body, plate }) +end) - QBCore.Functions.TriggerCallback('qb-garage:server:validateGarageVehicle', source, function(owned) --Check ownership - if owned then - if state == 0 then --Check state value - MySQL.update('UPDATE player_vehicles SET state = ?, depotprice = ? WHERE plate = ?', {state, 0, plate}) - end - else - TriggerClientEvent('QBCore:Notify', source, Lang:t("error.not_owned"), 'error') - end - end, garage, type, plate) +RegisterNetEvent('qb-garages:server:updateVehicleState', function(state, plate) + MySQL.prepare('UPDATE player_vehicles SET state = ?, depotprice = ? WHERE plate = ?', { state, 0, plate }) end) -RegisterNetEvent('qb-garages:server:UpdateOutsideVehicle', function(plate, vehicle) - local entity = NetworkGetEntityFromNetworkId(vehicle) - OutsideVehicles[plate] = {netID = vehicle, entity = entity} +RegisterNetEvent('qb-garages:server:UpdateOutsideVehicle', function(plate, vehicleNetID) + OutsideVehicles[plate] = { + netID = vehicleNetID, + entity = NetworkGetEntityFromNetworkId(vehicleNetID) + } end) -AddEventHandler('onResourceStart', function(resource) - if resource == GetCurrentResourceName() then - Wait(100) - if Config["AutoRespawn"] then - MySQL.update('UPDATE player_vehicles SET state = 1 WHERE state = 0', {}) - end +RegisterNetEvent('qb-garages:server:trackVehicle', function(plate) + local src = source + local vehicleData = OutsideVehicles[plate] + if vehicleData and DoesEntityExist(vehicleData.entity) then + TriggerClientEvent('qb-garages:client:trackVehicle', src, GetEntityCoords(vehicleData.entity)) + TriggerClientEvent('QBCore:Notify', src, Lang:t('success.vehicle_tracked'), 'success') + else + TriggerClientEvent('QBCore:Notify', src, Lang:t('error.vehicle_not_tracked'), 'error') end end) -RegisterNetEvent('qb-garage:server:PayDepotPrice', function(data) +RegisterNetEvent('qb-garages:server:PayDepotPrice', function(data) local src = source local Player = QBCore.Functions.GetPlayer(src) - local cashBalance = Player.PlayerData.money["cash"] - local bankBalance = Player.PlayerData.money["bank"] - - local vehicle = data.vehicle - - MySQL.query('SELECT * FROM player_vehicles WHERE plate = ?', {vehicle.plate}, function(result) - if result[1] then - if cashBalance >= result[1].depotprice then - Player.Functions.RemoveMoney("cash", result[1].depotprice, "paid-depot") - TriggerClientEvent("qb-garages:client:takeOutGarage", src, data) - elseif bankBalance >= result[1].depotprice then - Player.Functions.RemoveMoney("bank", result[1].depotprice, "paid-depot") - TriggerClientEvent("qb-garages:client:takeOutGarage", src, data) + local cashBalance = Player.PlayerData.money['cash'] + local bankBalance = Player.PlayerData.money['bank'] + MySQL.scalar('SELECT depotprice FROM player_vehicles WHERE plate = ?', { data.plate }, function(result) + if result then + local depotPrice = result[1].depotprice + + if cashBalance >= depotPrice then + Player.Functions.RemoveMoney('cash', depotPrice, 'paid-depot') + TriggerClientEvent('qb-garages:client:takeOutGarage', src, data) + elseif bankBalance >= depotPrice then + Player.Functions.RemoveMoney('bank', depotPrice, 'paid-depot') + TriggerClientEvent('qb-garages:client:takeOutGarage', src, data) else - TriggerClientEvent('QBCore:Notify', src, Lang:t("error.not_enough"), 'error') + TriggerClientEvent('QBCore:Notify', src, Lang:t('error.not_enough'), 'error') end end end) end) - - ---External Calls ---Call from qb-vehiclesales -QBCore.Functions.CreateCallback("qb-garage:server:checkVehicleOwner", function(source, cb, plate) - local src = source - local pData = QBCore.Functions.GetPlayer(src) - MySQL.query('SELECT * FROM player_vehicles WHERE plate = ? AND citizenid = ?',{plate, pData.PlayerData.citizenid}, function(result) - if result[1] then - cb(true, result[1].balance) - else - cb(false) - end - end) -end) - --Call from qb-phone -QBCore.Functions.CreateCallback('qb-garage:server:GetPlayerVehicles', function(source, cb) + +QBCore.Functions.CreateCallback('qb-garages:server:GetPlayerVehicles', function(source, cb) local Player = QBCore.Functions.GetPlayer(source) local Vehicles = {} - MySQL.query('SELECT * FROM player_vehicles WHERE citizenid = ?', {Player.PlayerData.citizenid}, function(result) + MySQL.query('SELECT * FROM player_vehicles WHERE citizenid = ?', { Player.PlayerData.citizenid }, function(result) if result[1] then for _, v in pairs(result) do local VehicleData = QBCore.Shared.Vehicles[v.vehicle] - local VehicleGarage = Lang:t("error.no_garage") + local VehicleGarage = Lang:t('error.no_garage') if v.garage ~= nil then if Config.Garages[v.garage] ~= nil then VehicleGarage = Config.Garages[v.garage].label else - VehicleGarage = Lang:t("info.house_garage") -- HouseGarages[v.garage].label + VehicleGarage = Lang:t('info.house') end end + local stateTranslation if v.state == 0 then - v.state = Lang:t("status.out") + stateTranslation = Lang:t('status.out') elseif v.state == 1 then - v.state = Lang:t("status.garaged") + stateTranslation = Lang:t('status.garaged') elseif v.state == 2 then - v.state = Lang:t("status.impound") + stateTranslation = Lang:t('status.impound') end local fullname - if VehicleData["brand"] ~= nil then - fullname = VehicleData["brand"] .. " " .. VehicleData["name"] + if VehicleData and VehicleData['brand'] then + fullname = VehicleData['brand'] .. ' ' .. VehicleData['name'] else - fullname = VehicleData["name"] + fullname = VehicleData and VehicleData['name'] or 'Unknown Vehicle' end - Vehicles[#Vehicles+1] = { + + Vehicles[#Vehicles] = { fullname = fullname, - brand = VehicleData["brand"], - model = VehicleData["name"], + brand = VehicleData and VehicleData['brand'] or '', + model = VehicleData and VehicleData['name'] or '', plate = v.plate, garage = VehicleGarage, - state = v.state, + state = stateTranslation, fuel = v.fuel, engine = v.engine, body = v.body @@ -336,25 +238,3 @@ QBCore.Functions.CreateCallback('qb-garage:server:GetPlayerVehicles', function(s end end) end) - -local function getAllGarages() - local garages = {} - for k, v in pairs(Config.Garages) do - garages[#garages+1] = { - name = k, - label = v.label, - type = v.type, - takeVehicle = v.takeVehicle, - putVehicle = v.putVehicle, - spawnPoint = v.spawnPoint, - showBlip = v.showBlip, - blipName = v.blipName, - blipNumber = v.blipNumber, - blipColor = v.blipColor, - vehicle = v.vehicle - } - end - return garages -end - -exports('getAllGarages', getAllGarages) \ No newline at end of file