Skip to content

Commit eb74f5d

Browse files
authored
Feature: Statistic placeholder (#57)
* feat: Statistic placeholder * move statistic resolver into its own class * remove leftover imports * fix indentation * also fix indentation * make placeholder player only
1 parent 26a57f0 commit eb74f5d

File tree

3 files changed

+71
-1
lines changed

3 files changed

+71
-1
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,6 @@ Player Expansion for MiniPlaceholders
3333
<player_world>
3434
3535
<player_team>
36+
37+
<player_statistic:<statistic>:[parameter]>
3638
```

paper/src/main/java/io/github/miniplaceholders/expansion/player/paper/PaperProvider.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io.github.miniplaceholders.expansion.player.common.resolver.DisplayNameResolver;
66
import io.github.miniplaceholders.expansion.player.common.resolver.LocaleResolver;
77
import io.github.miniplaceholders.expansion.player.common.resolver.NameResolver;
8+
import io.github.miniplaceholders.expansion.player.paper.resolver.StatisticResolver;
89
import net.kyori.adventure.text.Component;
910
import net.kyori.adventure.text.minimessage.tag.Tag;
1011
import org.bukkit.Server;
@@ -44,6 +45,7 @@ public Expansion.Builder provideBuilder() {
4445
})
4546
.audiencePlaceholder(Player.class, "tab_footer", (player, queue, ctx) -> {
4647
return Tag.selfClosingInserting(Optional.ofNullable(player.playerListFooter()).orElse(Component.empty()));
47-
});
48+
})
49+
.audiencePlaceholder(Player.class, "statistic", new StatisticResolver());
4850
}
4951
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package io.github.miniplaceholders.expansion.player.paper.resolver;
2+
3+
import io.github.miniplaceholders.api.resolver.AudienceTagResolver;
4+
import net.kyori.adventure.text.minimessage.Context;
5+
import net.kyori.adventure.text.minimessage.tag.Tag;
6+
import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue;
7+
import org.bukkit.Material;
8+
import org.bukkit.Statistic;
9+
import org.bukkit.entity.EntityType;
10+
import org.bukkit.entity.Player;
11+
import org.jetbrains.annotations.NotNull;
12+
13+
import java.util.Locale;
14+
15+
public final class StatisticResolver implements AudienceTagResolver<@NotNull Player> {
16+
@Override
17+
public @NotNull Tag tag(@NotNull Player player, @NotNull ArgumentQueue queue, @NotNull Context ctx) {
18+
if (!queue.hasNext()) {
19+
return Tag.preProcessParsed("You need to provide a statistic");
20+
}
21+
22+
Statistic statistic;
23+
try {
24+
statistic = Statistic.valueOf(queue.pop().value().toUpperCase(Locale.ROOT));
25+
} catch (IllegalArgumentException e) {
26+
return Tag.preProcessParsed("Unknown statistic");
27+
}
28+
29+
switch (statistic.getType()) {
30+
case UNTYPED -> {
31+
return Tag.preProcessParsed(String.valueOf(player.getStatistic(statistic)));
32+
}
33+
case ITEM, BLOCK -> {
34+
if (!queue.hasNext()) {
35+
return Tag.preProcessParsed("You need to provide a material");
36+
}
37+
38+
Material material;
39+
try {
40+
material = Material.valueOf(queue.pop().value().toUpperCase(Locale.ROOT));
41+
} catch (IllegalArgumentException e) {
42+
return Tag.preProcessParsed("Unknown material");
43+
}
44+
45+
return Tag.preProcessParsed(String.valueOf(player.getStatistic(statistic, material)));
46+
}
47+
case ENTITY -> {
48+
if (!queue.hasNext()) {
49+
return Tag.preProcessParsed("You need to provide an entity");
50+
}
51+
52+
EntityType entity;
53+
try {
54+
entity = EntityType.valueOf(queue.pop().value().toUpperCase(Locale.ROOT));
55+
} catch (IllegalArgumentException e) {
56+
return Tag.preProcessParsed("Unknown entity");
57+
}
58+
59+
return Tag.preProcessParsed(String.valueOf(player.getStatistic(statistic, entity)));
60+
}
61+
default -> {
62+
return Tag.preProcessParsed("Unknown statistic type");
63+
}
64+
}
65+
}
66+
}

0 commit comments

Comments
 (0)