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) if not result then cb({}) return end local players = {} for i = 1, #result do local charinfo = json.decode(result[i].charinfo) if charinfo and charinfo.firstname and charinfo.lastname then table.insert(players, { citizenid = result[i].citizenid, name = charinfo.firstname .. ' ' .. charinfo.lastname }) end 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) if not result then cb({}) return end local vehicles = {} for i = 1, #result do local vehicle = result[i] table.insert(vehicles, { plate = vehicle.plate or 'UNKNOWN', vehicle = vehicle.vehicle or 'unknown', garage = vehicle.garage or 'none', state = vehicle.garage == "OUT" and 0 or 1, -- Anpassung an euer Garagensystem fuel = vehicle.fuel or 100, engine = vehicle.engine or 1000, body = vehicle.body or 1000, citizenid = vehicle.citizenid, name = vehicle.name or "Unbekanntes Fahrzeug", mods = vehicle.mods or "{}" }) end cb(vehicles) end) end) -- Get all garages from your config QBCore.Functions.CreateCallback('vehicleadmin:getGarages', function(source, cb) if not HasPermission(source) then cb(false) return end local garages = {} -- Verwende die Garagen aus eurem Config for k, v in pairs(Config.Zonen) do table.insert(garages, { name = v.name, label = v.name -- Ihr könnt hier auch eine Label-Property hinzufügen }) end -- Sortiere alphabetisch table.sort(garages, function(a, b) return a.name < b.name 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] if DoesEntityExist(veh) then local vehPlate = GetVehicleNumberPlateText(veh):gsub("%s+", "") if vehPlate == plate:gsub("%s+", "") then DeleteEntity(veh) break end end end -- Update database - Anpassung an euer Garagensystem MySQL.Async.execute('UPDATE player_vehicles SET garage = ? WHERE plate = ?', {garage, plate}, function(affectedRows) if affectedRows > 0 then -- Entferne das Fahrzeug aus dem Parking-System, falls vorhanden MySQL.Async.execute('DELETE FROM vehicle_parking WHERE plate = ?', {plate}) -- Log the action local Player = QBCore.Functions.GetPlayer(src) if Player then 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 )) -- Log für Discord TriggerEvent('mh_garage:log', { type = "admin_move", user = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname, citizenid = Player.PlayerData.citizenid, plate = plate, garage = garage }) end 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] if DoesEntityExist(veh) then local vehPlate = GetVehicleNumberPlateText(veh):gsub("%s+", "") if vehPlate == plate:gsub("%s+", "") then DeleteEntity(veh) deleted = true break end end end -- Log the action local Player = QBCore.Functions.GetPlayer(src) if Player then 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 )) -- Log für Discord TriggerEvent('mh_garage:log', { type = "admin_delete", user = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname, citizenid = Player.PlayerData.citizenid, plate = plate }) end 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 -- Get vehicle mods first MySQL.Async.fetchAll('SELECT mods FROM player_vehicles WHERE plate = ?', {plate}, function(result) if result and result[1] and result[1].mods then local mods = json.decode(result[1].mods) -- Update mods with repaired values mods.engineHealth = 1000 mods.bodyHealth = 1000 mods.fuelLevel = 100 -- Reset door and window status if they exist if mods.doorStatus then mods.doorStatus = {} end if mods.windowStatus then mods.windowStatus = {} for i = 0, 7 do mods.windowStatus[tostring(i)] = true end end -- Update database with repaired mods MySQL.Async.execute('UPDATE player_vehicles SET mods = ? WHERE plate = ?', {json.encode(mods), plate}, function(affectedRows) -- Also repair if vehicle is on map local vehicles = GetAllVehicles() for i = 1, #vehicles do local veh = vehicles[i] if DoesEntityExist(veh) then local vehPlate = GetVehicleNumberPlateText(veh):gsub("%s+", "") if vehPlate == plate:gsub("%s+", "") then SetVehicleFixed(veh) SetVehicleDeformationFixed(veh) SetVehicleUndriveable(veh, false) SetVehicleEngineOn(veh, true, true) SetVehicleFuelLevel(veh, 100.0) exports["lc_fuel"]:SetFuel(veh, 100) break end end end -- Log the action local Player = QBCore.Functions.GetPlayer(src) if Player then print(string.format('[VEHICLE ADMIN] %s (%s) repaired vehicle %s', Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname, Player.PlayerData.job.label, plate )) -- Log für Discord TriggerEvent('mh_garage:log', { type = "admin_repair", user = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname, citizenid = Player.PlayerData.citizenid, plate = plate }) end 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) else TriggerClientEvent('ox_lib:notify', src, { title = 'Fahrzeugverwaltung', description = 'Fahrzeug nicht gefunden', 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) -- Erweiterung des Log-Systems für Fahrzeugadmin AddEventHandler('mh_garage:log', function(data) local type = data.type local user = data.user local citizenid = data.citizenid local plate = data.plate local garage = data.garage local Color = "purple" local Text = "" if type == "admin_move" then Text = user .. " [" .. citizenid .. "] hat Fahrzeug " .. plate .. " in Garage " .. garage .. " gestellt." Color = "blue" elseif type == "admin_delete" then Text = user .. " [" .. citizenid .. "] hat Fahrzeug " .. plate .. " von der Map gelöscht." Color = "orange" elseif type == "admin_repair" then Text = user .. " [" .. citizenid .. "] hat Fahrzeug " .. plate .. " repariert." Color = "green" end sendToDiscord("Fahrzeugadmin", Text, Color) end)