Generierung von Fortschritten
VORAUSSETZUNGEN
Stelle sicher, dass du den Prozess der Einrichtung des Datengenerators zuerst abgeschlossen hast.
Einrichtung
Zuerst müssen wir unseren Provider erstellen. Erstelle eine Klasse, die von FabricAdvancementProvider erbt und fülle die Basismethoden aus:
java
No lines matched.1
Um die Einrichtung abzuschließen, füge den Provider zu deinem DataGeneratorEntrypoint in der onInitializeDataGenerator Methode hinzu.
java
No lines matched.1
Struktur eines Fortschritts
Ein Fortschritt setzt sich aus mehreren Komponenten zusammen. Neben den Voraussetzungen, auch als "Kriterien" bezeichnet, kann er auch folgendes haben:
- Ein
DisplayInfo, das dem Spiel mitteilt, wie der Fortschritt den Spielern angezeigt werden soll, AdvancementRequirements, bei denen es sich um Listen von Kriterien handelt, von denen mindestens ein Kriterium aus jeder Teilliste erfüllt sein muss,AdvancementRewards, die der Spieler für den Abschluss des Fortschritts erhält.- Eine
Strategy, die dem Fortschritt mitteilt wie er mehrere Kriterien verarbeiten soll, und - Ein übergeordnetes
Advancement, das die Hierachie organisiert, welche du in dem "Fortschritt" Fenster sehen kannst.
Einfacher Fortschritt
Hier ist ein einfacher Fortschritt, um einen Erdblock zu erhalten:
java
No lines matched.1
WARNING
Denke bei der Erstellung deiner Einträge für Fortschritte daran, dass die Funktion den Identifier des Fortschritts im Format String annimmt!
JSON Ausgabe
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
Ein weiteres Beispiel
Um den Dreh raus zu bekommen, fügen wir noch einen weiteren Fortschritt hinzu. Wir üben das Hinzufügen von Belohnungen, die Verwendung mehrerer Kriterien und die Zuweisung von Eltern:
java
No lines matched.1
Benutzdefinierte Kriterien
WARNING
Während der Datengenerator auf der Client-Seite liegen kann, befinden sich Criterions und Predicates im Hauptquellenverzeichnis (beide Seiten), da der Server sie auslösen und auswerten muss.
Definitionen
Ein Kriterium (Plural: Kriterien) ist etwas, was Spieler machen können (oder was einem Spieler passieren kann) was möglicherweise einem Fortschritt angerechnet wird. Das Spiel kommt mit vielen Kriterien, welche in dem net.minecraft.advancements.criterion Packet gefunden werden können. Generell musst du nur ein neues Kriterium hinzufügen, wenn du eine benutzdefinierte Mechanik zum Spiel hinzufügst.
Bedingungen werden von Kriterien ausgewertet. Ein Kriterium wird nur gezählt, wenn alle relevanten Bedingungen zutreffen. Bedingungen werden in der Regel durch ein Prädikat ausgedrückt.
Ein Prädikat ist etwas, das einen Wert entgegennimmt und einen boolean zurück gibt. Zum Beispiel, ein Predicate<Item> gibt möglicherweise true zurück, wenn das Item ein Diamant ist, während ein Predicate<LivingEntity> möglicherweise true zurückgibt, wenn die Entität nicht gegenüber einem Dorfbewohner feindlich gesinnt ist.
Erstellen von benutzdefinierten Kriterien
Zuerst müssen wir eine neue Mechanik implementieren. Wir können dem Spieler jedes Mal, wenn er einen Block abbaut, mitteilen, welches Werkzeug er benutzt hat.
java
No lines matched.1
Beachte, dass dieser Code wirklich schlecht ist. Die HashMap wird nirgendwo dauerhaft gespeichert, daher wird sie bei jedem Neustart des Spiels zurückgesetzt. Es geht nur darum, Criterions aufzuzeigen. Starte das Spiel und teste es!
Als Nächstes erstellen wir unser benutzerdefiniertes Kriterium UseToolCriterion. Es wird seine eigene Klasse Conditions benötigen, also werden wir beide auf einmal erstellen:
java
No lines matched.1
Puh, das ist eine Menge! Schauen wir uns das mal genauer an.
UseToolCriterionist einSimpleCriterionTrigger, auf dasConditionsangewendet werden können.Conditionshat einplayerPredicateFeld. AlleConditionssollten ein Spielerprädikat haben (technisch gesehen einLootContextPredicate).Conditionshaben auch einenCODEC. DieserCodecist einfach der Codec für sein einziges Feld,playerPredicate, mit zusätzlichen Anweisungen zur Konvertierung zwischen ihnen (xmap).
INFO
Um mehr über Codecs zu erfahren, sieh dir die Codecs Seite an.
Wir brauchen einen Weg, um zu überprüfen, ob Bedingungen erfüllt sind. Lasst uns eine Hilfsmethode zu Conditions hinzufügen:
java
No lines matched.1
Da wir nun ein Kriterium und seine Bedingungen haben, brauchen wir eine Möglichkeit, es auszulösen. Füge eine Auslösungsmethode zu UseToolCriterion hinzu:
java
No lines matched.1
Fast geschafft! Als nächstes benötigen wir eine Instanz unseres Kriteriums, mit der wir arbeiten können. Fügen wir sie in eine neue Klasse mit dem Namen ModCriteria ein.
java
No lines matched.1
Um sicherzustellen, dass unsere Kriterien zum richtigen Zeitpunkt initialisiert werden, füge eine leere init-Methode hinzu:
java
No lines matched.1
Und rufe es in deinem Mod-Initialisierer auf:
java
No lines matched.1
Schließlich müssen wir unsere Kriterien auslösen. Füge dies zu der Stelle hinzu, an der wir in der Hauptmodklasse eine Nachricht an den Spieler geschickt haben.
java
No lines matched.1
Dein neues Kriterium ist jetzt einsatzbereit! Lasst es uns zu unserem provider hinzufügen:
java
No lines matched.1
Führe den Datengenerator Task erneut aus und du hast einen neuen Fortschritt bekommen, mit dem du spielen kannst!
Bedingungen mit Parametern
Das ist alles schön und gut, aber was ist, wenn wir einen Fortschritt nur dann gewähren wollen, wenn wir etwas fünfmal getan haben? Und warum nicht noch einen bei zehn Mal? Hierfür müssen wir unserer Bedingung einen Parameter geben. Du kannst bei UseToolCriterion bleiben, oder du kannst mit einem neuen ParameterizedUseToolCriterion nachziehen. In der Praxis solltest du nur die parametrisierte Variante haben, aber für dieses Tutorial werden wir beide behalten.
Lass uns von unten nach oben arbeiten. Wir müssen prüfen, ob die Anforderungen erfüllt sind, also bearbeiten wir unsere Methode Conditions#requirementsMet:
java
No lines matched.1
requiredTimes existiert nicht, also mache es zu einem Parameter von Conditions:
java
No lines matched.1
Jetzt ist unser Codec fehlerhaft. Lass uns einen neuen Codec für die neuen Änderungen schreiben:
java
No lines matched.1
Nun müssen wir unsere trigger-Methode korrigieren:
java
No lines matched.1
Wenn du ein neues Kriterium erstellt hast, müssen wir es zu ModCriteria hinzufügen
java
No lines matched.1
Und rufe sie in unserer Hauptklasse auf, genau dort, wo die alte Klasse ist:
java
No lines matched.1
Füge den Fortschritt zu deinem Provider hinzu:
java
No lines matched.1
Führe den Datengenerator erneut aus, und du bist endlich fertig!





