2026-04-14 15:54:53 +02:00

162 lines
5.0 KiB
Lua

ESX = exports['es_extended']:getSharedObject()
-- =====================
-- HELPERS
-- =====================
local function GetIdentifier(source)
local xPlayer = ESX.GetPlayerFromId(source)
if not xPlayer then return nil end
return xPlayer.getIdentifier()
end
-- =====================
-- ITEM REGISTRATION
-- =====================
for itemName, itemConfig in pairs(Config.Items) do
ESX.RegisterUsableItem(itemName, function(playerId)
TriggerClientEvent('mercyv-id:useItem', playerId, itemName, itemConfig.type)
end)
end
-- =====================
-- SERVER CALLBACK: SPIELERDATEN + LIZENZEN
-- =====================
ESX.RegisterServerCallback('mercyv-id:getPlayerData', function(source, cb, targetIdentifier)
local identifier = targetIdentifier
if not identifier then
identifier = GetIdentifier(source)
end
if not identifier then
print('[mercyv-id] FEHLER: Kein Identifier fuer Source ' .. tostring(source))
return cb(nil)
end
print('[mercyv-id] Lade Daten fuer: ' .. identifier)
-- Spielerdaten abfragen
local userData = MySQL.query.await(
'SELECT firstname, lastname, dateofbirth, sex, nationality, ssn, photo, phone_number, job, job_grade FROM users WHERE identifier = ?',
{ identifier }
)
if not userData or #userData == 0 then
print('[mercyv-id] FEHLER: Keine Userdaten gefunden fuer: ' .. identifier)
return cb(nil)
end
-- Lizenzen aus user_licenses (ESX Standard: drive, dmv, boat, etc.)
local licenses = MySQL.query.await(
'SELECT ul.type, l.label FROM user_licenses ul LEFT JOIN licenses l ON ul.type = l.type WHERE ul.owner = ?',
{ identifier }
) or {}
-- Lizenzen aus mercyv_shop_licenses (Waffenlizenz etc. aus dem Shop)
local shopLicenses = MySQL.query.await(
'SELECT license_name FROM mercyv_shop_licenses WHERE identifier = ?',
{ identifier }
) or {}
for _, sl in ipairs(shopLicenses) do
-- Pruefen ob nicht schon in der Liste
local found = false
for _, lic in ipairs(licenses) do
if lic.type == sl.license_name then
found = true
break
end
end
if not found then
licenses[#licenses + 1] = {
type = sl.license_name,
label = sl.license_name,
}
end
end
print('[mercyv-id] Gefunden: ' .. #licenses .. ' Lizenzen fuer ' .. identifier)
cb({
firstname = userData[1].firstname or '',
lastname = userData[1].lastname or '',
dateofbirth = userData[1].dateofbirth or '',
sex = userData[1].sex or '',
nationality = userData[1].nationality or '',
ssn = userData[1].ssn or '',
photo = userData[1].photo or '',
phone_number = userData[1].phone_number or '',
job = userData[1].job or '',
job_grade = userData[1].job_grade or 0,
licenses = licenses or {},
})
end)
-- =====================
-- LIZENZ-CHECK: Hat der Spieler die noetige Lizenz?
-- =====================
-- Welche Lizenzen fuer welchen Kartentyp benoetigt werden
local requiredLicenses = {
license = { 'drive', 'drivedmv', 'drive_bike', 'drive_bikedmv', 'drive_truck', 'drive_truckdmv', 'dmv', 'boat' },
weapon = { 'weaponlicense' },
-- id = nil -> Personalausweis braucht keine Lizenz
}
ESX.RegisterServerCallback('mercyv-id:hasLicense', function(source, cb, cardType)
local required = requiredLicenses[cardType]
if not required then
-- Personalausweis braucht keine Lizenz
return cb(true)
end
local identifier = GetIdentifier(source)
if not identifier then return cb(false) end
-- user_licenses pruefen
local esxLicenses = MySQL.query.await(
'SELECT type FROM user_licenses WHERE owner = ?',
{ identifier }
) or {}
for _, lic in ipairs(esxLicenses) do
for _, req in ipairs(required) do
if lic.type == req then
return cb(true)
end
end
end
-- mercyv_shop_licenses pruefen
local shopLicenses = MySQL.query.await(
'SELECT license_name FROM mercyv_shop_licenses WHERE identifier = ?',
{ identifier }
) or {}
for _, sl in ipairs(shopLicenses) do
for _, req in ipairs(required) do
if sl.license_name == req then
return cb(true)
end
end
end
cb(false)
end)
-- =====================
-- AUSWEIS AN NAHE SPIELER ZEIGEN
-- =====================
RegisterNetEvent('mercyv-id:showToNearby')
AddEventHandler('mercyv-id:showToNearby', function(cardData, cardType, nearbyPlayerIds)
local source = source
local xPlayer = ESX.GetPlayerFromId(source)
if not xPlayer then return end
local senderName = (cardData.firstname or '') .. ' ' .. (cardData.lastname or '')
for _, targetId in ipairs(nearbyPlayerIds) do
if targetId ~= source then
TriggerClientEvent('mercyv-id:receiveCard', targetId, cardData, cardType, senderName)
end
end
end)