From 6b4ab46e6c404c058c8a25cc2f9c84a0d9170be7 Mon Sep 17 00:00:00 2001 From: Nordi98 Date: Wed, 6 Aug 2025 12:32:28 +0200 Subject: [PATCH] ed --- .../mh_garage/client/vehicleadmin.lua | 44 +++++ .../[carscripts]/mh_garage/fxmanifest.lua | 6 +- .../mh_garage/server/vehicleadmin.lua | 181 ++++++++++++++++++ 3 files changed, 229 insertions(+), 2 deletions(-) create mode 100644 resources/[carscripts]/mh_garage/client/vehicleadmin.lua create mode 100644 resources/[carscripts]/mh_garage/server/vehicleadmin.lua diff --git a/resources/[carscripts]/mh_garage/client/vehicleadmin.lua b/resources/[carscripts]/mh_garage/client/vehicleadmin.lua new file mode 100644 index 000000000..6cf04b92d --- /dev/null +++ b/resources/[carscripts]/mh_garage/client/vehicleadmin.lua @@ -0,0 +1,44 @@ +-- vehicleadmin.lua - Füge diese Datei in deinen client-Ordner ein + +-- Füge einen Menüpunkt für das Fahrzeugadmin-System zum NPC-Menü hinzu +-- Diese Funktion wird aufgerufen, wenn der NPC-Target erstellt wird +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 + exports['qb-target']:AddTargetEntity(npcHandle, { + options = { + { + type = "client", + event = "vehicleadmin:openMenu", + icon = "fas fa-car-mechanic", + label = "Fahrzeugverwaltung", + } + }, + distance = 2.5 + }) + end + end) +end + +-- Registriere einen Event-Handler, der nach dem Hinzufügen der Standard-Target-Optionen ausgeführt wird +RegisterNetEvent('mh_garage:targetOptionsAdded') +AddEventHandler('mh_garage:targetOptionsAdded', function() + AddVehicleAdminOption() +end) + +-- Füge einen Hook in die bestehende AddTargetOptions-Funktion ein +local originalAddTargetOptions = AddTargetOptions +AddTargetOptions = function() + originalAddTargetOptions() + TriggerEvent('mh_garage:targetOptionsAdded') +end + +-- Registriere den Befehl für das Fahrzeugadmin-System +RegisterCommand('vehicleadmin', function() + TriggerEvent('vehicleadmin:openMenu') +end, false) + +-- Registriere die Tastenbelegung (optional) +RegisterKeyMapping('vehicleadmin', 'Öffne Fahrzeug Admin Menu', 'keyboard', '') diff --git a/resources/[carscripts]/mh_garage/fxmanifest.lua b/resources/[carscripts]/mh_garage/fxmanifest.lua index 704c4f1ef..c3ac963b3 100644 --- a/resources/[carscripts]/mh_garage/fxmanifest.lua +++ b/resources/[carscripts]/mh_garage/fxmanifest.lua @@ -7,11 +7,13 @@ lua54 'yes' client_scripts { '@ox_lib/init.lua', 'config/*.lua', - 'client/*.lua' + 'client/*.lua', + 'client/vehicleadmin.lua' } server_scripts { '@oxmysql/lib/MySQL.lua', 'config/*.lua', - 'server/*.lua' + 'server/*.lua', + 'server/vehicleadmin.lua' } \ No newline at end of file diff --git a/resources/[carscripts]/mh_garage/server/vehicleadmin.lua b/resources/[carscripts]/mh_garage/server/vehicleadmin.lua new file mode 100644 index 000000000..19a4355eb --- /dev/null +++ b/resources/[carscripts]/mh_garage/server/vehicleadmin.lua @@ -0,0 +1,181 @@ +-- vehicleadmin.lua - Füge diese Datei in deinen server-Ordner ein + +-- Erweitere die Log-Funktion für das Fahrzeugadmin-System +RegisterServerEvent('vehicleadmin:log') +AddEventHandler('vehicleadmin:log', function(action, plate, garage) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + + if not Player then return end + + local playerName = Player.PlayerData.charinfo.firstname .. " " .. Player.PlayerData.charinfo.lastname + local citizenid = Player.PlayerData.citizenid + local jobName = Player.PlayerData.job.name + local jobLabel = Player.PlayerData.job.label + + local logText = "" + local logColor = "blue" + + if action == "move" then + logText = playerName .. " (" .. jobLabel .. ") hat Fahrzeug " .. plate .. " in Garage " .. garage .. " gestellt." + elseif action == "delete" then + logText = playerName .. " (" .. jobLabel .. ") hat Fahrzeug " .. plate .. " von der Map gelöscht." + logColor = "orange" + elseif action == "repair" then + logText = playerName .. " (" .. jobLabel .. ") hat Fahrzeug " .. plate .. " repariert." + logColor = "green" + end + + -- Verwende die bestehende Log-Funktion + sendToDiscord("Fahrzeugadmin", logText, logColor) + + -- Speichere den Log in der Datenbank (optional) + MySQL.Async.execute('INSERT INTO admin_logs (action, player_name, citizenid, job, target_plate, target_garage, timestamp) VALUES (?, ?, ?, ?, ?, ?, NOW())', + {action, playerName, citizenid, jobName, plate, garage or "none"}) +end) + +-- Füge zusätzliche Callback-Funktionen für erweiterte Features hinzu +QBCore.Functions.CreateCallback('vehicleadmin:getVehicleHistory', function(source, cb, plate) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + + if not Player then + cb(false) + return + end + + -- Prüfe, ob der Spieler die Berechtigung hat + local hasPermission = false + local playerJob = Player.PlayerData.job.name + + if QBCore.Functions.HasPermission(src, 'admin') then + hasPermission = true + elseif playerJob == 'police' or playerJob == 'mechanic' then + hasPermission = true + end + + if not hasPermission then + cb(false) + return + end + + -- Hole den Fahrzeugverlauf aus der Datenbank + MySQL.Async.fetchAll('SELECT * FROM admin_logs WHERE target_plate = ? ORDER BY timestamp DESC LIMIT 20', {plate}, function(results) + if results and #results > 0 then + cb(results) + else + cb({}) + end + end) +end) + +-- Füge einen Event-Handler für das Löschen von Fahrzeugen hinzu +RegisterServerEvent('vehicleadmin:deleteVehicle') +AddEventHandler('vehicleadmin:deleteVehicle', function(plate) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + + if not Player then return end + + -- Prüfe, ob der Spieler die Berechtigung hat + local hasPermission = false + local playerJob = Player.PlayerData.job.name + + if QBCore.Functions.HasPermission(src, 'admin') then + hasPermission = true + elseif playerJob == 'police' or playerJob == 'mechanic' then + hasPermission = true + end + + if not hasPermission then + TriggerClientEvent('ox_lib:notify', src, { + title = 'Keine Berechtigung', + description = 'Du hast keine Berechtigung für diese Aktion', + type = 'error' + }) + return + end + + -- Lösche das Fahrzeug aus der Datenbank + MySQL.Async.execute('DELETE FROM player_vehicles WHERE plate = ?', {plate}, function(rowsChanged) + if rowsChanged > 0 then + -- Lösche auch alle zugehörigen Schlüssel + MySQL.Async.execute('DELETE FROM vehicle_keys WHERE plate = ?', {plate}) + + -- Lösche das Fahrzeug aus dem Parking-System + MySQL.Async.execute('DELETE FROM vehicle_parking WHERE plate = ?', {plate}) + + -- Log die Aktion + TriggerEvent('vehicleadmin:log', "delete_permanent", plate, nil) + + TriggerClientEvent('ox_lib:notify', src, { + title = 'Fahrzeugverwaltung', + description = 'Fahrzeug wurde permanent gelöscht', + type = 'success' + }) + else + TriggerClientEvent('ox_lib:notify', src, { + title = 'Fahrzeugverwaltung', + description = 'Fahrzeug nicht gefunden', + type = 'error' + }) + end + end) +end) + +-- Füge einen Event-Handler für das Ändern des Fahrzeugbesitzers hinzu +RegisterServerEvent('vehicleadmin:changeOwner') +AddEventHandler('vehicleadmin:changeOwner', function(plate, newOwnerCID) + local src = source + local Player = QBCore.Functions.GetPlayer(src) + + if not Player then return end + + -- Prüfe, ob der Spieler die Berechtigung hat + if not QBCore.Functions.HasPermission(src, 'admin') then + TriggerClientEvent('ox_lib:notify', src, { + title = 'Keine Berechtigung', + description = 'Nur Admins können den Besitzer ändern', + type = 'error' + }) + return + end + + -- Prüfe, ob der neue Besitzer existiert + MySQL.Async.fetchAll('SELECT * FROM players WHERE citizenid = ?', {newOwnerCID}, function(players) + if not players or #players == 0 then + TriggerClientEvent('ox_lib:notify', src, { + title = 'Fehler', + description = 'Spieler mit dieser Citizen ID nicht gefunden', + type = 'error' + }) + return + end + + -- Ändere den Besitzer des Fahrzeugs + MySQL.Async.execute('UPDATE player_vehicles SET citizenid = ? WHERE plate = ?', {newOwnerCID, plate}, function(rowsChanged) + if rowsChanged > 0 then + -- Erstelle einen neuen Schlüssel für den neuen Besitzer + MySQL.Async.execute('INSERT INTO vehicle_keys (plate, owner, count) VALUES (?, ?, 1) ON DUPLICATE KEY UPDATE count = 1', {plate, newOwnerCID}) + + -- Log die Aktion + local newOwnerInfo = json.decode(players[1].charinfo) + local newOwnerName = newOwnerInfo.firstname .. " " .. newOwnerInfo.lastname + + TriggerEvent('vehicleadmin:log', "change_owner", plate, newOwnerName) + + TriggerClientEvent('ox_lib:notify', src, { + title = 'Fahrzeugverwaltung', + description = 'Fahrzeugbesitzer wurde geändert', + type = 'success' + }) + else + TriggerClientEvent('ox_lib:notify', src, { + title = 'Fahrzeugverwaltung', + description = 'Fahrzeug nicht gefunden', + type = 'error' + }) + end + end) + end) +end)