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..0000000000000000000000000000000000000000 --- /dev/null +++ b/src/main/java/io/papermc/paper/scoreboard/numbers/BlankFormatImpl.java @@ -0,0 +0,0 @@ +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..0000000000000000000000000000000000000000 --- /dev/null +++ b/src/main/java/io/papermc/paper/scoreboard/numbers/FixedFormat.java @@ -0,0 +0,0 @@ +package io.papermc.paper.scoreboard.numbers; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentLike; +import org.jetbrains.annotations.NotNull; + +/** + * A scoreboard number format that replaces the score number with a chat component. + */ +public interface FixedFormat extends NumberFormat, ComponentLike { + + /** + * The component shown instead of the number for a score + * + * @return the chat component + */ + @NotNull 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..0000000000000000000000000000000000000000 --- /dev/null +++ b/src/main/java/io/papermc/paper/scoreboard/numbers/FixedFormatImpl.java @@ -0,0 +0,0 @@ +package io.papermc.paper.scoreboard.numbers; + +import net.kyori.adventure.text.Component; +import org.jetbrains.annotations.NotNull; + +record FixedFormatImpl(@NotNull Component component) implements FixedFormat { + + @Override + public @NotNull 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..0000000000000000000000000000000000000000 --- /dev/null +++ b/src/main/java/io/papermc/paper/scoreboard/numbers/NumberFormat.java @@ -0,0 +0,0 @@ +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.jetbrains.annotations.NotNull; + +/** + * Describes a scoreboard number format that applies custom formatting to scoreboard scores. + */ +public interface NumberFormat { + + /** + * Creates a blank scoreboard number format that removes the score number entirely. + * + * @return a blank number format + */ + static @NotNull NumberFormat blank() { + return BlankFormatImpl.INSTANCE; + } + + /** + * Gets an un-styled number format. + * + * @return an un-styled number format + */ + static @NotNull 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 @NotNull StyledFormat styled(final @NotNull 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 @NotNull StyledFormat styled(final @NotNull StyleBuilderApplicable @NotNull... 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 @NotNull FixedFormat fixed(final @NotNull 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..0000000000000000000000000000000000000000 --- /dev/null +++ b/src/main/java/io/papermc/paper/scoreboard/numbers/StyledFormat.java @@ -0,0 +0,0 @@ +package io.papermc.paper.scoreboard.numbers; + +import net.kyori.adventure.text.format.Style; +import net.kyori.adventure.text.format.StyleBuilderApplicable; +import org.jetbrains.annotations.NotNull; + +/** + * A scoreboard number format that applies a custom formatting to the score number. + */ +public interface StyledFormat extends NumberFormat, StyleBuilderApplicable { + + /** + * The style that is being applied to the number in the score + * + * @return the style to apply + */ + @NotNull 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..0000000000000000000000000000000000000000 --- /dev/null +++ b/src/main/java/io/papermc/paper/scoreboard/numbers/StyledFormatImpl.java @@ -0,0 +0,0 @@ +package io.papermc.paper.scoreboard.numbers; + +import net.kyori.adventure.text.format.Style; +import org.jetbrains.annotations.NotNull; + +record StyledFormatImpl(@NotNull Style style) implements StyledFormat { + static final StyledFormat NO_STYLE = new StyledFormatImpl(Style.empty()); + + @Override + public void styleApply(final Style.@NotNull 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/org/bukkit/scoreboard/Objective.java +++ b/src/main/java/org/bukkit/scoreboard/Objective.java @@ -0,0 +0,0 @@ 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/org/bukkit/scoreboard/Score.java +++ b/src/main/java/org/bukkit/scoreboard/Score.java @@ -0,0 +0,0 @@ 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 + }