162 lines
5.0 KiB
Lua
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)
|