From 4c482bec120825e02c2fc831488f07dc122290b9 Mon Sep 17 00:00:00 2001 From: toxicity Date: Sun, 3 Nov 2024 00:21:39 +0900 Subject: [PATCH] 3.5.3 --- README.md | 1 + .../api/condition/HealthBarOperation.java | 5 +- .../healthbar/api/layout/TextLayout.java | 3 + .../api/placeholder/PlaceholderBuilder.java | 19 +++--- .../api/placeholder/PlaceholderContainer.java | 61 +++++++++++++------ .../api/placeholder/PlaceholderOption.java | 36 +++++++++++ build.gradle.kts | 49 +++++---------- .../healthbar/layout/TextLayoutImpl.kt | 6 ++ dist/src/main/resources/config.yml | 2 +- 9 files changed, 120 insertions(+), 62 deletions(-) create mode 100644 api/src/main/java/kr/toxicity/healthbar/api/placeholder/PlaceholderOption.java diff --git a/README.md b/README.md index 68c2d58..17efd5e 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ betterhealthbar.reload - Access to reload command ./gradlew build # API +[![](https://jitpack.io/v/toxicity188/BetterHealthBar3.svg)](https://jitpack.io/#toxicity188/BetterHealthBar3) ``` kotlin repositories { mavenCenteral() diff --git a/api/src/main/java/kr/toxicity/healthbar/api/condition/HealthBarOperation.java b/api/src/main/java/kr/toxicity/healthbar/api/condition/HealthBarOperation.java index 4a1b79c..3e84503 100644 --- a/api/src/main/java/kr/toxicity/healthbar/api/condition/HealthBarOperation.java +++ b/api/src/main/java/kr/toxicity/healthbar/api/condition/HealthBarOperation.java @@ -2,6 +2,7 @@ import kr.toxicity.healthbar.api.placeholder.HealthBarPlaceholder; import kr.toxicity.healthbar.api.placeholder.PlaceholderContainer; +import kr.toxicity.healthbar.api.placeholder.PlaceholderOption; import org.bukkit.configuration.ConfigurationSection; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -53,8 +54,8 @@ default HealthBarOperation or(@NotNull HealthBarOperation other) { } @SuppressWarnings("unchecked") static @NotNull HealthBarCondition of(@NotNull String one, @NotNull String two, @NotNull String condition) { - var parseOne = (HealthBarPlaceholder) PlaceholderContainer.parse(one); - var parseTwo = PlaceholderContainer.parse(two); + var parseOne = (HealthBarPlaceholder) PlaceholderContainer.parse(PlaceholderOption.EMPTY, one); + var parseTwo = PlaceholderContainer.parse(PlaceholderOption.EMPTY, two); if (parseOne.type() != parseTwo.type()) throw new RuntimeException("type mismatch: " + parseOne.type().getSimpleName() + " between " + parseTwo.type().getSimpleName() + "."); var operation = Objects.requireNonNull(find(parseOne.type(), condition), "Unable to find this operation: " + condition); return p -> { diff --git a/api/src/main/java/kr/toxicity/healthbar/api/layout/TextLayout.java b/api/src/main/java/kr/toxicity/healthbar/api/layout/TextLayout.java index f574362..e53acce 100644 --- a/api/src/main/java/kr/toxicity/healthbar/api/layout/TextLayout.java +++ b/api/src/main/java/kr/toxicity/healthbar/api/layout/TextLayout.java @@ -1,6 +1,7 @@ package kr.toxicity.healthbar.api.layout; import kr.toxicity.healthbar.api.event.HealthBarCreateEvent; +import kr.toxicity.healthbar.api.placeholder.PlaceholderOption; import kr.toxicity.healthbar.api.renderer.TextRenderer; import kr.toxicity.healthbar.api.text.TextAlign; import net.kyori.adventure.text.Component; @@ -18,6 +19,8 @@ public interface TextLayout extends Layout { @NotNull TextAlign align(); + @NotNull PlaceholderOption.Property property(); + @NotNull Function pattern(); diff --git a/api/src/main/java/kr/toxicity/healthbar/api/placeholder/PlaceholderBuilder.java b/api/src/main/java/kr/toxicity/healthbar/api/placeholder/PlaceholderBuilder.java index e8288a5..aa13627 100644 --- a/api/src/main/java/kr/toxicity/healthbar/api/placeholder/PlaceholderBuilder.java +++ b/api/src/main/java/kr/toxicity/healthbar/api/placeholder/PlaceholderBuilder.java @@ -9,7 +9,7 @@ import java.util.function.Function; public interface PlaceholderBuilder { - @NotNull HealthBarPlaceholder build(@NotNull List strings); + @NotNull HealthBarPlaceholder build(@NotNull PlaceholderOption.Property property, @NotNull List strings); int requiredArgsCount(); static @NotNull Builder builder(@NotNull PlaceholderContainer container) { @@ -22,17 +22,16 @@ public interface PlaceholderBuilder { } class Builder { - private final Class clazz; + private final PlaceholderContainer container; private Function stringMapper; private Function, Function> parser; private int argsLength; private Builder(@NotNull PlaceholderContainer container) { - clazz = container.clazz(); - stringMapper = container.stringMapper(); + this.container = container; } - public @NotNull Builder stringMapper(@NotNull Function mapper) { - stringMapper = Objects.requireNonNull(mapper); + public @NotNull Builder stringMapper(@Nullable Function mapper) { + stringMapper = mapper; return this; } public @NotNull Builder parser(@NotNull Function, Function> parser) { @@ -47,12 +46,14 @@ private Builder(@NotNull PlaceholderContainer container) { public @NotNull PlaceholderBuilder build() { return new PlaceholderBuilder<>() { @Override - public @NotNull HealthBarPlaceholder build(@NotNull List strings) { + public @NotNull HealthBarPlaceholder build(@NotNull PlaceholderOption.Property property, @NotNull List strings) { var valueFunction = parser.apply(strings); + var result = container.propertyResult(property); + var mapper = stringMapper != null ? stringMapper : result.stringMapper(); return new HealthBarPlaceholder<>() { @Override public @NotNull Class type() { - return clazz; + return container.clazz(); } @Override @@ -63,7 +64,7 @@ private Builder(@NotNull PlaceholderContainer container) { @Override public @Nullable String stringValue(@NotNull HealthBarCreateEvent event) { var parsed = value(event); - return parsed != null ? stringMapper.apply(parsed) : null; + return parsed != null ? mapper.apply(parsed) : null; } }; } diff --git a/api/src/main/java/kr/toxicity/healthbar/api/placeholder/PlaceholderContainer.java b/api/src/main/java/kr/toxicity/healthbar/api/placeholder/PlaceholderContainer.java index 4746ece..4b915ca 100644 --- a/api/src/main/java/kr/toxicity/healthbar/api/placeholder/PlaceholderContainer.java +++ b/api/src/main/java/kr/toxicity/healthbar/api/placeholder/PlaceholderContainer.java @@ -9,7 +9,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.text.DecimalFormat; import java.util.*; +import java.util.function.BiFunction; import java.util.function.Function; import java.util.regex.Pattern; @@ -17,15 +19,23 @@ public class PlaceholderContainer { private final @NotNull Class clazz; private final @NotNull Function parser; private final @NotNull Function stringMapper; + private final @NotNull BiFunction, PropertyResult> propertyParser; public static final Pattern PATTERN = Pattern.compile("^(\\((?([a-zA-Z]+))\\))?(?(([a-zA-Z]|[0-9]|_|\\.)+))$"); private static final Map, PlaceholderContainer> CLASS_MAP = new HashMap<>(); private static final Map> STRING_MAP = new HashMap<>(); - public PlaceholderContainer(@NotNull Class clazz, String name, @NotNull Function parser, @NotNull Function stringMapper) { + public PlaceholderContainer( + @NotNull Class clazz, + String name, + @NotNull Function parser, + @NotNull Function stringMapper, + @NotNull BiFunction, PropertyResult> propertyParser + ) { this.clazz = clazz; this.parser = parser; this.stringMapper = stringMapper; + this.propertyParser = propertyParser; CLASS_MAP.put(clazz, this); STRING_MAP.put(name, this); @@ -44,10 +54,15 @@ public PlaceholderContainer(@NotNull Class clazz, String name, @NotNull Funct return clazz; } - @NotNull Function stringMapper() { - return stringMapper; + @NotNull PropertyResult propertyResult(@NotNull PlaceholderOption.Property property) { + return propertyParser.apply(property, this); } + public record PropertyResult( + @NotNull Function parser, + @NotNull Function stringMapper + ) {} + public static final PlaceholderContainer NUMBER = new PlaceholderContainer<>( Number.class, "number", @@ -58,7 +73,16 @@ public PlaceholderContainer(@NotNull Class clazz, String name, @NotNull Funct return null; } }, - s -> BetterHealthBar.inst().configManager().numberFormat().format(s) + s -> BetterHealthBar.inst().configManager().numberFormat().format(s), + (p, c) -> { + var mapper = c.stringMapper; + var format = p.get(PlaceholderOption.NUMBER_FORMAT); + if (format != null) { + var decimal = new DecimalFormat(format); + mapper = decimal::format; + } + return new PropertyResult<>(c.parser, mapper); + } ); public static final PlaceholderContainer STRING = new PlaceholderContainer<>( String.class, @@ -70,7 +94,8 @@ public PlaceholderContainer(@NotNull Class clazz, String name, @NotNull Funct } return null; }, - d -> d + d -> d, + (p, c) -> new PropertyResult<>(c.parser, c.stringMapper) ); public static final PlaceholderContainer BOOL = new PlaceholderContainer<>( Boolean.class, @@ -80,7 +105,8 @@ public PlaceholderContainer(@NotNull Class clazz, String name, @NotNull Funct case "false" -> false; default -> null; }, - s -> Boolean.toString(s) + s -> Boolean.toString(s), + (p, c) -> new PropertyResult<>(c.parser, c.stringMapper) ); private final Map> map = new HashMap<>(); @@ -93,7 +119,8 @@ public int requiredArgsCount() { } @Override - public @NotNull HealthBarPlaceholder build(@NotNull List strings) { + public @NotNull HealthBarPlaceholder build(@NotNull PlaceholderOption.Property property, @NotNull List strings) { + var result = propertyResult(property); return new HealthBarPlaceholder<>() { @Nullable @Override @@ -110,7 +137,7 @@ public Class type() { @Override public @Nullable String stringValue(@NotNull HealthBarCreateEvent event) { var value = value(event); - return value != null ? stringMapper.apply(value) : null; + return value != null ? result.stringMapper.apply(value) : null; } }; } @@ -132,20 +159,20 @@ private FindResult(@NotNull String name) { result = map.get(name); } - public @NotNull HealthBarPlaceholder value(@NotNull List strings) { + public @NotNull HealthBarPlaceholder value(@NotNull PlaceholderOption.Property property, @NotNull List strings) { Objects.requireNonNull(result); Objects.requireNonNull(strings); - return result.build(strings); + return result.build(property, strings); } public boolean ifPresented() { return result != null; } - public @NotNull HealthBarPlaceholder stringValue(@NotNull List strings) { + public @NotNull HealthBarPlaceholder stringValue(@NotNull PlaceholderOption.Property property, @NotNull List strings) { Objects.requireNonNull(result); Objects.requireNonNull(strings); - var apply = result.build(strings); + var apply = result.build(property, strings); return new HealthBarPlaceholder<>() { @NotNull @Override @@ -184,7 +211,7 @@ public static HealthBarPlaceholder primitive(@NotNull String value) { }).filter(Objects::nonNull).findFirst().orElseThrow(() -> new RuntimeException("Unable to parse this value: " + value)); } - public static @NotNull HealthBarPlaceholder parse(@NotNull String pattern) { + public static @NotNull HealthBarPlaceholder parse(@NotNull PlaceholderOption.Property property, @NotNull String pattern) { var index = 0; while (index < pattern.length() && pattern.charAt(index) != ':') { index++; @@ -211,7 +238,7 @@ public static HealthBarPlaceholder primitive(@NotNull String value) { var list = argument != null ? Arrays.asList(argument.split(",")) : Collections.emptyList(); if (get.result.requiredArgsCount() > list.size()) throw new RuntimeException("This placeholder requires argument sized at least " + get.result.requiredArgsCount()); if (cast != null) { - var string = get.stringValue(list); + var string = get.stringValue(property, list); return new HealthBarPlaceholder<>() { @NotNull @Override @@ -234,10 +261,10 @@ public Object value(@NotNull HealthBarCreateEvent event) { return value != null ? ((Function) cast.stringMapper).apply(value) : ""; } }; - } else return get.value(list); + } else return get.value(property, list); } - public static @NotNull Function toString(@NotNull String pattern) { + public static @NotNull Function toString(@NotNull PlaceholderOption.Property property, @NotNull String pattern) { var array = new ArrayList>(); var sb = new StringBuilder(); var skip = false; @@ -250,7 +277,7 @@ public Object value(@NotNull HealthBarCreateEvent event) { } case ']' -> { var result = sb.toString(); - var parse = parse(result); + var parse = parse(property, result); array.add(f -> { var value = parse.stringValue(f); return value != null ? legacyAdapt(value) : Component.text(""); diff --git a/api/src/main/java/kr/toxicity/healthbar/api/placeholder/PlaceholderOption.java b/api/src/main/java/kr/toxicity/healthbar/api/placeholder/PlaceholderOption.java new file mode 100644 index 0000000..c136319 --- /dev/null +++ b/api/src/main/java/kr/toxicity/healthbar/api/placeholder/PlaceholderOption.java @@ -0,0 +1,36 @@ +package kr.toxicity.healthbar.api.placeholder; + +import lombok.RequiredArgsConstructor; +import org.bukkit.configuration.ConfigurationSection; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +@RequiredArgsConstructor +public enum PlaceholderOption { + NUMBER_FORMAT("#,###") + ; + private final @NotNull String defaultValue; + + public static final Property EMPTY = new Property(Arrays.stream(values()).collect(Collectors.toMap(v -> v, v -> v.defaultValue))); + + public static @NotNull Property of(@NotNull ConfigurationSection section) { + return new Property(Arrays.stream(values()).collect(Collectors.toMap(v -> v, v -> section.getString(v.configName(), v.defaultValue)))); + } + + public @NotNull String configName() { + return name().toLowerCase().replace("_", "-"); + } + + @RequiredArgsConstructor + public static final class Property { + private final Map map; + + public @Nullable String get(@NotNull PlaceholderOption option) { + return map.get(option); + } + } +} diff --git a/build.gradle.kts b/build.gradle.kts index ae5a593..f5ac9d6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,6 @@ plugins { } val minecraft = "1.21.3" -val folia = "1.20.6" // TODO Bumps version. val adventure = "4.17.0" val platform = "4.3.4" val targetJavaVersion = 21 @@ -18,7 +17,7 @@ allprojects { apply(plugin = "kotlin") apply(plugin = "org.jetbrains.dokka") group = "kr.toxicity.healthbar" - version = "3.5.2" + version = "3.5.3" repositories { mavenCentral() maven("https://repo.papermc.io/repository/maven-public/") @@ -59,37 +58,28 @@ allprojects { } } -fun Project.spigot() = also { - it.dependencies { - compileOnly("org.spigotmc:spigot-api:$minecraft-R0.1-SNAPSHOT") - compileOnly("net.kyori:adventure-api:$adventure") - compileOnly("net.kyori:adventure-text-minimessage:$adventure") - compileOnly("net.kyori:adventure-platform-bukkit:$platform") - } +fun Project.dependency(dependency: Any) = also { + it.dependencies.compileOnly(dependency) } +fun Project.spigot() = dependency("org.spigotmc:spigot-api:$minecraft-R0.1-SNAPSHOT") + .dependency("net.kyori:adventure-api:$adventure") + .dependency("net.kyori:adventure-text-minimessage:$adventure") + .dependency("net.kyori:adventure-platform-bukkit:$platform") -fun Project.dependency(name: String) = also { - it.dependencies { - compileOnly(name) - } -} +fun Project.paper() = dependency("io.papermc.paper:paper-api:$minecraft-R0.1-SNAPSHOT") val api = project("api").spigot() -fun getApiDependencyProject(name: String) = project(name).also { - it.dependencies { - compileOnly(api) - } -} +fun getApiDependencyProject(name: String) = project(name).dependency(api) val dist = getApiDependencyProject("dist").spigot() .dependency("io.lumine:Mythic-Dist:5.7.2") .dependency("io.github.arcaneplugins:levelledmobs-plugin:4.0.3.1") .dependency("me.clip:placeholderapi:2.11.6") - .dependency("com.github.toxicity188:BetterHud:1.7") - .dependency("net.citizensnpcs:citizens-main:2.0.33-SNAPSHOT") - .dependency("net.byteflux:libby-bukkit:1.3.0") - .dependency("com.github.SkriptLang:Skript:2.9.3") + .dependency("com.github.toxicity188:BetterHud:1.8") + .dependency("com.github.toxicity188:BetterCommand:1.0") + .dependency("net.citizensnpcs:citizens-main:2.0.35-SNAPSHOT") + .dependency("com.github.SkriptLang:Skript:2.9.4") .also { it.tasks.processResources { filteringCharset = Charsets.UTF_8.name() @@ -111,12 +101,6 @@ fun getProject(name: String) = getApiDependencyProject(name).also { } } -fun Project.folia() = also { - it.dependencies { - compileOnly("dev.folia:folia-api:$folia-R0.1-SNAPSHOT") - } -} - class NmsVersion(val name: String) { val project = getProject("nms:$name").also { it.apply(plugin = "io.papermc.paperweight.userdev") @@ -137,7 +121,7 @@ dependencies { implementation(api) implementation(dist) implementation(getProject("scheduler:standard").spigot()) - implementation(getProject("scheduler:folia").folia()) + implementation(getProject("scheduler:folia").paper()) implementation(getProject("bedrock:geyser").spigot().dependency("org.geysermc.geyser:api:2.4.2-SNAPSHOT")) implementation(getProject("bedrock:floodgate").spigot().dependency("org.geysermc.floodgate:api:2.2.3-SNAPSHOT")) implementation(getProject("modelengine:legacy").spigot().dependency("com.ticxo.modelengine:api:R3.2.0")) @@ -177,7 +161,7 @@ tasks { downloadPlugins { modrinth("betterhud2", "1.8") hangar("PlaceholderAPI", "2.11.6") - hangar("Skript", "2.9.3") + hangar("Skript", "2.9.4") } } shadowJar { @@ -199,7 +183,6 @@ tasks { } } build { - finalizedBy(sourceJar) - finalizedBy(dokkaJar) + finalizedBy(sourceJar, dokkaJar) } } diff --git a/dist/src/main/kotlin/kr/toxicity/healthbar/layout/TextLayoutImpl.kt b/dist/src/main/kotlin/kr/toxicity/healthbar/layout/TextLayoutImpl.kt index ee2fb1f..9281d7f 100644 --- a/dist/src/main/kotlin/kr/toxicity/healthbar/layout/TextLayoutImpl.kt +++ b/dist/src/main/kotlin/kr/toxicity/healthbar/layout/TextLayoutImpl.kt @@ -7,6 +7,7 @@ import kr.toxicity.healthbar.api.component.WidthComponent import kr.toxicity.healthbar.api.event.HealthBarCreateEvent import kr.toxicity.healthbar.api.layout.TextLayout import kr.toxicity.healthbar.api.placeholder.PlaceholderContainer +import kr.toxicity.healthbar.api.placeholder.PlaceholderOption import kr.toxicity.healthbar.api.renderer.TextRenderer import kr.toxicity.healthbar.api.text.TextAlign import kr.toxicity.healthbar.data.BitmapData @@ -31,6 +32,9 @@ class TextLayoutImpl( companion object { private val defaultWidth = WidthKey(Key.key("minecraft", "default"), 0) } + private val property = section.getConfigurationSection("properties")?.let { + PlaceholderOption.of(it) + } ?: PlaceholderOption.EMPTY private val text = section.getString("text").ifNull("Unable to find 'text' configuration.").run { TextManagerImpl.text(this).ifNull("Unable to find this text: $this") } @@ -47,11 +51,13 @@ class TextLayoutImpl( private val duration = section.getInt("duration", - 1) private val keys = ArrayList() private val pattern = PlaceholderContainer.toString( + property, section.getString("pattern").ifNull("Unable to find 'pattern' command.") ) override fun charWidth(): Map = textWidth override fun align(): TextAlign = align + override fun property(): PlaceholderOption.Property = property override fun pattern(): Function = pattern private class WidthKey( diff --git a/dist/src/main/resources/config.yml b/dist/src/main/resources/config.yml index 2aacb6c..3dd33cb 100644 --- a/dist/src/main/resources/config.yml +++ b/dist/src/main/resources/config.yml @@ -11,7 +11,7 @@ merge-other-folder: [] create-pack-mcmeta: true enable-self-host: true self-host-port: 8163 -number-format: "#,###" +number-format: "#,###.0" blacklist-entity-type: - ARMOR_STAND - TEXT_DISPLAY