Statistiken 26.1.2
Lerne, wie man benutzerdefinierte Spielerstatistiken erstellt und verwendet.
Statistiken (oder Stats) dienen dazu, bestimmte Aktionen oder die Zeit, die der Spieler in der Welt verbringt, zu erfassen. Vanilla erfasst Statistiken zu gängigen Aktionen wie Springen, Fahren mit Booten, Interaktionen mit Blöcken, der Verwendung von Items und vielem mehr. Es ist auch möglich deine eigenen Staistiken hinzuzufügen, um benutzerdefinierte Interaktionen zu erfassen.
EIne Statistik erstellen
Um eine benutzerdefinierte Statistik hinzuzufügen, erstelle einen Identifier, der zur Registrierung und zum Erhöhen der Statistik verwendet wird:
java
public static final Identifier FRIENDSHIPS_MADE = register("friendships_made", StatFormatter.DEFAULT);1
Dann registriere die Statistik:
java
public class ModStats {
public static final Identifier FRIENDSHIPS_MADE = register("friendships_made", StatFormatter.DEFAULT);
private static Identifier register(String name, StatFormatter formatter) {
Identifier id = Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, name);
Registry.register(BuiltInRegistries.CUSTOM_STAT, name, id);
Stats.CUSTOM.get(id, formatter);
return id;
}
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
Wenn du die Statistik über Stats.CUSTOM.get() zum Statistikbildschirm hinzufügst, kannst du auch den Statistikformatierer festlegen, der bestimmt, wie die Zahl in der Statistikliste angezeigt wird. Vanilla bietet die folgenden Formatierer:
DEFAULT: Zeigt die Zahl direkt an.DIVIDE_BY_TEN: Zeigt die Zahl als Dezimalzahl, geteilt durch zehn, an.DISTANCE: Zeigt die Zahl als Distanz an: Basierend auf der Größe der Zahl, wird dies in Zentimeter, Meter oder Kilometer angezeigt werden.TIME: Zeigt die Zahl als Zeit an. Basierend auf der Größe der Zahl, wird dies als Sekunden, Minuten, Stunden oder Tage angezeigt werden.
Vergiss nicht die Klasse ModStats in deinem Mod-Initialisierer zu initialisieren:
java
public static void initialize() {
}1
2
2
java
public class ExampleModStats implements ModInitializer {
@Override
public void onInitialize() {
ModStats.initialize();
}
}1
2
3
4
5
6
2
3
4
5
6
Verwenden der Statistik
In diesem Beispiel erstellen wir einen Freundeblock, der sich mit seinen Nachbarn anfreundet. Wir werden verfolgen, wie viele Freundschaften der Spieler mit dem Block geschlossen hat.
Um dies zu tun, werden wir die Methode Player#awardStat(stat, amount) verwenden, um den Wert um die Anzahl der Nachbarn zu erhöhen, die der Block beim Platzieren hat:
java
public class FriendsBlock extends Block {
@Override
public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity by, ItemStack itemStack) {
super.setPlacedBy(level, pos, state, by, itemStack);
if (!(by instanceof Player player)) return;
int neighborCount = 0;
for (Direction dir : Direction.values()) {
if (!level.isEmptyBlock(pos.relative(dir))) {
neighborCount++;
}
}
player.awardStat(ModStats.FRIENDSHIPS_MADE, neighborCount);
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Du kannst auch Player#awardStat(stat) verwenden, um die Statistik um 1 zu erhöhen.
Da die Freundeblöcke sehr eng miteinander verbunden sind, bedeutet das Zerstören eines einzigen Blocks das Ende aller Freundschaften. Lasst uns dafür sorgen, dass das Zerstören eines Freundeblocks die Statistik des Spielers auf 0 zurücksetzt, indem wir Player#resetStat() verwenden:
java
@Override
public BlockState playerWillDestroy(Level level, BlockPos pos, BlockState state, Player player) {
player.resetStat(Stats.CUSTOM.get(ModStats.FRIENDSHIPS_MADE));
return super.playerWillDestroy(level, pos, state, player);
}1
2
3
4
5
6
2
3
4
5
6






