Open Vending Machines
CompilabileDistributori 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.
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.
| Adapter | Responsabilità | Default incluso |
|---|---|---|
EconomyAdapter | Addebita i compratori e versa gli incassi delle casse | Wallet demo in memoria |
InventoryAdapter | Consegna/preleva item per acquisti e rifornimenti | Inventari Bukkit reali |
BusinessAdapter | Risolve aziende, membri, ruoli, limiti e account | Config (sezione businesses) |
PermissionAdapter | Controlli permessi | Permission node Bukkit |
StorageAdapter | Persiste macchine, stock, cassa e stato | Singolo file YAML (o memoria) |
NotificationAdapter | Invia notifiche | Chat |
LoggingAdapter | Audit trail | File / 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.
/ovm create <type> [company] per registrare la macchina.products.yml, i tipi di macchina in machines.yml.restock.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.
| Comando | Funzione | Permesso |
|---|---|---|
/ovm help | Lista comandi | — |
/ovm create <type> [company] | Piazza una macchina dove guardi | openvending.create |
/ovm remove | Rimuove la macchina mirata | openvending.remove |
/ovm list | Lista macchine vicine | openvending.use |
/ovm info | Ispeziona la macchina mirata | openvending.use |
/ovm restock | Apre gestione/rifornimento | openvending.restock |
/ovm withdraw | Preleva la cassa | openvending.withdraw |
/ovm reload | Ricarica la configurazione | openvending.reload |
/ovm giveitem <productId> [amount] | Item prodotto a te stesso | openvending.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.
| Evento | Cancellabile | Quando scatta |
|---|---|---|
VendingMachineCreateEvent | Sì | Prima che una macchina venga registrata/persistita |
VendingMachineRemoveEvent | Sì | Prima della rimozione |
VendingMachineRestockEvent | Sì | Prima che lo stock venga aggiunto |
VendingMachinePurchaseAttemptEvent | Sì | Dopo la validazione, prima di muovere soldi/item |
VendingMachinePurchaseSuccessEvent | No | Dopo una vendita completata |
VendingMachinePurchaseFailEvent | No | Quando un acquisto viene rifiutato (PurchaseFailReason) |
VendingMachineCashWithdrawEvent | Sì | Prima che la cassa venga svuotata |
VendingMachineStateChangeEvent | Sì | Prima 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.
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 registrateapi.machineTypes()/api.products()— catalogo- Azioni:
createMachine,removeMachine,setState - Azioni:
restock,setPrice,withdraw VendingHook:canPlayerUseMachine,resolveProductPriceVendingHook: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