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_societyeesx_billing.
| Obiettivo | Dettagli |
|---|---|
| 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_societyvariano tra versioni. Controllaexports['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
| Concetto | Spiegazione |
|---|---|
| Source | Come i soldi entrano nell’economia (stipendi, vendite, loot) |
| Sink | Come 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.
6. Pattern Sicuri Riepilogo
- 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