structura foldere

mutat kq- folders in un singur folder [kq]
This commit is contained in:
2026-03-30 01:55:03 +03:00
parent af1286d583
commit c291b81f26
2319 changed files with 0 additions and 14 deletions

View File

@@ -0,0 +1,13 @@
if Config.TextUI ~= "HelpNotification" then
return
end
function TextShow(msg)
SetTextComponentFormat("STRING")
AddTextComponentString(msg)
DisplayHelpTextFromStringLabel(0, 0, 1, -1)
end
function TextClose()
return
end

View File

@@ -0,0 +1,21 @@
-- Function to draw 3D text based on the chosen method
local isTextVisible = true
-- Function to draw 3D text based on the chosen method
function Draw3DText(x, y, z, text)
if isTextVisible then
if Config.ReplaceDraw3D then
if Config.TextUI == 'okokTextUI' then
print("DEBUG: okokTextUI is currently bugged and will not display correctly.")
end
TextShow(text) -- Use the ox_lib function
else
DrawText3D(x, y, z, text)
end
isTextVisible = false
end
end
function TextClose()
return
end

View File

@@ -0,0 +1,11 @@
if Config.TextUI ~= "esx_textui" then
return
end
function TextShow(msg, x, y, z)
exports["esx_textui"]:TextUI(msg)
end
function TextClose()
exports["esx_textui"]:HideUI()
end

View File

@@ -0,0 +1,11 @@
if Config.TextUI ~= "okokTextUI" then
return
end
function TextShow(msg)
exports['okokTextUI']:Open(msg, 'lightblue', 'right')
end
function TextClose()
exports['okokTextUI']:Close()
end

View File

@@ -0,0 +1,46 @@
local lastTextDisplayed = nil
if Config.TextUI ~= "ox_lib" then
return
end
function TextShow(msg)
if lib.isTextUIOpen() then
return
else
local icon = Config.CustomIcon or ''
if Config.CustomDesignTextUI then
lib.showTextUI(msg, {
icon = icon,
style = {
borderRadius = 0,
backgroundColor = '#141517',
color = '#d6d6d6'
}
})
else
lib.showTextUI(msg, { icon = icon })
end
lastTextDisplayed = msg
end
end
function TextClose(textToClose)
local isOpen, currentText = lib.isTextUIOpen()
if isOpen then
if currentText == textToClose or textToClose == true then
lib.hideTextUI()
lastTextDisplayed = nil
return true
elseif lastTextDisplayed and currentText == lastTextDisplayed then
lib.hideTextUI()
lastTextDisplayed = nil
return true
end
end
return false
end

View File

@@ -0,0 +1,11 @@
if Config.TextUI ~= "qb" then
return
end
function TextShow(msg)
exports['qb-core']:DrawText(msg, 'left')
end
function TextClose()
exports['qb-core']:HideText()
end

View File

@@ -0,0 +1,85 @@
if Config.Framework ~= "esx" then
return
end
ESX = nil
ESX = exports['es_extended']:getSharedObject()
nh_trigger = 'nh-context:createMenu'
function TriggerServerCallback(name, cb, ...)
ESX.TriggerServerCallback(name, cb, ...)
end
function GetVehicleProperties(vehicle)
return ESX.Game.GetVehicleProperties(vehicle)
end
function GetPlateVeh(vehicle)
local veh = ESX.Game.GetVehicleProperties(vehicle)
if not veh then return false end
return veh.plate
end
function GetClosestVehicle()
return ESX.Game.GetClosestVehicle()
end
function GetJobFramework()
return ESX.GetPlayerData().job
end
function GetGangFramework()
if Config.Gangs == true then
return exports['qs-gangs']:GetGang()
else
return nil
end
end
function GetVehiclesInArea()
return ESX.Game.GetVehiclesInArea(GetEntityCoords(PlayerPedId()), Config.LockDistance)
end
function CheckPolice()
if Config.ReqPolice then
local canRob = nil
TriggerServerCallback(Config.Eventprefix..':server:GetPolice', function(check)
canRob = check
end)
repeat Wait(250) until canRob ~= nil
return canRob
else
return true
end
end
function ProgressBar(name, label, duration, useWhileDead, canCancel, disableControls, animation, prop, propTwo, onFinish, onCancel)
local onFinishCallback = onFinish or function() end
local onCancelCallback = onCancel or function() end
local success = lib.progressCircle({
duration = duration,
position = 'bottom',
label = label,
useWhileDead = useWhileDead,
canCancel = canCancel,
disable = disableControls,
anim = animation,
prop = prop,
propTwo = propTwo,
})
if success then
onFinishCallback()
else
onCancelCallback()
end
end
function SendTextMessage(msg, type)
if type == 'inform' then lib.notify({title = 'Information', description = msg, type = 'inform', id = msg}) end
if type == 'error' then lib.notify({title = 'Error', description = msg, type = 'error', id = msg}) end
if type == 'success' then lib.notify({title = 'Success', description = msg, type = 'success', id = msg}) end
end

View File

@@ -0,0 +1,108 @@
if Config.Framework ~= "qb" then
return
end
QBCore = nil
QBCore = exports['qb-core']:GetCoreObject()
qb_menu_name = 'qb-menu'
nh_trigger = 'nh-context:createMenu'
function TriggerServerCallback(name, cb, ...)
QBCore.Functions.TriggerCallback(name, cb, ...)
end
function GetVehicleProperties(vehicle)
return QBCore.Functions.GetVehicleProperties(vehicle)
end
function GetPlateVeh(vehicle)
return QBCore.Functions.GetPlate(vehicle)
end
function GetClosestVehicle(vehicle)
local veh = QBCore.Functions.GetClosestVehicle(vehicle)
if not veh then return false end
return veh
end
function GetJobFramework()
return QBCore.Functions.GetPlayerData().job
end
function GetGangFramework()
if Config.Gangs == true then
return exports['qs-gangs']:GetGang()
else
return nil
end
end
function GetVehiclesInArea()
local result = {}
table.clear(result)
local vehicles = QBCore.Functions.GetVehicles()
local playerCoords = GetEntityCoords(PlayerPedId())
for k, v in pairs(vehicles) do
local vehicleCoords = GetEntityCoords(v)
local distance = #(playerCoords - vehicleCoords)
if distance <= Config.LockDistance then
table.insert(result, v)
end
end
return result
end
function CheckPolice()
if Config.ReqPolice then
local canRob = nil
TriggerServerCallback(Config.Eventprefix..':server:GetPolice', function(check)
canRob = check
end)
repeat Wait(250) until canRob ~= nil
return canRob
else
return true
end
end
function ProgressBar(name, label, duration, useWhileDead, canCancel, disableControls, animation, prop, propTwo, onFinish, onCancel)
local onFinishCallback = onFinish or function() end
local onCancelCallback = onCancel or function() end
local success = lib.progressCircle({
duration = duration,
position = 'bottom',
label = label,
useWhileDead = useWhileDead,
canCancel = canCancel,
disable = disableControls,
anim = animation,
prop = prop,
propTwo = propTwo,
})
if success then
onFinishCallback()
else
onCancelCallback()
end
end
function SendTextMessage(msg, type)
if type == 'inform' then
QBCore.Functions.Notify(msg, 'primary', 5000)
end
if type == 'error' then
QBCore.Functions.Notify(msg, 'error', 5000)
end
if type == 'success' then
QBCore.Functions.Notify(msg, 'success', 5000)
end
end
RegisterCommand("getkeys", function()
exports['qs-vehiclekeys']:GiveKeysAuto()
end)

View File

@@ -0,0 +1,106 @@
if Config.Framework ~= 'qbx' then
return
end
QBCore = exports['qb-core']:GetCoreObject()
qb_menu_name = 'qb-menu'
function TriggerServerCallback(name, cb, ...) -- Sadly have to keep this for compatibility
QBCore.Functions.TriggerCallback(name, cb, ...)
end
function GetPlayerData()
return exports.qbx_core:GetPlayerData()
end
function GetIdentifier()
return GetPlayerData().citizenid
end
function GetPlayers()
return GetActivePlayers()
end
function GetVehicleProperties(vehicle)
return lib.getVehicleProperties(vehicle)
end
function GetPlateVeh(vehicle)
return QBCore.Functions.GetPlate(vehicle)
end
function GetClosestVehicle(coords, maxDistance, includePlayerVehicle)
local vehicle, vehicleCoords = lib.getClosestVehicle(coords, maxDistance, includePlayerVehicle)
if not vehicle then
return false
end
return vehicle
end
function GetJobFramework()
return GetPlayerData()?.job?.name
end
function GetGangFramework()
if Config.Gangs == true then
return exports['qs-gangs']:GetGang()
else
return nil
end
end
function GetVehiclesInArea()
local result = {}
table.clear(result)
local vehicles = QBCore.Functions.GetVehicles()
local playerCoords = GetEntityCoords(PlayerPedId())
for k, v in pairs(vehicles) do
local vehicleCoords = GetEntityCoords(v)
local distance = #(playerCoords - vehicleCoords)
if distance <= Config.LockDistance then
table.insert(result, v)
end
end
return result
end
function CheckPolice()
if Config.ReqPolice then
local canRob = nil
TriggerServerCallback(Config.Eventprefix..':server:GetPolice', function(check)
canRob = check
end)
repeat Wait(250) until canRob ~= nil
return canRob
else
return true
end
end
function ProgressBar(name, label, duration, useWhileDead, canCancel, disableControls, animation, prop, propTwo, onFinish, onCancel)
local onFinishCallback = onFinish or function() end
local onCancelCallback = onCancel or function() end
local success = lib.progressCircle({
duration = duration,
position = 'bottom',
label = label,
useWhileDead = useWhileDead,
canCancel = canCancel,
disable = disableControls,
anim = animation,
prop = prop,
propTwo = propTwo,
})
if success then
onFinishCallback()
else
onCancelCallback()
end
end
function SendTextMessage(msg, type)
if type == 'inform' or type == 'error' or type == 'success' then lib.notify({title = 'Vehicle keys', description = msg, type = type}) end
end

View File

@@ -0,0 +1,18 @@
if Config.Fuel ~= 'LegacyFuel' then
return
end
function SetFuel(vehicle, fuelLevel)
local success, error = pcall(function()
exports['LegacyFuel']:SetFuel(vehicle, fuelLevel)
end)
if not success then
Debug('You did not configure your fuel system and it is set to 100.0 in fuel, check in Config.Fuel')
return 100.0
end
end
function GetFuel(vehicle)
return exports['LegacyFuel']:GetFuel(vehicle)
end

View File

@@ -0,0 +1,18 @@
if Config.Fuel ~= 'esx-sna-fuel' then
return
end
function SetFuel(vehicle, fuelLevel)
local success, error = pcall(function()
exports['esx-sna-fuel']:SetFuel(vehicle, fuelLevel)
end)
if not success then
Debug('You did not configure your fuel system and it is set to 100.0 in fuel, check in Config.Fuel')
return 100.0
end
end
function GetFuel(vehicle)
return exports['esx-sna-fuel']:GetFuel(vehicle)
end

View File

@@ -0,0 +1,18 @@
if Config.Fuel ~= 'lj-fuel' then
return
end
function SetFuel(vehicle, fuelLevel)
local success, error = pcall(function()
exports['lj-fuel']:SetFuel(vehicle, fuelLevel)
end)
if not success then
Debug('You did not configure your fuel system and it is set to 100.0 in fuel, check in Config.Fuel')
return 100.0
end
end
function GetFuel(vehicle)
return exports['lj-fuel']:GetFuel(vehicle)
end

View File

@@ -0,0 +1,18 @@
if Config.Fuel ~= 'okokGasStation' then
return 100.0
end
function SetFuel(vehicle, fuelLevel)
local success, error = pcall(function()
exports['okokGasStation']:SetFuel(vehicle, fuelLevel)
end)
if not success then
Debug('You did not configure your fuel system and it is set to 100.0 in fuel, check in Config.Fuel')
return 100.0
end
end
function GetFuel(vehicle)
return exports['okokGasStation']:GetFuel(vehicle)
end

View File

@@ -0,0 +1,11 @@
if Config.Fuel ~= 'ox_fuel' then
return
end
function SetFuel(vehicle, fuelLevel)
Entity(vehicle).state.fuel = fuelLevel
end
function GetFuel(vehicle)
return Entity(vehicle).state.fuel
end

View File

@@ -0,0 +1,18 @@
if Config.Fuel ~= 'ps-fuel' then
return
end
function SetFuel(vehicle, fuelLevel)
local success, error = pcall(function()
exports['ps-fuel']:SetFuel(vehicle, fuelLevel)
end)
if not success then
Debug('You did not configure your fuel system and it is set to 100.0 in fuel, check in Config.Fuel')
return 100.0
end
end
function GetFuel(vehicle)
return exports['ps-fuel']:GetFuel(vehicle)
end

View File

@@ -0,0 +1,18 @@
if Config.Fuel ~= 'qs-fuelstations' then
return
end
function SetFuel(vehicle, fuelLevel)
local success, error = pcall(function()
exports['qs-fuelstations']:SetFuel(vehicle, fuelLevel)
end)
if not success then
Debug('You did not configure your fuel system and it is set to 100.0 in fuel, check in Config.Fuel')
return 100.0
end
end
function GetFuel(vehicle)
return exports['qs-fuelstations']:GetFuel(vehicle)
end

View File

@@ -0,0 +1,18 @@
if Config.Fuel ~= 'rcore_fuel' then
return
end
function SetFuel(vehicle, fuelLevel)
local success, error = pcall(function()
exports['rcore_fuel']:SetFuel(vehicle, fuelLevel)
end)
if not success then
Debug('You did not configure your fuel system and it is set to 100.0 in fuel, check in Config.Fuel')
return 100.0
end
end
function GetFuel(vehicle)
return exports['rcore_fuel']:GetFuel(vehicle)
end

View File

@@ -0,0 +1,18 @@
if Config.Fuel ~= 'ti_fuel' then
return
end
function SetFuel(vehicle, fuelLevel)
local success, error = pcall(function()
exports['ti_fuel']:setFuel(vehicle, fuelLevel, 'RON91')
end)
if not success then
Debug('You did not configure your fuel system and it is set to 100.0 in fuel, check in Config.Fuel')
return 100.0
end
end
function GetFuel(vehicle)
return exports['ti_fuel']:getFuel(vehicle)
end

View File

@@ -0,0 +1,18 @@
if Config.Fuel ~= 'x-fuel' then
return
end
function SetFuel(vehicle, fuelLevel)
local success, error = pcall(function()
exports['x-fuel']:SetFuel(vehicle, fuelLevel)
end)
if not success then
Debug('You did not configure your fuel system and it is set to 100.0 in fuel, check in Config.Fuel')
return 100.0
end
end
function GetFuel(vehicle)
return exports['x-fuel']:GetFuel(vehicle)
end

View File

@@ -0,0 +1,118 @@
if Config.MenuType ~= 'esx_context' then
return
end
if Config.Framework == 'qb' then
return
end
function OpenCopyKeys()
local elements = {}
TriggerServerCallback(Config.Eventprefix..':server:getVehicles', function(vehicles)
table.insert(elements, {
title = Lang("VEHICLEKEYS_MENU_TITLE")
})
for _,v in pairs(vehicles) do
local hashVehicule = v.vehicle.model
local plate = v.vehicle.plate
local vehicleName = GetDisplayNameFromVehicleModel(hashVehicule)
table.insert(elements, {
title = Lang("VEHICLEKEYS_MENU_MODEL").." " .. vehicleName .. " ".. Lang("VEHICLEKEYS_MENU_PLATE").." " .. plate ,
name = "take",
metadata = {vehicleName, plate}
})
end
ESX.OpenContext("right" , elements, function(menu,element)
if element.name == "take" then
clonekey(element.metadata[2], element.metadata[1])
ESX.CloseContext()
end
end, function(menu)
ESX.CloseContext()
end)
end)
end
function OpenPlateMenu()
if Config.PlateType == 'menu' then
local elements = {}
table.insert(elements, {
title = Lang("VEHICLEKEYS_MENU_BUY_PLATE")
})
table.insert(elements, {
title = Lang("VEHICLEKEYS_MENU_BUY_PLATE_DESCRIPTION")..Config.NPCPlatePrice['price'],
name = "take",
})
table.insert(elements, {
title = Lang('VEHICLEKEYS_MENU_BUY_CHANGEPLATE_DESCRIPTION') .. Config.ChangePlateItemPrice['price'],
name = "screwdriver",
})
ESX.OpenContext("right" , elements, function(menu,element)
if element.name == "take" then
TriggerEvent(Config.Eventprefix..':buyPlate')
ESX.CloseContext()
elseif element.name == "screwdriver" then
TriggerEvent(Config.Eventprefix..':buyScrewdriver')
ESX.CloseContext()
end
end, function(menu)
ESX.CloseContext()
end)
end
if Config.PlateType == 'shop' then
local generatePlate = GeneratePlate()
local plate = {
plate = generatePlate,
}
local shop = Lang('VEHICLEKEYS_PLATE_SHOP_NAME')
local ShopItems = {
label = Lang('VEHICLEKEYS_PLATE_SHOP_LABEL'),
items = {
{name = Config.PlateItem ,amount = 1, price = Config.PlatePrice['price'], slot= 1, info = plate },
{name = Config.ChangePlateItem, amount = 1, price = Config.ChangePlateItemPrice['price'], slot = 2 },
},
}
TriggerServerEvent("inventory:server:OpenInventory", "shop", shop, ShopItems)
end
end
function OpenTrackerMenu(gpsdata)
local addedVehicles = {}
TriggerServerCallback(Config.Eventprefix..':server:GetPlayerIdentifier', function(PlayerIdentifier)
local elements = {}
for _, v in ipairs(gpsdata) do
if v.Player == PlayerIdentifier and not addedVehicles[v.plate] then
table.insert(elements, {
icon = 'car',
title = string.format(Lang('VEHICLEKEYS_TRACKER_MENU_DESC'), v.plate),
value = v.plate
})
addedVehicles[v.plate] = true
end
end
if #elements == 0 then
table.insert(elements, {
icon = 'times',
title = Lang('VEHICLEKEYS_TRACKER_NO_VEHICLES'),
disabled = true
})
end
ESX.OpenContext("right" , elements, function(data)
if data.current.value then
TriggerEvent(Config.Eventprefix..':client:LocateVehicleWithPlate', data.current.value)
end
end)
end)
end

View File

@@ -0,0 +1,296 @@
if Config.MenuType ~= 'esx_menu_default' then
return
end
if Config.Framework == 'qb' then
return
end
if Config.InventoryScript == 'qs' then
function GetPlateFromItem(item)
return item.info and item.info.plate or nil
end
function GetModelFromItem(item)
return item.info and item.info.description or nil
end
elseif Config.InventoryScript == 'ox' then
function GetPlateFromItem(item)
local plate = item.metadata and item.metadata.plate or nil
return plate
end
function GetModelFromItem(item)
local model = item.metadata and item.metadata.model or nil
return model
end
elseif Config.InventoryScript == 'qb' then
function GetPlateFromItem(item)
return item.info and item.info.plate or nil
end
function GetModelFromItem(item)
return item.info and item.info.description or nil
end
elseif Config.InventoryScript == 'codem' then
function GetPlateFromItem(item)
return item.info and item.info.plate or nil
end
function GetModelFromItem(item)
return item.info and item.info[1] and item.info[1].description or nil
end
elseif Config.InventoryScript == 'core_inventory' then
function GetPlateFromItem(item)
return item.info and item.info.plate or nil
end
function GetModelFromItem(item)
return item.info and item.info.description or nil
end
else
-- Handle other cases or provide a default implementation
function GetPlateFromItem(item)
return nil
end
function GetModelFromItem(item)
return nil
end
end
function OpenCopyKeys()
local vehicleMenuElements = {
{
label = Lang("VEHICLEKEYS_MENU_OWNED_VEHICLES") .. ' - $' .. Config.CopyKeysCost,
name = "owned_vehicles",
icon = 'car',
},
{
label = Lang("VEHICLEKEYS_MENU_OWNED_KEYS") .. ' - $' .. Config.InventoryCopyKeysCost,
name = "owned_keys",
icon = 'key',
},
}
ESX.UI.Menu.CloseAll()
ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'vehicle_keys_menu_choice', {
title = Lang("VEHICLEKEYS_MENU_CHOICE_TITLE"),
align = Config.MenuPlacement,
elements = vehicleMenuElements,
}, function(data, menu)
-- Handle menu interactions here
local currentElement = data.current
if currentElement.name == "owned_vehicles" then
OpenVehicleKeysMenu()
elseif currentElement.name == "owned_keys" then
OpenOwnedKeysMenu()
end
end, function(data, menu)
menu.close()
end)
end
function OpenVehicleKeysMenu()
local vehicleMenuElements = {}
TriggerServerCallback(Config.Eventprefix..':server:getVehicles', function(vehicles)
if Config.Debug then
print(json.encode(vehicles))
end
for _,v in pairs(vehicles) do
local hashVehicle = v.vehicle.model
local plate = v.vehicle.plate
local vehicleName = GetDisplayNameFromVehicleModel(hashVehicle)
print("Plate: " .. plate)
print("Vehicle Name: " .. vehicleName)
table.insert(vehicleMenuElements, {
label = Lang("VEHICLEKEYS_MENU_MODEL").." " .. vehicleName .. ", ".. Lang("VEHICLEKEYS_MENU_PLATE").." " .. plate,
icon = 'car',
value = {plate = plate, model = vehicleName},
})
end
table.insert(vehicleMenuElements, {
label = Lang("BACK_TO_PREVIOUS_MENU"),
icon = 'arrow-left',
action = "back",
})
ESX.UI.Menu.CloseAll()
ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'vehicle_keys_menu', {
title = Lang("VEHICLEKEYS_MENU_TITLE"),
align = Config.MenuPlacement,
elements = vehicleMenuElements,
}, function(data, menu)
local currentElement = data.current
if currentElement.action == "back" then
OpenCopyKeys()
else
clonekey(data.current.value.plate, data.current.value.model, true, Config.CopyKeysCost)
end
end, function(data, menu)
menu.close()
end)
end)
end
function OpenOwnedKeysMenu()
local elements = {}
TriggerServerCallback(Config.Eventprefix .. ':server:GetPlayerItems', function(items)
if items then
local keysFound = false
for _, item in pairs(items) do
local plate = GetPlateFromItem(item)
local model = GetModelFromItem(item)
print("Plate:", plate)
print("Model:", model)
if plate and model then
table.insert(elements, {
label = Lang("VEHICLEKEYS_MENU_MODEL").." " .. model .. ", ".. Lang("VEHICLEKEYS_MENU_PLATE").." " .. plate,
icon = 'key',
value = {plate = plate, model = model},
})
keysFound = true
end
end
if not keysFound then
table.insert(elements, {
label = Lang("NO_KEYS_FOUND"),
icon = 'exclamation-circle',
disabled = true,
action = "none",
})
end
end
table.insert(elements, {
label = Lang("BACK_TO_PREVIOUS_MENU"),
icon = 'arrow-left',
action = "back",
})
ESX.UI.Menu.CloseAll()
ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'vehicle_keys_menu', {
title = Lang("VEHICLEKEYS_MENU_TITLE"),
align = Config.MenuPlacement,
elements = elements,
}, function(data, menu)
-- Handle menu interactions here
local currentElement = data.current
if currentElement.action == "back" then
OpenCopyKeys()
elseif currentElement.action == "none" then
return
else
clonekey(data.current.value.plate, data.current.value.model, true, Config.InventoryCopyKeysCost)
end
end, function(data, menu)
menu.close()
end)
end)
end
function OpenPlateMenu()
if Config.PlateType == 'menu' then
local plateMenuElements = {
{
label = Lang('VEHICLEKEYS_MENU_BUY_PLATE_DESCRIPTION') .. ' - $' .. Config.PlatePrice['price'],
name = "buy_plate",
icon = 'car',
onSelect = function(args, menu)
TriggerEvent(Config.Eventprefix .. ':buyPlate')
end,
},
{
label = Lang('VEHICLEKEYS_MENU_BUY_CHANGEPLATE_DESCRIPTION') .. ' - $' .. Config.ChangePlateItemPrice['price'],
name = "buy_change_plate",
icon = 'screwdriver',
onSelect = function(args, menu)
TriggerEvent(Config.Eventprefix .. ':buyScrewdriver')
end,
},
}
ESX.UI.Menu.CloseAll()
ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'vehicle_keys_menu_plate', {
title = Lang('VEHICLEKEYS_MENU_TITLE_PLATE'),
align = Config.MenuPlacement,
elements = plateMenuElements,
}, function(data, menu)
-- Handle menu interactions here
local currentElement = data.current
if currentElement.name == "buy_plate" then
TriggerEvent(Config.Eventprefix .. ':buyPlate')
elseif currentElement.name == "buy_change_plate" then
TriggerEvent(Config.Eventprefix .. ':buyScrewdriver')
end
end, function(data, menu)
menu.close()
end)
elseif Config.PlateType == 'shop' then
local generatePlate = GeneratePlate()
local plate = {
plate = generatePlate,
}
local shop = Lang('VEHICLEKEYS_PLATE_SHOP_NAME')
local shopItems = {
label = Lang('VEHICLEKEYS_PLATE_SHOP_LABEL'),
items = {
{name = Config.PlateItem, amount = 1, price = Config.PlatePrice['price'], slot = 1, info = plate},
{name = Config.ChangePlateItem, amount = 1, price = Config.ChangePlateItemPrice['price'], slot = 2},
},
}
TriggerServerEvent("inventory:server:OpenInventory", "shop", shop, ShopItems)
end
end
function OpenTrackerMenu(gpsdata)
local addedVehicles = {}
TriggerServerCallback(Config.Eventprefix..':server:GetPlayerIdentifier', function(PlayerIdentifier)
local elements = {}
for _, v in ipairs(gpsdata) do
if v.Player == PlayerIdentifier and not addedVehicles[v.plate] then
table.insert(elements, {
label = string.format(Lang('VEHICLEKEYS_TRACKER_MENU_DESC'), v.plate),
icon = 'car',
value = v.plate
})
addedVehicles[v.plate] = true
end
end
if #elements == 0 then
table.insert(elements, {
label = Lang('VEHICLEKEYS_TRACKER_NO_VEHICLES'),
disabled = true
})
end
ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'vehiclekeys_gps_menu', {
title = Lang('VEHICLEKEYS_TRACKER_MENU_TITLE'),
align = 'top-left',
elements = elements
}, function(data, menu)
if data.current.value then
TriggerEvent(Config.Eventprefix..':client:LocateVehicleWithPlate', data.current.value)
end
end, function(data, menu)
menu.close()
end)
end)
end

View File

@@ -0,0 +1,240 @@
if Config.MenuType ~= 'ox_lib' then
return
end
if Config.Framework == 'qb' then
return
end
if Config.InventoryScript == 'qs' then
function GetPlateFromItem(item)
return item.info and item.info.plate or nil
end
function GetModelFromItem(item)
return item.info and item.info.description or nil
end
elseif Config.InventoryScript == 'ox' then
function GetPlateFromItem(item)
local plate = item.metadata and item.metadata.plate or nil
return plate
end
function GetModelFromItem(item)
local model = item.metadata and item.metadata.model or nil
return model
end
elseif Config.InventoryScript == 'qb' then
function GetPlateFromItem(item)
return item.info and item.info.plate or nil
end
function GetModelFromItem(item)
return item.info and item.info.description or nil
end
elseif Config.InventoryScript == 'codem' then
function GetPlateFromItem(item)
return item.info and item.info.plate or nil
end
function GetModelFromItem(item)
return item.info and item.info[1] and item.info[1].description or nil
end
elseif Config.InventoryScript == 'core_inventory' then
function GetPlateFromItem(item)
return item.info and item.info.plate or nil
end
function GetModelFromItem(item)
return item.info and item.info.description or nil
end
else
-- Handle other cases or provide a default implementation
function GetPlateFromItem(item)
return nil
end
function GetModelFromItem(item)
return nil
end
end
function OpenCopyKeys()
local elements = {}
local vehicleMenu = {
{
title = Lang("VEHICLEKEYS_MENU_OWNED_VEHICLES") .. ' - $' .. Config.CopyKeysCost,
icon = 'car',
onSelect = function(args)
OpenVehicleKeysMenu()
end,
},
{
title = Lang("VEHICLEKEYS_MENU_OWNED_KEYS") .. ' - $' .. Config.InventoryCopyKeysCost,
icon = 'key',
onSelect = function(args)
OpenOwnedKeysMenu()
end,
},
}
lib.registerContext({
id = 'VEHICLEKEYS_MENU_CHOICE',
title = Lang("VEHICLEKEYS_MENU_CHOICE_TITLE"),
options = vehicleMenu,
})
lib.showContext('VEHICLEKEYS_MENU_CHOICE')
end
function OpenVehicleKeysMenu()
local elements = {}
TriggerServerCallback(Config.Eventprefix..':server:getVehicles', function(vehicles)
if Config.Debug then
print(json.encode(vehicles))
end
for _,v in pairs(vehicles) do
local hashVehicule = v.vehicle.model
local plate = v.vehicle.plate
local vehicleName = GetDisplayNameFromVehicleModel(hashVehicule)
table.insert(elements, {
title = Lang("VEHICLEKEYS_MENU_MODEL").." " .. vehicleName .. ", ".. Lang("VEHICLEKEYS_MENU_PLATE").." " .. plate,
icon = 'car',
onSelect = function(args)
clonekey(plate, vehicleName, true, Config.CopyKeysCost)
end,
})
end
table.insert(elements, {
title = Lang("BACK_TO_PREVIOUS_MENU"),
icon = 'arrow-left',
onSelect = function(args)
OpenCopyKeys()
end,
})
lib.registerContext({
id = 'VEHICLEKEYS_MENU_TITLE',
title = Lang("VEHICLEKEYS_MENU_TITLE"),
options = elements,
})
lib.showContext('VEHICLEKEYS_MENU_TITLE')
end)
end
function OpenOwnedKeysMenu()
local elements = {}
TriggerServerCallback(Config.Eventprefix .. ':server:GetPlayerItems', function(items)
if items then
local keysFound = false
for _, item in pairs(items) do
local plate = GetPlateFromItem(item)
local model = GetModelFromItem(item)
if plate and model then
keysFound = true
table.insert(elements, {
title = Lang("VEHICLEKEYS_MENU_MODEL").." " .. model .. ", ".. Lang("VEHICLEKEYS_MENU_PLATE").." " .. plate,
icon = 'key',
onSelect = function(args)
clonekey(plate, model, true, Config.InventoryCopyKeysCost)
end,
})
end
end
if not keysFound then
table.insert(elements, {
title = Lang("NO_KEYS_FOUND"),
icon = 'exclamation-circle',
disabled = true,
})
end
end
table.insert(elements, {
title = Lang("BACK_TO_PREVIOUS_MENU"),
icon = 'arrow-left',
onSelect = function(args)
OpenCopyKeys()
end,
})
lib.registerContext({
id = 'VEHICLEKEYS_MENU_TITLE',
title = Lang("VEHICLEKEYS_MENU_TITLE"),
options = elements,
})
lib.showContext('VEHICLEKEYS_MENU_TITLE')
end)
end
function OpenPlateMenu()
if Config.PlateType == 'menu' then
local elements = {}
table.insert(elements, {
title = Lang('VEHICLEKEYS_MENU_BUY_PLATE_DESCRIPTION') .. ' - $' .. Config.PlatePrice['price'],
icon = 'car',
onSelect = function(args)
TriggerEvent(Config.Eventprefix .. ':buyPlate')
end,
})
table.insert(elements, {
title = Lang('VEHICLEKEYS_MENU_BUY_CHANGEPLATE_DESCRIPTION') .. ' - $' .. Config.ChangePlateItemPrice['price'],
icon = 'screwdriver',
onSelect = function(args)
TriggerEvent(Config.Eventprefix .. ':buyScrewdriver')
end,
})
lib.registerContext({
id = 'VEHICLEKEYS_MENU_TITLE_PLATE',
title = Lang('VEHICLEKEYS_MENU_TITLE_PLATE'),
options = elements,
})
lib.showContext('VEHICLEKEYS_MENU_TITLE_PLATE')
end
if Config.PlateType == 'shop' then
local generatePlate = GeneratePlate()
local plate = { plate = generatePlate }
local shop = Lang('VEHICLEKEYS_PLATE_SHOP_NAME')
local ShopItems = {
label = Lang('VEHICLEKEYS_PLATE_SHOP_LABEL'),
items = {
{ name = Config.PlateItem, amount = 1, price = Config.PlatePrice['price'], slot = 1, info = plate },
{ name = Config.ChangePlateItem, amount = 1, price = Config.ChangePlateItemPrice['price'], slot = 2 },
},
}
TriggerServerEvent("inventory:server:OpenInventory", "shop", shop, ShopItems)
end
end
function OpenTrackerMenu(gpsdata)
local addedVehicles = {}
TriggerServerCallback(Config.Eventprefix..':server:GetPlayerIdentifier', function(PlayerIdentifier)
lib.registerContext({
id = 'vehiclekeys_gps_menu',
title = Lang('VEHICLEKEYS_TRACKER_MENU_TITLE'),
options = (function()
local options = {}
for _, v in ipairs(gpsdata) do
if v.Player == PlayerIdentifier and not addedVehicles[v.plate] then
table.insert(options, {
title = v.model,
description = string.format(Lang('VEHICLEKEYS_TRACKER_MENU_DESC'), v.plate),
icon = 'car',
onSelect = function() TriggerEvent(Config.Eventprefix..':client:LocateVehicleWithPlate', v.plate) end
})
addedVehicles[v.plate] = true
end
end
if #options == 0 then
table.insert(options, { title = Lang('VEHICLEKEYS_TRACKER_NO_VEHICLES'), disabled = true })
end
return options
end)()
})
lib.showContext('vehiclekeys_gps_menu')
end)
end

View File

@@ -0,0 +1,260 @@
if Config.MenuType ~= 'ox_lib' then
return
end
if Config.Framework == 'esx' then
return
end
if Config.InventoryScript == 'qs' then
function GetPlateFromItem(item)
return item.info and item.info.plate or nil
end
function GetModelFromItem(item)
return item.info and item.info.description or nil
end
elseif Config.InventoryScript == 'ox' then
function GetPlateFromItem(item)
local plate = item.metadata and item.metadata.plate or nil
return plate
end
function GetModelFromItem(item)
local model = item.metadata and item.metadata.model or nil
return model
end
elseif Config.InventoryScript == 'qb' then
function GetPlateFromItem(item)
return item.info and item.info.plate or nil
end
function GetModelFromItem(item)
return item.info and item.info.description or nil
end
elseif Config.InventoryScript == 'codem' then
function GetPlateFromItem(item)
return item.info and item.info.plate or nil
end
function GetModelFromItem(item)
return item.info and item.info[1] and item.info[1].description or nil
end
elseif Config.InventoryScript == 'core_inventory' then
function GetPlateFromItem(item)
return item.info and item.info.plate or nil
end
function GetModelFromItem(item)
return item.info and item.info.description or nil
end
else
-- Handle other cases or provide a default implementation
function GetPlateFromItem(item)
return nil
end
function GetModelFromItem(item)
return nil
end
end
function OpenCopyKeys()
local elements = {}
local vehicleMenu = {
{
title = Lang("VEHICLEKEYS_MENU_OWNED_VEHICLES") .. ' - $' .. Config.CopyKeysCost,
icon = 'car',
onSelect = function(args)
OpenVehicleKeysMenu()
end,
},
{
title = Lang("VEHICLEKEYS_MENU_OWNED_KEYS") .. ' - $' .. Config.InventoryCopyKeysCost,
icon = 'key',
onSelect = function(args)
OpenOwnedKeysMenu()
end,
},
}
lib.registerContext({
id = 'VEHICLEKEYS_MENU_CHOICE',
title = Lang("VEHICLEKEYS_MENU_CHOICE_TITLE"),
options = vehicleMenu,
})
lib.showContext('VEHICLEKEYS_MENU_CHOICE')
end
function OpenVehicleKeysMenu()
local elements = {}
TriggerServerCallback(Config.Eventprefix..':server:getVehicles', function(vehicles)
if not vehicles or #vehicles == 0 then
print('No vehicles received from server callback')
return
end
print(json.encode(vehicles))
for _, v in pairs(vehicles) do
local vehicleData = QBCore.Shared.Vehicles[v.vehicle]
local vehicleName = vehicleData and vehicleData['name']
if not v.vehicle then
print('Missing vehicle information:', v.vehicle)
elseif not v.plate then
print('Missing plate information for vehicle:', v.vehicle)
elseif not vehicleName then
print('Missing vehicle details:', v.vehicle, 'QBShared:', vehicleData or 'nil')
else
table.insert(elements, {
title = Lang("VEHICLEKEYS_MENU_MODEL").." " .. vehicleName .. ", ".. Lang("VEHICLEKEYS_MENU_PLATE").." " .. v.plate,
icon = 'car',
onSelect = function(args)
clonekey(v.plate, vehicleData['model'], true, Config.CopyKeysCost)
end,
})
end
end
table.insert(elements, {
title = Lang("BACK_TO_PREVIOUS_MENU"),
icon = 'arrow-left',
onSelect = function(args)
OpenCopyKeys()
end,
})
if #elements > 0 then
lib.registerContext({
id = 'VEHICLEKEYS_MENU_TITLE',
title = Lang("VEHICLEKEYS_MENU_TITLE"),
options = elements,
})
lib.showContext('VEHICLEKEYS_MENU_TITLE')
else
print('No valid vehicles to display in the menu')
end
end)
end
function OpenOwnedKeysMenu()
local elements = {}
TriggerServerCallback(Config.Eventprefix .. ':server:GetPlayerItems', function(items)
if items then
local keysFound = false
for _, item in pairs(items) do
local plate = GetPlateFromItem(item)
local model = GetModelFromItem(item)
if plate and model then
keysFound = true
table.insert(elements, {
title = Lang("VEHICLEKEYS_MENU_MODEL").." " .. model .. ", ".. Lang("VEHICLEKEYS_MENU_PLATE").." " .. plate,
icon = 'key',
onSelect = function(args)
clonekey(plate, model, true, Config.InventoryCopyKeysCost)
end,
})
end
end
if not keysFound then
table.insert(elements, {
title = Lang("NO_KEYS_FOUND"),
icon = 'exclamation-circle',
disabled = true,
})
end
end
table.insert(elements, {
title = Lang("BACK_TO_PREVIOUS_MENU"),
icon = 'arrow-left',
onSelect = function(args)
OpenCopyKeys()
end,
})
lib.registerContext({
id = 'VEHICLEKEYS_MENU_TITLE',
title = Lang("VEHICLEKEYS_MENU_TITLE"),
options = elements,
})
lib.showContext('VEHICLEKEYS_MENU_TITLE')
end)
end
function OpenPlateMenu()
if Config.PlateType == 'menu' then
local elements = {}
table.insert(elements, {
title = Lang('VEHICLEKEYS_MENU_BUY_PLATE_DESCRIPTION') .. ' - $' .. Config.PlatePrice['price'],
icon = 'car',
onSelect = function(args)
TriggerEvent(Config.Eventprefix .. ':buyPlate')
end,
})
table.insert(elements, {
title = Lang('VEHICLEKEYS_MENU_BUY_CHANGEPLATE_DESCRIPTION') .. ' - $' .. Config.ChangePlateItemPrice['price'],
icon = 'screwdriver',
onSelect = function(args)
TriggerEvent(Config.Eventprefix .. ':buyScrewdriver')
end,
})
lib.registerContext({
id = 'VEHICLEKEYS_MENU_TITLE_PLATE',
title = Lang('VEHICLEKEYS_MENU_TITLE_PLATE'),
options = elements,
})
lib.showContext('VEHICLEKEYS_MENU_TITLE_PLATE')
end
if Config.PlateType == 'shop' then
local generatePlate = GeneratePlate()
local plate = {
plate = generatePlate,
}
local shop = Lang('VEHICLEKEYS_PLATE_SHOP_NAME')
local ShopItems = {
label = Lang('VEHICLEKEYS_PLATE_SHOP_LABEL'),
items = {
{name = Config.PlateItem ,amount = 1, price = Config.PlatePrice['price'], slot= 1, info = plate },
{name = Config.ChangePlateItem, amount = 1, price = Config.ChangePlateItemPrice['price'], slot = 2 },
},
}
TriggerServerEvent("inventory:server:OpenInventory", "shop", shop, ShopItems)
end
end
function OpenTrackerMenu(gpsdata)
local addedVehicles = {}
TriggerServerCallback(Config.Eventprefix..':server:GetPlayerIdentifier', function(PlayerIdentifier)
lib.registerContext({
id = 'vehiclekeys_gps_menu',
title = Lang('VEHICLEKEYS_TRACKER_MENU_TITLE'),
options = (function()
local options = {}
for _, v in ipairs(gpsdata) do
if v.Player == PlayerIdentifier and not addedVehicles[v.plate] then
table.insert(options, {
title = v.model,
description = string.format(Lang('VEHICLEKEYS_TRACKER_MENU_DESC'), v.plate),
icon = 'car',
onSelect = function() TriggerEvent(Config.Eventprefix..':client:LocateVehicleWithPlate', v.plate) end
})
addedVehicles[v.plate] = true
end
end
if #options == 0 then
table.insert(options, { title = Lang('VEHICLEKEYS_TRACKER_NO_VEHICLES'), disabled = true })
end
return options
end)()
})
lib.showContext('vehiclekeys_gps_menu')
end)
end

View File

@@ -0,0 +1,306 @@
if Config.MenuType ~= 'qb' then
return
end
if Config.Framework == 'esx' then
return
end
if Config.InventoryScript == 'qs' then
function GetPlateFromItem(item)
return item.info and item.info.plate or nil
end
function GetModelFromItem(item)
return item.info and item.info.description or nil
end
elseif Config.InventoryScript == 'ox' then
function GetPlateFromItem(item)
local plate = item.metadata and item.metadata.plate or nil
return plate
end
function GetModelFromItem(item)
local model = item.metadata and item.metadata.model or nil
return model
end
elseif Config.InventoryScript == 'qb' then
function GetPlateFromItem(item)
return item.info and item.info.plate or nil
end
function GetModelFromItem(item)
return item.info and item.info.description or nil
end
elseif Config.InventoryScript == 'codem' then
function GetPlateFromItem(item)
return item.info and item.info.plate or nil
end
function GetModelFromItem(item)
return item.info and item.info[1] and item.info[1].description or nil
end
elseif Config.InventoryScript == 'core_inventory' then
function GetPlateFromItem(item)
return item.info and item.info.plate or nil
end
function GetModelFromItem(item)
return item.info and item.info.description or nil
end
else
-- Handle other cases or provide a default implementation
function GetPlateFromItem(item)
return nil
end
function GetModelFromItem(item)
return nil
end
end
function OpenCopyKeys()
local elements = {}
-- Ensure Config is defined and has the expected properties
if not Config or not Config.MenuType or not Config.CopyKeysCost or not Config.InventoryCopyKeysCost then
print("Error: Config is not properly defined.")
return
end
-- Add the menu header
table.insert(elements, {
header = Lang("VEHICLEKEYS_MENU_CHOICE_TITLE"),
icon = 'fa-solid fa-infinity',
isMenuHeader = true,
})
-- Add menu options
table.insert(elements, {
header = Lang("VEHICLEKEYS_MENU_OWNED_VEHICLES") .. ' - $' .. Config.CopyKeysCost,
icon = 'car',
params = {
isAction = true,
event = OpenVehicleKeysMenu, -- Reference to the function without ()
args = {}
}
})
table.insert(elements, {
header = Lang("VEHICLEKEYS_MENU_OWNED_KEYS") .. ' - $' .. Config.InventoryCopyKeysCost,
icon = 'key',
params = {
isAction = true,
event = OpenOwnedKeysMenu, -- Reference to the function without ()
args = {}
}
})
-- Ensure 'qb-menu' is set correctly
if not exports['qb-menu'] then
print("Error: qb-menu resource not found.")
return
end
exports['qb-menu']:openMenu(elements)
end
function OpenVehicleKeysMenu()
local elements = {}
TriggerServerCallback(Config.Eventprefix..':server:getVehicles', function(vehicles)
table.insert(elements, {
isMenuHeader = true,
header = Lang("VEHICLEKEYS_MENU_TITLE"),
icon = 'fa-solid fa-infinity'
})
for k,v in pairs(vehicles) do -- loop through our table
if not v.vehicle then
return print('Missing vehicle:', v.vehicle)
elseif not v.plate then
return print('Missing plate:', v.plate, ' Vehicle:', v.vehicle)
end
if not QBCore.Shared.Vehicles or not QBCore.Shared.Vehicles[v.vehicle] or not QBCore.Shared.Vehicles[v.vehicle]['name'] then
return print('Missing vehicle details:', v.vehicle, 'QBShared : ', QBCore.Shared.Vehicles[v.vehicle] and QBCore.Shared.Vehicles[v.vehicle]['name'] or 'nil')
end
table.insert(elements, {
header = Lang("VEHICLEKEYS_MENU_MODEL").." " .. QBCore.Shared.Vehicles[v.vehicle]['name'] .. " ",
txt = Lang("VEHICLEKEYS_MENU_PLATE").." " .. v.plate,
icon = 'fa-solid fa-face-grin-tears',
params = {
isAction = true,
event = function()
clonekey(v.plate, QBCore.Shared.Vehicles[v.vehicle]['model'], true, Config.CopyKeysCost)
end,
args = {}
}
})
table.insert(elements, {
header = Lang("BACK_TO_PREVIOUS_MENU"),
icon = 'arrow-left',
params = {
isAction = true,
event = OpenCopyKeys,
args = {}
}
})
end
exports[qb_menu_name]:openMenu(elements) -- open our menu
end)
end
function OpenOwnedKeysMenu()
local elements = {}
TriggerServerCallback(Config.Eventprefix .. ':server:GetPlayerItems', function(items)
if items and next(items) ~= nil then -- Check if items is not empty
local keysFound = false
for _, item in pairs(items) do
local plate = GetPlateFromItem(item)
local model = GetModelFromItem(item)
if plate and model then
keysFound = true
table.insert(elements, {
header = Lang("VEHICLEKEYS_MENU_MODEL").." " .. model .. " ",
txt = Lang("VEHICLEKEYS_MENU_PLATE").." " .. plate,
icon = 'fa-solid fa-face-grin-tears',
params = {
isAction = true,
event = function()
clonekey(plate, model, true, Config.InventoryCopyKeysCost)
end,
args = {}
}
})
end
end
if not keysFound then
table.insert(elements, {
header = Lang("NO_KEYS_FOUND"),
icon = 'exclamation-circle',
disabled = true,
})
end
else
table.insert(elements, {
header = Lang("NO_KEYS_FOUND"),
icon = 'exclamation-circle',
disabled = true,
})
end
table.insert(elements, {
header = Lang("BACK_TO_PREVIOUS_MENU"),
icon = 'arrow-left',
params = {
isAction = true,
event = OpenCopyKeys,
args = {}
}
})
-- Adapt the following lines for qb-menu
exports['qb-menu']:openMenu(elements) -- open our menu
end)
end
function OpenPlateMenu()
if Config.PlateType == 'menu' then
local elements = {}
table.insert(elements, {
isHeader = true,
header = Lang("VEHICLEKEYS_MENU_TITLE_PLATE"),
icon = 'fa-solid fa-toolbox',
isMenuHeader = true,
})
table.insert(elements, {
header = Lang("VEHICLEKEYS_MENU_BUY_PLATE"),
txt = Lang("VEHICLEKEYS_MENU_BUY_PLATE_DESCRIPTION")..Config.PlatePrice['price'],
icon = 'fa-solid fa-face-grin-tears',
params = {
event = Config.Eventprefix..':buyPlate',
}
})
table.insert(elements, {
header = Lang("VEHICLEKEYS_MENU_BUY_SCREWDRIVER"),
txt = Lang('VEHICLEKEYS_MENU_BUY_CHANGEPLATE_DESCRIPTION') .. Config.ChangePlateItemPrice['price'],
icon = 'fa-solid fa-screwdriver',
params = {
event = Config.Eventprefix..':buyScrewdriver',
}
})
exports[qb_menu_name]:openMenu(elements)
end
if Config.PlateType == 'shop' then
local generatePlate = GeneratePlate()
local plate = {
plate = generatePlate,
}
local shop = Lang('VEHICLEKEYS_PLATE_SHOP_NAME')
local ShopItems = {
label = Lang('VEHICLEKEYS_PLATE_SHOP_LABEL'),
items = {
{name = Config.PlateItem ,amount = 1, price = Config.PlatePrice['price'], slot= 1, info = plate },
{name = Config.ChangePlateItem, amount = 1, price = Config.ChangePlateItemPrice['price'], slot = 2 },
},
}
TriggerServerEvent("inventory:server:OpenInventory", "shop", shop, ShopItems)
end
end
function OpenTrackerMenu(gpsdata)
local addedVehicles = {}
TriggerServerCallback(Config.Eventprefix..':server:GetPlayerIdentifier', function(PlayerIdentifier)
local elements = {}
for _, v in ipairs(gpsdata) do
if v.Player == PlayerIdentifier and not addedVehicles[v.plate] then
table.insert(elements, {
header = string.format(Lang('VEHICLEKEYS_TRACKER_MENU_DESC'), v.plate),
txt = v.model,
icon = 'car',
params = {
isAction = true,
event = function()
TriggerEvent(Config.Eventprefix..':client:LocateVehicleWithPlate', v.plate)
end,
args = {}
}
})
addedVehicles[v.plate] = true
end
end
if #elements == 0 then
table.insert(elements, {
header = Lang('VEHICLEKEYS_TRACKER_NO_VEHICLES'),
icon = 'exclamation-circle',
disabled = true,
})
end
table.insert(elements, {
header = Lang('BACK_TO_PREVIOUS_MENU'),
icon = 'arrow-left',
params = {
isAction = true,
event = OpenPreviousMenu, -- Cambiar a la función para regresar al menú anterior
args = {}
}
})
-- Open the menu using qb-menu
exports['qb-menu']:openMenu(elements) -- Abre el menú
end)
end

View File

@@ -0,0 +1,58 @@
if Config.HotKeys then
CreateThread(function()
while true do
if IsControlJustPressed(0, Config.Controls.UseKey) then
UseCommandKey()
end
Wait(0)
end
end)
end
RegisterCommand('usekey', function()
UseCommandKey()
end, false)
-- if Config.HotKeys then
-- if not Config.ControlerSupport then
-- lib.addKeybind({
-- name = 'engine',
-- description = Lang('VEHICLEKEYS_ENGINE_TOGGLE'),
-- defaultKey = Config.Controls.EngineControl,
-- onPressed = function()
-- toggleEngine()
-- end
-- })
-- end
-- lib.addKeybind({
-- name = 'usekey',
-- description = Lang('VEHICLEKEYS_USE_KEY'),
-- defaultKey = Config.Controls.UseKey,
-- onPressed = function()
-- UseCommandKey()
-- end
-- })
-- RegisterKeyMapping('hotwire', Lang('VEHICLEKEYS_HOTWIRE'), 'keyboard', Config.Controls.HotwireControl)
-- if Config.AnchorKeybind then
-- lib.addKeybind({
-- name = 'anchor',
-- description = Lang('VEHICLEKEYS_ANCHOR_BOAT'),
-- defaultKey = '',
-- onPressed = function()
-- ExecuteCommand('anchor')
-- end
-- })
-- end
-- end
-- RegisterCommand('usekey', function()
-- UseCommandKey()
-- end, false)
-- RegisterCommand('hotwire', function()
-- HandleHotwireProcess()
-- end, false)

View File

@@ -0,0 +1,379 @@
-- Check if Context Menu is enabled in the configuration
if not Config.Context then return end
function OpenMainMenu()
local elements = {}
table.insert(elements, {
title = Lang("VEHICLEKEYS_MENU_CLEAN_KEYS_TITLE"),
description = Lang("VEHICLEKEYS_MENU_CLEAN_KEYS_DESCRIPTION"),
icon = 'wrench',
onSelect = function(args)
CleanVehicleKeys()
end,
})
table.insert(elements, {
title = Lang("VEHICLEKEYS_MENU_ACCESS_ALL_KEYS_TITLE"),
description = Lang("VEHICLEKEYS_MENU_ACCESS_ALL_KEYS_DESCRIPTION"),
icon = 'key',
onSelect = function(args)
OpenAllKeysMenu()
end,
})
lib.registerContext({
id = 'MAIN_MENU_TITLE',
title = Lang("VEHICLEKEYS_MAIN_MENU_TITLE"),
options = elements,
})
lib.showContext('MAIN_MENU_TITLE')
end
function OpenAllKeysMenu()
local elements = {}
local function AddKeyToAllKeysMenu(title, plate, model)
table.insert(elements, {
title = title,
icon = 'key',
onSelect = function(args)
CreateKeyMenuItem(title, plate, model)
end,
})
end
TriggerServerCallback(Config.Eventprefix .. ':server:GetPlayerItems', function(items)
if items then
local keysFound = false
for _, item in pairs(items) do
local plate = GetPlateFromItem(item)
local model = GetModelFromItem(item)
if plate and model then
keysFound = true
AddKeyToAllKeysMenu(Lang("VEHICLEKEYS_MENU_MODEL").." " .. model .. ", ".. Lang("VEHICLEKEYS_MENU_PLATE").." " .. plate, plate, model)
end
end
if not keysFound then
table.insert(elements, {
title = Lang("NO_KEYS_FOUND"),
icon = 'exclamation-circle',
disabled = true,
})
end
end
table.insert(elements, {
title = Lang("BACK_TO_PREVIOUS_MENU"),
icon = 'arrow-left',
onSelect = function(args)
OpenMainMenu()
end,
})
lib.registerContext({
id = 'ALL_KEYS_MENU',
title = Lang("VEHICLEKEYS_ALL_KEYS_MENU_TITLE"),
options = elements,
})
lib.showContext('ALL_KEYS_MENU')
end)
end
function CreateKeyMenuItem(title, plate, model)
lib.registerContext({
id = 'keysactions',
title = 'Actions',
options = {
{
title = Lang("VEHICLEKEYS_MENU_KEY_MENU_HEADER"),
icon = "info",
disabled = true,
description = Lang("VEHICLEKEYS_MENU_KEY_MENU_MODEL") .. " " .. model .. " " ..
Lang("VEHICLEKEYS_MENU_KEY_MENU_PLATE") .. " " .. plate
},
{
title = Lang("VEHICLEKEYS_MENU_USE_KEY_TITLE"),
description = Lang("VEHICLEKEYS_MENU_USE_KEY_DESCRIPTION"),
icon = "check",
metadata = {
{ label = 'Action', value = Lang("VEHICLEKEYS_MENU_USE_KEY_DESCRIPTION") },
},
onSelect = function(args)
handleDoorLock(plate, model)
end
},
{
title = Lang("VEHICLEKEYS_MENU_GIVE_KEY_TITLE"),
icon = "handshake",
description = Lang("VEHICLEKEYS_MENU_GIVE_KEY_DESCRIPTION"),
metadata = {
{ label = 'Action', value = Lang("VEHICLEKEYS_MENU_GIVE_KEY_DESCRIPTION") },
},
onSelect = function(args)
ShowNearbyPlayersMenu(plate, model)
end
},
{
title = Lang("VEHICLEKEYS_MENU_TRASH_KEY_TITLE"),
icon = "trash",
description = Lang("VEHICLEKEYS_MENU_TRASH_KEY_DESCRIPTION"),
metadata = {
{ label = 'Action', value = Lang("VEHICLEKEYS_MENU_TRASH_KEY_DESCRIPTION") },
},
onSelect = function(args)
exports['qs-vehiclekeys']:RemoveKeys(plate, model)
end
},
{
title = Lang("BACK_TO_PREVIOUS_MENU"),
icon = "arrow-left",
onSelect = function(args)
OpenAllKeysMenu()
end
},
}
})
lib.showContext('keysactions')
end
function getClosestVehicle(coords, maxDistance, includePlayerVehicle)
return lib.getClosestVehicle(coords, maxDistance, includePlayerVehicle)
end
function handleDoorLock(plate, model)
local coords = GetEntityCoords(PlayerPedId())
local vehicle, _ = getClosestVehicle(coords, 5.0, true)
if vehicle then
local vehiclePlate = GetVehicleNumberPlateText(vehicle)
local vehicleModel = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle))
if vehiclePlate == plate and vehicleModel == model then
local hasKey = exports['qs-vehiclekeys']:GetKey(plate)
if hasKey then
exports["qs-vehiclekeys"]:DoorLogic(vehicle)
for door = 0, 5 do
SetVehicleDoorShut(vehicle, door, false, false)
end
else
SendTextMessage(Lang('VEHICLEKEYS_NOTIFICATION_NO_KEYS'), 'error')
end
else
SendTextMessage(Lang('VEHICLEKEYS_NOTIFICATION_NO_MATCH'), 'error')
end
else
SendTextMessage(Lang('VEHICLEKEYS_NOTIFICATION_NO_VEHICLES'), 'error')
end
end
function GetPlayersInRadius(x, y, z, radius)
local currentPlayerId = GetPlayerServerId(PlayerId())
local players = ""
for i = 0, 255 do
if NetworkIsPlayerActive(i) then
local playerPed = GetPlayerPed(i)
local playerCoords = GetEntityCoords(playerPed, false)
local distance = GetDistanceBetweenCoords(x, y, z, playerCoords, true)
local playerId = GetPlayerServerId(i)
if distance <= radius and playerId ~= currentPlayerId then
if players == "" then
players = tostring(playerId)
else
players = players .. "," .. tostring(playerId)
end
end
end
end
return players
end
function ShowNearbyPlayersMenu(plate, model)
local playerPed = GetPlayerPed(-1) -- Get the player's ped
local x, y, z = table.unpack(GetEntityCoords(playerPed, false))
local nearbyPlayers = GetPlayersInRadius(x, y, z, 2.0)
local elements = {}
if #nearbyPlayers == 0 then
table.insert(elements, {
title = Lang("VEHICLEKEYS_NO_PLAYERS_FOUND"),
icon = 'exclamation-circle',
disabled = true,
})
else
local playerIds = {}
for playerId in nearbyPlayers:gmatch("[^,]+") do
table.insert(playerIds, playerId)
end
for _, playerId in ipairs(playerIds) do
table.insert(elements, {
title = playerId,
icon = 'user',
onSelect = function()
CheckAndGiveKey(plate, model, playerId)
end
})
end
end
table.insert(elements, {
title = Lang("BACK_TO_PREVIOUS_MENU"),
icon = 'arrow-left',
onSelect = function(args)
CreateKeyMenuItem(title, plate, model)
end,
})
lib.registerContext({
id = 'vehiclekeys_nearby_players',
title = Lang("VEHICLEKEYS_NEARBY_PLAYERS_MENU_TITLE"),
options = elements
})
lib.showContext('vehiclekeys_nearby_players')
end
function CleanVehicleKeys()
if Config.Framework == "esx" then
-- ESX Framework logic
TriggerServerCallback(Config.Eventprefix .. ':server:getVehicles', function(vehicles)
if vehicles then
local ownedVehicles = {}
for _, v in pairs(vehicles) do
local hashVehicle = v.vehicle.model
local plate = v.vehicle.plate
local vehicleName = GetDisplayNameFromVehicleModel(hashVehicle)
ownedVehicles[plate] = vehicleName
end
TriggerServerCallback(Config.Eventprefix .. ':server:GetPlayerItems', function(items)
if items then
local keysRemoved = true
for _, item in pairs(items) do
local plate = GetPlateFromItem(item)
local model = GetModelFromItem(item)
if plate and model then
if not ownedVehicles[plate] or ownedVehicles[plate] ~= model then
exports['qs-vehiclekeys']:RemoveKeys(plate, model)
keysRemoved = false
end
end
end
if keysRemoved then
SendTextMessage(Lang('VEHICLEKEYS_MENU_CLEAN_KEYS_ERROR'), 'error')
else
SendTextMessage(Lang('VEHICLEKEYS_MENU_CLEAN_KEYS_SUCCESS'), 'inform')
end
else
SendTextMessage(Lang('VEHICLEKEYS_MENU_CLEAN_KEYS_ERROR'), 'error')
end
end)
end
end)
elseif Config.Framework == "qb" then
-- QBCore Framework logic
TriggerServerCallback(Config.Eventprefix .. ':server:getVehicles', function(vehicles)
if not vehicles then
print('No vehicles received from server callback')
return
end
local ownedVehicles = {}
for _, v in pairs(vehicles) do
if v.vehicle and v.plate then
local vehicleName = GetDisplayNameFromVehicleModel(v.vehicle.model)
ownedVehicles[v.plate] = vehicleName
else
print('Missing vehicle or plate information:', v.vehicle, v.plate)
end
end
TriggerServerCallback(Config.Eventprefix .. ':server:GetPlayerItems', function(items)
if items then
local keysRemoved = true
for _, item in pairs(items) do
local plate = GetPlateFromItem(item)
local model = GetModelFromItem(item)
if plate and model then
if not ownedVehicles[plate] or ownedVehicles[plate] ~= model then
exports['qs-vehiclekeys']:RemoveKeys(plate, model)
keysRemoved = false
end
end
end
if keysRemoved then
SendTextMessage(Lang('VEHICLEKEYS_MENU_CLEAN_KEYS_ERROR'), 'error')
else
SendTextMessage(Lang('VEHICLEKEYS_MENU_CLEAN_KEYS_SUCCESS'), 'inform')
end
else
SendTextMessage(Lang('VEHICLEKEYS_MENU_CLEAN_KEYS_ERROR'), 'error')
end
end)
end)
else
print("Invalid framework specified in configuration.")
end
end
function PlayGiveAnimation()
local EmoteData = {
Animation = 'givetake1_a',
Dictionary = 'mp_common',
Options = {
Duration = 2000,
Flags = {
Move = true,
},
},
}
PlayEmote(EmoteData)
end
function CheckAndGiveKey(plate, model, targetPlayerId)
PlayGiveAnimation()
exports['qs-vehiclekeys']:RemoveKeys(plate, model)
TriggerServerEvent('vehiclekeys:server:givekeyother', plate, model, targetPlayerId)
end
RegisterNetEvent('vehiclekeys:client:givekeyclient')
AddEventHandler('vehiclekeys:client:givekeyclient', function(plate, model)
PlayGiveAnimation()
exports['qs-vehiclekeys']:GiveKeys(plate, model)
end)
function PlayEmote(animationData)
local dict = animationData.Dictionary
local anim = animationData.Animation
local function LoadAnimationDict(dict, timeout)
RequestAnimDict(dict)
local startTick = GetGameTimer()
while not HasAnimDictLoaded(dict) do
Citizen.Wait(0)
if GetGameTimer() - startTick > timeout then
print("Failed to load animation dictionary: " .. dict)
return false
end
end
return true
end
local function PlayAnimation()
if not LoadAnimationDict(dict, 500) then
return
end
TaskPlayAnim(PlayerPedId(), dict, anim, 2.0, 2.0, animationData.Options.Duration, 0, 0, false, false, false)
RemoveAnimDict(dict)
end
PlayAnimation()
end
RegisterCommand("openkeys", function(source, args, rawCommand)
OpenMainMenu()
end, false)

View File

@@ -0,0 +1,58 @@
RegisterNetEvent(Config.Eventprefix .. ':client:toggleEngine', function(forcestate)
toggleEngine(forcestate)
end)
function toggleEngine(forcestate)
-- local playerPed = PlayerPedId()
-- local vehicle = GetVehiclePedIsIn(playerPed, false)
-- if not vehicle or vehicle == 0 or IsPauseMenuActive() then return end
-- local isDriver = GetPedInVehicleSeat(vehicle, -1) == playerPed
-- local hasKey = exports['qs-vehiclekeys']:GetKey(GetVehicleNumberPlateText(vehicle)) or not Config.ToggleEngineRequireKeys
-- local isJobShared = AreKeysJobShared(vehicle)
-- if not (isDriver and (hasKey or isJobShared)) then
-- return SendTextMessage(Lang('VEHICLEKEYS_NOTIFICATION_NO_PERMISSION'), 'error')
-- end
-- local engineRunning = GetIsVehicleEngineRunning(vehicle)
-- if forcestate ~= nil then
-- if Config.EngineInteriorLights then
-- SetVehicleInteriorlight(vehicle, forcestate)
-- end
-- SetVehicleEngineOn(vehicle, forcestate, false, true)
-- else
-- if engineRunning then
-- if Config.EngineInteriorLights then
-- SetVehicleInteriorlight(vehicle, false)
-- end
-- SetVehicleEngineOn(vehicle, false, false, true)
-- SendTextMessage(Lang('VEHICLEKEYS_NOTIFICATION_ENGINE_STOPPED'), 'error')
-- else
-- if Config.EngineInteriorLights then
-- SetVehicleInteriorlight(vehicle, true)
-- end
-- SetVehicleEngineOn(vehicle, true, false, true)
-- SendTextMessage(Lang('VEHICLEKEYS_NOTIFICATION_ENGINE_STARTED'), 'success')
-- end
-- end
end
-- exports('toggleEngine', toggleEngine)
function isEngineRunning(vehicle)
local playerPed = PlayerPedId()
vehicle = vehicle or GetVehiclePedIsIn(playerPed, false)
if vehicle and vehicle ~= 0 then
local engineRunning = GetIsVehicleEngineRunning(vehicle)
if engineRunning == '1' then
engineRunning = true
end
return engineRunning
else
return false
end
end
exports('isEngineRunning', isEngineRunning)

View File

@@ -0,0 +1,31 @@
exports('GiveKeysAuto', function()
GiveKeysAuto()
end)
exports('GetKeyAuto', function()
return GetKeyAuto()
end)
exports('RemoveKeysAuto', function()
RemoveKeysAuto()
end)
exports('GiveKeys', function(plate, model, bypassKeyCheck)
GiveKeys(plate, model, bypassKeyCheck)
end)
exports('RemoveKeys', function(plate, model)
RemoveKeys(plate, model)
end)
exports('GetKey', function(plate)
return GetKey(plate)
end)
exports('OpenCar', function(vehicle)
DoorLogic(vehicle)
end)
exports('CloseCar', function(vehicle)
DoorLogic(vehicle)
end)

View File

@@ -0,0 +1,53 @@
-- OX inventory
if Config.InventoryScript ~= 'ox' then
return
end
local ox_inventory = exports.ox_inventory
exports('useKey', function(data, slot)
ox_inventory:useItem(data, function(data)
if data then
TriggerEvent(Config.Eventprefix..':client:UseKey', data.metadata.plate, data.metadata.model)
end
end)
end)
exports('usePlate', function(data, slot)
ox_inventory:useItem(data, function(data)
if data then
TriggerEvent(Config.Eventprefix..':client:UsePlate', data.metadata.plate)
end
end)
end)
exports('useCarlockpick', function(data, slot)
ox_inventory:useItem(data, function(data)
if data then
useLockpick(false)
end
end)
end)
exports('useAdvancedCarlockpick', function(data, slot)
ox_inventory:useItem(data, function(data)
if data then
useLockpick(true)
end
end)
end)
exports('useVehiclegps', function(data, slot)
ox_inventory:useItem(data, function(data)
if data then
TriggerEvent(Config.Eventprefix..':client:UseGPS')
end
end)
end)
exports('useVehicletracker', function(data, slot)
ox_inventory:useItem(data, function(data)
if data then
TriggerEvent(Config.Eventprefix..':client:UseTracker')
end
end)
end)

View File

@@ -0,0 +1,307 @@
--[[
██████╗░░█████╗░██████╗░██╗░█████╗░██╗░░░░░  ███╗░░░███╗███████╗███╗░░██╗██╗░░░██╗
██╔══██╗██╔══██╗██╔══██╗██║██╔══██╗██║░░░░░  ████╗░████║██╔════╝████╗░██║██║░░░██║
██████╔╝███████║██║░░██║██║███████║██║░░░░░  ██╔████╔██║█████╗░░██╔██╗██║██║░░░██║
██╔══██╗██╔══██║██║░░██║██║██╔══██║██║░░░░░  ██║╚██╔╝██║██╔══╝░░██║╚████║██║░░░██║
██║░░██║██║░░██║██████╔╝██║██║░░██║███████╗  ██║░╚═╝░██║███████╗██║░╚███║╚██████╔╝
╚═╝░░╚═╝╚═╝░░╚═╝╚═════╝░╚═╝╚═╝░░╚═╝╚══════╝  ╚═╝░░░░░╚═╝╚══════╝╚═╝░░╚══╝░╚═════╝░
]]--
-- Check if Radial is enabled in the configuration
if not Config.Radial then return end
function GetClosestVehicle()
local playerCoords = GetEntityCoords(PlayerPedId())
local vehicles = GetGamePool("CVehicle")
local closestVehicle, closestDistance
for _, vehicle in ipairs(vehicles) do
local distance = #(playerCoords - GetEntityCoords(vehicle))^2
if not closestDistance or distance < closestDistance then
closestVehicle = vehicle
closestDistance = math.sqrt(distance)
end
end
return closestVehicle, closestDistance
end
-- CreateThread(function()
-- local radialItemAdded = false
-- lib.removeRadialItem('carkeys')
-- while true do
-- Wait(1000)
-- local maxDistance = 4.0
-- local vehicle, distance = GetClosestVehicle()
-- if vehicle and distance < maxDistance then
-- local plate = GetVehicleNumberPlateText(vehicle)
-- local hasKey = exports['qs-vehiclekeys']:GetKey(plate)
-- if hasKey and not radialItemAdded then
-- lib.addRadialItem({
-- {
-- id = 'carkeys',
-- label = Lang('VEHICLEKEYS_RADIAL_VEHICLEKEYS_LABEL'),
-- icon = "key",
-- onSelect = function()
-- exports["qs-vehiclekeys"]:DoorLogic(vehicle)
-- end
-- }
-- })
-- radialItemAdded = true
-- elseif not hasKey and radialItemAdded then
-- lib.removeRadialItem('carkeys')
-- radialItemAdded = false
-- end
-- else
-- if radialItemAdded then
-- lib.removeRadialItem('carkeys')
-- radialItemAdded = false
-- end
-- end
-- end
-- end)
--[[
█▀▀ ▄▀█ █▀█   █▀▄ █▀█ █▀█ █▀█ █▀
█▄▄ █▀█ █▀▄   █▄▀ █▄█ █▄█ █▀▄ ▄█
]]--
lib.registerRadial({
id = 'car_doors',
items = {
{
label = Lang('VEHICLEKEYS_RADIAL_REARRIGHT_LABEL'),
icon = 'car-side',
onSelect = function()
doorToggle(3)
end
},
{
label = Lang('VEHICLEKEYS_RADIAL_TRUNK_LABEL'),
icon = 'car-rear',
onSelect = function()
doorToggle(5)
end
},
{
label = Lang('VEHICLEKEYS_RADIAL_PASSENGER_LABEL'),
icon = 'car-side',
onSelect = function()
doorToggle(1)
end
},
{
label = Lang('VEHICLEKEYS_RADIAL_DRIVER_LABEL'),
icon = 'car-side',
onSelect = function()
doorToggle(0)
end
},
{
label = Lang('VEHICLEKEYS_RADIAL_HOOD_LABEL'),
icon = 'car',
onSelect = function()
doorToggle(4)
end
},
{
label = Lang('VEHICLEKEYS_RADIAL_REARLEFT_LABEL'),
icon = 'car-side',
onSelect = function()
doorToggle(2)
end
},
}
})
--[[
█▀▀ ▄▀█ █▀█   █░█░█ █ █▄░█ █▀▄ █▀█ █░█░█ █▀
█▄▄ █▀█ █▀▄   ▀▄▀▄▀ █ █░▀█ █▄▀ █▄█ ▀▄▀▄▀ ▄█
]]--
lib.registerRadial({
id = 'car_windows',
items = {
{
label = Lang('VEHICLEKEYS_RADIAL_REARRIGHT_LABEL'),
icon = 'caret-right',
onSelect = function()
windowToggle(2, 3)
end
},
{
label = Lang('VEHICLEKEYS_RADIAL_PASSENGER_LABEL'),
icon = 'caret-up',
onSelect = function()
windowToggle(1, 1)
end
},
{
label = Lang('VEHICLEKEYS_RADIAL_DRIVER_LABEL'),
icon = 'caret-up',
onSelect = function()
windowToggle(0, 0)
end
},
{
label = Lang('VEHICLEKEYS_RADIAL_REARLEFT_LABEL'),
icon = 'caret-left',
onSelect = function()
windowToggle(3, 2)
end
},
}
})
--[[
█▀▀ ▄▀█ █▀█   █▀ █▀▀ ▄▀█ ▀█▀ █▀
█▄▄ █▀█ █▀▄   ▄█ ██▄ █▀█ ░█░ ▄█
]]--
lib.registerRadial({
id = 'car_seats',
items = {
{
label = Lang('VEHICLEKEYS_RADIAL_REARRIGHT_LABEL'),
icon = 'caret-right',
onSelect = function()
changeSeat(2)
end
},
{
label = Lang('VEHICLEKEYS_RADIAL_PASSENGER_LABEL'),
icon = 'caret-up',
onSelect = function()
changeSeat(0)
end
},
{
label = Lang('VEHICLEKEYS_RADIAL_DRIVER_LABEL'),
icon = 'caret-up',
onSelect = function()
changeSeat(-1)
end
},
{
label = Lang('VEHICLEKEYS_RADIAL_REARLEFT_LABEL'),
icon = 'caret-left',
onSelect = function()
changeSeat(1)
end
},
}
})
--[[
█░█ █▀▀ █░█ █ █▀▀ █░░ █▀▀   █▀▄▀█ █▀▀ █▄░█ █░█
▀▄▀ ██▄ █▀█ █ █▄▄ █▄▄ ██▄   █░▀░█ ██▄ █░▀█ █▄█
]]--
lib.registerRadial({
id = 'vehicle_menu',
items = {
{
label = Lang('VEHICLEKEYS_RADIAL_VEHICLEENGINE_LABEL'),
icon = 'power-off',
onSelect = function()
toggleEngine()
end
},
{
label = Lang('VEHICLEKEYS_RADIAL_VEHICLEDOORS_LABEL'),
icon = 'door-closed',
menu = 'car_doors'
},
{
label = Lang('VEHICLEKEYS_RADIAL_VEHICLEWINDOWS_LABEL'),
icon = 'window-maximize',
menu = 'car_windows'
},
{
label = Lang('VEHICLEKEYS_RADIAL_VEHICLECHAIRS_LABEL'),
icon = 'chair',
menu = 'car_seats'
},
}
})
--[[
█░█ █▀▀ █░█ █ █▀▀ █░░ █▀▀   █▀▀ █░█ █▀▀ █▀▀ █▄▀
▀▄▀ ██▄ █▀█ █ █▄▄ █▄▄ ██▄   █▄▄ █▀█ ██▄ █▄▄ █░█
]]--
lib.onCache('vehicle', function(value)
if value then
lib.addRadialItem({
{
id = 'vehicle',
label = Lang('VEHICLEKEYS_RADIAL_VEHICLE_LABEL'),
icon = 'car',
menu = 'vehicle_menu'
}
})
lib.removeRadialItem('carkeys')
else
lib.removeRadialItem('vehicle')
end
end)
--[[
█▀▀ █░█ █▄░█ █▀▀ ▀█▀ █ █▀█ █▄░█   █▀▄ █▀█ █▀█ █▀█ ▀█▀ █▀█ █▀▀ █▀▀ █░░ █▀▀
█▀░ █▄█ █░▀█ █▄▄ ░█░ █ █▄█ █░▀█   █▄▀ █▄█ █▄█ █▀▄ ░█░ █▄█ █▄█ █▄█ █▄▄ ██▄
]]--
function doorToggle(door)
if GetVehicleDoorAngleRatio(cache.vehicle, door) > 0.0 then
SetVehicleDoorShut(cache.vehicle, door, false, false)
else
SetVehicleDoorOpen(cache.vehicle, door, false, false)
end
end
--[[
█▀▀ █░█ █▄░█ █▀▀ ▀█▀ █ █▀█ █▄░█   █▀▀ █░█ ▄▀█ █▄░█ █▀▀ █▀▀ █▀ █▀▀ ▄▀█ ▀█▀
█▀░ █▄█ █░▀█ █▄▄ ░█░ █ █▄█ █░▀█   █▄▄ █▀█ █▀█ █░▀█ █▄█ ██▄ ▄█ ██▄ █▀█ ░█░
]]--
function changeSeat(seat)
if IsVehicleSeatFree(cache.vehicle, seat) then
lib.progressCircle({
duration = 1000,
position = 'bottom',
label = Lang("VEHICLEKEYS_RADIAL_CHANGE_SEAT_PROGRESS"),
useWhileDead = false,
canCancel = true,
disable = { car = true },
anim = {
dict = 'anim@veh@low@vigilante@front_ps@enter_exit',
clip = 'shuffle_seat',
flag = 16
},
})
SetPedIntoVehicle(cache.ped, cache.vehicle, seat)
end
end
--[[
█▀▀ █░█ █▄░█ █▀▀ ▀█▀ █ █▀█ █▄░█   █░█░█ █ █▄░█ █▀▄ █▀█ █░█░█ ▀█▀ █▀█ █▀▀ █▀▀ █░░ █▀▀
█▀░ █▄█ █░▀█ █▄▄ ░█░ █ █▄█ █░▀█   ▀▄▀▄▀ █ █░▀█ █▄▀ █▄█ ▀▄▀▄▀ ░█░ █▄█ █▄█ █▄█ █▄▄ ██▄
]]--
local windows = { true, true, true, true }
function windowToggle(window, door)
if GetIsDoorValid(cache.vehicle, door) and windows[window + 1] then
RollDownWindow(cache.vehicle, window)
windows[window + 1] = false
else
RollUpWindow(cache.vehicle, window)
windows[window + 1] = true
end
end

View File

@@ -0,0 +1,23 @@
if Config.Smartphone ~= 'lb-phone' then
return
end
function GetBattery()
return exports["lb-phone"]:GetBattery()
end
function SetBattery(battery)
exports["lb-phone"]:SetBattery(battery)
end
function ToggleCharging(bool)
exports["lb-phone"]:ToggleCharging(bool)
end
function IsPhoneDead()
return exports["lb-phone"]:IsPhoneDead()
end
function IsCharging()
return exports["lb-phone"]:IsCharging()
end

View File

@@ -0,0 +1,23 @@
if Config.Smartphone ~= 'qs-smartphone' then
return
end
function GetBattery()
return exports["qs-smartphone"]:getBattery()
end
function SetBattery(battery)
end
function ToggleCharging(bool)
end
function IsPhoneDead()
end
function IsCharging()
end