CoreName = nil local function GetPlayer(source) if CoreName == 'qb-core' then return QBCore.Functions.GetPlayer(source) elseif CoreName == 'qbx_core' then return QBX:GetPlayer(source) elseif CoreName == 'es_extended' then return ESX.GetPlayerFromId(source) end end function GetIdentifier(source) local Player = GetPlayer(source) local Identifier = nil if CoreName == 'qb-core' then Identifier = Player.PlayerData.citizenid elseif CoreName == 'qbx_core' then Identifier = Player.PlayerData.citizenid elseif CoreName == 'es_extended' then Identifier = Player.getIdentifier() end return Identifier end local function GetBatteryLevel(serie) local battery = 0 local result = ExecuteSql("SELECT battery FROM 0r_rccar WHERE serieNumber = '"..serie.."'") if result[1] then battery = result[1].battery end return battery end if GetResourceState('qb-core') == 'started' and Config.Framework == 'qb-core' then QBCore = exports['qb-core']:GetCoreObject() CoreName = 'qb-core' elseif GetResourceState('qbx_core') == 'started' and Config.Framework == 'qbx_core' then QBX = exports['qbx_core'] CoreName = 'qbx_core' elseif GetResourceState('es_extended') == 'started' and Config.Framework == 'es_extended' then ESX = exports['es_extended']:getSharedObject() CoreName = 'es_extended' end Citizen.CreateThread(function() if CoreName == 'qb-core' then for k, v in pairs(Config.RCCars) do QBCore.Functions.CreateUseableItem(v.item.name, function(source, item) local metadata = Config.Inventory == 'ox_inventory' and item.metadata or item.info if GetBatteryLevel(metadata.serie) > Config.MinimumBattery then local data = { item = { type = v.item.type, price = v.item.price, prop = v.item.prop, label = v.item.label, name = v.item.name, category = v.item.category, description = v.item.description, }, vehicle = { prop = v.vehicle.prop, istatistics = v.vehicle.istatistics, }, jobs = v.jobs, info = metadata, } if v.jobs ~= 'all' then local Player = QBCore.Functions.GetPlayer(source) if Player ~= nil then local PlayerJob = Player.PlayerData.job.name if v.jobs[PlayerJob] then TriggerClientEvent('0r-rccar:client:useRcCar', source, data) else TriggerClientEvent('QBCore:Notify', source, Locales[Config.Locale].LUA['no_authorization'], 'error') end end else TriggerClientEvent('0r-rccar:client:useRcCar', source, data) end else TriggerClientEvent('QBCore:Notify', source, Locales[Config.Locale].LUA['no_battery'], 'error') end end) end elseif CoreName == 'qbx_core' then for k, v in pairs(Config.RCCars) do QBX:CreateUseableItem(v.item.name, function(source, item) if GetBatteryLevel(item.metadata.serie) > Config.MinimumBattery then local data = { item = { type = v.item.type, price = v.item.price, prop = v.item.prop, label = v.item.label, name = v.item.name, category = v.item.category, description = v.item.description, }, vehicle = { prop = v.vehicle.prop, istatistics = v.vehicle.istatistics, }, jobs = v.jobs, info = item.metadata, } if v.jobs ~= 'all' then local Player = QBX:GetPlayer(source) if Player ~= nil then local PlayerJob = Player.PlayerData.job.name if v.jobs[PlayerJob] then TriggerClientEvent('0r-rccar:client:useRcCar', source, data) else QBX:Notify(source, Locales[Config.Locale].LUA['no_authorization'], 'error') end end else TriggerClientEvent('0r-rccar:client:useRcCar', source, data) end else QBX:Notify(source, Locales[Config.Locale].LUA['no_battery'], 'error') end end) end elseif CoreName == 'es_extended' then for k, v in pairs(Config.RCCars) do ESX.RegisterUsableItem(v.item.name, function(source, item, itemData) if GetBatteryLevel(itemData.metadata.serie) > Config.MinimumBattery then local data = { item = { type = v.item.type, price = v.item.price, prop = v.item.prop, label = v.item.label, name = v.item.name, category = v.item.category, description = v.item.description, }, vehicle = { prop = v.vehicle.prop, istatistics = v.vehicle.istatistics, }, jobs = v.jobs, info = itemData.metadata, } if v.jobs ~= 'all' then local Player = ESX.GetPlayerFromId(source) if Player ~= nil then local PlayerJob = Player.job.name if v.jobs[PlayerJob] then TriggerClientEvent('0r-rccar:client:useRcCar', source, data) else TriggerClientEvent("esx:showNotification", source, Locales[Config.Locale].LUA['no_authorization'], "error") end end else TriggerClientEvent('0r-rccar:client:useRcCar', source, data) end else TriggerClientEvent("esx:showNotification", source, Locales[Config.Locale].LUA['no_battery'], "error") end end) end end end) lib.callback.register('0r-rccar:server:scanPlayer', function(source, netId) local ped = NetworkGetEntityFromNetworkId(netId) local src = NetworkGetEntityOwner(ped) local Player = GetPlayer(src) if CoreName == 'qb-core' then if Player then local Data = { name = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname, birthDate = Player.PlayerData.charinfo.birthdate, } return Data end elseif CoreName == 'qbx_core' then if Player then local Data = { name = Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname, birthDate = Player.PlayerData.charinfo.birthdate, } return Data end elseif CoreName == 'es_extended' then if Player then local Data = { name = Player.getName(), birthDate = Player.variables.dateofbirth, } return Data end end end) lib.callback.register('0r-rccar:server:buyCar', function(source, data) local src = source local Player = GetPlayer(source) local Job = nil if Player then if CoreName == 'qb-core' then Job = Player.PlayerData.job.name elseif CoreName == 'qbx_core' then Job = Player.PlayerData.job.name elseif CoreName == 'es_extended' then Job = Player.getJob().name end local car = nil for k, v in pairs(Config.RCCars) do if v.item.name == data.item.name then car = v break end end if car.jobs ~= 'all' and Job then for job, allowed in pairs(car.jobs) do if allowed and job == Job then if car.item.price then if CheckMoney(Player, car.item.price) then if CreateNewVehicle(src, car.item.name, 1) then RemoveMoney(Player, car.item.price) end else if CoreName == 'qb-core' then TriggerClientEvent('QBCore:Notify', src, Locales[Config.Locale].LUA['not_enough_money'], 'error') elseif CoreName == 'qbx_core' then QBX:Notify(src, Locales[Config.Locale].LUA['not_enough_money'], 'error') elseif CoreName == 'es_extended' then TriggerClientEvent("esx:showNotification", src, Locales[Config.Locale].LUA['not_enough_money'], "error") end end end break end end else if car.item.price then if CheckMoney(Player, car.item.price) then if CreateNewVehicle(src, car.item.name, 1) then RemoveMoney(Player, car.item.price) end else if CoreName == 'qb-core' then TriggerClientEvent('QBCore:Notify', src, Locales[Config.Locale].LUA['not_enough_money'], 'error') elseif CoreName == 'qbx_core' then QBX:Notify(src, Locales[Config.Locale].LUA['not_enough_money'], 'error') elseif CoreName == 'es_extended' then TriggerClientEvent("esx:showNotification", src, Locales[Config.Locale].LUA['not_enough_money'], "error") end end end end end end) lib.callback.register('0r-rccar:server:crafting', function(source, data) local src = source local Player = GetPlayer(source) local Job = nil if Player then if CoreName == 'qb-core' then Job = Player.PlayerData.job.name elseif CoreName == 'qbx_core' then Job = Player.PlayerData.job.name elseif CoreName == 'es_extended' then Job = Player.getJob().name end local craft = nil for k, v in pairs(Config.RCCrafts) do if v.item.name == data.item.name then craft = v break end end if craft.jobs ~= 'all' and Job then for job, allowed in pairs(craft.jobs) do if allowed and job == Job then if GetItemsCount(src, craft.resources) then if not RemoveItem(src, k, v) then return false end end break end end else if GetItemsCount(src, craft.resources) then if not RemoveItem(src, craft.resources) then return false end end end return true end end) lib.callback.register('0r-rccar:server:getItemCount', function(source, resources) local src = source local Player = GetPlayer(source) if Player then local resourcesCount = {} for k, v in pairs(resources) do local itemData = GetItemByName(src, k) if itemData and itemData ~= '[]' then table.insert(resourcesCount, { name = itemData.name, count = itemData.count or itemData.amount or 0 }) end end return resourcesCount end end) lib.callback.register('0r-rccar:server:craftingFinish', function(source, data) local src = source local Player = GetPlayer(source) local Job = nil if Player then if CoreName == 'qb-core' then Job = Player.PlayerData.job.name elseif CoreName == 'qbx_core' then Job = Player.PlayerData.job.name elseif CoreName == 'es_extended' then Job = Player.getJob().name end local craft = nil for k, v in pairs(Config.RCCrafts) do if v.item.name == data.item.name then craft = v break end end if craft.jobs ~= 'all' and Job then for job, allowed in pairs(craft.jobs) do if allowed and job == Job then if AddItem(src, craft.item.name, 1, false, nil, false) then return true end break end end else if AddItem(src, craft.item.name, 1, false, nil, false) then return true end end return false end end) lib.callback.register('0r-rccar:server:getBatteryLevel', function(source, data) local src = source local Player = GetPlayer(source) if Player then return GetBatteryLevel(data.info.serie) end end) lib.callback.register('0r-rccar:server:getActivePlugins', function(source, data) local src = source local Player = GetPlayer(source) local extensions = {} if Player then local result = ExecuteSql("SELECT extensions FROM 0r_rccar WHERE serieNumber = '"..data.info.serie.."'") if result[1] then extensions = result[1].extensions end return extensions end end) lib.callback.register('0r-rccar:server:getNewExtensions', function(source, data) local src = source local Player = GetPlayer(source) local extensions = {} if Player then for k, v in pairs(Config.RCCrafts) do if GetItemCount(src, v.item.name, 1) then if v.jobs == 'all' then table.insert(extensions, v) else if v.jobs[Player.PlayerData.job.name] then table.insert(extensions, v) end end end end return extensions end end) lib.callback.register('0r-rccar:server:addExtension', function(source, data, target) local src = source local Player = GetPlayer(source) local newTarget = { name = target.item.name, label = target.item.label, description = target.item.description, } if Player then local result = ExecuteSql("SELECT extensions FROM 0r_rccar WHERE serieNumber = '"..data.info.serie.."'") if result[1] and GetItemCount(src, newTarget.name, 1) then local extensions = json.decode(result[1].extensions) local newExtensions = {} local alreadyExists = false if extensions then for k, v in pairs(extensions) do if v.name == newTarget.name then alreadyExists = true break end table.insert(newExtensions, v) end end if alreadyExists then TriggerClientEvent('QBCore:Notify', src, "Bu uzantı zaten eklenmiş!", "error") return false end table.insert(newExtensions, newTarget) ExecuteSql("UPDATE 0r_rccar SET extensions = '"..json.encode(newExtensions).."' WHERE serieNumber = '"..data.info.serie.."'") RemoveItem(src, target.item.name, 1) TriggerClientEvent('0r-rccar:client:refreshExtension', src, newExtensions) return true end end end) lib.callback.register('0r-rccar:server:removeExtension', function(source, data, target) local src = source local Player = GetPlayer(source) if Player then local result = ExecuteSql("SELECT extensions FROM 0r_rccar WHERE serieNumber = '"..data.info.serie.."'") if result[1] then local extensions = json.decode(result[1].extensions) local newExtensions = {} for k, v in pairs(extensions) do if v.name ~= target.name then table.insert(newExtensions, v) end end ExecuteSql("UPDATE 0r_rccar SET extensions = '"..json.encode(newExtensions).."' WHERE serieNumber = '"..data.info.serie.."'") AddItem(src, target.name, 1, false, nil) TriggerClientEvent('0r-rccar:client:refreshExtension', src, newExtensions) return true end end end) lib.callback.register('0r-rccar:server:getVehicleForCharge', function(source) local src = source local Player = GetPlayer(source) local vehicles = {} if Player then if Config.Inventory == 'ox_inventory' then local playerItems = exports.ox_inventory:GetInventoryItems(source) if playerItems and playerItems[1] then for k, v in pairs(playerItems) do for x, y in pairs(Config.RCCars) do if v.name == y.item.name then table.insert(vehicles, { name = v.name, label = v.label, serie = v.metadata.serie, battery = GetBatteryLevel(v.metadata.serie) }) end end end end else for k, v in pairs(Config.RCCars) do local itemData = GetItem(src, v.item.name) if itemData and itemData ~= '[]' then for x, y in pairs(itemData) do table.insert(vehicles, { name = y.name, label = y.label, serie = y.info.serie, battery = GetBatteryLevel(y.info.serie) }) end end end end return vehicles end end) lib.callback.register('0r-rccar:server:undoChargeVehicle', function(source, serie, item, battery) local src = source local Player = GetPlayer(source) if Player then ExecuteSql("UPDATE 0r_rccar SET battery = '"..battery.."' WHERE serieNumber = '"..serie.."'") AddItem(src, item, 1, false, { serie = serie }) end end) lib.callback.register('0r-rccar:server:checkMoney', function(source, price) local src = source local Player = GetPlayer(source) if Player then if CheckMoney(Player, price) then return RemoveMoney(Player, price) else return false end end end) RegisterNetEvent('0r-rccar:server:saveVehicle') AddEventHandler('0r-rccar:server:saveVehicle', function(vehicleData, batteryLevel) local src = source local Player = GetPlayer(source) if Player then local serie = vehicleData.info.serie if Config.ChargeSystem then ExecuteSql("UPDATE 0r_rccar SET battery = '"..batteryLevel.."' WHERE serieNumber = '"..serie.."'") end end end) RegisterNetEvent('0r-rccar:server:bombVehicle') AddEventHandler('0r-rccar:server:bombVehicle', function(vehicleData) local src = source local Player = GetPlayer(source) if Player then local serie = vehicleData.info.serie ExecuteSql("DELETE FROM 0r_rccar WHERE serieNumber = '"..serie.."'") RemoveItem(src, vehicleData.item.name, 1) end end) RegisterNetEvent('0r-rccar:server:chargeVehicle') AddEventHandler('0r-rccar:server:chargeVehicle', function(serie, item) local src = source local Player = GetPlayer(source) if Player then local itemData = GetItemByName(src, item, { serie = serie }) if Config.Inventory == 'ox_inventory' then RemoveItem(src, item, 1) else if itemData.info.serie == serie then RemoveItem(src, item, 1) end end end end)