Configurazione
ShadowBattlePass
Stagioni, cento livelli, missioni e sfide. Con l'editor delle ricompense dentro il gioco.
Dove sono i file
plugins/ShadowBattlePass/ Il plugin li crea al primo avvio e li aggiorna da solo alle nuove versioni, senza toccare le tue modifiche.
Applicare le modifiche
/bpa reload Rilegge i file senza riavviare il server.
Nessuna impostazione trovata
Prova con un’altra parola, oppure cerca in tutti i plugin.
Impostazioni
I file che decidono come si comporta il plugin. Si parte da qui.
config.yml
Impostazioni generali 103 impostazioni
config.ymlplugins/ShadowBattlePass/config.yml Note del file
Con un aggiornamento i tuoi file (questo, seasons/, quests/, lang/, menus/ e gli altri qui sotto) vengono portati alla nuova versione in automatico: ogni valore che hai cambiato o aggiunto resta, le nuove opzioni arrivano con i loro commenti, e ciò che hai cancellato resta cancellato. Le vecchie copie sono in backup/<date>/; se qualcosa richiede la tua attenzione troverai PORTING-<version>.txt nella cartella del plugin.
Un valore sbagliato non blocca niente: viene sostituito con quello di fabbrica e segnalato in console all'avvio, con il percorso e il valore atteso.
Dove stanno le cose:
config.yml questo file: archiviazione, regole, notifiche, hook seasons/*.yml le stagioni: livelli, tracce, ricompense quests/*.yml le missioni, un file per gruppo (daily, weekly, ...) rewards.yml pacchetti di ricompense riutilizzabili boosters.yml moltiplicatori programmati (weekend, happy hour) shop.yml lo shop che paghi con le monete del pass challenges.yml le sfide di tutto il server lang/*.yml i messaggi menus/*.yml il layout di ogni schermata
config-version4storage7 chiavistorage.mysql7 chiavienabledfalsefalse = database H2 locale dentro plugins/ShadowBattlePass/data/. Niente da installare: il plugin funziona nel momento in cui lo copi. Metti qui le tue credenziali e riavvia: il plugin crea da solo ogni tabella, e nel file locale non viene toccato niente.
host127.0.0.1port3306databaseshadowbattlepassusernamerootpassword""parameters"useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&characterEncoding=utf8"storagetable-prefix"bp_"Prefisso delle tabelle. Se lo cambi, il plugin crea nuove tabelle e riparte da zero: utile per due server che condividono un database.
fallback-to-localtrueMySQL configurato ma irraggiungibile: con true il plugin lo segnala in console e ripiega sul file locale, così il server parte comunque.
flush-interval"30s"Ogni quanto i progressi modificati arrivano al database. Allo spegnimento avviene sempre un salvataggio bloccante, qualunque cosa dica questo valore.
storage.pool5 chiavimaximum-pool-size10minimum-idle2connection-timeout-ms10000idle-timeout-ms600000max-lifetime-ms1800000storage.h21 chiaveauto-serverfalsePermette a un altro processo - un pannello web, per esempio - di aprire lo stesso file H2 mentre il server è acceso. Serve di rado.
Più server su un solo database
Serve solo se hai una rete (lobby + survival + ...) che condivide un unico MySQL. I server si passano le novità attraverso il database: nessuna porta da aprire, niente da installare sul proxy.
Continua a leggere
Ciò che viaggia è un AVVISO, mai un valore: un messaggio dice "la stagione è cambiata", non "ora la stagione è season-2". Chi lo riceve va a rileggere la verità dal database, così due server che cambiano qualcosa nello stesso secondo convergono invece di sovrascriversi.
Il pass di un giocatore non ha bisogno di viaggiare: sei su un server alla volta, il pass si carica all'ingresso e si scrive all'uscita, e due server non hanno mai lo stesso giocatore.
storage.sync5 chiavimodeAUTOAUTO = attivo quando usi MySQL, spento sul database locale. ON | OFF per deciderlo tu.
primarytrueIMPORTANTE: in una rete, ESATTAMENTE UN server può avere primary: true. È quello che avvia e chiude le stagioni e fa partire le sfide programmate. Gli altri leggono e mostrano.
server-idautoUn nome per questo server. "auto" usa hostname + porta. Due server non devono mai avere lo stesso.
poll-interval"3s"Ogni quanto leggere ciò che hanno fatto gli altri.
keep-messages"1h"Per quanto tenere i messaggi già letti prima di cancellarli.
Messaggi e lingue
messages2 chiavidefault-locale"en_US"La lingua usata quando quella del giocatore non è in lang/, e dalla console. Include en_US e it_IT: metti "it_IT" per un server italiano.
follow-client-localetruetrue = ogni giocatore vede i messaggi nella lingua del suo client. Può comunque sceglierne una con /bp lang.
Orario
Questo decide quando ruotano le missioni. Vale per tutti nello stesso istante: due giocatori online nello stesso giorno ricevono le stesse missioni giornaliere, e il reset non è "24 ore dopo il tuo primo accesso".
time3 chiavizone"system""system" usa il fuso orario del server. Oppure indicane uno, es. "Europe/Rome".
daily-reset"00:00"A che ora cambiano le missioni giornaliere. Prima di quest'ora il giorno non è ancora cambiato, così chi gioca alle 3 di notte non perde un intero ciclo.
week-startsMONDAYIn che giorno inizia la settimana, per le missioni settimanali.
Dove e come si guadagna esperienza
worlds2 chiavionly-in[ ]Se questa lista NON è vuota, il pass funziona SOLO in questi mondi.
never-in[lobby]Altrimenti funziona ovunque tranne qui.
earning3 chiaviconditions[ ]Requisiti che devono essere soddisfatti perché l'esperienza venga contata. Stessa sintassi delle condizioni delle missioni (vedi docs/07).
- "gamemode: survival, adventure" - "not-world: creative"
daily-xp-cap0Tetto giornaliero di esperienza per giocatore. 0 = nessun tetto. Non è una punizione: è ciò che impedisce a una farm afk di chiudere una stagione di novanta giorni in un pomeriggio.
earning.xp-sources7 chiaviEsperienza passiva: quanto dà ogni singola azione, anche senza missioni attive. Lascia vuoto per un pass che avanza SOLO con le missioni, che è la scelta più comune e meglio bilanciata.
Per le azioni basate su una quantità (danno, soldi, distanza) il numero è per unità, con un tetto interno perché un colpo solo non possa produrre numeri assurdi.
Lista completa dei tipi: docs/05-OBIETTIVI.md
ORE_MINE1MOB_KILL1ITEM_FISH2CROP_HARVEST1ADVANCEMENT25RAID_WIN100BOSS_KILL250Anti abuso
È ciò che fa sì che una missione "rompi 500 minerali" riguardi davvero lo scavo invece di diventare "piazza e rompi lo stesso blocco 500 volte".
anti-abuse6 chiaviignore-placed-blockstrueUn blocco piazzato da un giocatore non conta quando viene rotto. La memoria vive nel chunk stesso, quindi sopravvive a un riavvio.
placed-blocks-per-chunk4096Quanti blocchi piazzati ricordare per chunk. Oltre questo numero i più vecchi vengono dimenticati.
ignore-spawner-mobstrueI mob usciti da uno spawner o da un uovo non contano per le missioni che chiedono di uccidere. Le singole missioni possono cambiare questa regola.
ignore-afktrueChi non muove il mouse da un po' non sta giocando: le sue azioni non contano finché non torna.
afk-after"5m"max-events-per-second64Tetto di eventi al secondo per giocatore. Non è un anticheat: è una rete di sicurezza contro le macchine che rompono migliaia di blocchi al secondo. 0 = nessun limite.
Riscossione delle ricompense
claiming5 chiaviauto-claim-tiersfalsetrue = le ricompense arrivano da sole appena sali di livello. false = il giocatore clicca, che dà più soddisfazione ed è molto più comune.
auto-claim-questsfalseLo stesso per le missioni finite.
auto-claim-on-season-endtrueAlla fine di una stagione tutto ciò che non è stato riscosso viene consegnato comunque. Lascialo attivo: nessuno dovrebbe perdere una ricompensa che si era guadagnato solo perché era offline.
allow-tier-dropfalseSe abbassi la curva a metà stagione, true ricalcola verso il basso chi l'ha già superata. Di solito non è quello che vuoi.
mailboxtrueCasella postale: un item che non entra nell'inventario non viene droppato e non sparisce, aspetta lì finché non c'è spazio. Se la disattivi, una ricompensa che non entra viene rifiutata.
Notifiche
La parte delicata di un battle pass. Troppo poco e i progressi sono invisibili; troppo e dopo un minuto la chat è illeggibile.
notifications8 chiavijoin-summarytrueUn riepilogo in chat quando un giocatore entra.
notifications.xp2 chiavienabledtrueL'esperienza guadagnata appare nella action bar, mai in chat.
every"1s"I guadagni vengono sommati e mostrati al massimo una volta ogni:
notifications.boss-bar2 chiavienabledtrueUna barra sotto il mirino mentre l'esperienza si muove.
ticks60Per quanti tick resta visibile dopo l'ultimo guadagno.
notifications.bar3 chiavilength20I caratteri della barra di avanzamento, usati ovunque.
full"█"empty"░"notifications.tier3 chiavititletrueUn titolo sullo schermo quando si sale di livello.
broadcast-every10Annuncia a tutti in chat ogni N livelli. 0 = mai.
sound"entity.player.levelup 0.7 1.2"notifications.quest4 chiavititletruesound"entity.experience_orb.pickup 0.8 1.4"progresstrueAvvisi di avanzamento durante una missione lunga.
progress-steps4In quanti passi: 4 significa al 25%, 50%, 75%. 0 = mai.
notifications.challenge-bar2 chiavienabledtrueformat"<gradient:#B388FF:#7C4DFF><challenge></gradient> <white><progress>/<goal> <gray>(<time>)"notifications.announce3 chiaviseason-starttruetrack-unlocktruequest-resettrueSerie di accessi
Il modo più economico e più onesto per far tornare qualcuno domani.
streaks3 chiavienabledtruegrace-days1Quanti giorni puoi saltare senza perdere la serie. Perdere trenta giorni di fila per una disconnessione fa smettere di giocare le persone, non le fa giocare di più.
streaks.rewards5 chiaviLa tabella può avere buchi: chi arriva al giorno 12 riceve il premio del giorno 7, non niente.
1["coins: 10"]3["coins: 25", "xp: 100"]7["coins: 75", "xp: 500", "message: <gradient:#FFD54F:#FF8F00>A whole week in a row!</gradient>"]+1
14["coins: 150", "xp: 1000"]30["coins: 500", "xp: 3000", "tier: 1", "broadcast: &6<player> has played 30 days in a row!"]+1
Recupero per chi resta indietro
Una stagione è divertente finché recuperare sembra possibile. Chi entra tardi, o torna dopo due settimane, guadagna più in fretta - fino a un tetto, e solo finché non ha raggiunto gli altri.
catch-up3 chiavienabledtruebehind-tiers10Quanti livelli sotto la media devi essere perché scatti.
max-multiplier2.0Il massimo per cui può moltiplicare.
Regalare il pass
Comprare una traccia per un amico. È la funzione più richiesta di qualsiasi battle pass e quella che nessuno implementa: al server non costa nulla - i soldi escono dall'economia in ogni caso - e trasforma la traccia premium in qualcosa che puoi regalare per un compleanno, il che vende molte più copie di qualsiasi sconto.
gifting3 chiavienabledtruemarkup0.0Sovrapprezzo, come frazione. 0 = nessuno, 0.1 = dieci per cento in più. Zero di base: i regali vanno incoraggiati, non tassati.
announcetrueAnnuncia il regalo agli altri giocatori.
Classifica
leaderboard3 chiavisize100Quante posizioni tenere in memoria.
refresh"2m"Ogni quanto viene ricalcolata.
hologram-size10Quante posizioni mostra la classifica fluttuante. Piazzala con /bpa hologram place <board>, stando dove la vuoi. Richiede ShadowEssentials per gli ologrammi.
Schermate
gui2 chiaviinput-timeout"60s"Quanto tempo ha un amministratore per rispondere a una domanda che l'editor fa in chat prima che venga annullata.
refresh-ticks20Pulizia
housekeeping3 chiavihistory-days60Per quanti giorni tenere lo storico delle ricompense date. 0 = per sempre.
mailbox-days30Per quanti giorni tenere i pacchi già consegnati.
quest-days30Per quanti giorni tenere i progressi dei cicli chiusi e riscossi.
Integrazioni
Tutti opzionali. Un plugin mancante degrada una funzione e non blocca mai un avvio.
integrations3 chiavisuitetrueCi presentiamo a ShadowEssentials, così /se suite ci elenca.
integrations.permissions3 chiavigrant-command""Il comando usato per dare un permesso come ricompensa. Lascia vuoto per far scegliere al plugin: riconosce ShadowPermissions, LuckPerms, PermissionsEx e GroupManager. Placeholder: <player> <node> <duration>
grant-timed-command""revoke-command""integrations.crates1 chiavegive-command""Il comando usato per dare chiavi delle crate come ricompensa. Vuoto = riconosce ShadowCrazyChest, CrazyCrates, ExcellentCrates. Placeholder: <player> <crate> <amount>
Diagnostica
debug1 chiavelog-sqlfalseScrive ogni query in console. Solo per dare la caccia a un problema: su un server vero riempie il log in pochi minuti.
bStats (statistiche d'uso anonime, https://bStats.org)
Cosa viene inviato, ogni 30 minuti: un id casuale del server (serverUuid, non derivato da nulla), la versione del plugin, le versioni di Minecraft/Paper e di Java, il sistema operativo e il numero di core, la modalità online, quanti giocatori sono online (solo un numero) e il tipo di licenza (free/premium/creator). NESSUN dato dei giocatori: niente nomi, niente UUID, niente indirizzi, niente progressi. Non viene inviato nulla mentre il plugin aspetta una licenza.
Continua a leggere
false disattiva solo questo plugin. enabled: false in plugins/bStats/config.yml disattiva in un colpo tutti i plugin bStats sul server.
metrics1 chiaveenabledtrueLa licenza
Senza chiave il plugin gira nell'edizione free. Non si spegne mai da solo e non cancella mai niente: ciò che supera i limiti non viene caricato ma resta su disco, intatto, e torna quando arriva una chiave.
Continua a leggere
La chiave NON va qui. Sta in license.yml, un file separato apposta: una richiesta di supporto che dice "mandami la tua config" non deve arrivare con dentro la licenza di qualcuno. Il campo qui sotto esiste solo per chi genera la config da un sistema di deploy.
license3 chiaviLA CHIAVE VIVE IN license.yml (stessa cartella di questo file), oppure nel file centrale plugins/ShadowControl/licenses.yml per tutta la suite. La 'key' qui sotto è solo un ripiego per i sistemi di deploy che generano config.yml: lasciala vuota.
La chiave NON sta qui: sta in license.yml, in questa cartella, creato al primo avvio (oppure in plugins/ShadowControl/licenses.yml per tutta la suite). Lasciato vuoto: usa /bpa license activate <key>, oppure license.yml.
activation-url'https://shadow-licences.riccardobotins.workers.dev'L'indirizzo BASE del servizio di attivazione. Il plugin aggiunge da solo /claim e /check. Vuoto significa nessuna attivazione automatica: le chiavi si incollano a mano e tutto il resto continua a funzionare.
grace-days7Quanti giorni di tolleranza quando una licenza scade o gli indirizzi non corrispondono. Sette, perché un rinnovo che arriva il lunedì mattina non deve costare un weekend a nessuno, e perché un indirizzo che non corrisponde è molto più spesso un NAT che un ladro.
resolve-public-iptrueChiedi al servizio licenze (activation-url + /ip) qual è l'indirizzo pubblico di questo server: risponde con l'indirizzo che vede, e del server non viene inviato niente. Serve solo per far corrispondere il vincolo di una licenza dietro NAT. Disattivalo se preferisci che il plugin non parli con nessuno. Solo con una licenza installata: un server senza chiave non chiede niente a nessuno. false = non chiedere mai.
boosters.yml
I potenziamenti a tempo 21 impostazioni
boosters.ymlplugins/ShadowBattlePass/boosters.yml Note del file
VERSIONE ITALIANA, nella cartella di questo plugin:
esempi/it_IT/boosters.yml
Copiala al posto di questo file per usarla.
I moltiplicatori di esperienza.
Arrivano da quattro posti diversi e finiscono tutti in un unico numero:
1. PERMESSO shadowbattlepass.booster.150 -> x1.5 Il numero è una percentuale: 200 la raddoppia. 2. PROGRAMMATI le finestre definite qui sotto (weekend, happy hour) 3. PERSONALI comprati nello shop o dati come ricompensa 4. GLOBALI avviati da un amministratore per tutto il server
Come si combinano è una scelta, non un caso: vedi "stacking".
config-version2stackingfalsefalse = vince il migliore. true = si moltiplicano tra loro.
Lascialo su false a meno che tu non sappia esattamente cosa stai facendo: due booster che si cumulano sono il modo più rapido per ritrovarti una stagione finita in un solo weekend.
max-multiplier5.0Il tetto massimo invalicabile, qualunque cosa finiscano per dire le regole qui sopra.
Finestre programmate
Ognuna si attiva da sola nei giorni e nelle ore indicati qui. Togli "days" per farla valere tutti i giorni. Togli "from" e "to" per farla valere tutto il giorno. Aggiungi "permission" per limitarla a un gruppo.
schedules4 chiavischedules.weekend4 chiavienabledtruedisplay"&6Weekend x1.5"multiplier1.5days[SATURDAY, SUNDAY]schedules.happy-hour5 chiavienabledtruedisplay"&bHappy hour x2"multiplier2.0from"20:00"to"22:00"schedules.night-shift5 chiaviUna finestra che scavalca la mezzanotte funziona senza problemi: 22:00 -> 02:00.
enabledfalsedisplay"&9Night shift x1.25"multiplier1.25from"22:00"to"02:00"schedules.vip4 chiaviSolo per chi ha un permesso: i primi giorni di un rank, per esempio.
enabledfalsedisplay"&dVIP bonus"multiplier1.25permission"shadowbattlepass.booster.vip" challenges.yml
Le sfide 52 impostazioni
challenges.ymlplugins/ShadowBattlePass/challenges.yml Note del file
VERSIONE ITALIANA, nella cartella di questo plugin:
esempi/it_IT/challenges.yml
Per usarla, copiala al posto di questo file.
Qualcosa che tutto il server fa insieme.
"Uccidete cinquantamila zombie entro domenica sera." Una barra, tutti a spingerla, un premio quando si riempie. È questo che trasforma un battle pass da una lista personale di cose da fare in qualcosa di cui si parla in chat - e nessun altro plugin di questo tipo ce l'ha.
Il contributo di ognuno viene registrato, così il premio può essere giusto: chi ha aiutato riceve qualcosa, chi ha aiutato di più riceve di più, e chi si è presentato all'ultimo minuto non si porta a casa lo stesso premio di chi ha tirato la carretta.
Gli obiettivi usano gli stessi tipi delle quest: docs/05-OBIETTIVI.md
config-version2enabledtruechallenges3 chiaviSabato sera, due ore, tutti a uccidere non-morti
challenges.purge13 chiavienabledtruedisplay"<gradient:#EF5350:#B71C1C><bold>The Purge</bold></gradient>"description["&7The whole server against the undead.", "&7Two hours to take out ten thousand."]+1
iconZOMBIE_HEADchallenges.purge.objective3 chiavitypeMOB_KILLtarget[ZOMBIE, SKELETON, HUSK, DROWNED, STRAY, ZOMBIE_VILLAGER]+3
no-spawner-mobstrueI mob da spawner non contano: sarebbe una scorciatoia, non una battaglia.
challenges.purgegoal10000duration2hauto-starttrueQuando parte da sola. Togli "auto-start" per avviarla solo a mano, con /bpa challenge start purge.
periodWEEKLYdays[SATURDAY]at"21:00"xp-per-contribution2Esperienza data a ogni contributo, mentre la sfida è in corso.
challenges.purge.rewards4 chiavimin-contribution25Quanto devi aver fatto per contare come partecipante.
participant["coins: 100", "money: 10000"]challenges.purge.rewards.top3 chiaviIl primo posto prende il premio "1", secondo e terzo prendono il "3", dal quarto al decimo prendono il "10".
1["bundle: epic-crate", "broadcast: &6<player> led the Purge!"]+1
3["bundle: rare-crate"]10["bundle: common-crate"]challenges.purge.rewardseveryone["booster: 1.5 1h"]Dato a tutti quelli online quando la sfida viene vinta, anche a chi non ha mosso un dito. Fa sentire l'evento a tutti.
Domenica pomeriggio, tutti a scavare
challenges.big-dig13 chiavienabledtruedisplay"<gradient:#4FC3F7:#0288D1><bold>The Great Dig</bold></gradient>"description["&7A hundred thousand blocks of stone.", "&7Sounds like a lot. It is not, if everybody pitches in."]+1
iconDIAMOND_PICKAXEchallenges.big-dig.objective3 chiavitypeBLOCK_BREAKtarget[STONE, DEEPSLATE, ANDESITE, DIORITE, GRANITE, TUFF]+3
no-placed-blockstruechallenges.big-diggoal100000duration3hauto-starttrueperiodWEEKLYdays[SUNDAY]at"16:00"xp-per-contribution1challenges.big-dig.rewards3 chiavimin-contribution200participant["coins: 75"]challenges.big-dig.rewards.top2 chiavi1["bundle: epic-crate"]5["bundle: rare-crate"]Solo a mano: quella da tirare fuori per un evento
challenges.big-catch10 chiavienabledtruedisplay"<gradient:#80DEEA:#00838F><bold>The Big Catch</bold></gradient>"description["&7A thousand fish. Bring patience."]iconFISHING_RODchallenges.big-catch.objective1 chiavetypeITEM_FISHchallenges.big-catchgoal1000duration1hauto-startfalsexp-per-contribution5challenges.big-catch.rewards3 chiavimin-contribution5participant["coins: 150"]challenges.big-catch.rewards.top1 chiave1["item: TRIDENT 1", "coins: 500"] rewards.yml
Le ricompense 15 impostazioni
rewards.ymlplugins/ShadowBattlePass/rewards.yml Note del file
VERSIONE ITALIANA, nella cartella di questo plugin:
esempi/it_IT/rewards.yml
Copiala al posto di questo file per usarla.
Pacchetti di ricompense con nome.
Scrivi un pacchetto qui una volta, poi richiamalo da dove vuoi - un livello della stagione, una missione, una voce dello shop, una sfida - con una riga:
- "bundle: epic-crate"
È proprio questo il senso: se decidi che la crate epica deve dare il doppio dei soldi, lo cambi in un posto solo e cambia in tutti i venti livelli che la usano, senza aprire un solo file di stagione.
Un pacchetto può contenere qualsiasi cosa, pacchetti compresi.
La sintassi completa delle ricompense è in docs/06-RICOMPENSE.md.
config-version2bundles14 chiaviCrate
bundlescommon-crate["coins: 25", "item: EXPERIENCE_BOTTLE 8", "money: 2500"]+1
rare-crate["coins: 75", "item: DIAMOND 3", "money: 10000", "sound: entity.player.levelup 0.8 1.4"]+1
epic-crate["coins: 200", "money: 50000", { type: RANDOM, display: "&dEpic item", picks: 1, options: […] }, "firework: B388FF"]+2
Momenti chiave
bundleswelcome["coins: 25", "item: BREAD 16", "message: &7A little help to get you started."]+1
season-end["coins: 1000", "money: 100000", "booster: 2.0 24h", "item: TOTEM_OF_UNDYING 3", "firework: FFD54F"]+3
Mattoncini riutilizzabili
bundlessnack["item: COOKED_BEEF 16", "item: GOLDEN_CARROT 8"]+1
starter-gear[{ type: ITEM, item: {…} }, "item: TORCH 64"]Esempio con un item di un altro plugin. La riga funziona solo se quel plugin è presente; se manca, il pacchetto lo segnala in console e va avanti con il resto invece di rompersi.
item-custom: - "item: oraxen:mythril_sword" - "item: mmoitems:SWORD:EXCALIBUR"
Kit distribuiti lungo la stagione
Solo item vanilla: funzionano su un server appena installato. Incantati, con un nome, e indistruttibili dove serve, così una ricompensa di livello 15 non è un piccone di ferro che chiunque può craftare.
bundlesiron-kit[{ type: ITEM, item: {…} }, { type: ITEM, item: {…} }, "item: IRON_CHESTPLATE 1", "item: COOKED_BEEF 16"]+3
diamond-kit[{ type: ITEM, item: {…} }, { type: ITEM, item: {…} }, { type: ITEM, item: {…} }, "item: GOLDEN_APPLE 4"]+3
netherite-kit[{ type: ITEM, item: {…} }, { type: ITEM, item: {…} }, "item: NETHERITE_INGOT 2", "item: ENCHANTED_GOLDEN_APPLE 1"]+3
builder-kit["item: STONE_BRICKS 128", "item: OAK_PLANKS 128", "item: GLASS 64", "item: LANTERN 16", "item: SCAFFOLDING 64"]+4
farmer-kit["item: BONE_MEAL 64", "item: WHEAT_SEEDS 32", "item: CARROT 16", "item: POTATO 16", { type: ITEM, item: {…} }, "item: WATER_BUCKET 2"]+4
mob-kit[{ type: ITEM, item: {…} }, "item: ARROW 1", "item: SHIELD 1", "item: COOKED_PORKCHOP 16"]+2
potion-kit["effect: speed 1200 2", "item: GOLDEN_CARROT 16", "item: TOTEM_OF_UNDYING 1", "item: ENDER_PEARL 8", "item: EXPERIENCE_BOTTLE 16"]+4
shop.yml
Il negozio 24 impostazioni
shop.ymlplugins/ShadowBattlePass/shop.yml Note del file
VERSIONE ITALIANA, nella cartella di questo plugin:
esempi/it_IT/shop.yml
Copiala al posto di questo file per usarla.
Cosa si compra con le monete del pass. Le monete arrivano dai livelli e dalle missioni; qui si spendono. Tre scaffali, e ogni scaffale pieno dal primo giorno: uno shop con una sola cosa dentro insegna ai giocatori che le monete non valgono niente, e da lì in poi nessuna missione vale la pena.
Ogni voce:
category: uno degli id sotto "categories" qui sotto
display / description / icon
price: monete, soldi (serve un plugin di economia), o livelli
limit-per-cycle + cycle (DAILY, WEEKLY, MONTHLY, SEASON): quante
volte per giocatore per ciclo; se omesso = nessun limite
limit-per-player: quante volte in totale
conditions: stessa sintassi delle missioni ("tier: >= 30")
rewards: stessa forma breve delle stagioni e delle missioni
featured: true lo fa brillareconfig-version3enabledtruecurrency-name"Pass Coins"categories3 chiavicategories.utili4 chiavidisplay"<green><bold>Useful</bold>"description["&7Things you actually need."]iconCHESTorder0categories.progressi4 chiavidisplay"<gold><bold>Progress</bold>"description["&7To move up faster."]iconLADDERorder1categories.cosmetici4 chiavidisplay"<light_purple><bold>Cosmetics</bold>"description["&7Just for showing off."]iconFIREWORK_ROCKETorder2entries22 chiaviUtili
entries.reroll9 chiavienabledtruecategoryutilidisplay"&eSwap a quest"description["&7A daily quest you do not fancy", "&7is replaced with another one."]+1
iconCLOCKentries.reroll.price1 chiavecoins50entries.rerolllimit-per-cycle2cycleDAILYrewards["reroll: 1"]reroll:
snack, golden-apples, ender-pearls, common-crate, rare-crate, epic-crate, gear, farmer-kit, totem, shulker, booster-2h, booster-6h, xp-pack, tier-skip, vanilla-xp, fireworks, fireworks-show, aura, veteran-title, champion-title, player-head vouchers.yml
I buoni 12 impostazioni
vouchers.ymlplugins/ShadowBattlePass/vouchers.yml Note del file
VERSIONE ITALIANA, nella cartella di questo plugin:
esempi/it_IT/vouchers.yml
Copiala al posto di questo file per usarla.
Voucher: ricompense con un corpo.
Un voucher è un item che, cliccato col tasto destro, fa qualcosa al pass: sblocca una traccia, aggiunge esperienza, consegna un pacchetto.
È ciò di cui uno store ha davvero bisogno: un prodotto che si può regalare, tenere, scambiare e usare quando il compratore ne ha voglia, invece di un comando che scatta al momento del pagamento anche se in quel momento il giocatore non è online.
L'item porta con sé SOLO l'id del voucher, mai il suo contenuto. È la scelta che lo rende sicuro: manomettere l'item non può trasformare un voucher di carbone in uno di diamanti, e cambiare idea significa cambiare un file invece di inseguire ogni copia già in circolazione.
Per consegnarne uno:
/bpa voucher give <player> <id> [amount]
config-version2vouchers6 chiavi seasons/season-1.yml
Stagione: season-1 87 impostazioni
seasons/season-1.ymlplugins/ShadowBattlePass/seasons/season-1.yml Note del file
VERSIONE ITALIANA, nella cartella di questo plugin:
esempi/it_IT/seasons/season-1.yml
Copiala al posto di questo file per usarla.
UNA STAGIONE = UN FILE. Copia questo file, cambiagli nome e id, e hai la stagione 2. Il plugin le trova da solo: non c'è niente da registrare da nessuna parte.
Tre idee tengono corto questo file anche con cento tier:
1. UNA CURVA, NON UNA TABELLA Il costo di ogni tier viene da una formula. Solo i tier che rompono lo schema si scrivono a mano, sotto "overrides".
2. SCHEMI, NON RIPETIZIONI Una ricompensa può essere legata al tier 7, all'intervallo 1-10, a "*5" (ogni quinto tier) o a "default" (ogni tier che nessun altro ha preso). Il numero esatto vince sempre sullo schema, così puoi scrivere prima la regola e l'eccezione dopo.
3. TUTTE LE TRACCE CHE VUOI Free e premium sono solo le due che trovi qui. Puoi aggiungerne altre: ognuna ha il suo permesso, il suo prezzo e le sue ricompense a ogni tier.
config-version2season15 chiaviidseason-1display"<gradient:#FFD54F:#FF8F00><bold>Season 1 - The Lost Lands</bold></gradient>"description["&7Ninety days of exploring, digging and fighting.", "&7A hundred tiers, three tracks, rewards that last.", "&7A hundred and twenty-nine quests in rotation, and two stories."]+2
season.icon2 chiavimaterialNETHER_STARglowtrueseasonenabledtrueQuando si svolge
Puoi indicare una data di inizio e una di fine, o solo una durata. Senza nessuna delle due, la stagione resta attiva finché non ne avvii un'altra a mano con /bpa season start.
seasonduration90dstart: "2026-09-01 00:00" end: "2026-11-30 23:59"
auto-start-nextfalseQuando finisce passa da sola al file della stagione successiva.
Continua a leggere
LA STAGIONE DUE, quando ne vuoi una: copia questo file in seasons/season-2.yml, cambia "id" in season-2 e il display di conseguenza, e imposta le due righe qui sotto a true / season-2. Non c'è nient'altro da registrare, e nel database non c'è niente da svuotare: le righe dei progressi tengono l'id con cui sono state scritte, quindi la stagione 1 resta leggibile per sempre.
Finché quel file non esiste, lasciale come sono. Una stagione che punta a un file che non c'è semplicemente va avanti, ma la console lo segnala ogni volta che controlla, e quel rumore nasconde gli avvisi veri.
next: season-2
Le tracce
season.tracks3 chiaviseason.tracks.free5 chiavidisplay"<green><bold>Free</bold>"description["&7For everyone, always."]iconLIME_DYEdefaulttrueorder0season.tracks.deluxe6 chiavidisplay"<light_purple><bold>Deluxe</bold>"description["&7A third row, for those who want it all."]iconAMETHYST_SHARDorder2permission"shadowbattlepass.deluxe"unlock-retroactivetrueI livelli
I CONTI, così se cambi qualcosa sai cosa hai cambiato. Ogni numero qui sotto è quello che producono davvero i file in quests/.
Continua a leggere
QUANTO COSTA LA SCALA
livello 1 1.000 cumulativo 1.000 livello 10 1.900 14.500 livello 25 3.400 55.000 livello 50 8.000 (override) 174.600 livello 75 8.400 354.600 livello 100 25.000 (override) 611.200
611.200 di esperienza in novanta giorni fanno 6.791 al giorno.
QUANTO RENDONO LE MISSIONI, SE LE COMPLETI
giornaliere 237.449 2.638 al giorno tre su trentanove, più
gli 800 per averle finite tutte e tre
settimanali 251.573 2.795 al giorno quattro delle nove di quella settimana
mensili 127.149 1.413 al giorno due su quindici
premium 98.190 1.091 al giorno due su ventiquattro, riservate
stagionali 335.000 3.722 al giorno quindici, senza reset
catene 166.000 1.844 al giorno undici capitoli, uno alla voltaDOVE ARRIVA UN GIOCATORE
solo le giornaliere livello 59 non finisce giornaliere + settimanali livello 89 non finisce giornaliere + settimanali + mensili livello 100 al giorno 89 su 90 lo stesso, con il premium livello 100 al giorno 77 tutto, free livello 100 al giorno 49 tutto, premium livello 100 al giorno 45
LA RIGA CHE CONTA è la terza. Un giocatore che fa le sue tre giornaliere, le sue quattro settimanali e le sue due mensili, e nient'altro, arriva al centesimo livello il penultimo giorno della stagione. È questa la promessa: presentati, fai la lista, finisci. Le missioni stagionali e le catene non sono obbligatorie - sono il margine per saltare due settimane e farcela lo stesso.
Chi completa davvero tutto finisce intorno al giorno cinquanta e passa il resto della stagione nei livelli infiniti qui sotto, che servono proprio a questo.
Nessuna delle due cifre conta i booster di boosters.yml - weekend x1.5 e happy hour x2 valgono circa un terzo in più per chi gioca la sera - né il bonus di recupero, che aiuta solo chi è indietro. Entrambi sono margine, apposta: una stagione che ha bisogno dei booster per poter essere finita è una stagione che non finisce nessuno.
Che il premium arrivi prima invece di guadagnare di più per livello è voluto: chi paga dovrebbe finire con un paio di settimane di anticipo, non a metà stagione con quarantacinque giorni senza più niente da fare.
Alzare "increment" sposta più in là il traguardo: ogni +10 sono 49.500 di esperienza in più, circa sette giorni al ritmo normale.
season.tiers6 chiavicount100season.tiers.curve5 chiavitypeLINEARLINEAR = base + increment * (tier - 1) EXPONENTIAL = base * multiplier ^ (tier - 1) FLAT = sempre base
base1000increment100multiplier1.05max15000Tetto per il costo di un singolo livello. 0 = nessuno.
season.tiers.overrides2 chiaviI livelli che devono costare qualcosa di diverso da ciò che dice la formula.
50800010025000season.tiersmilestone-every10Quanti livelli tra un segno di traguardo e l'altro nella GUI. 0 = mai.
milestones[1, 25, 75]Traguardi extra, oltre a quelli automatici.
season.tiers.icons19 chiaviIcona personalizzata per singoli livelli. Accetta la stessa forma completa delle ricompense: materiale, texture della testa, modello.
Ogni livello scritto a mano qui sotto ha la sua, così scorrendo la scala si vede dov'è il prossimo premio vero invece di cento pannelli identici.
season.tiers.icons.101 chiavematerialIRON_PICKAXE10:
15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100Oltre l'ultimo livello
Chi finisce la stagione continua a guadagnare: ogni "xp" qui sotto vale un prestigio, con la sua ricompensa. Così la cima della classifica ha ancora un motivo per giocare a novembre.
season.infinite3 chiavienabledtruexp20000rewards["coins: 250", "money: 10000", "broadcast: &d<player> went past the top tier again!"]+1
Quali gruppi di missioni usa questa stagione
Vuoto = ogni gruppo in quests/. Elencandoli, una stagione a tema può usare solo i propri.
seasonquest-pools[daily, weekly, monthly, seasonal, chains, premium]+3
Solo i giocatori che hanno sbloccato il premium vedono questo gruppo: la condizione sta dentro quests/premium.yml, non qui.
join-rewards["coins: 25", "message: <gradient:#FFD54F:#FF8F00>Welcome to Season 1!</gradient>"]+1
Regalo di benvenuto la prima volta che si apre il pass.
completion-rewards["bundle: season-end", "broadcast: <gradient:#FFD54F:#FF8F00><player> completed Season 1!</gradient>"]+1
Ricompensa per aver raggiunto l'ultimo livello.
season.catch-up2 chiaviBonus per i giocatori che restano indietro. I valori generali stanno in config.yml; qui puoi alzare o abbassare il tetto solo per questa stagione.
enabledtruemax-multiplier2.0Le ricompense
Chiave = livello, intervallo, "*n" o "default". Dentro, una lista per traccia.
Continua a leggere
Forma breve, una riga:
- "money: 5000" - "coins: 100" - "xp: 250" - "item: DIAMOND 3" - "tier: 1" - "reroll: 1" - "crate: vote 2" - "booster: 1.5 2h" - "permission: vip 30d" - "command: fly <player> 10m" - "bundle: bundle-name" (definito in rewards.yml) - "broadcast: &6..." - "firework: FFD54F"
Forma lunga, per icone, condizioni, casualità e scelte: vedi il livello 50 qui sotto e docs/06-RICOMPENSE.md.
Questa tabella è già completa: ogni livello dà qualcosa a ogni traccia, dal primo al centesimo. "common-crate", "rare-crate" ed "epic-crate" sono pacchetti definiti in rewards.yml con contenuto vanilla, e così i kit: funzionano su un server appena installato. Con un vero plugin di crate, "bundle: rare-crate" può diventare "crate: rare 1".
COME È COSTRUITA
una base "default", così nessun livello è mai un pannello vuoto
cinque fasce 1-10, 11-25, 26-50, 51-75, 76-99: i soldi crescono con
il numero, così vale la pena arrivare all'ottantesimo livello
due schemi "*5" una crate, "*10" qualcosa di serio
diciannove livelli scritti a mano, uno ogni cinque da dieci a
cento: sono quelli con un nome, un'icona tutta
loro e qualcosa che un giocatore ricorda - i kit
al 10 e al 15, i cosmetici al 20, 30, 55 e 80, le
scelte al 50 e all'85, lo stoccaggio al 65, e la fineCOSA SIGNIFICANO I PREZZI
I soldi qui sono nella valuta di ShadowEconomy, e sono prezzati rispetto a quello shop, non inventati. In shop.yml un diamante si vende a 10 e costa 1.000 per ricomprarlo; un lingotto di netherite costa 12.140, un blocco di netherite 109.260. Quindi:
money: 2500 due diamanti e mezzo dallo scaffale money: 25000 due lingotti di netherite money: 400000 tre blocchi di netherite e mezzo
Su cento livelli, pacchetti compresi, la scala consegna:
free 554.600 e 6.957 monete del pass premium 1.813.000 e 12.195 deluxe 2.795.000 e 17.325
Il riferimento con cui confrontarli è in quests/weekly.yml: "guadagna centomila in una settimana" lì è classificata HARD, quindi il gioco onesto vale circa quattordicimila al giorno. La scala free aggiunge circa seimila al giorno in più - un bonus vero che non sostituisce il giocare. Quelle a pagamento valgono volutamente parecchie volte tanto, perché è quella la cosa che si vende.
SE PENSI CHE SIA TROPPO per la tua economia, non ripassare questa tabella livello per livello. Le missioni premium ne sono la metà più grossa: quests/premium.yml consegna due commissioni al giorno da dieci a diciotto mila ciascuna, cioè circa due milioni e mezzo in una stagione. Dimezzare le righe "money:" in quel solo file è l'unico cambiamento che sposta davvero l'ago, e lascia la scala - la parte che i giocatori guardano davvero - esattamente com'è.
Le monete del pass sono una valuta chiusa: arrivano da qui e dalle missioni e non vanno da nessuna parte se non in shop.yml, dove quelle di una stagione comprano più o meno quello che dovrebbero. Niente su quegli scaffali si può comprare con una carta di credito, ed è questo che rende sicuro tutto il resto.
season.rewards27 chiaviseason.rewards.default3 chiaviOgni livello che non compare più sotto dà almeno questo.
Ci sono tutte e tre le tracce, e questa è la riga più importante del file. Un livello in cui la traccia a pagamento non dà niente è uno slot grigio accanto a uno pieno: il giocatore che ha pagato lo legge come "mi hanno fregato", e non ha tutti i torti. Qui ogni livello dà qualcosa a tutti, e le fasce e i traguardi qui sotto ci aggiungono sopra il resto.
free["coins: 5", "money: 250"]deluxe["coins: 20", "money: 2000", "item: EXPERIENCE_BOTTLE 8"]+1
season.rewards.1-103 chiaviI primi dieci sono generosi apposta: è lì che si decide se qualcuno va avanti o molla.
free["coins: 10", "money: 500", "item: BREAD 8"]deluxe["coins: 40", "money: 4000", "item: GOLDEN_APPLE 2", "item: EXPERIENCE_BOTTLE 8"]+2
season.rewards.11-253 chiaviFasce: i soldi crescono con il livello, così vale la pena arrivare all'ottantesimo livello e non si tratta solo di altre cinque monete.
free["coins: 6", "money: 400"]deluxe["coins: 25", "money: 3000", "item: EXPERIENCE_BOTTLE 12"]+1
default:
26-50, 51-75, 76-99, 15, 25, 35, 40, 55, 60, 70, 75, 80, 90season.rewards.*53 chiaviOgni quinto livello, una crate. Attenzione, questa è la trappola più facile di tutto il file: una chiave qui SOSTITUISCE il default e le fasce, non si aggiunge a loro. Ogni voce deve quindi essere scritta per intero, altrimenti il livello 5 finisce per valere meno del livello 4 e il giocatore se ne accorge subito.
free["coins: 10", "money: 600", "bundle: common-crate"]+1
deluxe["coins: 40", "money: 5000", "bundle: rare-crate", "bundle: snack", "booster: 1.25 30m"]+3
season.rewards.*103 chiaviOgni decimo, qualcosa di serio.
free["coins: 50", "money: 1500", "item: DIAMOND 2", "bundle: common-crate"]+1
deluxe["coins: 200", "money: 20000", "bundle: rare-crate", "bundle: potion-kit", "booster: 1.5 2h"]+3
Eccezioni: essendo numeri esatti, battono gli schemi qui sopra. Da qui al centesimo ce n'è una ogni cinque.
season.rewards.103 chiaviIl primo numero tondo. Dopo dieci livelli, un giocatore decide se questo pass vale i prossimi novanta: questa è la risposta. Un attrezzo, una crate e una scritta che attraversa lo schermo.
free["coins: 60", "money: 2500", "bundle: common-crate", "bundle: starter-gear", "title: <gradient:#FFD54F:#FF8F00>TIER 10|<gray>and we are only getting started"]+3
deluxe["coins: 220", "money: 22000", "bundle: rare-crate", "bundle: starter-gear", "bundle: potion-kit", "booster: 2.0 2h"]+4
season.rewards.203 chiaviIl primo cosmetico. Da qui in poi la traccia alterna: soldi, poi qualcosa da usare, poi qualcosa da farsi vedere addosso.
free["coins: 60", "money: 2500", "item: DIAMOND 3", "bundle: common-crate", "firework: FFD54F"]+2
deluxe["coins: 230", "money: 24000", "bundle: rare-crate", "permission: shadowbattlepass.cosmetic.aura 14d", "item: SHULKER_BOX 1", "booster: 2.0 2h"]+4
season.rewards.303 chiaviUna cosa con un nome, che è il senso di un cosmetico: non è più forte, è solo tua, e tutti possono vedere da dove viene.
free["coins: 110", "money: 4000", "item: DIAMOND 4", "bundle: common-crate"]+1
deluxe["coins: 260", "money: 28000", "bundle: rare-crate", "bundle: potion-kit", { type: ITEM, display: "&5Wanderer's Cloak", item: {…} }, "booster: 2.0 3h"]+4
season.rewards.453 chiaviL'ultimo livello prima della crate di metà percorso: equipaggiamento, così chi arriva a cinquanta ci arriva con qualcosa addosso.
free["coins: 140", "money: 9000", "item: DIAMOND_BLOCK 1", "bundle: common-crate"]+2
deluxe["coins: 430", "money: 60000", "bundle: rare-crate", "bundle: diamond-kit", "booster: 2.0 3h"]+3
season.rewards.503 chiavifree["coins: 400", "money: 20000", "item: NETHERITE_SCRAP 2", "bundle: diamond-kit"]+2
deluxe["coins: 800", "money: 90000", "bundle: potion-kit", "bundle: epic-crate", "item: SHULKER_BOX 2", "permission: shadowbattlepass.cosmetic.aura 30d", "booster: 2.0 6h"]+5
season.rewards.653 chiaviStoccaggio. Poco affascinante, ed è la ricompensa di cui i giocatori parlano davvero.
free["coins: 200", "money: 13000", "item: SHULKER_BOX 1"]+1
deluxe["coins: 420", "money: 50000", "bundle: epic-crate", "item: SHULKER_BOX 3", "item: NETHERITE_INGOT 1"]+3
season.rewards.853 chiaviLa seconda scelta della stagione. Quella al cinquanta riguardava ciò che indossi; questa riguarda come passi gli ultimi quindici livelli.
free["coins: 380", "money: 30000", "bundle: rare-crate"]+1
deluxe["coins: 780", "money: 90000", "bundle: epic-crate", "item: SHULKER_BOX 3", "booster: 2.0 8h"]+3
season.rewards.953 chiaviA cinque livelli dalla fine, e la fine da sola costa venticinquemila. Questo è il livello che paga quell'ultima salita.
free["coins: 500", "money: 40000", "bundle: rare-crate", "item: DIAMOND_BLOCK 3"]+2
deluxe["coins: 1000", "money: 130000", "bundle: epic-crate", "item: NETHERITE_INGOT 6", "permission: shadowbattlepass.cosmetic.aura 30d", "booster: 2.0 12h"]+4
season.rewards.1003 chiaviL'ultimo livello. Vale la pena renderlo memorabile: è quello di cui la gente parla, ed è la pubblicità della prossima stagione.
free["coins: 500", "money: 50000", "item: DIAMOND_BLOCK 4", "bundle: season-end"]+2
deluxe["coins: 1500", "money: 400000", "bundle: epic-crate", "bundle: season-end", "item: NETHERITE_BLOCK 1", { type: ITEM, display: "<gradient:#B388FF:#4527A0>Shadow Crown</gradient>", item: {…} }, "permission: shadowbattlep …+7
Lingue
I testi che il plugin mostra ai giocatori, un file per lingua.
lang/
Testi e messaggi 2 file
lang/plugins/ShadowBattlePass/lang/ Note del file
Formato MiniMessage. I placeholder si scrivono <like_this>. Questo è il fallback finale: una chiave che manca da tutti gli altri file di lingua viene cercata qui, una chiave alla volta. Una chiave che manca da questo file su disco viene letta dalla copia dentro il jar del plugin.
Tutti i messaggi che il plugin mostra ai giocatori, un file per lingua. Le chiavi non sono elencate una per una: qui ci sono i file, quanti testi contengono e i segnaposto che usano.
| File | Lingua | Testi |
|---|---|---|
lang/en_US.yml riferimento | English | 727 |
lang/it_IT.yml | Italiano | 727 |
Segnaposto più usati
Il plugin li sostituisce con il valore giusto: vanno lasciati scritti così.
<prefix><player><id><tier><count><amount><track><value><season><target><xp><coins><quest><goal>
Gruppi di messaggi
prefix1common19command10input4condition26reward25mailbox3pass47quest51objective68track17shop28wallet1leaderboard23info18challenge17choice2notify24booster4season3streak4team1recap26stat12voucher12gift18hologram4admin216license38locked5
Altro
Contenuti pronti, esempi, importazioni: i file che si copiano e si modificano come modello.
quests/
Le missioni, un gruppo per file 6 file
quests/plugins/ShadowBattlePass/quests/ 6 file con la stessa forma. Qui sotto 4 esempi per intero, uno per ogni forma diversa; gli altri sono elencati per nome.
chains.ymldaily.ymlmonthly.ymlpremium.ymlseasonal.ymlweekly.yml
Esempio quests/daily.yml
Note del file
VERSIONE ITALIANA, nella cartella di questo plugin:
esempi/it_IT/quests/daily.yml
Copiala al posto di questo file per usarla.
UN FILE = UN GRUPPO DI MISSIONI. Un nuovo file in questa cartella è un nuovo gruppo: non c'è niente da registrare da nessuna parte.
Il gruppo decide il ritmo (giornaliero, settimanale, ...) e quante missioni riceve un giocatore alla volta. Scrivere trenta missioni giornaliere e darne tre al giorno a caso è ciò che tiene vivo un pass per novanta giorni senza scrivere novanta giorni di contenuti.
L'estrazione è stabile: lo stesso giocatore, nello stesso giorno, riceve sempre le stesse missioni, anche dopo venti riavvii.
Ogni tipo di obiettivo: docs/05-OBIETTIVI.md Ogni condizione: docs/07-CONDIZIONI.md Ogni ricompensa: docs/06-RICOMPENSE.md
config-version2pool12 chiaviiddailydisplay"<yellow><bold>Daily</bold>"description["&7Three new quests every day.", "&7The rotation is wide: in ninety days", "&7the same three hardly ever come back."]+2
periodDAILYiconCLOCKorder0size3Quante ne riceve un giocatore per ciclo. "all" le consegna tutte.
sequentialfalsefalse = il plugin sceglie le missioni a caso, in base al weight. true = vengono consegnate nell'ordine del file, una dopo l'altra (storia).
auto-assigntruepool.rerolls3 chiaviamount1Quante volte al giorno si può cambiare una missione che non ti piace.
cost-coins0Costo in monete del pass, oltre al cambio gratuito. 0 = gratis.
cost-money0poolcompletion-xp800Bonus per averle finite tutte e tre in un giorno. È volutamente alto: tre missioni più questo bonus sono il ritmo giornaliero su cui è tarata la curva dei livelli in seasons/season-1.yml.
completion-rewards["coins: 50", "message: <gradient:#FFD54F:#FF8F00>Day complete!</gradient>"]+1
Le missioni
La forma più piccola è di sei righe:
quest-id:
display: "&bTitle"
xp: 500
objectives:
- type: MOB_KILL
amount: 30Tutto il resto ha un valore di fabbrica sensato.
weight: quanto è probabile che esca. 2 = il doppio della probabilità di un 1. mode: all (tutti gli obiettivi) o any (ne basta uno).
quests39 chiaviscambi
quests.miner8 chiavidisplay"&bTireless miner"description["&7Go down to where the stone turns dark."]quests.miner.icon1 chiavematerialDIAMOND_PICKAXEquests.minerdifficultyEASYweight2.0xp600objectives[{ type: BLOCK_BREAK, target: […], amount: 300…]no-placed-blocksUn blocco piazzato da te non conta.
rewards["coins: 20"]miner:
prospector, lumberjack, farmer, fisher, nether, duelist, wanderer, sightseer, attendance, breeder, trader, enchanter, brewer, crafter, smelter, well-fed, sleeper, blacksmith, grinder, glassblower, bricklayer, coppersmith, spelunker, scavenger, sniper, arachnophobe, tank, sprinter, swimmer, boatman, horseman, jumper, shearer, achiever, pyrotechniccombattimento
quests.hunter8 chiavidisplay"&cNight hunter"description["&7Monsters do not kill themselves."]quests.hunter.icon1 chiavematerialIRON_SWORDquests.hunterdifficultyMEDIUMweight2.0xp800objectives[{ type: MOB_KILL, target: […], amount: 50, no…]no-spawner-mobsI mob da spawner non contano: sarebbe una scorciatoia, non una caccia.
rewards["coins: 30"]esplorazione
varie
quests.full-day9 chiaviUna missione con due obiettivi, da completare entrambi.
display"&6A full day"description["&7A bit of everything."]quests.full-day.icon1 chiavematerialBUNDLEquests.full-daydifficultyHARDweight0.6xp1500modeallobjectives[{ type: BLOCK_BREAK, amount: 200, no-placed-blocks: true }, { type: MOB_KILL, amount: 25, no-spawner-mobs: true }, { type: ITEM_CRAFT, amount: 32 }]+2
rewards["coins: 60", "bundle: snack"]quests.your-way9 chiaviUna missione in cui basta uno qualsiasi degli obiettivi.
display"&dYour way"description["&7Do any one of these things.", "&8Finishing one is enough."]+1
quests.your-way.icon1 chiavematerialCOMPASSquests.your-waydifficultyMEDIUMweight0.8xp900modeanyobjectives[{ type: ORE_MINE, amount: 100 }, { type: MOB_KILL, amount: 60 }, { type: ITEM_FISH, amount: 30 }, { type: CROP_HARVEST, amount: 250 }]+3
rewards["coins: 35"]lavori di tutti i giorni
l'officina
L'incudine, la mola, la fornace: blocchi che quasi tutti i server hanno allo spawn e a cui nessuno ha mai un motivo per avvicinarsi due volte.
sottoterra
combattimento, l'altra metà
in viaggio
Esempio quests/chains.yml
Note del file
VERSIONE ITALIANA, nella cartella di questo plugin:
esempi/it_IT/quests/chains.yml
Copiala al posto di questo file per usarla.
UNA STORIA, NON UNA LISTA.
Un pool con "sequential: true" non estrae niente a caso: distribuisce le quest nell'ordine del file, una dopo l'altra, e la successiva compare solo quando la precedente è finita.
Bastano due chiavi per costruirne una:
requires: [ id ] questa quest compare solo dopo quella hidden: true finché non è sbloccata non è nemmeno visibile
Insieme formano un capitolo che si apre quando ci arrivi, invece di una lista di sedici voci grigie che nessuno legge.
"chain" e "step" servono solo a raggrupparle e ordinarle nella GUI: due catene diverse nello stesso file convivono senza problemi - e questo file ne contiene due.
LA STAGIONE SI LEGGE COME UN LIBRO SOLO
La Via del Cercatore sei capitoli, da un piccone di legno fino alla
cosa in fondo al mondo.
Il Lascito altri cinque, aperti dall'ultimo capitolo del
primo: cosa fa un cercatore una volta che l'ha
trovata. Costruire, commerciare, l'End, e un nome che
resta sul server dopo la stagione.Undici capitoli in novanta giorni, uno alla volta. La seconda catena è nascosta finché la prima non è finita, così un nuovo giocatore vede un inizio e non un muro di undici voci grigie.
config-version2pool12 chiaviidchainsdisplay"<gradient:#B388FF:#4527A0><bold>The Seeker's Path</bold></gradient>"description["&7Two stories, eleven chapters.", "&7The next one opens when you finish this one."]+1
periodSEASONiconWRITTEN_BOOKorder4size1Quante ne ha un giocatore alla volta. Con una catena, una.
sequentialtrueQuesta è la riga che la trasforma in una storia.
auto-assigntruepool.rerolls1 chiaveamount0poolcompletion-xp45000completion-rewards["coins: 1500", "money: 150000", "bundle: epic-crate", "permission: shadowbattlepass.title.cercatore", "broadcast: <gradient:#B388FF:#4527A0><player> read both stories to the very end.</gradient>"]+3
quests11 chiavicapitolo 1
quests.path-110 chiavidisplay"&fI. The first strike"description["&7Every seeker starts out with a pickaxe", "&7and no idea what they are looking for."]+1
quests.path-1.icon1 chiavematerialWOODEN_PICKAXEquests.path-1chainvia-del-cercatorestep1difficultyEASYxp1000objectives[{ type: BLOCK_BREAK, target: […], amount: 100…]rewards["item: STONE_PICKAXE 1", "coins: 25"]unlocks[path-2]path-1:
path-2, path-4, path-5, path-6, legacy-1, legacy-2, legacy-3, legacy-5capitolo 3
quests.path-313 chiavidisplay"&bIII. The deep dark"description["&7Below Y zero there is no light left.", "&7Only black stone, and whatever lives in it."]+1
quests.path-3.icon1 chiavematerialDEEPSLATEquests.path-3chainvia-del-cercatorestep3difficultyMEDIUMrequires[path-2]xp4000modeallobjectives[{ type: BLOCK_BREAK, target: […], amount: 500, max-y: 0, no-placed-blocks: true }, { type: MOB_KILL, amount: 50, max-y: 0, no-spawner-mobs: true }]+1
max-ySolo sotto quota zero: è lì che inizia la vera discesa.
rewards["item: DIAMOND 4", "coins: 100"]unlocks[path-4]Il Lascito - cinque capitoli
Si apre quando la Via del Cercatore è finita. La prima storia parla di scendere; questa parla di ciò che si costruisce dopo essere risaliti. È vincolata all'ultimo capitolo della prima, così le due non compaiono mai nello stesso momento.
capitolo 4
quests.legacy-413 chiavidisplay"&dIV. The sky at the end"description["&7The last door was always open.", "&7Nobody ever looked up, that is all."]+1
quests.legacy-4.icon1 chiavematerialEND_CRYSTALquests.legacy-4chainil-lascitostep4difficultyEPICrequires[legacy-3]xp16000modeallobjectives[{ type: BOSS_KILL, target: […], amount: 1 }, { type: MOB_KILL, target: […], amount: 24, no-spawner-mobs: true }]+1
typeIl drago e gli shulker dicono "sei stato nell'End" senza nominare un mondo: un server che ha rinominato i suoi mondi funziona lo stesso.
rewards["item: SHULKER_BOX 2", "item: DRAGON_BREATH 8", "coins: 450", "money: 60000"]+2
unlocks[legacy-5] Esempio quests/seasonal.yml
Note del file
VERSIONE ITALIANA, nella cartella di questo plugin:
esempi/it_IT/quests/seasonal.yml
Per usarla, copiala al posto di questo file.
Quest che durano quanto la stagione e non si azzerano mai. Vengono tutte assegnate insieme ("size: all"), così dal primo giorno un giocatore vede cosa gli riservano i prossimi tre mesi.
SONO LA FORMA DELLA STAGIONE
Sono tredici, e apposta non sono tredici versioni dello stesso muro di numeri. Quattro sono totali che raggiunge solo chi entra quasi tutti i giorni, quattro premiano l'andare da qualche parte invece di ripetere qualcosa, tre sono imprese una tantum che si possono fare in un pomeriggio se sai come, e due riguardano il pass stesso. Tutte insieme dicono cos'è questa stagione: esplorare, scavare e tornare.
Nessuna si può finire il primo giorno, e nessuna ha bisogno dell'ultima settimana: la stagione ha una forma, non una scadenza.
config-version2pool11 chiaviidseasonaldisplay"<gradient:#FFD54F:#FF8F00><bold>Seasonal</bold></gradient>"description["&7They last as long as the season.", "&7No reset, no hurry."]+1
periodSEASONiconNETHER_STARorder3sizeallauto-assigntruepool.rerolls1 chiaveamount0poolcompletion-xp50000completion-rewards["coins: 2000", "money: 250000", "bundle: season-end", "permission: shadowbattlepass.title.leggenda", "broadcast: <gradient:#FFD54F:#FF8F00><player> finished every seasonal quest!</gradient>"]+3
Lo stesso titolo che dà il centesimo livello della traccia deluxe. Due strade per un unico distintivo è una scelta voluta: il giocatore che ha completato tutte le missioni stagionali se l'è guadagnato quanto quello che è salito fino in cima.
quests15 chiaviquests.hundred-thousand7 chiavidisplay"&bA hundred thousand"description["&7A hundred thousand blocks over the whole s…]quests.hundred-thousand.icon1 chiavematerialNETHERITE_PICKAXEquests.hundred-thousanddifficultyEPICxp25000objectives[{ type: BLOCK_BREAK, amount: 100000, no-place…]rewards["coins: 1500", "bundle: epic-crate"]hundred-thousand:
legend, globetrotter, three-worlds, loyal, companion, deep-hundred, builder-of-things, harvest-season, long-road, dragonslayer, deep-dark, ancient-hoard, the-climb, hundred-questsi totali
la strada
le imprese
templates/
I modelli di stagione 13 file
templates/plugins/ShadowBattlePass/templates/ 13 file con la stessa forma. Qui sotto 4 esempi per intero, uno per ogni forma diversa; gli altri sono elencati per nome.
index.ymlpvp/daily.ymlpvp/premium.ymlpvp/season.ymlpvp/weekly.ymlskyblock/daily.ymlskyblock/premium.ymlskyblock/season.ymlskyblock/weekly.ymlsurvival/daily.ymlsurvival/premium.ymlsurvival/season.ymlsurvival/weekly.yml
Esempio templates/survival/season.yml
Template "survival" - la stagione
Note del file
VERSIONE ITALIANA, nella cartella di questo plugin:
esempi/it_IT/templates/survival/season.yml
Una volta applicato il template, copiala al posto di seasons/survival.yml (cioè dopo /bpa template apply survival).
Cinquanta livelli in trenta giorni, due tracce: free e premium.
I CONTI, così sai cosa stai installando e cosa cambiare:
La stagione vale 99.000 di esperienza in totale (curva lineare: 1.000 al primo livello, 2.960 al cinquantesimo).
Un giocatore FREE che fa le sue quest ogni giorno guadagna:
3 giornaliere x ~600 = 1.800 bonus giornata completa = 500 settimanali (2 x 4.000) = ~1.150 al giorno
circa 3.450 al giorno -> finisce intorno al giorno 28
Un giocatore PREMIUM ha anche due missioni al giorno da 400:
circa 4.250 al giorno -> finisce intorno al giorno 23, e da lì in poi prosegue nei livelli infiniti.
Continua a leggere
Se il tuo server è più o meno attivo di così, la manopola giusta è "increment" qui sotto: alzarlo allunga la stagione, abbassarlo la accorcia. Non toccare "count" una volta iniziata una stagione.
config-version2season15 chiaviidsurvivaldisplay"<gradient:#66BB6A:#1B5E20><bold>Survival Season</bold></gradient>"description["&7Thirty days. Fifty tiers.", "&7Dig, build, survive."]+1
season.icon2 chiavimaterialGRASS_BLOCKglowtrueseasonenabledtrueduration30dauto-start-nextfalseLe due tracce
season.tracks2 chiaviseason.tracks.free5 chiavidisplay"<green><bold>Free</bold>"description["&7For everyone, always."]iconLIME_DYEdefaulttrueorder0I livelli
season.tiers5 chiavicount50season.tiers.curve3 chiavitypeLINEARbase1000increment40season.tiers.overrides2 chiaviI due livelli che devono pesare più degli altri.
253000506000season.tiersmilestone-every10milestones[1, 25]season.infinite3 chiavienabledtruexp5000rewards["coins: 100", "money: 5000"]seasonquest-pools[survival-daily, survival-weekly, survival-premium]+1
Solo le missioni di questo template: le giornaliere di esempio del plugin restano fuori, così due bilanciamenti diversi non si mescolano.
join-rewards["coins: 25", "item: BREAD 16", "message: <gradient:#66BB6A:#1B5E20>Welcome to the season!</gradient> <gray>Open <white>/bp</white> to begin."]+1
completion-rewards["coins: 1000", "money: 100000", "booster: 2.0 24h", "broadcast: <gradient:#66BB6A:#1B5E20><player> completed the Survival Season!</gradient>"]+2
season.catch-up2 chiavienabledtruemax-multiplier2.0Le ricompense
Questo è il ritmo, e vale la pena capirlo prima di cambiarlo:
Continua a leggere
ogni livello free: monete premium: monete + soldi
ogni 5 livelli free: materiali utili premium: una crate
ogni 10 livelli free: qualcosa di buono
premium: crate rara + booster
livello 25 il regalo di metà stagione
livello 50 quello di cui la gente parlaLe voci "bundle" sono i pacchetti in rewards.yml: cambia quelli e cambi in un colpo ogni livello che li usa.
season.rewards8 chiaviseason.rewards.default2 chiavifree["coins: 8"]season.rewards.1-52 chiaviI primi cinque livelli sono generosi apposta: è lì che un giocatore decide se questo pass fa per lui o no.
free["coins: 20", "money: 1500"]default:
*5, *10, 10, 25, 40, 50 Esempio templates/skyblock/daily.yml
Template "skyblock" - le missioni giornaliere
Note del file
VERSIONE ITALIANA, nella cartella di questo plugin:
esempi/it_IT/templates/skyblock/daily.yml
Una volta applicato il template, copiala al posto di quests/skyblock-daily.yml (dopo /bpa template apply skyblock).
Dodici quest, tre al giorno. Nessuna ti chiede di andare da qualche parte: su un'isola non si viaggia, si produce.
NOTA: le quest che dipendono da un altro plugin (guadagnare soldi, alzare il livello dell'isola) mancano apposta, così questo template funziona anche su un server appena installato. Aggiungerle è facile, e l'esempio è in fondo al file.
config-version2pool11 chiaviidskyblock-dailydisplay"<yellow><bold>Daily</bold>"description["&7Three new quests every day."]periodDAILYiconCLOCKorder0size3auto-assigntruepool.rerolls2 chiaviamount1cost-coins0poolcompletion-xp500completion-rewards["coins: 30", "message: <gradient:#FFD54F:#FF8F00>Day complete!</gradient>"]+1
quests12 chiaviil generatore
quests.skyblock-generator8 chiavidisplay"&7The generator"description["&7Five hundred blocks from the cobblestone g…]quests.skyblock-generator.icon1 chiavematerialCOBBLESTONEquests.skyblock-generatordifficultyEASYweight2.2xp500objectives[{ type: BLOCK_BREAK, target: […], amount: 500…]no-placed-blocksSu un generatore i blocchi non sono "piazzati da te": nascono. Se il tuo generatore usa blocchi che il plugin vede come piazzati, togli questa riga.
rewards["coins: 15"]skyblock-generator:
skyblock-furnace, skyblock-harvest, skyblock-cane, skyblock-breeding, skyblock-trees, skyblock-crafter, skyblock-enchanter, skyblock-trader, skyblock-mobs, skyblock-fishing, skyblock-your-wayLe missioni che dipendono da un altro plugin
Decommentale quando quel plugin è presente. Senza, resterebbero a zero e sprecherebbero uno dei tre slot del giorno.
skyblock-earnings:
display: "&6Chi lavora guadagna"
icon:
material: GOLD_INGOT
difficulty: MEDIUM
weight: 1.2
xp: 650
objectives:
- type: MONEY_EARN # richiede ShadowEconomy
amount: 50000
rewards:
- "coins: 20"skyblock-island:
display: "&bL'isola cresce"
icon:
material: BEACON
difficulty: HARD
weight: 0.8
xp: 900
objectives:
- type: ISLAND_LEVEL # richiede ShadowSkyBlock
amount: 50
rewards:
- "coins: 40" Esempio templates/pvp/daily.yml
Template "pvp" - le missioni giornaliere
Note del file
VERSIONE ITALIANA, nella cartella di questo plugin:
esempi/it_IT/templates/pvp/daily.yml
Una volta applicato il template, copiala al posto di quests/pvp-daily.yml (dopo /bpa template apply pvp).
Undici missioni, tre al giorno, tra 500 e 900 di esperienza.
Si possono fare tutte da soli contro i mob: nessuno dovrebbe dipendere da quante persone sono online per fare progressi. La missione che chiede di uccidere GIOCATORI è l'unica eccezione, ed è commentata in fondo con le sue ragioni.
config-version2pool11 chiaviidpvp-dailydisplay"<yellow><bold>Daily</bold>"description["&7Three new quests every day."]periodDAILYiconCLOCKorder0size3auto-assigntruepool.rerolls2 chiaviamount1cost-coins0poolcompletion-xp400completion-rewards["coins: 30", "item: GOLDEN_APPLE 2"]quests11 chiavicombattimenti
quests.pvp-hunt8 chiavidisplay"&cHunting party"description["&7Sixty monsters.", "&8Mobs from spawners do not count."]+1
quests.pvp-hunt.icon1 chiavematerialIRON_SWORDquests.pvp-huntdifficultyEASYweight2.2xp550objectives[{ type: MOB_KILL, amount: 60, no-spawner-mobs…]rewards["coins: 18"]pvp-hunt:
pvp-damage, pvp-skeletons, pvp-hostiles, pvp-nether, pvp-endure, pvp-smith, pvp-anvil, pvp-supplies, pvp-ores, pvp-your-wayLa missione per uccidere giocatori
Decommentala solo se sai cosa stai facendo.
Su un server tranquillo è impossibile e brucia uno slot per tutto il giorno; su uno affollato diventa un incentivo a campare l'uscita dello spawn. Se la attivi, tieni basso il numero (tre bastano e avanzano) e basso il weight, così esce di rado.
pvp-duel:
display: "&4Duellante"
description:
- "&7Tre giocatori."
icon:
material: PLAYER_HEAD
difficulty: HARD
weight: 0.5
xp: 900
objectives:
- type: PLAYER_KILL
amount: 3
rewards:
- "coins: 50" Esempio templates/index.yml
Note del file
Il catalogo dei battle pass già pronti.
Questo file vive DENTRO il jar e non viene mai estratto: i template che non applichi non ingombrano mai la cartella del plugin.
/bpa template list /bpa template info <id> /bpa template apply <id>
Applicare copia i file al loro posto e niente di più: non avvia niente e non sovrascrive niente. Da lì in poi sono normali file YAML, modificabili a mano o con l'editor in gioco.
Sotto "files" la chiave è il nome del file dentro la cartella del template SENZA .yml (un punto in una chiave YAML verrebbe letto come un percorso annidato), e il valore è dove finisce nella cartella del plugin. Quindi "season: seasons/survival.yml" significa: prendi templates/survival/season.yml e scrivilo in seasons/survival.yml.
config-version2templates3 chiaviSurvival classico
templates.survival7 chiavidisplay"<gradient:#66BB6A:#1B5E20><bold>Survival</bold></gradient>"flavour"Mine, build, survive"description["The pass for an ordinary survival server.", "Quests for digging, gathering, fighting and exploring,", "tuned for someone who plays an hour or two a day.", "", "Whoever plays every day reaches the end around day 28."]+4
tiers50days30quests28templates.survival.files4 chiaviseason"seasons/survival.yml"daily"quests/survival-daily.yml"weekly"quests/survival-weekly.yml"SkyBlock
templates.skyblock7 chiavidisplay"<gradient:#4FC3F7:#0288D1><bold>SkyBlock</bold></gradient>"flavour"Island, farms, economy"description["The pass for a skyblock server.", "Quests about generators, farms, trading and money,", "with little that depends on exploring.", "", "It works well with the island team pass."]+4
tiers50days30quests25templates.skyblock.files4 chiaviseason"seasons/skyblock.yml"daily"quests/skyblock-daily.yml"weekly"quests/skyblock-weekly.yml"PvP e combattimento
templates.pvp7 chiavidisplay"<gradient:#EF5350:#B71C1C><bold>PvP</bold></gradient>"flavour"Fight, hunt, outlive the others"description["The pass for a server where people fight.", "Quests about kills, damage, gear and bosses,", "with rewards meant for those who keep coming back to the arena.", "", "Shorter and steeper: 40 tiers in 30 days."]+4
tiers40days30quests23templates.pvp.files4 chiaviseason"seasons/pvp.yml"daily"quests/pvp-daily.yml"weekly"quests/pvp-weekly.yml"