Generazione di Progressi
PREREQUISITI
Assicurati di aver prima completato il processo di configurazione della datagen.
Configurazione
Anzitutto, dobbiamo creare il nostro fornitore. Crea una classe che estenda FabricAdvancementProvider e compilane i metodi di base:
java
No lines matched.1
Per completare la configurazione, aggiungi questo fornitore alla tua DataGeneratorEntrypoint nel metodo onInitializeDataGenerator.
java
No lines matched.1
Struttura dei Progressi
Un progresso è composto di alcune componenti diverse. Assieme ai requisiti, detti "criterio", potrebbe avere:
- Un oggetto
DisplayInfoche dica al gioco come mostrare il progresso ai giocatori, AdvancementRequirements, ovvero liste di liste di criteri, che richiedono che almeno un criterio di ogni sotto-lista sia soddisfatto,AdvancementRewards, che il giocatore riceverà per aver completato il progresso,- Una
Strategy, che informa il progresso su come gestire criteri multipli, e - Un
Advancementgenitore, che organizza la gerarchia che vedi nella schermata "Progressi".
Progressi Semplici
Ecco un semplice progresso per aver ottenuto un blocco di terra:
java
No lines matched.1
WARNING
Nel costruire le voci del tuo progresso, ricorda che la funzione accetta l'Identifier del progresso nel formato String!
Output JSON
json
{
"criteria": {
"got_dirt": {
"conditions": {
"items": [
{
"items": "minecraft:dirt"
}
]
},
"trigger": "minecraft:inventory_changed"
}
},
"display": {
"background": "minecraft:textures/gui/advancements/backgrounds/adventure.png",
"description": "Now make a house from it",
"icon": {
"id": "minecraft:dirt"
},
"title": "Your First Dirt Block"
},
"requirements": [
[
"got_dirt"
]
],
"sends_telemetry_event": true
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Un Altro Esempio Ancora
Solo per capirne il funzionamento, aggiungiamo un altro progresso. Faremo pratica con l'aggiunta di ricompense, l'uso di criterio multiplo, e l'assegnazione di genitori:
java
No lines matched.1
Criteri Personalizzati
WARNING
Anche se la datagen può avvenire lato client, i Criterion e i Predicate sono nell'insieme di codice main (entrambi i lati), poiché il server ne ha bisogno per innescarli e valutarli.
Definizioni
Un criterio (in inglese criterion, plurale criteria) è qualcosa che un giocatore può fare (o che succede a un giocatore) e che può essere considerata per quanto riguarda un progresso. Nel gioco ci sono già vari criteri, che si possono trovare nel package net.minecraft.advancements.criterion. In genere dovrai aggiungere un nuovo criterio solo se devi implementare una meccanica personalizzata nel gioco.
Le condizioni sono valutate dai criteri. Un criterio viene preso in considerazione solo se tutte le condizioni rilevanti sono soddisfatte. Le condizioni di solito si esprimono come predicati.
Un predicato è qualcosa che accetta un valore e restituisce un boolean. Per esempio, un Predicate<Item> potrebbe restituire true se l'oggetto è un diamante, mentre un Predicate<LivingEntity> potrebbe restituire true se l'entità non è ostile ai villici.
Creare Criteri Personalizzati
Anzitutto ci serve una meccanica da implementare. Informiamo il giocatore riguardo a quale utensile ha usato ogni volta che rompe un blocco.
java
No lines matched.1
Nota che questo è del codice molto brutto. La HashMap non viene memorizzata persistentemente, quindi sarà resettata ad ogni riavvio del gioco. È solo per mostrare i Criterion. Avvia il gioco e provalo!
Ora, creiamo il nostro criterio personalizzato, UseToolCriterion. Avrà bisogno di una sua classe Conditions, quindi creeremo entrambe insieme:
java
No lines matched.1
Wow, questo è un sacco! Analizziamolo poco per volta.
UseToolCriterionè unSimpleCriterionTrigger, al quale si possono applicare delleConditions.Conditionsha un attributoplayerPredicate. Tutte leConditionsdovrebbero avere un predicato del giocatore (tecnicamente unLootContextPredicate).Conditionsha anche unCODEC. QuestoCodecè semplicemente il codec per il suo unico attributo,playerPredicate, con istruzioni aggiuntive per convertirlo tra di essi (xmap).
INFO
Per saperne di più sui codec, controlla la pagina Codec.
Ci serve un modo per controllare se le condizioni sono soddisfatte. Aggiungiamo un metodo ausiliare a Conditions:
java
No lines matched.1
Ora che abbiamo un criterio e le sue condizioni, ci serve un modo per innescarlo. Aggiungi un metodo d'innesco a UseToolCriterion:
java
No lines matched.1
Ci siamo quasi! Ora, ci serve un'istanza del nostro criterio con cui lavorare. Mettiamola in una nuova classe, chiamata ModCriteria.
java
No lines matched.1
Per assicurarci che i nostri criteri siano inizializzati al tempo giusto, aggiungi un metodo vuoto init:
java
No lines matched.1
E chiamalo nell'initializer della tua mod:
java
No lines matched.1
Infine, dobbiamo innescare i nostri criteri. Aggiungi questo a dove inviamo un messaggio al giocatore nella classe main della mod.
java
No lines matched.1
Il tuo criterio nuovo e luccicante è ora pronto per l'uso! Aggiungiamolo al nostro fornitore:
java
No lines matched.1
Esegui l'operazione di datagen di nuovo, e avrai con te un nuovo progresso con cui giocare!
Condizioni con Parametri
Tutto questo è bello e tutto, ma, e se volessimo solo concedere il progresso dopo aver fatto qualcosa 5 volte? E perché non concederne un altro dopo 10 volte? Per questo dovremo dare alla nostra condizione un parametro. Puoi attenerti a UseToolCriterion, o andare avanti qui con un nuovo ParameterizedUseToolCriterion. Nella pratica dovresti solo avere quello parametrizzato, ma li terremo entrambi per questo tutorial.
Lavoriamo dal basso verso l'alto. Dovremo verificare se i requisiti sono soddisfatti, quindi modifichiamo il nostro metodo Conditions#requirementsMet:
java
No lines matched.1
requiredTimes non esiste, quindi rendilo un parametro di Conditions:
java
No lines matched.1
Ora il nostro codec dà errore. Scriviamo un nuovo codec per le nuove modifiche:
java
No lines matched.1
Andando avanti, dobbiamo ora aggiustare il nostro metodo trigger:
java
No lines matched.1
Se hai creato un nuov criterio, dobbiamo aggiungerlo a ModCriteria
java
No lines matched.1
E chiamarlo nella nostra classe principale, proprio dove c'è quello vecchio:
java
No lines matched.1
Aggiungi il progresso al tuo fornitore:
java
No lines matched.1
Esegui nuovamente la datagen, e hai finalmente finito!





