1
0
Fork 0
forked from Simnation/Main
This commit is contained in:
Nordi98 2025-08-04 08:31:45 +02:00
parent 91f2af8b8b
commit 4a1367fb44
2 changed files with 310 additions and 200 deletions

View file

@ -5,6 +5,7 @@ local isMenuOpen = false
local currentTarget = nil local currentTarget = nil
local nearbyPlayers = {} local nearbyPlayers = {}
local isLicenseShowing = false local isLicenseShowing = false
local pendingRequests = {}
-- Hilfsfunktionen -- Hilfsfunktionen
local function debugPrint(message) local function debugPrint(message)
@ -13,16 +14,6 @@ local function debugPrint(message)
end end
end end
local function safeCallback(cb, ...)
if cb and type(cb) == "function" then
cb(...)
return true
else
debugPrint("^1FEHLER: Callback ist keine Funktion! Typ: " .. type(cb) .. "^7")
return false
end
end
local function showNotification(message, type) local function showNotification(message, type)
QBCore.Functions.Notify(message, type or 'primary') QBCore.Functions.Notify(message, type or 'primary')
end end
@ -104,132 +95,26 @@ end
-- Spieler-Lizenz anzeigen -- Spieler-Lizenz anzeigen
local function showPlayerLicense(targetId) local function showPlayerLicense(targetId)
debugPrint("Rufe Server-Callback auf für Spieler: " .. tostring(targetId)) debugPrint("=== showPlayerLicense START ===")
debugPrint("Sende Event: requestLicense für Spieler: " .. tostring(targetId))
QBCore.Functions.TriggerCallback('license-system:server:getLicense', function(licenseData) TriggerServerEvent('license-system:server:requestLicense', targetId)
debugPrint("Callback-Antwort erhalten für Spieler-Lizenz")
if licenseData then
debugPrint("Lizenz-Daten erhalten: " .. licenseData.license.license_type)
showLicense(licenseData)
else
debugPrint("Keine Lizenz-Daten erhalten")
showNotification(Config.Notifications.license_not_found.message, Config.Notifications.license_not_found.type)
end
end, targetId)
end end
-- Eigene Lizenz anzeigen -- Eigene Lizenz anzeigen
local function showMyLicense(licenseType) local function showMyLicense(licenseType)
debugPrint("Rufe Server-Callback auf für eigene Lizenz: " .. tostring(licenseType)) debugPrint("=== showMyLicense START ===")
debugPrint("Sende Event: requestMyLicense für Typ: " .. tostring(licenseType))
QBCore.Functions.TriggerCallback('license-system:server:getMyLicense', function(licenseData) TriggerServerEvent('license-system:server:requestMyLicense', licenseType)
debugPrint("Eigene Lizenz Callback-Antwort erhalten")
if licenseData then
debugPrint("Eigene Lizenz-Daten erhalten: " .. licenseData.license.license_type)
showLicense(licenseData)
else
debugPrint("Keine eigene Lizenz gefunden")
local config = Config.LicenseTypes[licenseType]
local licenseName = config and config.label or licenseType
showNotification('Du hast keine ' .. licenseName .. '!', 'error')
end
end, licenseType)
end end
-- Spieler-Lizenz-Menü -- Spieler-Lizenz-Menü
local function openPlayerLicenseMenu(targetId, targetName) local function openPlayerLicenseMenu(targetId, targetName)
debugPrint("Öffne Lizenz-Menü für Spieler: " .. targetName .. " (ID: " .. targetId .. ")") debugPrint("=== openPlayerLicenseMenu START ===")
debugPrint("Sende Event: requestPlayerLicenses für: " .. targetName .. " (ID: " .. targetId .. ")")
QBCore.Functions.TriggerCallback('license-system:server:getPlayerLicenses', function(licenses) TriggerServerEvent('license-system:server:requestPlayerLicenses', targetId)
debugPrint("Spieler-Lizenzen Callback-Antwort erhalten, Anzahl: " .. (licenses and #licenses or 0))
local menuOptions = {}
if licenses and #licenses > 0 then
for _, license in ipairs(licenses) do
local licenseConfig = Config.LicenseTypes[license.license_type] or {
label = license.license_type,
icon = 'fas fa-id-card',
color = '#667eea'
}
local statusIcon = license.is_active == 1 and '' or ''
local statusText = license.is_active == 1 and 'Gültig' or 'Ungültig'
local expireText = license.expire_date or 'Unbegrenzt'
table.insert(menuOptions, {
title = licenseConfig.label .. ' ' .. statusIcon,
description = 'Status: ' .. statusText .. ' | Gültig bis: ' .. expireText,
icon = licenseConfig.icon,
onSelect = function()
local licenseData = {
license = license,
config = licenseConfig
}
showLicense(licenseData)
end,
metadata = {
{label = 'Status', value = statusText},
{label = 'Ausgestellt', value = license.issue_date or 'Unbekannt'},
{label = 'Gültig bis', value = expireText},
{label = 'Aussteller', value = license.issued_by_name or 'System'}
}
})
end
else
table.insert(menuOptions, {
title = 'Keine Lizenzen gefunden',
description = 'Dieser Spieler hat keine Lizenzen',
icon = 'fas fa-exclamation-triangle',
disabled = true
})
end
-- Aktionen hinzufügen
table.insert(menuOptions, {
title = '─────────────────',
disabled = true
})
table.insert(menuOptions, {
title = 'Neue Lizenz ausstellen',
description = 'Eine neue Lizenz für diesen Spieler ausstellen',
icon = 'fas fa-plus',
onSelect = function()
openIssueLicenseMenu(targetId, targetName)
end
})
if licenses and #licenses > 0 then
table.insert(menuOptions, {
title = 'Lizenz entziehen',
description = 'Eine bestehende Lizenz entziehen',
icon = 'fas fa-minus',
onSelect = function()
openRevokeLicenseMenu(targetId, targetName, licenses)
end
})
end
table.insert(menuOptions, {
title = '← Zurück',
icon = 'fas fa-arrow-left',
onSelect = function()
openLicenseMenu()
end
})
lib.registerContext({
id = 'player_licenses',
title = 'Lizenzen: ' .. targetName,
options = menuOptions
})
lib.showContext('player_licenses')
end, targetId)
end end
-- Lizenz ausstellen Menü -- Lizenz ausstellen Menü
@ -578,17 +463,177 @@ local function showMyLicenses()
lib.showContext('my_licenses') lib.showContext('my_licenses')
end end
-- Events -- EVENT HANDLER: Einzelne Lizenz erhalten
RegisterNetEvent('license-system:client:receiveLicense', function(licenseData)
debugPrint("=== Event: receiveLicense ===")
debugPrint("LicenseData-Typ: " .. type(licenseData))
if licenseData then
debugPrint("Lizenz-Daten erhalten: " .. licenseData.license.license_type)
showLicense(licenseData)
else
debugPrint("Keine Lizenz-Daten erhalten")
showNotification(Config.Notifications.license_not_found.message, Config.Notifications.license_not_found.type)
end
end)
-- EVENT HANDLER: Eigene Lizenz erhalten
RegisterNetEvent('license-system:client:receiveMyLicense', function(licenseData, licenseType)
debugPrint("=== Event: receiveMyLicense ===")
debugPrint("LicenseType: " .. tostring(licenseType))
debugPrint("LicenseData-Typ: " .. type(licenseData))
if licenseData then
debugPrint("Eigene Lizenz-Daten erhalten: " .. licenseData.license.license_type)
showLicense(licenseData)
else
debugPrint("Keine eigene Lizenz gefunden")
local config = Config.LicenseTypes[licenseType]
local licenseName = config and config.label or licenseType
showNotification('Du hast keine ' .. licenseName .. '!', 'error')
end
end)
-- EVENT HANDLER: Alle Spieler-Lizenzen erhalten
RegisterNetEvent('license-system:client:receivePlayerLicenses', function(licenses, targetId, targetName)
debugPrint("=== Event: receivePlayerLicenses ===")
debugPrint("Erhaltene Lizenzen: " .. #licenses)
debugPrint("TargetName: " .. tostring(targetName))
local menuOptions = {}
if licenses and #licenses > 0 then
for _, license in ipairs(licenses) do
local licenseConfig = Config.LicenseTypes[license.license_type] or {
label = license.license_type,
icon = 'fas fa-id-card',
color = '#667eea'
}
local statusIcon = (license.is_active == 1) and '' or ''
local statusText = (license.is_active == 1) and 'Gültig' or 'Ungültig'
local expireText = license.expire_date or 'Unbegrenzt'
table.insert(menuOptions, {
title = licenseConfig.label .. ' ' .. statusIcon,
description = 'Status: ' .. statusText .. ' | Gültig bis: ' .. expireText,
icon = licenseConfig.icon,
onSelect = function()
local licenseData = {
license = license,
config = licenseConfig
}
showLicense(licenseData)
end,
metadata = {
{label = 'Status', value = statusText},
{label = 'Ausgestellt', value = license.issue_date or 'Unbekannt'},
{label = 'Gültig bis', value = expireText},
{label = 'Aussteller', value = license.issued_by_name or 'System'}
}
})
end
else
table.insert(menuOptions, {
title = 'Keine Lizenzen gefunden',
description = 'Dieser Spieler hat keine Lizenzen',
icon = 'fas fa-exclamation-triangle',
disabled = true
})
end
-- Aktionen hinzufügen
table.insert(menuOptions, {
title = '─────────────────',
disabled = true
})
table.insert(menuOptions, {
title = 'Neue Lizenz ausstellen',
description = 'Eine neue Lizenz für diesen Spieler ausstellen',
icon = 'fas fa-plus',
onSelect = function()
openIssueLicenseMenu(targetId, targetName)
end
})
if licenses and #licenses > 0 then
table.insert(menuOptions, {
title = 'Lizenz entziehen',
description = 'Eine bestehende Lizenz entziehen',
icon = 'fas fa-minus',
onSelect = function()
openRevokeLicenseMenu(targetId, targetName, licenses)
end
})
end
table.insert(menuOptions, {
title = '← Zurück',
icon = 'fas fa-arrow-left',
onSelect = function()
openLicenseMenu()
end
})
lib.registerContext({
id = 'player_licenses',
title = 'Lizenzen: ' .. targetName,
options = menuOptions
})
lib.showContext('player_licenses')
end)
-- EVENT HANDLER: Berechtigung erhalten
RegisterNetEvent('license-system:client:receivePermission', function(hasAuth, licenseType)
debugPrint("=== Event: receivePermission ===")
debugPrint("Berechtigung für " .. licenseType .. ": " .. tostring(hasAuth))
if not hasAuth then
showNotification(Config.Notifications.no_permission.message, Config.Notifications.no_permission.type)
end
end)
-- EVENT HANDLER: Lizenz erfolgreich ausgestellt
RegisterNetEvent('license-system:client:licenseIssued', function(targetId, licenseType)
debugPrint("=== Event: licenseIssued ===")
debugPrint("Lizenz " .. licenseType .. " für Spieler " .. targetId .. " ausgestellt")
-- Menü aktualisieren
if lib.getOpenContextMenu() then
lib.hideContext()
Wait(100)
openLicenseMenu()
end
end)
-- EVENT HANDLER: Lizenz erfolgreich entzogen
RegisterNetEvent('license-system:client:licenseRevoked', function(targetId, licenseType)
debugPrint("=== Event: licenseRevoked ===")
debugPrint("Lizenz " .. licenseType .. " für Spieler " .. targetId .. " entzogen")
-- Menü aktualisieren
if lib.getOpenContextMenu() then
lib.hideContext()
Wait(100)
openLicenseMenu()
end
end)
-- EVENT HANDLER: Lizenz anzeigen (von anderen Spielern)
RegisterNetEvent('license-system:client:showLicense', function(targetId) RegisterNetEvent('license-system:client:showLicense', function(targetId)
debugPrint("Event erhalten: showLicense für ID " .. tostring(targetId)) debugPrint("Event erhalten: showLicense für ID " .. tostring(targetId))
showPlayerLicense(targetId) showPlayerLicense(targetId)
end) end)
-- EVENT HANDLER: Eigene Lizenz anzeigen
RegisterNetEvent('license-system:client:showMyLicense', function(licenseType) RegisterNetEvent('license-system:client:showMyLicense', function(licenseType)
debugPrint("Event erhalten: showMyLicense für Typ " .. tostring(licenseType)) debugPrint("Event erhalten: showMyLicense für Typ " .. tostring(licenseType))
showMyLicense(licenseType) showMyLicense(licenseType)
end) end)
-- EVENT HANDLER: Kamera öffnen
RegisterNetEvent('license-system:client:openCamera', function() RegisterNetEvent('license-system:client:openCamera', function()
debugPrint("Event erhalten: openCamera") debugPrint("Event erhalten: openCamera")
SendNUIMessage({ SendNUIMessage({
@ -596,6 +641,7 @@ RegisterNetEvent('license-system:client:openCamera', function()
}) })
end) end)
-- EVENT HANDLER: Menü aktualisieren
RegisterNetEvent('license-system:client:refreshMenu', function() RegisterNetEvent('license-system:client:refreshMenu', function()
debugPrint("Event erhalten: refreshMenu") debugPrint("Event erhalten: refreshMenu")
if lib.getOpenContextMenu() then if lib.getOpenContextMenu() then
@ -605,7 +651,7 @@ RegisterNetEvent('license-system:client:refreshMenu', function()
end end
end) end)
-- NUI Callbacks -- NUI CALLBACKS
RegisterNUICallback('closeLicense', function(data, cb) RegisterNUICallback('closeLicense', function(data, cb)
debugPrint("NUI Callback: closeLicense") debugPrint("NUI Callback: closeLicense")
closeLicense() closeLicense()
@ -642,7 +688,7 @@ RegisterNUICallback('takePicture', function(data, cb)
end end
end) end)
-- Commands -- COMMANDS
RegisterCommand(Config.Commands.license.name, function() RegisterCommand(Config.Commands.license.name, function()
debugPrint("Command ausgeführt: " .. Config.Commands.license.name) debugPrint("Command ausgeführt: " .. Config.Commands.license.name)
openLicenseMenu() openLicenseMenu()
@ -674,7 +720,7 @@ RegisterCommand('pass', function()
showMyLicense('passport') showMyLicense('passport')
end, false) end, false)
-- Keybinds -- KEYBINDS
if Config.Keybinds.open_license_menu then if Config.Keybinds.open_license_menu then
RegisterKeyMapping(Config.Commands.license.name, Config.Keybinds.open_license_menu.description, 'keyboard', Config.Keybinds.open_license_menu.key) RegisterKeyMapping(Config.Commands.license.name, Config.Keybinds.open_license_menu.description, 'keyboard', Config.Keybinds.open_license_menu.key)
end end
@ -698,7 +744,7 @@ CreateThread(function()
end end
end) end)
-- Cleanup und Initialisierung -- CLEANUP UND INITIALISIERUNG
AddEventHandler('onResourceStop', function(resourceName) AddEventHandler('onResourceStop', function(resourceName)
if GetCurrentResourceName() == resourceName then if GetCurrentResourceName() == resourceName then
if isLicenseShowing then if isLicenseShowing then
@ -715,7 +761,7 @@ end)
AddEventHandler('onResourceStart', function(resourceName) AddEventHandler('onResourceStart', function(resourceName)
if GetCurrentResourceName() == resourceName then if GetCurrentResourceName() == resourceName then
debugPrint("License-System Client gestartet") debugPrint("License-System Client gestartet (Event-basiert)")
-- Warten bis QBCore geladen ist -- Warten bis QBCore geladen ist
while not QBCore do while not QBCore do
@ -748,3 +794,73 @@ CreateThread(function()
debugPrint("Spieler ist aktiv - System bereit") debugPrint("Spieler ist aktiv - System bereit")
end) end)
-- Zusätzliche Utility-Funktionen
local function requestLicenseWithTimeout(eventName, targetId, timeout)
timeout = timeout or 5000
local requestId = math.random(1000, 9999)
pendingRequests[requestId] = {
timestamp = GetGameTimer(),
timeout = timeout
}
debugPrint("Sende Request mit Timeout: " .. eventName .. " (ID: " .. requestId .. ")")
TriggerServerEvent(eventName, targetId, requestId)
-- Timeout-Handler
CreateThread(function()
Wait(timeout)
if pendingRequests[requestId] then
pendingRequests[requestId] = nil
debugPrint("^1Request Timeout: " .. eventName .. " (ID: " .. requestId .. ")^7")
showNotification('Anfrage-Timeout! Versuche es erneut.', 'error')
end
end)
return requestId
end
-- Erweiterte Error-Handling
local function safeExecute(func, errorMessage)
local success, error = pcall(func)
if not success then
debugPrint("^1Fehler: " .. (errorMessage or "Unbekannter Fehler") .. "^7")
debugPrint("^1Details: " .. tostring(error) .. "^7")
showNotification('Ein Fehler ist aufgetreten!', 'error')
end
return success
end
-- Performance-Monitoring
local performanceStats = {
menuOpens = 0,
licenseShows = 0,
errors = 0
}
CreateThread(function()
while true do
Wait(60000) -- Jede Minute
if Config.Debug then
debugPrint("=== Performance Stats ===")
debugPrint("Menü-Öffnungen: " .. performanceStats.menuOpens)
debugPrint("Lizenz-Anzeigen: " .. performanceStats.licenseShows)
debugPrint("Fehler: " .. performanceStats.errors)
end
end
end)
-- Stats aktualisieren
local originalOpenLicenseMenu = openLicenseMenu
openLicenseMenu = function()
performanceStats.menuOpens = performanceStats.menuOpens + 1
return originalOpenLicenseMenu()
end
local originalShowLicense = showLicense
showLicense = function(licenseData)
performanceStats.licenseShows = performanceStats.licenseShows + 1
return originalShowLicense(licenseData)
end

View file

@ -10,16 +10,6 @@ local function debugPrint(message)
end end
end end
local function safeCallback(cb, ...)
if cb and type(cb) == "function" then
cb(...)
return true
else
debugPrint("^1FEHLER: Callback ist keine Funktion! Typ: " .. type(cb) .. "^7")
return false
end
end
local function formatDate(timestamp) local function formatDate(timestamp)
if not timestamp then return nil end if not timestamp then return nil end
return os.date("%d.%m.%Y", timestamp) return os.date("%d.%m.%Y", timestamp)
@ -165,19 +155,16 @@ local function getIssuerName(citizenid, callback)
end) end)
end end
-- Callbacks -- EVENT: Einzelne Lizenz abrufen
QBCore.Functions.CreateCallback('license-system:server:getLicense', function(source, cb, targetId) RegisterNetEvent('license-system:server:requestLicense', function(targetId)
debugPrint("getLicense Callback - Source: " .. source .. ", Target: " .. tostring(targetId)) local src = source
debugPrint("=== Event: requestLicense ===")
if not cb or type(cb) ~= "function" then debugPrint("Source: " .. src .. ", Target: " .. tostring(targetId))
debugPrint("^1FEHLER: Ungültiger Callback in getLicense!^7")
return
end
local TargetPlayer = QBCore.Functions.GetPlayer(targetId) local TargetPlayer = QBCore.Functions.GetPlayer(targetId)
if not TargetPlayer then if not TargetPlayer then
debugPrint("^1Ziel-Spieler nicht gefunden: " .. tostring(targetId) .. "^7") debugPrint("^1Ziel-Spieler nicht gefunden: " .. tostring(targetId) .. "^7")
safeCallback(cb, nil) TriggerClientEvent('license-system:client:receiveLicense', src, nil)
return return
end end
@ -209,27 +196,26 @@ QBCore.Functions.CreateCallback('license-system:server:getLicense', function(sou
} }
} }
safeCallback(cb, licenseData) debugPrint("Sende Lizenz-Daten an Client")
TriggerClientEvent('license-system:client:receiveLicense', src, licenseData)
end) end)
else else
debugPrint("Keine aktive Lizenz gefunden für: " .. citizenid) debugPrint("Keine aktive Lizenz gefunden für: " .. citizenid)
safeCallback(cb, nil) TriggerClientEvent('license-system:client:receiveLicense', src, nil)
end end
end) end)
end) end)
QBCore.Functions.CreateCallback('license-system:server:getMyLicense', function(source, cb, licenseType) -- EVENT: Eigene Lizenz abrufen
debugPrint("getMyLicense Callback - Source: " .. source .. ", Typ: " .. tostring(licenseType)) RegisterNetEvent('license-system:server:requestMyLicense', function(licenseType)
local src = source
debugPrint("=== Event: requestMyLicense ===")
debugPrint("Source: " .. src .. ", LicenseType: " .. tostring(licenseType))
if not cb or type(cb) ~= "function" then local Player = QBCore.Functions.GetPlayer(src)
debugPrint("^1FEHLER: Ungültiger Callback in getMyLicense!^7")
return
end
local Player = QBCore.Functions.GetPlayer(source)
if not Player then if not Player then
debugPrint("^1Spieler nicht gefunden: " .. source .. "^7") debugPrint("^1Spieler nicht gefunden: " .. src .. "^7")
safeCallback(cb, nil) TriggerClientEvent('license-system:client:receiveMyLicense', src, nil, licenseType)
return return
end end
@ -262,73 +248,71 @@ QBCore.Functions.CreateCallback('license-system:server:getMyLicense', function(s
} }
} }
safeCallback(cb, licenseData) debugPrint("Sende eigene Lizenz-Daten an Client")
TriggerClientEvent('license-system:client:receiveMyLicense', src, licenseData, licenseType)
end) end)
else else
debugPrint("Keine eigene Lizenz vom Typ " .. licenseType .. " gefunden") debugPrint("Keine eigene Lizenz vom Typ " .. licenseType .. " gefunden")
safeCallback(cb, nil) TriggerClientEvent('license-system:client:receiveMyLicense', src, nil, licenseType)
end end
end) end)
end) end)
QBCore.Functions.CreateCallback('license-system:server:getPlayerLicenses', function(source, cb, targetId) -- EVENT: Alle Spieler-Lizenzen abrufen
debugPrint("getPlayerLicenses Callback - Source: " .. source .. ", Target: " .. tostring(targetId)) RegisterNetEvent('license-system:server:requestPlayerLicenses', function(targetId)
local src = source
if not cb or type(cb) ~= "function" then debugPrint("=== Event: requestPlayerLicenses ===")
debugPrint("^1FEHLER: Ungültiger Callback in getPlayerLicenses!^7") debugPrint("Source: " .. src .. ", Target: " .. tostring(targetId))
return
end
local TargetPlayer = QBCore.Functions.GetPlayer(targetId) local TargetPlayer = QBCore.Functions.GetPlayer(targetId)
if not TargetPlayer then if not TargetPlayer then
debugPrint("^1Ziel-Spieler nicht gefunden: " .. tostring(targetId) .. "^7") debugPrint("^1Ziel-Spieler nicht gefunden: " .. tostring(targetId) .. "^7")
safeCallback(cb, {}) TriggerClientEvent('license-system:client:receivePlayerLicenses', src, {}, targetId, "Unbekannt")
return return
end end
local citizenid = TargetPlayer.PlayerData.citizenid local citizenid = TargetPlayer.PlayerData.citizenid
local targetName = TargetPlayer.PlayerData.charinfo.firstname .. ' ' .. TargetPlayer.PlayerData.charinfo.lastname
debugPrint("Suche alle Lizenzen für CitizenID: " .. citizenid) debugPrint("Suche alle Lizenzen für CitizenID: " .. citizenid)
MySQL.Async.fetchAll('SELECT * FROM player_licenses WHERE citizenid = ? ORDER BY created_at DESC', { MySQL.Async.fetchAll('SELECT * FROM player_licenses WHERE citizenid = ? ORDER BY created_at DESC', {
citizenid citizenid
}, function(result) }, function(result)
if result then local licenses = result or {}
debugPrint("Gefundene Lizenzen: " .. #result) debugPrint("Gefundene Lizenzen: " .. #licenses)
-- Spieler-Daten zu jeder Lizenz hinzufügen -- Spieler-Daten zu jeder Lizenz hinzufügen
for i, license in ipairs(result) do for i, license in ipairs(licenses) do
license.name = TargetPlayer.PlayerData.charinfo.firstname .. ' ' .. TargetPlayer.PlayerData.charinfo.lastname license.name = TargetPlayer.PlayerData.charinfo.firstname .. ' ' .. TargetPlayer.PlayerData.charinfo.lastname
license.birthday = TargetPlayer.PlayerData.charinfo.birthdate license.birthday = TargetPlayer.PlayerData.charinfo.birthdate
license.gender = TargetPlayer.PlayerData.charinfo.gender license.gender = TargetPlayer.PlayerData.charinfo.gender
license.issued_by_name = 'System' -- Wird später durch echten Namen ersetzt license.issued_by_name = 'System' -- Wird später durch echten Namen ersetzt
end
safeCallback(cb, result) debugPrint("Lizenz " .. i .. ": " .. license.license_type .. " (Aktiv: " .. tostring(license.is_active) .. ")")
else
debugPrint("Keine Lizenzen gefunden")
safeCallback(cb, {})
end end
debugPrint("Sende " .. #licenses .. " Lizenzen an Client")
TriggerClientEvent('license-system:client:receivePlayerLicenses', src, licenses, targetId, targetName)
end) end)
end) end)
QBCore.Functions.CreateCallback('license-system:server:canIssueLicense', function(source, cb, licenseType) -- EVENT: Berechtigung prüfen
debugPrint("canIssueLicense Callback - Source: " .. source .. ", Typ: " .. tostring(licenseType)) RegisterNetEvent('license-system:server:checkPermission', function(licenseType)
local src = source
debugPrint("=== Event: checkPermission ===")
debugPrint("Source: " .. src .. ", LicenseType: " .. tostring(licenseType))
if not cb or type(cb) ~= "function" then local hasAuth = hasPermission(src, licenseType)
debugPrint("^1FEHLER: Ungültiger Callback in canIssueLicense!^7")
return
end
local hasAuth = hasPermission(source, licenseType)
debugPrint("Berechtigung für Lizenz " .. licenseType .. ": " .. tostring(hasAuth)) debugPrint("Berechtigung für Lizenz " .. licenseType .. ": " .. tostring(hasAuth))
safeCallback(cb, hasAuth) TriggerClientEvent('license-system:client:receivePermission', src, hasAuth, licenseType)
end) end)
-- Events -- EVENT: Lizenz ausstellen
RegisterNetEvent('license-system:server:issueLicense', function(targetId, licenseType, classes) RegisterNetEvent('license-system:server:issueLicense', function(targetId, licenseType, classes)
local src = source local src = source
debugPrint("Event: issueLicense - Von: " .. src .. ", Für: " .. targetId .. ", Typ: " .. licenseType) debugPrint("=== Event: issueLicense ===")
debugPrint("Von: " .. src .. ", Für: " .. targetId .. ", Typ: " .. licenseType)
local Player = QBCore.Functions.GetPlayer(src) local Player = QBCore.Functions.GetPlayer(src)
local TargetPlayer = QBCore.Functions.GetPlayer(targetId) local TargetPlayer = QBCore.Functions.GetPlayer(targetId)
@ -384,6 +368,9 @@ RegisterNetEvent('license-system:server:issueLicense', function(targetId, licens
TriggerClientEvent('QBCore:Notify', src, Config.Notifications.license_granted.message, Config.Notifications.license_granted.type) TriggerClientEvent('QBCore:Notify', src, Config.Notifications.license_granted.message, Config.Notifications.license_granted.type)
TriggerClientEvent('QBCore:Notify', targetId, 'Du hast eine neue ' .. licenseConfig.label .. ' erhalten!', 'success') TriggerClientEvent('QBCore:Notify', targetId, 'Du hast eine neue ' .. licenseConfig.label .. ' erhalten!', 'success')
-- Client über erfolgreiche Ausstellung informieren
TriggerClientEvent('license-system:client:licenseIssued', src, targetId, licenseType)
-- Log erstellen -- Log erstellen
debugPrint(Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname .. ' hat ' .. TargetPlayer.PlayerData.charinfo.firstname .. ' ' .. TargetPlayer.PlayerData.charinfo.lastname .. ' eine ' .. licenseConfig.label .. ' ausgestellt') debugPrint(Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname .. ' hat ' .. TargetPlayer.PlayerData.charinfo.firstname .. ' ' .. TargetPlayer.PlayerData.charinfo.lastname .. ' eine ' .. licenseConfig.label .. ' ausgestellt')
else else
@ -391,9 +378,11 @@ RegisterNetEvent('license-system:server:issueLicense', function(targetId, licens
end end
end) end)
-- EVENT: Lizenz entziehen
RegisterNetEvent('license-system:server:revokeLicense', function(targetId, licenseType) RegisterNetEvent('license-system:server:revokeLicense', function(targetId, licenseType)
local src = source local src = source
debugPrint("Event: revokeLicense - Von: " .. src .. ", Für: " .. targetId .. ", Typ: " .. licenseType) debugPrint("=== Event: revokeLicense ===")
debugPrint("Von: " .. src .. ", Für: " .. targetId .. ", Typ: " .. licenseType)
local Player = QBCore.Functions.GetPlayer(src) local Player = QBCore.Functions.GetPlayer(src)
local TargetPlayer = QBCore.Functions.GetPlayer(targetId) local TargetPlayer = QBCore.Functions.GetPlayer(targetId)
@ -423,6 +412,9 @@ RegisterNetEvent('license-system:server:revokeLicense', function(targetId, licen
licenseCache[TargetPlayer.PlayerData.citizenid][licenseType] = nil licenseCache[TargetPlayer.PlayerData.citizenid][licenseType] = nil
end end
-- Client über erfolgreiche Entziehung informieren
TriggerClientEvent('license-system:client:licenseRevoked', src, targetId, licenseType)
debugPrint(Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname .. ' hat ' .. TargetPlayer.PlayerData.charinfo.firstname .. ' ' .. TargetPlayer.PlayerData.charinfo.lastname .. ' die ' .. (Config.LicenseTypes[licenseType] and Config.LicenseTypes[licenseType].label or licenseType) .. ' entzogen') debugPrint(Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname .. ' hat ' .. TargetPlayer.PlayerData.charinfo.firstname .. ' ' .. TargetPlayer.PlayerData.charinfo.lastname .. ' die ' .. (Config.LicenseTypes[licenseType] and Config.LicenseTypes[licenseType].label or licenseType) .. ' entzogen')
else else
TriggerClientEvent('QBCore:Notify', src, 'Keine aktive Lizenz gefunden!', 'error') TriggerClientEvent('QBCore:Notify', src, 'Keine aktive Lizenz gefunden!', 'error')
@ -430,9 +422,11 @@ RegisterNetEvent('license-system:server:revokeLicense', function(targetId, licen
end) end)
end) end)
-- EVENT: Foto speichern
RegisterNetEvent('license-system:server:savePhoto', function(citizenid, photoData) RegisterNetEvent('license-system:server:savePhoto', function(citizenid, photoData)
local src = source local src = source
debugPrint("Event: savePhoto für CitizenID: " .. citizenid) debugPrint("=== Event: savePhoto ===")
debugPrint("CitizenID: " .. citizenid)
local Player = QBCore.Functions.GetPlayer(src) local Player = QBCore.Functions.GetPlayer(src)
if not Player then return end if not Player then return end
@ -537,7 +531,7 @@ end)
-- Resource Start/Stop Events -- Resource Start/Stop Events
AddEventHandler('onResourceStart', function(resourceName) AddEventHandler('onResourceStart', function(resourceName)
if GetCurrentResourceName() == resourceName then if GetCurrentResourceName() == resourceName then
debugPrint("License-System Server gestartet") debugPrint("License-System Server gestartet (Event-basiert)")
-- Datenbank-Tabelle erstellen falls nicht vorhanden -- Datenbank-Tabelle erstellen falls nicht vorhanden
MySQL.Async.execute([[ MySQL.Async.execute([[