Scoreboard objective number format api (#10036)

* feat: number format api

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* feat: make each individual score customizable

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* docs: fix incorrect descriptions

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* feat: use access transformers

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* feat: use adventure codecs

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* test: test for matching styles

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* feat: convert number formats to interfaces

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* feat: add style conversion to adventure patch

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* feat: use paper adventure method in PaperScoreboardFormat

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* chore: rename methods to avoid a method in records

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* fix: check if objective is still registered

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* feat: improve style conversion

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* feat: modify how the getter behaves in score

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* feat: use fluent naming

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* docs: add spaces before the paper comments

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* chore: styling changes

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* chore: make constant final

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* feat: add methods for styled format instead of constants

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* fix: remove incorrect getTrackedPlayers check

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* docs: add . at the end of sentences

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* docs: explain null behaviour

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* docs: mention score creation

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>

* rebase and fix javadoc comments

* remove server implementation defaults

* fix format for PaperScoreboardFormat

---------

Signed-off-by: David Mayr <davidliebtkekse@gmail.com>
Co-authored-by: Jake Potrebic <jake.m.potrebic@gmail.com>
This commit is contained in:
David Mayr 2024-02-17 21:22:00 +01:00 committed by GitHub
parent 9a66f2b2e1
commit 1964b22439
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 392 additions and 5 deletions

View file

@ -1250,7 +1250,7 @@ new file mode 100644
index 0000000000000000000000000000000000000000..2e757cd9b01ac7eba1e4723a6e21dcea9d062483
--- /dev/null
+++ b/src/main/java/io/papermc/paper/adventure/PaperAdventure.java
@@ -0,0 +1,401 @@
@@ -0,0 +1,421 @@
+package io.papermc.paper.adventure;
+
+import com.mojang.brigadier.exceptions.CommandSyntaxException;
@ -1275,6 +1275,7 @@ index 0000000000000000000000000000000000000000..2e757cd9b01ac7eba1e4723a6e21dcea
+import net.kyori.adventure.text.TranslatableComponent;
+import net.kyori.adventure.text.TranslationArgument;
+import net.kyori.adventure.text.flattener.ComponentFlattener;
+import net.kyori.adventure.text.format.Style;
+import net.kyori.adventure.text.format.TextColor;
+import net.kyori.adventure.text.serializer.ComponentSerializer;
+import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
@ -1285,6 +1286,7 @@ index 0000000000000000000000000000000000000000..2e757cd9b01ac7eba1e4723a6e21dcea
+import net.kyori.adventure.translation.Translator;
+import net.kyori.adventure.util.Codec;
+import net.minecraft.ChatFormatting;
+import net.minecraft.Util;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.core.Holder;
+import net.minecraft.core.registries.BuiltInRegistries;
@ -1651,6 +1653,24 @@ index 0000000000000000000000000000000000000000..2e757cd9b01ac7eba1e4723a6e21dcea
+ public static @Nullable ChatFormatting asVanilla(final TextColor color) {
+ return ChatFormatting.getByHexValue(color.value());
+ }
+
+ // Style
+
+ public static net.minecraft.network.chat.Style asVanilla(Style style) {
+ Object encoded = Util.getOrThrow(AdventureCodecs.STYLE_MAP_CODEC.codec()
+ .encodeStart(net.minecraft.util.JavaOps.INSTANCE, style), IllegalStateException::new);
+
+ return Util.getOrThrow(net.minecraft.network.chat.Style.Serializer.CODEC
+ .parse(net.minecraft.util.JavaOps.INSTANCE, encoded), IllegalStateException::new);
+ }
+
+ public static Style asAdventure(net.minecraft.network.chat.Style style) {
+ Object encoded = Util.getOrThrow(net.minecraft.network.chat.Style.Serializer.CODEC
+ .encodeStart(net.minecraft.util.JavaOps.INSTANCE, style), IllegalStateException::new);
+
+ return Util.getOrThrow(AdventureCodecs.STYLE_MAP_CODEC.codec()
+ .parse(net.minecraft.util.JavaOps.INSTANCE, encoded), IllegalStateException::new);
+ }
+}
diff --git a/src/main/java/io/papermc/paper/adventure/WrapperAwareSerializer.java b/src/main/java/io/papermc/paper/adventure/WrapperAwareSerializer.java
new file mode 100644

View file

@ -206,18 +206,18 @@ index 0000000000000000000000000000000000000000..8f07539a82f449ad217e316a7513a170
+
+}
diff --git a/src/main/java/io/papermc/paper/adventure/PaperAdventure.java b/src/main/java/io/papermc/paper/adventure/PaperAdventure.java
index 2e757cd9b01ac7eba1e4723a6e21dcea9d062483..ca80cbe422d766b3d044a5b53ce40bb7f92558e4 100644
index 032d23ecda574ed1a3c740c16d13055f399bd6c4..cf5a4c142ed6d9ab4850373a9041bdc6af5a2a71 100644
--- a/src/main/java/io/papermc/paper/adventure/PaperAdventure.java
+++ b/src/main/java/io/papermc/paper/adventure/PaperAdventure.java
@@ -24,6 +24,7 @@ import net.kyori.adventure.text.TranslationArgument;
import net.kyori.adventure.text.flattener.ComponentFlattener;
@@ -25,6 +25,7 @@ import net.kyori.adventure.text.flattener.ComponentFlattener;
import net.kyori.adventure.text.format.Style;
import net.kyori.adventure.text.format.TextColor;
import net.kyori.adventure.text.serializer.ComponentSerializer;
+import net.kyori.adventure.text.serializer.ansi.ANSIComponentSerializer;
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import net.kyori.adventure.text.serializer.plain.PlainComponentSerializer;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
@@ -111,6 +112,7 @@ public final class PaperAdventure {
@@ -113,6 +114,7 @@ public final class PaperAdventure {
public static final AttributeKey<Locale> LOCALE_ATTRIBUTE = AttributeKey.valueOf("adventure:locale"); // init after FLATTENER because classloading triggered here might create a logger
@Deprecated
public static final PlainComponentSerializer PLAIN = PlainComponentSerializer.builder().flattener(FLATTENER).build();

View file

@ -0,0 +1,138 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: David Mayr <davidliebtkekse@gmail.com>
Date: Sat, 16 Dec 2023 10:40:29 +0100
Subject: [PATCH] add number format api
== AT ==
public net.minecraft.network.chat.numbers.FixedFormat value
public net.minecraft.network.chat.numbers.StyledFormat style
diff --git a/src/main/java/io/papermc/paper/util/PaperScoreboardFormat.java b/src/main/java/io/papermc/paper/util/PaperScoreboardFormat.java
new file mode 100644
index 0000000000000000000000000000000000000000..6064086cc76ef0df999c7057121d0ac22bd4df65
--- /dev/null
+++ b/src/main/java/io/papermc/paper/util/PaperScoreboardFormat.java
@@ -0,0 +1,38 @@
+package io.papermc.paper.util;
+
+import io.papermc.paper.adventure.PaperAdventure;
+import io.papermc.paper.scoreboard.numbers.NumberFormat;
+
+public final class PaperScoreboardFormat {
+
+ private PaperScoreboardFormat() {
+ }
+
+ public static net.minecraft.network.chat.numbers.NumberFormat asVanilla(final NumberFormat format) {
+ final net.minecraft.network.chat.numbers.NumberFormat vanilla;
+ if (format instanceof final io.papermc.paper.scoreboard.numbers.StyledFormat styled) {
+ vanilla = new net.minecraft.network.chat.numbers.StyledFormat(PaperAdventure.asVanilla(styled.style()));
+ } else if (format instanceof final io.papermc.paper.scoreboard.numbers.FixedFormat fixed) {
+ vanilla = new net.minecraft.network.chat.numbers.FixedFormat(io.papermc.paper.adventure.PaperAdventure
+ .asVanilla(fixed.component()));
+ } else if (format.equals(NumberFormat.blank())) {
+ vanilla = net.minecraft.network.chat.numbers.BlankFormat.INSTANCE;
+ } else {
+ throw new IllegalArgumentException("Unknown format type " + format.getClass());
+ }
+
+ return vanilla;
+ }
+
+ public static NumberFormat asPaper(final net.minecraft.network.chat.numbers.NumberFormat vanilla) {
+ if (vanilla instanceof final net.minecraft.network.chat.numbers.StyledFormat styled) {
+ return NumberFormat.styled(PaperAdventure.asAdventure(styled.style));
+ } else if (vanilla instanceof final net.minecraft.network.chat.numbers.FixedFormat fixed) {
+ return NumberFormat.fixed(io.papermc.paper.adventure.PaperAdventure.asAdventure(fixed.value));
+ } else if (vanilla instanceof net.minecraft.network.chat.numbers.BlankFormat) {
+ return NumberFormat.blank();
+ }
+
+ throw new IllegalArgumentException("Unknown format type " + vanilla.getClass());
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftObjective.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftObjective.java
index 2d3abf2a1da487ead74d698cc5ea4eb729c35c8d..1fec80c4f02aab3770c05bac8bfa2b622625e630 100644
--- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftObjective.java
+++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftObjective.java
@@ -153,6 +153,34 @@ final class CraftObjective extends CraftScoreboardComponent implements Objective
}
// Paper end
+ // Paper start - add number format
+ @Override
+ public io.papermc.paper.scoreboard.numbers.NumberFormat numberFormat() {
+ this.checkState();
+
+ net.minecraft.network.chat.numbers.NumberFormat vanilla = this.objective.numberFormat();
+
+ if (vanilla == null) {
+ return null;
+ }
+
+ return io.papermc.paper.util.PaperScoreboardFormat.asPaper(vanilla);
+ }
+
+
+ @Override
+ public void numberFormat(io.papermc.paper.scoreboard.numbers.NumberFormat format) {
+ this.checkState();
+
+ if (format == null) {
+ this.objective.setNumberFormat(null);
+ return;
+ }
+
+ this.objective.setNumberFormat(io.papermc.paper.util.PaperScoreboardFormat.asVanilla(format));
+ }
+ // Paper end - add number format
+
@Override
public void unregister() {
CraftScoreboard scoreboard = this.checkState();
diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScore.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScore.java
index 74d9c407e971804bed420370f7b684d8658eb5aa..e307e897d6e1ba4cb21883dfeaf334bfbf56cfc4 100644
--- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScore.java
+++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScore.java
@@ -55,6 +55,41 @@ final class CraftScore implements Score {
this.objective.checkState().board.getOrCreatePlayerScore(this.entry, this.objective.getHandle()).set(score);
}
+
+ // Paper start - add number format
+ @Override
+ public io.papermc.paper.scoreboard.numbers.NumberFormat numberFormat() {
+ ReadOnlyScoreInfo scoreInfo = this.objective.checkState().board
+ .getPlayerScoreInfo(this.entry, this.objective.getHandle());
+
+ if (scoreInfo == null) {
+ return null;
+ }
+
+ net.minecraft.network.chat.numbers.NumberFormat vanilla = scoreInfo.numberFormat();
+
+ if (vanilla == null) {
+ return null;
+ }
+
+ return io.papermc.paper.util.PaperScoreboardFormat.asPaper(vanilla);
+ }
+
+
+ @Override
+ public void numberFormat(io.papermc.paper.scoreboard.numbers.NumberFormat format) {
+ final net.minecraft.world.scores.ScoreAccess access = this.objective.checkState()
+ .board.getOrCreatePlayerScore(this.entry, this.objective.getHandle());
+
+ if (format == null) {
+ access.numberFormatOverride(null);
+ return;
+ }
+
+ access.numberFormatOverride(io.papermc.paper.util.PaperScoreboardFormat.asVanilla(format));
+ }
+ // Paper end - add number format
+
@Override
public boolean isScoreSet() {
Scoreboard board = this.objective.checkState().board;