Moduli Filosofia Architettura Installazione Download Wiki Scarica il JAR

Open Vending Machines

Compilabile

Distributori automatici realistici, rifornibili e assegnabili ad aziende. Non hardcoda nulla su economy, inventari o aziende: ogni sistema esterno passa da un piccolo adapter con un default funzionante, sostituibile a runtime dal tuo plugin.

Namespacedev.openrp.vending
Comando/ovm · /openvending · /vending
Dipendenzenessuna obbligatoria
Vaultopzionale (reflection)
APIOpenVendingMachinesApi

Perché adapter-first

Il core dipende solo da 7 interfacce, ognuna con un default incluso. Puoi avviarlo senza altri plugin e poi sostituire qualsiasi adapter a runtime con la tua implementazione.

AdapterResponsabilitàDefault incluso
EconomyAdapterAddebita i compratori e versa gli incassi delle casseWallet demo in memoria
InventoryAdapterConsegna/preleva item per acquisti e rifornimentiInventari Bukkit reali
BusinessAdapterRisolve aziende, membri, ruoli, limiti e accountConfig (sezione businesses)
PermissionAdapterControlli permessiPermission node Bukkit
StorageAdapterPersiste macchine, stock, cassa e statoSingolo file YAML (o memoria)
NotificationAdapterInvia notificheChat
LoggingAdapterAudit trailFile / console / nessuno

Nota: Vault non è una dipendenza; l'adapter Vault economy è un esempio opzionale agganciato via reflection.

Come funziona

Crei un distributore guardando un blocco con /ovm create <type> [company]. Da lì la macchina vive sul mondo come blocco interattivo e protetto.

PiazzamentoGuarda un blocco e usa /ovm create <type> [company] per registrare la macchina.
Click destro = acquistoIl click destro apre il menu di acquisto; sneak + click destro (staff) apre il menu di gestione.
Stato della macchinaOgni macchina ha id, posizione, tipo, azienda opzionale, prodotti, stock/capacità/prezzo per prodotto, cassa interna e stato.
Blocchi protettiI blocchi distributore sono protetti dalla rottura: si rimuovono solo dai comandi.
Catalogo da configI prodotti vivono in products.yml, i tipi di macchina in machines.yml.
Tre modalità di rifornimentorestock.mode: player_inventory, business_warehouse o free.

Gli stati possibili sono ACTIVE, EMPTY, BROKEN e DISABLED.

Comandi

Comando principale /ovm, con alias /openvending e /vending.

ComandoFunzionePermesso
/ovm helpLista comandi
/ovm create <type> [company]Piazza una macchina dove guardiopenvending.create
/ovm removeRimuove la macchina mirataopenvending.remove
/ovm listLista macchine vicineopenvending.use
/ovm infoIspeziona la macchina mirataopenvending.use
/ovm restockApre gestione/rifornimentoopenvending.restock
/ovm withdrawPreleva la cassaopenvending.withdraw
/ovm reloadRicarica la configurazioneopenvending.reload
/ovm giveitem <productId> [amount]Item prodotto a te stessoopenvending.admin

Per le macchine di aziende valgono anche le capability RESTOCK / WITHDRAW / EDIT_PRICE / MANAGE; openvending.admin bypassa i controlli azienda.

Eventi

Tutti gli eventi vivono in dev.openrp.vending.event. Quelli cancellabili ti permettono di bloccare l'azione prima che muova soldi, item o stato.

EventoCancellabileQuando scatta
VendingMachineCreateEventPrima che una macchina venga registrata/persistita
VendingMachineRemoveEventPrima della rimozione
VendingMachineRestockEventPrima che lo stock venga aggiunto
VendingMachinePurchaseAttemptEventDopo la validazione, prima di muovere soldi/item
VendingMachinePurchaseSuccessEventNoDopo una vendita completata
VendingMachinePurchaseFailEventNoQuando un acquisto viene rifiutato (PurchaseFailReason)
VendingMachineCashWithdrawEventPrima che la cassa venga svuotata
VendingMachineStateChangeEventPrima di una transizione di stato

API pubblica

Recupera l'API con Bukkit.getServicesManager().load(OpenVendingMachinesApi.class). Da lì puoi sostituire adapter, registrare hook e guidare ogni operazione lato server.

java · OpenVendingMachinesApi
OpenVendingMachinesApi api = Bukkit.getServicesManager().load(OpenVendingMachinesApi.class);
api.adapters().setEconomy(new MyEconomyAdapter());   // sostituisci un adapter
api.registerHook(myHook);                            // influenza le decisioni
PurchaseResult p = api.purchase(player, machine, "water", 1);
  • api.machines() — query sulle macchine registrate
  • api.machineTypes() / api.products() — catalogo
  • Azioni: createMachine, removeMachine, setState
  • Azioni: restock, setPrice, withdraw
  • VendingHook: canPlayerUseMachine, resolveProductPrice
  • VendingHook: beforePayment, afterPayment

Sicurezza

Tutta la logica critica è server-side: il client non viene mai fidato. GUI e comandi sono front-end sottili sugli stessi servizi validati.

  • Ogni operazione valida distanza, stato, stock, prezzo, permessi, capability e cooldown prima di cambiare qualcosa
  • Esegue sotto lock per-macchina (MachineLocks)
  • Muove i soldi prima degli item e rimborsa in caso di fallimento
  • Risolve i prezzi server-side