1
0
Fork 0
forked from Simnation/Main
Main/resources/[carscripts]/nordi_car_admin/client.lua

278 lines
10 KiB
Lua
Raw Normal View History

2025-08-06 10:11:58 +02:00
local QBCore = exports['qb-core']:GetCoreObject()
-- Get vehicle state text
local function GetStateText(state)
if state == 0 then
2025-08-06 11:48:14 +02:00
return "🚗 Ausgefahren"
2025-08-06 10:11:58 +02:00
elseif state == 1 then
2025-08-06 11:48:14 +02:00
return "🏠 In Garage"
2025-08-06 10:11:58 +02:00
elseif state == 2 then
2025-08-06 11:48:14 +02:00
return "🚫 Beschlagnahmt"
2025-08-06 10:11:58 +02:00
else
2025-08-06 11:48:14 +02:00
return "❓ Unbekannt"
2025-08-06 10:11:58 +02:00
end
end
2025-08-06 11:48:14 +02:00
-- Get vehicle condition text with color coding
2025-08-06 10:11:58 +02:00
local function GetConditionText(value)
if value >= 900 then
2025-08-06 11:48:14 +02:00
return "🟢 Sehr gut (" .. math.floor(value/10) .. "%)"
2025-08-06 10:11:58 +02:00
elseif value >= 700 then
2025-08-06 11:48:14 +02:00
return "🟡 Gut (" .. math.floor(value/10) .. "%)"
2025-08-06 10:11:58 +02:00
elseif value >= 500 then
2025-08-06 11:48:14 +02:00
return "🟠 Mittelmäßig (" .. math.floor(value/10) .. "%)"
2025-08-06 10:11:58 +02:00
elseif value >= 300 then
2025-08-06 11:48:14 +02:00
return "🔴 Schlecht (" .. math.floor(value/10) .. "%)"
2025-08-06 10:11:58 +02:00
else
2025-08-06 11:48:14 +02:00
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)"
2025-08-06 10:11:58 +02:00
end
end
-- Show vehicle actions menu
2025-08-06 11:48:14 +02:00
local function ShowVehicleActions(vehicle, playerJob)
2025-08-06 10:11:58 +02:00
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
2025-08-06 11:48:14 +02:00
-- 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 = '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'},
2025-08-06 12:21:15 +02:00
{value = 'repair', label = '🔧 Reparieren'}
2025-08-06 11:48:14 +02:00
}
2025-08-06 12:23:04 +02:00
end
2025-08-06 11:48:14 +02:00
local vehicleLabel = QBCore.Shared.Vehicles[vehicle.vehicle]?.name or vehicle.vehicle
2025-08-06 12:21:15 +02:00
local input = lib.inputDialog('Fahrzeug Aktionen - ' .. (vehicle.name or vehicleLabel) .. ' (' .. vehicle.plate .. ')', {
2025-08-06 10:11:58 +02:00
{
type = 'select',
2025-08-06 11:48:14 +02:00
label = 'Aktion wählen (' .. playerJob.jobLabel .. ')',
description = 'Wähle eine Aktion für das Fahrzeug',
options = actionOptions,
2025-08-06 10:11:58 +02:00
required = true
},
{
type = 'select',
2025-08-06 11:48:14 +02:00
label = 'Garage auswählen',
2025-08-06 12:21:15 +02:00
description = 'Nur für "In Garage stellen" benötigt',
2025-08-06 10:11:58 +02:00
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
2025-08-06 11:48:14 +02:00
local alert = lib.alertDialog({
header = 'Fahrzeug löschen',
2025-08-06 12:21:15 +02:00
content = 'Bist du sicher, dass du das Fahrzeug ' .. (vehicle.name or vehicleLabel) .. ' (' .. vehicle.plate .. ') von der Map löschen möchtest?',
2025-08-06 11:48:14 +02:00
centered = true,
cancel = true
})
if alert == 'confirm' then
TriggerServerEvent('vehicleadmin:deleteFromMap', vehicle.plate)
end
2025-08-06 10:11:58 +02:00
elseif action == 'repair' then
2025-08-06 11:48:14 +02:00
local alert = lib.alertDialog({
header = 'Fahrzeug reparieren',
2025-08-06 12:21:15 +02:00
content = 'Möchtest du das Fahrzeug ' .. (vehicle.name or vehicleLabel) .. ' (' .. vehicle.plate .. ') vollständig reparieren?',
2025-08-06 11:48:14 +02:00
centered = true,
cancel = true
})
if alert == 'confirm' then
TriggerServerEvent('vehicleadmin:repairVehicle', vehicle.plate)
end
2025-08-06 10:11:58 +02:00
end
end
end)
end
-- Show vehicles for selected player
2025-08-06 11:48:14 +02:00
local function ShowPlayerVehicles(citizenid, playerName, playerJob)
2025-08-06 10:11:58 +02:00
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]
2025-08-06 12:21:15 +02:00
local vehicleLabel = vehicle.name or QBCore.Shared.Vehicles[vehicle.vehicle]?.name or vehicle.vehicle
2025-08-06 10:11:58 +02:00
2025-08-06 11:48:14 +02:00
-- 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
2025-08-06 12:21:15 +02:00
-- Parse mods if needed
local mods = {}
if type(vehicle.mods) == 'string' then
mods = json.decode(vehicle.mods) or {}
else
mods = vehicle.mods or {}
2025-08-06 11:48:14 +02:00
end
2025-08-06 12:21:15 +02:00
local engineHealth = mods.engineHealth or 1000
local bodyHealth = mods.bodyHealth or 1000
local fuelLevel = mods.fuelLevel or 100
local description = GetStateText(vehicle.state) .. ' | 🏠 ' .. (vehicle.garage or 'Keine Garage') ..
'\n🔧 Motor: ' .. GetConditionText(engineHealth) .. ' | 🚗 Karosserie: ' .. GetConditionText(bodyHealth) ..
'\n' .. GetFuelText(fuelLevel)
2025-08-06 10:11:58 +02:00
table.insert(options, {
title = vehicleLabel .. ' (' .. vehicle.plate .. ')',
2025-08-06 11:48:14 +02:00
description = description,
icon = icon,
iconColor = iconColor,
2025-08-06 10:11:58 +02:00
onSelect = function()
2025-08-06 11:48:14 +02:00
ShowVehicleActions(vehicle, playerJob)
2025-08-06 10:11:58 +02:00
end
})
end
lib.registerContext({
id = 'vehicle_list',
2025-08-06 11:48:14 +02:00
title = '🚗 Fahrzeuge von ' .. playerName,
menu = 'player_selection',
2025-08-06 10:11:58 +02:00
options = options
})
lib.showContext('vehicle_list')
end, citizenid)
end
-- Show player selection menu
local function ShowPlayerMenu()
2025-08-06 11:48:14 +02:00
QBCore.Functions.TriggerCallback('vehicleadmin:getPlayerJob', function(jobData)
if not jobData or not jobData.hasPermission then
2025-08-06 10:11:58 +02:00
lib.notify({
2025-08-06 11:48:14 +02:00
title = 'Keine Berechtigung',
description = 'Dein Job hat keine Berechtigung für dieses System',
2025-08-06 10:11:58 +02:00
type = 'error'
})
return
end
2025-08-06 11:48:14 +02:00
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
2025-08-06 10:11:58 +02:00
})
2025-08-06 11:48:14 +02:00
lib.showContext('player_selection')
end)
2025-08-06 10:11:58 +02:00
end)
end
-- Event to open main menu
RegisterNetEvent('vehicleadmin:openMenu', function()
ShowPlayerMenu()
end)
2025-08-06 11:48:14 +02:00
-- Export functions for other scripts
exports('OpenVehicleAdmin', function()
ShowPlayerMenu()
end)