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

437 lines
14 KiB
Lua
Raw Normal View History

2025-08-06 10:11:58 +02:00
local QBCore = exports['qb-core']:GetCoreObject()
2025-08-06 11:48:14 +02:00
-- 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)
2025-08-06 10:11:58 +02:00
local Player = QBCore.Functions.GetPlayer(source)
if not Player then return false end
2025-08-06 11:48:14 +02:00
-- 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
2025-08-06 10:11:58 +02:00
end
-- Get all players from database
QBCore.Functions.CreateCallback('vehicleadmin:getPlayers', function(source, cb)
2025-08-06 11:48:14 +02:00
if not HasPermission(source) then
2025-08-06 10:11:58 +02:00
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)
2025-08-06 11:48:14 +02:00
if not HasPermission(source) then
2025-08-06 10:11:58 +02:00
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)
2025-08-06 11:48:14 +02:00
if not HasPermission(source) then
2025-08-06 10:11:58 +02:00
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)
2025-08-06 11:48:14 +02:00
-- 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)
2025-08-06 10:11:58 +02:00
-- Move vehicle to garage
RegisterNetEvent('vehicleadmin:moveToGarage', function(plate, garage)
local src = source
2025-08-06 11:48:14 +02:00
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
2025-08-06 10:11:58 +02:00
-- 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
2025-08-06 11:48:14 +02:00
-- 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
))
2025-08-06 10:11:58 +02:00
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
2025-08-06 11:48:14 +02:00
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
2025-08-06 10:11:58 +02:00
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
2025-08-06 11:48:14 +02:00
-- 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
))
2025-08-06 10:11:58 +02:00
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',
2025-08-06 11:48:14 +02:00
type = 'info'
2025-08-06 10:11:58 +02:00
})
end
end)
-- Repair vehicle
RegisterNetEvent('vehicleadmin:repairVehicle', function(plate)
local src = source
2025-08-06 11:48:14 +02:00
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
2025-08-06 10:11:58 +02:00
-- 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
2025-08-06 11:48:14 +02:00
-- 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
))
2025-08-06 10:11:58 +02:00
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)
2025-08-06 11:48:14 +02:00
-- 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)
2025-08-06 10:11:58 +02:00
-- Command to open admin menu
QBCore.Commands.Add('vehicleadmin', 'Öffne Fahrzeug Admin Menu', {}, false, function(source, args)
local src = source
2025-08-06 11:48:14 +02:00
if not HasPermission(src) then
local Player = QBCore.Functions.GetPlayer(src)
local jobName = Player and Player.PlayerData.job.name or 'Unbekannt'
2025-08-06 10:11:58 +02:00
TriggerClientEvent('ox_lib:notify', src, {
title = 'Keine Berechtigung',
2025-08-06 11:48:14 +02:00
description = 'Dein Job (' .. jobName .. ') hat keine Berechtigung für dieses System',
2025-08-06 10:11:58 +02:00
type = 'error'
})
return
end
TriggerClientEvent('vehicleadmin:openMenu', src)
2025-08-06 11:48:14 +02:00
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)