From 88abdeaad475dceb062bf82c79a15195d4b5307e Mon Sep 17 00:00:00 2001 From: Piotr Zych <77621271+P1otrulla@users.noreply.github.com> Date: Mon, 11 Aug 2025 19:07:31 +0200 Subject: [PATCH 1/9] Add configurable placeholder settings and new placeholders Introduces PlaceholderSettings to allow customization of placeholder output, specifically for isInCombat_formatted. Adds new placeholders isInCombat and isInCombat_formatted to FightTagPlaceholder, updates BridgeService and PluginConfig to support the new settings, and adjusts command permission annotation placement. Also updates build scripts and dependencies. --- .../main/kotlin/eternalcombat-java.gradle.kts | 2 +- eternalcombat-plugin/build.gradle.kts | 2 +- .../com/eternalcode/combat/CombatPlugin.java | 1 + .../combat/EternalCombatReloadCommand.java | 2 +- .../combat/bridge/BridgeService.java | 2 +- .../placeholder/FightTagPlaceholder.java | 18 +++++++++++++++--- .../implementation/PlaceholderSettings.java | 10 ++++++++++ .../config/implementation/PluginConfig.java | 7 +++++++ 8 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PlaceholderSettings.java diff --git a/buildSrc/src/main/kotlin/eternalcombat-java.gradle.kts b/buildSrc/src/main/kotlin/eternalcombat-java.gradle.kts index 0020670b..30d91002 100644 --- a/buildSrc/src/main/kotlin/eternalcombat-java.gradle.kts +++ b/buildSrc/src/main/kotlin/eternalcombat-java.gradle.kts @@ -3,7 +3,7 @@ plugins { } group = "com.eternalcode" -version = "2.2.0" +version = "2.2.1-SNAPSHOT" tasks.compileJava { options.compilerArgs = listOf("-Xlint:deprecation", "-parameters") diff --git a/eternalcombat-plugin/build.gradle.kts b/eternalcombat-plugin/build.gradle.kts index 634f72df..c6cae247 100644 --- a/eternalcombat-plugin/build.gradle.kts +++ b/eternalcombat-plugin/build.gradle.kts @@ -74,7 +74,7 @@ bukkit { tasks { runServer { - minecraftVersion("1.21.4") + minecraftVersion("1.21") downloadPlugins.url("https://github.com/retrooper/packetevents/releases/download/v2.8.0/packetevents-spigot-2.8.0.jar") } } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java index 3f207b0c..ecf7afb7 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -55,6 +55,7 @@ import dev.rollczi.litecommands.LiteCommands; import dev.rollczi.litecommands.bukkit.LiteBukkitFactory; import dev.rollczi.litecommands.bukkit.LiteBukkitMessages; +import dev.rollczi.litecommands.permission.PermissionResolver; import net.kyori.adventure.platform.AudienceProvider; import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.minimessage.MiniMessage; diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/EternalCombatReloadCommand.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/EternalCombatReloadCommand.java index 5d2c8e8a..9bcf62d0 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/EternalCombatReloadCommand.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/EternalCombatReloadCommand.java @@ -14,7 +14,6 @@ import org.bukkit.command.CommandSender; @Command(name = "combatlog", aliases = "combat") -@Permission("eternalcombat.reload") public class EternalCombatReloadCommand { private static final Notice RELOAD_MESSAGE = BukkitNotice.builder() @@ -31,6 +30,7 @@ public EternalCombatReloadCommand(ConfigService configService, NoticeService not @Async @Execute(name = "reload") + @Permission("eternalcombat.reload") void execute(@Context CommandSender sender) { Stopwatch stopwatch = Stopwatch.createStarted(); this.configService.reload(); diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/BridgeService.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/BridgeService.java index b4badd50..ab2df5c5 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/BridgeService.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/BridgeService.java @@ -69,7 +69,7 @@ public void init(Server server) { initialize( "PlaceholderAPI", - () -> new FightTagPlaceholder(this.fightManager, server, this.plugin).register(), + () -> new FightTagPlaceholder(this.config.placeholder, this.fightManager, server, this.plugin).register(), () -> this.logger.warning("PlaceholderAPI not found; skipping placeholders.") ); } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java index b4e9a051..842e58f6 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java @@ -1,5 +1,6 @@ package com.eternalcode.combat.bridge.placeholder; +import com.eternalcode.combat.config.implementation.PlaceholderSettings; import com.eternalcode.combat.fight.FightManager; import com.eternalcode.combat.fight.FightTag; import com.eternalcode.combat.util.DurationUtil; @@ -14,12 +15,14 @@ public class FightTagPlaceholder extends PlaceholderExpansion { + private static final String IDENTIFIER = "eternalcombat"; + private final PlaceholderSettings placeholderSettings; private final FightManager fightManager; private final Server server; private final Plugin plugin; - private static final String IDENTIFIER = "eternalcombat"; - public FightTagPlaceholder(FightManager fightManager, Server server, Plugin plugin) { + public FightTagPlaceholder(PlaceholderSettings placeholderSettings, FightManager fightManager, Server server, Plugin plugin) { + this.placeholderSettings = placeholderSettings; this.fightManager = fightManager; this.server = server; this.plugin = plugin; @@ -30,7 +33,6 @@ public boolean canRegister() { return true; } - @Override public @NotNull String getIdentifier() { return IDENTIFIER; @@ -71,6 +73,16 @@ public String onRequest(OfflinePlayer player, String identifier) { .map(tagger -> String.format("%.2f", tagger.getHealth())) .orElse(""); } + if (identifier.equals("isInCombat")) { + return this.getFightTag(player) + .map(fightTag -> "true") + .orElse("false"); + } + if (identifier.equals("isInCombat_formatted")) { + return this.getFightTag(player) + .map(fightTag -> this.placeholderSettings.isInCombatFormattedTrue) + .orElse(this.placeholderSettings.isInCombatFormattedFalse); + } return null; } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PlaceholderSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PlaceholderSettings.java new file mode 100644 index 00000000..d62817c9 --- /dev/null +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PlaceholderSettings.java @@ -0,0 +1,10 @@ +package com.eternalcode.combat.config.implementation; + +import eu.okaeri.configs.OkaeriConfig; + +public class PlaceholderSettings extends OkaeriConfig { + + public String isInCombatFormattedTrue = "In Combat"; + public String isInCombatFormattedFalse = "Not In Combat"; + +} diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java index e3e1a6c8..c2e8596e 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java @@ -106,6 +106,13 @@ public class PluginConfig extends OkaeriConfig { }) public CombatSettings combat = new CombatSettings(); + @Comment({ + " ", + "# Settings related to placeholders used in the plugin.", + "# Now only for isInCombat_formatted" + }) + public PlaceholderSettings placeholder = new PlaceholderSettings(); + @Comment({ " ", "# Customize the messages displayed by the plugin.", From eb22799c2e490e7f23023ffc4901cde132727c96 Mon Sep 17 00:00:00 2001 From: Piotr Zych <77621271+P1otrulla@users.noreply.github.com> Date: Mon, 11 Aug 2025 19:33:14 +0200 Subject: [PATCH 2/9] rollback version --- eternalcombat-plugin/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eternalcombat-plugin/build.gradle.kts b/eternalcombat-plugin/build.gradle.kts index c6cae247..634f72df 100644 --- a/eternalcombat-plugin/build.gradle.kts +++ b/eternalcombat-plugin/build.gradle.kts @@ -74,7 +74,7 @@ bukkit { tasks { runServer { - minecraftVersion("1.21") + minecraftVersion("1.21.4") downloadPlugins.url("https://github.com/retrooper/packetevents/releases/download/v2.8.0/packetevents-spigot-2.8.0.jar") } } From 5178b2d59c6e3f76241af588f992e250b77313fb Mon Sep 17 00:00:00 2001 From: Piotr Zych <77621271+P1otrulla@users.noreply.github.com> Date: Mon, 11 Aug 2025 19:35:03 +0200 Subject: [PATCH 3/9] Add papi plugin to runServer --- eternalcombat-plugin/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/eternalcombat-plugin/build.gradle.kts b/eternalcombat-plugin/build.gradle.kts index 634f72df..52a318b5 100644 --- a/eternalcombat-plugin/build.gradle.kts +++ b/eternalcombat-plugin/build.gradle.kts @@ -76,6 +76,7 @@ tasks { runServer { minecraftVersion("1.21.4") downloadPlugins.url("https://github.com/retrooper/packetevents/releases/download/v2.8.0/packetevents-spigot-2.8.0.jar") + downloadPlugins.url("https://www.spigotmc.org/resources/placeholderapi.6245/download?version=541946") } } From 57c382355ca50519d40e25139e8eece9a69743f3 Mon Sep 17 00:00:00 2001 From: Piotr Zych <77621271+P1otrulla@users.noreply.github.com> Date: Mon, 11 Aug 2025 19:40:08 +0200 Subject: [PATCH 4/9] remove unused import --- .../src/main/java/com/eternalcode/combat/CombatPlugin.java | 1 - 1 file changed, 1 deletion(-) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java index ecf7afb7..3f207b0c 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/CombatPlugin.java @@ -55,7 +55,6 @@ import dev.rollczi.litecommands.LiteCommands; import dev.rollczi.litecommands.bukkit.LiteBukkitFactory; import dev.rollczi.litecommands.bukkit.LiteBukkitMessages; -import dev.rollczi.litecommands.permission.PermissionResolver; import net.kyori.adventure.platform.AudienceProvider; import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.text.minimessage.MiniMessage; From de08b92f1dae48d899e9d03dd927920fff19a150 Mon Sep 17 00:00:00 2001 From: Piotr Zych <77621271+P1otrulla@users.noreply.github.com> Date: Mon, 11 Aug 2025 19:40:46 +0200 Subject: [PATCH 5/9] follow gemini's suggestion --- .../placeholder/FightTagPlaceholder.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java index 842e58f6..26ffc6b2 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java @@ -73,15 +73,17 @@ public String onRequest(OfflinePlayer player, String identifier) { .map(tagger -> String.format("%.2f", tagger.getHealth())) .orElse(""); } - if (identifier.equals("isInCombat")) { - return this.getFightTag(player) - .map(fightTag -> "true") - .orElse("false"); - } - if (identifier.equals("isInCombat_formatted")) { - return this.getFightTag(player) - .map(fightTag -> this.placeholderSettings.isInCombatFormattedTrue) - .orElse(this.placeholderSettings.isInCombatFormattedFalse); + if (identifier.equals("isInCombat") || identifier.equals("isInCombat_formatted")) { + Player onlinePlayer = player.getPlayer(); + boolean inCombat = onlinePlayer != null && this.fightManager.isInCombat(onlinePlayer.getUniqueId()); + + if (identifier.equals("isInCombat")) { + return String.valueOf(inCombat); + } + + return inCombat + ? this.placeholderSettings.isInCombatFormattedTrue + : this.placeholderSettings.isInCombatFormattedFalse; } return null; From a266611a1cbbe1e6eccdb12a7442af0923c32116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Wojtas?= Date: Mon, 11 Aug 2025 20:46:28 +0200 Subject: [PATCH 6/9] Add more comments for configuration, merge time combat placeholders Took 14 minutes --- .../eternalcode/combat/bridge/BridgeService.java | 2 +- .../bridge/placeholder/FightTagPlaceholder.java | 13 +++++-------- .../config/implementation/PlaceholderSettings.java | 4 ++++ .../combat/config/implementation/PluginConfig.java | 4 ++-- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/BridgeService.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/BridgeService.java index ab2df5c5..d7dad826 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/BridgeService.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/BridgeService.java @@ -69,7 +69,7 @@ public void init(Server server) { initialize( "PlaceholderAPI", - () -> new FightTagPlaceholder(this.config.placeholder, this.fightManager, server, this.plugin).register(), + () -> new FightTagPlaceholder(this.config.placeholders, this.fightManager, server, this.plugin).register(), () -> this.logger.warning("PlaceholderAPI not found; skipping placeholders.") ); } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java index 26ffc6b2..04ba9d48 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java @@ -50,15 +50,11 @@ public boolean canRegister() { @Override public String onRequest(OfflinePlayer player, String identifier) { - if (identifier.equals("remaining_seconds")) { + if (identifier.equals("remaining_seconds") || identifier.equals("remaining_millis")) { return this.getFightTag(player) - .map(fightTagInter -> DurationUtil.format(fightTagInter.getRemainingDuration())) - .orElse(""); - } - - if (identifier.equals("remaining_millis")) { - return this.getFightTag(player) - .map(fightTag -> DurationParser.TIME_UNITS.format(fightTag.getRemainingDuration())) + .map(fightTagInter -> identifier.equals("remaining_millis") + ? DurationParser.TIME_UNITS.format(fightTagInter.getRemainingDuration()) + : DurationUtil.format(fightTagInter.getRemainingDuration())) .orElse(""); } @@ -73,6 +69,7 @@ public String onRequest(OfflinePlayer player, String identifier) { .map(tagger -> String.format("%.2f", tagger.getHealth())) .orElse(""); } + if (identifier.equals("isInCombat") || identifier.equals("isInCombat_formatted")) { Player onlinePlayer = player.getPlayer(); boolean inCombat = onlinePlayer != null && this.fightManager.isInCombat(onlinePlayer.getUniqueId()); diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PlaceholderSettings.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PlaceholderSettings.java index d62817c9..4465587a 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PlaceholderSettings.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PlaceholderSettings.java @@ -1,10 +1,14 @@ package com.eternalcode.combat.config.implementation; import eu.okaeri.configs.OkaeriConfig; +import eu.okaeri.configs.annotation.Comment; public class PlaceholderSettings extends OkaeriConfig { + @Comment("Text returned by %eternalcombat_isInCombat_formatted% placeholder when the player is in combat") public String isInCombatFormattedTrue = "In Combat"; + + @Comment("Text returned by %eternalcombat_isInCombat_formatted% placeholder when the player is out of combat") public String isInCombatFormattedFalse = "Not In Combat"; } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java index c2e8596e..906746f3 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PluginConfig.java @@ -109,9 +109,9 @@ public class PluginConfig extends OkaeriConfig { @Comment({ " ", "# Settings related to placeholders used in the plugin.", - "# Now only for isInCombat_formatted" + "# Configure default values returned by placeholders" }) - public PlaceholderSettings placeholder = new PlaceholderSettings(); + public PlaceholderSettings placeholders = new PlaceholderSettings(); @Comment({ " ", From 2e7eff65fd4b283377ad053182ab9e41ed2ca6b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Wojtas?= Date: Mon, 11 Aug 2025 20:59:33 +0200 Subject: [PATCH 7/9] change download source to spigot - got 503 on download from github during tests Took 10 minutes --- eternalcombat-plugin/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eternalcombat-plugin/build.gradle.kts b/eternalcombat-plugin/build.gradle.kts index 52a318b5..2c340497 100644 --- a/eternalcombat-plugin/build.gradle.kts +++ b/eternalcombat-plugin/build.gradle.kts @@ -75,7 +75,7 @@ bukkit { tasks { runServer { minecraftVersion("1.21.4") - downloadPlugins.url("https://github.com/retrooper/packetevents/releases/download/v2.8.0/packetevents-spigot-2.8.0.jar") + downloadPlugins.url("https://www.spigotmc.org/resources/packetevents-api.80279/download?version=599651") downloadPlugins.url("https://www.spigotmc.org/resources/placeholderapi.6245/download?version=541946") } } From 572e483b1f9b4038cfed44076da0be7de987de62 Mon Sep 17 00:00:00 2001 From: Piotr Zych <77621271+P1otrulla@users.noreply.github.com> Date: Fri, 22 Aug 2025 17:30:40 +0200 Subject: [PATCH 8/9] follow Rollczi's suggestion -> refactored placeholder registry --- .../main/kotlin/eternalcombat-java.gradle.kts | 2 +- .../combat/bridge/BridgeService.java | 2 +- .../placeholder/FightTagPlaceholder.java | 123 ++++++++++-------- 3 files changed, 71 insertions(+), 56 deletions(-) diff --git a/buildSrc/src/main/kotlin/eternalcombat-java.gradle.kts b/buildSrc/src/main/kotlin/eternalcombat-java.gradle.kts index 30d91002..0020670b 100644 --- a/buildSrc/src/main/kotlin/eternalcombat-java.gradle.kts +++ b/buildSrc/src/main/kotlin/eternalcombat-java.gradle.kts @@ -3,7 +3,7 @@ plugins { } group = "com.eternalcode" -version = "2.2.1-SNAPSHOT" +version = "2.2.0" tasks.compileJava { options.compilerArgs = listOf("-Xlint:deprecation", "-parameters") diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/BridgeService.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/BridgeService.java index d7dad826..1eb42a23 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/BridgeService.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/BridgeService.java @@ -69,7 +69,7 @@ public void init(Server server) { initialize( "PlaceholderAPI", - () -> new FightTagPlaceholder(this.config.placeholders, this.fightManager, server, this.plugin).register(), + () -> new FightTagPlaceholder(this.config, this.fightManager, server, this.plugin).register(), () -> this.logger.warning("PlaceholderAPI not found; skipping placeholders.") ); } diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java index 04ba9d48..aedd9b2a 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java @@ -1,6 +1,7 @@ package com.eternalcode.combat.bridge.placeholder; import com.eternalcode.combat.config.implementation.PlaceholderSettings; +import com.eternalcode.combat.config.implementation.PluginConfig; import com.eternalcode.combat.fight.FightManager; import com.eternalcode.combat.fight.FightTag; import com.eternalcode.combat.util.DurationUtil; @@ -16,94 +17,108 @@ public class FightTagPlaceholder extends PlaceholderExpansion { private static final String IDENTIFIER = "eternalcombat"; + private final PlaceholderSettings placeholderSettings; private final FightManager fightManager; private final Server server; private final Plugin plugin; - public FightTagPlaceholder(PlaceholderSettings placeholderSettings, FightManager fightManager, Server server, Plugin plugin) { - this.placeholderSettings = placeholderSettings; + public FightTagPlaceholder(PluginConfig pluginConfig, FightManager fightManager, Server server, Plugin plugin) { + this.placeholderSettings = pluginConfig.placeholders; this.fightManager = fightManager; this.server = server; this.plugin = plugin; } @Override - public boolean canRegister() { - return true; + public String onRequest(OfflinePlayer player, String identifier) { + return switch (identifier) { + case "remaining_millis" -> this.handleRemainingMillis(player); + case "remaining_seconds" -> this.handleRemainingSeconds(player); + case "opponent" -> this.handleOpponent(player); + case "opponent_health" -> this.handleOpponentHealth(player); + case "isInCombat" -> this.handleIsInCombat(player); + case "isInCombat_formatted" -> this.handleIsInCombatFormatted(player); + default -> ""; + }; } - @Override - public @NotNull String getIdentifier() { - return IDENTIFIER; + private String handleRemainingMillis(OfflinePlayer player) { + return this.getFightTag(player) + .map(tag -> DurationParser.TIME_UNITS.format(tag.getRemainingDuration())) + .orElse(""); } - @Override - public @NotNull String getAuthor() { - return this.plugin.getDescription().getAuthors().get(0); + private String handleRemainingSeconds(OfflinePlayer player) { + return this.getFightTag(player) + .map(tag -> DurationUtil.format(tag.getRemainingDuration())) + .orElse(""); } - @Override - public @NotNull String getVersion() { - return this.plugin.getDescription().getVersion(); + private String handleOpponent(OfflinePlayer player) { + return this.getTagger(player) + .map(Player::getName) + .orElse(""); } - @Override - public String onRequest(OfflinePlayer player, String identifier) { - if (identifier.equals("remaining_seconds") || identifier.equals("remaining_millis")) { - return this.getFightTag(player) - .map(fightTagInter -> identifier.equals("remaining_millis") - ? DurationParser.TIME_UNITS.format(fightTagInter.getRemainingDuration()) - : DurationUtil.format(fightTagInter.getRemainingDuration())) - .orElse(""); - } - - if (identifier.equals("opponent")) { - return this.getTagger(player) - .map(tagger -> tagger.getName()) - .orElse(""); - } - - if (identifier.equals("opponent_health")) { - return this.getTagger(player) - .map(tagger -> String.format("%.2f", tagger.getHealth())) - .orElse(""); - } - - if (identifier.equals("isInCombat") || identifier.equals("isInCombat_formatted")) { - Player onlinePlayer = player.getPlayer(); - boolean inCombat = onlinePlayer != null && this.fightManager.isInCombat(onlinePlayer.getUniqueId()); + private String handleOpponentHealth(OfflinePlayer player) { + return this.getTagger(player) + .map(tagger -> String.format("%.2f", tagger.getHealth())) + .orElse(""); + } - if (identifier.equals("isInCombat")) { - return String.valueOf(inCombat); - } + private String handleIsInCombat(OfflinePlayer player) { + return String.valueOf(this.isPlayerInCombat(player)); + } - return inCombat - ? this.placeholderSettings.isInCombatFormattedTrue - : this.placeholderSettings.isInCombatFormattedFalse; - } + private String handleIsInCombatFormatted(OfflinePlayer player) { + return this.isPlayerInCombat(player) + ? this.placeholderSettings.isInCombatFormattedTrue + : this.placeholderSettings.isInCombatFormattedFalse; + } - return null; + private boolean isPlayerInCombat(OfflinePlayer player) { + Player onlinePlayer = player.getPlayer(); + return onlinePlayer != null && this.fightManager.isInCombat(onlinePlayer.getUniqueId()); } private @NotNull Optional getTagger(OfflinePlayer player) { return this.getFightTag(player) - .map(fightTagInter -> fightTagInter.getTagger()) - .map(taggerId -> this.server.getPlayer(taggerId)); + .map(FightTag::getTagger) + .map(this.server::getPlayer); } private Optional getFightTag(OfflinePlayer player) { Player onlinePlayer = player.getPlayer(); - if (onlinePlayer != null) { - if (!this.fightManager.isInCombat(onlinePlayer.getUniqueId())) { - return Optional.empty(); - } + if (onlinePlayer == null) { + return Optional.empty(); + } - return Optional.of(this.fightManager.getTag(onlinePlayer.getUniqueId())); + if (!this.fightManager.isInCombat(onlinePlayer.getUniqueId())) { + return Optional.empty(); } - return Optional.empty(); + return Optional.of(this.fightManager.getTag(onlinePlayer.getUniqueId())); + } + + @Override + public boolean canRegister() { + return true; + } + + @Override + public @NotNull String getIdentifier() { + return IDENTIFIER; + } + + @Override + public @NotNull String getAuthor() { + return this.plugin.getDescription().getAuthors().get(0); } + @Override + public @NotNull String getVersion() { + return this.plugin.getDescription().getVersion(); + } } From 34d408bf4c4b7a580f5faed4e96ac1c6ee76eb10 Mon Sep 17 00:00:00 2001 From: Piotr Zych <77621271+P1otrulla@users.noreply.github.com> Date: Fri, 22 Aug 2025 18:30:21 +0200 Subject: [PATCH 9/9] empty string -> null (papi, when receiving null in the code, marks it and sends an empty string) --- .../combat/bridge/placeholder/FightTagPlaceholder.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java index aedd9b2a..ad5e0c6a 100644 --- a/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/bridge/placeholder/FightTagPlaceholder.java @@ -39,7 +39,7 @@ public String onRequest(OfflinePlayer player, String identifier) { case "opponent_health" -> this.handleOpponentHealth(player); case "isInCombat" -> this.handleIsInCombat(player); case "isInCombat_formatted" -> this.handleIsInCombatFormatted(player); - default -> ""; + default -> null; }; } @@ -91,11 +91,7 @@ private boolean isPlayerInCombat(OfflinePlayer player) { private Optional getFightTag(OfflinePlayer player) { Player onlinePlayer = player.getPlayer(); - if (onlinePlayer == null) { - return Optional.empty(); - } - - if (!this.fightManager.isInCombat(onlinePlayer.getUniqueId())) { + if (onlinePlayer == null || !this.fightManager.isInCombat(onlinePlayer.getUniqueId())) { return Optional.empty(); }