1
0
Fork 0
forked from Simnation/Main
Main/resources/[carscripts]/kq_roofboxes/server/editable/editable.lua
2025-06-07 08:51:21 +02:00

142 lines
4.3 KiB
Lua

---
Citizen.CreateThread(function()
while GetResourceState('kq_link') == 'stopped' do
print('^6[KQ_LINK MISSING] ^1kq_link is required but not running! Make sure that you\'ve got it installed and started before ' .. GetCurrentResourceName())
print('^6 View the INSTALLATION.md file to find kq_link^0')
Citizen.Wait(1000)
end
local function OnItemUse(player, item)
TriggerClientEvent('kq_roofboxes:client:place', player, item)
end
for type, item in pairs(Config.items) do
exports.kq_link:RegisterUsableItem(item, function(source)
OnItemUse(source, item)
end)
end
-- OX Inventory solution
exports('UseRoofbox', function(event, item, inventory)
if event == 'usingItem' then
local player = inventory.id
OnItemUse(player, item.name)
return true
end
end)
end)
---
function GetVehicleIdentifier(vehicle)
if not DoesEntityExist(vehicle) then
return nil
end
-- You could replace this with your custom solution for getting the vehicles
return GetVehicleNumberPlateText(vehicle) .. '-' .. GetEntityModel(vehicle)
end
function GetVehicleStashId(vehicle)
return GetVehicleIdentifier(vehicle) .. '-roofbox'
end
function CanPlayerModifyRoofboxForVehicle(player, vehicle)
local distance = #(GetEntityCoords(GetPlayerPed(player)) - GetEntityCoords(vehicle))
if distance > 6 then
return false -- Players can not modify the roofbox from more than 6 meters away from the vehicle
end
-- You may add your own logic in this function to define who can modify(add or delete) the roofboxes
return true
end
function CanPlayerRemoveVehicleRoofbox(player, vehicle)
local stashId = GetVehicleStashId(vehicle)
local stashItems = exports.kq_link:GetStashItems(stashId)
if (stashItems and table.length(stashItems or {}) > 0) then
TriggerClientEvent('kq_link:client:notify', player, L('The roofbox is not empty'), 'error')
return false
end
return true
end
function CanPlayerOpenVehicleRoofbox(player, vehicle)
local distance = #(GetEntityCoords(GetPlayerPed(player)) - GetEntityCoords(vehicle))
if distance > 5 then
return false -- Players can not open the roofbox from more than 5 meters away from the vehicle
end
-- You may add your own logic in this function to define who can modify(add or delete) the roofboxes
return true
end
--- SQL Stuff
local SQL_DRIVER = Config.sql.driver
local function SqlQuery(query, data)
if SQL_DRIVER == 'mysql' then
return MySQL.Sync.fetchAll(query, data or {})
end
if SQL_DRIVER == 'oxmysql' then
if Config.sql.newOxMysql then
return exports[SQL_DRIVER]:fetchSync(query, data or {})
end
return exports[SQL_DRIVER]:query_async(query, data or {})
else
return exports[SQL_DRIVER]:executeSync(query, data or {})
end
end
local function SqlMutate(query, data)
if SQL_DRIVER == 'mysql' then
MySQL.Sync.insert(query, data)
return
end
if SQL_DRIVER == 'oxmysql' then
exports[SQL_DRIVER]:insertSync(query, data)
else
exports[SQL_DRIVER]:executeSync(query, data)
end
end
DB = {
FetchRoofboxesFromDatabase = function()
local query = 'SELECT * FROM kq_roofboxes'
return SqlQuery(query)
end,
SaveVehicleRoofbox = function(vehicle, roofboxData)
local identifier = GetVehicleIdentifier(vehicle)
local mutation = 'INSERT INTO kq_roofboxes (`identifier`, `data`) VALUES(@identifier, @data);'
local data = {
['@identifier'] = identifier,
['@data'] = json.encode(roofboxData),
}
SqlMutate(mutation, data)
end,
DeleteVehicleRoofbox = function(vehicle)
local identifier = GetVehicleIdentifier(vehicle)
local mutation = 'DELETE FROM kq_roofboxes WHERE `identifier` = @identifier;'
local data = {
['@identifier'] = identifier,
}
SqlMutate(mutation, data)
end,
}
DB.SqlMutate = SqlMutate
DB.SqlQuery = SqlQuery