From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: David Mayr Date: Sat, 16 Dec 2023 10:40:29 +0100 Subject: [PATCH] add number format api Signed-off-by: David Mayr diff --git a/src/main/java/io/papermc/paper/scoreboard/numbers/BlankFormatImpl.java b/src/main/java/io/papermc/paper/scoreboard/numbers/BlankFormatImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..486da6ebe0137bb3280e8b33c8e35e309507f118 --- /dev/null +++ b/src/main/java/io/papermc/paper/scoreboard/numbers/BlankFormatImpl.java @@ -0,0 +1,5 @@ +package io.papermc.paper.scoreboard.numbers; + +record BlankFormatImpl() implements NumberFormat { + public static final BlankFormatImpl INSTANCE = new BlankFormatImpl(); +} diff --git a/src/main/java/io/papermc/paper/scoreboard/numbers/FixedFormat.java b/src/main/java/io/papermc/paper/scoreboard/numbers/FixedFormat.java new file mode 100644 index 0000000000000000000000000000000000000000..3ef4595b692a13566c5c738050b83b0462094e9b --- /dev/null +++ b/src/main/java/io/papermc/paper/scoreboard/numbers/FixedFormat.java @@ -0,0 +1,20 @@ +package io.papermc.paper.scoreboard.numbers; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentLike; +import org.jspecify.annotations.NullMarked; + +/** + * A scoreboard number format that replaces the score number with a chat component. + */ +@NullMarked +public interface FixedFormat extends NumberFormat, ComponentLike { + + /** + * The component shown instead of the number for a score + * + * @return the chat component + */ + Component component(); + +} diff --git a/src/main/java/io/papermc/paper/scoreboard/numbers/FixedFormatImpl.java b/src/main/java/io/papermc/paper/scoreboard/numbers/FixedFormatImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..be47bf438805f9ab84b241e564281ea9c287aa6e --- /dev/null +++ b/src/main/java/io/papermc/paper/scoreboard/numbers/FixedFormatImpl.java @@ -0,0 +1,13 @@ +package io.papermc.paper.scoreboard.numbers; + +import net.kyori.adventure.text.Component; +import org.jspecify.annotations.NullMarked; + +@NullMarked +record FixedFormatImpl(Component component) implements FixedFormat { + + @Override + public Component asComponent() { + return this.component(); + } +} diff --git a/src/main/java/io/papermc/paper/scoreboard/numbers/NumberFormat.java b/src/main/java/io/papermc/paper/scoreboard/numbers/NumberFormat.java new file mode 100644 index 0000000000000000000000000000000000000000..7c093e4e9a2a67021da9025631a3c6fa7ac3ef35 --- /dev/null +++ b/src/main/java/io/papermc/paper/scoreboard/numbers/NumberFormat.java @@ -0,0 +1,61 @@ +package io.papermc.paper.scoreboard.numbers; + +import net.kyori.adventure.text.ComponentLike; +import net.kyori.adventure.text.format.Style; +import net.kyori.adventure.text.format.StyleBuilderApplicable; +import org.jspecify.annotations.NullMarked; + +/** + * Describes a scoreboard number format that applies custom formatting to scoreboard scores. + */ +@NullMarked +public interface NumberFormat { + + /** + * Creates a blank scoreboard number format that removes the score number entirely. + * + * @return a blank number format + */ + static NumberFormat blank() { + return BlankFormatImpl.INSTANCE; + } + + /** + * Gets an un-styled number format. + * + * @return an un-styled number format + */ + static StyledFormat noStyle() { + return StyledFormatImpl.NO_STYLE; + } + + /** + * Creates a scoreboard number format that applies a custom formatting to the score number. + * + * @param style the style to apply on the number + * @return a styled number format + */ + static StyledFormat styled(final Style style) { + return new StyledFormatImpl(style); + } + + /** + * Creates a scoreboard number format that applies a custom formatting to the score number. + * + * @param styleBuilderApplicables the style to apply on the number + * @return a styled number format + */ + static StyledFormat styled(final StyleBuilderApplicable... styleBuilderApplicables) { + return styled(Style.style(styleBuilderApplicables)); + } + + /** + * Creates a scoreboard number format that replaces the score number with a chat component. + * + * @param component the component to replace the number with + * @return a fixed number format + */ + static FixedFormat fixed(final ComponentLike component) { + return new FixedFormatImpl(component.asComponent()); + } +} diff --git a/src/main/java/io/papermc/paper/scoreboard/numbers/StyledFormat.java b/src/main/java/io/papermc/paper/scoreboard/numbers/StyledFormat.java new file mode 100644 index 0000000000000000000000000000000000000000..cfb14bb1b338727a5d9eeaa7a73c40540b04dbed --- /dev/null +++ b/src/main/java/io/papermc/paper/scoreboard/numbers/StyledFormat.java @@ -0,0 +1,20 @@ +package io.papermc.paper.scoreboard.numbers; + +import net.kyori.adventure.text.format.Style; +import net.kyori.adventure.text.format.StyleBuilderApplicable; +import org.jspecify.annotations.NullMarked; + +/** + * A scoreboard number format that applies a custom formatting to the score number. + */ +@NullMarked +public interface StyledFormat extends NumberFormat, StyleBuilderApplicable { + + /** + * The style that is being applied to the number in the score + * + * @return the style to apply + */ + Style style(); + +} diff --git a/src/main/java/io/papermc/paper/scoreboard/numbers/StyledFormatImpl.java b/src/main/java/io/papermc/paper/scoreboard/numbers/StyledFormatImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..e288beb1596f2d4e7e602364955da4e8bc0de21c --- /dev/null +++ b/src/main/java/io/papermc/paper/scoreboard/numbers/StyledFormatImpl.java @@ -0,0 +1,14 @@ +package io.papermc.paper.scoreboard.numbers; + +import net.kyori.adventure.text.format.Style; +import org.jspecify.annotations.NullMarked; + +@NullMarked +record StyledFormatImpl(Style style) implements StyledFormat { + static final StyledFormat NO_STYLE = new StyledFormatImpl(Style.empty()); + + @Override + public void styleApply(final Style.Builder style) { + style.merge(this.style); + } +} diff --git a/src/main/java/org/bukkit/scoreboard/Objective.java b/src/main/java/org/bukkit/scoreboard/Objective.java index d8a249bb2dd8ab96962897c2a52f40ea288f7bd6..d1016ee4282321d99734a251edfd93facb9b903f 100644 --- a/src/main/java/org/bukkit/scoreboard/Objective.java +++ b/src/main/java/org/bukkit/scoreboard/Objective.java @@ -195,4 +195,22 @@ public interface Objective { */ void setAutoUpdateDisplay(boolean autoUpdateDisplay); // Paper end - add more score API + + // Paper start - number format api + /** + * Gets the number format for this objective's scores or null if the client default is used. + * + * @return this objective's number format, or null if the client default is used + * @throws IllegalStateException if this objective has been unregistered + */ + @Nullable io.papermc.paper.scoreboard.numbers.NumberFormat numberFormat(); + + /** + * Sets the number format for this objective's scores. + * + * @param format the number format to set, pass null to reset format to default + * @throws IllegalStateException if this objective has been unregistered + */ + void numberFormat(@Nullable io.papermc.paper.scoreboard.numbers.NumberFormat format); + // Paper end - number format api } diff --git a/src/main/java/org/bukkit/scoreboard/Score.java b/src/main/java/org/bukkit/scoreboard/Score.java index a3b482e07bb3dceb9b81d66c7208556a0bedd948..3600804874843975eb12b84b71b6848c68b2a244 100644 --- a/src/main/java/org/bukkit/scoreboard/Score.java +++ b/src/main/java/org/bukkit/scoreboard/Score.java @@ -129,4 +129,26 @@ public interface Score { */ void customName(net.kyori.adventure.text.@Nullable Component customName); // Paper end - add more score API + + // Paper start - number format api + /** + * Gets the number format for this score or null if the score has not been set yet + * or the objective's default is being used. + * + * @return this score's number format, or null if the objective's default is used or the score doesn't exist + * @throws IllegalStateException if the associated objective has been + * unregistered + */ + @Nullable io.papermc.paper.scoreboard.numbers.NumberFormat numberFormat(); + + /** + * Sets the number format for this score. If this score has not been set yet {@link #isScoreSet()}, it will be created + * + * @param format the number format to set, pass null to reset format to default + * @throws IllegalStateException if the associated objective has been + * unregistered + */ + void numberFormat(@Nullable io.papermc.paper.scoreboard.numbers.NumberFormat format); + // Paper end - number format api + }