Skip to content
3 changes: 2 additions & 1 deletion eternalcombat-plugin/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Comment on lines +78 to +79
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are you sure you can download plugins from SpigotMC? Don't they have some sort of anti-CDN downloader?

}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.")
);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use Boolean#toString

Suggested change
return String.valueOf(this.isPlayerInCombat(player));
return this.isPlayerInCombat(player).toString();

}

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<Player> 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<FightTag> 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();
}
}
Original file line number Diff line number Diff line change
@@ -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";

}
Original file line number Diff line number Diff line change
Expand Up @@ -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.",
Expand Down
Loading