Open Jobs
CompilabileIl motore dei lavori base per server roleplay: il minatore che scende in miniera, il boscaiolo che va al bosco, il pescatore al porto. Un lavoro base è un'attività fisica accessibile a chiunque — vai, lavori, guadagni, senza assunzioni né aziende. Neutro rispetto all'ambientazione: il core non conosce nessun lavoro, materiale o location — tutto vive nella config o dietro adapter opzionali.
RP First: paga l'attività, non il tempo
Il plugin non paga i minuti trascorsi nella region. Stare fermi in miniera non è lavorare. La sessione traccia ciò che fai fisicamente — blocchi estratti, pesci pescati, item trasformati — ed è l'unità fondamentale di tracciamento. Il lavoro deve essere fatto davvero.
Job · WorkSession · WorkLocation · WorkLicense · WorkRecord · Progression
Il test di neutralità: "Minatore" → core (config per nome e risorse). "Raccoglitore di adamantio" → config. "Lavoratore che estrae risorse da una location e riceve una paga" → core. Il realistico italiano è solo la configurazione di riferimento; examples/fantasy è l'opposto sullo stesso codice.
Tre modelli di pagamento
Ogni lavoro sceglie come viene pagato. Sul pagamento base si applicano poi i moltiplicatori di progressione, cooperativa, strumento, turno e stagione.
| Modello | Come paga |
|---|---|
a_produzione | Per unità di materiale valido prodotta nella sessione, con una soglia minima sotto la quale non paga nulla. Il più RP: paga il lavoro reale. |
a_sessione | Per durata effettiva attiva, con un malus se l'attività rilevata scende sotto la soglia. Adatto a lavori difficili da misurare. |
a_consegna | Niente durante l'estrazione: si paga per unità quando il lavoratore raggiunge il punto di consegna. Il trasporto è fisico e vulnerabile. |
I lavori trasformativi (falegname, fabbro, fornaio) pagano per ogni trasformazione completata su un banco designato, con un craft_time_seconds che impedisce il crafting istantaneo abusivo.
I primitivi del lavoro
Il core non sa cosa sia "minatore": sa cosa sia un lavoratore che svolge un'attività in una location e viene pagato. Tutto il resto vive in jobs.yml, location_types.yml e progression.yml.
Adapter
Ogni adapter ha un default funzionante ed è scoperto a runtime dal Bukkit ServicesManager. Assente o non reale, la feature collegata degrada in silenzio — nessun crash, nessuna dipendenza dura.
| Adapter | Default | Assente / non reale → |
|---|---|---|
StorageAdapter | YAML atomico con backup (o memory) | — |
PermissionAdapter | Bukkit (riflette LuckPerms) | — |
NotificationAdapter | chat / action bar | — |
RegionAdapter | sintetico per-chunk | con require_region_backend off resta usabile; un bridge WorldGuard porta regioni e tag reali e abilita il gating del punto di consegna |
EconomyAdapter | no-op (paga registrata) | un bridge Open Economy eroga le paghe reali |
CompanyEmploymentAdapter | no-op | un bridge Open Companies reindirizza la paga al datore di lavoro |
IdentityAdapter | no-op | un bridge Open Identity rende le licenze item fisici con il grado inciso |
Comandi
Il permesso openjobs.use abilita l'uso del comando; openjobs.admin sblocca il sottocomando admin.
| Comando | Funzione |
|---|---|
/lavoro lista | tutti i lavori disponibili con location e requisiti |
/lavoro info <lavoro> | dettagli: categoria, location, paga, licenza, gradi |
/lavoro inizia · fine | avvia la sessione nella location corrente e ricevi il pagamento a fine |
/lavoro stato | durata attiva, prodotto e paga stimata della sessione |
/lavoro profilo | storico: gradi, sessioni e guadagni per ogni lavoro |
/lavoro licenza | le licenze possedute e il loro stato |
/lavoro admin | licenza emetti/revoca, sessione termina, location add/remove, stats, reload |
API pubblica
Recupera OpenJobsApi dal Services Manager di Bukkit. Espone il catalogo dei lavori, la sessione attiva, i record lifetime, le licenze e il grado live — i dati che i widget di Open Gestionale e un item licenza di Open Identity leggono.
OpenJobsApi api = Bukkit.getServicesManager().load(OpenJobsApi.class);
// Registra il tuo bridge (es. Open Economy) come economy adapter
api.adapters().setEconomy(myEconomyBridge);
// Lettura per i widget del gestionale o per un item licenza
api.getActiveSession(playerUuid).ifPresent(session -> { /* ... */ });
api.getTier(playerUuid, "minatore").ifPresent(tier -> { /* incidi sul tesserino */ });
jobs()/getJob(id)— il catalogo dei lavori dalla configgetActiveSession(uuid)— la sessione attiva o in pausa del lavoratoregetRecord(uuid, job)/getRecords(uuid)— storico e progressionegetTier(uuid, job)— il grado live (decay-adjusted) per l'item licenzahasLicense/getLicense/getLicenses— licenze professionaliadapters()— sostituzione runtime di economy, company, identity, region
Sicurezza e neutralità
- Il core non contiene il nome di nessun lavoro, materiale o location: tutto in config
- Paga l'attività reale rilevata, mai i minuti trascorsi nella region
- Non impedisce mining o crafting fuori dalle location: sono attività Minecraft normali, semplicemente non pagate
- Storage durevole: scrittura atomica con backup, recupero da write interrotti
- Non crasha se un adapter manca: disattiva in silenzio la feature collegata
- Non tocca la chat o i prefissi: il grado è un dato interno, non un display sociale