diff --git a/eternalcombat-plugin/build.gradle.kts b/eternalcombat-plugin/build.gradle.kts index 634f72df..2c340497 100644 --- a/eternalcombat-plugin/build.gradle.kts +++ b/eternalcombat-plugin/build.gradle.kts @@ -75,7 +75,8 @@ 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") } } 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..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.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 b4e9a051..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 @@ -1,5 +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; @@ -14,85 +16,105 @@ 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(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 -> null; + }; } - - @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")) { - 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())) - .orElse(""); - } + private String handleOpponentHealth(OfflinePlayer player) { + return this.getTagger(player) + .map(tagger -> String.format("%.2f", tagger.getHealth())) + .orElse(""); + } - if (identifier.equals("opponent")) { - return this.getTagger(player) - .map(tagger -> tagger.getName()) - .orElse(""); - } + private String handleIsInCombat(OfflinePlayer player) { + return String.valueOf(this.isPlayerInCombat(player)); + } - if (identifier.equals("opponent_health")) { - return this.getTagger(player) - .map(tagger -> String.format("%.2f", tagger.getHealth())) - .orElse(""); - } + 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(); - } - - return Optional.of(this.fightManager.getTag(onlinePlayer.getUniqueId())); + if (onlinePlayer == null || !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(); + } } 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..4465587a --- /dev/null +++ b/eternalcombat-plugin/src/main/java/com/eternalcode/combat/config/implementation/PlaceholderSettings.java @@ -0,0 +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 e3e1a6c8..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 @@ -106,6 +106,13 @@ public class PluginConfig extends OkaeriConfig { }) public CombatSettings combat = new CombatSettings(); + @Comment({ + " ", + "# Settings related to placeholders used in the plugin.", + "# Configure default values returned by placeholders" + }) + public PlaceholderSettings placeholders = new PlaceholderSettings(); + @Comment({ " ", "# Customize the messages displayed by the plugin.",