Lavori ed Economia

INFO

I lavori (job) e l’economia (soldi, società, fatture) sono il cuore di un server RP. Con ESX si gestiscono con esx_jobs, esx_society e esx_billing.

ObiettivoDettagli
Cosa imparerai• Come funzionano i job in ESX
• Stipendi e società
• Bilanciamento economico (sink/source)
• Pattern sicuri (server-side)
Prerequisiti• ESX attivo (modulo 10)
• Concetti di sicurezza (modulo 12)

1. Job in ESX

Un job è un “lavoro” assegnato al giocatore con un nome e un grado.

-- server.lua
-- Impostare il job (solo lato server, con validazione)
RegisterNetEvent('job:set')
AddEventHandler('job:set', function(jobName, grade)
    local xPlayer = ESX.GetPlayerFromId(source)
    -- MAI impostare un job dal client: la logica la decidi tu
    -- es. solo un admin può assegnare job
    if not IsPlayerAceAllowed(source, 'command.job') then return end
 
    xPlayer.setJob(jobName, grade or 0)
end)

Leggere il job

-- server.lua
local xPlayer = ESX.GetPlayerFromId(source)
local job = xPlayer.getJob()
print(job.name, job.label, job.grade, job.grade_label)

2. Stipendi (Paycheck)

Lo stipendio va assegnato dal server (mai dal client).

-- server.lua
CreateThread(function()
    while true do
        Wait(Config.PaycheckInterval * 60000)  -- in minuti
        for _, playerId in pairs(GetPlayers()) do
            local xPlayer = ESX.GetPlayerFromId(tonumber(playerId))
            if xPlayer then
                local job = xPlayer.getJob()
                local salary = Config.Jobs[job.name].salary or 0
                if salary > 0 then
                    xPlayer.addAccountMoney('bank', salary)
                end
            end
        end
    end
end)
-- config.lua
Config = Config or {}
Config.PaycheckInterval = 30  -- ogni 30 minuti
Config.Jobs = {
    ['police'] = { salary = 500 },
    ['mechanic'] = { salary = 400 },
    ['unemployed'] = { salary = 100 },
}

WARNING

Non dare stipendi in un loop client: un giocatore potrebbe triggerare l’evento da solo. Tutti i pagamenti vanno dal server.


3. Società (esx_society)

Le società gestiscono conti condivisi per job con più membri.

-- server.lua
-- Depositare nel conto società (es. polizia deposita le multe)
RegisterNetEvent('society:deposit')
AddEventHandler('society:deposit', function(amount)
    local xPlayer = ESX.GetPlayerFromId(source)
    if not xPlayer then return end
 
    amount = tonumber(amount) or 0
    if amount <= 0 then return end
 
    local job = xPlayer.getJob()
    -- Verifica che il giocatore abbia i soldi
    if xPlayer.getAccount('money').money < amount then return end
 
    xPlayer.removeAccountMoney('money', amount)
    TriggerEvent('esx_society:depositMoney', job.name, amount)
end)

NOTE

Le export e eventi di esx_society variano tra versioni. Controlla exports['esx_society']:... o gli eventi nella tua versione installata.


4. Fatture (esx_billing)

-- server.lua
RegisterNetEvent('billing:sendInvoice')
AddEventHandler('billing:sendInvoice', function(target, amount, reason)
    local sender = source
    local sPlayer = ESX.GetPlayerFromId(sender)
    local tPlayer = ESX.GetPlayerFromId(target)
    if not sPlayer or not tPlayer then return end
 
    amount = tonumber(amount) or 0
    if amount <= 0 or amount > 50000 then return end
    if type(reason) ~= 'string' then return end
 
    -- Solo i job autorizzati possono fatturare
    local job = sPlayer.getJob()
    if not Config.BillingJobs[job.name] then return end
 
    TriggerEvent('esx_billing:sendBill', sPlayer.source, target, 'society_' .. job.name, reason, amount)
end)

5. Bilanciamento Economico: Sink e Source

ConcettoSpiegazione
SourceCome i soldi entrano nell’economia (stipendi, vendite, loot)
SinkCome i soldi escono (negozi, tasse, riparazioni, imposte)

Un server economico stabile ha abbastanza sink per assorbire i source. Se i giocatori accumulano soldi senza limite, i prezzi diventano insignificanti.

Esempi di sink

  • Tasse sui veicoli
  • Costi di riparazione
  • Import/export con costi
  • Banche che pagano interessi negativi? (raro)
  • Multe che vanno alla società

TIP

Monitora l’inflazione del server: se tutti hanno milioni dopo 2 settimane, aggiungi sink. Le economie RP richiedono bilanciamento attivo.


  • Job e stipendi solo server-side
  • Nessun importo accettato dal client
  • Fatture limitate in valore
  • Società autorizzate per job
  • Monitorare inflazione/sink

TIP

Prossimo passo: 03 - Voice


Torna alla: Indice Generale