From c50fb7209ca58e2f95b4c432f51ea1f77d96267f Mon Sep 17 00:00:00 2001 From: Nordi98 Date: Wed, 6 Aug 2025 13:29:54 +0200 Subject: [PATCH] ed --- .../client/vehicleadmin_integration.lua | 56 +++++++++++++ .../[carscripts]/nordi_car_admin/client.lua | 15 ++-- .../nordi_car_admin/fxmanifest.lua | 3 +- .../[carscripts]/nordi_car_admin/server.lua | 81 ++++++++++++++++--- 4 files changed, 136 insertions(+), 19 deletions(-) create mode 100644 resources/[carscripts]/mh_garage/client/vehicleadmin_integration.lua diff --git a/resources/[carscripts]/mh_garage/client/vehicleadmin_integration.lua b/resources/[carscripts]/mh_garage/client/vehicleadmin_integration.lua new file mode 100644 index 000000000..8ee6bf6b7 --- /dev/null +++ b/resources/[carscripts]/mh_garage/client/vehicleadmin_integration.lua @@ -0,0 +1,56 @@ +-- vehicleadmin_integration.lua +-- Diese Datei integriert das Fahrzeugadmin-System mit dem Garagensystem + +-- Füge einen Menüpunkt für das Fahrzeugadmin-System zum NPC-Menü hinzu +local function AddVehicleAdminOption() + -- Prüfe, ob der Spieler die Berechtigung hat + QBCore.Functions.TriggerCallback('vehicleadmin:getPlayerJob', function(jobData) + if jobData and jobData.hasPermission then + -- Füge den Menüpunkt zum NPC hinzu, wenn der Spieler berechtigt ist + if npcHandle and DoesEntityExist(npcHandle) then + exports['qb-target']:AddTargetEntity(npcHandle, { + options = { + { + type = "client", + event = "vehicleadmin:openMenu", + icon = "fas fa-car-mechanic", + label = "Fahrzeugverwaltung", + } + }, + distance = 2.5 + }) + end + end + end) +end + +-- Überschreibe die AddTargetOptions-Funktion, um unsere Option hinzuzufügen +local originalAddTargetOptions = AddTargetOptions +if originalAddTargetOptions then + AddTargetOptions = function() + originalAddTargetOptions() + AddVehicleAdminOption() + end +end + +-- Registriere einen Event-Handler für das Hinzufügen der Target-Optionen +RegisterNetEvent('mh_garage:targetOptionsAdded') +AddEventHandler('mh_garage:targetOptionsAdded', function() + AddVehicleAdminOption() +end) + +-- Füge einen Event-Handler hinzu, der nach dem Spawnen des NPCs ausgeführt wird +RegisterNetEvent('mh_garage:npcSpawned') +AddEventHandler('mh_garage:npcSpawned', function() + Wait(500) -- Warte kurz, damit der NPC vollständig gespawnt ist + AddVehicleAdminOption() +end) + +-- Füge einen Hook in die SpawnGuardNPC-Funktion ein, um unseren Event auszulösen +local originalSpawnGuardNPC = SpawnGuardNPC +if originalSpawnGuardNPC then + SpawnGuardNPC = function(npc) + originalSpawnGuardNPC(npc) + TriggerEvent('mh_garage:npcSpawned') + end +end diff --git a/resources/[carscripts]/nordi_car_admin/client.lua b/resources/[carscripts]/nordi_car_admin/client.lua index 0f9e8fdb5..d0abad92d 100644 --- a/resources/[carscripts]/nordi_car_admin/client.lua +++ b/resources/[carscripts]/nordi_car_admin/client.lua @@ -89,9 +89,9 @@ local function ShowVehicleActions(vehicle, playerJob) } end - local vehicleLabel = QBCore.Shared.Vehicles[vehicle.vehicle]?.name or vehicle.vehicle + local vehicleName = vehicle.name or "Unbekanntes Fahrzeug" - local input = lib.inputDialog('Fahrzeug Aktionen - ' .. (vehicle.name or vehicleLabel) .. ' (' .. vehicle.plate .. ')', { + local input = lib.inputDialog('Fahrzeug Aktionen - ' .. vehicleName .. ' (' .. vehicle.plate .. ')', { { type = 'select', label = 'Aktion wählen (' .. playerJob.jobLabel .. ')', @@ -125,7 +125,7 @@ local function ShowVehicleActions(vehicle, playerJob) elseif action == 'delete' then local alert = lib.alertDialog({ header = 'Fahrzeug löschen', - content = 'Bist du sicher, dass du das Fahrzeug ' .. (vehicle.name or vehicleLabel) .. ' (' .. vehicle.plate .. ') von der Map löschen möchtest?', + content = 'Bist du sicher, dass du das Fahrzeug ' .. vehicleName .. ' (' .. vehicle.plate .. ') von der Map löschen möchtest?', centered = true, cancel = true }) @@ -135,7 +135,7 @@ local function ShowVehicleActions(vehicle, playerJob) elseif action == 'repair' then local alert = lib.alertDialog({ header = 'Fahrzeug reparieren', - content = 'Möchtest du das Fahrzeug ' .. (vehicle.name or vehicleLabel) .. ' (' .. vehicle.plate .. ') vollständig reparieren?', + content = 'Möchtest du das Fahrzeug ' .. vehicleName .. ' (' .. vehicle.plate .. ') vollständig reparieren?', centered = true, cancel = true }) @@ -164,12 +164,11 @@ local function ShowPlayerVehicles(citizenid, playerName, playerJob) local options = {} for i = 1, #vehicles do local vehicle = vehicles[i] - local vehicleLabel = vehicle.name or QBCore.Shared.Vehicles[vehicle.vehicle]?.name or vehicle.vehicle + local vehicleName = vehicle.name or "Unbekanntes Fahrzeug" -- Color coding based on state local icon = 'car' local iconColor = '#3b82f6' - if vehicle.state == 0 then icon = 'car-side' -- Ausgefahren iconColor = '#10b981' @@ -198,7 +197,7 @@ local function ShowPlayerVehicles(citizenid, playerName, playerJob) '\n' .. GetFuelText(fuelLevel) table.insert(options, { - title = vehicleLabel .. ' (' .. vehicle.plate .. ')', + title = vehicleName .. ' (' .. vehicle.plate .. ')', description = description, icon = icon, iconColor = iconColor, @@ -275,3 +274,5 @@ end) exports('OpenVehicleAdmin', function() ShowPlayerMenu() end) + + diff --git a/resources/[carscripts]/nordi_car_admin/fxmanifest.lua b/resources/[carscripts]/nordi_car_admin/fxmanifest.lua index 2b31be3db..4d6bd72ed 100644 --- a/resources/[carscripts]/nordi_car_admin/fxmanifest.lua +++ b/resources/[carscripts]/nordi_car_admin/fxmanifest.lua @@ -11,7 +11,8 @@ shared_scripts { } client_scripts { - 'client.lua' + 'client.lua', + 'vehicleadmin_integration.lua' } server_scripts { diff --git a/resources/[carscripts]/nordi_car_admin/server.lua b/resources/[carscripts]/nordi_car_admin/server.lua index 7fd57f516..2d9a269f1 100644 --- a/resources/[carscripts]/nordi_car_admin/server.lua +++ b/resources/[carscripts]/nordi_car_admin/server.lua @@ -49,12 +49,6 @@ local AdminConfig = { -- Versuche, die Garagen aus dem externen Config zu laden local ExternalGarages = {} -if _G.Config and _G.Config.Zonen then - ExternalGarages = _G.Config.Zonen - print("[Fahrzeugadmin] Garagen aus dem Hauptsystem geladen: " .. #ExternalGarages .. " Garagen gefunden.") -else - print("[Fahrzeugadmin] Konnte keine Garagen aus dem Hauptsystem laden, verwende Standard-Garagen.") -end -- Job Permission Check local function HasPermission(source) @@ -98,6 +92,49 @@ QBCore.Functions.CreateCallback('vehicleadmin:getPlayers', function(source, cb) end) end) +-- Funktion zum Abrufen des Fahrzeugnamens +local function GetVehicleDisplayName(model) + -- Versuche zuerst, den Namen aus QBCore zu bekommen + local vehicleData = QBCore.Shared.Vehicles[model] + if vehicleData and vehicleData.name then + return vehicleData.name + end + + -- Fallback: Versuche, den Namen aus der Fahrzeugklasse zu bekommen + local vehicleClass = GetVehicleClassFromName(model) + if vehicleClass then + local classes = { + [0] = "Kompakt", + [1] = "Limousine", + [2] = "SUV", + [3] = "Coupé", + [4] = "Muscle", + [5] = "Sport Classic", + [6] = "Sport", + [7] = "Super", + [8] = "Motorrad", + [9] = "Geländewagen", + [10] = "Industrie", + [11] = "Nutzfahrzeug", + [12] = "Van", + [13] = "Fahrrad", + [14] = "Boot", + [15] = "Hubschrauber", + [16] = "Flugzeug", + [17] = "Service", + [18] = "Notdienst", + [19] = "Militär", + [20] = "Kommerziell", + [21] = "Zug", + [22] = "Öffentlich" + } + return model .. " (" .. (classes[vehicleClass] or "Unbekannt") .. ")" + end + + -- Wenn alles fehlschlägt, gib einfach den Modellnamen zurück + return model +end + -- Get vehicles for specific player QBCore.Functions.CreateCallback('vehicleadmin:getPlayerVehicles', function(source, cb, citizenid) if not HasPermission(source) then @@ -114,6 +151,12 @@ QBCore.Functions.CreateCallback('vehicleadmin:getPlayerVehicles', function(sourc local vehicles = {} for i = 1, #result do local vehicle = result[i] + local displayName = vehicle.name + + -- Wenn kein Name gesetzt ist, versuche den Namen aus dem Modell zu bekommen + if not displayName or displayName == "" then + displayName = GetVehicleDisplayName(vehicle.vehicle) + end table.insert(vehicles, { plate = vehicle.plate or 'UNKNOWN', @@ -124,7 +167,7 @@ QBCore.Functions.CreateCallback('vehicleadmin:getPlayerVehicles', function(sourc engine = vehicle.engine or 1000, body = vehicle.body or 1000, citizenid = vehicle.citizenid, - name = vehicle.name or "Unbekanntes Fahrzeug", + name = displayName, mods = vehicle.mods or "{}" }) end @@ -141,7 +184,7 @@ QBCore.Functions.CreateCallback('vehicleadmin:getGarages', function(source, cb) local garages = {} - -- Verwende die externen Garagen, wenn verfügbar + -- Verwende die externen Garagen aus dem Garagensystem if next(ExternalGarages) ~= nil then for k, v in pairs(ExternalGarages) do table.insert(garages, { @@ -512,13 +555,29 @@ QBCore.Commands.Add('dealeradmin', 'Öffne Autohändler Fahrzeug Menu', {}, fals TriggerClientEvent('vehicleadmin:openMenu', src) end) --- Versuche, die Garagen aus dem externen Config zu laden (erneut) +-- Lade die Garagen aus dem Garagensystem Citizen.CreateThread(function() - Wait(5000) -- Warte länger, damit das Hauptsystem sicher geladen ist + Wait(1000) -- Warte kurz, damit das Hauptsystem geladen ist -- Versuche, die Garagen aus dem Hauptsystem zu laden if _G.Config and _G.Config.Zonen then - ExternalGarages = _G.Config.Zonen + for k, v in pairs(_G.Config.Zonen) do + table.insert(ExternalGarages, v) + end + print("[Fahrzeugadmin] Garagen aus dem Hauptsystem geladen: " .. #ExternalGarages .. " Garagen gefunden.") + else + print("[Fahrzeugadmin] Konnte keine Garagen aus dem Hauptsystem laden, versuche es später erneut.") + end +end) + +-- Versuche erneut, die Garagen zu laden, falls sie beim ersten Mal nicht verfügbar waren +Citizen.CreateThread(function() + Wait(5000) -- Warte länger, damit das Hauptsystem sicher geladen ist + + if #ExternalGarages == 0 and _G.Config and _G.Config.Zonen then + for k, v in pairs(_G.Config.Zonen) do + table.insert(ExternalGarages, v) + end print("[Fahrzeugadmin] Garagen aus dem Hauptsystem nachgeladen: " .. #ExternalGarages .. " Garagen gefunden.") end end)