ed
This commit is contained in:
		
							parent
							
								
									21694d4b1c
								
							
						
					
					
						commit
						259e1eb56f
					
				
					 3 changed files with 384 additions and 0 deletions
				
			
		
							
								
								
									
										165
									
								
								resources/[carscripts]/nordi_car_admin/client.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								resources/[carscripts]/nordi_car_admin/client.lua
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,165 @@
 | 
			
		|||
local QBCore = exports['qb-core']:GetCoreObject()
 | 
			
		||||
 | 
			
		||||
-- Get vehicle state text
 | 
			
		||||
local function GetStateText(state)
 | 
			
		||||
    if state == 0 then
 | 
			
		||||
        return "Ausgefahren"
 | 
			
		||||
    elseif state == 1 then
 | 
			
		||||
        return "In Garage"
 | 
			
		||||
    elseif state == 2 then
 | 
			
		||||
        return "Beschlagnahmt"
 | 
			
		||||
    else
 | 
			
		||||
        return "Unbekannt"
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Get vehicle condition text
 | 
			
		||||
local function GetConditionText(value)
 | 
			
		||||
    if value >= 900 then
 | 
			
		||||
        return "Sehr gut"
 | 
			
		||||
    elseif value >= 700 then
 | 
			
		||||
        return "Gut"
 | 
			
		||||
    elseif value >= 500 then
 | 
			
		||||
        return "Mittelmäßig"
 | 
			
		||||
    elseif value >= 300 then
 | 
			
		||||
        return "Schlecht"
 | 
			
		||||
    else
 | 
			
		||||
        return "Sehr schlecht"
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Show vehicle actions menu
 | 
			
		||||
local function ShowVehicleActions(vehicle)
 | 
			
		||||
    QBCore.Functions.TriggerCallback('vehicleadmin:getGarages', function(garages)
 | 
			
		||||
        if not garages then return end
 | 
			
		||||
        
 | 
			
		||||
        local garageOptions = {}
 | 
			
		||||
        for i = 1, #garages do
 | 
			
		||||
            table.insert(garageOptions, {
 | 
			
		||||
                value = garages[i].name,
 | 
			
		||||
                label = garages[i].label
 | 
			
		||||
            })
 | 
			
		||||
        end
 | 
			
		||||
        
 | 
			
		||||
        local input = lib.inputDialog('Fahrzeug Aktionen - ' .. vehicle.plate, {
 | 
			
		||||
            {
 | 
			
		||||
                type = 'select',
 | 
			
		||||
                label = 'Aktion wählen',
 | 
			
		||||
                options = {
 | 
			
		||||
                    {value = 'move', label = 'In Garage stellen'},
 | 
			
		||||
                    {value = 'delete', label = 'Von Map löschen'},
 | 
			
		||||
                    {value = 'repair', label = 'Reparieren'}
 | 
			
		||||
                },
 | 
			
		||||
                required = true
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                type = 'select',
 | 
			
		||||
                label = 'Garage auswählen (nur für "In Garage stellen")',
 | 
			
		||||
                options = garageOptions,
 | 
			
		||||
                required = false
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
        
 | 
			
		||||
        if input then
 | 
			
		||||
            local action = input[1]
 | 
			
		||||
            local garage = input[2]
 | 
			
		||||
            
 | 
			
		||||
            if action == 'move' then
 | 
			
		||||
                if not garage then
 | 
			
		||||
                    lib.notify({
 | 
			
		||||
                        title = 'Fehler',
 | 
			
		||||
                        description = 'Bitte wähle eine Garage aus',
 | 
			
		||||
                        type = 'error'
 | 
			
		||||
                    })
 | 
			
		||||
                    return
 | 
			
		||||
                end
 | 
			
		||||
                TriggerServerEvent('vehicleadmin:moveToGarage', vehicle.plate, garage)
 | 
			
		||||
            elseif action == 'delete' then
 | 
			
		||||
                TriggerServerEvent('vehicleadmin:deleteFromMap', vehicle.plate)
 | 
			
		||||
            elseif action == 'repair' then
 | 
			
		||||
                TriggerServerEvent('vehicleadmin:repairVehicle', vehicle.plate)
 | 
			
		||||
            end
 | 
			
		||||
        end
 | 
			
		||||
    end)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Show vehicles for selected player
 | 
			
		||||
local function ShowPlayerVehicles(citizenid, playerName)
 | 
			
		||||
    QBCore.Functions.TriggerCallback('vehicleadmin:getPlayerVehicles', function(vehicles)
 | 
			
		||||
        if not vehicles then return end
 | 
			
		||||
        
 | 
			
		||||
        if #vehicles == 0 then
 | 
			
		||||
            lib.notify({
 | 
			
		||||
                title = 'Keine Fahrzeuge',
 | 
			
		||||
                description = 'Dieser Spieler hat keine Fahrzeuge',
 | 
			
		||||
                type = 'info'
 | 
			
		||||
            })
 | 
			
		||||
            return
 | 
			
		||||
        end
 | 
			
		||||
        
 | 
			
		||||
        local options = {}
 | 
			
		||||
        for i = 1, #vehicles do
 | 
			
		||||
            local vehicle = vehicles[i]
 | 
			
		||||
            local vehicleLabel = QBCore.Shared.Vehicles[vehicle.vehicle]?.name or vehicle.vehicle
 | 
			
		||||
            
 | 
			
		||||
            table.insert(options, {
 | 
			
		||||
                title = vehicleLabel .. ' (' .. vehicle.plate .. ')',
 | 
			
		||||
                description = 'Zustand: ' .. GetStateText(vehicle.state) .. ' | Garage: ' .. (vehicle.garage or 'Keine') .. 
 | 
			
		||||
                             '\nMotor: ' .. GetConditionText(vehicle.engine) .. ' | Karosserie: ' .. GetConditionText(vehicle.body) ..
 | 
			
		||||
                             '\nSprit: ' .. math.floor(vehicle.fuel) .. '%',
 | 
			
		||||
                icon = 'car',
 | 
			
		||||
                onSelect = function()
 | 
			
		||||
                    ShowVehicleActions(vehicle)
 | 
			
		||||
                end
 | 
			
		||||
            })
 | 
			
		||||
        end
 | 
			
		||||
        
 | 
			
		||||
        lib.registerContext({
 | 
			
		||||
            id = 'vehicle_list',
 | 
			
		||||
            title = 'Fahrzeuge von ' .. playerName,
 | 
			
		||||
            options = options
 | 
			
		||||
        })
 | 
			
		||||
        
 | 
			
		||||
        lib.showContext('vehicle_list')
 | 
			
		||||
    end, citizenid)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Show player selection menu
 | 
			
		||||
local function ShowPlayerMenu()
 | 
			
		||||
    QBCore.Functions.TriggerCallback('vehicleadmin:getPlayers', function(players)
 | 
			
		||||
        if not players then
 | 
			
		||||
            lib.notify({
 | 
			
		||||
                title = 'Fehler',
 | 
			
		||||
                description = 'Keine Berechtigung oder Fehler beim Laden',
 | 
			
		||||
                type = 'error'
 | 
			
		||||
            })
 | 
			
		||||
            return
 | 
			
		||||
        end
 | 
			
		||||
        
 | 
			
		||||
        local options = {}
 | 
			
		||||
        for i = 1, #players do
 | 
			
		||||
            local player = players[i]
 | 
			
		||||
            table.insert(options, {
 | 
			
		||||
                title = player.name,
 | 
			
		||||
                description = 'Citizen ID: ' .. player.citizenid,
 | 
			
		||||
                icon = 'user',
 | 
			
		||||
                onSelect = function()
 | 
			
		||||
                    ShowPlayerVehicles(player.citizenid, player.name)
 | 
			
		||||
                end
 | 
			
		||||
            })
 | 
			
		||||
        end
 | 
			
		||||
        
 | 
			
		||||
        lib.registerContext({
 | 
			
		||||
            id = 'player_selection',
 | 
			
		||||
            title = 'Spieler auswählen',
 | 
			
		||||
            options = options
 | 
			
		||||
        })
 | 
			
		||||
        
 | 
			
		||||
        lib.showContext('player_selection')
 | 
			
		||||
    end)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Event to open main menu
 | 
			
		||||
RegisterNetEvent('vehicleadmin:openMenu', function()
 | 
			
		||||
    ShowPlayerMenu()
 | 
			
		||||
end)
 | 
			
		||||
							
								
								
									
										25
									
								
								resources/[carscripts]/nordi_car_admin/fxmanifest.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								resources/[carscripts]/nordi_car_admin/fxmanifest.lua
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,25 @@
 | 
			
		|||
fx_version 'cerulean'
 | 
			
		||||
game 'gta5'
 | 
			
		||||
 | 
			
		||||
author 'YourName'
 | 
			
		||||
description 'Vehicle Admin Script for QBCore'
 | 
			
		||||
version '1.0.0'
 | 
			
		||||
 | 
			
		||||
shared_scripts {
 | 
			
		||||
    '@ox_lib/init.lua'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
client_scripts {
 | 
			
		||||
    'client.lua'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
server_scripts {
 | 
			
		||||
    '@oxmysql/lib/MySQL.lua',
 | 
			
		||||
    'server.lua'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dependencies {
 | 
			
		||||
    'qb-core',
 | 
			
		||||
    'ox_lib',
 | 
			
		||||
    'oxmysql'
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										194
									
								
								resources/[carscripts]/nordi_car_admin/server.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										194
									
								
								resources/[carscripts]/nordi_car_admin/server.lua
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,194 @@
 | 
			
		|||
local QBCore = exports['qb-core']:GetCoreObject()
 | 
			
		||||
 | 
			
		||||
-- Admin Permission Check
 | 
			
		||||
local function IsAdmin(source)
 | 
			
		||||
    local Player = QBCore.Functions.GetPlayer(source)
 | 
			
		||||
    if not Player then return false end
 | 
			
		||||
    return QBCore.Functions.HasPermission(source, 'admin') or Player.PlayerData.job.name == 'admin'
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Get all players from database
 | 
			
		||||
QBCore.Functions.CreateCallback('vehicleadmin:getPlayers', function(source, cb)
 | 
			
		||||
    if not IsAdmin(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 IsAdmin(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]
 | 
			
		||||
            local vehicleData = json.decode(vehicle.mods)
 | 
			
		||||
            
 | 
			
		||||
            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 IsAdmin(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)
 | 
			
		||||
 | 
			
		||||
-- Move vehicle to garage
 | 
			
		||||
RegisterNetEvent('vehicleadmin:moveToGarage', function(plate, garage)
 | 
			
		||||
    local src = source
 | 
			
		||||
    if not IsAdmin(src) then 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
 | 
			
		||||
            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 IsAdmin(src) then 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
 | 
			
		||||
    
 | 
			
		||||
    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 = 'error'
 | 
			
		||||
        })
 | 
			
		||||
    end
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
-- Repair vehicle
 | 
			
		||||
RegisterNetEvent('vehicleadmin:repairVehicle', function(plate)
 | 
			
		||||
    local src = source
 | 
			
		||||
    if not IsAdmin(src) then 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
 | 
			
		||||
        
 | 
			
		||||
        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)
 | 
			
		||||
 | 
			
		||||
-- Command to open admin menu
 | 
			
		||||
QBCore.Commands.Add('vehicleadmin', 'Öffne Fahrzeug Admin Menu', {}, false, function(source, args)
 | 
			
		||||
    local src = source
 | 
			
		||||
    if not IsAdmin(src) then
 | 
			
		||||
        TriggerClientEvent('ox_lib:notify', src, {
 | 
			
		||||
            title = 'Keine Berechtigung',
 | 
			
		||||
            description = 'Du hast keine Admin-Rechte',
 | 
			
		||||
            type = 'error'
 | 
			
		||||
        })
 | 
			
		||||
        return
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    TriggerClientEvent('vehicleadmin:openMenu', src)
 | 
			
		||||
end, 'admin')
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue