local QBCore = exports['qb-core']:GetCoreObject() -- Erlaubte Jobs für das Vehicle Admin System local AllowedJobs = { ['police'] = true, ['admin'] = true, ['mechanic'] = true, ['ambulance'] = true, ['cardealer'] = true, -- Füge hier weitere Jobs hinzu } -- Job Permission Check local function HasPermission(source) local Player = QBCore.Functions.GetPlayer(source) if not Player then return false end -- Check if player has admin permission if QBCore.Functions.HasPermission(source, 'admin') then return true end -- Check if player has allowed job local playerJob = Player.PlayerData.job.name return AllowedJobs[playerJob] == true end -- Get all players from database QBCore.Functions.CreateCallback('vehicleadmin:getPlayers', function(source, cb) if not HasPermission(source) then cb(false) return end MySQL.Async.fetchAll('SELECT citizenid, charinfo FROM players ORDER BY charinfo', {}, function(result) local players = {} for i = 1, #result do local charinfo = json.decode(result[i].charinfo) table.insert(players, { citizenid = result[i].citizenid, name = charinfo.firstname .. ' ' .. charinfo.lastname }) end cb(players) end) end) -- Get vehicles for specific player QBCore.Functions.CreateCallback('vehicleadmin:getPlayerVehicles', function(source, cb, citizenid) if not HasPermission(source) then cb(false) return end MySQL.Async.fetchAll('SELECT * FROM player_vehicles WHERE citizenid = ?', {citizenid}, function(result) local vehicles = {} for i = 1, #result do local vehicle = result[i] table.insert(vehicles, { plate = vehicle.plate, vehicle = vehicle.vehicle, garage = vehicle.garage, state = vehicle.state, fuel = vehicle.fuel, engine = vehicle.engine, body = vehicle.body, citizenid = vehicle.citizenid, depotprice = vehicle.depotprice, drivingdistance = vehicle.drivingdistance }) end cb(vehicles) end) end) -- Get all garages QBCore.Functions.CreateCallback('vehicleadmin:getGarages', function(source, cb) if not HasPermission(source) then cb(false) return end local garages = {} for garageName, garageData in pairs(QBCore.Shared.Garages) do table.insert(garages, { name = garageName, label = garageData.label or garageName }) end cb(garages) end) -- Check player's job and return permissions QBCore.Functions.CreateCallback('vehicleadmin:getPlayerJob', function(source, cb) local Player = QBCore.Functions.GetPlayer(source) if not Player then cb(false) return end local hasPermission = HasPermission(source) local jobName = Player.PlayerData.job.name local jobLabel = Player.PlayerData.job.label cb({ hasPermission = hasPermission, jobName = jobName, jobLabel = jobLabel }) end) -- Move vehicle to garage RegisterNetEvent('vehicleadmin:moveToGarage', function(plate, garage) local src = source if not HasPermission(src) then TriggerClientEvent('ox_lib:notify', src, { title = 'Keine Berechtigung', description = 'Du hast keine Berechtigung für diese Aktion', type = 'error' }) return end -- Delete vehicle from world if it exists local vehicles = GetAllVehicles() for i = 1, #vehicles do local veh = vehicles[i] local vehPlate = GetVehicleNumberPlateText(veh):gsub("%s+", "") if vehPlate == plate:gsub("%s+", "") then DeleteEntity(veh) break end end -- Update database MySQL.Async.execute('UPDATE player_vehicles SET state = ?, garage = ? WHERE plate = ?', {1, garage, plate}, function(affectedRows) if affectedRows > 0 then -- Log the action local Player = QBCore.Functions.GetPlayer(src) print(string.format('[VEHICLE ADMIN] %s (%s) moved vehicle %s to garage %s', Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname, Player.PlayerData.job.label, plate, garage )) TriggerClientEvent('ox_lib:notify', src, { title = 'Fahrzeugverwaltung', description = 'Fahrzeug wurde in Garage ' .. garage .. ' gestellt', type = 'success' }) else TriggerClientEvent('ox_lib:notify', src, { title = 'Fahrzeugverwaltung', description = 'Fehler beim Verschieben des Fahrzeugs', type = 'error' }) end end) end) -- Delete vehicle from map RegisterNetEvent('vehicleadmin:deleteFromMap', function(plate) local src = source if not HasPermission(src) then TriggerClientEvent('ox_lib:notify', src, { title = 'Keine Berechtigung', description = 'Du hast keine Berechtigung für diese Aktion', type = 'error' }) return end local vehicles = GetAllVehicles() local deleted = false for i = 1, #vehicles do local veh = vehicles[i] local vehPlate = GetVehicleNumberPlateText(veh):gsub("%s+", "") if vehPlate == plate:gsub("%s+", "") then DeleteEntity(veh) deleted = true break end end -- Log the action local Player = QBCore.Functions.GetPlayer(src) print(string.format('[VEHICLE ADMIN] %s (%s) deleted vehicle %s from map', Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname, Player.PlayerData.job.label, plate )) if deleted then TriggerClientEvent('ox_lib:notify', src, { title = 'Fahrzeugverwaltung', description = 'Fahrzeug wurde von der Map gelöscht', type = 'success' }) else TriggerClientEvent('ox_lib:notify', src, { title = 'Fahrzeugverwaltung', description = 'Fahrzeug nicht auf der Map gefunden', type = 'info' }) end end) -- Repair vehicle RegisterNetEvent('vehicleadmin:repairVehicle', function(plate) local src = source if not HasPermission(src) then TriggerClientEvent('ox_lib:notify', src, { title = 'Keine Berechtigung', description = 'Du hast keine Berechtigung für diese Aktion', type = 'error' }) return end -- Update database MySQL.Async.execute('UPDATE player_vehicles SET engine = ?, body = ? WHERE plate = ?', {1000, 1000, plate}, function(affectedRows) -- Also repair if vehicle is on map local vehicles = GetAllVehicles() for i = 1, #vehicles do local veh = vehicles[i] local vehPlate = GetVehicleNumberPlateText(veh):gsub("%s+", "") if vehPlate == plate:gsub("%s+", "") then SetVehicleFixed(veh) SetVehicleDeformationFixed(veh) SetVehicleUndriveable(veh, false) SetVehicleEngineOn(veh, true, true) break end end -- Log the action local Player = QBCore.Functions.GetPlayer(src) print(string.format('[VEHICLE ADMIN] %s (%s) repaired vehicle %s', Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname, Player.PlayerData.job.label, plate )) if affectedRows > 0 then TriggerClientEvent('ox_lib:notify', src, { title = 'Fahrzeugverwaltung', description = 'Fahrzeug wurde repariert', type = 'success' }) else TriggerClientEvent('ox_lib:notify', src, { title = 'Fahrzeugverwaltung', description = 'Fehler beim Reparieren des Fahrzeugs', type = 'error' }) end end) end) -- Impound vehicle (Police only) RegisterNetEvent('vehicleadmin:impoundVehicle', function(plate) local src = source local Player = QBCore.Functions.GetPlayer(src) if not Player or Player.PlayerData.job.name ~= 'police' then TriggerClientEvent('ox_lib:notify', src, { title = 'Keine Berechtigung', description = 'Nur Polizisten können Fahrzeuge beschlagnahmen', type = 'error' }) return end -- Delete vehicle from world if it exists local vehicles = GetAllVehicles() for i = 1, #vehicles do local veh = vehicles[i] local vehPlate = GetVehicleNumberPlateText(veh):gsub("%s+", "") if vehPlate == plate:gsub("%s+", "") then DeleteEntity(veh) break end end -- Set state to impounded (2) and move to impound garage MySQL.Async.execute('UPDATE player_vehicles SET state = ?, garage = ?, depotprice = ? WHERE plate = ?', {2, 'impound', 500, plate}, function(affectedRows) if affectedRows > 0 then print(string.format('[VEHICLE ADMIN] %s (Police) impounded vehicle %s', Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname, plate )) TriggerClientEvent('ox_lib:notify', src, { title = 'Fahrzeugverwaltung', description = 'Fahrzeug wurde beschlagnahmt (500€ Gebühr)', type = 'success' }) else TriggerClientEvent('ox_lib:notify', src, { title = 'Fahrzeugverwaltung', description = 'Fehler beim Beschlagnahmen des Fahrzeugs', type = 'error' }) end end) end) -- Release from impound (Police/Admin only) RegisterNetEvent('vehicleadmin:releaseFromImpound', function(plate, garage) local src = source local Player = QBCore.Functions.GetPlayer(src) if not Player or (Player.PlayerData.job.name ~= 'police' and not QBCore.Functions.HasPermission(src, 'admin')) then TriggerClientEvent('ox_lib:notify', src, { title = 'Keine Berechtigung', description = 'Nur Polizisten oder Admins können Fahrzeuge freigeben', type = 'error' }) return end -- Set state to in garage (1) and move to specified garage MySQL.Async.execute('UPDATE player_vehicles SET state = ?, garage = ?, depotprice = ? WHERE plate = ?', {1, garage, 0, plate}, function(affectedRows) if affectedRows > 0 then print(string.format('[VEHICLE ADMIN] %s (%s) released vehicle %s from impound to garage %s', Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname, Player.PlayerData.job.label, plate, garage )) TriggerClientEvent('ox_lib:notify', src, { title = 'Fahrzeugverwaltung', description = 'Fahrzeug wurde aus der Beschlagnahme freigegeben', type = 'success' }) else TriggerClientEvent('ox_lib:notify', src, { title = 'Fahrzeugverwaltung', description = 'Fehler beim Freigeben des Fahrzeugs', type = 'error' }) end end) end) -- Command to open admin menu QBCore.Commands.Add('vehicleadmin', 'Öffne Fahrzeug Admin Menu', {}, false, function(source, args) local src = source if not HasPermission(src) then local Player = QBCore.Functions.GetPlayer(src) local jobName = Player and Player.PlayerData.job.name or 'Unbekannt' TriggerClientEvent('ox_lib:notify', src, { title = 'Keine Berechtigung', description = 'Dein Job (' .. jobName .. ') hat keine Berechtigung für dieses System', type = 'error' }) return end TriggerClientEvent('vehicleadmin:openMenu', src) end) -- Alternative command for police QBCore.Commands.Add('policegarage', 'Öffne Polizei Fahrzeug Menu', {}, false, function(source, args) local src = source local Player = QBCore.Functions.GetPlayer(src) if not Player or Player.PlayerData.job.name ~= 'police' then TriggerClientEvent('ox_lib:notify', src, { title = 'Keine Berechtigung', description = 'Nur Polizisten können diesen Befehl verwenden', type = 'error' }) return end TriggerClientEvent('vehicleadmin:openMenu', src) end) -- Alternative command for mechanics QBCore.Commands.Add('mechanicadmin', 'Öffne Mechaniker Fahrzeug Menu', {}, false, function(source, args) local src = source local Player = QBCore.Functions.GetPlayer(src) if not Player or Player.PlayerData.job.name ~= 'mechanic' then TriggerClientEvent('ox_lib:notify', src, { title = 'Keine Berechtigung', description = 'Nur Mechaniker können diesen Befehl verwenden', type = 'error' }) return end TriggerClientEvent('vehicleadmin:openMenu', src) end) -- Alternative command for ambulance QBCore.Commands.Add('emsadmin', 'Öffne EMS Fahrzeug Menu', {}, false, function(source, args) local src = source local Player = QBCore.Functions.GetPlayer(src) if not Player or Player.PlayerData.job.name ~= 'ambulance' then TriggerClientEvent('ox_lib:notify', src, { title = 'Keine Berechtigung', description = 'Nur EMS können diesen Befehl verwenden', type = 'error' }) return end TriggerClientEvent('vehicleadmin:openMenu', src) end) -- Alternative command for cardealer QBCore.Commands.Add('dealeradmin', 'Öffne Autohändler Fahrzeug Menu', {}, false, function(source, args) local src = source local Player = QBCore.Functions.GetPlayer(src) if not Player or Player.PlayerData.job.name ~= 'cardealer' then TriggerClientEvent('ox_lib:notify', src, { title = 'Keine Berechtigung', description = 'Nur Autohändler können diesen Befehl verwenden', type = 'error' }) return end TriggerClientEvent('vehicleadmin:openMenu', src) end)