forked from Simnation/Main
328 lines
12 KiB
Lua
328 lines
12 KiB
Lua
local QBCore = exports['qb-core']:GetCoreObject()
|
|
|
|
-- Get vehicle state text
|
|
local function GetStateText(state)
|
|
if state == 0 then
|
|
return "🚗 Ausgefahren"
|
|
elseif state == 1 then
|
|
return "🏠 In Garage"
|
|
elseif state == 2 then
|
|
return "🚫 Beschlagnahmt"
|
|
else
|
|
return "❓ Unbekannt"
|
|
end
|
|
end
|
|
|
|
-- Get vehicle condition text with color coding
|
|
local function GetConditionText(value)
|
|
if value >= 900 then
|
|
return "🟢 Sehr gut (" .. math.floor(value/10) .. "%)"
|
|
elseif value >= 700 then
|
|
return "🟡 Gut (" .. math.floor(value/10) .. "%)"
|
|
elseif value >= 500 then
|
|
return "🟠 Mittelmäßig (" .. math.floor(value/10) .. "%)"
|
|
elseif value >= 300 then
|
|
return "🔴 Schlecht (" .. math.floor(value/10) .. "%)"
|
|
else
|
|
return "💀 Sehr schlecht (" .. math.floor(value/10) .. "%)"
|
|
end
|
|
end
|
|
|
|
-- Get fuel text with color coding
|
|
local function GetFuelText(fuel)
|
|
if fuel >= 80 then
|
|
return "⛽ " .. math.floor(fuel) .. "% (Voll)"
|
|
elseif fuel >= 50 then
|
|
return "⛽ " .. math.floor(fuel) .. "% (Gut)"
|
|
elseif fuel >= 25 then
|
|
return "⛽ " .. math.floor(fuel) .. "% (Niedrig)"
|
|
else
|
|
return "⛽ " .. math.floor(fuel) .. "% (Sehr niedrig)"
|
|
end
|
|
end
|
|
|
|
-- Show vehicle actions menu
|
|
local function ShowVehicleActions(vehicle, playerJob)
|
|
QBCore.Functions.TriggerCallback('vehicleadmin:getGarages', function(garages)
|
|
if not garages then return end
|
|
|
|
local garageOptions = {}
|
|
for i = 1, #garages do
|
|
table.insert(garageOptions, {
|
|
value = garages[i].name,
|
|
label = garages[i].label
|
|
})
|
|
end
|
|
|
|
-- Different options based on job
|
|
local actionOptions = {}
|
|
|
|
if playerJob.jobName == 'police' then
|
|
actionOptions = {
|
|
{value = 'move', label = '🏠 In Garage stellen'},
|
|
{value = 'delete', label = '🗑️ Von Map löschen'},
|
|
{value = 'impound', label = '🚫 Beschlagnahmen'},
|
|
{value = 'release', label = '✅ Aus Beschlagnahme freigeben'},
|
|
{value = 'repair', label = '🔧 Reparieren'}
|
|
}
|
|
elseif playerJob.jobName == 'mechanic' then
|
|
actionOptions = {
|
|
{value = 'move', label = '🏠 In Garage stellen'},
|
|
{value = 'repair', label = '🔧 Reparieren'},
|
|
{value = 'delete', label = '🗑️ Von Map löschen'}
|
|
}
|
|
elseif playerJob.jobName == 'ambulance' then
|
|
actionOptions = {
|
|
{value = 'move', label = '🏠 In Garage stellen'},
|
|
{value = 'delete', label = '🗑️ Von Map löschen'},
|
|
{value = 'repair', label = '🔧 Reparieren (Notfall)'}
|
|
}
|
|
elseif playerJob.jobName == 'cardealer' then
|
|
actionOptions = {
|
|
{value = 'move', label = '🏠 In Garage stellen'},
|
|
{value = 'delete', label = '🗑️ Von Map löschen'},
|
|
{value = 'repair', label = '🔧 Reparieren'}
|
|
}
|
|
else -- Admin or other jobs
|
|
actionOptions = {
|
|
{value = 'move', label = '🏠 In Garage stellen'},
|
|
{value = 'delete', label = '🗑️ Von Map löschen'},
|
|
{value = 'repair', label = '🔧 Reparieren'},
|
|
{value = 'impound', label = '🚫 Beschlagnahmen'},
|
|
{value = 'release', label = '✅ Aus Beschlagnahme freigeben'}
|
|
}
|
|
end
|
|
|
|
local vehicleLabel = QBCore.Shared.Vehicles[vehicle.vehicle]?.name or vehicle.vehicle
|
|
|
|
local input = lib.inputDialog('Fahrzeug Aktionen - ' .. vehicleLabel .. ' (' .. vehicle.plate .. ')', {
|
|
{
|
|
type = 'select',
|
|
label = 'Aktion wählen (' .. playerJob.jobLabel .. ')',
|
|
description = 'Wähle eine Aktion für das Fahrzeug',
|
|
options = actionOptions,
|
|
required = true
|
|
},
|
|
{
|
|
type = 'select',
|
|
label = 'Garage auswählen',
|
|
description = 'Nur für "In Garage stellen" und "Freigeben" benötigt',
|
|
options = garageOptions,
|
|
required = false
|
|
}
|
|
})
|
|
|
|
if input then
|
|
local action = input[1]
|
|
local garage = input[2]
|
|
|
|
if action == 'move' then
|
|
if not garage then
|
|
lib.notify({
|
|
title = 'Fehler',
|
|
description = 'Bitte wähle eine Garage aus',
|
|
type = 'error'
|
|
})
|
|
return
|
|
end
|
|
TriggerServerEvent('vehicleadmin:moveToGarage', vehicle.plate, garage)
|
|
elseif action == 'delete' then
|
|
local alert = lib.alertDialog({
|
|
header = 'Fahrzeug löschen',
|
|
content = 'Bist du sicher, dass du das Fahrzeug ' .. vehicleLabel .. ' (' .. vehicle.plate .. ') von der Map löschen möchtest?',
|
|
centered = true,
|
|
cancel = true
|
|
})
|
|
if alert == 'confirm' then
|
|
TriggerServerEvent('vehicleadmin:deleteFromMap', vehicle.plate)
|
|
end
|
|
elseif action == 'repair' then
|
|
local alert = lib.alertDialog({
|
|
header = 'Fahrzeug reparieren',
|
|
content = 'Möchtest du das Fahrzeug ' .. vehicleLabel .. ' (' .. vehicle.plate .. ') vollständig reparieren?',
|
|
centered = true,
|
|
cancel = true
|
|
})
|
|
if alert == 'confirm' then
|
|
TriggerServerEvent('vehicleadmin:repairVehicle', vehicle.plate)
|
|
end
|
|
elseif action == 'impound' then
|
|
local alert = lib.alertDialog({
|
|
header = 'Fahrzeug beschlagnahmen',
|
|
content = 'Möchtest du das Fahrzeug ' .. vehicleLabel .. ' (' .. vehicle.plate .. ') beschlagnahmen? (500€ Gebühr)',
|
|
centered = true,
|
|
cancel = true
|
|
})
|
|
if alert == 'confirm' then
|
|
TriggerServerEvent('vehicleadmin:impoundVehicle', vehicle.plate)
|
|
end
|
|
elseif action == 'release' then
|
|
if not garage then
|
|
lib.notify({
|
|
title = 'Fehler',
|
|
description = 'Bitte wähle eine Garage für die Freigabe aus',
|
|
type = 'error'
|
|
})
|
|
return
|
|
end
|
|
local alert = lib.alertDialog({
|
|
header = 'Fahrzeug freigeben',
|
|
content = 'Möchtest du das Fahrzeug ' .. vehicleLabel .. ' (' .. vehicle.plate .. ') aus der Beschlagnahme freigeben?',
|
|
centered = true,
|
|
cancel = true
|
|
})
|
|
if alert == 'confirm' then
|
|
TriggerServerEvent('vehicleadmin:releaseFromImpound', vehicle.plate, garage)
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
|
|
-- Show vehicles for selected player
|
|
local function ShowPlayerVehicles(citizenid, playerName, playerJob)
|
|
QBCore.Functions.TriggerCallback('vehicleadmin:getPlayerVehicles', function(vehicles)
|
|
if not vehicles then return end
|
|
|
|
if #vehicles == 0 then
|
|
lib.notify({
|
|
title = 'Keine Fahrzeuge',
|
|
description = 'Dieser Spieler hat keine Fahrzeuge',
|
|
type = 'info'
|
|
})
|
|
return
|
|
end
|
|
|
|
local options = {}
|
|
for i = 1, #vehicles do
|
|
local vehicle = vehicles[i]
|
|
local vehicleLabel = QBCore.Shared.Vehicles[vehicle.vehicle]?.name or vehicle.vehicle
|
|
|
|
-- Color coding based on state
|
|
local icon = 'car'
|
|
local iconColor = '#3b82f6'
|
|
|
|
if vehicle.state == 0 then
|
|
icon = 'car-side' -- Ausgefahren
|
|
iconColor = '#10b981'
|
|
elseif vehicle.state == 1 then
|
|
icon = 'warehouse' -- In Garage
|
|
iconColor = '#6b7280'
|
|
elseif vehicle.state == 2 then
|
|
icon = 'ban' -- Beschlagnahmt
|
|
iconColor = '#ef4444'
|
|
end
|
|
|
|
local description = GetStateText(vehicle.state) .. ' | 🏠 ' .. (vehicle.garage or 'Keine Garage') ..
|
|
'\n🔧 Motor: ' .. GetConditionText(vehicle.engine) .. ' | 🚗 Karosserie: ' .. GetConditionText(vehicle.body) ..
|
|
'\n' .. GetFuelText(vehicle.fuel)
|
|
|
|
if vehicle.depotprice and vehicle.depotprice > 0 then
|
|
description = description .. '\n💰 Gebühr: ' .. vehicle.depotprice .. '€'
|
|
end
|
|
|
|
table.insert(options, {
|
|
title = vehicleLabel .. ' (' .. vehicle.plate .. ')',
|
|
description = description,
|
|
icon = icon,
|
|
iconColor = iconColor,
|
|
onSelect = function()
|
|
ShowVehicleActions(vehicle, playerJob)
|
|
end
|
|
})
|
|
end
|
|
|
|
lib.registerContext({
|
|
id = 'vehicle_list',
|
|
title = '🚗 Fahrzeuge von ' .. playerName,
|
|
menu = 'player_selection',
|
|
options = options
|
|
})
|
|
|
|
lib.showContext('vehicle_list')
|
|
end, citizenid)
|
|
end
|
|
|
|
-- Show player selection menu
|
|
local function ShowPlayerMenu()
|
|
QBCore.Functions.TriggerCallback('vehicleadmin:getPlayerJob', function(jobData)
|
|
if not jobData or not jobData.hasPermission then
|
|
lib.notify({
|
|
title = 'Keine Berechtigung',
|
|
description = 'Dein Job hat keine Berechtigung für dieses System',
|
|
type = 'error'
|
|
})
|
|
return
|
|
end
|
|
|
|
QBCore.Functions.TriggerCallback('vehicleadmin:getPlayers', function(players)
|
|
if not players then
|
|
lib.notify({
|
|
title = 'Fehler',
|
|
description = 'Fehler beim Laden der Spieler',
|
|
type = 'error'
|
|
})
|
|
return
|
|
end
|
|
|
|
local options = {}
|
|
for i = 1, #players do
|
|
local player = players[i]
|
|
table.insert(options, {
|
|
title = player.name,
|
|
description = '🆔 Citizen ID: ' .. player.citizenid,
|
|
icon = 'user',
|
|
iconColor = '#8b5cf6',
|
|
onSelect = function()
|
|
ShowPlayerVehicles(player.citizenid, player.name, jobData)
|
|
end
|
|
})
|
|
end
|
|
|
|
lib.registerContext({
|
|
id = 'player_selection',
|
|
title = '👥 Fahrzeugverwaltung - ' .. jobData.jobLabel,
|
|
options = options
|
|
})
|
|
|
|
lib.showContext('player_selection')
|
|
end)
|
|
end)
|
|
end
|
|
|
|
-- Event to open main menu
|
|
RegisterNetEvent('vehicleadmin:openMenu', function()
|
|
ShowPlayerMenu()
|
|
end)
|
|
|
|
-- Keybind for quick access (optional)
|
|
RegisterKeyMapping('vehicleadmin', 'Öffne Fahrzeug Admin Menu', 'keyboard', '')
|
|
|
|
-- Show help text when menu is opened
|
|
RegisterNetEvent('vehicleadmin:showHelp', function()
|
|
lib.notify({
|
|
title = 'Fahrzeugverwaltung',
|
|
description = 'Verwende /vehicleadmin oder die entsprechenden Job-Befehle um das Menu zu öffnen',
|
|
type = 'info',
|
|
duration = 5000
|
|
})
|
|
end)
|
|
|
|
-- Auto-refresh function for real-time updates
|
|
local function RefreshCurrentMenu()
|
|
-- This can be used to refresh the current menu if needed
|
|
-- Implementation depends on your specific needs
|
|
end
|
|
|
|
-- Export functions for other scripts
|
|
exports('OpenVehicleAdmin', function()
|
|
ShowPlayerMenu()
|
|
end)
|
|
|
|
exports('HasVehicleAdminPermission', function()
|
|
local hasPermission = false
|
|
QBCore.Functions.TriggerCallback('vehicleadmin:getPlayerJob', function(jobData)
|
|
hasPermission = jobData and jobData.hasPermission or false
|
|
end)
|
|
return hasPermission
|
|
end)
|