Статистика 26.1.2
Узнайте, как создать и использовать пользовательскую статистику игроков.
Статистика (или Статы) — это способ отслеживать определенные действия или время, проведенное игроком в мире. Ванильная игра отслеживает статистику для стандартных действий, таких как прыжки, передвижение на лодках, взаимодействие с блоками, использование предметов и многое другое. Также можно добавить свою собственную статистику для отслеживания любого взаимодействия.
Создание показателя статистики
Чтобы добавить новый показатель, нужно создать его идентификатор (Identifier), который будет использоваться для регистрации и последующего его использования:
java
public static final Identifier FRIENDSHIPS_MADE = register("friendships_made", StatFormatter.DEFAULT);1
Затем зарегистрируйте показатель:
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
При добавлении показателя на экран "Статистика" через Stats.CUSTOM.get() вы также можете указать форматировщик (formatter), который определяет, как число отображается в списке. Ванильная игра предоставляет следующие форматировщики:
DEFAULT: отображает число без изменений.DIVIDE_BY_TEN: отображает число в десятичной форме, делённое на десять.DISTANCE: отображает число как расстояние. В зависимости от величины значения оно будет показано в сантиметрах, метрах или километрах.TIME: отображает число как время. В зависимости от величины значения оно будет показано в секундах, минутах, часах или днях.
Не забудьте инициализировать класс ModStats в инициализаторе вашего мода:
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
Использование созданного показателя статистики
В этом примере мы создадим блок Друзей (Friends block), который "дружит" со своими соседями. Мы будем отслеживать, сколько дружеских связей игрок установил с помощью этого блока.
Для этого мы используем метод Player#awardStat(stat, amount), чтобы увеличить значение статистики на количество соседей, которое было у блока в момент его размещения:
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
Вы также можете использовать Player#awardStat(stat), чтобы увеличить значение статистики на 1.
Поскольку блоки Друзей очень привязаны друг к другу, разрушение одного из них означает разрушение всех дружеских связей. Давайте сделаем так, чтобы разрушение блока Друзей сбрасывало статистику игрока обратно на 0 с помощью метода Player#resetStat():
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






