1
0
Fork 0
forked from Simnation/Main
This commit is contained in:
Nordi98 2025-08-06 15:36:50 +02:00
parent 6d22d5f77c
commit 63fbc60a00
86 changed files with 8352 additions and 3428 deletions

View file

@ -1,488 +1,488 @@
-- logs text to the console
function Log(text)
if (Config.isDebug) then
Log(text)
end
end
-- Return all vehicle modifications in an array
function GetVehicleModifications(vehicle)
local color1, color2 = GetVehicleColours(vehicle)
local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle)
local extras = {}
for i = 0, 20, 1 do
if (DoesExtraExist(vehicle, i)) then
if (IsVehicleExtraTurnedOn(vehicle, i)) then
table.insert(extras, { i, 0 })
else
table.insert(extras, { i, 1 })
end
end
end
local tiresBurst = {}
for i = 0, 5, 1 do
if (IsVehicleTyreBurst(vehicle, i, true)) then
table.insert(tiresBurst, { i, true })
elseif (IsVehicleTyreBurst(vehicle, i, false)) then
table.insert(tiresBurst, { i, false })
end
end
local doorsMissing = {}
for i = 0, 7, 1 do
if (IsVehicleDoorDamaged(vehicle, i)) then
table.insert(doorsMissing, i)
end
end
local windowsBroken = {}
--for i = 0, 13, 1 do
-- if (not IsVehicleWindowIntact(vehicle, i)) then
-- table.insert(windowsBroken, i)
-- end
--end
-- custom colors
local hasCustomPrimaryColor = GetIsVehiclePrimaryColourCustom(vehicle)
local customPrimaryColor = nil
if (hasCustomPrimaryColor) then
local r, g, b = GetVehicleCustomPrimaryColour(vehicle)
customPrimaryColor = { r, g, b }
end
local hasCustomSecondaryColor = GetIsVehicleSecondaryColourCustom(vehicle)
local customSecondaryColor = nil
if (hasCustomSecondaryColor) then
local r, g, b = GetVehicleCustomSecondaryColour(vehicle)
customSecondaryColor = { r, g, b }
end
return {
-- 1 model
GetEntityModel(vehicle),
-- 2 lockStatus
GetVehicleDoorLockStatus(vehicle),
-- 3 health
math.floor(GetEntityHealth(vehicle) * 10.0) / 10.0,
-- 4 bodyHealth
math.floor(GetVehicleBodyHealth(vehicle) * 10.0) / 10.0,
-- 5 engineHealth
math.floor(GetVehicleEngineHealth(vehicle) * 10.0) / 10.0,
-- 6 petrolTankHealth
math.floor(GetVehiclePetrolTankHealth(vehicle) * 10.0) / 10.0,
-- 7 dirtLevel
math.floor(GetVehicleDirtLevel(vehicle) * 10.0) / 10.0,
-- 8 fuelLevel
math.floor(exports[Config.exports]:GetFuel(vehicle) * 10.0) / 10.0,
---------------------------------------------------------------------- Implementierung Miho
--math.floor(DecorGetFloat(vehicle, Config.FuelDecor)*10) / 10.0,
---------------------------------------------------------------------- Implementierung Miho ENDE
-- 9 plateIndex
GetVehicleNumberPlateTextIndex(vehicle),
-- 10 primaryColor
color1,
-- 11 secondaryColor
color2,
-- 12 pearlescentColor
pearlescentColor,
-- 13 wheelColor
wheelColor,
-- 14 wheelType
GetVehicleWheelType(vehicle),
-- 15 customWheelsFront
GetVehicleModVariation(vehicle, 23);
-- 16 customWheelsBack
GetVehicleModVariation(vehicle, 24);
-- 17 windowTint
GetVehicleWindowTint(vehicle),
-- 18 enabledNeon
{
IsVehicleNeonLightEnabled(vehicle, 0),
IsVehicleNeonLightEnabled(vehicle, 1),
IsVehicleNeonLightEnabled(vehicle, 2),
IsVehicleNeonLightEnabled(vehicle, 3),
},
-- 19 neonColor
table.pack(GetVehicleNeonLightsColour(vehicle)),
-- 20 tireSmokeColor
table.pack(GetVehicleTyreSmokeColor(vehicle)),
-- 21 extras
extras,
-- 22-32 mods
GetVehicleMod(vehicle, 0),
GetVehicleMod(vehicle, 1),
GetVehicleMod(vehicle, 2),
GetVehicleMod(vehicle, 3),
GetVehicleMod(vehicle, 4),
GetVehicleMod(vehicle, 5),
GetVehicleMod(vehicle, 6),
GetVehicleMod(vehicle, 7),
GetVehicleMod(vehicle, 8),
GetVehicleMod(vehicle, 9),
GetVehicleMod(vehicle, 10),
-- 33-38 mods
GetVehicleMod(vehicle, 11),
GetVehicleMod(vehicle, 12),
GetVehicleMod(vehicle, 13),
GetVehicleMod(vehicle, 14),
GetVehicleMod(vehicle, 15),
GetVehicleMod(vehicle, 16),
-- 39-41 mods
IsToggleModOn(vehicle, 18),
IsToggleModOn(vehicle, 20),
IsToggleModOn(vehicle, 22),
-- 42-43 mods
GetVehicleMod(vehicle, 23),
GetVehicleMod(vehicle, 24),
-- 44-66 mods
GetVehicleMod(vehicle, 25),
GetVehicleMod(vehicle, 26),
GetVehicleMod(vehicle, 27),
GetVehicleMod(vehicle, 28),
GetVehicleMod(vehicle, 29),
GetVehicleMod(vehicle, 30),
GetVehicleMod(vehicle, 31),
GetVehicleMod(vehicle, 32),
GetVehicleMod(vehicle, 33),
GetVehicleMod(vehicle, 34),
GetVehicleMod(vehicle, 35),
GetVehicleMod(vehicle, 36),
GetVehicleMod(vehicle, 37),
GetVehicleMod(vehicle, 38),
GetVehicleMod(vehicle, 39),
GetVehicleMod(vehicle, 40),
GetVehicleMod(vehicle, 41),
GetVehicleMod(vehicle, 42),
GetVehicleMod(vehicle, 43),
GetVehicleMod(vehicle, 44),
GetVehicleMod(vehicle, 45),
GetVehicleMod(vehicle, 46),
GetVehicleMod(vehicle, 48),
-- 67 livery
GetVehicleLivery(vehicle),
-- 68 missingDoors
doorsMissing,
-- 69 bulletproofTires
not GetVehicleTyresCanBurst(vehicle),
-- 70 tiresBurst
tiresBurst,
-- 71 brokenWindows
windowsBroken,
-- 72 xenon lights
GetVehicleXenonLightsColour(vehicle),
-- 73 custom primary color
customPrimaryColor,
-- 74 custom secondary color
customSecondaryColor,
-- 75 interior color
GetVehicleInteriorColor(vehicle)
}
end
-- Apply all modifications to a vehicle entity
function SetVehicleModifications(vehicle, plate, modifications)
SetVehicleModKit(vehicle, 0)
-- plate
SetVehicleNumberPlateText(vehicle, plate)
SetVehicleNumberPlateTextIndex(vehicle, modifications[9])
-- lockStatus
SetVehicleDoorsLocked(vehicle, modifications[2])
-- colours
SetVehicleColours(vehicle, modifications[10], modifications[11])
if (modifications[73]) then
SetVehicleCustomPrimaryColour(vehicle, modifications[73][1], modifications[73][2], modifications[73][3])
end
if (modifications[74]) then
SetVehicleCustomSecondaryColour(vehicle, modifications[74][1], modifications[74][2], modifications[74][3])
end
if (modifications[75]) then
SetVehicleInteriorColor(vehicle, modifications[75])
end
SetVehicleExtraColours(vehicle, modifications[12], modifications[13])
SetVehicleTyreSmokeColor(vehicle, modifications[20][1], modifications[20][2], modifications[20][3])
-- wheels
SetVehicleWheelType(vehicle, modifications[14])
-- windows
SetVehicleWindowTint(vehicle, modifications[17])
-- neonlight
SetVehicleNeonLightEnabled(vehicle, 0, modifications[18][1])
SetVehicleNeonLightEnabled(vehicle, 1, modifications[18][2])
SetVehicleNeonLightEnabled(vehicle, 2, modifications[18][3])
SetVehicleNeonLightEnabled(vehicle, 3, modifications[18][4])
SetVehicleNeonLightsColour(vehicle, modifications[19][1], modifications[19][2], modifications[19][3])
-- mods
SetVehicleMod(vehicle, 0, modifications[22], modifications[15])
SetVehicleMod(vehicle, 1, modifications[23], modifications[15])
SetVehicleMod(vehicle, 2, modifications[24], modifications[15])
SetVehicleMod(vehicle, 3, modifications[25], modifications[15])
SetVehicleMod(vehicle, 4, modifications[26], modifications[15])
SetVehicleMod(vehicle, 5, modifications[27], modifications[15])
SetVehicleMod(vehicle, 6, modifications[28], modifications[15])
SetVehicleMod(vehicle, 7, modifications[29], modifications[15])
SetVehicleMod(vehicle, 8, modifications[30], modifications[15])
SetVehicleMod(vehicle, 9, modifications[31], modifications[15])
SetVehicleMod(vehicle, 10, modifications[32], modifications[15])
SetVehicleMod(vehicle, 11, modifications[33], modifications[15])
SetVehicleMod(vehicle, 12, modifications[34], modifications[15])
SetVehicleMod(vehicle, 13, modifications[35], modifications[15])
SetVehicleMod(vehicle, 14, modifications[36], modifications[15])
SetVehicleMod(vehicle, 15, modifications[37], modifications[15])
SetVehicleMod(vehicle, 16, modifications[38], modifications[15])
ToggleVehicleMod(vehicle, 18, modifications[39])
ToggleVehicleMod(vehicle, 20, modifications[40])
ToggleVehicleMod(vehicle, 22, modifications[41])
SetVehicleMod(vehicle, 23, modifications[42], modifications[15])
SetVehicleMod(vehicle, 24, modifications[43], modifications[16])
SetVehicleMod(vehicle, 25, modifications[44], modifications[15])
SetVehicleMod(vehicle, 26, modifications[45], modifications[15])
SetVehicleMod(vehicle, 27, modifications[46], modifications[15])
SetVehicleMod(vehicle, 28, modifications[47], modifications[15])
SetVehicleMod(vehicle, 29, modifications[48], modifications[15])
SetVehicleMod(vehicle, 30, modifications[49], modifications[15])
SetVehicleMod(vehicle, 31, modifications[50], modifications[15])
SetVehicleMod(vehicle, 32, modifications[51], modifications[15])
SetVehicleMod(vehicle, 33, modifications[52], modifications[15])
SetVehicleMod(vehicle, 34, modifications[53], modifications[15])
SetVehicleMod(vehicle, 35, modifications[54], modifications[15])
SetVehicleMod(vehicle, 36, modifications[55], modifications[15])
SetVehicleMod(vehicle, 37, modifications[56], modifications[15])
SetVehicleMod(vehicle, 38, modifications[57], modifications[15])
SetVehicleMod(vehicle, 39, modifications[58], modifications[15])
SetVehicleMod(vehicle, 40, modifications[59], modifications[15])
SetVehicleMod(vehicle, 41, modifications[60], modifications[15])
SetVehicleMod(vehicle, 42, modifications[61], modifications[15])
SetVehicleMod(vehicle, 43, modifications[62], modifications[15])
SetVehicleMod(vehicle, 44, modifications[63], modifications[15])
SetVehicleMod(vehicle, 45, modifications[64], modifications[15])
SetVehicleMod(vehicle, 46, modifications[65], modifications[15])
SetVehicleMod(vehicle, 48, modifications[66], modifications[15])
SetVehicleLivery(vehicle, modifications[67])
-- extras
for i = 1, #modifications[21], 1 do
SetVehicleExtra(vehicle, modifications[21][i][1], modifications[21][i][2])
end
-- stats
SetEntityHealth(vehicle, modifications[3])
SetVehicleBodyHealth(vehicle, modifications[4])
SetVehicleEngineHealth(vehicle, modifications[5])
SetVehiclePetrolTankHealth(vehicle, modifications[6])
if (Config.renderScorched and (modifications[5] < -3999.0 or modifications[6] < -999.0)) then
TriggerServerEvent("mh_Parking:renderScorched", NetworkGetNetworkIdFromEntity(vehicle), true)
end
SetVehicleDirtLevel(vehicle, modifications[7])
exports[Config.exports]:SetFuel(vehicle, modifications[8])
---------------------------------------------------------------------- Implementierung Miho
--[[
fuel = modifications[8]
if type(fuel) == 'number' and fuel >= 0 and fuel <= 100 then
SetVehicleFuelLevel(vehicle, fuel + 0.0)
DecorSetFloat(vehicle, Config.FuelDecor, GetVehicleFuelLevel(vehicle))
end
]]
---------------------------------------------------------------------- Implementierung Miho ENDE
-- doors
for i = 1, #modifications[68], 1 do
SetVehicleDoorBroken(vehicle, modifications[68][i], true)
end
-- tires
SetVehicleTyresCanBurst(vehicle, not modifications[69])
if (not modifications[69]) then
for i = 1, #modifications[70], 1 do
SetVehicleTyreBurst(vehicle, modifications[70][i][1], modifications[70][i][2], 1000.0)
end
end
-- windows
for i = 1, #modifications[71], 1 do
SmashVehicleWindow(vehicle, modifications[71][i])
end
-- xenon lights
if (modifications[72]) then
SetVehicleXenonLightsColour(vehicle, modifications[72])
end
end
-- Return closest loaded vehicle entity or nil if no vehicle is found
function GetClosestVehicle(position, maxRadius)
local vehicles = GetAllVehicles()
local dist = maxRadius
local closestVehicle = nil
for i=1, #vehicles, 1 do
local vehicleCoords = GetEntityCoords(vehicles[i])
local tempDist = Vdist(vehicleCoords.x, vehicleCoords.y, vehicleCoords.z, position.x, position.y, position.z)
if (tempDist < dist) then
dist = tempDist
closestVehicle = vehicles[i]
end
end
if (closestVehicle ~= nil and DoesEntityExist(closestVehicle)) then
return closestVehicle
else
return nil
end
end
-- Returns all loaded vehicles on client side
function GetAllVehicles()
local vehicles = {}
for vehicle in EnumerateVehicles() do
table.insert(vehicles, vehicle)
end
return vehicles
end
function IsVehicleBlacklisted(vehicle)
-- check class
local class = GetVehicleClass(vehicle)
for i = 1, #Config.classesBlacklist, 1 do
if (class == Config.classesBlacklist[i]) then
return true
end
end
-- check model
local modelHash = GetEntityModel(vehicle)
for i = 1, #Config.vehiclesBlacklist, 1 do
if (modelHash == Config.vehiclesBlacklist[i]) then
return true
end
end
return false
end
function GetVehiclePosition(plate)
if (GetResourceState("kimi_callbacks") ~= "started") then
Log("^1[ERROR] \"kimi_callbacks\" is either not installed properly or hasn't been started!")
Log("^1[ERROR] The export \"GetVehiclePosition\" can only be used when having this resource installed.")
return nil
end
if (plate == nil) then
Log("^1[ERROR] \"plate\" was nil while trying to call export \"GetVehiclePosition\"!")
return nil
end
if (type(plate) ~= "string") then
Log("^1[ERROR] \"plate\" (\"" .. plate .. "\") needs to be of type string when calling export \"GetVehiclePosition\"!")
return nil
end
local position = exports["kimi_callbacks"]:Trigger("AP:getVehiclePosition", plate:upper())
return position
end
function GetVehiclePositions(...)
if (GetResourceState("kimi_callbacks") ~= "started") then
Log("^1[ERROR] \"kimi_callbacks\" is either not installed properly or hasn't been started!")
Log("^1[ERROR] The export \"GetVehiclePositions\" can only be used when having this resource installed.")
return nil
end
local plates = { ... }
for i, plate in ipairs(plates) do
if (plate == nil) then
Log("^1[ERROR] \"plate\" (Index: \"" .. i .. "\") was nil while trying to call export \"GetVehiclePositions\"!")
return nil
end
if (type(plate) ~= "string") then
Log("^1[ERROR] \"plate\" (\"" .. plate .. "\") (Index: " .. i .. ") needs to be of type string when calling export \"GetVehiclePositions\"!")
return nil
end
plates[i] = plates[i]:upper()
end
local data = exports["kimi_callbacks"]:Trigger("AP:getVehiclePositions", plates)
return data
end
-- getting all vehicles
function EnumerateVehicles()
return EnumerateEntities(FindFirstVehicle, FindNextVehicle, EndFindVehicle)
end
function EnumerateEntities(initFunc, moveFunc, disposeFunc)
return coroutine.wrap(function()
local iter, id = initFunc()
if not id or id == 0 then
disposeFunc(iter)
return
end
local enum = {handle = iter, destructor = disposeFunc}
setmetatable(enum, entityEnumerator)
local next = true
repeat
coroutine.yield(id)
next, id = moveFunc(iter)
until not next
enum.destructor, enum.handle = nil, nil
disposeFunc(iter)
end)
end
local entityEnumerator = {
__gc = function(enum)
if enum.destructor and enum.handle then
enum.destructor(enum.handle)
end
enum.destructor = nil
enum.handle = nil
end
}
-- logs text to the console
function Log(text)
if (Config.isDebug) then
Log(text)
end
end
-- Return all vehicle modifications in an array
function GetVehicleModifications(vehicle)
local color1, color2 = GetVehicleColours(vehicle)
local pearlescentColor, wheelColor = GetVehicleExtraColours(vehicle)
local extras = {}
for i = 0, 20, 1 do
if (DoesExtraExist(vehicle, i)) then
if (IsVehicleExtraTurnedOn(vehicle, i)) then
table.insert(extras, { i, 0 })
else
table.insert(extras, { i, 1 })
end
end
end
local tiresBurst = {}
for i = 0, 5, 1 do
if (IsVehicleTyreBurst(vehicle, i, true)) then
table.insert(tiresBurst, { i, true })
elseif (IsVehicleTyreBurst(vehicle, i, false)) then
table.insert(tiresBurst, { i, false })
end
end
local doorsMissing = {}
for i = 0, 7, 1 do
if (IsVehicleDoorDamaged(vehicle, i)) then
table.insert(doorsMissing, i)
end
end
local windowsBroken = {}
--for i = 0, 13, 1 do
-- if (not IsVehicleWindowIntact(vehicle, i)) then
-- table.insert(windowsBroken, i)
-- end
--end
-- custom colors
local hasCustomPrimaryColor = GetIsVehiclePrimaryColourCustom(vehicle)
local customPrimaryColor = nil
if (hasCustomPrimaryColor) then
local r, g, b = GetVehicleCustomPrimaryColour(vehicle)
customPrimaryColor = { r, g, b }
end
local hasCustomSecondaryColor = GetIsVehicleSecondaryColourCustom(vehicle)
local customSecondaryColor = nil
if (hasCustomSecondaryColor) then
local r, g, b = GetVehicleCustomSecondaryColour(vehicle)
customSecondaryColor = { r, g, b }
end
return {
-- 1 model
GetEntityModel(vehicle),
-- 2 lockStatus
GetVehicleDoorLockStatus(vehicle),
-- 3 health
math.floor(GetEntityHealth(vehicle) * 10.0) / 10.0,
-- 4 bodyHealth
math.floor(GetVehicleBodyHealth(vehicle) * 10.0) / 10.0,
-- 5 engineHealth
math.floor(GetVehicleEngineHealth(vehicle) * 10.0) / 10.0,
-- 6 petrolTankHealth
math.floor(GetVehiclePetrolTankHealth(vehicle) * 10.0) / 10.0,
-- 7 dirtLevel
math.floor(GetVehicleDirtLevel(vehicle) * 10.0) / 10.0,
-- 8 fuelLevel
math.floor(exports[Config.exports]:GetFuel(vehicle) * 10.0) / 10.0,
---------------------------------------------------------------------- Implementierung Miho
--math.floor(DecorGetFloat(vehicle, Config.FuelDecor)*10) / 10.0,
---------------------------------------------------------------------- Implementierung Miho ENDE
-- 9 plateIndex
GetVehicleNumberPlateTextIndex(vehicle),
-- 10 primaryColor
color1,
-- 11 secondaryColor
color2,
-- 12 pearlescentColor
pearlescentColor,
-- 13 wheelColor
wheelColor,
-- 14 wheelType
GetVehicleWheelType(vehicle),
-- 15 customWheelsFront
GetVehicleModVariation(vehicle, 23);
-- 16 customWheelsBack
GetVehicleModVariation(vehicle, 24);
-- 17 windowTint
GetVehicleWindowTint(vehicle),
-- 18 enabledNeon
{
IsVehicleNeonLightEnabled(vehicle, 0),
IsVehicleNeonLightEnabled(vehicle, 1),
IsVehicleNeonLightEnabled(vehicle, 2),
IsVehicleNeonLightEnabled(vehicle, 3),
},
-- 19 neonColor
table.pack(GetVehicleNeonLightsColour(vehicle)),
-- 20 tireSmokeColor
table.pack(GetVehicleTyreSmokeColor(vehicle)),
-- 21 extras
extras,
-- 22-32 mods
GetVehicleMod(vehicle, 0),
GetVehicleMod(vehicle, 1),
GetVehicleMod(vehicle, 2),
GetVehicleMod(vehicle, 3),
GetVehicleMod(vehicle, 4),
GetVehicleMod(vehicle, 5),
GetVehicleMod(vehicle, 6),
GetVehicleMod(vehicle, 7),
GetVehicleMod(vehicle, 8),
GetVehicleMod(vehicle, 9),
GetVehicleMod(vehicle, 10),
-- 33-38 mods
GetVehicleMod(vehicle, 11),
GetVehicleMod(vehicle, 12),
GetVehicleMod(vehicle, 13),
GetVehicleMod(vehicle, 14),
GetVehicleMod(vehicle, 15),
GetVehicleMod(vehicle, 16),
-- 39-41 mods
IsToggleModOn(vehicle, 18),
IsToggleModOn(vehicle, 20),
IsToggleModOn(vehicle, 22),
-- 42-43 mods
GetVehicleMod(vehicle, 23),
GetVehicleMod(vehicle, 24),
-- 44-66 mods
GetVehicleMod(vehicle, 25),
GetVehicleMod(vehicle, 26),
GetVehicleMod(vehicle, 27),
GetVehicleMod(vehicle, 28),
GetVehicleMod(vehicle, 29),
GetVehicleMod(vehicle, 30),
GetVehicleMod(vehicle, 31),
GetVehicleMod(vehicle, 32),
GetVehicleMod(vehicle, 33),
GetVehicleMod(vehicle, 34),
GetVehicleMod(vehicle, 35),
GetVehicleMod(vehicle, 36),
GetVehicleMod(vehicle, 37),
GetVehicleMod(vehicle, 38),
GetVehicleMod(vehicle, 39),
GetVehicleMod(vehicle, 40),
GetVehicleMod(vehicle, 41),
GetVehicleMod(vehicle, 42),
GetVehicleMod(vehicle, 43),
GetVehicleMod(vehicle, 44),
GetVehicleMod(vehicle, 45),
GetVehicleMod(vehicle, 46),
GetVehicleMod(vehicle, 48),
-- 67 livery
GetVehicleLivery(vehicle),
-- 68 missingDoors
doorsMissing,
-- 69 bulletproofTires
not GetVehicleTyresCanBurst(vehicle),
-- 70 tiresBurst
tiresBurst,
-- 71 brokenWindows
windowsBroken,
-- 72 xenon lights
GetVehicleXenonLightsColour(vehicle),
-- 73 custom primary color
customPrimaryColor,
-- 74 custom secondary color
customSecondaryColor,
-- 75 interior color
GetVehicleInteriorColor(vehicle)
}
end
-- Apply all modifications to a vehicle entity
function SetVehicleModifications(vehicle, plate, modifications)
SetVehicleModKit(vehicle, 0)
-- plate
SetVehicleNumberPlateText(vehicle, plate)
SetVehicleNumberPlateTextIndex(vehicle, modifications[9])
-- lockStatus
SetVehicleDoorsLocked(vehicle, modifications[2])
-- colours
SetVehicleColours(vehicle, modifications[10], modifications[11])
if (modifications[73]) then
SetVehicleCustomPrimaryColour(vehicle, modifications[73][1], modifications[73][2], modifications[73][3])
end
if (modifications[74]) then
SetVehicleCustomSecondaryColour(vehicle, modifications[74][1], modifications[74][2], modifications[74][3])
end
if (modifications[75]) then
SetVehicleInteriorColor(vehicle, modifications[75])
end
SetVehicleExtraColours(vehicle, modifications[12], modifications[13])
SetVehicleTyreSmokeColor(vehicle, modifications[20][1], modifications[20][2], modifications[20][3])
-- wheels
SetVehicleWheelType(vehicle, modifications[14])
-- windows
SetVehicleWindowTint(vehicle, modifications[17])
-- neonlight
SetVehicleNeonLightEnabled(vehicle, 0, modifications[18][1])
SetVehicleNeonLightEnabled(vehicle, 1, modifications[18][2])
SetVehicleNeonLightEnabled(vehicle, 2, modifications[18][3])
SetVehicleNeonLightEnabled(vehicle, 3, modifications[18][4])
SetVehicleNeonLightsColour(vehicle, modifications[19][1], modifications[19][2], modifications[19][3])
-- mods
SetVehicleMod(vehicle, 0, modifications[22], modifications[15])
SetVehicleMod(vehicle, 1, modifications[23], modifications[15])
SetVehicleMod(vehicle, 2, modifications[24], modifications[15])
SetVehicleMod(vehicle, 3, modifications[25], modifications[15])
SetVehicleMod(vehicle, 4, modifications[26], modifications[15])
SetVehicleMod(vehicle, 5, modifications[27], modifications[15])
SetVehicleMod(vehicle, 6, modifications[28], modifications[15])
SetVehicleMod(vehicle, 7, modifications[29], modifications[15])
SetVehicleMod(vehicle, 8, modifications[30], modifications[15])
SetVehicleMod(vehicle, 9, modifications[31], modifications[15])
SetVehicleMod(vehicle, 10, modifications[32], modifications[15])
SetVehicleMod(vehicle, 11, modifications[33], modifications[15])
SetVehicleMod(vehicle, 12, modifications[34], modifications[15])
SetVehicleMod(vehicle, 13, modifications[35], modifications[15])
SetVehicleMod(vehicle, 14, modifications[36], modifications[15])
SetVehicleMod(vehicle, 15, modifications[37], modifications[15])
SetVehicleMod(vehicle, 16, modifications[38], modifications[15])
ToggleVehicleMod(vehicle, 18, modifications[39])
ToggleVehicleMod(vehicle, 20, modifications[40])
ToggleVehicleMod(vehicle, 22, modifications[41])
SetVehicleMod(vehicle, 23, modifications[42], modifications[15])
SetVehicleMod(vehicle, 24, modifications[43], modifications[16])
SetVehicleMod(vehicle, 25, modifications[44], modifications[15])
SetVehicleMod(vehicle, 26, modifications[45], modifications[15])
SetVehicleMod(vehicle, 27, modifications[46], modifications[15])
SetVehicleMod(vehicle, 28, modifications[47], modifications[15])
SetVehicleMod(vehicle, 29, modifications[48], modifications[15])
SetVehicleMod(vehicle, 30, modifications[49], modifications[15])
SetVehicleMod(vehicle, 31, modifications[50], modifications[15])
SetVehicleMod(vehicle, 32, modifications[51], modifications[15])
SetVehicleMod(vehicle, 33, modifications[52], modifications[15])
SetVehicleMod(vehicle, 34, modifications[53], modifications[15])
SetVehicleMod(vehicle, 35, modifications[54], modifications[15])
SetVehicleMod(vehicle, 36, modifications[55], modifications[15])
SetVehicleMod(vehicle, 37, modifications[56], modifications[15])
SetVehicleMod(vehicle, 38, modifications[57], modifications[15])
SetVehicleMod(vehicle, 39, modifications[58], modifications[15])
SetVehicleMod(vehicle, 40, modifications[59], modifications[15])
SetVehicleMod(vehicle, 41, modifications[60], modifications[15])
SetVehicleMod(vehicle, 42, modifications[61], modifications[15])
SetVehicleMod(vehicle, 43, modifications[62], modifications[15])
SetVehicleMod(vehicle, 44, modifications[63], modifications[15])
SetVehicleMod(vehicle, 45, modifications[64], modifications[15])
SetVehicleMod(vehicle, 46, modifications[65], modifications[15])
SetVehicleMod(vehicle, 48, modifications[66], modifications[15])
SetVehicleLivery(vehicle, modifications[67])
-- extras
for i = 1, #modifications[21], 1 do
SetVehicleExtra(vehicle, modifications[21][i][1], modifications[21][i][2])
end
-- stats
SetEntityHealth(vehicle, modifications[3])
SetVehicleBodyHealth(vehicle, modifications[4])
SetVehicleEngineHealth(vehicle, modifications[5])
SetVehiclePetrolTankHealth(vehicle, modifications[6])
if (Config.renderScorched and (modifications[5] < -3999.0 or modifications[6] < -999.0)) then
TriggerServerEvent("mh_Parking:renderScorched", NetworkGetNetworkIdFromEntity(vehicle), true)
end
SetVehicleDirtLevel(vehicle, modifications[7])
exports[Config.exports]:SetFuel(vehicle, modifications[8])
---------------------------------------------------------------------- Implementierung Miho
--[[
fuel = modifications[8]
if type(fuel) == 'number' and fuel >= 0 and fuel <= 100 then
SetVehicleFuelLevel(vehicle, fuel + 0.0)
DecorSetFloat(vehicle, Config.FuelDecor, GetVehicleFuelLevel(vehicle))
end
]]
---------------------------------------------------------------------- Implementierung Miho ENDE
-- doors
for i = 1, #modifications[68], 1 do
SetVehicleDoorBroken(vehicle, modifications[68][i], true)
end
-- tires
SetVehicleTyresCanBurst(vehicle, not modifications[69])
if (not modifications[69]) then
for i = 1, #modifications[70], 1 do
SetVehicleTyreBurst(vehicle, modifications[70][i][1], modifications[70][i][2], 1000.0)
end
end
-- windows
for i = 1, #modifications[71], 1 do
SmashVehicleWindow(vehicle, modifications[71][i])
end
-- xenon lights
if (modifications[72]) then
SetVehicleXenonLightsColour(vehicle, modifications[72])
end
end
-- Return closest loaded vehicle entity or nil if no vehicle is found
function GetClosestVehicle(position, maxRadius)
local vehicles = GetAllVehicles()
local dist = maxRadius
local closestVehicle = nil
for i=1, #vehicles, 1 do
local vehicleCoords = GetEntityCoords(vehicles[i])
local tempDist = Vdist(vehicleCoords.x, vehicleCoords.y, vehicleCoords.z, position.x, position.y, position.z)
if (tempDist < dist) then
dist = tempDist
closestVehicle = vehicles[i]
end
end
if (closestVehicle ~= nil and DoesEntityExist(closestVehicle)) then
return closestVehicle
else
return nil
end
end
-- Returns all loaded vehicles on client side
function GetAllVehicles()
local vehicles = {}
for vehicle in EnumerateVehicles() do
table.insert(vehicles, vehicle)
end
return vehicles
end
function IsVehicleBlacklisted(vehicle)
-- check class
local class = GetVehicleClass(vehicle)
for i = 1, #Config.classesBlacklist, 1 do
if (class == Config.classesBlacklist[i]) then
return true
end
end
-- check model
local modelHash = GetEntityModel(vehicle)
for i = 1, #Config.vehiclesBlacklist, 1 do
if (modelHash == Config.vehiclesBlacklist[i]) then
return true
end
end
return false
end
function GetVehiclePosition(plate)
if (GetResourceState("kimi_callbacks") ~= "started") then
Log("^1[ERROR] \"kimi_callbacks\" is either not installed properly or hasn't been started!")
Log("^1[ERROR] The export \"GetVehiclePosition\" can only be used when having this resource installed.")
return nil
end
if (plate == nil) then
Log("^1[ERROR] \"plate\" was nil while trying to call export \"GetVehiclePosition\"!")
return nil
end
if (type(plate) ~= "string") then
Log("^1[ERROR] \"plate\" (\"" .. plate .. "\") needs to be of type string when calling export \"GetVehiclePosition\"!")
return nil
end
local position = exports["kimi_callbacks"]:Trigger("AP:getVehiclePosition", plate:upper())
return position
end
function GetVehiclePositions(...)
if (GetResourceState("kimi_callbacks") ~= "started") then
Log("^1[ERROR] \"kimi_callbacks\" is either not installed properly or hasn't been started!")
Log("^1[ERROR] The export \"GetVehiclePositions\" can only be used when having this resource installed.")
return nil
end
local plates = { ... }
for i, plate in ipairs(plates) do
if (plate == nil) then
Log("^1[ERROR] \"plate\" (Index: \"" .. i .. "\") was nil while trying to call export \"GetVehiclePositions\"!")
return nil
end
if (type(plate) ~= "string") then
Log("^1[ERROR] \"plate\" (\"" .. plate .. "\") (Index: " .. i .. ") needs to be of type string when calling export \"GetVehiclePositions\"!")
return nil
end
plates[i] = plates[i]:upper()
end
local data = exports["kimi_callbacks"]:Trigger("AP:getVehiclePositions", plates)
return data
end
-- getting all vehicles
function EnumerateVehicles()
return EnumerateEntities(FindFirstVehicle, FindNextVehicle, EndFindVehicle)
end
function EnumerateEntities(initFunc, moveFunc, disposeFunc)
return coroutine.wrap(function()
local iter, id = initFunc()
if not id or id == 0 then
disposeFunc(iter)
return
end
local enum = {handle = iter, destructor = disposeFunc}
setmetatable(enum, entityEnumerator)
local next = true
repeat
coroutine.yield(id)
next, id = moveFunc(iter)
until not next
enum.destructor, enum.handle = nil, nil
disposeFunc(iter)
end)
end
local entityEnumerator = {
__gc = function(enum)
if enum.destructor and enum.handle then
enum.destructor(enum.handle)
end
enum.destructor = nil
enum.handle = nil
end
}

View file

@ -1,210 +1,210 @@
local enabled = true
Citizen.CreateThread(function()
while (true) do
local playerPed = PlayerPedId()
if (DoesEntityExist(playerPed)) then
TriggerServerEvent("mh_Parking:syncPlayerPosition", GetEntityCoords(playerPed))
end
Citizen.Wait(3000)
end
end)
Citizen.CreateThread(function()
while (true) do
Citizen.Wait(5 * 60 * 1000)
local vehicle = GetVehiclePedIsIn(PlayerPedId())
if (DoesEntityExist(vehicle)) then
TriggerEvent("mh_Parking:updateVehicle", vehicle)
end
end
end)
Citizen.CreateThread(function()
Citizen.Wait(3000)
local isInVehicle = false
local currentVehiclePlate = nil
local wasDead = false
while (true) do
Citizen.Wait(50)
local playerPed = PlayerPedId()
if (not isInVehicle and IsPedInAnyVehicle(playerPed)) then
-- entered vehicle
isInVehicle = true
if (enabled) then
local vehicle = GetVehiclePedIsIn(playerPed, false)
if (NetworkGetEntityIsNetworked(vehicle) and not IsVehicleBlacklisted(vehicle)) then
local networkId = NetworkGetNetworkIdFromEntity(vehicle)
SetNetworkIdCanMigrate(netId, true)
local modifications = GetVehicleModifications(vehicle)
currentVehiclePlate = GetVehicleNumberPlateText(vehicle)
TriggerServerEvent("mh_Parking:enteredVehicle", networkId, currentVehiclePlate, modifications)
Log("Vehicle " .. currentVehiclePlate .. " entered")
end
end
elseif (isInVehicle and not IsPedInAnyVehicle(playerPed, false)) then
-- left vehicle
isInVehicle = false
if (enabled and not wasDead) then
local vehicle = GetVehiclePedIsIn(playerPed, true)
if (vehicle ~= 0) then
if (NetworkGetEntityIsNetworked(vehicle) and not IsVehicleBlacklisted(vehicle)) then
local networkId = NetworkGetNetworkIdFromEntity(vehicle)
SetNetworkIdCanMigrate(netId, true)
local modifications = GetVehicleModifications(vehicle)
TriggerServerEvent("mh_Parking:leftVehicle", networkId, modifications)
Log("Vehicle " .. GetVehicleNumberPlateText(vehicle) .. " left")
-- if vehicle is deleted soon after
Citizen.CreateThread(function()
local veh = vehicle
local plate = GetVehicleNumberPlateText(veh)
local startTime = GetGameTimer()
local playerPed = PlayerPedId()
local playerPos
while (true) do
Citizen.Wait(0)
if (GetGameTimer() - startTime >= 1000) then
break
end
if (not DoesEntityExist(veh)) then
TriggerServerEvent("mh_Parking:deleteVehicle", plate, false)
Log("Vehicle " .. currentVehiclePlate .. " left and deleted after exit")
currentVehiclePlate = nil
break
end
playerPed = PlayerPedId()
playerPos = GetEntityCoords(playerPed)
vehPos = GetEntityCoords(veh)
if (Vdist(playerPos.x, playerPos.y, playerPos.z, vehPos.x, vehPos.y, vehPos.z) > 50.0) then
currentVehiclePlate = nil
break
end
end
currentVehiclePlate = nil
end)
end
elseif (currentVehiclePlate) then
TriggerServerEvent("mh_Parking:deleteVehicle", currentVehiclePlate, false)
Log("Vehicle " .. currentVehiclePlate .. " left and deleted")
currentVehiclePlate = nil
end
end
end
if (not wasDead and IsPlayerDead(PlayerId())) then
wasDead = true
elseif (wasDead and not IsPlayerDead(PlayerId())) then
Citizen.CreateThread(function()
Citizen.Wait(1000)
wasDead = false
end)
end
end
end)
RegisterNetEvent("mh_Parking:setVehicleMods")
AddEventHandler("mh_Parking:setVehicleMods", function(netId, plate, modifications)
if (not IsModelInCdimage(modifications[1])) then
Log("Setting mods for " .. plate .. " failed. The model does NOT exist.")
TriggerServerEvent("mh_Parking:modelDoesNotExist", plate)
return
end
local timer = GetGameTimer()
while (not NetworkDoesEntityExistWithNetworkId(netId)) do
Citizen.Wait(0)
if (GetGameTimer() - 10000 > timer) then
Log("Setting mods for " .. plate .. " failed after 10s")
TriggerServerEvent("mh_Parking:setVehicleModsFailed", plate)
return
end
end
local vehicle = NetworkGetEntityFromNetworkId(netId)
if (DoesEntityExist(vehicle) and NetworkHasControlOfEntity(vehicle)) then
Log("Setting modifications for vehicle " .. plate)
SetVehicleModifications(vehicle, plate, modifications)
TriggerServerEvent("mh_Parking:setVehicleModsSuccess", plate)
else
Log("Setting mods failed for vehicle " .. plate .. ". Vehicle does not exist")
TriggerServerEvent("mh_Parking:setVehicleModsFailed", plate)
end
end)
AddEventHandler("mh_Parking:updateVehicle", function(vehicle)
if (vehicle == nil) then
Log("^1[ERROR] \"vehicle\" was nil while trying to update a vehicle!")
return
end
if (DoesEntityExist(vehicle) and NetworkGetEntityIsNetworked(vehicle) and not IsVehicleBlacklisted(vehicle)) then
Log("Triggering manual update of vehicle")
local networkId = NetworkGetNetworkIdFromEntity(vehicle)
local modifications = GetVehicleModifications(vehicle)
TriggerServerEvent("mh_Parking:updateVehicle", networkId, modifications)
end
end)
RegisterNetEvent("mh_Parking:enable")
AddEventHandler("mh_Parking:enable", function(enable)
if (enable == nil) then
Log("^1[ERROR] \"enable\" was nil while trying to enable/disable script!")
return
end
enabled = enable
if (enabled) then
Log("AdvancedParking enabled")
else
Log("AdvancedParking disabled")
end
end)
RegisterNetEvent("mh_Parking:notification")
AddEventHandler("mh_Parking:notification", function(msg)
SetNotificationTextEntry('STRING')
AddTextComponentSubstringPlayerName(msg)
DrawNotification(false, true)
end)
RegisterNetEvent("mh_Parking:renderScorched")
AddEventHandler("mh_Parking:renderScorched", function(vehicleNetId, scorched)
local vehicle = NetworkGetEntityFromNetworkId(vehicleNetId)
if (DoesEntityExist(vehicle)) then
SetEntityRenderScorched(vehicle, scorched)
end
end)
local enabled = true
Citizen.CreateThread(function()
while (true) do
local playerPed = PlayerPedId()
if (DoesEntityExist(playerPed)) then
TriggerServerEvent("mh_Parking:syncPlayerPosition", GetEntityCoords(playerPed))
end
Citizen.Wait(3000)
end
end)
Citizen.CreateThread(function()
while (true) do
Citizen.Wait(5 * 60 * 1000)
local vehicle = GetVehiclePedIsIn(PlayerPedId())
if (DoesEntityExist(vehicle)) then
TriggerEvent("mh_Parking:updateVehicle", vehicle)
end
end
end)
Citizen.CreateThread(function()
Citizen.Wait(3000)
local isInVehicle = false
local currentVehiclePlate = nil
local wasDead = false
while (true) do
Citizen.Wait(50)
local playerPed = PlayerPedId()
if (not isInVehicle and IsPedInAnyVehicle(playerPed)) then
-- entered vehicle
isInVehicle = true
if (enabled) then
local vehicle = GetVehiclePedIsIn(playerPed, false)
if (NetworkGetEntityIsNetworked(vehicle) and not IsVehicleBlacklisted(vehicle)) then
local networkId = NetworkGetNetworkIdFromEntity(vehicle)
SetNetworkIdCanMigrate(netId, true)
local modifications = GetVehicleModifications(vehicle)
currentVehiclePlate = GetVehicleNumberPlateText(vehicle)
TriggerServerEvent("mh_Parking:enteredVehicle", networkId, currentVehiclePlate, modifications)
Log("Vehicle " .. currentVehiclePlate .. " entered")
end
end
elseif (isInVehicle and not IsPedInAnyVehicle(playerPed, false)) then
-- left vehicle
isInVehicle = false
if (enabled and not wasDead) then
local vehicle = GetVehiclePedIsIn(playerPed, true)
if (vehicle ~= 0) then
if (NetworkGetEntityIsNetworked(vehicle) and not IsVehicleBlacklisted(vehicle)) then
local networkId = NetworkGetNetworkIdFromEntity(vehicle)
SetNetworkIdCanMigrate(netId, true)
local modifications = GetVehicleModifications(vehicle)
TriggerServerEvent("mh_Parking:leftVehicle", networkId, modifications)
Log("Vehicle " .. GetVehicleNumberPlateText(vehicle) .. " left")
-- if vehicle is deleted soon after
Citizen.CreateThread(function()
local veh = vehicle
local plate = GetVehicleNumberPlateText(veh)
local startTime = GetGameTimer()
local playerPed = PlayerPedId()
local playerPos
while (true) do
Citizen.Wait(0)
if (GetGameTimer() - startTime >= 1000) then
break
end
if (not DoesEntityExist(veh)) then
TriggerServerEvent("mh_Parking:deleteVehicle", plate, false)
Log("Vehicle " .. currentVehiclePlate .. " left and deleted after exit")
currentVehiclePlate = nil
break
end
playerPed = PlayerPedId()
playerPos = GetEntityCoords(playerPed)
vehPos = GetEntityCoords(veh)
if (Vdist(playerPos.x, playerPos.y, playerPos.z, vehPos.x, vehPos.y, vehPos.z) > 50.0) then
currentVehiclePlate = nil
break
end
end
currentVehiclePlate = nil
end)
end
elseif (currentVehiclePlate) then
TriggerServerEvent("mh_Parking:deleteVehicle", currentVehiclePlate, false)
Log("Vehicle " .. currentVehiclePlate .. " left and deleted")
currentVehiclePlate = nil
end
end
end
if (not wasDead and IsPlayerDead(PlayerId())) then
wasDead = true
elseif (wasDead and not IsPlayerDead(PlayerId())) then
Citizen.CreateThread(function()
Citizen.Wait(1000)
wasDead = false
end)
end
end
end)
RegisterNetEvent("mh_Parking:setVehicleMods")
AddEventHandler("mh_Parking:setVehicleMods", function(netId, plate, modifications)
if (not IsModelInCdimage(modifications[1])) then
Log("Setting mods for " .. plate .. " failed. The model does NOT exist.")
TriggerServerEvent("mh_Parking:modelDoesNotExist", plate)
return
end
local timer = GetGameTimer()
while (not NetworkDoesEntityExistWithNetworkId(netId)) do
Citizen.Wait(0)
if (GetGameTimer() - 10000 > timer) then
Log("Setting mods for " .. plate .. " failed after 10s")
TriggerServerEvent("mh_Parking:setVehicleModsFailed", plate)
return
end
end
local vehicle = NetworkGetEntityFromNetworkId(netId)
if (DoesEntityExist(vehicle) and NetworkHasControlOfEntity(vehicle)) then
Log("Setting modifications for vehicle " .. plate)
SetVehicleModifications(vehicle, plate, modifications)
TriggerServerEvent("mh_Parking:setVehicleModsSuccess", plate)
else
Log("Setting mods failed for vehicle " .. plate .. ". Vehicle does not exist")
TriggerServerEvent("mh_Parking:setVehicleModsFailed", plate)
end
end)
AddEventHandler("mh_Parking:updateVehicle", function(vehicle)
if (vehicle == nil) then
Log("^1[ERROR] \"vehicle\" was nil while trying to update a vehicle!")
return
end
if (DoesEntityExist(vehicle) and NetworkGetEntityIsNetworked(vehicle) and not IsVehicleBlacklisted(vehicle)) then
Log("Triggering manual update of vehicle")
local networkId = NetworkGetNetworkIdFromEntity(vehicle)
local modifications = GetVehicleModifications(vehicle)
TriggerServerEvent("mh_Parking:updateVehicle", networkId, modifications)
end
end)
RegisterNetEvent("mh_Parking:enable")
AddEventHandler("mh_Parking:enable", function(enable)
if (enable == nil) then
Log("^1[ERROR] \"enable\" was nil while trying to enable/disable script!")
return
end
enabled = enable
if (enabled) then
Log("AdvancedParking enabled")
else
Log("AdvancedParking disabled")
end
end)
RegisterNetEvent("mh_Parking:notification")
AddEventHandler("mh_Parking:notification", function(msg)
SetNotificationTextEntry('STRING')
AddTextComponentSubstringPlayerName(msg)
DrawNotification(false, true)
end)
RegisterNetEvent("mh_Parking:renderScorched")
AddEventHandler("mh_Parking:renderScorched", function(vehicleNetId, scorched)
local vehicle = NetworkGetEntityFromNetworkId(vehicleNetId)
if (DoesEntityExist(vehicle)) then
SetEntityRenderScorched(vehicle, scorched)
end
end)

View file

@ -1,64 +1,64 @@
Config = {}
Config.exports = "lc_fuel" -- LegacyFuel
-- set this to true if you want to see debug messages on client and server side
Config.isDebug = false
-- this controls the distance at which vehicles will spawn to the closest player
-- (in meters)
Config.spawnDistance = 200.0
-- this controls when a vehicle will be removed from the database table when
-- calling the cleanup function (in hours; so 24 * 7 = one week)
Config.cleanUpThresholdTime = 24 * 7
-- set this to false if you do not want entities render as scorched when they
-- are completely broken
Config.renderScorched = true
-- vehicle classes that you do not want to save go here (remove the -- in front
-- of the number if you want it blacklisted)
Config.classesBlacklist = {
-- 0, -- Compacts
-- 1, -- Sedans
-- 2, -- SUVs
-- 3, -- Coupes
-- 4, -- Muscle
-- 5, -- Sports Classics
-- 6, -- Sports
-- 7, -- Super
-- 8, -- Motorcycles
-- 9, -- Off-road
--10, -- Industrial
--11, -- Utility
--12, -- Vans
--13, -- Cycles
--14, -- Boats
--15, -- Helicopters
--16, -- Planes
--17, -- Service
--18, -- Emergency
--19, -- Military
--20, -- Commercial
21, -- Trains
}
-- other vehicles that you do not want to save can be inserted here (use `MODELNAME`
-- when you put them in there)
Config.vehiclesBlacklist = {
--`blista`,
}
-- this lets you control if vehicles should be deleted (in minutes; 0 if you do not
-- want to use it; this is useful for large servers with a lot of players)
Config.deleteTimer = 0
-- despawns all vehicles that are more than x meters away from a player
Config.deleteDistance = 25.0
-- when the notifications should be shown before the despawning
-- needs to be in descending order in minutes and lower than Config.deleteTimer
Config.deleteNotificationTimes = { 5, 3, 2, 1 }
-- notification to show players before deleting vehicles
-- (use %s as placeholder for time left in minutes)
Config.timeLeftNotification = "Fahrzeuge Despawn in %s Minuten."
-- notification to show players when deleting vehicles
Config.deleteNotification = "Lösche Fahrzeuge..."
Config = {}
Config.exports = "lc_fuel" -- LegacyFuel
-- set this to true if you want to see debug messages on client and server side
Config.isDebug = false
-- this controls the distance at which vehicles will spawn to the closest player
-- (in meters)
Config.spawnDistance = 200.0
-- this controls when a vehicle will be removed from the database table when
-- calling the cleanup function (in hours; so 24 * 7 = one week)
Config.cleanUpThresholdTime = 24 * 7
-- set this to false if you do not want entities render as scorched when they
-- are completely broken
Config.renderScorched = true
-- vehicle classes that you do not want to save go here (remove the -- in front
-- of the number if you want it blacklisted)
Config.classesBlacklist = {
-- 0, -- Compacts
-- 1, -- Sedans
-- 2, -- SUVs
-- 3, -- Coupes
-- 4, -- Muscle
-- 5, -- Sports Classics
-- 6, -- Sports
-- 7, -- Super
-- 8, -- Motorcycles
-- 9, -- Off-road
--10, -- Industrial
--11, -- Utility
--12, -- Vans
--13, -- Cycles
--14, -- Boats
--15, -- Helicopters
--16, -- Planes
--17, -- Service
--18, -- Emergency
--19, -- Military
--20, -- Commercial
21, -- Trains
}
-- other vehicles that you do not want to save can be inserted here (use `MODELNAME`
-- when you put them in there)
Config.vehiclesBlacklist = {
--`blista`,
}
-- this lets you control if vehicles should be deleted (in minutes; 0 if you do not
-- want to use it; this is useful for large servers with a lot of players)
Config.deleteTimer = 0
-- despawns all vehicles that are more than x meters away from a player
Config.deleteDistance = 25.0
-- when the notifications should be shown before the despawning
-- needs to be in descending order in minutes and lower than Config.deleteTimer
Config.deleteNotificationTimes = { 5, 3, 2, 1 }
-- notification to show players before deleting vehicles
-- (use %s as placeholder for time left in minutes)
Config.timeLeftNotification = "Fahrzeuge Despawn in %s Minuten."
-- notification to show players when deleting vehicles
Config.deleteNotification = "Lösche Fahrzeuge..."

View file

@ -1,24 +1,24 @@
fx_version 'cerulean'
games { 'gta5' }
author 'Mîhó'
description 'Park all your vehicles anywhere!'
version '1.0.0'
server_scripts {
'@oxmysql/lib/MySQL.lua',
'config.lua',
'sv_utils.lua',
'server.lua'
}
client_scripts {
'config.lua',
'cl_utils.lua',
'client.lua'
}
exports {
'GetVehiclePosition',
'GetVehiclePositions'
}
fx_version 'cerulean'
games { 'gta5' }
author 'Mîhó'
description 'Park all your vehicles anywhere!'
version '1.0.0'
server_scripts {
'@oxmysql/lib/MySQL.lua',
'config.lua',
'sv_utils.lua',
'server.lua'
}
client_scripts {
'config.lua',
'cl_utils.lua',
'client.lua'
}
exports {
'GetVehiclePosition',
'GetVehiclePositions'
}

View file

@ -1,32 +1,32 @@
-- --------------------------------------------------------
-- Host: 127.0.0.1
-- Server version: 10.1.28-MariaDB - mariadb.org binary distribution
-- Server OS: Win32
-- HeidiSQL Version: 11.0.0.5919
-- --------------------------------------------------------
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-- Dumping structure for table fivem_testserver.vehicle_parking
CREATE TABLE IF NOT EXISTS `vehicle_parking` (
`plate` varchar(8) NOT NULL,
`modifications` text NOT NULL,
`posX` float NOT NULL,
`posY` float NOT NULL,
`posZ` float NOT NULL,
`rotX` float NOT NULL,
`rotY` float NOT NULL,
`rotZ` float NOT NULL,
`lastUpdate` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`plate`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- Data exporting was unselected.
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-- --------------------------------------------------------
-- Host: 127.0.0.1
-- Server version: 10.1.28-MariaDB - mariadb.org binary distribution
-- Server OS: Win32
-- HeidiSQL Version: 11.0.0.5919
-- --------------------------------------------------------
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-- Dumping structure for table fivem_testserver.vehicle_parking
CREATE TABLE IF NOT EXISTS `vehicle_parking` (
`plate` varchar(8) NOT NULL,
`modifications` text NOT NULL,
`posX` float NOT NULL,
`posY` float NOT NULL,
`posZ` float NOT NULL,
`rotX` float NOT NULL,
`rotY` float NOT NULL,
`rotZ` float NOT NULL,
`lastUpdate` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`plate`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- Data exporting was unselected.
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

View file

@ -1,151 +1,151 @@
activePlayerPositions = {}
-- returns a loaded vehicled with a given number plate
function TryGetLoadedVehicle(plate, loadedVehicles)
for i = 1, #loadedVehicles, 1 do
if (plate == GetVehicleNumberPlateText(loadedVehicles[i]) and DoesEntityExist(loadedVehicles[i])) then
return loadedVehicles[i]
end
end
return nil
end
function ContainsPlate(plate, vehiclePlates)
for i = 1, #vehiclePlates, 1 do
if (plate == vehiclePlates[i]) then
return true
end
end
return false
end
-- Logs text to the server console
function Log(text)
if (Config.isDebug) then
Print(GetCurrentResourceName() .. ": " .. text)
end
end
-- return the distance between two positions (Vector3)
function Vector3Dist(v1, v2)
return math.sqrt( (v2.x - v1.x) * (v2.x - v1.x) + (v2.y - v1.y) * (v2.y - v1.y) + (v2.z - v1.z) * (v2.z - v1.z) )
end
-- return the distance between two positions without sqrt (Vector3)
function Vector3DistFast(v1, v2)
return (v2.x - v1.x) * (v2.x - v1.x) + (v2.y - v1.y) * (v2.y - v1.y) + (v2.z - v1.z) * (v2.z - v1.z)
end
-- returns the difference in degrees from the axis with the highest difference
function GetRotationDifference(r1, r2)
local x = math.abs(r1.x - r2.x)
local y = math.abs(r1.y - r2.y)
local z = math.abs(r1.z - r2.z)
if (x > y and x > z) then
return x
elseif (y > z) then
return y
else
return z
end
end
-- get the amount of currently active players
function GetActivePlayerCount()
local playerCount = 0
for k, v in pairs(activePlayerPositions) do
playerCount = playerCount + 1
end
return playerCount
end
-- return the ID of the closest player
function GetClosestPlayerId(position)
local closestDistance = 1000000.0
local closestPlayerID = nil
local closestPos = nil
for playerID, pos in pairs(activePlayerPositions) do
local distance = Vector3DistFast(position, pos)
if (distance < closestDistance) then
closestDistance = distance
closestPlayerID = playerID
closestPos = pos
end
end
local distance = nil
if (closestPlayerID ~= nil) then
distance = Vector3Dist(position, closestPos)
end
return closestPlayerID, distance
end
function IsAnyPlayerInsideVehicle(vehicle, playerPeds)
for i = 1, #playerPeds, 1 do
local veh = GetVehiclePedIsIn(playerPeds[i], false)
if (DoesEntityExist(veh) and veh == vehicle) then
return true
end
end
return false
end
-- return the ped of the closest player
function GetClosestPlayerPed(position, playerPeds)
local closestDistance = 1000000.0
local closestPlayerPed = nil
local closestPos = nil
for k, playerPed in pairs(playerPeds) do
local pos = GetEntityCoords(playerPed)
local distance = Vector3DistFast(position, pos)
if (distance < closestDistance) then
closestDistance = distance
closestPlayerPed = playerPed
closestPos = pos
end
end
local distance = 0.0
if (closestPlayerPed ~= nil) then
distance = Vector3Dist(position, closestPos)
end
return closestPlayerPed, distance
end
-- returns true if a player is active on the server with the specified license
function IsPlayerWithLicenseActive(license)
for playerId, playerPos in pairs(activePlayerPositions) do
if (GetPlayerIdentifiersSorted(playerId)["license"] == license) then
return true
end
end
return false
end
-- Return an array with all identifiers - e.g. ids["license"] = license:xxxxxxxxxxxxxxxx
function GetPlayerIdentifiersSorted(playerServerId)
local ids = {}
local identifiers = GetPlayerIdentifiers(playerServerId)
for k, identifier in pairs (identifiers) do
local i, j = string.find(identifier, ":")
local idType = string.sub(identifier, 1, i-1)
ids[idType] = identifier
end
return ids
end
activePlayerPositions = {}
-- returns a loaded vehicled with a given number plate
function TryGetLoadedVehicle(plate, loadedVehicles)
for i = 1, #loadedVehicles, 1 do
if (plate == GetVehicleNumberPlateText(loadedVehicles[i]) and DoesEntityExist(loadedVehicles[i])) then
return loadedVehicles[i]
end
end
return nil
end
function ContainsPlate(plate, vehiclePlates)
for i = 1, #vehiclePlates, 1 do
if (plate == vehiclePlates[i]) then
return true
end
end
return false
end
-- Logs text to the server console
function Log(text)
if (Config.isDebug) then
Print(GetCurrentResourceName() .. ": " .. text)
end
end
-- return the distance between two positions (Vector3)
function Vector3Dist(v1, v2)
return math.sqrt( (v2.x - v1.x) * (v2.x - v1.x) + (v2.y - v1.y) * (v2.y - v1.y) + (v2.z - v1.z) * (v2.z - v1.z) )
end
-- return the distance between two positions without sqrt (Vector3)
function Vector3DistFast(v1, v2)
return (v2.x - v1.x) * (v2.x - v1.x) + (v2.y - v1.y) * (v2.y - v1.y) + (v2.z - v1.z) * (v2.z - v1.z)
end
-- returns the difference in degrees from the axis with the highest difference
function GetRotationDifference(r1, r2)
local x = math.abs(r1.x - r2.x)
local y = math.abs(r1.y - r2.y)
local z = math.abs(r1.z - r2.z)
if (x > y and x > z) then
return x
elseif (y > z) then
return y
else
return z
end
end
-- get the amount of currently active players
function GetActivePlayerCount()
local playerCount = 0
for k, v in pairs(activePlayerPositions) do
playerCount = playerCount + 1
end
return playerCount
end
-- return the ID of the closest player
function GetClosestPlayerId(position)
local closestDistance = 1000000.0
local closestPlayerID = nil
local closestPos = nil
for playerID, pos in pairs(activePlayerPositions) do
local distance = Vector3DistFast(position, pos)
if (distance < closestDistance) then
closestDistance = distance
closestPlayerID = playerID
closestPos = pos
end
end
local distance = nil
if (closestPlayerID ~= nil) then
distance = Vector3Dist(position, closestPos)
end
return closestPlayerID, distance
end
function IsAnyPlayerInsideVehicle(vehicle, playerPeds)
for i = 1, #playerPeds, 1 do
local veh = GetVehiclePedIsIn(playerPeds[i], false)
if (DoesEntityExist(veh) and veh == vehicle) then
return true
end
end
return false
end
-- return the ped of the closest player
function GetClosestPlayerPed(position, playerPeds)
local closestDistance = 1000000.0
local closestPlayerPed = nil
local closestPos = nil
for k, playerPed in pairs(playerPeds) do
local pos = GetEntityCoords(playerPed)
local distance = Vector3DistFast(position, pos)
if (distance < closestDistance) then
closestDistance = distance
closestPlayerPed = playerPed
closestPos = pos
end
end
local distance = 0.0
if (closestPlayerPed ~= nil) then
distance = Vector3Dist(position, closestPos)
end
return closestPlayerPed, distance
end
-- returns true if a player is active on the server with the specified license
function IsPlayerWithLicenseActive(license)
for playerId, playerPos in pairs(activePlayerPositions) do
if (GetPlayerIdentifiersSorted(playerId)["license"] == license) then
return true
end
end
return false
end
-- Return an array with all identifiers - e.g. ids["license"] = license:xxxxxxxxxxxxxxxx
function GetPlayerIdentifiersSorted(playerServerId)
local ids = {}
local identifiers = GetPlayerIdentifiers(playerServerId)
for k, identifier in pairs (identifiers) do
local i, j = string.find(identifier, ":")
local idType = string.sub(identifier, 1, i-1)
ids[idType] = identifier
end
return ids
end

View file

@ -1,149 +1,149 @@
Config = {}
-- set at least one to false, otherwise both menus will clash
-- and don't forget to comment the menu in the fxmanifest.lua if you don't use it!
-- Setting both to true does not work!
-- setting both to false results in no menu being usable at all
-- you can then just include the exports in your own menu if you have one
Config.useContextMenu = false
Config.useNativeUI = true
-- set to nil if you don't want to use the command
Config.lockCommand = "lock"
-- set to nil if you don't want to use the button (303, U)
Config.lockKey = 10 -- PageUp
-- set to nil if you don't want to use the command
Config.keyMenuCommand = "keys"
-- set to nil if you don't want to use the button (311, K)
Config.keyMenuKey = 56 -- F9
-- maximum distance (in meters) between the player and ContextMenu interaction point
Config.maxDistance = 5.0
-- you can define more keymakers by just adding additional entries
Config.Keymakers = {
{
-- ped model (yes, the ` symbols are correct)
model = `s_m_m_autoshop_01`,
-- position and heading vector4(x, y, z, heading)
pos = vector4(170.33, -1799.13, 28.32, 313.0)
},
}
-- define costs for creating a new key and exchanging locks
Config.Costs = {
GetMoney = "cash", -- cash or bank
newKey = 150,
exchangeLocks = 650
}
-- define job vehicles like this (this acts as a key for those vehicles)
-- models in ``
-- either exact plates or just a string that should be in the vehicles plate
-- e.g. "LSPD" will let a police officer lock/unlock any vehicle with the plate "LSPD1337" or "13LSPD37"
Config.JobVehicles = {
-- examples:
--["police"] = {
--models = {
--`police`,
--`policeb`,
--`pbus`
--},
--plates = {
--""
--}
--},
--["mechanic"] = {
-- models = {
-- `flatbed`
-- },
-- plates = {
-- "MECH"
-- }
--},
}
Config.Strings = {
keymaker = "Schlüsseldienst",
helpText = "~w~Drück ~g~E ~w~um mit den Schlüsseldienst zu reden",
lockNotif = "~r~Fahrzeug Abgeschlossen",
unlockNotif = "~g~Fahrzeug Aufgeschlossen",
createSuccess = "~g~Ersatzschlüssel Nachgemacht %s.",
createNoMoney = "~r~Schlüssel kann nicht nachgemacht werden, du hast zu wenig Geld dabei",
createFailed = "~r~Ersatzschlüssel machen Fehlgeschlagen %s!",
giveSuccess = "~g~Schlüssel an %s Weitergegeben.",
giveSuccessPly = "~g~Schlüssel von %s erhalten ",
giveFailed = "~r~Schlüssel geben von %s Fehlgeschlagen",
removeSuccess = "~r~Schlüssel für ~g~%s ~r~aus deiner Tasche Entfernt",
removeNoMoney = "~r~Schloss kann nicht bezahlt werden, du hast kein Geld dabei",
removeFailed = "~r~Entfernen von Schlüssel für ~g~%s ~r~Fehgeschlagen!",
deleteKeys = "~r~Du hast für dein ~g~%s ~r~Das Schloss ausgetasucht, und somit sind jetzt alle Schlüssel nicht mehr Gültig.",
-- NativeUI
NUI = {
-- keymaker menu
keymakerMenuTitle = "Schlüssel-System",
keymakerMenuSub = "~g~Erstelle Schlüssel und Tausche deine Fahrzeug Schlösser aus",
-- create key
createKeyTitle = "~g~Ersatzschlüssel erstellen",
createKeyDesc = "Erstelle einen neuen Schlüssel für eines Ihrer Fahrzeuge ",
createVehicleKey = "Erstelle einen Schlüssel für Ihr %s mit den Kennzeichen %s. ~g~Preis "..Config.Costs.newKey.."$",
-- invalidate Key
invalKeyTitle = "~r~Fahrzeug Schlöss Tauschen",
invalKeyDesc = "Tausche die Schlösser von Ihren Auto aus, alle schlüssel sind damit nicht mehr Gültig!",
invalVehicleKey = "Schloss Tauschen von %s mit den Kennzeichen %s. ~g~Preis "..Config.Costs.exchangeLocks.."$",
-- key Inventory
keyInventoryTitle = "Schlüssel",
keyInventorySub = "~g~Da sind alle deine Schlüssel",
-- master keys
masterKeysTitle = "Hauptschlüssel",
masterKeysDesc = "~g~Zeigt alle deine Hauptschlüssel an",
-- additional keys
keysTitle = "Ersatzschlüssel",
keysDesc = "~g~Zeigt alle deine Ersatzschlüssel an",
giveKeyTitle = "~g~Ersatzschlüssel Geben",
giveKeyDesc = "~g~Ersatzschlüssel Geben",
removeKeyTitle = "~r~Schlüssel Entfernen",
removeKeyDesc = "~r~Schlüssel Entfernen",
transferVehicleTitle = "~g~Fahrzeug übergeben",
transferVehicleDesc = "~g~Übertrage ein Fahrzeug an einen Spieler in der Nähe",
transferVehicleSuccess = "~g~Fahrzeug erfolgreich übergeben an %s",
transferVehicleFailed = "~r~Fahrzeugübergabe fehlgeschlagen",
transferVehicleReceived = "~g~Du hast ein Fahrzeug erhalten",
noPlayersNearby = "~r~Keine Spieler in der Nähe",
},
-- ContextMenu
CM = {
-- keymaker menu
createKeyTitle = "Ersatzschlüssel",
invalKeyTitle = "Schlossaustauschen",
-- key inventory
masterKeysTitle = "~g~Hauptschlüssel",
keysTitle = "~b~Ersatzschlüssel",
-- other player
giveKey = "~r~Gebe ein Schlüssel, an der Person",
transferVehicleTitle = "Fahrzeug übergeben",
}
}
Config = {}
-- set at least one to false, otherwise both menus will clash
-- and don't forget to comment the menu in the fxmanifest.lua if you don't use it!
-- Setting both to true does not work!
-- setting both to false results in no menu being usable at all
-- you can then just include the exports in your own menu if you have one
Config.useContextMenu = false
Config.useNativeUI = true
-- set to nil if you don't want to use the command
Config.lockCommand = "lock"
-- set to nil if you don't want to use the button (303, U)
Config.lockKey = 10 -- PageUp
-- set to nil if you don't want to use the command
Config.keyMenuCommand = "keys"
-- set to nil if you don't want to use the button (311, K)
Config.keyMenuKey = 56 -- F9
-- maximum distance (in meters) between the player and ContextMenu interaction point
Config.maxDistance = 5.0
-- you can define more keymakers by just adding additional entries
Config.Keymakers = {
{
-- ped model (yes, the ` symbols are correct)
model = `s_m_m_autoshop_01`,
-- position and heading vector4(x, y, z, heading)
pos = vector4(170.33, -1799.13, 28.32, 313.0)
},
}
-- define costs for creating a new key and exchanging locks
Config.Costs = {
GetMoney = "cash", -- cash or bank
newKey = 150,
exchangeLocks = 650
}
-- define job vehicles like this (this acts as a key for those vehicles)
-- models in ``
-- either exact plates or just a string that should be in the vehicles plate
-- e.g. "LSPD" will let a police officer lock/unlock any vehicle with the plate "LSPD1337" or "13LSPD37"
Config.JobVehicles = {
-- examples:
--["police"] = {
--models = {
--`police`,
--`policeb`,
--`pbus`
--},
--plates = {
--""
--}
--},
--["mechanic"] = {
-- models = {
-- `flatbed`
-- },
-- plates = {
-- "MECH"
-- }
--},
}
Config.Strings = {
keymaker = "Schlüsseldienst",
helpText = "~w~Drück ~g~E ~w~um mit den Schlüsseldienst zu reden",
lockNotif = "~r~Fahrzeug Abgeschlossen",
unlockNotif = "~g~Fahrzeug Aufgeschlossen",
createSuccess = "~g~Ersatzschlüssel Nachgemacht %s.",
createNoMoney = "~r~Schlüssel kann nicht nachgemacht werden, du hast zu wenig Geld dabei",
createFailed = "~r~Ersatzschlüssel machen Fehlgeschlagen %s!",
giveSuccess = "~g~Schlüssel an %s Weitergegeben.",
giveSuccessPly = "~g~Schlüssel von %s erhalten ",
giveFailed = "~r~Schlüssel geben von %s Fehlgeschlagen",
removeSuccess = "~r~Schlüssel für ~g~%s ~r~aus deiner Tasche Entfernt",
removeNoMoney = "~r~Schloss kann nicht bezahlt werden, du hast kein Geld dabei",
removeFailed = "~r~Entfernen von Schlüssel für ~g~%s ~r~Fehgeschlagen!",
deleteKeys = "~r~Du hast für dein ~g~%s ~r~Das Schloss ausgetasucht, und somit sind jetzt alle Schlüssel nicht mehr Gültig.",
-- NativeUI
NUI = {
-- keymaker menu
keymakerMenuTitle = "Schlüssel-System",
keymakerMenuSub = "~g~Erstelle Schlüssel und Tausche deine Fahrzeug Schlösser aus",
-- create key
createKeyTitle = "~g~Ersatzschlüssel erstellen",
createKeyDesc = "Erstelle einen neuen Schlüssel für eines Ihrer Fahrzeuge ",
createVehicleKey = "Erstelle einen Schlüssel für Ihr %s mit den Kennzeichen %s. ~g~Preis "..Config.Costs.newKey.."$",
-- invalidate Key
invalKeyTitle = "~r~Fahrzeug Schlöss Tauschen",
invalKeyDesc = "Tausche die Schlösser von Ihren Auto aus, alle schlüssel sind damit nicht mehr Gültig!",
invalVehicleKey = "Schloss Tauschen von %s mit den Kennzeichen %s. ~g~Preis "..Config.Costs.exchangeLocks.."$",
-- key Inventory
keyInventoryTitle = "Schlüssel",
keyInventorySub = "~g~Da sind alle deine Schlüssel",
-- master keys
masterKeysTitle = "Hauptschlüssel",
masterKeysDesc = "~g~Zeigt alle deine Hauptschlüssel an",
-- additional keys
keysTitle = "Ersatzschlüssel",
keysDesc = "~g~Zeigt alle deine Ersatzschlüssel an",
giveKeyTitle = "~g~Ersatzschlüssel Geben",
giveKeyDesc = "~g~Ersatzschlüssel Geben",
removeKeyTitle = "~r~Schlüssel Entfernen",
removeKeyDesc = "~r~Schlüssel Entfernen",
transferVehicleTitle = "~g~Fahrzeug übergeben",
transferVehicleDesc = "~g~Übertrage ein Fahrzeug an einen Spieler in der Nähe",
transferVehicleSuccess = "~g~Fahrzeug erfolgreich übergeben an %s",
transferVehicleFailed = "~r~Fahrzeugübergabe fehlgeschlagen",
transferVehicleReceived = "~g~Du hast ein Fahrzeug erhalten",
noPlayersNearby = "~r~Keine Spieler in der Nähe",
},
-- ContextMenu
CM = {
-- keymaker menu
createKeyTitle = "Ersatzschlüssel",
invalKeyTitle = "Schlossaustauschen",
-- key inventory
masterKeysTitle = "~g~Hauptschlüssel",
keysTitle = "~b~Ersatzschlüssel",
-- other player
giveKey = "~r~Gebe ein Schlüssel, an der Person",
transferVehicleTitle = "Fahrzeug übergeben",
}
}

View file

@ -1,57 +1,57 @@
fx_version 'cerulean'
games { 'gta5' }
author 'Mîhó'
description 'Manage vehicle keys!'
version '1.1.1'
dependency 'kimi_callbacks'
dependency 'NativeUI'
server_scripts {
--'@mysql-async/lib/MySQL.lua',
'@oxmysql/lib/MySQL.lua',
'config.lua',
'server.lua'
}
client_scripts {
-- comment these lines if not using the ContextMenu
--'@ContextMenu/screenToWorld.lua',
--'@ContextMenu/Drawables/Color.lua',
--'@ContextMenu/Drawables/Rect.lua',
--'@ContextMenu/Drawables/Text.lua',
--'@ContextMenu/Drawables/Sprite.lua',
--'@ContextMenu/Menu/Item.lua',
--'@ContextMenu/Menu/TextItem.lua',
--'@ContextMenu/Menu/CheckboxItem.lua',
--'@ContextMenu/Menu/SubmenuItem.lua',
--'@ContextMenu/Menu/Separator.lua',
--'@ContextMenu/Menu/Border.lua',
--'@ContextMenu/Menu/Menu.lua',
--'@ContextMenu/Menu/MenuPool.lua',
-- comment this line if not using NativeUILua
'@NativeUI/NativeUI.lua',
'@ox_lib/init.lua',
'config.lua',
'client.lua'
}
server_exports {
'IsVehicleOwner',
'IsKeyOwner',
'IsVehicleOrKeyOwner',
'GetPlayerKeys',
'GetPlayerVehicles'
}
exports {
'IsVehicleOwner',
'IsKeyOwner',
'IsVehicleOrKeyOwner',
'GetAllKeys',
'GetAllVehicles'
}
fx_version 'cerulean'
games { 'gta5' }
author 'Mîhó'
description 'Manage vehicle keys!'
version '1.1.1'
dependency 'kimi_callbacks'
dependency 'NativeUI'
server_scripts {
--'@mysql-async/lib/MySQL.lua',
'@oxmysql/lib/MySQL.lua',
'config.lua',
'server.lua'
}
client_scripts {
-- comment these lines if not using the ContextMenu
--'@ContextMenu/screenToWorld.lua',
--'@ContextMenu/Drawables/Color.lua',
--'@ContextMenu/Drawables/Rect.lua',
--'@ContextMenu/Drawables/Text.lua',
--'@ContextMenu/Drawables/Sprite.lua',
--'@ContextMenu/Menu/Item.lua',
--'@ContextMenu/Menu/TextItem.lua',
--'@ContextMenu/Menu/CheckboxItem.lua',
--'@ContextMenu/Menu/SubmenuItem.lua',
--'@ContextMenu/Menu/Separator.lua',
--'@ContextMenu/Menu/Border.lua',
--'@ContextMenu/Menu/Menu.lua',
--'@ContextMenu/Menu/MenuPool.lua',
-- comment this line if not using NativeUILua
'@NativeUI/NativeUI.lua',
'@ox_lib/init.lua',
'config.lua',
'client.lua'
}
server_exports {
'IsVehicleOwner',
'IsKeyOwner',
'IsVehicleOrKeyOwner',
'GetPlayerKeys',
'GetPlayerVehicles'
}
exports {
'IsVehicleOwner',
'IsKeyOwner',
'IsVehicleOrKeyOwner',
'GetAllKeys',
'GetAllVehicles'
}

View file

@ -1,27 +1,27 @@
-- --------------------------------------------------------
-- Host: 127.0.0.1
-- Server version: 10.1.28-MariaDB - mariadb.org binary distribution
-- Server OS: Win32
-- HeidiSQL Version: 11.0.0.5919
-- --------------------------------------------------------
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-- Dumping structure for table essentialmode.vehicle_keys
CREATE TABLE IF NOT EXISTS `vehicle_keys` (
`owner` varchar(60) NOT NULL,
`plate` varchar(8) NOT NULL,
`count` smallint(6) NOT NULL,
KEY `plate` (`plate`),
KEY `owner` (`owner`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- Data exporting was unselected.
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-- --------------------------------------------------------
-- Host: 127.0.0.1
-- Server version: 10.1.28-MariaDB - mariadb.org binary distribution
-- Server OS: Win32
-- HeidiSQL Version: 11.0.0.5919
-- --------------------------------------------------------
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-- Dumping structure for table essentialmode.vehicle_keys
CREATE TABLE IF NOT EXISTS `vehicle_keys` (
`owner` varchar(60) NOT NULL,
`plate` varchar(8) NOT NULL,
`count` smallint(6) NOT NULL,
KEY `plate` (`plate`),
KEY `owner` (`owner`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- Data exporting was unselected.
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

Binary file not shown.

View file

@ -0,0 +1,17 @@
# JG Scripts Advanced Garages v3
Hey there! Thanks so much for purchasing, it really means a lot to me. I've spent a lot of time on this script, and I hope you love it. This document has a bunch of the essential information that should help you out:
## Useful Links
🔧 Configure Advanced Garages in just minutes: https://configurator.jgscripts.com/advanced-garages
📚 Documentation: https://docs.jgscripts.com/advanced-garages/introduction
🔗 Official Website: https://jgscripts.com
🛒 Store: https://store.jgscripts.com
## Support
Join Discord https://discord.jgscripts.com, and we will do whatever it takes to help you out and get you up and running!

View file

@ -0,0 +1,90 @@
-- A modified version of "VehicleDeformation" v1.0.1, by Kiminaze. Full credits go to him, so adibe by the license below.
-- Check out his other work: https://kiminazes-script-gems.tebex.io/
--
-- VehicleDeformation License:
--
-- Copyright (c) 2021 Philipp Decker /// FiveM: Kiminaze / Discord: Kiminaze#9097
-- By acquiring a copy of this code snippet for the "FiveM" modification for "Grand Theft
-- Auto V" you are granted permission to use and modify all of its parts.
-- You are allowed to (re-)distribute and sell resources that have been created with the
-- help of this code snippet. You have to include this license when doing so.
-- This code snippet is provided "as is" and the copyright holder of this code snippet can
-- not be held accountable for any damages occuring during the usage or modification of
-- this code snippet.
local MAX_DEFORM_ITERATIONS = 50 -- iterations for damage application
local DEFORMATION_DAMAGE_THRESHOLD = 0.05 -- the minimum damage value at a deformation point
function getVehicleDeformation(vehicle)
assert(vehicle ~= nil and DoesEntityExist(vehicle), "Parameter \"vehicle\" must be a valid vehicle entity!")
-- check vehicle size and pre-calc values for offsets
local min, max = GetModelDimensions(GetEntityModel(vehicle))
local X = (max.x - min.x) * 0.5
local Y = (max.y - min.y) * 0.5
local Z = (max.z - min.z) * 0.5
local halfY = Y * 0.5
-- offsets for deformation check
local positions = {vector3(-X, Y, 0.0), vector3(-X, Y, Z), vector3(0.0, Y, 0.0), vector3(0.0, Y, Z), vector3(X, Y, 0.0), vector3(X, Y, Z), vector3(-X, halfY, 0.0), vector3(-X, halfY, Z), vector3(0.0, halfY, 0.0), vector3(0.0, halfY, Z), vector3(X, halfY, 0.0), vector3(X, halfY, Z),
vector3(-X, 0.0, 0.0), vector3(-X, 0.0, Z), vector3(0.0, 0.0, 0.0), vector3(0.0, 0.0, Z), vector3(X, 0.0, 0.0), vector3(X, 0.0, Z), vector3(-X, -halfY, 0.0), vector3(-X, -halfY, Z), vector3(0.0, -halfY, 0.0), vector3(0.0, -halfY, Z), vector3(X, -halfY, 0.0),
vector3(X, -halfY, Z), vector3(-X, -Y, 0.0), vector3(-X, -Y, Z), vector3(0.0, -Y, 0.0), vector3(0.0, -Y, Z), vector3(X, -Y, 0.0), vector3(X, -Y, Z)}
-- get deformation from vehicle
local deformationPoints = {}
for i, pos in ipairs(positions) do
-- translate damage from vector3 to a float
local dmg = #(GetVehicleDeformationAtPos(vehicle, pos.x, pos.y, pos.z))
if (dmg > DEFORMATION_DAMAGE_THRESHOLD) then
table.insert(deformationPoints, {pos, dmg})
end
end
return {
deformation = deformationPoints,
dirt = GetVehicleDirtLevel(vehicle)
}
end
function setVehicleDeformation(vehicle, deformation)
assert(vehicle ~= nil and DoesEntityExist(vehicle), "Parameter \"vehicle\" must be a valid vehicle entity!")
assert(deformation ~= nil and type(deformation) == "table", "Parameter \"deformation\" must be a table!")
local deformationPoints = deformation.deformation
local dirt = deformation.dirt
CreateThread(function()
local handlingMult, damageMult = GetVehicleHandlingFloat(vehicle, "CHandlingData", "fDeformationDamageMult"), 20.0
if handlingMult <= 0.55 then damageMult = 1000.0
elseif handlingMult <= 0.65 then damageMult = 400.0
elseif handlingMult <= 0.75 then damageMult = 200.0 end
for _, def in ipairs(deformationPoints) do
def[1] = vector3(def[1].x, def[1].y, def[1].z)
end
-- iterate over all deformation points and check if more than one application is necessary
-- looping is necessary for most vehicles that have a really bad damage model or take a lot of damage (e.g. neon, phantom3)
local deform = true
local iteration = 0
while deform and iteration < MAX_DEFORM_ITERATIONS do
if not DoesEntityExist(vehicle) then return end
deform = false
for _, def in ipairs(deformationPoints) do
if #(GetVehicleDeformationAtPos(vehicle, def[1].x, def[1].y, def[1].z)) < def[2] then
local offset = def[1] * 2.0
SetVehicleDamage(vehicle, offset.x, offset.y, offset.z, def[2] * damageMult, 1000.0, true)
deform = true
end
end
iteration = iteration + 1
Wait(100)
end
SetVehicleDirtLevel(vehicle, dirt)
end)
end

View file

@ -0,0 +1,186 @@
local GARAGE_ZONE_Z_DIST = 4.0
local inVehicle, blips, zones, peds = nil, {}, {}, {}
local cachedGarageLocations
function getAvailableGarageLocations()
if not cachedGarageLocations then
cachedGarageLocations = lib.callback.await("jg-advancedgarages:server:get-available-garage-locations", false)
end
return cachedGarageLocations or {}
end
---@param coords vector3
---@param marker table
function drawMarkerOnFrame(coords, marker)
---@diagnostic disable-next-line: missing-parameter
DrawMarker(marker.id, coords.x, coords.y, coords.z, 0, 0, 0, 0, 0, 0, marker.size.x, marker.size.y, marker.size.z, marker.color.r, marker.color.g, marker.color.b, marker.color.a, marker.bobUpAndDown, marker.faceCamera, 0, marker.rotate, marker.drawOnEnts)
end
---@param name string
---@param coords vector3
---@param blipId integer
---@param blipColour integer
---@param blipScale number
local function createBlip(name, coords, blipId, blipColour, blipScale)
local blip = AddBlipForCoord(coords.x, coords.y, coords.z)
SetBlipSprite(blip, blipId)
SetBlipColour(blip, blipColour)
SetBlipScale(blip, blipScale)
SetBlipAsShortRange(blip, true)
BeginTextCommandSetBlipName("STRING")
AddTextComponentString(name)
EndTextCommandSetBlipName(blip)
return blip
end
---@param garageId string
---@param coords vector3|vector4
---@param dist number
---@param marker? table | false | nil
---@param onEnter? function
---@param onExit? function
---@param inside? function
local function createLocation(garageId, coords, dist, marker, onEnter, onExit, inside)
local point = lib.zones.box({
coords = coords,
size = vector3(dist, dist, GARAGE_ZONE_Z_DIST),
rotation = coords.w or 0,
garageId = garageId,
onEnter = onEnter,
onExit = onExit,
inside = inside
})
zones[#zones+1] = point
local markerPoint = lib.points.new({
coords = coords,
distance = dist * 4,
garageId = garageId
})
if not marker then return end
function markerPoint:nearby()
drawMarkerOnFrame(coords, marker)
end
zones[#zones+1] = markerPoint
end
---Runs on tick while ped is in a garage zone
---@param garageId string
---@param garageType "car"|"sea"|"air"
---@param isImpound boolean
local function pedIsInGarageZone(garageId, garageType, isImpound)
local pedIsInVehicle = cache.vehicle and GetPedInVehicleSeat(cache.vehicle, -1) == cache.ped
local prompt = isImpound and Config.OpenImpoundPrompt or (pedIsInVehicle and Config.InsertVehiclePrompt or Config.OpenGaragePrompt)
local action = function()
if pedIsInVehicle then
TriggerEvent("jg-advancedgarages:client:store-vehicle", garageId, garageType, false)
else
TriggerEvent("jg-advancedgarages:client:open-garage", garageId, garageType, false)
end
end
if inVehicle ~= pedIsInVehicle then
if Config.UseRadialMenu then
Framework.Client.RadialMenuAdd(garageId, prompt, action)
else
Framework.Client.ShowTextUI(prompt)
end
inVehicle = pedIsInVehicle
end
if Config.UseRadialMenu then return end
if IsControlJustPressed(0, isImpound and Config.OpenImpoundKeyBind or (pedIsInVehicle and Config.InsertVehicleKeyBind or Config.OpenGarageKeyBind)) then
action()
end
end
---@param garages table
local function createTargetZones(garages)
for _, ped in ipairs(peds) do
Framework.Client.RemoveTarget(ped)
end
for garageId, garage in pairs(garages) do
for _, zone in ipairs(zones) do zone:remove() end -- Remove existing zones
entity = Framework.Client.RegisterTarget(false, garage.coords, garageId, garage.type, garage.garageType)
peds[#peds+1] = entity
end
end
---@param garages table
local function createZones(garages)
for _, zone in ipairs(zones) do zone:remove() end -- Remove existing zones
for garageId, garage in pairs(garages) do
if garage then
-- Zone
createLocation(
garageId,
garage.coords,
garage.distance,
not garage.hideMarkers and garage.markers or false,
nil,
function()
if Config.UseRadialMenu then
Framework.Client.RadialMenuRemove(garageId)
else
Framework.Client.HideTextUI()
end
inVehicle = nil
end,
function()
pedIsInGarageZone(garageId, garage.type, garage.garageType == "impound")
end
)
end
end
end
local function createGarageZonesAndBlips()
for _, blip in ipairs(blips) do RemoveBlip(blip) end -- Remove existing blips
local garages = getAvailableGarageLocations()
if Config.UseTarget then
createTargetZones(garages)
else
createZones(garages)
end
for garageId, garage in pairs(garages) do
if garage then
-- Blip
if not garage.hideBlip then
local blipName = garage.garageType == "impound" and Locale.impound or garage.garageType == "job" and Locale.jobGarage or garage.garageType == "gang" and Locale.gangGarage or Locale.garage
if garage.uniqueBlips then blipName = blipName .. ": " .. garageId end
local blip = createBlip(blipName, garage.coords, garage.blip.id, garage.blip.color, garage.blip.scale)
blips[#blips + 1] = blip
end
end
end
end
RegisterNetEvent("jg-advancedgarages:client:update-blips-text-uis", function()
cachedGarageLocations = lib.callback.await("jg-advancedgarages:server:get-available-garage-locations", false)
createGarageZonesAndBlips()
end)
CreateThread(function()
Wait(2500)
createGarageZonesAndBlips()
end)
-- Delete peds in case the script restarts
AddEventHandler("onResourceStop", function(resourceName)
if (GetCurrentResourceName() == resourceName) then
for _, ped in ipairs(peds) do DeleteEntity(ped) end
end
end)

View file

@ -0,0 +1,67 @@
--
-- Custom code for common events
--
---@param vehicle integer Vehicle entity
---@param vehicleDbData table Vehicle row from the database
---@param type "personal" | "job" | "gang"
RegisterNetEvent("jg-advancedgarages:client:InsertVehicle:config", function(vehicle, vehicleDbData, type)
-- Code placed in here will be run when the player inserts their vehicle (if the vehicle is owned; and passes all the checks)
end)
---@param vehicle integer Vehicle entity
RegisterNetEvent("jg-advancedgarages:client:ImpoundVehicle:config", function(vehicle)
-- Code placed in here will be run just before the vehicle is set to impounded in the DB, and before the entity is deleted
end)
---@param vehicle integer Vehicle entity
---@param vehicleDbData table Vehicle row from the database
---@param type "personal" | "job" | "gang"
RegisterNetEvent("jg-advancedgarages:client:TakeOutVehicle:config", function(vehicle, vehicleDbData, type)
-- Code placed in here will be run after a vehicle has been taken out of a garage
end)
---@param plate string
---@param newOwnerPlayerId integer
RegisterNetEvent("jg-advancedgarages:client:TransferVehicle:config", function(plate, newOwnerPlayerId)
-- Code placed in here will be fired when a vehicle is transferred to another player via a public garage
end)
---@param vehicle integer Vehicle entity
---@param plate string
---@param garageId string
---@param vehicleDbData table Vehicle row from the database
---@param props table Vehicle properties
---@param fuel integer Fuel level
---@param body integer Body health
---@param engine integer Engine health
---@param damageModel table Damage model
RegisterNetEvent('jg-advancedgarages:client:insert-vehicle-verification', function(vehicle, plate, garageId, vehicleDbData, props, fuel, body, engine, damageModel, cb)
cb(true)
end)
---@param plate string
---@param vehicleDbData table Vehicle row from the database
---@param garageId string
lib.callback.register("jg-advancedgarages:client:takeout-vehicle-verification", function(plate, vehicleDbData, garageId)
return true
end)
-- Check whether a vehicle can be transferred between players, return false to prevent
---@param fromPlayerSrc integer
---@param toPlayerSrc integer
---@param plate string
---@return boolean allowTransfer
lib.callback.register("jg-advancedgarages:client:transfer-vehicle-verification", function(fromPlayerSrc, toPlayerSrc, plate)
return true
end)
-- Check whether a vehicle can be transferred between garages, return false to prevent
---@param currentGarageId string
---@param fromGarageId string
---@param toGarageId string
---@param plate string
---@return boolean allowTransfer
lib.callback.register("jg-advancedgarages:client:transfer-garage-verification", function(currentGarageId, fromGarageId, toGarageId, plate)
return true
end)

View file

@ -0,0 +1 @@
-- Add your own server code in here for custom functionality

View file

@ -0,0 +1,669 @@
-- Generated with https://configurator.jgscripts.com at 8/6/2025, 1:32:52 PM
Config = {}
Config.Locale = 'de'
Config.NumberAndDateFormat = 'en-US'
Config.Currency = 'USD'
Config.Framework = 'QBCore'
Config.FuelSystem = 'none'
Config.VehicleKeys = 'qb-vehiclekeys'
Config.Notifications = 'ox_lib'
Config.DrawText = 'jg-textui'
Config.OpenGarageKeyBind = 38
Config.OpenGaragePrompt = '[E] Open Garage'
Config.OpenImpoundKeyBind = 38
Config.OpenImpoundPrompt = '[E] Open Impound'
Config.InsertVehicleKeyBind = 38
Config.InsertVehiclePrompt = '[E] Store Vehicle'
Config.ExitInteriorKeyBind = 38
Config.ExitInteriorPrompt = '[E] Exit Garage'
Config.UseTarget = true
Config.TargetPed = 's_m_y_valet_01'
Config.Target = 'ox_target'
Config.UseRadialMenu = false
Config.RadialMenu = 'ox_lib'
Config.ShowVehicleImages = false
Config.DoNotSpawnInsideVehicle = false
Config.SaveVehicleDamage = true
Config.AdvancedVehicleDamage = true
Config.SaveVehiclePropsOnInsert = true
Config.SpawnVehiclesWithServerSetter = false
Config.TransferHidePlayerNames = false
Config.GarageVehicleTransferCost = 0
Config.EnableTransfers = {
betweenGarages = false,
betweenPlayers = true,
}
Config.AllowInfiniteVehicleSpawns = false
Config.JobGaragesAllowInfiniteVehicleSpawns = false
Config.GangGaragesAllowInfiniteVehicleSpawns = false
Config.GarageVehicleReturnCost = 0
Config.GarageVehicleReturnCostSocietyFund = false
Config.GarageShowBlips = true
Config.GarageUniqueBlips = false
Config.GarageUniqueLocations = true
Config.GarageEnableInteriors = true
Config.GarageLocations = {
['Legion Square'] = {
coords = vector3(215.09, -805.17, 30.81),
spawn = vector4(212.42, -798.77, 30.88, 336.61),
distance = 15,
type = 'car',
hideBlip = false,
blip = {
id = 357,
color = 0,
scale = 0.6,
},
hideMarkers = true,
markers = {
id = 21,
size = {
x = 0.3,
y = 0.3,
z = 0.3,
},
color = {
r = 255,
g = 255,
b = 255,
a = 120,
},
bobUpAndDown = 0,
faceCamera = 0,
rotate = 1,
drawOnEnts = 0,
},
},
['Islington South'] = {
coords = vector3(273.0, -343.85, 44.91),
spawn = vector4(270.75, -340.51, 44.92, 342.03),
distance = 15,
type = 'car',
hideBlip = false,
blip = {
id = 357,
color = 0,
scale = 0.6,
},
hideMarkers = true,
markers = {
id = 21,
size = {
x = 0.3,
y = 0.3,
z = 0.3,
},
color = {
r = 255,
g = 255,
b = 255,
a = 120,
},
bobUpAndDown = 0,
faceCamera = 0,
rotate = 1,
drawOnEnts = 0,
},
},
['Grove Street'] = {
coords = vector3(14.66, -1728.52, 29.3),
spawn = vector4(23.93, -1722.9, 29.3, 310.58),
distance = 15,
type = 'car',
hideBlip = false,
blip = {
id = 357,
color = 0,
scale = 0.6,
},
hideMarkers = true,
markers = {
id = 21,
size = {
x = 0.3,
y = 0.3,
z = 0.3,
},
color = {
r = 255,
g = 255,
b = 255,
a = 120,
},
bobUpAndDown = 0,
faceCamera = 0,
rotate = 1,
drawOnEnts = 0,
},
},
['Mirror Park'] = {
coords = vector3(1032.84, -765.1, 58.18),
spawn = vector4(1023.2, -764.27, 57.96, 319.66),
distance = 15,
type = 'car',
hideBlip = false,
blip = {
id = 357,
color = 0,
scale = 0.6,
},
hideMarkers = true,
markers = {
id = 21,
size = {
x = 0.3,
y = 0.3,
z = 0.3,
},
color = {
r = 255,
g = 255,
b = 255,
a = 120,
},
bobUpAndDown = 0,
faceCamera = 0,
rotate = 1,
drawOnEnts = 0,
},
},
Beach = {
coords = vector3(-1248.69, -1425.71, 4.32),
spawn = vector4(-1244.27, -1422.08, 4.32, 37.12),
distance = 15,
type = 'car',
hideBlip = false,
blip = {
id = 357,
color = 0,
scale = 0.6,
},
hideMarkers = true,
markers = {
id = 21,
size = {
x = 0.3,
y = 0.3,
z = 0.3,
},
color = {
r = 255,
g = 255,
b = 255,
a = 120,
},
bobUpAndDown = 0,
faceCamera = 0,
rotate = 1,
drawOnEnts = 0,
},
},
['Great Ocean Highway'] = {
coords = vector3(-2961.58, 375.93, 15.02),
spawn = vector4(-2964.96, 372.07, 14.78, 86.07),
distance = 15,
type = 'car',
hideBlip = false,
blip = {
id = 357,
color = 0,
scale = 0.6,
},
hideMarkers = true,
markers = {
id = 21,
size = {
x = 0.3,
y = 0.3,
z = 0.3,
},
color = {
r = 255,
g = 255,
b = 255,
a = 120,
},
bobUpAndDown = 0,
faceCamera = 0,
rotate = 1,
drawOnEnts = 0,
},
},
['Sandy South'] = {
coords = vector3(217.33, 2605.65, 46.04),
spawn = vector4(216.94, 2608.44, 46.33, 14.07),
distance = 15,
type = 'car',
hideBlip = false,
blip = {
id = 357,
color = 0,
scale = 0.6,
},
hideMarkers = true,
markers = {
id = 21,
size = {
x = 0.3,
y = 0.3,
z = 0.3,
},
color = {
r = 255,
g = 255,
b = 255,
a = 120,
},
bobUpAndDown = 0,
faceCamera = 0,
rotate = 1,
drawOnEnts = 0,
},
},
['Sandy North'] = {
coords = vector3(1878.44, 3760.1, 32.94),
spawn = vector4(1880.14, 3757.73, 32.93, 215.54),
distance = 15,
type = 'car',
hideBlip = false,
blip = {
id = 357,
color = 0,
scale = 0.6,
},
hideMarkers = true,
markers = {
id = 21,
size = {
x = 0.3,
y = 0.3,
z = 0.3,
},
color = {
r = 255,
g = 255,
b = 255,
a = 120,
},
bobUpAndDown = 0,
faceCamera = 0,
rotate = 1,
drawOnEnts = 0,
},
},
['North Vinewood Blvd'] = {
coords = vector3(365.21, 295.65, 103.46),
spawn = vector4(364.84, 289.73, 103.42, 164.23),
distance = 15,
type = 'car',
hideBlip = false,
blip = {
id = 357,
color = 0,
scale = 0.6,
},
hideMarkers = true,
markers = {
id = 21,
size = {
x = 0.3,
y = 0.3,
z = 0.3,
},
color = {
r = 255,
g = 255,
b = 255,
a = 120,
},
bobUpAndDown = 0,
faceCamera = 0,
rotate = 1,
drawOnEnts = 0,
},
},
Grapeseed = {
coords = vector3(1713.06, 4745.32, 41.96),
spawn = vector4(1710.64, 4746.94, 41.95, 90.11),
distance = 15,
type = 'car',
hideBlip = false,
blip = {
id = 357,
color = 0,
scale = 0.6,
},
hideMarkers = true,
markers = {
id = 21,
size = {
x = 0.3,
y = 0.3,
z = 0.3,
},
color = {
r = 255,
g = 255,
b = 255,
a = 120,
},
bobUpAndDown = 0,
faceCamera = 0,
rotate = 1,
drawOnEnts = 0,
},
},
['Paleto Bay'] = {
coords = vector3(107.32, 6611.77, 31.98),
spawn = vector4(110.84, 6607.82, 31.86, 265.28),
distance = 15,
type = 'car',
hideBlip = false,
blip = {
id = 357,
color = 0,
scale = 0.6,
},
hideMarkers = true,
markers = {
id = 21,
size = {
x = 0.3,
y = 0.3,
z = 0.3,
},
color = {
r = 255,
g = 255,
b = 255,
a = 120,
},
bobUpAndDown = 0,
faceCamera = 0,
rotate = 1,
drawOnEnts = 0,
},
},
Boats = {
coords = vector3(-795.15, -1510.79, 1.6),
spawn = vector4(-798.66, -1507.73, -0.47, 102.23),
distance = 20,
type = 'sea',
hideBlip = false,
blip = {
id = 410,
color = 0,
scale = 0.6,
},
hideMarkers = true,
markers = {
id = 21,
size = {
x = 0.3,
y = 0.3,
z = 0.3,
},
color = {
r = 255,
g = 255,
b = 255,
a = 120,
},
bobUpAndDown = 0,
faceCamera = 0,
rotate = 1,
drawOnEnts = 0,
},
},
Hangar = {
coords = vector3(-1243.49, -3391.88, 13.94),
spawn = vector4(-1258.4, -3394.56, 13.94, 328.23),
distance = 20,
type = 'air',
hideBlip = false,
blip = {
id = 423,
color = 0,
scale = 0.6,
},
hideMarkers = true,
markers = {
id = 21,
size = {
x = 0.3,
y = 0.3,
z = 0.3,
},
color = {
r = 255,
g = 255,
b = 255,
a = 120,
},
bobUpAndDown = 0,
faceCamera = 0,
rotate = 1,
drawOnEnts = 0,
},
},
}
Config.PrivGarageCreateCommand = 'privategarages'
Config.PrivGarageCreateJobRestriction = {
'realestate',
}
Config.PrivGarageEnableInteriors = true
Config.PrivGarageHideBlips = false
Config.PrivGarageBlip = {
id = 357,
color = 0,
scale = 0.7,
}
Config.JobGarageShowBlips = true
Config.JobGarageUniqueBlips = false
Config.JobGarageSetVehicleCommand = 'setjobvehicle'
Config.JobGarageRemoveVehicleCommand = 'removejobvehicle'
Config.JobGarageUniqueLocations = true
Config.JobGarageEnableInteriors = true
Config.JobGarageLocations = {
Mechanic = {
coords = vector3(157.86, -3005.9, 7.03),
spawn = vector4(165.26, -3014.94, 5.9, 268.8),
distance = 15,
job = {
'mechanic',
},
type = 'car',
vehiclesType = 'owned',
blip = {
id = 357,
color = 0,
scale = 0.6,
},
hideBlip = false,
hideMarkers = true,
markers = {
id = 21,
size = {
x = 0.3,
y = 0.3,
z = 0.3,
},
color = {
r = 255,
g = 255,
b = 255,
a = 120,
},
bobUpAndDown = 0,
faceCamera = 0,
rotate = 1,
drawOnEnts = 0,
},
},
Police = {
coords = vector3(434.48, -1016.97, 28.83),
spawn = {
vector4(434.55, -1014.54, 28.49, 91.56),
},
distance = 15,
type = 'car',
job = {
'police',
},
hideBlip = false,
vehiclesType = 'personal',
vehicles = {
{
model = 'police',
plate = 'PD',
minJobGrade = 0,
},
{
model = 'police2',
plate = false,
minJobGrade = 3,
},
},
blip = {
id = 357,
color = 0,
scale = 0.6,
},
hideMarkers = true,
markers = {
id = 21,
size = {
x = 0.3,
y = 0.3,
z = 0.3,
},
color = {
r = 255,
g = 255,
b = 255,
a = 120,
},
bobUpAndDown = 0,
faceCamera = 0,
rotate = 1,
drawOnEnts = 0,
},
showLiveriesExtrasMenu = true,
},
}
Config.GangGarageShowBlips = true
Config.GangGarageUniqueBlips = false
Config.GangGarageSetVehicleCommand = 'setgangvehicle'
Config.GangGarageRemoveVehicleCommand = 'removegangvehicle'
Config.GangGarageUniqueLocations = true
Config.GangGarageEnableInteriors = true
Config.GangGarageLocations = {}
Config.ImpoundCommand = 'iv'
Config.ImpoundFeesSocietyFund = false
Config.ImpoundShowBlips = true
Config.ImpoundUniqueBlips = false
Config.ImpoundTimeOptions = {
0,
1,
4,
12,
24,
72,
168,
}
Config.ImpoundLocations = {
['Impound A'] = {
coords = vector3(410.8, -1626.26, 29.29),
spawn = vector4(408.44, -1630.88, 29.29, 136.88),
distance = 15,
type = 'car',
job = {
'police',
},
blip = {
id = 68,
color = 0,
scale = 0.6,
},
hideBlip = false,
hideMarkers = true,
markers = {
id = 21,
size = {
x = 0.3,
y = 0.3,
z = 0.3,
},
color = {
r = 255,
g = 255,
b = 255,
a = 120,
},
bobUpAndDown = 0,
faceCamera = 0,
rotate = 1,
drawOnEnts = 0,
},
},
['Impound B'] = {
coords = vector3(1649.71, 3789.61, 34.79),
spawn = vector4(1643.66, 3798.36, 34.49, 216.16),
distance = 15,
type = 'car',
job = {
'police',
},
blip = {
id = 68,
color = 0,
scale = 0.6,
},
hideBlip = false,
hideMarkers = true,
markers = {
id = 21,
size = {
x = 0.3,
y = 0.3,
z = 0.3,
},
color = {
r = 255,
g = 255,
b = 255,
a = 120,
},
bobUpAndDown = 0,
faceCamera = 0,
rotate = 1,
drawOnEnts = 0,
},
},
}
Config.GarageInteriorEntrance = vector4(227.96, -1003.06, -99.0, 358.0)
Config.GarageInteriorVehiclePositions = {
vec4(233.000000, -984.000000, -99.410004, 118.000000),
vec4(233.000000, -988.500000, -99.410004, 118.000000),
vec4(233.000000, -993.000000, -99.410004, 118.000000),
vec4(233.000000, -997.500000, -99.410004, 118.000000),
vec4(233.000000, -1002.000000, -99.410004, 118.000000),
vec4(223.600006, -979.000000, -99.410004, 235.199997),
vec4(223.600006, -983.599976, -99.410004, 235.199997),
vec4(223.600006, -988.200012, -99.410004, 235.199997),
vec4(223.600006, -992.799988, -99.410004, 235.199997),
vec4(223.600006, -997.400024, -99.410004, 235.199997),
vec4(223.600006, -1002.000000, -99.410004, 235.199997),
}
Config.ChangeVehiclePlate = 'vplate'
Config.DeleteVehicleFromDB = 'dvdb'
Config.ReturnVehicleToGarage = 'vreturn'
Config.VehicleLabels = {
spawnName = 'Pretty Vehicle Label',
}
Config.PlayerTransferBlacklist = {
'spawnName',
}
Config.ReturnToPreviousRoutingBucket = false
Config.__v3Config = true

View file

@ -0,0 +1,535 @@
---@param text string
function Framework.Client.ShowTextUI(text)
if (Config.DrawText == "auto" and GetResourceState("jg-textui") == "started") or Config.DrawText == "jg-textui" then
exports["jg-textui"]:DrawText(text)
elseif (Config.DrawText == "auto" and GetResourceState("ox_lib") == "started") or Config.DrawText == "ox_lib" then
exports["ox_lib"]:showTextUI(text, {
position = "left-center"
})
elseif (Config.DrawText == "auto" and GetResourceState("okokTextUI") == "started") or Config.DrawText == "okokTextUI" then
exports["okokTextUI"]:Open(text, "lightblue", "left")
elseif (Config.DrawText == "auto" and GetResourceState("ps-ui") == "started") or Config.DrawText == "ps-ui" then
exports["ps-ui"]:DisplayText(text, "primary")
elseif Config.Framework == "QBCore" then
exports["qb-core"]:DrawText(text)
else
error("You do not have a TextUI system set up!")
end
end
function Framework.Client.HideTextUI()
if (Config.DrawText == "auto" and GetResourceState("jg-textui") == "started") or Config.DrawText == "jg-textui" then
exports["jg-textui"]:HideText()
elseif (Config.DrawText == "auto" and GetResourceState("ox_lib") == "started") or Config.DrawText == "ox_lib" then
exports["ox_lib"]:hideTextUI()
elseif (Config.DrawText == "auto" and GetResourceState("okokTextUI") == "started") or Config.DrawText == "okokTextUI" then
exports["okokTextUI"]:Close()
elseif (Config.DrawText == "auto" and GetResourceState("ps-ui") == "started") or Config.DrawText == "ps-ui" then
exports["ps-ui"]:HideText()
elseif Config.Framework == "QBCore" then
exports["qb-core"]:HideText()
else
error("You do not have a TextUI system set up!")
end
end
---@param garageId string
---@param text string
---@param onSelect function
function Framework.Client.RadialMenuAdd(garageId, text, onSelect)
if not Config.UseRadialMenu then return end
if (Config.RadialMenu == "auto" and GetResourceState("ox_lib") == "started") or Config.RadialMenu == "ox_lib" then
lib.addRadialItem({
id = garageId,
icon = "warehouse",
label = text,
onSelect = onSelect
})
else
error("You do not have a radial menu system set up!")
end
end
---@param garageId string
function Framework.Client.RadialMenuRemove(garageId)
if not Config.UseRadialMenu then return end
if (Config.RadialMenu == "auto" and GetResourceState("ox_lib") == "started") or Config.RadialMenu == "ox_lib" then
lib.removeRadialItem(garageId)
else
error("You do not have a radial menu system set up!")
end
end
---@param entity? integer|false
---@param coords vector4|vector3
---@param garageId string
---@param vehicleType "car"|"air"|"sea"
---@param garageType "personal"|"job"|"gang"|"impound"
---@return integer
function Framework.Client.RegisterTarget(entity, coords, garageId, vehicleType, garageType)
if not entity then
entity = createPedForTarget(coords)
end
if (Config.Target == "auto" and GetResourceState("ox_target") == "started") or Config.Target == "ox_target" then
exports.ox_target:addLocalEntity(entity, {
{
label = garageType == "impound" and Config.OpenImpoundPrompt or Config.OpenGaragePrompt,
icon = "warehouse",
onSelect = function()
TriggerEvent("jg-advancedgarages:client:open-garage", garageId, vehicleType, false)
end
},
garageType ~= "impound" and {
label = Config.InsertVehiclePrompt,
icon = "warehouse",
onSelect = function()
TriggerEvent("jg-advancedgarages:client:store-vehicle", garageId, vehicleType, false)
end
} or nil
})
elseif (Config.Target == "auto" and GetResourceState("qb-target") == "started") or Config.Target == "qb-target" then
exports["qb-target"]:AddTargetEntity(entity, {
options = {
{
label = garageType == "impound" and Config.OpenImpoundPrompt or Config.OpenGaragePrompt,
targeticon = "fas fa-warehouse",
action = function()
TriggerEvent("jg-advancedgarages:client:open-garage", garageId, vehicleType, false)
end
},
garageType ~= "impound" and {
label = Config.InsertVehiclePrompt,
targeticon = "fas fa-warehouse",
action = function()
TriggerEvent("jg-advancedgarages:client:store-vehicle", garageId, vehicleType, false)
end
} or nil
},
distance = 10.0
})
else
error("You do not have a target system set up!")
end
return entity
end
---@param entity integer
function Framework.Client.RemoveTarget(entity)
if not entity then return end
DeleteEntity(entity)
if (Config.Target == "auto" and GetResourceState("ox_target") == "started") or Config.Target == "ox_target" then
exports.ox_target:removeLocalEntity(entity)
elseif (Config.Target == "auto" and GetResourceState("qb-target") == "started") or Config.Target == "qb-target" then
exports["qb-target"]:RemoveTargetEntity(entity)
else
error("You do not have a target system set up!")
end
end
---@param msg string
---@param type? "success" | "warning" | "error"
---@param time? number
function Framework.Client.Notify(msg, type, time)
type = type or "success"
time = time or 5000
if (Config.Notifications == "auto" and GetResourceState("okokNotify") == "started") or Config.Notifications == "okokNotify" then
exports["okokNotify"]:Alert("Garages", msg, time, type)
elseif (Config.Notifications == "auto" and GetResourceState("ps-ui") == "started") or Config.Notifications == "ps-ui" then
exports["ps-ui"]:Notify(msg, type, time)
elseif (Config.Notifications == "auto" and GetResourceState("ox_lib") == "started") or Config.Notifications == "ox_lib" then
exports["ox_lib"]:notify({
title = "Garages",
description = msg,
type = type
})
else
if Config.Framework == "QBCore" then
return QBCore.Functions.Notify(msg, type, time)
elseif Config.Framework == "Qbox" then
exports.qbx_core:Notify(msg, type, time)
elseif Config.Framework == "ESX" then
return ESX.ShowNotification(msg, type)
end
end
end
RegisterNetEvent("jg-advancedgarages:client:notify", function(...)
Framework.Client.Notify(...)
end)
--
-- Player Functions
--
---@return table | false playerData
function Framework.Client.GetPlayerData()
if Config.Framework == "QBCore" then
return QBCore.Functions.GetPlayerData()
elseif Config.Framework == "Qbox" then
return exports.qbx_core:GetPlayerData()
elseif Config.Framework == "ESX" then
return ESX.GetPlayerData()
end
return false
end
---@return string | false identifier
function Framework.Client.GetPlayerIdentifier()
local playerData = Framework.Client.GetPlayerData()
if not playerData then return false end
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
return playerData.citizenid
elseif Config.Framework == "ESX" then
return playerData.identifier
end
return false
end
---@param type "cash" | "bank" | "money"
function Framework.Client.GetBalance(type)
if Config.Framework == "QBCore" then
return QBCore.Functions.GetPlayerData().money[type]
elseif Config.Framework == "Qbox" then
return exports.qbx_core:GetPlayerData().money[type]
elseif Config.Framework == "ESX" then
if type == "cash" then type = "money" end
for i, acc in pairs(ESX.GetPlayerData().accounts) do
if acc.name == type then
return acc.money
end
end
return 0
end
end
---@return {name: string, grade: number} | false job
function Framework.Client.GetPlayerJob()
local player = Framework.Client.GetPlayerData()
if not player or not player.job then return {} end
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
return {
name = player.job.name,
label = player.job.label,
grade = player.job.grade.level
}
elseif Config.Framework == "ESX" then
return {
name = player.job.name,
label = player.job.label,
grade = player.job.grade
}
end
return false
end
---@return {name: string, grade: number} | false gang
function Framework.Client.GetPlayerGang()
if (Config.Gangs == "auto" and GetResourceState("rcore_gangs") == "started") or Config.Gangs == "rcore_gangs" then
local gang = exports.rcore_gangs:GetPlayerGang()
if not gang then return {} end
return {
name = gang.name,
label = gang.name,
grade = 0 -- rcore_gangs' grade system are only strings
}
elseif (Config.Gangs == "auto" and GetResourceState("qb-gangs") == "started") or Config.Gangs == "qb-gangs" or Config.Framework == "QBCore" or Config.Framework == "Qbox" then
local player = Framework.Client.GetPlayerData()
if not player or not player.gang then return {} end
return {
name = player.gang.name,
label = player.gang.label,
grade = player.gang.grade.level
}
elseif Config.Framework == "ESX" then
-- To implement gangs in ESX, enable Config.GangEnableCustomESXIntegration & then add the necessary exports here.
-- It must return the same data structure as QB/X above, with { name, label, grade }
-- Heads up, you must also add the exports to sv-functions.lua -> Framework.Server.GetPlayerGang
error("ESX does not natively support gangs.");
end
return false
end
---@return boolean dead
function Framework.Client.IsPlayerDead()
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
local player = Framework.Client.GetPlayerData()
if not player then return false end
if player.metadata.isdead or player.metadata.inlaststand then
return true
end
elseif Config.Framework == "ESX" then
return IsEntityDead(cache.ped)
end
return false
end
--
-- Vehicle Functions
--
---@param vehicle integer
---@return number fuelLevel
function Framework.Client.VehicleGetFuel(vehicle)
if not DoesEntityExist(vehicle) then return 0 end
if (Config.FuelSystem == "LegacyFuel" or Config.FuelSystem == "ps-fuel" or Config.FuelSystem == "lj-fuel" or Config.FuelSystem == "cdn-fuel" or Config.FuelSystem == "hyon_gas_station" or Config.FuelSystem == "okokGasStation" or Config.FuelSystem == "nd_fuel" or Config.FuelSystem == "myFuel") then
return exports[Config.FuelSystem]:GetFuel(vehicle)
elseif Config.FuelSystem == "ti_fuel" then
local level, type = exports["ti_fuel"]:getFuel(vehicle)
TriggerServerEvent("jg-advancedgarages:server:save-ti-fuel-type", Framework.Client.GetPlate(vehicle), type)
return level
elseif Config.FuelSystem == "ox_fuel" or Config.FuelSystem == "Renewed-Fuel" then
return GetVehicleFuelLevel(vehicle)
elseif Config.FuelSystem == "rcore_fuel" then
return exports.rcore_fuel:GetVehicleFuelPercentage(vehicle)
else
return 65 -- or set up custom fuel system here...
end
end
---@param vehicle integer
---@param fuel number
function Framework.Client.VehicleSetFuel(vehicle, fuel)
if not DoesEntityExist(vehicle) then return false end
if (Config.FuelSystem == "LegacyFuel" or Config.FuelSystem == "ps-fuel" or Config.FuelSystem == "lj-fuel" or Config.FuelSystem == "cdn-fuel" or Config.FuelSystem == "hyon_gas_station" or Config.FuelSystem == "okokGasStation" or Config.FuelSystem == "nd_fuel" or Config.FuelSystem == "myFuel" or Config.FuelSystem == "Renewed-Fuel") then
exports[Config.FuelSystem]:SetFuel(vehicle, fuel)
elseif Config.FuelSystem == "ti_fuel" then
local fuelType = lib.callback.await("jg-advancedgarages:server:get-ti-fuel-type", false, Framework.Client.GetPlate(vehicle))
exports["ti_fuel"]:setFuel(vehicle, fuel, fuelType or nil)
elseif Config.FuelSystem == "ox_fuel" then
Entity(vehicle).state.fuel = fuel
elseif Config.FuelSystem == "rcore_fuel" then
exports.rcore_fuel:SetVehicleFuel(vehicle, fuel)
else
-- Setup custom fuel system here
end
end
---@param plate string
---@param vehicleEntity integer
---@param origin "personal" | "job" | "gang"
function Framework.Client.VehicleGiveKeys(plate, vehicleEntity, origin)
if not DoesEntityExist(vehicleEntity) then return false end
if not plate or plate == "" then
print("^1[ERROR] No plate provided to VehicleGiveKeys function^0")
return false
end
plate = plate:upper()
if Config.VehicleKeys == "qb-vehiclekeys" then
TriggerEvent("vehiclekeys:client:SetOwner", plate)
elseif Config.VehicleKeys == "qbx_vehiclekeys" then
TriggerEvent("vehiclekeys:client:SetOwner", plate)
-- lib.callback.await("qbx_vehiclekeys:server:giveKeys", false, VehToNet(vehicleEntity))
elseif Config.VehicleKeys == "jaksam-vehicles-keys" then
TriggerServerEvent("vehicles_keys:selfGiveVehicleKeys", plate)
elseif Config.VehicleKeys == "mk_vehiclekeys" then
exports["mk_vehiclekeys"]:AddKey(vehicleEntity)
elseif Config.VehicleKeys == "qs-vehiclekeys" then
local model = GetDisplayNameFromVehicleModel(GetEntityModel(vehicleEntity))
exports["qs-vehiclekeys"]:GiveKeys(plate, model)
elseif Config.VehicleKeys == "wasabi_carlock" then
exports.wasabi_carlock:GiveKey(plate)
elseif Config.VehicleKeys == "cd_garage" then
TriggerEvent("cd_garage:AddKeys", plate)
elseif Config.VehicleKeys == "okokGarage" then
TriggerServerEvent("okokGarage:GiveKeys", plate)
elseif Config.VehicleKeys == "t1ger_keys" then
if origin == "job" then
local vehicleName = GetDisplayNameFromVehicleModel(GetEntityModel(vehicleEntity))
exports['t1ger_keys']:GiveJobKeys(plate, vehicleName, true)
else
TriggerServerEvent("t1ger_keys:updateOwnedKeys", plate, true)
end
elseif Config.VehicleKeys == "MrNewbVehicleKeys" then
exports.MrNewbVehicleKeys:GiveKeys(vehicleEntity)
elseif Config.VehicleKeys == "Renewed" then
exports["Renewed-Vehiclekeys"]:addKey(plate)
elseif Config.VehicleKeys == "tgiann-hotwire" then
exports["tgiann-hotwire"]:CheckKeyInIgnitionWhenSpawn(vehicleEntity, plate)
else
-- Setup custom key system here...
end
end
---@param plate string
---@param vehicleEntity integer
---@param origin "personal" | "job" | "gang"
function Framework.Client.VehicleRemoveKeys(plate, vehicleEntity, origin)
if not DoesEntityExist(vehicleEntity) then return false end
if not plate or plate == "" then
print("^1[ERROR] No plate provided to VehicleRemoveKeys function^0")
return false
end
plate = plate:upper()
if Config.VehicleKeys == "qs-vehiclekeys" then
local model = GetDisplayNameFromVehicleModel(GetEntityModel(vehicleEntity))
exports["qs-vehiclekeys"]:RemoveKeys(plate, model)
elseif Config.VehicleKeys == "wasabi_carlock" then
exports.wasabi_carlock:RemoveKey(plate)
elseif Config.VehicleKeys == "t1ger_keys" then
TriggerServerEvent("t1ger_keys:updateOwnedKeys", plate, false)
elseif Config.VehicleKeys == "MrNewbVehicleKeys" then
exports.MrNewbVehicleKeys:RemoveKeys(vehicleEntity)
elseif Config.VehicleKeys == "Renewed" then
exports["Renewed-Vehiclekeys"]:removeKey(plate)
else
-- Setup custom key system here...
end
end
---@param vehicle table
---@return string|number|false model
function Framework.Client.GetModelColumn(vehicle)
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
return vehicle.vehicle or tonumber(vehicle.hash) or false
elseif Config.Framework == "ESX" then
if not vehicle or not vehicle.vehicle then return false end
if type(vehicle.vehicle) == "string" then
if not json.decode(vehicle.vehicle) then return false end
return json.decode(vehicle.vehicle).model
else
return vehicle.vehicle.model
end
end
return false
end
---@param vehicle integer
---@return table | false
function Framework.Client.GetModsColumn(vehicle)
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
if type(vehicle.mods) == "string" then
return json.decode(vehicle.mods)
else
return vehicle.mods
end
elseif Config.Framework == "ESX" then
if type(vehicle.vehicle) == "string" then
return json.decode(vehicle.vehicle)
else
return vehicle.vehicle
end
end
return false
end
---@param vehicle integer
---@return table|false props
function Framework.Client.GetVehicleProperties(vehicle)
if GetResourceState("jg-mechanic") == "started" then
return exports["jg-mechanic"]:getVehicleProperties(vehicle)
else
if Config.Framework == "QBCore" then
return QBCore.Functions.GetVehicleProperties(vehicle)
elseif Config.Framework == "Qbox" then
return lib.getVehicleProperties(vehicle) or false
elseif Config.Framework == "ESX" then
return ESX.Game.GetVehicleProperties(vehicle)
end
end
return false
end
---@param vehicle integer
---@param props table
function Framework.Client.SetVehicleProperties(vehicle, props)
if GetResourceState("jg-mechanic") == "started" then
return exports["jg-mechanic"]:setVehicleProperties(vehicle, props)
else
if Config.Framework == "QBCore" then
return QBCore.Functions.SetVehicleProperties(vehicle, props)
elseif Config.Framework == "Qbox" then
return lib.setVehicleProperties(vehicle, props)
elseif Config.Framework == "ESX" then
return ESX.Game.SetVehicleProperties(vehicle, props)
end
end
end
---@param vehicle integer
---@return string|false plate
function Framework.Client.GetPlate(vehicle)
local plate = GetVehicleNumberPlateText(vehicle)
if not plate or plate == nil or plate == "" then return false end
if GetResourceState("brazzers-fakeplates") == "started" then
local originalPlate = lib.callback.await("jg-advancedgarages:server:brazzers-get-plate-from-fakeplate", false, plate)
if originalPlate then plate = originalPlate end
end
local trPlate = string.gsub(plate, "^%s*(.-)%s*$", "%1")
return trPlate
end
-- Get a nice vehicle label from either QBCore shared or GTA natives
---@param model string | number
function Framework.Client.GetVehicleLabel(model)
local hash = convertModelToHash(model)
if Config.VehicleLabels[model] then
return Config.VehicleLabels[model]
end
if Config.VehicleLabels[tostring(hash)] then
return Config.VehicleLabels[tostring(hash)]
end
if type(model) == "string" and Config.Framework == "QBCore" then
local vehShared = QBCore.Shared.Vehicles?[model]
if vehShared then
return vehShared.brand .. " " .. vehShared.name
end
end
if Config.Framework == "Qbox" then
local vehShared = exports.qbx_core:GetVehiclesByHash()?[hash]
if vehShared then
return vehShared.brand .. " " .. vehShared.name
end
end
local makeName = GetMakeNameFromVehicleModel(hash)
local modelName = GetDisplayNameFromVehicleModel(hash)
local label = GetLabelText(makeName) .. " " .. GetLabelText(modelName)
if makeName == "CARNOTFOUND" or modelName == "CARNOTFOUND" then
label = tostring(model)
else
if GetLabelText(modelName) == "NULL" and GetLabelText(makeName) == "NULL" then
label = (makeName or "") .. " " .. (modelName or "")
elseif GetLabelText(makeName) == "NULL" then
label = GetLabelText(modelName)
end
end
return label
end

View file

@ -0,0 +1,37 @@
if (Config.Framework == "auto" and GetResourceState("es_extended") == "started") or Config.Framework == "ESX" then
-- Player data
Globals.PlayerData = ESX.GetPlayerData()
RegisterNetEvent("esx:playerLoaded")
AddEventHandler("esx:playerLoaded", function(xPlayer)
Globals.PlayerData = xPlayer
TriggerEvent("jg-advancedgarages:client:update-blips-text-uis")
end)
RegisterNetEvent("esx:setJob")
AddEventHandler("esx:setJob", function(job)
Globals.PlayerData.job = job
TriggerEvent("jg-advancedgarages:client:update-blips-text-uis")
end)
-- ESX admincar replacement
RegisterNetEvent("jg-advancedgarages:client:set-vehicle-owned", function()
local vehicle = cache.vehicle
local vehicleProps = Framework.Client.GetVehicleProperties(vehicle)
if not vehicleProps then return end
if not vehicle or vehicle == 0 then
return Framework.Client.Notify(Locale.notInsideVehicleError, "error")
end
local plate = vehicleProps.plate
local vehicleModel = GetEntityArchetypeName(vehicle)
local veh = lib.callback.await("jg-advancedgarages:server:get-vehicle", false, vehicleModel, plate)
if veh then
return Framework.Client.Notify(Locale.vehiclePlateExistsError, "error")
end
TriggerServerEvent("jg-advancedgarages:server:set-vehicle-owned", vehicleProps)
end)
end

View file

@ -0,0 +1,23 @@
if (Config.Framework == "auto" and GetResourceState("es_extended") == "started") or Config.Framework == "ESX" then
-- /admincar db insert
RegisterNetEvent("jg-advancedgarages:server:set-vehicle-owned", function(vehicleProps)
local src = source
if not Framework.Server.IsAdmin(src) then
return Framework.Server.Notify(src, "INSUFFICIENT_PERMISSIONS", "error")
end
local player = ESX.GetPlayerFromId(src)
MySQL.insert.await("INSERT INTO owned_vehicles (owner, plate, vehicle) VALUES (?, ?, ?)", {
player.identifier, vehicleProps.plate, json.encode(vehicleProps)
})
Framework.Server.Notify(src, string.gsub(Locale.vehicleReceived, "%%{value}", vehicleProps.plate))
end)
-- /admincar command
ESX.RegisterCommand("admincar", "admin", function(xPlayer)
TriggerClientEvent("jg-advancedgarages:client:set-vehicle-owned", xPlayer.source)
end, false)
end

View file

@ -0,0 +1,61 @@
QBCore, ESX = nil, nil
Framework = {
Client = {},
Server = {},
Queries = {
GetVehicles = "SELECT * FROM %s WHERE %s = ? AND job_vehicle = 0 AND gang_vehicle = 0",
GetJobVehicles = "SELECT * FROM %s WHERE %s = ? AND job_vehicle = 1 AND job_vehicle_rank <= ?",
GetGangVehicles = "SELECT * FROM %s WHERE %s = ? AND gang_vehicle = 1 AND gang_vehicle_rank <= ?",
GetImpoundVehiclesWhitelist = "SELECT * FROM %s WHERE garage_id = ? AND impound = 1",
GetImpoundVehiclesPublic = "SELECT * FROM %s WHERE garage_id = ? AND impound = 1 AND impound_retrievable = 1 AND (%s = ? OR %s = ? OR %s = ?)",
GetVehicle = "SELECT * FROM %s WHERE %s = ? AND plate = ?",
GetVehicleNoIdentifier = "SELECT * FROM %s WHERE plate = ?",
GetVehiclePlateOnly = "SELECT plate FROM %s WHERE plate = ?",
GetPrivateGarages = "SELECT * FROM player_priv_garages WHERE owners LIKE ?",
StoreVehicle = "UPDATE %s SET in_garage = 1, garage_id = ?, fuel = ?, body = ?, engine = ?, damage = ? WHERE %s IN (?) AND plate = ?",
SetInGarage = "UPDATE %s SET in_garage = 1 WHERE plate = ?",
UpdateProps = "UPDATE %s SET %s = ? WHERE plate = ?",
VehicleDriveOut = "UPDATE %s SET in_garage = 0 WHERE %s = ? AND plate = ?",
UpdateGarageId = "UPDATE %s SET garage_id = ? WHERE %s = ? AND plate = ?",
UpdatePlayerId = "UPDATE %s SET %s = ? WHERE %s = ? AND plate = ?",
UpdateVehicleNickname = "UPDATE %s SET nickname = ? WHERE %s = ? AND plate = ?",
UpdateVehiclePlate = "UPDATE %s SET plate = ?, %s = ? WHERE plate = ?",
ImpoundVehicle = "UPDATE %s SET impound = 1, impound_retrievable = ?, impound_data = ?, garage_id = ?, fuel = ?, body = ?, engine = ?, damage = ? WHERE plate = ?",
ImpoundReturnToGarage = "UPDATE %s SET impound = 0, impound_data = '', garage_id = ?, in_garage = ? WHERE plate = ?",
SetJobVehicle = "UPDATE %s SET %s = ?, job_vehicle = 1, job_vehicle_rank = ? WHERE plate = ?",
SetGangVehicle = "UPDATE %s SET %s = ?, gang_vehicle = 1, gang_vehicle_rank = ? WHERE plate = ?",
SetSocietyVehicleAsPlayerOwned = "UPDATE %s SET %s = ?, job_vehicle = 0, gang_vehicle = 0 WHERE plate = ?",
DeleteVehicle = "DELETE FROM %s WHERE plate = ?",
}
}
if (Config.Framework == "auto" and GetResourceState("qbx_core") == "started") or Config.Framework == "Qbox" then
Config.Framework = "Qbox"
Framework.VehiclesTable = "player_vehicles"
Framework.PlayerIdentifier = "citizenid"
Framework.VehProps = "mods"
Framework.PlayersTable = "players"
Framework.PlayersTableId = "citizenid"
elseif (Config.Framework == "auto" and GetResourceState("qb-core") == "started") or Config.Framework == "QBCore" then
QBCore = exports['qb-core']:GetCoreObject()
Config.Framework = "QBCore"
Framework.VehiclesTable = "player_vehicles"
Framework.PlayerIdentifier = "citizenid"
Framework.VehProps = "mods"
Framework.PlayersTable = "players"
Framework.PlayersTableId = "citizenid"
elseif (Config.Framework == "auto" and GetResourceState("es_extended") == "started") or Config.Framework == "ESX" then
ESX = exports["es_extended"]:getSharedObject()
Config.Framework = "ESX"
Framework.VehiclesTable = "owned_vehicles"
Framework.PlayerIdentifier = "owner"
Framework.VehProps = "vehicle"
Framework.PlayersTable = "users"
Framework.PlayersTableId = "identifier"
else
error("You need to set the Config.Framework to either \"QBCore\" or \"ESX\" or \"Qbox\"!")
end

View file

@ -0,0 +1,22 @@
if (Config.Framework == "auto" and GetResourceState("qb-core") == "started") or Config.Framework == "QBCore" then
-- Player data
Globals.PlayerData = QBCore.Functions.GetPlayerData()
RegisterNetEvent("QBCore:Client:OnPlayerLoaded")
AddEventHandler("QBCore:Client:OnPlayerLoaded", function()
Globals.PlayerData = QBCore.Functions.GetPlayerData()
TriggerEvent("jg-advancedgarages:client:update-blips-text-uis")
end)
RegisterNetEvent("QBCore:Client:OnJobUpdate")
AddEventHandler("QBCore:Client:OnJobUpdate", function(job)
Globals.PlayerData.job = job
TriggerEvent("jg-advancedgarages:client:update-blips-text-uis")
end)
RegisterNetEvent("QBCore:Client:OnGangUpdate")
AddEventHandler("QBCore:Client:OnGangUpdate", function(gang)
Globals.PlayerData.gang = gang
TriggerEvent("jg-advancedgarages:client:update-blips-text-uis")
end)
end

View file

@ -0,0 +1,55 @@
if (Config.Framework == "auto" and GetResourceState("qb-core") == "started") or Config.Framework == "QBCore" then
-- qb-phone fix
QBCore.Functions.CreateCallback("jg-advancedgarages:server:GetVehiclesPhone", function(source, cb)
local Player = QBCore.Functions.GetPlayer(source)
local vehicles = MySQL.query.await("SELECT * FROM player_vehicles WHERE citizenid = ? AND job_vehicle = ? AND gang_vehicle = ?", {Player.PlayerData.citizenid, 0, 0})
for i, vehicle in pairs(vehicles) do
local vehShared = QBCore.Shared.Vehicles[vehicle.vehicle]
local vehBrand, vehName, vehState
local vehGarage = vehicle.garage_id
if vehShared then
vehBrand = vehShared.brand
vehName = vehShared.name
else
vehBrand = ""
vehName = vehicle.vehicle
end
if vehicle.impound == 1 then
vehGarage = Locale.impound
vehState = json.decode(vehicle.impound_data).reason
elseif vehicle.in_garage then
vehState = Locale.inGarage
else
vehState = Locale.notInGarage
end
vehicles[i] = {
fullname = vehBrand .. " " .. vehName,
brand = vehBrand,
model = vehName,
garage = vehGarage,
state = vehState,
plate = vehicle.plate,
fuel = vehicle.fuel,
engine = vehicle.engine,
body = vehicle.body
}
end
cb(vehicles)
end)
-- qb-vehiclesales fix
QBCore.Functions.CreateCallback("qb-garage:server:checkVehicleOwner", function(source, cb, plate)
local src = source
local pData = QBCore.Functions.GetPlayer(src)
local result = MySQL.single.await("SELECT * FROM player_vehicles WHERE plate = ? AND citizenid = ?", {plate, pData.PlayerData.citizenid})
if result then cb(true, result.balance)
else cb(false) end
end)
end

View file

@ -0,0 +1,22 @@
if (Config.Framework == "auto" and GetResourceState("qbx_core") == "started") or Config.Framework == "Qbox" then
-- Player data
Globals.PlayerData = exports.qbx_core:GetPlayerData()
RegisterNetEvent("QBCore:Client:OnPlayerLoaded")
AddEventHandler("QBCore:Client:OnPlayerLoaded", function()
Globals.PlayerData = exports.qbx_core:GetPlayerData()
TriggerEvent("jg-advancedgarages:client:update-blips-text-uis")
end)
RegisterNetEvent("QBCore:Client:OnJobUpdate")
AddEventHandler("QBCore:Client:OnJobUpdate", function(job)
Globals.PlayerData.job = job
TriggerEvent("jg-advancedgarages:client:update-blips-text-uis")
end)
RegisterNetEvent("QBCore:Client:OnGangUpdate")
AddEventHandler("QBCore:Client:OnGangUpdate", function(gang)
Globals.PlayerData.gang = gang
TriggerEvent("jg-advancedgarages:client:update-blips-text-uis")
end)
end

View file

@ -0,0 +1,317 @@
--
-- Core Functions
--
---@param src integer
---@param msg string
---@param type "success" | "warning" | "error"
function Framework.Server.Notify(src, msg, type)
TriggerClientEvent("jg-advancedgarages:client:notify", src, msg, type, 5000)
end
---@param src integer
---@returns boolean
function Framework.Server.IsAdmin(src)
return IsPlayerAceAllowed(tostring(src), "command") or false
end
function Framework.Server.PayIntoSocietyFund(jobName, money)
local usingNewQBBanking = GetResourceState("qb-banking") == "started" and tonumber(string.sub(GetResourceMetadata("qb-banking", "version", 0), 1, 3)) >= 2
if (Config.Banking == "auto" and GetResourceState("Renewed-Banking") == "started") or Config.Banking == "Renewed-Banking" then
exports['Renewed-Banking']:addAccountMoney(jobName, money)
elseif (Config.Banking == "auto" and GetResourceState("okokBanking") == "started") or Config.Banking == "okokBanking" then
exports['okokBanking']:AddMoney(jobName, money)
elseif (Config.Banking == "auto" and GetResourceState("fd_banking") == "started") or Config.banking == "fd_banking" then
exports.fd_banking:AddMoney(jobName, money)
elseif (Config.Banking == "auto" and (Config.Framework == "QBCore" or Config.Framework == "Qbox")) then
if usingNewQBBanking then
exports["qb-banking"]:AddMoney(jobName, money)
else
exports["qb-management"]:AddMoney(jobName, money)
end
elseif Config.Banking == "qb-banking" then
exports["qb-banking"]:AddMoney(jobName, money)
elseif Config.Banking == "qb-management" then
exports["qb-management"]:AddMoney(jobName, money)
elseif (Config.Banking == "auto" and Config.Framework == "ESX") or Config.Banking == "esx_addonaccount" then
TriggerEvent("esx_society:getSociety", jobName, function(society)
TriggerEvent("esx_addonaccount:getSharedAccount", society.account, function(account)
account.addMoney(money)
end)
end)
end
end
--
-- Player Functions
--
---@param src integer
function Framework.Server.GetPlayer(src)
if Config.Framework == "QBCore" then
return QBCore.Functions.GetPlayer(src)
elseif Config.Framework == "Qbox" then
return exports.qbx_core:GetPlayer(src)
elseif Config.Framework == "ESX" then
return ESX.GetPlayerFromId(src)
end
end
---@param src integer
function Framework.Server.GetPlayerInfo(src)
local player = Framework.Server.GetPlayer(src)
if not player then return false end
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
return {
name = player.PlayerData.charinfo.firstname .. " " .. player.PlayerData.charinfo.lastname
}
elseif Config.Framework == "ESX" then
return {
name = player.getName()
}
end
end
---@param src integer
---@return {name:string,label:string,grade:number} | false
function Framework.Server.GetPlayerJob(src)
local player = Framework.Server.GetPlayer(src)
if not player then return false end
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
if not player.PlayerData then return false end
return {
name = player.PlayerData.job.name,
label = player.PlayerData.job.label,
grade = player.PlayerData.job.grade?.level or 0,
}
elseif Config.Framework == "ESX" then
return {
name = player.job.name,
label = player.job.label,
grade = player.job.grade
}
end
return false
end
---@param src integer
---@return {name:string,label:string,grade:number} | false
function Framework.Server.GetPlayerGang(src)
if (Config.Gangs == "auto" and GetResourceState("rcore_gangs") == "started") or Config.Gangs == "rcore_gangs" then
local gang = exports.rcore_gangs:GetPlayerGang(src)
if not gang then return {} end
return {
name = gang.name,
label = gang.name,
grade = 0 -- rcore_gangs' grade system are only strings
}
elseif (Config.Gangs == "auto" and GetResourceState("qb-gangs") == "started") or Config.Gangs == "qb-gangs" or Config.Framework == "QBCore" or Config.Framework == "Qbox" then
local player = Framework.Server.GetPlayer(src)
if not player then return false end
return {
name = player.PlayerData.gang.name,
label = player.PlayerData.gang.label,
grade = player.PlayerData.gang.grade.level
}
elseif Config.Framework == "ESX" then
-- To implement gangs in ESX, enable Config.GangEnableCustomESXIntegration & then add the necessary exports here.
-- It must return the same data structure as QB/X above, with { name, label, grade }
-- Heads up, you must also add the exports to cl-functions.lua -> Framework.Client.GetPlayerGang
error("ESX does not natively support gangs.");
end
return false
end
---@param src integer
function Framework.Server.GetPlayerIdentifier(src)
local player = Framework.Server.GetPlayer(src)
if not player then return false end
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
return player.PlayerData.citizenid
elseif Config.Framework == "ESX" then
return player.getIdentifier()
end
end
---@param identifier string
function Framework.Server.GetSrcFromIdentifier(identifier)
if Config.Framework == "QBCore" then
local player = QBCore.Functions.GetPlayerByCitizenId(identifier)
if not player then return false end
return player.PlayerData.source
elseif Config.Framework == "Qbox" then
local player = exports.qbx_core:GetPlayerByCitizenId(identifier)
if not player then return false end
return player.PlayerData.source
elseif Config.Framework == "ESX" then
local xPlayer = ESX.GetPlayerFromIdentifier(identifier)
if not xPlayer then return false end
return xPlayer.source
end
end
---@param src integer
---@param type "cash" | "bank" | "money"
function Framework.Server.GetPlayerBalance(src, type)
local player = Framework.Server.GetPlayer(src)
if not player then return 0 end
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
return player.PlayerData.money[type]
elseif Config.Framework == "ESX" then
if type == "cash" then type = "money" end
for i, acc in pairs(player.getAccounts()) do
if acc.name == type then
return acc.money
end
end
return 0
end
end
---@param src integer
---@param amount number
---@param account "cash" | "bank" | "money"
---@return boolean success
function Framework.Server.PlayerRemoveMoney(src, amount, account)
local player = Framework.Server.GetPlayer(src)
account = account or "bank"
if Framework.Server.GetPlayerBalance(src, account) < amount then
Framework.Server.Notify(src, Locale.notEnoughMoneyError, "error")
return false
end
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
player.Functions.RemoveMoney(account, round(amount, 0))
elseif Config.Framework == "ESX" then
if account == "cash" then account = "money" end
player.removeAccountMoney(account, round(amount, 0))
end
return true
end
---@return {id:number,identifier:string,name:string}[] players
function Framework.Server.GetPlayers()
local players = {}
for _, playerId in ipairs(GetPlayers()) do
players[#players+1] = {
id = tonumber(playerId),
identifier = Framework.Server.GetPlayerIdentifier(tonumber(playerId, 10)),
name = Framework.Server.GetPlayerInfo(tonumber(playerId, 10))?.name
}
end
return players
end
---@return table | false jobs
function Framework.Server.GetJobs()
if Config.Framework == "QBCore" then
return QBCore.Shared.Jobs
elseif Config.Framework == "Qbox" then
return exports.qbx_core:GetJobs()
elseif Config.Framework == "ESX" then
return ESX.GetJobs()
end
return false
end
---@return table | false gangs
function Framework.Server.GetGangs()
if (Config.Gangs == "auto" and GetResourceState("rcore_gangs") == "started") or Config.Gangs == "rcore_gangs" then
local gangs = MySQL.query.await("SELECT name FROM gangs")
return gangs or {}
elseif (Config.Gangs == "auto" and GetResourceState("qb-gangs") == "started") or Config.Gangs == "qb-gangs" then
if Config.Framework == "QBCore" then
return QBCore.Shared.Gangs
elseif Config.Framework == "Qbox" then
return exports.qbx_core:GetGangs()
end
elseif Config.Framework == "ESX" then
error("ESX does not natively support gangs.");
end
return false
end
---@param vehicle integer
---@return string | false plate
function Framework.Server.GetPlate(vehicle)
local plate = GetVehicleNumberPlateText(vehicle)
if not plate or plate == nil or plate == "" then return false end
if GetResourceState("brazzers-fakeplates") == "started" then
local originalPlate = MySQL.scalar.await("SELECT plate FROM player_vehicles WHERE fakeplate = ?", {plate})
if originalPlate then plate = originalPlate end
end
local trPlate = string.gsub(plate, "^%s*(.-)%s*$", "%1")
return trPlate
end
---@param vehicle boolean|QueryResult|unknown|{ [number]: { [string]: unknown }|{ [string]: unknown }}
---@return string | number | false model
function Framework.Server.GetModelColumn(vehicle)
if Config.Framework == "QBCore" or Config.Framework == "Qbox" then
return vehicle.vehicle or tonumber(vehicle.hash) or false
elseif Config.Framework == "ESX" then
if not vehicle or not vehicle.vehicle then return false end
if type(vehicle.vehicle) == "string" then
if not json.decode(vehicle.vehicle) then return false end
return json.decode(vehicle.vehicle).model
else
return vehicle.vehicle.model
end
end
return false
end
--
-- ti_fuel
--
RegisterNetEvent("jg-advancedgarages:server:save-ti-fuel-type", function(plate, type)
MySQL.query.await("ALTER TABLE " .. Framework.VehiclesTable .. " ADD COLUMN IF NOT EXISTS `ti_fuel_type` VARCHAR(100) DEFAULT '';")
MySQL.update.await("UPDATE " .. Framework.VehiclesTable .. " SET ti_fuel_type = ? WHERE plate = ?", {type, plate});
end)
lib.callback.register("jg-advancedgarages:server:get-ti-fuel-type", function(src, plate)
MySQL.query.await("ALTER TABLE " .. Framework.VehiclesTable .. " ADD COLUMN IF NOT EXISTS `ti_fuel_type` VARCHAR(100) DEFAULT '';")
return MySQL.scalar.await("SELECT ti_fuel_type FROM " .. Framework.VehiclesTable .. " WHERE plate = ?", {plate}) or false
end)
--
-- Brazzers-FakePlates
--
if GetResourceState("brazzers-fakeplates") == "started" then
lib.callback.register("jg-advancedgarages:server:brazzers-get-plate-from-fakeplate", function(_, fakeplate)
local result = MySQL.scalar.await("SELECT plate FROM player_vehicles WHERE fakeplate = ?", {fakeplate})
if result then return result end
return false
end)
lib.callback.register("jg-advancedgarages:server:brazzers-get-fakeplate-from-plate", function(_, plate)
local result = MySQL.scalar.await("SELECT fakeplate FROM player_vehicles WHERE plate = ?", {plate})
if result then return result end
return false
end)
end

View file

@ -0,0 +1,56 @@
fx_version "cerulean"
game "gta5"
lua54 "yes"
description "For support or other queries: discord.gg/jgscripts"
version 'v3.2.3'
author "JG Scripts"
dependencies {
"oxmysql",
"ox_lib",
"/server:7290",
"/onesync",
}
shared_scripts {
"@ox_lib/init.lua",
"config/config.lua",
"locales/*.lua",
"shared/main.lua",
"framework/main.lua"
}
client_scripts {
"framework/**/cl-*.lua",
"config/config-cl.lua",
"client/cl-main.lua",
"client/*.lua"
}
server_scripts {
"@oxmysql/lib/MySQL.lua",
"framework/**/sv-*.lua",
"config/config-sv.lua",
"server/sv-main.lua",
"server/*.lua"
}
ui_page "web/dist/index.html"
files {
"web/dist/index.html",
"web/dist/**/*",
"vehicle_images/*"
}
escrow_ignore {
"config/**/*",
"framework/**/*",
"locales/*.lua",
"client/cl-deformation.lua",
"client/cl-locations.lua",
"server/sv-webhooks.lua"
}
dependency '/assetpacks'

View file

@ -0,0 +1,28 @@
-- player_vehicles
ALTER TABLE `owned_vehicles` ADD COLUMN IF NOT EXISTS `fuel` INT(10) DEFAULT '100';
ALTER TABLE `owned_vehicles` ADD COLUMN IF NOT EXISTS `engine` INT(10) DEFAULT '1000';
ALTER TABLE `owned_vehicles` ADD COLUMN IF NOT EXISTS `body` INT(10) DEFAULT '1000';
ALTER TABLE `owned_vehicles` ADD COLUMN IF NOT EXISTS `damage` LONGTEXT DEFAULT '';
ALTER TABLE `owned_vehicles` ADD COLUMN IF NOT EXISTS `in_garage` TINYINT(1) DEFAULT '1';
ALTER TABLE `owned_vehicles` ADD COLUMN IF NOT EXISTS `garage_id` VARCHAR(255) DEFAULT 'Legion Square';
ALTER TABLE `owned_vehicles` ADD COLUMN IF NOT EXISTS `job_vehicle` TINYINT(1) DEFAULT '0';
ALTER TABLE `owned_vehicles` ADD COLUMN IF NOT EXISTS `job_vehicle_rank` INT(10) DEFAULT '0';
ALTER TABLE `owned_vehicles` ADD COLUMN IF NOT EXISTS `gang_vehicle` TINYINT(1) DEFAULT '0';
ALTER TABLE `owned_vehicles` ADD COLUMN IF NOT EXISTS `gang_vehicle_rank` INT(10) DEFAULT '0';
ALTER TABLE `owned_vehicles` ADD COLUMN IF NOT EXISTS `impound` INT(10) DEFAULT '0';
ALTER TABLE `owned_vehicles` ADD COLUMN IF NOT EXISTS `impound_retrievable` INT(10) DEFAULT '0';
ALTER TABLE `owned_vehicles` ADD COLUMN IF NOT EXISTS `impound_data` LONGTEXT DEFAULT '';
ALTER TABLE `owned_vehicles` ADD COLUMN IF NOT EXISTS `nickname` VARCHAR(255) DEFAULT '';
CREATE TABLE IF NOT EXISTS `player_priv_garages` (
`id` INT(11) unsigned NOT NULL AUTO_INCREMENT,
`owners` longtext,
`name` VARCHAR(255),
`type` VARCHAR(50),
`x` FLOAT,
`y` FLOAT,
`z` FLOAT,
`h` FLOAT,
`distance` INT(11) DEFAULT '10',
PRIMARY KEY (`id`)
);

View file

@ -0,0 +1,25 @@
-- player_vehicles
ALTER TABLE `player_vehicles` ADD COLUMN IF NOT EXISTS `damage` LONGTEXT DEFAULT '';
ALTER TABLE `player_vehicles` ADD COLUMN IF NOT EXISTS `in_garage` TINYINT(1) DEFAULT '1';
ALTER TABLE `player_vehicles` ADD COLUMN IF NOT EXISTS `garage_id` VARCHAR(255) DEFAULT 'Legion Square';
ALTER TABLE `player_vehicles` ADD COLUMN IF NOT EXISTS `job_vehicle` TINYINT(1) DEFAULT '0';
ALTER TABLE `player_vehicles` ADD COLUMN IF NOT EXISTS `job_vehicle_rank` INT(10) DEFAULT '0'; -- NEW
ALTER TABLE `player_vehicles` ADD COLUMN IF NOT EXISTS `gang_vehicle` TINYINT(1) DEFAULT '0';
ALTER TABLE `player_vehicles` ADD COLUMN IF NOT EXISTS `gang_vehicle_rank` INT(10) DEFAULT '0';
ALTER TABLE `player_vehicles` ADD COLUMN IF NOT EXISTS `impound` INT(10) DEFAULT '0';
ALTER TABLE `player_vehicles` ADD COLUMN IF NOT EXISTS `impound_retrievable` INT(10) DEFAULT '0';
ALTER TABLE `player_vehicles` ADD COLUMN IF NOT EXISTS `impound_data` LONGTEXT DEFAULT '';
ALTER TABLE `player_vehicles` ADD COLUMN IF NOT EXISTS `nickname` VARCHAR(255) DEFAULT '';
CREATE TABLE IF NOT EXISTS `player_priv_garages` (
`id` INT(11) unsigned NOT NULL AUTO_INCREMENT,
`owners` longtext,
`name` VARCHAR(255),
`type` VARCHAR(50),
`x` FLOAT,
`y` FLOAT,
`z` FLOAT,
`h` FLOAT,
`distance` INT(11) DEFAULT '10',
PRIMARY KEY (`id`)
);

View file

@ -0,0 +1,142 @@
Locales = Locales or {}
Locales['ar'] = {
yes = "نعم",
no = "لا",
garage = "كراج",
jobGarage = "كراج الوظيفة",
gangGarage = "كراج العصابة",
player = "لاعب",
impound = "حجز",
inGarage = "في الكراج",
notInGarage = "ليست في الكراج",
car = "سيارة",
air = "جوي",
sea = "بحري",
fuel = "وقود",
engine = "محرك",
body = "هيكل",
day = "يوم",
days = "أيام",
hour = "ساعة",
hours = "ساعات",
mins = "دقائق",
-- User Interface
noVehicles = "لا توجد مركبات في هذا الكراج",
noVehiclesAvailableToDrive = "لا توجد مركبات متاحة للقيادة",
vehicles = "مركبة/مركبات",
vehiclePlate = "لوحة المركبة",
vehicleNotInGarage = "المركبة تُركت بالخارج",
vehicleTakeOut = "قيادة",
vehicleReturnAndTakeOut = "إرجاع وقيادة",
vehicleReturnToOwnersGarage = "إرجاع إلى كراج المالك",
transferToGarageOrPlayer = "نقل إلى كراج أو لاعب",
transferToGarage = "نقل إلى كراج",
transferToPlayer = "نقل إلى لاعب",
vehicleTransfer = "نقل",
noAvailableGarages = "لا توجد كراجات متاحة",
currentGarage = "الكراج الحالي",
noPlayersOnline = "لا يوجد لاعبين متصلين",
createPrivateGarage = "إنشاء كراج خاص",
pgAlertHeadsUp = "تنبيه!",
pgAlertText = "سيتم إنشاء الكراج وستظهر المركبات في الموقع والاتجاه الذي تقف فيه حاليًا.",
garageName = "اسم الكراج",
impoundInformation = "معلومات الحجز",
impoundedBy = "حجز بواسطة",
impoundedReason = "السبب",
impoundPlayerCanCollect = "يمكنك استلام مركبتك من الحجز.",
impoundCollectionContact = "يرجى الاتصال بـ %{value} لاستلام مركبتك.",
impoundNoVehicles = "لا توجد مركبات في الحجز",
impoundAvailable = "متاح",
impoundRetrievableByOwner = "يمكن استردادها بواسطة المالك",
impoundNoReason = "لم يتم تقديم سبب",
impoundVehicle = "حجز المركبة",
impoundReasonField = "السبب (اختياري)",
impoundTime = "وقت الحجز",
impoundAvailableImmediately = "متاح فورا",
impoundCost = "التكلفة",
changeVehiclePlate = "تغيير لوحة المركبة",
newPlate = "لوحة جديدة",
search = "البحث بالاسم أو اللوحة",
noPrivateGarages = "لا توجد كراجات خاصة",
editPrivateGarage = "تعديل الكراج الخاص",
owners = "المالك/المالكون",
location = "الموقع",
next = "التالي",
previous = "السابق",
page = "صفحة",
of = "من",
show = "عرض",
save = "حفظ",
edit = "تعديل",
delete = "حذف",
garageDeleteConfirm = "هل أنت متأكد أنك تريد حذف هذا الكراج؟",
privGarageSearch = "البحث بالاسم",
garageUpdatedSuccess = "تم تحديث الكراج بنجاح!",
getCurrentCoords = "احصل على الإحداثيات الحالية",
identifier = "المعرف",
name = "الاسم",
noPlayers = "لا يوجد لاعبين مضافين",
addPlayer = "إضافة لاعب",
loadingVehicle = "جارٍ تحميل المركبة...",
vehicleSetup = "إعداد المركبة",
extras = "إضافات",
extra = "إضافة",
liveries = "الطلاءات",
livery = "طلاء",
noLiveries = "لا توجد طلاءات متاحة",
noExtras = "لا توجد إضافات متاحة",
none = "لا شيء",
vehicleNeedsService = "تحتاج إلى صيانة",
type = "النوع",
goInside = "ادخل إلى الداخل",
-- Notifications
insertVehicleTypeError = "يمكنك تخزين أنواع المركبات %{value} فقط في هذا الكراج",
insertVehiclePublicError = "لا يمكنك تخزين مركبات الوظيفة أو العصابة في الكراجات العامة",
vehicleParkedSuccess = "تم ركن المركبة في الكراج",
vehicleNotOwnedError = "أنت لا تملك هذه المركبة",
vehicleNotOwnedByPlayerError = "المركبة ليست مملوكة للاعب",
notEnoughMoneyError = "ليس لديك ما يكفي من المال في البنك",
vehicleNotYoursError = "المركبة لا تخصك",
notJobOrGangVehicle = "هذه ليست مركبة %{value}",
invalidGangError = "لم تقدم عصابة صالحة",
invalidJobError = "لم تقدم وظيفة صالحة",
notInsideVehicleError = "أنت لست جالسًا في مركبة",
vehicleAddedToGangGarageSuccess = "تمت إضافة المركبة إلى كراج العصابة %{value}!",
vehicleAddedToJobGarageSuccess = "تمت إضافة المركبة إلى كراج الوظيفة %{value}!",
moveCloserToVehicleError = "تحتاج إلى الاقتراب من المركبة",
noVehiclesNearbyError = "لا توجد مركبات قريبة",
commandPermissionsError = "غير مسموح لك باستخدام هذا الأمر",
actionNotAllowedError = "غير مسموح لك بفعل هذا",
garageNameExistsError = "اسم الكراج موجود بالفعل",
vehiclePlateExistsError = "لوحة المركبة مستخدمة بالفعل",
playerNotOnlineError = "اللاعب غير متصل",
vehicleTransferSuccess = "تم نقل المركبة إلى %{value}",
vehicleTransferSuccessGeneral = "تم نقل المركبة بنجاح",
vehicleReceived = "تلقيت مركبة باللوحة %{value}",
vehicleImpoundSuccess = "تم حجز المركبة بنجاح",
vehicleImpoundRemoveSuccess = "تم إزالة المركبة من الحجز",
vehicleImpoundReturnedToOwnerSuccess = "تم إرجاع المركبة إلى كراج المالك",
garageCreatedSuccess = "تم إنشاء الكراج بنجاح!",
vehiclePlateUpdateSuccess = "تم تعيين لوحة المركبة إلى %{value}",
vehicleDeletedSuccess = "تم حذف المركبة من قاعدة البيانات %{value}",
playerIsDead = "لا يمكنك فعل هذا وأنت ميت",
vehicleStoreError = "لا يمكنك تخزين هذه المركبة هنا",
-- Commands
cmdSetGangVehicle = "إضافة المركبة الحالية إلى كراج العصابة",
cmdRemoveGangVehicle = "إعادة مركبة العصابة إلى ملكية اللاعب",
cmdSetJobVehicle = "إضافة المركبة الحالية إلى كراج الوظيفة",
cmdRemoveJobVehicle = "إعادة مركبة الوظيفة إلى ملكية اللاعب",
cmdArgGangName = "اسم العصابة",
cmdArgJobName = "اسم الوظيفة",
cmgArgMinGangRank = "الرتبة الدنيا للعصابة",
cmgArgMinJobRank = "الرتبة الدنيا للوظيفة",
cmdArgPlayerId = "معرف اللاعب للمالك الجديد",
cmdImpoundVehicle = "حجز مركبة",
cmdChangePlate = "تغيير لوحة المركبة (للمسؤولين فقط)",
cmdDeleteVeh = "حذف المركبة من قاعدة البيانات (للمسؤولين فقط)",
cmdCreatePrivGarage = "إنشاء كراج خاص للاعب",
}

View file

@ -0,0 +1,142 @@
Locales = Locales or {}
Locales['cn'] = {
yes = "",
no = "",
garage = "车库",
jobGarage = "工作车库",
gangGarage = "帮派车库",
player = "玩家",
impound = "扣押",
inGarage = "在车库中",
notInGarage = "不在车库中",
car = "汽车",
air = "空中",
sea = "海洋",
fuel = "燃油",
engine = "引擎",
body = "车身",
day = "",
days = "",
hour = "小时",
hours = "小时",
mins = "分钟",
-- 用户界面
noVehicles = "此车库没有车辆",
noVehiclesAvailableToDrive = "没有可供驾驶的车辆",
vehicles = "辆车",
vehiclePlate = "车牌",
vehicleNotInGarage = "车辆已被取出",
vehicleTakeOut = "驾驶",
vehicleReturnAndTakeOut = "归还并驾驶",
vehicleReturnToOwnersGarage = "返回车主的车库",
transferToGarageOrPlayer = "转移到车库或玩家",
transferToGarage = "转移到车库",
transferToPlayer = "转移到玩家",
vehicleTransfer = "车辆转移",
noAvailableGarages = "没有可用车库",
currentGarage = "当前车库",
noPlayersOnline = "当前没有在线玩家",
createPrivateGarage = "创建私人车库",
pgAlertHeadsUp = "提示!",
pgAlertText = "车库将会创建,车辆将会在您当前位置和方向生成。",
garageName = "车库名称",
impoundInformation = "扣押信息",
impoundedBy = "扣押者",
impoundedReason = "原因",
impoundPlayerCanCollect = "您可以从扣押处取回您的车辆。",
impoundCollectionContact = "请联系 %{value} 以便取回您的车辆。",
impoundNoVehicles = "扣押处没有车辆",
impoundAvailable = "可用",
impoundRetrievableByOwner = "车主可取回",
impoundNoReason = "未提供原因",
impoundVehicle = "扣押车辆",
impoundReasonField = "原因(可选)",
impoundTime = "扣押时间",
impoundAvailableImmediately = "可立即取回",
impoundCost = "费用",
changeVehiclePlate = "更改车牌",
newPlate = "新车牌",
search = "按名称或车牌搜索",
noPrivateGarages = "没有私人车库",
editPrivateGarage = "编辑私人车库",
owners = "车主",
location = "位置",
next = "下一页",
previous = "上一页",
page = "",
of = "",
show = "显示",
save = "保存",
edit = "编辑",
delete = "删除",
garageDeleteConfirm = "您确定要删除此车库吗?",
privGarageSearch = "按名称搜索",
garageUpdatedSuccess = "车库更新成功!",
getCurrentCoords = "获取当前坐标",
identifier = "标识符",
name = "名称",
noPlayers = "没有添加玩家",
addPlayer = "添加玩家",
loadingVehicle = "正在加载车辆...",
vehicleSetup = "车辆设置",
extras = "额外配件",
extra = "额外配件",
liveries = "涂装",
livery = "涂装",
noLiveries = "没有可用涂装",
noExtras = "没有可用配件",
none = "",
vehicleNeedsService = "需要维修",
type = "类型",
goInside = "室内车库",
-- 通知
insertVehicleTypeError = "此车库只能存储 %{value} 类型的车辆",
insertVehiclePublicError = "您不能将工作或帮派车辆存入公共车库",
vehicleParkedSuccess = "车辆已停入车库",
vehicleNotOwnedError = "您不拥有这辆车",
vehicleNotOwnedByPlayerError = "此车辆不属于玩家",
notEnoughMoneyError = "您的银行余额不足",
vehicleNotYoursError = "这辆车不属于您",
notJobOrGangVehicle = "这不是 %{value} 车辆",
invalidGangError = "您没有提供有效的帮派",
invalidJobError = "您没有提供有效的工作",
notInsideVehicleError = "您没有坐在车辆内",
vehicleAddedToGangGarageSuccess = "车辆已添加到 %{value} 帮派车库!",
vehicleAddedToJobGarageSuccess = "车辆已添加到 %{value} 工作车库!",
moveCloserToVehicleError = "您需要靠近车辆",
noVehiclesNearbyError = "附近没有车辆",
commandPermissionsError = "您没有权限使用此命令",
actionNotAllowedError = "您没有权限执行此操作",
garageNameExistsError = "车库名称已存在",
vehiclePlateExistsError = "车牌已被使用",
playerNotOnlineError = "玩家不在线",
vehicleTransferSuccess = "车辆已转移给 %{value}",
vehicleTransferSuccessGeneral = "车辆转移成功",
vehicleReceived = "您已收到车牌为 %{value} 的车辆",
vehicleImpoundSuccess = "车辆成功扣押",
vehicleImpoundRemoveSuccess = "车辆已从扣押处移除",
vehicleImpoundReturnedToOwnerSuccess = "车辆已归还至车主的车库",
garageCreatedSuccess = "车库创建成功!",
vehiclePlateUpdateSuccess = "车牌已更新为 %{value}",
vehicleDeletedSuccess = "车辆已从数据库删除 %{value}",
playerIsDead = "您死了无法执行此操作",
vehicleStoreError = "您无法将此车辆存储在此处",
-- 命令
cmdSetGangVehicle = "将当前车辆添加到帮派车库",
cmdRemoveGangVehicle = "将帮派车辆归还为玩家车辆",
cmdSetJobVehicle = "将当前车辆添加到工作车库",
cmdRemoveJobVehicle = "将工作车辆归还为玩家车辆",
cmdArgGangName = "帮派名称",
cmdArgJobName = "工作名称",
cmgArgMinGangRank = "最低帮派等级",
cmgArgMinJobRank = "最低工作等级",
cmdArgPlayerId = "新车主的玩家ID",
cmdImpoundVehicle = "扣押一辆车辆",
cmdChangePlate = "更改车辆车牌(仅限管理员)",
cmdDeleteVeh = "删除车辆(仅限管理员)",
cmdCreatePrivGarage = "为玩家创建私人车库",
}

View file

@ -0,0 +1,143 @@
Locales = Locales or {}
Locales['cs'] = {
yes = "Ano",
ne = "Ne",
garage = "Garáž",
jobGarage = "Frakční Garáž",
gangGarage = "Gang Garáž",
player = "Hráč",
impound = "Odtahovka",
inGarage = "V garáži",
notInGarage = "Mimo garáž",
car = "Car",
air = "Air",
sea = "Sea",
fuel = "Palivo",
engine = "Motor",
body = "Karoserie",
day = "den",
days = "dní",
hour = "hodiny",
hours = "hodin",
-- User Interface
noVehicles = "V této garáži nejsou žádná vozidla",
vehicles = "vozidlo(a)",
vehiclePlate = "SPZ vozidla",
vehicleNotInGarage = "Vozidlo není v garáži",
vehicleTakeOut = "Vytáhnout vozidlo",
vehicleReturnAndTakeOut = "Vyzvednout z odtahovky",
vehicleReturnToOwnersGarage = "Návrat do garáže majitele",
transferToGarageOrPlayer = "Převést do garáže nebo hráči",
transferToGarage = "Převést do garáže",
transferToPlayer = "Převést na hráče",
vehicleTransfer = "Převod",
noAvailableGarages = "Žádné dostupné garáže",
currentGarage = "Aktuální garáž",
noPlayersOnline = "Žádní hráči online",
createPrivateGarage = "Vytvořit soukromou garáž",
pgAlertHeadsUp = "Heads up!",
pgAlertText = "Vytvoří se garáž a vozidla se budou spawnovat přesně v místě a směru, kde právě stojíte.",
garageName = "Název garáže",
impoundInformation = "Informace o zabavení",
impoundedBy = "Zabaveno do",
impoundedReason = "Důvod",
impoundPlayerCanCollect = "Můžete si vyzvednout své vozidlo na odtahovce.",
impoundCollectionContact = "Kontaktujte prosím %{value}, abyste si mohli vyzvednout své vozidlo.",
impoundNoVehicles = "V blízkosti nejsou žádná vozidla",
impoundAvailable = "K dispozici",
impoundRetrievableByOwner = "Vyzvednutelné vlastníkem",
impoundNoReason = "Není uveden důvod",
impoundVehicle = "Zabavené vozidlo",
impoundReasonField = "Důvod (nepovinný)",
impoundTime = "Doba zabavení",
impoundAvailableImmediately = "K dispozici ihned",
impoundCost = "Cena",
changeVehiclePlate = "Vyměnit registrační značku vozidla",
newPlate = "Nová registrační značka",
search = "Hledejte podle jména nebo štítku",
noPrivateGarages = "Žádné soukromé garáže",
editPrivateGarage = "Upravit soukromou garáž",
owners = "Majitel(é)",
location = "Umístění",
next = "Další",
previous = "Předchozí",
page = "Stránka",
of = "z",
show = "Zobrazit",
save = "Uložit",
edit = "Upravit",
delete = "Odstranit",
garageDeleteConfirm = "Opravdu chcete tuto garáž odstranit?",
privGarageSearch = "Vyhledávání podle jména",
garageUpdatedSuccess = "Garáž úspěšně aktualizována!",
getCurrentCoords = "Získání aktuálních souřadnic",
identifier = "Identifikátor",
name = "Název",
noPlayers = "Nebyli přidáni žádní hráči",
addPlayer = "Přidat hráče",
loadingVehicle = "Nakládací vozidlo...",
vehicleSetup = "Nastavení vozidla",
extras = "Doplňky",
extra = "Extra",
liveries = "Liveries",
livery = "Livery",
noLiveries = "Nejsou k dispozici žádné livreje",
noExtras = "Žádné doplňky nejsou k dispozici",
none = "Žádné",
vehicleNeedsService = "Needs Service",
type = "Type",
-- Notifications
insertVehicleTypeError = "V této garáži lze uložit pouze %{value} typů vozidel",
insertVehiclePublicError = "Do veřejných garáží nelze ukládat frakční vozidla",
vehicleParkedSuccess = "Vozidlo bylo zaparkováno do garáže",
vehicleNotOwnedError = "Toto vozidlo nevlastníte",
vehicleNotOwnedByPlayerError = "Vozidlo není ve vlastnictví tohoto hráče",
notEnoughMoneyError = "Nemáte v bance dostatek peněz",
vehicleNotYoursError = "Toto vozidlo vám nepatří",
notJobOrGangVehicle = "Toto není vozidlo %{value}",
invalidGangError = "Nezadali jste platný gang",
invalidJobError = "Nezadali jste platnou frakci",
notInsideVehicleError = "Nesedíte ve vozidle",
vehicleAddedToGangGarageSuccess = "Vozidlo bylo přidáno do garáže gangu %{value}!",
vehicleAddedToJobGarageSuccess = "Vozidlo bylo přidáno do garáže frakce %{value}!",
moveCloserToVehicleError = "Musíte se přiblížit k vozidlu",
noVehiclesNearbyError = "V blízkosti nejsou žádná vozidla",
commandPermissionsError = "Nemáte oprávnění na použítí tohoto příkazu",
actionNotAllowedError = "Nejste opravněn(a) provádět tuto akci",
garageNameExistsError = "Název garáže již existuje",
vehiclePlateExistsError = "SPZ vozidla je již použita",
playerNotOnlineError = "Hráč není online",
vehicleTransferSuccess = "Vozidlo převedeno na %{value}",
vehicleTransferSuccessGeneral = "Vozidlo bylo úspěšně převedeno",
vehicleReceived = "Získal jsi vozidlo se %{value}",
vehicleImpoundSuccess = "Vozidlo bylo úspěšně zabaveno",
vehicleImpoundRemoveSuccess = "Vozidlo bylo odstraněno z odtahovky",
vehicleImpoundReturnedToOwnerSuccess = "Vozidlo bylo vráceno do garáže majitele",
garageCreatedSuccess = "Garáž byla úspěšně vytvořena!",
vehiclePlateUpdateSuccess = "SPZ vozidla nastavena na %{value}",
vehicleDeletedSuccess = "Vozidlo bylo odstraněno z databáze %{value}",
playerIsDead = "Nemůžeš to udělat, dokud jsi mrtvý",
-- Commands
cmdSetGangVehicle = "Přidat aktuální vozidlo do gang garáže",
cmdRemoveGangVehicle = "Nastavit vozidlo gangu zpět do vlastnictví hráče",
cmdSetJobVehicle = "Přidat aktuální vozidlo do garáže pro frakci",
cmdRemoveJobVehicle = "Nastavit frakční vozidlo zpět do vlastnictví hráče",
cmdArgGangName = "Název gangu",
cmdArgJobName = "Název jobu",
cmgArgMinGangRank = "Minimální hodnost gangu",
cmgArgMinJobRank = "Minimální pracovní zařazení",
cmdArgPlayerId = "ID hráče nového vlastníka",
cmdImpoundVehicle = "Zabavit vozidlo",
cmdChangePlate = "Změnit registrační značku vozidla (pouze pro administrátory)",
cmdDeleteVeh = "Odstranit vozidlo z databáze (pouze pro administrátory)",
cmdCreatePrivGarage = "Vytvořit soukromou garáž pro hráče",
-- v3
vehicleStoreError = "You cannot store this vehicle here",
mins = "mins",
noVehiclesAvailableToDrive = "There are no vehicles available to drive",
}

View file

@ -0,0 +1,143 @@
Locales = Locales or {}
Locales['da'] = {
yes = "Ja",
no = "Nej",
garage = "Garage",
jobGarage = "Job Garage",
gangGarage = "Bande Garage",
player = "Spiller",
impound = "Impound",
inGarage = "I garage",
notInGarage = "Ikke i garage",
car = "Bil",
air = "Fly",
sea = "Båd",
fuel = "Brændstof",
engine = "Motor",
body = "Karosseri",
day = "dag",
days = "dage",
hour = "time",
hours = "timer",
-- User Interface
noVehicles = "Der er ingen køretøjer i denne garage",
vehicles = "køretøj(er)",
vehiclePlate = "Nummerplade",
vehicleNotInGarage = "Køretøj er ikke i denne garage",
vehicleTakeOut = "Tag ud",
vehicleReturnAndTakeOut = "Parker og tag ud",
vehicleReturnToOwnersGarage = "Send tilbage til ejers garage",
transferToGarageOrPlayer = "Overfør til en garage eller en spiller",
transferToGarage = "Overfør til garage",
transferToPlayer = "Overfør til spiller",
vehicleTransfer = "Overfør",
noAvailableGarages = "Ingen tilgængelige garager",
currentGarage = "Nuværende garage",
noPlayersOnline = "Ingen spillere online",
createPrivateGarage = "Opret privat garage",
pgAlertHeadsUp = "Pas på!",
pgAlertText = "The garage will be created and vehicles will spawn in the exact location and direction are you are currently standing.",
garageName = "Garage Navn",
impoundInformation = "Impound Information",
impoundedBy = "Impoundet af",
impoundedReason = "Grund",
impoundPlayerCanCollect = "Du kan hente dit køretøj hos impound.",
impoundCollectionContact = "Kontakt venligst %{value} for at hente dit køretøj.",
impoundNoVehicles = "Der er ingen køretøjer i dette impound",
impoundAvailable = "Tilgængelig",
impoundRetrievableByOwner = "Kan afhentes af ejer",
impoundNoReason = "Ingen grund angivet",
impoundVehicle = "Impound Køretøj",
impoundReasonField = "Grund (valgfri)",
impoundTime = "Impound Tid",
impoundAvailableImmediately = "Tilgængelig øjeblikkeligt",
impoundCost = "Pris",
changeVehiclePlate = "Skift nummerplade",
newPlate = "Ny nummerplade",
search = "Søg efter navn eller nummerplade",
noPrivateGarages = "Ingen private garager",
editPrivateGarage = "Rediger privat garage",
owners = "Ejer(e)",
location = "Placering",
next = "Næste",
previous = "Tidligere",
page = "Side",
of = "af",
show = "Vis",
save = "Gem",
edit = "Rediger",
delete = "Slet",
garageDeleteConfirm = "Er du sikker på, at du vil slette denne garage?",
privGarageSearch = "Søg efter navn",
garageUpdatedSuccess = "Garagen er blevet opdateret!",
getCurrentCoords = "Hent aktuelle koordinater",
identifier = "Identifikator",
name = "Navn",
noPlayers = "Der er ikke tilføjet nogen spillere",
addPlayer = "Tilføj spiller",
loadingVehicle = "Indlæser køretøj...",
vehicleSetup = "Opsætning af køretøj",
extras = "Ekstraudstyr",
extra = "Ekstra",
liveries = "Liveries",
livery = "Livery",
noLiveries = "Ingen liveries tilgængelige",
noExtras = "Ingen ekstraudstyr til rådighed",
none = "Ingen",
vehicleNeedsService = "Needs Service",
type = "Type",
-- Notifications
insertVehicleTypeError = "Du kan kun opbevare %{value} i denne garage",
insertVehiclePublicError = "You can't store job or gang vehicles in public garages",
vehicleParkedSuccess = "Vehicle parked in garage",
vehicleNotOwnedError = "You don't own this vehicle",
vehicleNotOwnedByPlayerError = "Vehicle is not owned by a player",
notEnoughMoneyError = "Du har ikke nok penge i din bank",
vehicleNotYoursError = "Køretøj tilhører ikke dig",
notJobOrGangVehicle = "Dette er ikke en %{value}",
invalidGangError = "Du har ikke angivet en gyldig bande",
invalidJobError = "Du har ikke givet et gyldigt job",
notInsideVehicleError = "Du sidder ikke i et køretøj",
vehicleAddedToGangGarageSuccess = "Køretøj tilføjet til %{value} bande garagen!",
vehicleAddedToJobGarageSuccess = "Køretøj tilføjet til %{value} job garagen!",
moveCloserToVehicleError = "Du skal være tættere på køretøjet",
noVehiclesNearbyError = "Der er ingen køretøjer i nærheden",
commandPermissionsError = "Du må ikke bruge denne kommando",
actionNotAllowedError = "Du må ikke gøre dette",
garageNameExistsError = "Garagenavn eksisterer allerede",
vehiclePlateExistsError = "Nummerplade er allerede i brug",
playerNotOnlineError = "Spiller er ikke online",
vehicleTransferSuccess = "Køretøj overført til %{value}",
vehicleTransferSuccessGeneral = "Køretøj blev overført",
vehicleReceived = "Du modtog et køretøj med nummerpladen %{value}",
vehicleImpoundSuccess = "Køretøj blev impounded",
vehicleImpoundRemoveSuccess = "Køretøj blev fjernet fra impound",
vehicleImpoundReturnedToOwnerSuccess = "Køretøjet blev returneret til ejerens garage",
garageCreatedSuccess = "Garage oprettet!",
vehiclePlateUpdateSuccess = "Nummerplade ændret til %{value}",
vehicleDeletedSuccess = "Køretøj blev slettet fra databasen %{value}",
playerIsDead = "Du kan ikke gøre dette, mens du er død",
-- Commands
cmdSetGangVehicle = "Tilføj dette køretøj til bandegaragen",
cmdRemoveGangVehicle = "Fjern bandekøretøjet og returner det til ejeren",
cmdSetJobVehicle = "Tilføj dette køretøj til jobgaragen",
cmdRemoveJobVehicle = "Fjern jobkøretøjet og returner det til ejeren",
cmdArgGangName = "Bande navn",
cmdArgJobName = "Job navn",
cmgArgMinGangRank = "Minimum bande rang",
cmgArgMinJobRank = "Minimum jobrangering",
cmdArgPlayerId = "Spiller-ID på ejeren",
cmdImpoundVehicle = "Impound et køretøj",
cmdChangePlate = "Skift nummerplade (Kun admin)",
cmdDeleteVeh = "Fjern køretøj fra databasen (Kun admin)",
cmdCreatePrivGarage = "Opret en privat garage til en spiller",
-- v3
vehicleStoreError = "You cannot store this vehicle here",
mins = "mins",
noVehiclesAvailableToDrive = "There are no vehicles available to drive",
}

View file

@ -0,0 +1,143 @@
Locales = Locales or {}
Locales['de'] = {
yes = "Ja",
no = "Nein",
garage = "Garage",
jobGarage = "Jobgarage",
gangGarage = "Ganggarage",
player = "Spieler",
impound = "Impound",
inGarage = "In der Garage",
notInGarage = "Nicht in der Garage",
car = "Auto",
air = "Flugzeug",
sea = "Boot",
fuel = "Tank",
engine = "Motor",
body = "Schaden",
day = "Tag",
days = "Tage",
hour = "Stunde",
hours = "Stunden",
-- User Interface
noVehicles = "Keine Fahrzeuge in der Garage",
vehicles = "Fahrzeug(e)",
vehiclePlate = "Kennzeichen",
vehicleNotInGarage = "Nicht in der Garage",
vehicleTakeOut = "Ausparken",
vehicleReturnAndTakeOut = "Einparken und Ausparken",
vehicleReturnToOwnersGarage = "Zurück in die Privatgarage",
transferToGarageOrPlayer = "Transfer in eine andere Garage oder an einen Spieler",
transferToGarage = "Transfer in eine andere Garage",
transferToPlayer = "Transfer zu einem Spieler",
vehicleTransfer = "Transfer",
noAvailableGarages = "Keine Verfügbaren Garagen",
currentGarage = "Aktuelle Garage",
noPlayersOnline = "Kein Spieler online",
createPrivateGarage = "Private Garage erstellen",
pgAlertHeadsUp = "Kopf hoch!",
pgAlertText = "Garage wird erstellt und Fahrzeuge spawnen an der Stelle und in die Richtung die du schaust",
garageName = "Garagenname",
impoundInformation = "Impound Information",
impoundedBy = "Beschlagnahmt von",
impoundedReason = "Grund",
impoundPlayerCanCollect = "Fahrzeug kann am Impound ausgelöst werden",
impoundCollectionContact = "Kontaktiere %{value} um dein Fahrzeug auszulösen",
impoundNoVehicles = "Keine Fahrzeuge im Impound",
impoundAvailable = "Verfügbar",
impoundRetrievableByOwner = "Kann vom Eigentümer ausgelöst werden",
impoundNoReason = "Kein Grund angegeben",
impoundVehicle = "Fahrzeug beschlagnahmen",
impoundReasonField = "Grund (optional)",
impoundTime = "Impound Zeit",
impoundAvailableImmediately = "Sofort verfügbar",
impoundCost = "Kosten",
changeVehiclePlate = "Kennzeichen ändern",
newPlate = "Neues Kennzeichen",
search = "Suche nach Name oder Kennzeichen",
noPrivateGarages = "Keine privaten Garagen",
editPrivateGarage = "Private Garage bearbeiten",
owners = "Eigentümer(n)",
location = "Standort",
next = "Weiter",
previous = "Vorherige",
page = "Seite",
of = "von",
show = "Anzeigen",
save = "Speichern Sie",
edit = "Bearbeiten",
delete = "Löschen",
garageDeleteConfirm = "Sind Sie sicher, dass Sie diese Garage löschen wollen?",
privGarageSearch = "Suche nach Name",
garageUpdatedSuccess = "Garage erfolgreich aktualisiert!",
getCurrentCoords = "Aktuelle Koordinaten abrufen",
identifier = "Kennung",
name = "Name",
noPlayers = "Es sind keine Spieler hinzugefügt worden",
addPlayer = "Spieler hinzufügen",
loadingVehicle = "Fahrzeug laden...",
vehicleSetup = "Fahrzeug-Setup",
extras = "Extras",
extra = "Extra",
liveries = "Livreen",
livery = "Leihwagen",
noLiveries = "Keine Lackierungen verfügbar",
noExtras = "Keine Extras verfügbar",
none = "Keine",
vehicleNeedsService = "Needs Service",
type = "Type",
-- Notifications
insertVehicleTypeError = "Du kannst hier nur %{value} einparken",
insertVehiclePublicError = "Du kannst keine Jobfahrzeuge in Öffentliche Garagen einparken",
vehicleParkedSuccess = "Erfolgreich eingeparkt",
vehicleNotOwnedError = "Du hast keinen Schlüssel",
vehicleNotOwnedByPlayerError = "Kein registriertes Fahrzeug",
notEnoughMoneyError = "Nicht genug Geld auf dem Konto",
vehicleNotYoursError = "Fahrzeug gehört nicht dir",
notJobOrGangVehicle = "Kein %{value} Fahrzeug",
invalidGangError = "Keine gültige Gang",
invalidJobError = "Kein gültiger Job",
notInsideVehicleError = "Du sitzt nicht in einem Fahrzeug",
vehicleAddedToGangGarageSuccess = "Fahrzeug zur %{value} Ganggarage hinzugefügt",
vehicleAddedToJobGarageSuccess = "Fahrzeug zur %{value} Jobgarage hinzugefügt",
moveCloserToVehicleError = "Du musst näher ans Fahrzeug",
noVehiclesNearbyError = "Kein Fahrzeug in der nähe",
commandPermissionsError = "Keine Berechtigung für diesen Command",
actionNotAllowedError = "Keine Berechtigung",
garageNameExistsError = "Garagenname exestiert bereites",
vehiclePlateExistsError = "Kennzeichen exestiert bereites",
playerNotOnlineError = "Spieler ist offline",
vehicleTransferSuccess = "Fahrzeug an %{value} übertragen",
vehicleTransferSuccessGeneral = "Fahrzeug erfolgreich übertragen",
vehicleReceived = "Fahrzeug mit dem Kennzeichen %{value} erhalten",
vehicleImpoundSuccess = "Fahrzeug erfolgreich beschlagnahmt",
vehicleImpoundRemoveSuccess = "Fahrzeug wurde aus dem Impound ausgelöst",
vehicleImpoundReturnedToOwnerSuccess = "Fahrzeug zurück in der Eigentümergarage",
garageCreatedSuccess = "Garage erfolgreich erstellt",
vehiclePlateUpdateSuccess = "Kennzeichen wurde zu %{value} geändert",
vehicleDeletedSuccess = "Fahrzeug aus der Datenbank %{value} gelöscht",
playerIsDead = "Sie können dies nicht tun, während Sie tot sind",
-- Commands
cmdSetGangVehicle = "Aktuelles Fahrzeug einer Ganggarage hinzufügen",
cmdRemoveGangVehicle = "Setze das Gang-Fahrzeug wieder in den Besitz des Spielers",
cmdSetJobVehicle = "Aktuelles Fahrzeug einer Jobgarage hinzufügen",
cmdRemoveJobVehicle = "Setze das Job-Fahrzeug wieder in den Besitz des Spielers",
cmdArgGangName = "Gangname",
cmdArgJobName = "Jobname",
cmgArgMinGangRank = "Minimaler Gangrang",
cmgArgMinJobRank = "Mindestjobrang",
cmdArgPlayerId = "Spieler ID vom Eigentümer",
cmdImpoundVehicle = "Fahrzeug beschlagnahmen",
cmdChangePlate = "Kennzeichen ändern (Admin only)",
cmdDeleteVeh = "Fahrzeug aus der Datenbank löschen (Admin only)",
cmdCreatePrivGarage = "Private Garage erstellen",
-- v3
vehicleStoreError = "You cannot store this vehicle here",
mins = "mins",
noVehiclesAvailableToDrive = "There are no vehicles available to drive",
}

View file

@ -0,0 +1,142 @@
Locales = Locales or {}
Locales['en'] = {
yes = "Yes",
no = "No",
garage = "Garage",
jobGarage = "Job Garage",
gangGarage = "Gang Garage",
player = "Player",
impound = "Impound",
inGarage = "In garage",
notInGarage = "Not in garage",
car = "Car",
air = "Air",
sea = "Sea",
fuel = "Fuel",
engine = "Engine",
body = "Body",
day = "day",
days = "days",
hour = "hour",
hours = "hours",
mins = "mins",
-- User Interface
noVehicles = "There are no vehicles in this garage",
noVehiclesAvailableToDrive = "There are no vehicles available to drive",
vehicles = "vehicle(s)",
vehiclePlate = "Vehicle Plate",
vehicleNotInGarage = "Vehicle has been left out",
vehicleTakeOut = "Drive",
vehicleReturnAndTakeOut = "Return & Drive",
vehicleReturnToOwnersGarage = "Return to Owner's Garage",
transferToGarageOrPlayer = "Transfer to a Garage or Player",
transferToGarage = "Transfer to a Garage",
transferToPlayer = "Transfer to a Player",
vehicleTransfer = "Transfer",
noAvailableGarages = "No available garages",
currentGarage = "Current garage",
noPlayersOnline = "No players online",
createPrivateGarage = "Create Private Garage",
pgAlertHeadsUp = "Heads up!",
pgAlertText = "The garage will be created and vehicles will spawn in the exact location and direction are you are currently standing.",
garageName = "Garage Name",
impoundInformation = "Impound Information",
impoundedBy = "Impounded by",
impoundedReason = "Reason",
impoundPlayerCanCollect = "You can collect your vehicle from the impound.",
impoundCollectionContact = "Please contact %{value} in order to collect your vehicle.",
impoundNoVehicles = "There are no vehicles in the impound",
impoundAvailable = "Available",
impoundRetrievableByOwner = "Retrievable by owner",
impoundNoReason = "No reason provided",
impoundVehicle = "Impound Vehicle",
impoundReasonField = "Reason (optional)",
impoundTime = "Impound Time",
impoundAvailableImmediately = "Available immediately",
impoundCost = "Cost",
changeVehiclePlate = "Change Vehicle Plate",
newPlate = "New Plate",
search = "Search by name or plate",
noPrivateGarages = "No private garages",
editPrivateGarage = "Edit Private Garage",
owners = "Owner(s)",
location = "Location",
next = "Next",
previous = "Previous",
page = "Page",
of = "of",
show = "Show",
save = "Save",
edit = "Edit",
delete = "Delete",
garageDeleteConfirm = "Are you sure you want to delete this garage?",
privGarageSearch = "Search by name",
garageUpdatedSuccess = "Garage successfully updated!",
getCurrentCoords = "Get current coordinates",
identifier = "Identifier",
name = "Name",
noPlayers = "There are no players added",
addPlayer = "Add player",
loadingVehicle = "Loading vehicle...",
vehicleSetup = "Vehicle Setup",
extras = "Extras",
extra = "Extra",
liveries = "Liveries",
livery = "Livery",
noLiveries = "No liveries available",
noExtras = "No extras available",
none = "None",
vehicleNeedsService = "Needs Service",
type = "Type",
goInside = "Go inside",
-- Notifications
insertVehicleTypeError = "You can only store %{value} vehicle types in this garage",
insertVehiclePublicError = "You can't store job or gang vehicles in public garages",
vehicleParkedSuccess = "Vehicle parked in garage",
vehicleNotOwnedError = "You don't own this vehicle",
vehicleNotOwnedByPlayerError = "Vehicle is not owned by a player",
notEnoughMoneyError = "You don't have enough money in your bank",
vehicleNotYoursError = "Vehicle does not belong to you",
notJobOrGangVehicle = "This is not a %{value} vehicle",
invalidGangError = "You have not provided a valid gang",
invalidJobError = "You have not provided a valid job",
notInsideVehicleError = "You are not sat in a vehicle",
vehicleAddedToGangGarageSuccess = "Vehicle added to the %{value} gang garage!",
vehicleAddedToJobGarageSuccess = "Vehicle added to the %{value} job garage!",
moveCloserToVehicleError = "You need to move closer to the vehicle",
noVehiclesNearbyError = "There are no vehicles nearby",
commandPermissionsError = "You are not allowed to use this command",
actionNotAllowedError = "You are not allowed to do this",
garageNameExistsError = "Garage name already exists",
vehiclePlateExistsError = "Vehicle plate is already in use",
playerNotOnlineError = "Player is not online",
vehicleTransferSuccess = "Vehicle transferred to %{value}",
vehicleTransferSuccessGeneral = "Vehicle successfully transferred",
vehicleReceived = "You recieved a vehicle with the plate %{value}",
vehicleImpoundSuccess = "Vehicle successfully impounded",
vehicleImpoundRemoveSuccess = "Vehicle removed from impound",
vehicleImpoundReturnedToOwnerSuccess = "Vehicle returned to owner's garage",
garageCreatedSuccess = "Garage successfully created!",
vehiclePlateUpdateSuccess = "Vehicle plate set to %{value}",
vehicleDeletedSuccess = "Vehicle deleted from database %{value}",
playerIsDead = "You cannot do this while you are dead",
vehicleStoreError = "You cannot store this vehicle here",
-- Commands
cmdSetGangVehicle = "Add current vehicle to a gang garage",
cmdRemoveGangVehicle = "Set gang vehicle back to player owned",
cmdSetJobVehicle = "Add current vehicle to a job garage",
cmdRemoveJobVehicle = "Set job vehicle back to player owned",
cmdArgGangName = "Gang name",
cmdArgJobName = "Job name",
cmgArgMinGangRank = "Minimum gang rank",
cmgArgMinJobRank = "Minimum job rank",
cmdArgPlayerId = "Player ID of new owner",
cmdImpoundVehicle = "Impound a vehicle",
cmdChangePlate = "Change vehicle plate (Admin only)",
cmdDeleteVeh = "Delete vehicle from database (Admin only)",
cmdCreatePrivGarage = "Create a private garage for a player",
}

View file

@ -0,0 +1,141 @@
Locales = Locales or {}
Locales['es'] = {
yes = "Si",
no = "No",
garage = "Garaje",
jobGarage = "Garaje Laboral",
gangGarage = "Garaje de Banda/Pandilla",
player = "Jugador",
impound = "Deposito",
inGarage = "En Garaje",
notInGarage = "No en Garaje",
car = "Coche",
air = "Aereo",
sea = "Maritimo",
fuel = "Combustible",
engine = "Motor",
body = "Carroceria",
day = "dia",
days = "dias",
hour = "hora",
hours = "horas",
-- User Interface
noVehicles = "No hay vehículos en este garaje.",
vehicles = "Vehículo(s)",
vehiclePlate = "Matrícula del Vehículo",
vehicleNotInGarage = "Vehículo no en garaje",
vehicleTakeOut = "Conducir",
vehicleReturnAndTakeOut = "Devuelve y Conduce",
vehicleReturnToOwnersGarage = "Devolver al garaje del propietario",
transferToGarageOrPlayer = "Transferir a Garaje o Jugador",
transferToGarage = "Transferir a un Garaje",
transferToPlayer = "Transferir a un Jugador",
vehicleTransfer = "Transferir",
noAvailableGarages = "No hay garajes disponibles",
currentGarage = "Garaje Actual",
noPlayersOnline = "No hay jugadores en línea",
createPrivateGarage = "Crear Garaje Privado",
pgAlertHeadsUp = "Advertencia!",
pgAlertText = "Se creará el garaje y los vehículos aparecerán en la ubicación y dirección exactas en las que se encuentra actualmente.",
garageName = "Nombre del Garaje",
impoundInformation = "Información de Incautacion",
impoundedBy = "Incautado por ",
impoundedReason = "Razón",
impoundPlayerCanCollect = "Puedes recoger tu vehículo en el depósito.",
impoundCollectionContact = "Haga el favor de contactar con %{value} para poder reclamar su vehiculo.",
impoundNoVehicles = "No hay vehículos en el depósito.",
impoundAvailable = "Disponible",
impoundRetrievableByOwner = "Recuperable por el propietario",
impoundNoReason = "No se proporcionó ninguna razón",
impoundVehicle = "Incautar Vehiculo",
impoundReasonField = "Razon (opcional)",
impoundTime = "Tiempo de Incautacion",
impoundAvailableImmediately = "Disponible inmediatamente",
impoundCost = "Coste",
changeVehiclePlate = "Cambio de Matricula",
newPlate = "Matricula Nueva",
search = "Buscar por nombre o placa",
noPrivateGarages = "Sin garajes privados",
editPrivateGarage = "Editar Garaje Privado",
owners = "Propietario(s)",
location = "Ubicación",
next = "Siguiente",
previous = "Anterior",
page = "Página",
of = "de",
show = "Mostrar",
save = "Guardar",
edit = "Editar",
delete = "Borrar",
garageDeleteConfirm = "¿Estás seguro de que quieres borrar este garaje?",
privGarageSearch = "Buscar por nombre",
garageUpdatedSuccess = "¡Garaje actualizado con éxito!",
getCurrentCoords = "Obtener coordenadas actuales",
identifier = "Identificador",
name = "Nombre",
noPlayers = "No hay jugadores añadidos",
addPlayer = "Añadir jugador",
loadingVehicle = "Cargando vehículo...",
vehicleSetup = "Configuración del vehículo",
extras = "Extras",
extra = "Extra",
liveries = "Diseños",
livery = "Vinilo",
noLiveries = "No hay vinilos disponibles",
noExtras = "No hay extras disponibles",
none = "Ninguno",
vehicleNeedsService = "Needs Service",
type = "Type",
-- Notifications
insertVehicleTypeError = "Solo puedes almacenar vehículos de tipo %{value} en este garaje",
insertVehiclePublicError = "No puede almacenar vehículos de trabajo o de banda en garajes públicos",
vehicleParkedSuccess = "Vehículo estacionado en garaje",
vehicleNotOwnedError = "No eres dueño de este vehículo",
vehicleNotOwnedByPlayerError = "El vehículo no es propiedad de un jugador.",
notEnoughMoneyError = "No tienes suficiente dinero en tu banco",
vehicleNotYoursError = "El vehículo no te pertenece",
notJobOrGangVehicle = "Este no es un vehículo de %{value}",
invalidGangError = "No ha proporcionado una banda válida",
invalidJobError = "No ha proporcionado un trabajo válido",
notInsideVehicleError = "No estás sentado en un vehículo.",
vehicleAddedToGangGarageSuccess = "Vehículo agregado al garaje de banda de %{value}!",
vehicleAddedToJobGarageSuccess = "Vehículo agregado al taller de trabajo de %{value}!",
moveCloserToVehicleError = "Necesitas acercarte al vehículo.",
noVehiclesNearbyError = "No hay vehículos cerca.",
commandPermissionsError = "No tienes permiso para usar este comando.",
actionNotAllowedError = "No tienes permitido hacer esto.",
garageNameExistsError = "El nombre del garaje ya existe",
vehiclePlateExistsError = "La placa del vehículo ya está en uso",
playerNotOnlineError = "El jugador no está en línea",
vehicleTransferSuccess = "Vehículo transferido a %{value}",
vehicleTransferSuccessGeneral = "Vehículo transferido con éxito",
vehicleReceived = "Recibiste un vehículo con matricula %{value}",
vehicleImpoundSuccess = "Vehículo incautado con éxito",
vehicleImpoundRemoveSuccess = "Vehículo retirado del depósito",
vehicleImpoundReturnedToOwnerSuccess = "Vehículo devuelto al garaje del propietario.",
garageCreatedSuccess = "¡Garaje creado con éxito!",
vehiclePlateUpdateSuccess = "Matrícula del vehículo establecida a %{value}",
vehicleDeletedSuccess = "Vehículo eliminado de la base de datos %{value}",
playerIsDead = "No puedes hacer esto mientras estás muerto",
-- Commands
cmdSetGangVehicle = "Agregar el vehículo actual a un garaje de banda",
cmdRemoveGangVehicle = "Devolver el vehículo de la banda a propiedad del jugador",
cmdSetJobVehicle = "Agregar vehículo actual a un taller de trabajo",
cmdRemoveJobVehicle = "Devolver el vehículo de trabajo a propiedad del jugador",
cmdArgGangName = "Nombre de Banda",
cmdArgJobName = "Nombre de Trabajo",
cmdArgPlayerId = "ID de Jugador del nuevo propietario",
cmdImpoundVehicle = "Incautar un Vehículo",
cmdChangePlate = "Cambiar Matricula del Vehiculo (Solo Administracion)",
cmdDeleteVeh = "Eliminar vehículo de la base de datos (Solo Administracion)",
cmdCreatePrivGarage = "Crea un garaje privado para un jugador.",
-- v3
vehicleStoreError = "You cannot store this vehicle here",
mins = "mins",
noVehiclesAvailableToDrive = "There are no vehicles available to drive",
}

View file

@ -0,0 +1,143 @@
Locales = Locales or {}
Locales['fi'] = {
yes = "Kyllä",
no = "Ei",
garage = "Autotalli",
jobGarage = "Työn Autotalli",
gangGarage = "Jengin Autotalli",
player = "Pelaaja",
impound = "Varikko",
inGarage = "Autotallissa",
notInGarage = "Ulkona tallista",
car = "Maa Ajoneuvo",
air = "Ilma Ajoneuvo",
sea = "Vesi Ajoneuvo",
fuel = "Bensa",
engine = "Moottori",
body = "Keho",
day = "päivä",
days = "päivät",
hour = "tunti",
hours = "tunnit",
-- User Interface
noVehicles = "Ei ajoneuvoja tallissa",
vehicles = "Ajoneuvot",
vehiclePlate = "Rekisterikilpi",
vehicleNotInGarage = "Ajoneuvo ei ole tallissa",
vehicleTakeOut = "Aja",
vehicleReturnAndTakeOut = "Palauta talliin ja aja",
vehicleReturnToOwnersGarage = "Palauta omistajan talliin",
transferToGarageOrPlayer = "Siirrä autotalliin tai pelaajalle",
transferToGarage = "Siirrä autotalliin",
transferToPlayer = "Siirrä pelaajalle",
vehicleTransfer = "Siirrä",
noAvailableGarages = "Ei vapaita autotalleja",
currentGarage = "Tämän hetkinen talli",
noPlayersOnline = "Ei pelaajia kaupungissa",
createPrivateGarage = "Luo yksityinen autotalli",
pgAlertHeadsUp = "Heads up!",
pgAlertText = "The garage will be created and vehicles will spawn in the exact location and direction are you are currently standing.",
garageName = "Autotallin nimi",
impoundInformation = "Varkki tiedot",
impoundedBy = "Varikoijja",
impoundedReason = "Syy",
impoundPlayerCanCollect = "Voit hakea ajoneuvosi varikolta.",
impoundCollectionContact = "Ota yhteyttä %{value} saadaksesi ajoneuvon takaisin.",
impoundNoVehicles = "Ei ajoneivoja varikolla",
impoundAvailable = "Vapaa",
impoundRetrievableByOwner = "Omistaja voi hakea",
impoundNoReason = "Syytä ei ole annettu",
impoundVehicle = "Takavarikoi ajoneuvo",
impoundReasonField = "Syy",
impoundTime = "Varikoinnin pituus",
impoundAvailableImmediately = "Saatavilla heti",
impoundCost = "Hinta",
changeVehiclePlate = "Vaihda ajoneuvon kilpeä",
newPlate = "Uusi kilpi",
search = "Hae nimellä tai ajoneuvokilven mukaan",
noPrivateGarages = "Ei yksityisiä autotalleja",
editPrivateGarage = "Edit Yksityinen autotalli",
owners = "Omistaja(t)",
location = "Sijainti",
next = "Seuraava",
previous = "Edellinen",
page = "Sivu",
of = "of",
show = "Näytä",
save = "Tallenna",
edit = "Muokkaa",
delete = "Poista",
garageDeleteConfirm = "Haluatko varmasti poistaa tämän autotallin?",
privGarageSearch = "Haku nimen mukaan",
garageUpdatedSuccess = "Autotalli onnistuneesti päivitetty!",
getCurrentCoords = "Hae nykyiset koordinaatit",
identifier = "Tunniste",
name = "Nimi",
noPlayers = "Pelaajia ei ole lisätty",
addPlayer = "Lisää pelaaja",
loadingVehicle = "Ajoneuvon lastaus...",
vehicleSetup = "Ajoneuvon asennus",
extras = "Lisävarusteet",
extra = "Extra",
liveries = "maalaukset",
livery = "maksullisuus",
noLiveries = "Maalauksia ei ole saatavilla",
noExtras = "Ei lisävarusteita saatavilla",
none = "Ei ole",
vehicleNeedsService = "Needs Service",
type = "Type",
-- Notifications
insertVehicleTypeError = "Voit ainoastaan tallettaa %{value} ajoneuvo tyyppejä tähän talliin",
insertVehiclePublicError = "Et voi tallettaa työn ajoneuvoja julkisiin talleihin",
vehicleParkedSuccess = "Ajoneuvo parkkeerattu talliin",
vehicleNotOwnedError = "Et omista tätä autoa",
vehicleNotOwnedByPlayerError = "Pelaaja ei omista tätä autoa",
notEnoughMoneyError = "Ei tarpeeksi rahaa pankissa",
vehicleNotYoursError = "Et omista ajoneuvoa",
notJobOrGangVehicle = "Tämä ei ole %{value} ajoneuvo",
invalidGangError = "You have not provided a valid gang",
invalidJobError = "You have not provided a valid job",
notInsideVehicleError = "Et ole ajoneuvossa",
vehicleAddedToGangGarageSuccess = "Vehicle added to the %{value} gang garage!",
vehicleAddedToJobGarageSuccess = "Vehicle added to the %{value} job garage!",
moveCloserToVehicleError = "Mene lähemmäs ajoneuvoa",
noVehiclesNearbyError = "Ei autoja lähellä",
commandPermissionsError = "Et saa käyttää tätä komentoa",
actionNotAllowedError = "Et saa tehdä tätä",
garageNameExistsError = "Tallin nimi on jo olemassa",
vehiclePlateExistsError = "Ajoneuvon kilpi on jo käytössä",
playerNotOnlineError = "Pelaaja ei ole kaupungissa",
vehicleTransferSuccess = "Ajoneuvo on siirretty: %{value}",
vehicleTransferSuccessGeneral = "Ajoneuvo on onnistuneesti siirretty",
vehicleReceived = "Sait ajoneuvon kilvellä %{value}",
vehicleImpoundSuccess = "Ajoneuvo on onnistuneesti Takavarikoitu",
vehicleImpoundRemoveSuccess = "Ajoneuvo on poistettu takavatikolta",
vehicleImpoundReturnedToOwnerSuccess = "Ajoneuvo on palautettu omistajan talliin",
garageCreatedSuccess = "Autotalli onnistuneesti luotu!",
vehiclePlateUpdateSuccess = "Ajoneuvon kilpi on laitettu %{value}",
vehicleDeletedSuccess = "Ajoneuvo on poistettu databasesta %{value}",
playerIsDead = "Et voi tehdä tätä, kun olet kuollut",
-- Commands
cmdSetGangVehicle = "Add current vehicle to a gang garage",
cmdRemoveGangVehicle = "Set gang vehicle back to player owned",
cmdSetJobVehicle = "Add current vehicle to a job garage",
cmdRemoveJobVehicle = "Set job vehicle back to player owned",
cmdArgGangName = "Gang name",
cmdArgJobName = "Job name",
cmgArgMinGangRank = "Minimum gang rank",
cmgArgMinJobRank = "Minimum job rank",
cmdArgPlayerId = "Player ID of new owner",
cmdImpoundVehicle = "Impound a vehicle",
cmdChangePlate = "Change vehicle plate (Admin only)",
cmdDeleteVeh = "Delete vehicle from database (Admin only)",
cmdCreatePrivGarage = "Create a private garage for a player",
-- v3
vehicleStoreError = "You cannot store this vehicle here",
mins = "mins",
noVehiclesAvailableToDrive = "There are no vehicles available to drive",
}

View file

@ -0,0 +1,142 @@
Locales = Locales or {}
Locales['fr'] = {
yes = "Oui",
no = "Non",
garage = "Garage",
jobGarage = "Garage métier",
gangGarage = "Garage Gang",
player = "Joueurs",
impound = "Fourriere",
inGarage = "Dans le garage",
notInGarage = "Pas dans le garage",
car = "Voiture",
air = "Air",
sea = "Mer",
fuel = "Essence",
engine = "Moteur",
body = "Carroserie",
day = "Jour",
days = "Jours",
hour = "Heure",
hours = "Heures",
mins = "mins",
-- User Interface
noVehicles = "Il n'y a aucun véhicule dans ce garage",
noVehiclesAvailableToDrive = "Aucun véhicule n'est disponible pour conduire",
vehicles = "Voiture(s)",
vehiclePlate = "Plaque du véhicule",
vehicleNotInGarage = "Le véhicule a été laissé de côté",
vehicleTakeOut = "Conduire",
vehicleReturnAndTakeOut = "Retour et conduite",
vehicleReturnToOwnersGarage = "Retour au garage du propriétaire",
transferToGarageOrPlayer = "Transfert vers un garage ou un joueur",
transferToGarage = "Transfert vers un garage",
transferToPlayer = "Transférer vers un joueur",
vehicleTransfer = "Transfert",
noAvailableGarages = "Aucun garage disponible",
currentGarage = "Garage actuel",
noPlayersOnline = "Aucun joueur en ligne",
createPrivateGarage = "Créer un garage privé",
pgAlertHeadsUp = "Attention !",
pgAlertText = "Le garage sera créé et les véhicules apparaîtront à l'emplacement et dans la direction exacts où vous vous trouvez actuellement.",
garageName = "Nom du garage",
impoundInformation = "Informations de mise en fourrière",
impoundedBy = "Mise en fourrière par",
impoundedReason = "Raison",
impoundPlayerCanCollect = "Vous pouvez récupérer votre véhicule à la fourrière.",
impoundCollectionContact = "Veuillez contacter %{value} afin de récupérer votre véhicule.",
impoundNoVehicles = "Il n'y a aucun véhicule dans la fourrière",
impoundAvailable = "Disponible",
impoundRetrievableByOwner = "Récupérable par le propriétaire",
impoundNoReason = "Aucune raison fournie",
impoundVehicle = "Véhicule mis en fourrière",
impoundReasonField = "Raison (facultatif)",
impoundTime = "Durée de mise en fourrière",
impoundAvailableImmediately = "Disponible immédiatement",
impoundCost = "Coût",
changeVehiclePlate = "Changer la plaque du véhicule",
newPlate = "Nouvelle plaque",
search = "Recherche par nom ou plaque",
noPrivateGarages = "Pas de garages privés",
editPrivateGarage = "Modifier le garage privé",
owners = "Propriétaire(s)",
location = "Location",
next = "Suivant",
previous = "Precedent",
page = "Page",
of = "de",
show = "Montrer",
save = "Sauvegarde",
edit = "Editer",
delete = "Supprimer",
garageDeleteConfirm = "Etes-vous sûr de vouloir supprimer ce garage ?",
privGarageSearch = "Rechercher par nom",
garageUpdatedSuccess = "Garage mis à jour avec succès !",
getCurrentCoords = "Obtenir les coordonnées actuelles",
identifier = "Identifiant",
name = "Nom",
noPlayers = "Aucun joueur n'a été ajouté",
addPlayer = "Ajouter un joueur",
chargementVehicle = "Chargement du véhicule...",
vehicleSetup = "Configuration du véhicule",
extras = "Suppléments",
extra = "Supplément",
liveries = "Livrées",
livery = "Livrée",
noLiveries = "Aucune livrée disponible",
noExtras = "Aucun extra disponible",
none = "Aucun(e)",
vehicleNeedsService = "Besoin de services",
type = "Genre",
goInside = "Aller à l'intérieur",
-- Notifications
insertVehicleTypeError = "Vous ne pouvez stocker que %{value} types de véhicules dans ce garage",
insertVehiclePublicError = "Vous ne pouvez pas stocker de véhicules de travail ou de gang dans les garages publics",
vehicleParkedSuccess = "Véhicule garé dans le garage",
vehicleNotOwnedError = "Vous n'êtes pas propriétaire de ce véhicule",
vehicleNotOwnedByPlayerError = "Le véhicule n'appartient à aucun joueur",
notEnoughMoneyError = "Vous n'avez pas assez d'argent en banque",
vehicleNotYoursError = "Le véhicule ne vous appartient pas",
notJobOrGangVehicle = "Ceci n'est pas un véhicule %{value}",
invalidGangError = "Vous n'avez pas fourni de gang valide",
invalidJobError = "Vous n'avez pas fourni d'emploi valide",
notInsideVehicleError = "Vous n'êtes pas assis dans un véhicule",
vehicleAddedToGangGarageSuccess = "Véhicule ajouté au garage du gang %{value} !",
vehicleAddedToJobGarageSuccess = "Véhicule ajouté au garage de travail %{value} !",
moveCloserToVehicleError = "Vous devez vous rapprocher du véhicule",
noVehiclesNearbyError = "Il n'y a aucun véhicule à proximité",
commandPermissionsError = "Vous n'êtes pas autorisé à utiliser cette commande",
actionNotAllowedError = "Vous n'êtes pas autorisé à faire cela",
garageNameExistsError = "Le nom du garage existe déjà",
VehiclePlateExistsError = "La plaque du véhicule est déjà utilisée",
playerNotOnlineError = "Le joueur n'est pas en ligne",
vehicleTransferSuccess = "Véhicule transféré à %{value}",
vehicleTransferSuccessGeneral = "Véhicule transféré avec succès",
vehicleReceived = "Vous avez reçu un véhicule avec la plaque %{value}",
vehicleImpoundSuccess = "Véhicule mis en fourrière avec succès",
vehicleImpoundRemoveSuccess = "Véhicule retiré de la fourrière",
vehicleImpoundReturnedToOwnerSuccess = "Véhicule restitué au garage du propriétaire",
garageCreatedSuccess = "Garage créé avec succès !",
vehiclePlateUpdateSuccess = "Plaque du véhicule réglée sur %{value}",
vehicleDeletedSuccess = "Véhicule supprimé de la base de données %{value}",
playerIsDead = "Vous ne pouvez pas faire ça tant que vous êtes mort",
vehicleStoreError = "Vous ne pouvez pas stocker ce véhicule ici",
-- Commands
cmdSetGangVehicle = "Ajouter le véhicule actuel à un garage collectif",
cmdRemoveGangVehicle = "Remettre le véhicule du gang comme appartenant au joueur",
cmdSetJobVehicle = "Ajouter le véhicule actuel à un garage",
cmdRemoveJobVehicle = "Remettre le véhicule de travail comme appartenant au joueur",
cmdArgGangName = "Nom du gang",
cmdArgJobName = "Nom du travail",
cmgArgMinGangRank = "Rang minimum du gang",
cmgArgMinJobRank = "Classement minimum du poste",
cmdArgPlayerId = "ID du joueur du nouveau propriétaire",
cmdImpoundVehicle = "Mise en fourrière d'un véhicule",
cmdChangePlate = "Changer la plaque du véhicule (Administrateur uniquement)",
cmdDeleteVeh = "Supprimer le véhicule de la base de données (Administrateur uniquement)",
cmdCreatePrivGarage = "Créer un garage privé pour un joueur",
}

View file

@ -0,0 +1,143 @@
Locales = Locales or {} -- Translated by: PSYCHO#0281 (psycho0281)
Locales['hu'] = { -- Erre a sorra is figyelj oda!!! Ez nem en.lua, hanem hu.lua, ezt fxmanifest, vagy resource lua-ban is említeni kell :)
yes = "Igen",
no = "Nem",
garage = "Garázs",
jobGarage = "Munka garázs",
gangGarage = "Banda garázs",
player = "Játékos",
impound = "Lefoglalt",
inGarage = "Garázsban",
notInGarage = "Nincs a garázsban",
car = "Autó",
air = "Repülő",
sea = "Hajó",
fuel = "Üzemanyag",
engine = "Motor",
body = "Karosszéria",
day = "nap",
days = "napok",
hour = "óra",
hours = "órák",
-- User Interface
noVehicles = "Ebben a garázsban nincsenek járművek",
vehicles = "jármű(vek)",
vehiclePlate = "Rendszám",
vehicleNotInGarage = "A jármű nincs garázsban",
vehicleTakeOut = "Vezetés",
vehicleReturnAndTakeOut = "Vissza és vezetés",
vehicleReturnToOwnersGarage = "Visszarakás a tulajdonos garázsába",
transferToGarageOrPlayer = "Átszállítás egy garázsba vagy a játékosnak",
transferToGarage = "Átszállítás garázsba",
transferToPlayer = "Átszállítás játékosnak",
vehicleTransfer = "Átadás",
noAvailableGarages = "Nincs szabad garázs",
currentGarage = "Jelenlegi garázs",
noPlayersOnline = "Nincs ilyen elérhető játékos",
createPrivateGarage = "Privát garázs készítése",
pgAlertHeadsUp = "Fel a fejjel!",
pgAlertText = "A garázs létrejön, és a járművek pontosan azon a helyen és irányban fognak megjelenni, ahol éppen áll.",
garageName = "Garázs neve",
impoundInformation = "Lefoglaltak információ",
impoundedBy = "Lefoglalta",
impoundedReason = "Indok",
impoundPlayerCanCollect = "Gépkocsiját átveheti a lefoglaltakban.",
impoundCollectionContact = "Kérjük, vegye fel a kapcsolatot %{value} a jármű átvétele érdekében.",
impoundNoVehicles = "Nincs lefoglalt autó",
impoundAvailable = "Elérhető",
impoundRetrievableByOwner = "Tulajdonos által átvehető",
impoundNoReason = "Indoklás nélkül",
impoundVehicle = "Lefoglalt jármű",
impoundReasonField = "Indok (nem kötelező)",
impoundTime = "Lefoglalt idő",
impoundAvailableImmediately = "Azonnal elérhető",
impoundCost = "Költség",
changeVehiclePlate = "Rendszámtábla cserélése",
newPlate = "Új rendszám",
search = "Keresés név vagy rendszám alapján",
noPrivateGarages = "Nincs privát garázsod",
editPrivateGarage = "Privát garázs szerkesztése",
owners = "Tulajdonos(ok)",
location = "Elhelyezkedés",
next = "Következő",
previous = "Előző",
page = "Oldal",
of = "nak,-nek",
show = "Mutatás",
save = "Mentés",
edit = "Szerkesztés",
delete = "Törlés",
garageDeleteConfirm = "Biztosan törli ezt a garázst?",
privGarageSearch = "Keresés név alapján",
garageUpdatedSuccess = "Garázs sikeresen frissítve!",
getCurrentCoords = "Jelenlegi koordináták lekérdezése",
identifier = "Azonosító",
name = "Név",
noPlayers = "Nincsenek hozzáadott játékosok",
addPlayer = "Játékos hozzáadása",
loadingVehicle = "Jármű betöltése...",
vehicleSetup = "Járműbeállítás",
extras = "Extrák",
extra = "Extra",
liveries = "Festések",
livery = "Festés",
noLiveries = "Nincs elérhető festés",
noExtras = "Nincsenek extrák",
none = "Semmi",
vehicleNeedsService = "Needs Service",
type = "Type",
-- Notifications
insertVehicleTypeError = "Ebben a garázsban csak %{value} járműtípusokat tárolhat",
insertVehiclePublicError = "Nem tárolhat munkahelyi vagy bandajárműveket nyilvános garázsokban",
vehicleParkedSuccess = "Jármű leparkolva",
vehicleNotOwnedError = "Nem Ön a tulajdonosa ennek a járműnek",
vehicleNotOwnedByPlayerError = "A jármű nem játékos tulajdonában van",
notEnoughMoneyError = "Nincs elég pénzed a bankodban",
vehicleNotYoursError = "A jármű nem az Öné",
notJobOrGangVehicle = "Ez nem %{value} jármű",
invalidGangError = "Nem adott meg érvényes bandát",
invalidJobError = "Nem adott meg érvényes állást",
notInsideVehicleError = "Nem ülsz járműben",
vehicleAddedToGangGarageSuccess = "A jármű bekerült a %{value} banda garázsba!",
vehicleAddedToJobGarageSuccess = "A jármű bekerült a %{value} munka garázsba!",
moveCloserToVehicleError = "Közelebb kell mennie a járműhöz",
noVehiclesNearbyError = "A közelben nincsenek járművek",
commandPermissionsError = "Nem használhatja ezt a parancsot",
actionNotAllowedError = "Ehhez nincs engedélye",
garageNameExistsError = "A garázsnév már létezik",
vehiclePlateExistsError = "A jármű táblája már használatban van",
playerNotOnlineError = "Játékos nincs online",
vehicleTransferSuccess = "Jármű átadva neki: %{value}",
vehicleTransferSuccessGeneral = "A jármű sikeresen átadva",
vehicleReceived = "Te kaptál egy járművet, ezzel a rendszámmal %{value}",
vehicleImpoundSuccess = "Sikeresen lefoglalták a járművet",
vehicleImpoundRemoveSuccess = "Sikeresen kilett véve a lefoglaltakból",
vehicleImpoundReturnedToOwnerSuccess = "A jármű visszakerült a tulajdonos garázsába",
garageCreatedSuccess = "Garázs sikeresen létrehozva!",
vehiclePlateUpdateSuccess = "Rendszám beállítva erre: %{value}",
vehicleDeletedSuccess = "Jármű törölve az adatbázisból %{value}",
playerIsDead = "Ezt nem teheted, amíg halott vagy",
-- Commands
cmdSetGangVehicle = "Jelenlegi jármű hozzáadása a banda garázshoz",
cmdRemoveGangVehicle = "Banda garázsból visszarakás a játékos tulajdonába",
cmdSetJobVehicle = "Jelenlegi jármű hozzáadása a munka garázshoz",
cmdRemoveJobVehicle = "Munka garázsból visszarakás a játékos tulajdonába",
cmdArgGangName = "Banda neve",
cmdArgJobName = "Mubka neve",
cmgArgMinGangRank = "Minimum banda rang",
cmgArgMinJobRank = "Minimum beosztás",
cmdArgPlayerId = "Az új tulajdonos játékosazonosítója",
cmdImpoundVehicle = "Jármű lefoglalása",
cmdChangePlate = "Rendszámtábla cseréje (csak rendszergazda)",
cmdDeleteVeh = "Jármű törlése az adatbázisból (csak rendszergazda)",
cmdCreatePrivGarage = "Privát garázs létrehozása egy játékos számára",
-- v3
vehicleStoreError = "You cannot store this vehicle here",
mins = "mins",
noVehiclesAvailableToDrive = "There are no vehicles available to drive",
}

View file

@ -0,0 +1,143 @@
Locales = Locales or {}
Locales['it'] = {
yes = "Si",
no = "No",
garage = "Garage",
jobGarage = "Garage Lavoro",
gangGarage = "Garage Gang",
player = "Giocatore",
impound = "Sequestro",
inGarage = "In Garage",
notInGarage = "Fuori dal Garage",
car = "Macchina",
air = "Aereo",
sea = "Barche",
fuel = "Benzina",
engine = "Motore",
body = "Carrozzeria",
day = "Giorno",
days = "Giorni",
hour = "Ora",
hours = "Ore",
-- User Interface
noVehicles = "Non ci sono veicoli in questo garage",
vehicles = "Veicoli",
vehiclePlate = "Targa Veicolo",
vehicleNotInGarage = "Veicolo non in garage",
vehicleTakeOut = "Prendi il Veicolo",
vehicleReturnAndTakeOut = "Ritorna e prendi il veicolo",
vehicleReturnToOwnersGarage = "Ritorna nel garage del propietario",
transferToGarageOrPlayer = "Trasferisci al garage o al giocatore",
transferToGarage = "Trasferisci al Garage",
transferToPlayer = "Trasferisci al Giocatore",
vehicleTransfer = "Trasferisci",
noAvailableGarages = "Nessun Garage Disponibile",
currentGarage = "Garage Attuale",
noPlayersOnline = "Nessun Giocatore Online",
createPrivateGarage = "Crea Garage Privato",
pgAlertHeadsUp = "Dritta!",
pgAlertText = "Il garage verrà creato e i veicoli appariranno nella posizione e nella direzione esatte in cui ti trovi attualmente.",
garageName = "Nome Garage",
impoundInformation = "Informazioni Sequestro",
impoundedBy = "Sequestrato da",
impoundedReason = "Motivo",
impoundPlayerCanCollect = "Non puoi prelevare il veicolo dal sequestro.",
impoundCollectionContact = "Contatta %{value} per prelevare il tuo veicolo.",
impoundNoVehicles = "Nessun Veicolo Sequestrato",
impoundAvailable = "Disponibile",
impoundRetrievableByOwner = "Ritirabile dal Propietario",
impoundNoReason = "Nessun Motivo Segnalato",
impoundVehicle = "Sequestra Veicolo",
impoundReasonField = "Motivo (Opzionale)",
impoundTime = "Tempo Sequestro",
impoundAvailableImmediately = "Disponibile Ora",
impoundCost = "Costo",
changeVehiclePlate = "Cambia Targa Veicolo",
newPlate = "Nuova Targa",
search = "Ricerca per nome o targa",
noPrivateGarages = "Nessun garage privato",
editPrivateGarage = "Modifica garage privato",
owners = "Proprietario/i",
location = "Posizione",
next = "Successivo",
previous = "Precedente",
page = "Pagina",
of = "di",
show = "Mostra",
save = "Salva",
edit = "Modifica",
delete = "Elimina",
garageDeleteConfirm = "Sei sicuro di voler cancellare questo garage?",
privGarageSearch = "Ricerca per nome",
garageUpdatedSuccess = "Garage aggiornato con successo!",
getCurrentCoords = "Ottenere le coordinate attuali",
identifier = "Identificativo",
name = "Nome",
noPlayers = "Non sono stati aggiunti giocatori",
addPlayer = "Aggiungi giocatore",
loadingVehicle = "Caricamento del veicolo...",
vehicleSetup = "Configurazione del veicolo",
extras = "Extras",
extra = "Extra",
liveries = "Livree",
livery = "Livrea",
noLiveries = "Nessuna livrea disponibile",
noExtras = "Nessun extra disponibile",
none = "Nessuno",
vehicleNeedsService = "Serve Manutenzione",
type = "Tipo",
-- Notifications
insertVehicleTypeError = "Puoi depositare %{value} tipi di veicoli in questo garage",
insertVehiclePublicError = "Non puoi depositare veicoli gang o lavorativi in garage pubblici",
vehicleParkedSuccess = "Veicolo Parcheggiato",
vehicleNotOwnedError = "Non sei il propietario del veicolo",
vehicleNotOwnedByPlayerError = "Il veicolo non è tuo",
notEnoughMoneyError = "Non hai abbastanza soldi in banca",
vehicleNotYoursError = "Il veicolo non ti appartiene",
notJobOrGangVehicle = "Questo non è un %{value} veicolo",
invalidGangError = "Gang non valida",
invalidJobError = "Lavoro non valido",
notInsideVehicleError = "Non sei in un veicolo",
vehicleAddedToGangGarageSuccess = "Veicolo aggiunto al %{value} garage gang!",
vehicleAddedToJobGarageSuccess = "Veicolo aggiunto al %{value} garage lavorativo!",
moveCloserToVehicleError = "Devi avvicinarti al Veicolo",
noVehiclesNearbyError = "Nessun veicolo vicino",
commandPermissionsError = "Non sei autorizzato ad usare questo comando",
actionNotAllowedError = "Non sei autorizzato a fare questo",
garageNameExistsError = "Nome garage esistente",
vehiclePlateExistsError = "Targa veicolo già esistente",
playerNotOnlineError = "Giocatore Offline",
vehicleTransferSuccess = "Veicolo trasferito a %{value}",
vehicleTransferSuccessGeneral = "Veicolo trasferito correttamente",
vehicleReceived = "Hai ricevuto un veicolo con targa %{value}",
vehicleImpoundSuccess = "Veicolo sequestrato correttamente",
vehicleImpoundRemoveSuccess = "Veicolo rimosso dal sequestro",
vehicleImpoundReturnedToOwnerSuccess = "Veicolo restituito al garage del propietario",
garageCreatedSuccess = "Garage creato correttamente!",
vehiclePlateUpdateSuccess = "Targa cambiata in %{value}",
vehicleDeletedSuccess = "Veicolo eliminato dal database %{value}",
playerIsDead = "Sei morto! Non puoi farlo",
-- Commands
cmdSetGangVehicle = "Aggiungi veicolo attuale al garage gang",
cmdRemoveGangVehicle = "Ritorna veicolo gang al propietario",
cmdSetJobVehicle = "Aggiungi veicolo attuale al garage lavorativo",
cmdRemoveJobVehicle = "Ritorna veicolo lavorativo al propietario",
cmdArgGangName = "Nome gang",
cmdArgJobName = "Nome lavoro",
cmgArgMinGangRank = "Grado minimo gang",
cmgArgMinJobRank = "Grado minimo lavoro",
cmdArgPlayerId = "ID giocatore del destinatario",
cmdImpoundVehicle = "Sequestra veicolo",
cmdChangePlate = "Cambia targa veicolo (Solo Admin)",
cmdDeleteVeh = "Cancella veicolo dal database (Solo Admin)",
cmdCreatePrivGarage = "Crea un garage privato per il giocatore",
-- v3
vehicleStoreError = "Non puoi depositare il tuo veicolo qui",
mins = "minuti",
noVehiclesAvailableToDrive = "Non ci sono veicoli disponibili da guidare",
}

View file

@ -0,0 +1,142 @@
Locales = Locales or {}
Locales['ja'] = {
yes = "はい",
no = "いいえ",
garage = "ガレージ",
jobGarage = "仕事用ガレージ",
gangGarage = "ギャング用ガレージ",
player = "プレイヤー",
impound = "押収",
inGarage = "ガレージ内",
notInGarage = "ガレージ外",
car = "",
air = "",
sea = "",
fuel = "燃料",
engine = "エンジン",
body = "ボディ",
day = "",
days = "日々",
hour = "時間",
hours = "時間",
mins = "",
-- ユーザーインターフェース
noVehicles = "このガレージには車両がありません",
noVehiclesAvailableToDrive = "運転可能な車両はありません",
vehicles = "車両",
vehiclePlate = "ナンバープレート",
vehicleNotInGarage = "車両はガレージに入っていません",
vehicleTakeOut = "運転する",
vehicleReturnAndTakeOut = "返却 & 運転",
vehicleReturnToOwnersGarage = "オーナーのガレージに返却",
transferToGarageOrPlayer = "ガレージまたはプレイヤーに転送",
transferToGarage = "ガレージに転送",
transferToPlayer = "プレイヤーに転送",
vehicleTransfer = "転送",
noAvailableGarages = "利用可能なガレージはありません",
currentGarage = "現在のガレージ",
noPlayersOnline = "オンラインのプレイヤーがありません",
createPrivateGarage = "プライベートガレージを作成",
pgAlertHeadsUp = "注意!",
pgAlertText = "ガレージは作成され、車両は現在立っている位置と方向に出現します。",
garageName = "ガレージ名",
impoundInformation = "押収情報",
impoundedBy = "押収者",
impoundedReason = "理由",
impoundPlayerCanCollect = "車両を押収所から受け取ることができます。",
impoundCollectionContact = "%{value} に連絡して車両を受け取ってください。",
impoundNoVehicles = "押収所には車両がありません",
impoundAvailable = "利用可能",
impoundRetrievableByOwner = "オーナーが回収可能",
impoundNoReason = "理由なし",
impoundVehicle = "車両を押収",
impoundReasonField = "理由(任意)",
impoundTime = "押収時間",
impoundAvailableImmediately = "すぐに利用可能",
impoundCost = "費用",
changeVehiclePlate = "車両ナンバープレートの変更",
newPlate = "新しいナンバープレート",
search = "名前またはナンバープレートで検索",
noPrivateGarages = "プライベートガレージはありません",
editPrivateGarage = "プライベートガレージを編集",
owners = "オーナー",
location = "場所",
next = "",
previous = "",
page = "ページ",
of = "",
show = "表示",
save = "保存",
edit = "編集",
delete = "削除",
garageDeleteConfirm = "本当にこのガレージを削除してもよろしいですか?",
privGarageSearch = "名前で検索",
garageUpdatedSuccess = "ガレージが正常に更新されました!",
getCurrentCoords = "現在の座標を取得",
identifier = "識別子",
name = "名前",
noPlayers = "プレイヤーが追加されていません",
addPlayer = "プレイヤーを追加",
loadingVehicle = "車両を読み込み中...",
vehicleSetup = "車両設定",
extras = "エクストラ",
extra = "エクストラ",
liveries = "ラッピング",
livery = "ラッピング",
noLiveries = "利用可能なラッピングはありません",
noExtras = "利用可能なエクストラはありません",
none = "なし",
vehicleNeedsService = "整備が必要",
type = "タイプ",
goInside = "中に入る",
-- 通知
insertVehicleTypeError = "このガレージには %{value} の車両タイプのみ収納できます",
insertVehiclePublicError = "公共ガレージには仕事用またはギャング車両を収納できません",
vehicleParkedSuccess = "車両がガレージに駐車されました",
vehicleNotOwnedError = "この車両はあなたのものではありません",
vehicleNotOwnedByPlayerError = "この車両はプレイヤーが所有していません",
notEnoughMoneyError = "銀行に十分なお金がありません",
vehicleNotYoursError = "この車両はあなたのものではありません",
notJobOrGangVehicle = "これは %{value} 車両ではありません",
invalidGangError = "有効なギャング名が提供されていません",
invalidJobError = "有効な仕事名が提供されていません",
notInsideVehicleError = "車両に乗っていません",
vehicleAddedToGangGarageSuccess = "車両が %{value} ギャングガレージに追加されました!",
vehicleAddedToJobGarageSuccess = "車両が %{value} 仕事用ガレージに追加されました!",
moveCloserToVehicleError = "車両に近づく必要があります",
noVehiclesNearbyError = "近くに車両がありません",
commandPermissionsError = "このコマンドを使用する権限がありません",
actionNotAllowedError = "この行動は許可されていません",
garageNameExistsError = "ガレージ名はすでに存在します",
vehiclePlateExistsError = "この車両のナンバープレートはすでに使用されています",
playerNotOnlineError = "プレイヤーはオンラインではありません",
vehicleTransferSuccess = "車両が %{value} に転送されました",
vehicleTransferSuccessGeneral = "車両が正常に転送されました",
vehicleReceived = "車両 %{value} のナンバープレートを受け取りました",
vehicleImpoundSuccess = "車両が正常に押収されました",
vehicleImpoundRemoveSuccess = "車両が押収所から削除されました",
vehicleImpoundReturnedToOwnerSuccess = "車両がオーナーのガレージに返却されました",
garageCreatedSuccess = "ガレージが正常に作成されました!",
vehiclePlateUpdateSuccess = "車両ナンバープレートが %{value} に設定されました",
vehicleDeletedSuccess = "車両がデータベースから削除されました %{value}",
playerIsDead = "死んでいるため、この操作はできません",
vehicleStoreError = "この車両はここに保管できません",
-- コマンド
cmdSetGangVehicle = "現在の車両をギャングガレージに追加",
cmdRemoveGangVehicle = "ギャング車両をプレイヤー所有に戻す",
cmdSetJobVehicle = "現在の車両を仕事用ガレージに追加",
cmdRemoveJobVehicle = "仕事車両をプレイヤー所有に戻す",
cmdArgGangName = "ギャング名",
cmdArgJobName = "仕事名",
cmgArgMinGangRank = "最低ギャングランク",
cmgArgMinJobRank = "最低仕事ランク",
cmdArgPlayerId = "新しいオーナーのプレイヤーID",
cmdImpoundVehicle = "車両を押収",
cmdChangePlate = "車両ナンバープレートを変更(管理者のみ)",
cmdDeleteVeh = "車両をデータベースから削除(管理者のみ)",
cmdCreatePrivGarage = "プレイヤー用のプライベートガレージを作成",
}

View file

@ -0,0 +1,142 @@
Locales = Locales or {}
Locales['lt'] = {
yes = "Taip",
no = "Ne",
garage = "Garažas",
jobGarage = "Darbo garažas",
gangGarage = "Gaujos garažas",
player = "Asmuo",
impound = "Konfiskavimo aikštelė",
inGarage = "Šiuo metu garaže",
notInGarage = "Garaže nėra",
car = "Transporto priemonė",
air = "Lėktuvas",
sea = "Laivas",
fuel = "Degalai",
engine = "Variklis",
body = "Kėbulas",
day = "diena",
days = "dienos",
hour = "valanda",
hours = "valandos",
mins = "mins",
-- User Interface
noVehicles = "Šiame garaže nėra transporto priemonių",
noVehiclesAvailableToDrive = "Šiuo metu nėra transporto priemonių, kurias galėtumėte vairuoti",
vehicles = "tr.priemonė-(s)",
vehiclePlate = "Numeriai",
vehicleNotInGarage = "Tr.priemonės nėra garaže",
vehicleTakeOut = "Vairuoti",
vehicleReturnAndTakeOut = "Gražinti & Vairuoti",
vehicleReturnToOwnersGarage = "Grąžinti savininkui į garažą",
transferToGarageOrPlayer = "Perkelti į garažą arba asmeniui",
transferToGarage = "Perkelti į garažą",
transferToPlayer = "Perleisti žaidėjui",
vehicleTransfer = "Perkelti",
noAvailableGarages = "Nėra galimų garažų",
currentGarage = "Dabartinis garažas",
noPlayersOnline = "Nėra prisijungusių žaidėjų",
createPrivateGarage = "Sukurti privatų garažą",
pgAlertHeadsUp = "Dėmesio!",
pgAlertText = "Garažas bus sukurtas, o transporto priemonė atsiras tiklsiai ten, kur dabar stovite.",
garageName = "Garažo pavadinimas",
impoundInformation = "Konfiskavimo informacija",
impoundedBy = "Konfiskavo",
impoundedReason = "Priežastis",
impoundPlayerCanCollect = "Savo transporto priemonę galite atsiimti iš konfiskavimo aikštelės.",
impoundCollectionContact = "Prašome susisiekti su %{value}, kad galėtumėte atsiimti savo transporto priemonę.",
impoundNoVehicles = "Konfiskavimo aikštelėje nėra transporto priemonių",
impoundAvailable = "Galima",
impoundRetrievableByOwner = "Atsiimti gali savininkas?",
impoundNoReason = "Priežastis nenurodyta",
impoundVehicle = "Transporto priemonės konfiskavimas",
impoundReasonField = "Priežastis (nebūtina)",
impoundTime = "Konfiskavimo laikas",
impoundAvailableImmediately = "Atsiimti gali iškart",
impoundCost = "Atsiėmimo kaina",
changeVehiclePlate = "Numerių keitimas",
newPlate = "Nauji numeriai",
search = "Ieškoti pagal pavadinimą arba numerius",
noPrivateGarages = "Privačių garažų nėra",
editPrivateGarage = "Redaguoti privatų garažą",
owners = "Savininkas(-ai)",
location = "Vietovė",
next = "Kitas",
previous = "Praeitas",
page = "Puslapis",
of = "",
show = "Rodyti",
save = "Išsaugoti",
edit = "Redaguoti",
delete = "Ištrinti",
garageDeleteConfirm = "Ar tikrai norite ištrinti garažą?",
privGarageSearch = "Ieškoti pagal pavadinima",
garageUpdatedSuccess = "Garažas sėkmingai atnaujintas!",
getCurrentCoords = "Išgauti koordinates",
identifier = "Identifikatorius",
name = "Vardas",
noPlayers = "Žaidėjų nėra pridėta",
addPlayer = "Pridėti žaidėją",
loadingVehicle = "Užkraunama...",
vehicleSetup = "Papildiniai",
extras = "Extra",
extra = "Extra",
liveries = "Lipdukai",
livery = "Lipdukas",
noLiveries = "Lipdukų nėra",
noExtras = "Extra papildinių nėra",
none = "Nėra",
vehicleNeedsService = "Reikia serviso",
type = "Tipas",
goInside = "Eiti į vidų",
-- Notifications
insertVehicleTypeError = "Šiame garaže galite laikyti tik %{value} transporto priemonių tipus",
insertVehiclePublicError = "Negalite pastatyti darbo arba gaujų transporto priemonių tarp viešojo garažo",
vehicleParkedSuccess = "Transporto priemonė pastatyta į garažą",
vehicleNotOwnedError = "Ši transporto priemonė nepriklauso jums",
vehicleNotOwnedByPlayerError = "Transporto priemonė nepriklauso jokiam asmeniui",
notEnoughMoneyError = "Neturite pakankamai pinigų banke",
vehicleNotYoursError = "Transporto priemonė jums nepriklauso",
notJobOrGangVehicle = "Tai nėra %{value} transporto priemonė",
invalidGangError = "Jūs nenurodėte tinkamos gaujos",
invalidJobError = "Jūs nenurodėte tinkamo darbo",
notInsideVehicleError = "Jūs nesate transporto priemonėje",
vehicleAddedToGangGarageSuccess = "Transporto priemonė pridėta į %{value} gaujos garažą!",
vehicleAddedToJobGarageSuccess = "Transporto priemonė pridėta į %{value} darbo garažą!",
moveCloserToVehicleError = "Turite prieiti arčiau transporto priemonės",
noVehiclesNearbyError = "Šalia transporto priemonės nėra",
commandPermissionsError = "Neturite leidimo naudoti šios komandos",
actionNotAllowedError = "Šio veiksmo atlikti negalite",
garageNameExistsError = "Garažo pavadinimas jau yra užimtas",
vehiclePlateExistsError = "Transporto priemonės numeriai jau yra užimti",
playerNotOnlineError = "Žaidėjas nėra prisijungęs",
vehicleTransferSuccess = "Transporto priemonė perkelta į %{value}",
vehicleTransferSuccessGeneral = "Transporto priemonė sėkmingai perleista",
vehicleReceived = "Jūs gavote transporto priemonę kurios numeriai yra %{value}",
vehicleImpoundSuccess = "Transporto priemonė sėkmingai konfiskuota",
vehicleImpoundRemoveSuccess = "Transporto priemonė buvo ištraukta iš konfiskavimo aikštelės",
vehicleImpoundReturnedToOwnerSuccess = "Transporto priemonė grąžinta savininkui į garažą",
garageCreatedSuccess = "Garažas sėkmingai sukurtas!",
vehiclePlateUpdateSuccess = "Transporto priemonės numeriai pakeisti į %{value}",
vehicleDeletedSuccess = "Transporto priemonė sėkmingai pašalinta iš duomenu bazės %{value}",
playerIsDead = "Šio veiksmo negalite atlikti kol esate negyvas",
vehicleStoreError = "Šios transporto priemonės laikyti čia negalite",
-- Commands
cmdSetGangVehicle = "Pridėti dabartinę transporto priemonę į gaujos garažą",
cmdRemoveGangVehicle = "Grąžinti gaujos transporto priemonę savininkui",
cmdSetJobVehicle = "Pridėti dabartine transporto priemonę į darbo garažą",
cmdRemoveJobVehicle = "Gražinti darbinę transporto priemonę savininkui",
cmdArgGangName = "Gaujos pavadinimas",
cmdArgJobName = "Darbo pavadinimas",
cmgArgMinGangRank = "Minimalus gaujos rangas",
cmgArgMinJobRank = "Minimalus darbo rangas",
cmdArgPlayerId = "Naujo savininko ID",
cmdImpoundVehicle = "Konfiskuoti transporto priemonę",
cmdChangePlate = "Keisit transporto priemonės numerius (Tik administracija)",
cmdDeleteVeh = "Ištrinti transporto priemonę iš duomenų bazės (Tik administracija)",
cmdCreatePrivGarage = "Sukurti privatų garažą",
}

View file

@ -0,0 +1,143 @@
Locales = Locales or {}
Locales['nl'] = {
yes = "Ja",
no = "Nee",
garage = "Garage",
jobGarage = "Baan Garage",
gangGarage = "Bende Garage",
player = "Speler",
impound = "Inbeslagname",
inGarage = "In garage",
notInGarage = "Niet in garage",
car = "Auto",
air = "Lucht",
sea = "Zee",
fuel = "Brandstof",
engine = "Motor",
body = "Carrosserie",
day = "dag",
days = "dagen",
hour = "uur",
hours = "uren",
-- User Interface
noVehicles = "Er zijn geen voertuigen beschikbaar in deze garage",
vehicles = "voertuigen",
vehiclePlate = "Kenteken",
vehicleNotInGarage = "Voertuig is niet in aanwezig in de garage",
vehicleTakeOut = "Uitnemen",
vehicleReturnAndTakeOut = "Retour & Afhaal",
vehicleReturnToOwnersGarage = "Terug brengen naar de Garage van de Eigenaar",
transferToGarageOrPlayer = "Overdracht naar een Garage of Speler",
transferToGarage = "Overdracht naar een Garage",
transferToPlayer = "Overdracht naar een Speler",
vehicleTransfer = "Overdracht",
noAvailableGarages = "Geen beschikbare garages",
currentGarage = "Huidige garage",
noPlayersOnline = "Geen spelers online",
createPrivateGarage = "Privégarage creëren",
pgAlertHeadsUp = "Let op!",
pgAlertText = "De garage wordt gemaakt en voertuigen spawnen in de exacte locatie en richting waarin u zich momenteel bevindt.",
garageName = "Garage Naam",
impoundInformation = "Inbeslagname Informatie",
impoundedBy = "In beslag genomen door",
impoundedReason = "Reden",
impoundPlayerCanCollect = "U kunt uw voertuig ophalen bij de inbeslagname.",
impoundCollectionContact = "Neem contact op met %{value} om uw voertuig op te halen.",
impoundNoVehicles = "Er zijn geen voertuigen in de inbeslagneming",
impoundAvailable = "Beschikbaar",
impoundRetrievableByOwner = "Ophaalbaar door de eigenaar",
impoundNoReason = "Geen reden opgegeven",
impoundVehicle = "Voertuig in beslag nemen",
impoundReasonField = "Reden (optioneel)",
impoundTime = "Inbeslagnemingstijd",
impoundAvailableImmediately = "Onmiddellijk beschikbaar",
impoundCost = "Kosten",
changeVehiclePlate = "Voertuigkenteken wijzigen",
newPlate = "Nieuw Kenteken",
search = "Zoek op naam of plaat",
noPrivateGarages = "Geen privégarages",
editPrivateGarage = "Bewerk privégarage",
owners = "Eigenaar(s)",
location = "Locatie",
next = "Volgende",
previous = "Vorige",
page = "Pagina",
of = "van",
show = "Toon",
save = "Opslaan",
edit = "Bewerk",
delete = "Verwijder",
garageDeleteConfirm = "Weet je zeker dat je deze garage wilt verwijderen?",
privGarageSearch = "Zoeken op naam",
garageUpdatedSuccess = "Garage succesvol bijgewerkt!",
getCurrentCoords = "Huidige coördinaten ophalen",
identifier = "Identificatie",
name = "Naam",
noPlayers = "Er zijn geen spelers toegevoegd",
addPlayer = "Speler toevoegen",
loadingVehicle = "Voertuig laden...",
vehicleSetup = "Voertuig instellen",
extras = "Extra's",
extra = "Extra",
liveries = "Liveries",
livery = "Livery",
noLiveries = "Geen liveries beschikbaar",
noExtras = "Geen extra's beschikbaar",
none = "Geen",
vehicleNeedsService = "Needs Service",
type = "Type",
-- Notifications
insertVehicleTypeError = "U kunt alleen opslaan %{value} voertuigtypes in deze garage",
insertVehiclePublicError = "Je kunt geen baan- of bendevoertuigen opslaan in openbare garages",
vehicleParkedSuccess = "Voertuig geparkeerd in garage",
vehicleNotOwnedError = "U bent niet de eigenaar van dit voertuig",
vehicleNotOwnedByPlayerError = "Dit voertuig is geen eigendom van een speler",
notEnoughMoneyError = "U heeft niet genoeg geld op uw bank",
vehicleNotYoursError = "Dit voertuig is niet van jou",
notJobOrGangVehicle = "Dit is geen %{value} voertuig",
invalidGangError = "Je heeft geen geldige bende opgegeven",
invalidJobError = "Je heeft geen geldige baan opgegeven",
notInsideVehicleError = "Je zit niet in een voertuig",
vehicleAddedToGangGarageSuccess = "Voertuig toegevoegd aan de %{value} bende garage!",
vehicleAddedToJobGarageSuccess = "Voertuig toegevoegd aan de %{value} baan garage!",
moveCloserToVehicleError = "Je moet dichter bij het voertuig gaan staan",
noVehiclesNearbyError = "Er zijn geen voertuigen in de buurt",
commandPermissionsError = "Je hebt de rechten niet om dit commando te gebruiken",
actionNotAllowedError = "Dit mag je niet doen",
garageNameExistsError = "Garagenaam is al in gebruik",
vehiclePlateExistsError = "Voertuigkenteken is al in gebruik",
playerNotOnlineError = "Speler is niet online",
vehicleTransferSuccess = "Voertuig overgedragen aan %{value}",
vehicleTransferSuccessGeneral = "Voertuig succesvol overgedragen",
vehicleReceived = "U heeft een voertuig met kenteken %{value} ontvangen",
vehicleImpoundSuccess = "Voertuig succesvol in beslag genomen",
vehicleImpoundRemoveSuccess = "Voertuig uit beslag genomen",
vehicleImpoundReturnedToOwnerSuccess = "Voertuig teruggebracht naar de garage van de eigenaar",
garageCreatedSuccess = "Garage succesvol aangemaakt!",
vehiclePlateUpdateSuccess = "Voertuigkenteken ingesteld op %{value}",
vehicleDeletedSuccess = "Voertuig verwijderd uit de database %{value}",
playerIsDead = "Je kunt dit niet doen als je dood bent",
-- Commands
cmdSetGangVehicle = "Huidig voertuig toevoegen aan een bendegarage",
cmdRemoveGangVehicle = "Stel bendevoertuig terug in als eigendom van de speler",
cmdSetJobVehicle = "Huidig voertuig toevoegen aan een baangarage",
cmdRemoveJobVehicle = "Stel baanvoertuig terug in als eigendom van de speler",
cmdArgGangName = "Bende naam",
cmdArgJobName = "Baan naam",
cmgArgMinGangRank = "Minimale benderang",
cmgArgMinJobRank = "Minimale functierang",
cmdArgPlayerId = "Speler-ID van nieuwe eigenaar",
cmdImpoundVehicle = "Een voertuig in beslag nemen",
cmdChangePlate = "Wijzig kentekenplaat (Alleen beheerder)",
cmdDeleteVeh = "Voertuig verwijderen uit de database (Alleen beheerder)",
cmdCreatePrivGarage = "Privégarage creëren voor een Speler",
-- v3
vehicleStoreError = "You cannot store this vehicle here",
mins = "mins",
noVehiclesAvailableToDrive = "There are no vehicles available to drive",
}

View file

@ -0,0 +1,141 @@
Locales = Locales or {}
Locales['pt'] = {
yes = "Sim",
no = "Não",
garage = "Garagem",
jobGarage = "Garagem de Trabalho",
gangGarage = "Garagem de Organização",
player = "Jogador",
impound = "Apreendidos",
inGarage = "Na Garagem",
notInGarage = "Fora da Garagem",
car = "Garagem",
air = "Garagem",
sea = "Garagem",
fuel = "Combustível",
engine = "Motor",
body = "Chassi",
day = "Dia",
days = "Dias",
hour = "Hora",
hours = "Horas",
-- User Interface
noVehicles = "Não há veículos nesta garagem",
vehicles = "Total de Viaturas",
vehiclePlate = "Matrícula do veículo",
vehicleNotInGarage = "Veículo não está na garagem",
vehicleTakeOut = "Retirar",
vehicleReturnAndTakeOut = "Voltar a Retirar",
vehicleReturnToOwnersGarage = "Voltar à garagem do proprietário",
transferToGarageOrPlayer = "Transferir para uma Garagem ou Jogador",
transferToGarage = "Transferir para uma Garagem",
transferToPlayer = "Transferir para um Jogador",
vehicleTransfer = "Transferir",
noAvailableGarages = "Sem garagens disponíveis",
currentGarage = "Garagem atual",
noPlayersOnline = "Sem jogadores online",
createPrivateGarage = "Criar Garagem Privada",
pgAlertHeadsUp = "Atenção!",
pgAlertText = "A garagem será criada e os veículos aparecerão na localização e direção exatas que você está atualmente.",
garageName = "Nome da Garagem",
impoundInformation = "Informações da Apreensão",
impoundedBy = "Apreendido por",
impoundedReason = "Razão",
impoundPlayerCanCollect = "Você pode retirar o seu veículo dos Apreendidos.",
impoundCollectionContact = "Por favor entre em contato %{value} Para retirar o seu veículo.",
impoundNoVehicles = "Não há veículos nos Apreendidos",
impoundAvailable = "Disponível",
impoundRetrievableByOwner = "Recuperável pelo proprietário",
impoundNoReason = "Nenhuma razão fornecida",
impoundVehicle = "Apreender o Veículo",
impoundReasonField = "Razão",
impoundTime = "Tempo de Apreensão",
impoundAvailableImmediately = "Disponível imediatamente",
impoundCost = "Preço",
changeVehiclePlate = "Mudar a Matrícula",
newPlate = "Nova Matrícula",
search = "Pesquise por nome ou placa",
noPrivateGarages = "Sem garagens privadas",
editPrivateGarage = "Editar garagem privada",
owners = "Proprietário(s)",
location = "Localização",
next = "Seguinte",
previous = "Anterior",
page = "Página",
of = "de",
show = "Mostrar",
save = "Guardar",
edit = "Editar",
delete = "Eliminar",
garageDeleteConfirm = "Tem a certeza de que pretende apagar esta garagem?",
privGarageSearch = "Procurar por nome",
garageUpdatedSuccess = "Garagem actualizada com sucesso!",
getCurrentCoords = "Obter as coordenadas actuais",
identifier = "Identificador",
name = "Nome",
noPlayers = "Não há jogadores adicionados",
addPlayer = "Adicionar jogador",
loadingVehicle = "Carregamento do veículo...",
vehicleSetup = "Configuração do veículo",
extras = "Suplementos",
extra = "Suplemento",
liveries = "Fígados",
livery = "Fígado",
noLiveries = "Não existem pinturas disponíveis",
noExtras = "Não há extras disponíveis",
none = "Nenhum",
vehicleNeedsService = "Needs Service",
type = "Type",
-- Notifications
insertVehicleTypeError = "Não pode guardar nesta garagem.",
insertVehiclePublicError = "Você não pode armazenar veículos de emprego ou gangues em garagens públicas",
vehicleParkedSuccess = "Veículo guardado na garagem",
vehicleNotOwnedError = "Você não é dono este veículo",
vehicleNotOwnedByPlayerError = "O veículo não é de propriedade de um jogador",
notEnoughMoneyError = "Você não tem dinheiro suficiente em seu banco",
vehicleNotYoursError = "Veículo não pertence a você",
notJobOrGangVehicle = "Isso não é um %{value} veículo",
invalidGangError = "Você não forneceu uma gangue válida",
invalidJobError = "Você não forneceu um trabalho válido",
notInsideVehicleError = "Você não está sentado em um veículo",
vehicleAddedToGangGarageSuccess = "Veículo adicionado ao %{value} Garagem de gangues!",
vehicleAddedToJobGarageSuccess = "Veículo adicionado ao %{value} Jó Garage!",
moveCloserToVehicleError = "Você precisa se aproximar do veículo",
noVehiclesNearbyError = "Não há veículos próximos",
commandPermissionsError = "Você não tem permissão para usar este comando",
actionNotAllowedError = "Você não tem permissão para fazer isso",
garageNameExistsError = "O nome da garagem já existe",
vehiclePlateExistsError = "A placa do veículo já está em uso",
playerNotOnlineError = "Jogador não está online",
vehicleTransferSuccess = "Veículo transferido para %{value}",
vehicleTransferSuccessGeneral = "Veículo transferido com sucesso",
vehicleReceived = "Você recebeu um veículo com a matricula %{value}",
vehicleImpoundSuccess = "Veículo foi apreendido",
vehicleImpoundRemoveSuccess = "Veículo foi removido dos Apreenndidos!",
vehicleImpoundReturnedToOwnerSuccess = "Veículo voltou à garagem do proprietário",
garageCreatedSuccess = "Garagem criada com sucesso!",
vehiclePlateUpdateSuccess = "Placa do veículo definido para %{value}",
vehicleDeletedSuccess = "Veículo excluído do banco de dados %{value}",
playerIsDead = "Você não pode fazer isso enquanto estiver morto",
-- Commands
cmdSetGangVehicle = "Adicione o veículo atual a uma garagem de gangue",
cmdRemoveGangVehicle = "Defina o veículo de gangue de volta ao jogador de propriedade",
cmdSetJobVehicle = "Adicione o veículo atual a uma garagem de Trabalho",
cmdRemoveJobVehicle = "Defina o veículo de trabalho de volta para o jogador de propriedade",
cmdArgGangName = "Gang Nome",
cmdArgJobName = "Trabalho Nome",
cmdArgPlayerId = "ID do jogador do novo proprietário",
cmdImpoundVehicle = "Apreender um veículo",
cmdChangePlate = "Altere a placa do veículo (Admin apenas)",
cmdDeleteVeh = "Excluir veículo do banco de dados (Admin apenas)",
cmdCreatePrivGarage = "Criar uma garagem privada para um jogador",
-- v3
vehicleStoreError = "You cannot store this vehicle here",
mins = "mins",
noVehiclesAvailableToDrive = "There are no vehicles available to drive",
}

View file

@ -0,0 +1,142 @@
Locales = Locales or {}
Locales['ro'] = {
yes = "Da",
no = "Nu",
garage = "Garaj",
jobGarage = "Garaj de serviciu",
gangGarage = "Garajul bandei",
player = "Jucător",
impound = "Depozit",
inGarage = "În garaj",
notInGarage = "Nu este în garaj",
car = "Mașină",
air = "Aer",
sea = "Mare",
fuel = "Combustibil",
engine = "Motor",
body = "Caroserie",
day = "zi",
days = "zile",
hour = "oră",
hours = "ore",
mins = "minute",
-- Interfața utilizatorului
noVehicles = "Nu există vehicule în acest garaj",
noVehiclesAvailableToDrive = "Nu există vehicule disponibile pentru a conduce",
vehicles = "vehicul(e)",
vehiclePlate = "Număr de înmatriculare",
vehicleNotInGarage = "Vehiculul a fost lăsat afară",
vehicleTakeOut = "Condu",
vehicleReturnAndTakeOut = "Întoarce & Condu",
vehicleReturnToOwnersGarage = "Întoarce la garajul proprietarului",
transferToGarageOrPlayer = "Transferă la un garaj sau jucător",
transferToGarage = "Transferă la un garaj",
transferToPlayer = "Transferă la un jucător",
vehicleTransfer = "Transfer",
noAvailableGarages = "Nu există garaje disponibile",
currentGarage = "Garaj curent",
noPlayersOnline = "Nu sunt jucători online",
createPrivateGarage = "Creează un garaj privat",
pgAlertHeadsUp = "Atenție!",
pgAlertText = "Garajul va fi creat și vehiculele vor apărea exact în locația și direcția în care te afli în prezent.",
garageName = "Nume Garaj",
impoundInformation = "Informații despre depozit",
impoundedBy = "Depozitat de",
impoundedReason = "Motiv",
impoundPlayerCanCollect = "Poți să îți recuperezi vehiculul din depozit.",
impoundCollectionContact = "Te rugăm să contactezi %{value} pentru a-ți recupera vehiculul.",
impoundNoVehicles = "Nu există vehicule în depozit",
impoundAvailable = "Disponibil",
impoundRetrievableByOwner = "Poate fi recuperat de proprietar",
impoundNoReason = "Niciun motiv furnizat",
impoundVehicle = "Depozitează vehiculul",
impoundReasonField = "Motiv (opțional)",
impoundTime = "Timp de depozitare",
impoundAvailableImmediately = "Disponibil imediat",
impoundCost = "Cost",
changeVehiclePlate = "Schimbă numărul de înmatriculare",
newPlate = "Număr nou",
search = "Caută după nume sau număr",
noPrivateGarages = "Nu există garaje private",
editPrivateGarage = "Editează Garaj Privat",
owners = "Proprietar(i)",
location = "Locație",
next = "Următor",
previous = "Anterior",
page = "Pagină",
of = "din",
show = "Arată",
save = "Salvează",
edit = "Editează",
delete = "Șterge",
garageDeleteConfirm = "Ești sigur că vrei să ștergi acest garaj?",
privGarageSearch = "Caută după nume",
garageUpdatedSuccess = "Garaj actualizat cu succes!",
getCurrentCoords = "Obține coordonatele curente",
identifier = "Identificator",
name = "Nume",
noPlayers = "Nu există jucători adăugați",
addPlayer = "Adaugă jucător",
loadingVehicle = "Se încarcă vehiculul...",
vehicleSetup = "Configurare Vehicul",
extras = "Extraopțiuni",
extra = "Extraopțiune",
liveries = "Livree",
livery = "Livrea",
noLiveries = "Nu există livree disponibile",
noExtras = "Nu există extraopțiuni disponibile",
none = "Niciunul",
vehicleNeedsService = "Necesită service",
type = "Tip",
goInside = "Intră înăuntru",
-- Notificări
insertVehicleTypeError = "Poți depozita doar vehicule de tip %{value} în acest garaj",
insertVehiclePublicError = "Nu poți depozita vehicule de serviciu sau de bandă în garajele publice",
vehicleParkedSuccess = "Vehicul parcat în garaj",
vehicleNotOwnedError = "Nu deții acest vehicul",
vehicleNotOwnedByPlayerError = "Vehiculul nu este deținut de un jucător",
notEnoughMoneyError = "Nu ai destui bani în bancă",
vehicleNotYoursError = "Vehiculul nu îți aparține",
notJobOrGangVehicle = "Acesta nu este un vehicul %{value}",
invalidGangError = "Nu ai furnizat o bandă validă",
invalidJobError = "Nu ai furnizat un job valid",
notInsideVehicleError = "Nu ești într-un vehicul",
vehicleAddedToGangGarageSuccess = "Vehicul adăugat în garajul bandei %{value}!",
vehicleAddedToJobGarageSuccess = "Vehicul adăugat în garajul de serviciu %{value}!",
moveCloserToVehicleError = "Trebuie să te apropii de vehicul",
noVehiclesNearbyError = "Nu există vehicule în apropiere",
commandPermissionsError = "Nu ai permisiunea de a folosi această comandă",
actionNotAllowedError = "Nu ai permisiunea să faci asta",
garageNameExistsError = "Numele garajului există deja",
vehiclePlateExistsError = "Numărul de înmatriculare este deja utilizat",
playerNotOnlineError = "Jucătorul nu este online",
vehicleTransferSuccess = "Vehicul transferat la %{value}",
vehicleTransferSuccessGeneral = "Vehicul transferat cu succes",
vehicleReceived = "Ai primit un vehicul cu numărul %{value}",
vehicleImpoundSuccess = "Vehicul depozitat cu succes",
vehicleImpoundRemoveSuccess = "Vehicul eliminat din depozit",
vehicleImpoundReturnedToOwnerSuccess = "Vehiculul a fost returnat în garajul proprietarului",
garageCreatedSuccess = "Garaj creat cu succes!",
vehiclePlateUpdateSuccess = "Numărul de înmatriculare a fost schimbat în %{value}",
vehicleDeletedSuccess = "Vehicul șters din baza de date %{value}",
playerIsDead = "Nu poți face asta când ești mort",
vehicleStoreError = "Nu poți depozita acest vehicul aici",
-- Comenzi
cmdSetGangVehicle = "Adaugă vehiculul curent în garajul bandei",
cmdRemoveGangVehicle = "Setează vehiculul bandei înapoi ca deținut de jucător",
cmdSetJobVehicle = "Adaugă vehiculul curent în garajul de serviciu",
cmdRemoveJobVehicle = "Setează vehiculul de serviciu înapoi ca deținut de jucător",
cmdArgGangName = "Numele bandei",
cmdArgJobName = "Numele jobului",
cmgArgMinGangRank = "Rangul minim în bandă",
cmgArgMinJobRank = "Rangul minim la job",
cmdArgPlayerId = "ID-ul jucătorului noului proprietar",
cmdImpoundVehicle = "Depozitează un vehicul",
cmdChangePlate = "Schimbă numărul de înmatriculare (doar Admin)",
cmdDeleteVeh = "Șterge vehicul din baza de date (doar Admin)",
cmdCreatePrivGarage = "Creează un garaj privat pentru un jucător",
}

View file

@ -0,0 +1,143 @@
Locales = Locales or {}
Locales['sv'] = {
yes = "Ja",
no = "Nej",
garage = "garage",
jobGarage = "jobb Garage",
gangGarage = "gäng Garage",
player = "spelare",
impound = "bärgare",
inGarage = "i garaget",
notInGarage = "inte i garaget",
car = "bil",
air = "luft",
sea = "vatten",
fuel = "bränsle",
engine = "motor",
body = "chassie",
day = "dag",
days = "dagar",
hour = "timme",
hours = "timmar",
-- User Interface
noVehicles = "Det finns inga fordon i detta garaget",
vehicles = "bil(ar)",
vehiclePlate = "Registreringsskylt",
vehicleNotInGarage = "Fordonet är inte i garaget",
vehicleTakeOut = "Ta ut",
vehicleReturnAndTakeOut = "Flytta & Kör",
vehicleReturnToOwnersGarage = "Lämna tillbaka till ägarens garage",
transferToGarageOrPlayer = "Flytta till ett garage eller spelare",
transferToGarage = "Flytta till ett garage",
transferToPlayer = "Flytta till en spelare",
vehicleTransfer = "Flytta",
noAvailableGarages = "Inga tillgängliga garage",
currentGarage = "Nuvarande garage",
noPlayersOnline = "Inga spelare online",
createPrivateGarage = "Skapa privat garage",
pgAlertHeadsUp = "Akta!",
pgAlertText = "Garaget skapas och fordon kommer att spawnas på din position och åt det håll du står.",
garageName = "Garage Namn",
impoundInformation = "Bärgar Information",
impoundedBy = "Bärgad av",
impoundedReason = "Orsak",
impoundPlayerCanCollect = "Du kan hämta din bil från bärgaren.",
impoundCollectionContact = "Kontakta %{value} för att hämta ditt fordon.",
impoundNoVehicles = "Det finns inga fordon hos bärgaren.",
impoundAvailable = "Tillgänglig",
impoundRetrievableByOwner = "Kan hämtas av ägaren",
impoundNoReason = "Ingen anledning tillgänglig",
impoundVehicle = "Bärgat fordon",
impoundReasonField = "Orsak (valfritt)",
impoundTime = "Tid hos bärgaren",
impoundAvailableImmediately = "Tillgänglig direkt",
impoundCost = "Kostnad",
changeVehiclePlate = "Ändra registreringsnummer",
newPlate = "Nytt registreringsnummer",
search = "Sök med namn eller registreringsskylt",
noPrivateGarages = "Inga privata garage",
editPrivateGarage = "Ändra privat garage",
owners = "Ägare(n)",
location = "Plats",
next = "Nästa",
previous = "Tidigare",
page = "Sida",
of = "av",
show = "Visa",
save = "Spara",
edit = "Redigera",
delete = "Radera",
garageDeleteConfirm = "Är du säker på att du vill ta bort detta garage?",
privGarageSearch = "Sök efter namn",
garageUpdatedSuccess = "Garaget har uppdaterats framgångsrikt!",
getCurrentCoords = "Hämta aktuella koordinater",
identifier = "Identifierare",
name = "Namn",
noPlayers = "Inga spelare har tillkommit",
addPlayer = "Lägg till spelare",
loadingVehicle = "Lastning av fordon...",
vehicleSetup = "Inställning av fordon",
extras = "Extramaterial",
extra = "Extra",
liveries = "Liveries",
livery = "livery",
noLiveries = "Inga liveries tillgängliga",
noExtras = "Inga extrafunktioner tillgängliga",
none = "Ingen",
vehicleNeedsService = "Dags för service",
type = "Typ",
-- Notifications
insertVehicleTypeError = "Du kan endast förvara %{value} fordonstyp i detta garage",
insertVehiclePublicError = "Du kan inte förvara Gäng eller Jobbfordon i allmänna garaget",
vehicleParkedSuccess = "Fordonet är parkerat i garaget",
vehicleNotOwnedError = "Du äger inte detta fordon",
vehicleNotOwnedByPlayerError = "Fordonet ägs inte av en spelare",
notEnoughMoneyError = "Du har inte nog med pengar på banken",
vehicleNotYoursError = "Fordonet tillhör inte dig",
notJobOrGangVehicle = "Detta är inte ett %{value} fordon",
invalidGangError = "Du har inte angett ett giltigt gäng",
invalidJobError = "Du har inte angett ett giltigt jobb",
notInsideVehicleError = "Du sitter inte i fordonet",
vehicleAddedToGangGarageSuccess = "Fordonet är inlagt i %{value} Gäng garage!",
vehicleAddedToJobGarageSuccess = "Fordonet är inlagt %{value} jobb garage!",
moveCloserToVehicleError = "Du måste vara närmare fordonet",
noVehiclesNearbyError = "Det finns inga fordon i närheten",
commandPermissionsError = "Du får inte använda detta kommando",
actionNotAllowedError = "Du får inte göra detta",
garageNameExistsError = "Garagenamnet existerar redan",
vehiclePlateExistsError = "Registreringsnummer finns redan",
playerNotOnlineError = "Spelaren är inte online",
vehicleTransferSuccess = "Fordonet fördes över till %{value}",
vehicleTransferSuccessGeneral = "Fordonet har överförts",
vehicleReceived = "Du fick ett fordon med skylten %{value}",
vehicleImpoundSuccess = "Fordonet är bärgad",
vehicleImpoundRemoveSuccess = "Fordonet hämtad från bärgaren",
vehicleImpoundReturnedToOwnerSuccess = "Fordonet återlämnades till ägarens garage",
garageCreatedSuccess = "Garage har skapats!",
vehiclePlateUpdateSuccess = "Fordonsskylt är uppdaterad till %{value}",
vehicleDeletedSuccess = "Fordonet raderat från databasen %{value}",
playerIsDead = "Du kan inte göra detta då du är död",
-- Commands
cmdSetGangVehicle = "Lägg till nuvarande fordon till ett gänggarage",
cmdRemoveGangVehicle = "Sätt tillbaka gängfordonet till spelarägt",
cmdSetJobVehicle = "Lägg till aktuellt fordon till ett jobbgarage",
cmdRemoveJobVehicle = "Sätt tillbaka Jobbfordonet till spelarägt",
cmdArgGangName = "Gängnamn",
cmdArgJobName = "Jobbnamn",
cmgArgMinGangRank = "Minimum gäng rank",
cmgArgMinJobRank = "Minimum jobb rank",
cmdArgPlayerId = "SpelarID för nya ägare",
cmdImpoundVehicle = "Bärga ett fordon",
cmdChangePlate = "Ändra fordonsskylt (Admin endast)",
cmdDeleteVeh = "Ta bort fordon från databasen (Admin endast)",
cmdCreatePrivGarage = "Gör ett privatgarage till en spelare",
-- v3
vehicleStoreError = "Du kan inte ställa in detta fordonet här",
mins = "minuter",
noVehiclesAvailableToDrive = "Det finns inga fordon i detta garaget",
}

View file

@ -0,0 +1,142 @@
Locales = Locales or {}
Locales['vi'] = {
yes = "",
no = "Không",
garage = "Bãi đậu xe",
jobGarage = "Bãi đậu xe công việc",
gangGarage = "Gang Garage",
player = "Người chơi",
impound = "Bị giam",
inGarage = "Trong gara",
notInGarage = "Bên ngoài",
car = "Xe",
air = "Máy bay",
sea = "Thuyền",
fuel = "Xăng",
engine = "Động cơ",
body = "Thân vỏ",
day = "ngày",
days = "ngày",
hour = "giờ",
hours = "giờ",
-- User Interface
noVehicles = "Không có xe nào trong gara này",
vehicles = "Xe",
vehiclePlate = "Biển số xe",
vehicleNotInGarage = "Xe không ở trong gara",
vehicleTakeOut = "Lấy xe",
vehicleReturnAndTakeOut = "Thanh toán và lấy xe",
vehicleReturnToOwnersGarage = "Gửi về garage",
transferToGarageOrPlayer = "Transfer to a Garage or Player",
transferToGarage = "Transfer to a Garage",
transferToPlayer = "",
vehicleTransfer = "Chuyển nhượng",
noAvailableGarages = "Không có gara",
currentGarage = "Gara hiện tại",
noPlayersOnline = "Không có người chơi online",
createPrivateGarage = "Tạo gara cá nhân",
pgAlertHeadsUp = "Đứng lên!",
pgAlertText = "Gara sẽ được tạo ra và xe được lấy ra sẽ xuất hiện ngay vị trí mà bạn đang đứng.",
garageName = "Tên Gara",
impoundInformation = "Thông tin giam xe",
impoundedBy = "Giam bởi",
impoundedReason = "Lý do",
impoundPlayerCanCollect = "Bạn có thể lấy xe của mình từ bãi giam xe.",
impoundCollectionContact = "Vui lòng liên hệ %{value} hoặc Police để chuộc lại xe của bạn.",
impoundNoVehicles = "Bạn không có Xe nào bị giam giữ",
impoundAvailable = "Được phép lấy vào lúc ",
impoundAvailableGreen = "Có thể lấy",
impoundRetrievableByOwner = "Chủ xe có thể tự lấy xe ra",
impoundNoReason = "Lý do trống",
impoundVehicle = "Tạm giữ xe",
impoundReasonField = "Lý do",
impoundTime = "Thời gian giam",
impoundAvailableImmediately = "Không có",
impoundCost = "Giá",
changeVehiclePlate = "Đổi biển số xe",
newPlate = "Biển số mới",
search = "Tìm kiếm theo tên hoặc biển số xe",
noPrivateGarages = "Không có nhà để xe riêng",
editPrivateGarage = "Chỉnh sửa nhà để xe riêng",
owners = "Những chủ sở hữu)",
location = "Vị trí",
next = "Kế tiếp",
previous = "Trước",
page = "Trang",
of = "của",
show = "Trình diễn",
save = "Cứu",
edit = "Biên tập",
delete = "Xóa bỏ",
garageDeleteConfirm = "Bạn có chắc chắn muốn xóa gara này không?",
privGarageSearch = "Tìm kiếm theo tên",
garageUpdatedSuccess = "Nhà để xe được cập nhật thành công!",
getCurrentCoords = "Nhận tọa độ hiện tại",
identifier = "định danh",
name = "Tên",
noPlayers = "Không có người chơi nào được thêm vào",
addPlayer = "thêm người chơi",
loadingVehicle = "Tải xe...",
vehicleSetup = "Thiết lập xe",
extras = "Tiện ích bổ sung",
extra = "Thêm",
liveries = "gan",
livery = "gan",
noLiveries = "không có gan",
noExtras = "Không có tính năng bổ sung",
none = "Không có",
vehicleNeedsService = "Needs Service",
type = "Type",
-- Notifications
insertVehicleTypeError = "Bạn chỉ có thể để %{value} vào trong gara này!",
insertVehiclePublicError = "Bạn không thể cất xe tổ chức vào trong gara công cộng!",
vehicleParkedSuccess = "Cất xe vào gara thành công",
vehicleNotOwnedError = "Bạn không phải là chủ sở hữu của chiếc xe này!",
vehicleNotOwnedByPlayerError = "Xe này không thuộc sở hữu của người chơi nào!",
notEnoughMoneyError = "Bạn không đủ tiền trong ngân hàng!",
vehicleNotYoursError = "Xe này không thuộc về bạn!",
notJobOrGangVehicle = "Đây không phải là xe của %{value}",
invalidGangError = "Tên gang không hợp lệ!",
invalidJobError = "Tên job không hợp lệ!",
notInsideVehicleError = "Bạn không ngồi trên xe",
vehicleAddedToGangGarageSuccess = "Xe này đã được thêm vào %{value}!",
vehicleAddedToJobGarageSuccess = "Xe này đã được thêm vào %{value}!",
moveCloserToVehicleError = "Bạn cần di chuyển đến gần xe hơn!",
noVehiclesNearbyError = "Không có chiếc xe nào gần bạn!",
commandPermissionsError = "Bạn không thể sử dụng lệnh này!",
actionNotAllowedError = "Bạn không được phép làm điều này!",
garageNameExistsError = "Tên gara này đã tồn tại!",
vehiclePlateExistsError = "Biển số xe này đã tồn tại",
playerNotOnlineError = "Người chơi này không online",
vehicleTransferSuccess = "Xe được chuyển đến %{value}",
vehicleTransferSuccessGeneral = "Xe của bạn đã được chuyển thành công!",
vehicleReceived = "Bạn đã nhận được một chiếc xe với biển số %{value}",
vehicleImpoundSuccess = "Tạm giữ xe thành công!",
vehicleImpoundRemoveSuccess = "Xe đã được chuộc thành công",
vehicleImpoundReturnedToOwnerSuccess = "Xe này đã được chuyển về gara chủ sở hữu",
garageCreatedSuccess = "Tạo gara thành công!",
vehiclePlateUpdateSuccess = "Biển số xe được đổi thành: %{value}",
vehicleDeletedSuccess = "Xe này đã được xoá khỏi database %{value}",
playerIsDead = "Bạn không thể làm điều này trong khi bạn đã chết",
-- Commands
cmdSetGangVehicle = "Thêm Xe hiện tại vào một Gang",
cmdRemoveGangVehicle = "Đặt xe gang thành xe cá nhân",
cmdSetJobVehicle = "Thêm xe hiện tại vào một nghề nào đó",
cmdRemoveJobVehicle = "Đặt xe nghề thành xe cá nhân",
cmdArgGangName = "Tên Gang",
cmdArgJobName = "Tên Job",
cmdArgPlayerId = "ID của chủ sỡ hữu mới",
cmdImpoundVehicle = "Giam giữ xe",
cmdChangePlate = "Đổi biển số xe (Admin only)",
cmdDeleteVeh = "Xoá xe khỏi dữ liệu máy chủ (Admin only)",
cmdCreatePrivGarage = "Tạo gara cá nhân",
-- v3
vehicleStoreError = "You cannot store this vehicle here",
mins = "mins",
noVehiclesAvailableToDrive = "There are no vehicles available to drive",
}

View file

@ -0,0 +1,70 @@
--
-- Discord Webhooks
--
Webhooks = {}
Webhooks.VehicleTakeOutAndInsert = ""
Webhooks.VehiclePlayerTransfer = ""
Webhooks.VehicleGarageTransfer = ""
Webhooks.Impound = ""
Webhooks.PrivateGarages = ""
--[[
EXAMPLE WEBHOOK CALL
sendWebhook(src, Webhooks.VehicleTakeOutAndInsert, "Webhook Title", "success", {
{ key = "Data fields", value = "Data value" },
{ key = "Data fields 2", value = "Data value 2" }
})
]]--
function sendWebhook(playerId, webhookUrl, title, type, data)
if not webhookUrl then return end
local identifier = Framework.Server.GetPlayerIdentifier(playerId)
if not identifier then return false end
local color = 0xff6700
if type == "success" then color = 0x2ecc71 end
if type == "danger" then color = 0xe74c3c end
local player = Framework.Server.GetPlayerInfo(playerId)
if not player then return false end
local fields = {
{
name = "Player",
value = string.format("%s (%s)", player.name, identifier),
inline = false
}
}
for _, row in pairs(data) do
fields[#fields + 1] = {
name = row.key,
value = tostring(row.value),
inline = true
}
end
local body = {
username = "JG Advanced Garages Webhook",
avatar_url = "https://forum.cfx.re/user_avatar/forum.cfx.re/jgscripts/288/3621910_2.png",
content = "",
embeds = {
{
type = "rich",
title = title,
description = "",
color = color,
fields = fields
}
}
}
PerformHttpRequest(
webhookUrl,
function(err, text, header) end,
"POST",
json.encode(body),
{["Content-Type"] = "application/json"}
)
end

View file

@ -0,0 +1,6 @@
This is where you can add custom vehicle thumbnails. But first:
1. You must have this feature enabled in config.lua `Config.ShowVehicleImages = true`
2. All images must be a png and a small file size. Ideally a 16:9 aspect ratio too
Learn more: https://docs.jgscripts.com/advanced-garages/vehicle-images

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html lang="en" data-bs-theme="dark">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/web/dist/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>jg-advancedgarages-web</title>
<script type="module" crossorigin src="/web/dist/assets/index-CZ7rsOCg.js"></script>
<link rel="stylesheet" crossorigin href="/web/dist/assets/index-DURuzDZl.css">
</head>
<body>
<div id="root"></div>
</body>
</html>

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB