267 lines
11 KiB
Lua
Raw Normal View History

2025-04-07 01:41:12 +00:00
local config = require 'config.server'
local sharedConfig = require 'config.shared'
exports('GetDealers', function()
return sharedConfig.dealers
end)
lib.callback.register('qb-drugs:server:RequestConfig', function()
return sharedConfig.dealers
end)
RegisterNetEvent('qb-drugs:server:randomPoliceAlert', function()
local player = exports.qbx_core:GetPlayer(source)
if not player then return end
if config.policeCallChance >= math.random(1, 100) then
TriggerEvent('police:server:policeAlert', locale('info.possible_drug_dealing'), nil, player.PlayerData.source)
end
end)
RegisterNetEvent('qb-drugs:server:updateDealerItems', function(itemData, amount, dealer)
local src = source
local player = exports.qbx_core:GetPlayer(src)
if not player then return end
if sharedConfig.dealers[dealer].products[itemData.slot].amount - 1 >= 0 then
sharedConfig.dealers[dealer].products[itemData.slot].amount -= amount
TriggerClientEvent('qb-drugs:client:setDealerItems', -1, itemData, amount, dealer)
else
exports.ox_inventory:RemoveItem(src, itemData.name, amount)
player.Functions.AddMoney('cash', amount * sharedConfig.dealers[dealer].products[itemData.slot].price)
exports.qbx_core:Notify(src, locale('error.item_unavailable'), 'error')
end
end)
RegisterNetEvent('qb-drugs:server:giveDeliveryItems', function(deliveryData)
local src = source
local player = exports.qbx_core:GetPlayer(src)
if not player then return end
local item = sharedConfig.deliveryItems[deliveryData.item].item
if not item then return end
exports.ox_inventory:AddItem(src, item, deliveryData.amount)
end)
RegisterNetEvent('qb-drugs:server:successDelivery', function(deliveryData, inTime)
local src = source
local player = exports.qbx_core:GetPlayer(src)
if not player then return end
local item = sharedConfig.deliveryItems[deliveryData.item].item
local itemAmount = deliveryData.amount
local payout = deliveryData.itemData.payout * itemAmount
local copsOnline = exports.qbx_core:GetDutyCountType('leo')
local curRep = player.PlayerData.metadata.dealerrep
local invItem = exports.ox_inventory:Search(src, 'count', item)
if inTime then
if invItem and invItem.amount >= itemAmount then -- on time correct amount
exports.ox_inventory:RemoveItem(src, item, itemAmount)
if copsOnline > 0 then
local copModifier = copsOnline * config.policeDeliveryModifier
if config.useMarkedBills then
local worth = math.floor(payout * copModifier)
local metadata = { worth = worth, description = 'Value: ' .. worth }
exports.ox_inventory:AddItem(src, 'markedbills', 1, metadata)
else
player.Functions.AddMoney('cash', math.floor(payout * copModifier), 'drug-delivery')
end
else
if config.useMarkedBills then
local metadata = { worth = payout, description = 'Value: ' .. payout }
exports.ox_inventory:AddItem(src, 'markedbills', 1, metadata)
else
player.Functions.AddMoney('cash', payout, 'drug-delivery')
end
end
exports.qbx_core:Notify(src, locale('success.order_delivered'), 'success')
SetTimeout(math.random(5000, 10000), function()
TriggerClientEvent('qb-drugs:client:sendDeliveryMail', src, 'perfect', deliveryData)
player.Functions.SetMetaData('dealerrep', (curRep + config.deliveryRepGain))
end)
else
exports.qbx_core:Notify(src, locale('error.order_not_right'), 'error')-- on time incorrect amount
if invItem then
local newItemAmount = invItem.amount
local modifiedPayout = deliveryData.itemData.payout * newItemAmount
exports.ox_inventory:RemoveItem(src, item, newItemAmount)
player.Functions.AddMoney('cash', math.floor(modifiedPayout / config.wrongAmountFee))
end
SetTimeout(math.random(5000, 10000), function()
TriggerClientEvent('qb-drugs:client:sendDeliveryMail', src, 'bad', deliveryData)
if curRep - 1 > 0 then
player.Functions.SetMetaData('dealerrep', (curRep - config.deliveryRepLoss))
else
player.Functions.SetMetaData('dealerrep', 0)
end
end)
end
else
if invItem and invItem.amount >= itemAmount then -- late correct amount
exports.qbx_core:Notify(src, locale('error.too_late'), 'error')
exports.ox_inventory:RemoveItem(src, item, itemAmount)
player.Functions.AddMoney('cash', math.floor(payout / config.overdueDeliveryFee), 'delivery-drugs-too-late')
SetTimeout(math.random(5000, 10000), function()
TriggerClientEvent('qb-drugs:client:sendDeliveryMail', src, 'late', deliveryData)
if curRep - 1 > 0 then
player.Functions.SetMetaData('dealerrep', (curRep - config.deliveryRepLoss))
else
player.Functions.SetMetaData('dealerrep', 0)
end
end)
else
if invItem then -- late incorrect amount
local newItemAmount = invItem.amount
local modifiedPayout = deliveryData.itemData.payout * newItemAmount
exports.qbx_core:Notify(src, locale('error.too_late'), 'error')
exports.ox_inventory:RemoveItem(src, item, itemAmount)
player.Functions.AddMoney('cash', math.floor(modifiedPayout / config.overdueDeliveryFee), 'delivery-drugs-too-late')
SetTimeout(math.random(5000, 10000), function()
TriggerClientEvent('qb-drugs:client:sendDeliveryMail', src, 'late', deliveryData)
if curRep - 1 > 0 then
player.Functions.SetMetaData('dealerrep', (curRep - config.deliveryRepLoss))
else
player.Functions.SetMetaData('dealerrep', 0)
end
end)
end
end
end
end)
lib.addCommand('newdealer', {
help = locale('info.newdealer_command_desc'),
params = {
{
name = 'name',
type = 'string',
help = locale('info.newdealer_command_help1_help'),
optional = false
},
{
name = 'min',
type = 'number',
help = locale('info.newdealer_command_help2_help'),
optional = false
},
{
name = 'max',
type = 'number',
help = locale('info.newdealer_command_help3_help'),
optional = false
}
},
restricted = 'group.admin'
}, function(source, args)
local ped = GetPlayerPed(source)
local coords = GetEntityCoords(ped)
local player = exports.qbx_core:GetPlayer(source)
if not player then return end
local dealerName = args.name
local minTime = args.min
local maxTime = args.max
local time = json.encode({min = minTime, max = maxTime})
local pos = json.encode({x = coords.x, y = coords.y, z = coords.z})
local result = MySQL.scalar.await('SELECT name FROM dealers WHERE name = ?', {dealerName})
if result then return exports.qbx_core:Notify(source, locale('error.dealer_already_exists'), 'error') end
MySQL.insert('INSERT INTO dealers (name, coords, time, createdby) VALUES (?, ?, ?, ?)', {dealerName, pos, time, player.PlayerData.citizenid}, function()
sharedConfig.dealers[dealerName] = {
name = dealerName,
coords = vec3(coords.x, coords.y, coords.z),
time = { min = minTime, max = maxTime },
products = config.products
}
TriggerClientEvent('qb-drugs:client:RefreshDealers', -1, sharedConfig.dealers)
end)
end)
lib.addCommand('deletedealer', {
help = locale('info.newdealer_command_desc'),
params = {
{
name = 'name',
type = 'string',
help = locale('info.deletedealer_command_help1_help'),
optional = false
},
},
restricted = 'group.admin'
}, function(source, args)
local dealerName = args.name
local result = MySQL.scalar.await('SELECT * FROM dealers WHERE name = ?', {dealerName})
if result then
MySQL.query('DELETE FROM dealers WHERE name = ?', {dealerName})
sharedConfig.dealers[dealerName] = nil
TriggerClientEvent('qb-drugs:client:RefreshDealers', -1, sharedConfig.dealers)
exports.qbx_core:Notify(source, locale('success.dealer_deleted', dealerName), 'success')
else
exports.qbx_core:Notify(source, locale('error.dealer_not_exists_command', dealerName), 'error')
end
end)
lib.addCommand('dealers', {
help = 'To see the list of dealers',
restricted = 'group.admin'
}, function(source)
local dealersText = ''
if sharedConfig.dealers ~= nil and next(sharedConfig.dealers) ~= nil then
for _, v in pairs(sharedConfig.dealers) do
dealersText = dealersText .. locale('info.list_dealers_name_prefix') .. v.name .. '<br>'
end
TriggerClientEvent('chat:addMessage', source, {
color = { 0, 0, 255 },
template = "<div class='chat-message advert'><div class='chat-message-body'><strong>' .. locale('info.list_dealers_title') .. '</strong><br><br> ' .. dealersText .. '</div></div>",
args = {}
})
else
exports.qbx_core:Notify(source, locale('error.no_dealers'), 'error')
end
end)
lib.addCommand('dealergoto', {
help = 'To teleport to dealer',
params = {
{
name = 'name',
type = 'string',
help = locale('info.dealergoto_command_help1_help'),
optional = false
},
},
restricted = 'group.admin'
}, function(source, args)
local dealerName = args.name
if sharedConfig.dealers[dealerName] then
local ped = GetPlayerPed(source)
SetEntityCoords(ped, sharedConfig.dealers[dealerName].coords.x, sharedConfig.dealers[dealerName].coords.y, sharedConfig.dealers[dealerName].coords.z, false, false, false, false)
exports.qbx_core:Notify(source, locale('success.teleported_to_dealer', dealerName), 'success')
else
exports.qbx_core:Notify(source, locale('error.dealer_not_exists'), 'error')
end
end)
CreateThread(function()
Wait(500)
local dealers = MySQL.query.await('SELECT * FROM dealers')
if dealers and #dealers ~= 0 then
for i = 1, #dealers do
local data = dealers[i]
local coords = json.decode(data.coords)
local time = json.decode(data.time)
sharedConfig.dealers[data.name] = {
name = data.name,
coords = vec3(coords.x, coords.y, coords.z),
time = { min = time.min, max = time.max },
products = config.products
}
end
end
TriggerClientEvent('qb-drugs:client:RefreshDealers', -1, sharedConfig.dealers)
end)