1
0
Fork 0
forked from Simnation/Main
Main/resources/[Developer]/[Nordi]/0r-rccar/server/main.lua
2025-06-07 08:51:21 +02:00

604 lines
No EOL
20 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)