2026-04-14 17:41:39 +02:00

133 lines
4.1 KiB
Lua

local playersWorking = {}
CreateThread(function()
while true do
Wait(1000)
local timeNow = os.clock()
for playerId,data in pairs(playersWorking) do
Wait(0)
local xPlayer = ESX.Player(playerId)
-- is player still online?
if xPlayer then
local distance = #(xPlayer.getCoords(true) - data.zoneCoords)
-- player still within zone limits?
if distance <= data.zoneMaxDistance then
-- calculate the elapsed time
local timeElapsed = timeNow - data.time
if timeElapsed > data.jobItem[1].time then
data.time = os.clock()
for k,v in ipairs(data.jobItem) do
local itemQtty, requiredItemQtty = 0, 0
if v.name ~= TranslateCap('delivery') then
itemQtty = xPlayer.getInventoryItem(v.db_name).count
end
if data.jobItem[1].requires ~= 'nothing' then
requiredItemQtty = xPlayer.getInventoryItem(data.jobItem[1].requires).count
end
if v.name ~= TranslateCap('delivery') and itemQtty >= v.max then
xPlayer.showNotification(TranslateCap('max_limit', v.name))
playersWorking[playerId] = nil
elseif v.requires ~= 'nothing' and requiredItemQtty <= 0 then
xPlayer.showNotification(TranslateCap('not_enough', data.jobItem[1].requires_name))
playersWorking[playerId] = nil
else
if v.name ~= TranslateCap('delivery') then
-- chances to drop the item
if v.drop == 100 then
xPlayer.addInventoryItem(v.db_name, v.add)
else
local chanceToDrop = math.random(100)
if chanceToDrop <= v.drop then
xPlayer.addInventoryItem(v.db_name, v.add)
end
end
else
xPlayer.addMoney(v.price, "Job Payment")
end
end
end
if data.jobItem[1].requires ~= 'nothing' then
local itemToRemoveQtty = xPlayer.getInventoryItem(data.jobItem[1].requires).count
if itemToRemoveQtty > 0 then
xPlayer.removeInventoryItem(data.jobItem[1].requires, data.jobItem[1].remove)
end
end
end
else
playersWorking[playerId] = nil
end
else
playersWorking[playerId] = nil
end
end
end
end)
RegisterServerEvent('esx_jobs:startWork', function(zoneIndex, zoneKey)
if not playersWorking[source] then
local xPlayer = ESX.Player(source)
if xPlayer then
local jobObject = Config.Jobs[xPlayer.getJob().name]
if jobObject then
local jobZone = jobObject.Zones[zoneKey]
if jobZone and jobZone.Item then
playersWorking[source] = {
jobItem = jobZone.Item,
zoneCoords = vector3(jobZone.Pos.x, jobZone.Pos.y, jobZone.Pos.z),
zoneMaxDistance = jobZone.Size.x,
time = os.clock()
}
end
end
end
end
end)
RegisterServerEvent('esx_jobs:stopWork', function()
if playersWorking[source] then
playersWorking[source] = nil
end
end)
RegisterNetEvent('esx_jobs:caution', function(cautionType, cautionAmount, spawnPoint, vehicle)
local xPlayer = ESX.Player(source)
local identifier = xPlayer.getIdentifier()
if cautionType == 'take' then
if cautionAmount <= Config.MaxCaution and cautionAmount >= 0 then
TriggerEvent('esx_addonaccount:getAccount', 'caution', identifier, function(account)
if xPlayer.getAccount('bank').money >= cautionAmount then
xPlayer.removeAccountMoney('bank', cautionAmount, "Caution Fine")
account.addMoney(cautionAmount)
xPlayer.showNotification(TranslateCap('bank_deposit_taken', ESX.Math.GroupDigits(cautionAmount)))
TriggerClientEvent('esx_jobs:spawnJobVehicle', xPlayer.src, spawnPoint, vehicle)
else
xPlayer.showNotification(TranslateCap('caution_afford', ESX.Math.GroupDigits(cautionAmount)))
end
end)
end
elseif cautionType == 'give_back' then
if cautionAmount <= 1 and cautionAmount > 0 then
TriggerEvent('esx_addonaccount:getAccount', 'caution', identifier, function(account)
local caution = account.money
local toGive = ESX.Math.Round(caution * cautionAmount)
xPlayer.addAccountMoney('bank', toGive, "Caution Return")
account.removeMoney(toGive)
TriggerClientEvent('esx:showNotification', source, TranslateCap('bank_deposit_returned', ESX.Math.GroupDigits(toGive)))
end)
end
end
end)