PlayerList = {} GunshotList = {} RegisterNetEvent('alizadev-fingerprint:server:gunshot') AddEventHandler('alizadev-fingerprint:server:gunshot', function(data) if data == true then if not GunshotList[source] then GunshotList[source] = true end else if GunshotList[source] then GunshotList[source] = nil end end end) Framework.RegisterUsableItem(Config.Item, function(playerId) TriggerClientEvent('alizadev-fingerprint:client:openMenu', playerId) end) Framework.RegisterServerCallback('alizadev-fingerprint:server:getPlayerList', function(source, cb) return cb(PlayerList) end) Framework.RegisterServerCallback('alizadev-fingerprint:server:wantedList', function(source, cb) return cb(GetWanteds()) end) Framework.RegisterServerCallback('alizadev-fingerprint:server:historyList', function(source, cb) return cb(GetHistory()) end) RegisterNetEvent('alizadev-fingerprint:server:requestScan') AddEventHandler('alizadev-fingerprint:server:requestScan', function(src, target) TriggerClientEvent('alizadev-fingerprint:server:requestScan', target, src) end) RegisterNetEvent('alizadev-fingerprint:server:cancelScan') AddEventHandler('alizadev-fingerprint:server:cancelScan', function(x) TriggerClientEvent('alizadev-fingerprint:client:cancelScan', x) end) RegisterNetEvent('alizadev-fingerprint:server:refuse') AddEventHandler('alizadev-fingerprint:server:refuse', function(x) TriggerClientEvent('alizadev-fingerprint:client:refuse', x) end) RegisterNetEvent('alizadev-fingerprint:server:allowShareMyData') AddEventHandler('alizadev-fingerprint:server:allowShareMyData', function(target, src) player = {} local xPlayer = Framework.GetPlayer(target) player.id = target player.name = xPlayer.name player.bank = xPlayer.bank player.dateofbirth = xPlayer.birthdate or '00-00-0000' player.gender = (xPlayer.gender == 0 and Config.Locales['male'] or Config.Locales['female']) player.identifier = xPlayer.identifier player.wanted = (IsPlayerWanted(player.identifier) and Config.Locales['wanted_status_yes'] or Config.Locales['wanted_status_no']) player.gunshot = GunshotList[target] and Config.Locales['gunshot_found'] or Config.Locales['gunshot_not_found'] if Framework.F == 'ESX' then data = MySQL.Sync.fetchAll("SELECT dateofbirth, sex FROM `users` WHERE identifier = '"..player.identifier.."' ") or {} if data[1] then player.dateofbirth = data[1].dateofbirth player.gender = (data[1].sex == 'm' and Config.Locales['male'] or Config.Locales['female']) end end TriggerClientEvent('alizadev-fingerprint:client:scanResult', src, player) local yPlayer = Framework.GetPlayer(src) local history = GetHistory() player.added_who = yPlayer.name player.added_time = os.date("%Y-%m-%d %H:%M:%S", os.time()) or '00-00-0000' player.uniq = math.random(100000000, 999999999) table.insert(history, player) SaveFile("datastore/history.json", history) end) RegisterNetEvent('alizadev-fingerprint:server:addToWanted') AddEventHandler('alizadev-fingerprint:server:addToWanted', function(data) wantedD = data local src = source local xPlayer = Framework.GetPlayer(src) wantedD.added_who = xPlayer.name wantedD.added_time = os.date("%Y-%m-%d %H:%M:%S", os.time()) or '00-00-0000' if not IsPlayerWanted(wantedD.identifier) then local wantedList = GetWanteds() table.insert(wantedList, wantedD) SaveFile("datastore/wanted.json", wantedList) else TriggerClientEvent('alizadev-fingerprint:client:notify', src, Config.Locales['menu_title'], Config.Locales['already_wanted'], "error") end end) RegisterNetEvent('alizadev-fingerprint:server:removeWanted') AddEventHandler('alizadev-fingerprint:server:removeWanted', function(data) local src = source local wantedList = GetWanteds() for k, v in pairs(wantedList) do if v.identifier == data.identifier then table.remove(wantedList, k) SaveFile("datastore/wanted.json", wantedList) TriggerClientEvent('alizadev-fingerprint:client:notify', src, Config.Locales['menu_title'], Config.Locales['removed_from_wanted'], "success") end end end) -- Helper functions remain the same IsPlayerWanted = function(identifier) local wantedList = GetWanteds() if wantedList == {} or wantedList == nil then return false end for k, v in pairs(wantedList) do if v.identifier == identifier then return true end end return false end GetHistory = function() return LoadFile("datastore/history.json") or {} end GetWanteds = function() return LoadFile("datastore/wanted.json") or {} end LoadFile = function(file) local file = file local data = LoadResourceFile(GetCurrentResourceName(), file) if data == nil or data == "" then print("[WARNING] File not found! Please make sure you have a "..file.." file in the data folder.") return nil end return json.decode(data) end SaveFile = function(file, data) local file = file local data = json.encode(data) SaveResourceFile(GetCurrentResourceName(), file, data, -1) end OnPlayerLoaded = function(src) if not src then src = source end local xPlayer = Framework.GetPlayer(src) if not CheckHavePlayer(src) then table.insert(PlayerList, { id = src, name = xPlayer.name, identifier = xPlayer.identifier }) end end CheckHavePlayer = function(src) for k, v in pairs(PlayerList) do if v.id == src then return true end end return false end AddEventHandler('playerDropped', function (reason) local source = source for k, v in pairs(PlayerList) do if v.id == source then table.remove(PlayerList, k) end end end) RegisterNetEvent('esx:playerLoaded') AddEventHandler('esx:playerLoaded', OnPlayerLoaded) RegisterNetEvent('QBCore:Client:OnPlayerLoaded') AddEventHandler('QBCore:Client:OnPlayerLoaded', function(player) OnPlayerLoaded(player.PlayerData.source) end) RegisterNetEvent('alizadev-fingerprint:server:request') AddEventHandler('alizadev-fingerprint:server:request', OnPlayerLoaded) if Config.CleanHistoryAfterRestart == true then Citizen.CreateThread(function() SaveFile("datastore/history.json", {}) end) end