diff --git a/changelog.md b/changelog.md index d4c3902..17b45fa 100644 --- a/changelog.md +++ b/changelog.md @@ -1,10 +1,16 @@ # Unreleased +# 3.1.0 + +- Add ``enableEverySecondsCooldownMessage``, Periodically displays a message when the koth is launched +- Fixed the koth default type when creating, the type will now be CAPTURE +- Add ``%captureProgress%`` and `%capturePercent%` placeholder + # 3.0.9 - Update HuskTown API - Fix scoreboard title with PlaceholderApi -- Minor fixs +- Minor fixes # 3.0.8 diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index e9158ed..e49fac9 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -3,7 +3,7 @@ 4.0.0 fr.maxlego08.koth zKoth - 3.0.9 + 3.1.0 src diff --git a/pom.xml b/pom.xml index 06c13b8..dcabc06 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 fr.maxlego08.koth zKoth - 3.0.9 + 3.1.0 UTF-8 8 diff --git a/src/fr/maxlego08/koth/ZKoth.java b/src/fr/maxlego08/koth/ZKoth.java index 5e8d6ed..b2d4ece 100644 --- a/src/fr/maxlego08/koth/ZKoth.java +++ b/src/fr/maxlego08/koth/ZKoth.java @@ -23,7 +23,6 @@ import fr.maxlego08.koth.save.Config; import fr.maxlego08.koth.scoreboard.ScoreBoardManager; import fr.maxlego08.koth.zcore.enums.Message; import fr.maxlego08.koth.zcore.logger.Logger; -import fr.maxlego08.koth.zcore.utils.ColorTransformer; import fr.maxlego08.koth.zcore.utils.Cuboid; import fr.maxlego08.koth.zcore.utils.ProgressBar; import fr.maxlego08.koth.zcore.utils.ZUtils; @@ -70,6 +69,7 @@ public class ZKoth extends ZUtils implements Koth { private final boolean enableStartCapMessage; private final boolean enableLooseCapMessage; private final boolean enableEverySecondsCapMessage; + private final boolean enableEverySecondsCooldownMessage; private final HologramConfig hologramConfig; private final KothLootType kothLootType; private final List blacklistTeamId; @@ -92,7 +92,7 @@ public class ZKoth extends ZUtils implements Koth { private TimerTask timerTaskStop; private List playerResults = new ArrayList<>(); - public ZKoth(KothPlugin plugin, String fileName, KothType kothType, String name, int captureSeconds, Location minLocation, Location maxLocation, List startCommands, List endCommands, ScoreboardConfiguration cooldownScoreboard, ScoreboardConfiguration startScoreboard, int cooldownStart, int stopAfterSeconds, boolean enableStartCapMessage, boolean enableLooseCapMessage, boolean enableEverySecondsCapMessage, HologramConfig hologramConfig, List itemStacks, KothLootType kothLootType, DiscordWebhookConfig discordWebhookConfig, int randomItemStacks, List blacklistTeamId, ProgressBar progressBar, List randomCommands, int maxRandomCommands) { + public ZKoth(KothPlugin plugin, String fileName, KothType kothType, String name, int captureSeconds, Location minLocation, Location maxLocation, List startCommands, List endCommands, ScoreboardConfiguration cooldownScoreboard, ScoreboardConfiguration startScoreboard, int cooldownStart, int stopAfterSeconds, boolean enableStartCapMessage, boolean enableLooseCapMessage, boolean enableEverySecondsCapMessage, boolean enableEverySecondsCooldownMessage, HologramConfig hologramConfig, List itemStacks, KothLootType kothLootType, DiscordWebhookConfig discordWebhookConfig, int randomItemStacks, List blacklistTeamId, ProgressBar progressBar, List randomCommands, int maxRandomCommands) { this.plugin = plugin; this.fileName = fileName; this.kothType = kothType; @@ -109,6 +109,7 @@ public class ZKoth extends ZUtils implements Koth { this.enableStartCapMessage = enableStartCapMessage; this.enableLooseCapMessage = enableLooseCapMessage; this.enableEverySecondsCapMessage = enableEverySecondsCapMessage; + this.enableEverySecondsCooldownMessage = enableEverySecondsCooldownMessage; this.hologramConfig = hologramConfig; this.itemStacks = itemStacks; this.kothLootType = kothLootType; @@ -135,6 +136,7 @@ public class ZKoth extends ZUtils implements Koth { this.enableStartCapMessage = true; this.enableLooseCapMessage = true; this.enableEverySecondsCapMessage = false; + this.enableEverySecondsCooldownMessage = false; this.hologramConfig = new HologramConfig(false, new ArrayList<>(), getCenter()); this.discordWebhookConfig = null; this.itemStacks = new ArrayList<>(); @@ -349,6 +351,9 @@ public class ZKoth extends ZUtils implements Koth { if (Config.displayMessageCooldown.contains(currentRemainingSeconds)) { broadcast(Message.EVENT_COOLDOWN); } + if (this.enableEverySecondsCapMessage) { + broadcast(Message.EVENT_COOLDOWN_EVERYSECONDS); + } if (currentRemainingSeconds <= 0) { this.timerTask.cancel(); @@ -560,24 +565,25 @@ public class ZKoth extends ZUtils implements Koth { KothCapEvent capEvent = new KothCapEvent(this, player, this.remainingSeconds.get(), this.kothTeam.getTeamName(player)); capEvent.call(); + if (this.enableEverySecondsCapMessage) { + broadcast(Message.EVENT_EVERYSECONDS); + } + if (Config.displayMessageKothCap.contains(currentRemainingSeconds)) { broadcast(Message.EVENT_TIMER); - } else if (enableEverySecondsCapMessage) { - broadcast(Message.EVENT_EVERYSECONDS); } updateDisplay(); switch (this.kothType) { - case CAPTURE: - default: - this.remainingSeconds.decrementAndGet(); - break; case SCORE: // case TIMER: this.playersValues.put(this.currentPlayer.getUniqueId(), this.getValue(this.currentPlayer) + 1); this.playerResults.clear(); // Clear cache break; + case CAPTURE: + default: + break; } } }); @@ -612,7 +618,7 @@ public class ZKoth extends ZUtils implements Koth { this.plugin.getScoreBoardManager().clearBoard(); this.endCommands.forEach(command -> dispatchCommand(command, player)); - if (this.maxRandomCommands != 0 && this.randomCommands.size() != 0) { + if (this.maxRandomCommands != 0 && !this.randomCommands.isEmpty()) { int executedCommands = 0; while (executedCommands < maxRandomCommands) { RandomCommand randomCommand = randomElement(this.randomCommands); @@ -630,7 +636,7 @@ public class ZKoth extends ZUtils implements Koth { } Location location = center.clone(); - if (this.itemStacks.size() != 0) { + if (!this.itemStacks.isEmpty()) { switch (this.kothLootType) { case CHEST: location.getBlock().setType(Material.CHEST); @@ -699,7 +705,7 @@ public class ZKoth extends ZUtils implements Koth { break; } case CENTER: { - if (message.getMessages().size() == 0) { + if (message.getMessages().isEmpty()) { String realMessage = replaceMessage(message.getMessage()); broadcastCenterMessage(Collections.singletonList(realMessage)); } else { @@ -708,7 +714,7 @@ public class ZKoth extends ZUtils implements Koth { break; } case TCHAT: { - if (message.getMessages().size() == 0) this.broadcast(replaceMessage(message.getMessage())); + if (message.getMessages().isEmpty()) this.broadcast(replaceMessage(message.getMessage())); else message.getMessages().forEach(m -> this.broadcast(replaceMessage(m))); break; } @@ -742,6 +748,8 @@ public class ZKoth extends ZUtils implements Koth { int seconds = this.remainingSeconds == null ? this.captureSeconds : this.remainingSeconds.get(); string = string.replace("%captureFormat%", TimerBuilder.getStringTime(seconds)); string = string.replace("%captureSeconds%", String.valueOf(seconds)); + string = string.replace("%captureProgress%", getProgressBar(this.captureSeconds - seconds, this.captureSeconds, this.progressBar)); + string = string.replace("%capturePercent%", this.captureSeconds == 0 ? "0" : format(percent(this.captureSeconds - seconds, this.captureSeconds))); return replaceKothInformations(string); } @@ -882,4 +890,9 @@ public class ZKoth extends ZUtils implements Koth { public int getMaxRandomCommands() { return this.maxRandomCommands; } + + @Override + public boolean isEnableEverySecondsCooldownMessage() { + return enableEverySecondsCooldownMessage; + } } diff --git a/src/fr/maxlego08/koth/api/Koth.java b/src/fr/maxlego08/koth/api/Koth.java index 25b8ff9..89e8799 100644 --- a/src/fr/maxlego08/koth/api/Koth.java +++ b/src/fr/maxlego08/koth/api/Koth.java @@ -210,6 +210,14 @@ public interface Koth { */ boolean isEnableEverySecondsCapMessage(); + /** + * Checks if a message should be displayed every second during the game. + * + * @return {@code true} if the every-second game message is enabled, {@code false} otherwise. + */ + boolean isEnableEverySecondsCooldownMessage(); + + /** * Defines a consumer to be called for scoreboards updates. This allows for dynamic scoreboard content based on the game state. * diff --git a/src/fr/maxlego08/koth/command/CommandManager.java b/src/fr/maxlego08/koth/command/CommandManager.java index a184e28..9235cf9 100644 --- a/src/fr/maxlego08/koth/command/CommandManager.java +++ b/src/fr/maxlego08/koth/command/CommandManager.java @@ -166,7 +166,7 @@ public class CommandManager extends ZUtils implements CommandExecutor, TabComple super.runAsync(this.plugin, () -> { CommandType returnType = command.prePerform(this.plugin, sender, strings); if (returnType == CommandType.SYNTAX_ERROR) { - message(sender, Message.COMMAND_SYNTAXE_ERROR, "%syntax%", command.getSyntax()); + message(sender, Message.COMMAND_SYNTAX_ERROR, "%syntax%", command.getSyntax()); } }); return CommandType.DEFAULT; @@ -174,7 +174,7 @@ public class CommandManager extends ZUtils implements CommandExecutor, TabComple CommandType returnType = command.prePerform(this.plugin, sender, strings); if (returnType == CommandType.SYNTAX_ERROR) { - message(sender, Message.COMMAND_SYNTAXE_ERROR, "%syntax%", command.getSyntax()); + message(sender, Message.COMMAND_SYNTAX_ERROR, "%syntax%", command.getSyntax()); } return returnType; } diff --git a/src/fr/maxlego08/koth/command/VCommand.java b/src/fr/maxlego08/koth/command/VCommand.java index 423da49..7997d4d 100644 --- a/src/fr/maxlego08/koth/command/VCommand.java +++ b/src/fr/maxlego08/koth/command/VCommand.java @@ -589,7 +589,7 @@ public abstract class VCommand extends Arguments { public void syntaxMessage() { this.subVCommands.forEach(command -> { if (command.getPermission() == null || hasPermission(sender, command.getPermission())) { - message(this.sender, Message.COMMAND_SYNTAXE_HELP, "%syntax%", command.getSyntax(), "%description%", + message(this.sender, Message.COMMAND_SYNTAX_HELP, "%syntax%", command.getSyntax(), "%description%", command.getDescription()); } }); diff --git a/src/fr/maxlego08/koth/command/commands/CommandKothCreate.java b/src/fr/maxlego08/koth/command/commands/CommandKothCreate.java index 912c850..973f406 100644 --- a/src/fr/maxlego08/koth/command/commands/CommandKothCreate.java +++ b/src/fr/maxlego08/koth/command/commands/CommandKothCreate.java @@ -31,7 +31,7 @@ public class CommandKothCreate extends VCommand { protected CommandType perform(KothPlugin plugin) { String name = argAsString(0); - KothType kothType = KothType.valueOf(argAsString(1, KothType.SCORE.name()).toUpperCase()); + KothType kothType = KothType.valueOf(argAsString(1, KothType.CAPTURE.name()).toUpperCase()); int capture = argAsInteger(2, 30); Optional optional = this.manager.getSelection(this.player.getUniqueId()); diff --git a/src/fr/maxlego08/koth/loader/KothLoader.java b/src/fr/maxlego08/koth/loader/KothLoader.java index 10f4256..e21819d 100644 --- a/src/fr/maxlego08/koth/loader/KothLoader.java +++ b/src/fr/maxlego08/koth/loader/KothLoader.java @@ -54,6 +54,7 @@ public class KothLoader extends ZUtils implements Loader { boolean enableStartCapMessage = configuration.getBoolean("enableStartCapMessage", true); boolean enableLooseCapMessage = configuration.getBoolean("enableLooseCapMessage", true); boolean enableEverySecondsCapMessage = configuration.getBoolean("enableEverySecondsCapMessage", false); + boolean enableEverySecondsCooldownMessage = configuration.getBoolean("enableEverySecondsCooldownMessage", false); List startCommands = configuration.getStringList("startCommands"); List endCommands = configuration.getStringList("endCommands"); Location minLocation = locationLoader.load(configuration, "minLocation.", file); @@ -90,7 +91,7 @@ public class KothLoader extends ZUtils implements Loader { }); } - return new ZKoth(this.plugin, fileName, kothType, name, captureSeconds, minLocation, maxLocation, startCommands, endCommands, cooldownScoreboard, startScoreboard, cooldownStart, stopAfterSeconds, enableStartCapMessage, enableLooseCapMessage, enableEverySecondsCapMessage, hologramConfig, itemStacks, kothLootType, discordWebhookConfig, randomItemStacks, blacklistTeamId, progressBar, randomCommands, maxRandomCommands); + return new ZKoth(this.plugin, fileName, kothType, name, captureSeconds, minLocation, maxLocation, startCommands, endCommands, cooldownScoreboard, startScoreboard, cooldownStart, stopAfterSeconds, enableStartCapMessage, enableLooseCapMessage, enableEverySecondsCapMessage, enableEverySecondsCooldownMessage, hologramConfig, itemStacks, kothLootType, discordWebhookConfig, randomItemStacks, blacklistTeamId, progressBar, randomCommands, maxRandomCommands); } @Override @@ -117,6 +118,7 @@ public class KothLoader extends ZUtils implements Loader { configuration.set("enableStartCapMessage", koth.isEnableStartCapMessage()); configuration.set("enableLooseCapMessage", koth.isEnableLooseCapMessage()); configuration.set("enableEverySecondsCapMessage", koth.isEnableEverySecondsCapMessage()); + configuration.set("enableEverySecondsCooldownMessage", koth.isEnableEverySecondsCooldownMessage()); locationLoader.save(koth.getMinLocation(), configuration, "minLocation."); locationLoader.save(koth.getMaxLocation(), configuration, "maxLocation."); scoreboardLoaderLoader.save(koth.getCooldownScoreboard(), configuration, "scoreboard.cooldown."); diff --git a/src/fr/maxlego08/koth/zcore/enums/Message.java b/src/fr/maxlego08/koth/zcore/enums/Message.java index 3fb1fa4..7229b3a 100644 --- a/src/fr/maxlego08/koth/zcore/enums/Message.java +++ b/src/fr/maxlego08/koth/zcore/enums/Message.java @@ -34,11 +34,11 @@ public enum Message { FORMAT_DAY("d"), FORMAT_DAYS("days"), - COMMAND_SYNTAXE_ERROR("§cYou must execute the command like this§7: §a%syntax%"), + COMMAND_SYNTAX_ERROR("§cYou must execute the command like this§7: §a%syntax%"), COMMAND_NO_PERMISSION("§cYou do not have permission to run this command."), COMMAND_NO_CONSOLE("§cOnly one player can execute this command."), COMMAND_NO_ARG("§cImpossible to find the command with its arguments."), - COMMAND_SYNTAXE_HELP("§f%syntax% §7» §7%description%"), + COMMAND_SYNTAX_HELP("§f%syntax% §7» §7%description%"), RELOAD("§aYou have just reloaded the configuration files."), @@ -104,6 +104,7 @@ public enum Message { "", "§8§m-+------------------------------+-" ), + EVENT_COOLDOWN_EVERYSECONDS(MessageType.ACTION, "§fThe koth §n%name%§f will appear in §d%spawnFormat% §8(§7%centerX%, %centerY%, %centerZ%§8)"), EVENT_STOP(MessageType.CENTER, "§8§m-+------------------------------+-", @@ -123,7 +124,7 @@ public enum Message { EVENT_CATCH(MessageType.ACTION, "§d%playerName% §fjust started capturing the koth §n%name%§f. §8(§7%centerX%, %centerY%, %centerZ%§8)"), EVENT_LOOSE(MessageType.ACTION, "§d%playerName% §fjust loose koth §n%name%§f. §8(§7%centerX%, %centerY%, %centerZ%§8)"), EVENT_TIMER(MessageType.ACTION, "§fAnother §b%captureFormat% §fbefore §d%playerName% §fwins the koth §n%name%§e. §8(§7%centerX%, %centerY%, %centerZ%§8)"), - EVENT_EVERYSECONDS(MessageType.ACTION, "§d%playerName% §7- §8[§f%classicProgress%§8] §7- §b%classicPercent%§f%"), + EVENT_EVERYSECONDS(MessageType.ACTION, "§d%playerName% §7- §8[§f%captureProgress%§8] §7- §b%capturePercent%§f%"), MOVE_SUCCESS("§7You have just moved the koth §f%name%§7."), diff --git a/src/main/resources/koth-example.yml b/src/main/resources/koth-example.yml index b85d1c1..ca526a4 100644 --- a/src/main/resources/koth-example.yml +++ b/src/main/resources/koth-example.yml @@ -1,85 +1,86 @@ -# Available placeholders: -# - %online-player% - Allows to run the order to all online players of the team -# - %name% - Koth name -# - %world% - World name -# - %minX% - Min location X -# - %minY% - Min location Y -# - %minZ% - Min location Z -# - %maxX% - Max location X -# - %maxY% - Max location Y -# - %maxZ% - Max location Z -# - %centerX% - Center location X -# - %centerY% - Center location Y -# - %centerZ% - Center location Z -# - %spawnSeconds% - Second before koth spawn -# - %spawnFormat% - Time format before koth spawn -# - %playerName% - Current player name -# - %teamName% - Current player team name -# - %teamId% - Current player team id -# - %teamLeader% - Current player team leader name -# - %captureSeconds% - Capture seconds (only for CAPTURE type) -# - %captureFormat% - Capture time format (only for CAPTURE type) +# Available placeholders for command execution: +# - %online-player%: Targets all online players in the team +# - %name%: Name of the Koth event +# - %world%: Name of the world where Koth is located +# - %minX%, %minY%, %minZ%: Minimum X, Y, Z coordinates of Koth area +# - %maxX%, %maxY%, %maxZ%: Maximum X, Y, Z coordinates of Koth area +# - %centerX%, %centerY%, %centerZ%: Center X, Y, Z coordinates of Koth area +# - %spawnSeconds%: Seconds before Koth spawns +# - %spawnFormat%: Formatted time before Koth spawns +# - %playerName%: Name of the player capturing Koth +# - %teamName%: Name of the player's team +# - %teamId%: ID of the player's team +# - %teamLeader%: Name of the team leader +# - %captureSeconds%: Seconds taken to capture (only for CAPTURE type) +# - %captureFormat%: Formatted capture time (only for CAPTURE type) -# Koth display name +# Display name for the Koth event name: test -# Koth type +# Type of Koth event (e.g., CAPTURE) type: CAPTURE -# Capture time or score to achieve +# Target capture time or score for winning Koth capture: 30 -# Time in seconds to spawn koth with /koth spawn command +# Cooldown duration in seconds before Koth can be spawned again cooldownStart: 300 -# Time in seconds to automatically stop koth +# Time in seconds after which the Koth event stops automatically stopAfterSeconds: 3600 -# Activate the message when a player starts capturing the koth +# Toggle message display when a player starts capturing Koth enableStartCapMessage: true -# Activate the message when a player loses the koth capture +# Toggle message display when a player loses the Koth capture enableLooseCapMessage: true -# Commands that will be executed when the koth is launched +# Enable/disable periodic messages during capture +enableEverySecondsCapMessage: false + +# Enable/disable periodic message during spawn cooldown +enableEverySecondsCooldownMessage: false + +# List of commands executed when Koth starts startCommands: [] -# Commands that will be executed when the koth is won by a player +# List of commands executed when a player wins the Koth endCommands: [] -# Allows to run random commands at the end of the koth +# Configuration for random commands executed at the end of Koth randomEndCommands: - # Number of commands to execute + # Number of random commands to execute commandAmount: 2 - # List of possible commands + # List of potential commands with execution probability commands: - - percent: 20 # Command percent - commands: # Commands list + - percent: 20 # Probability for this command + commands: # List of commands - "bc random command #1" - - percent: 20 # Command percent - commands: # Commands list + - percent: 20 + commands: - "bc random command #2" - - percent: 10 # Command percent - commands: # Commands list + - percent: 10 + commands: - "bc random command #3" - - percent: 40 # Command percent - commands: # Commands list + - percent: 40 + commands: - "bc random command #4" -# First location +# Coordinates for the first location of Koth area minLocation: world: world x: 0 y: 0 z: 0 -# Second location +# Coordinates for the second location of Koth area manLocation: world: world x: 0 y: 0 z: 0 +# Scoreboard settings for Koth event scoreboard: cooldown: enable: true @@ -107,6 +108,7 @@ scoreboard: - " #636363◊ #ffffff%captureFormat%" - "&r" +# Hologram display configuration for Koth hologram: enable: false lines: @@ -118,21 +120,22 @@ hologram: y: 0 z: 0 +# Webhook settings for sending Koth events to external services webhook: enable: true - url: "https://discord.com/api/webhooks/1187068418923438190/eHBOLr52d7S28rcMqtNAdHbCi-9Gpk1tG0IU1ulbf3p6z9IbM2UqoSl9MxRT1TdX5k-W" - # Available event: - # - SPAWN - # - START - # - STOP - # - START_CAP - # - WIN - # - LOOSE + url: "https://discord.com/api/webhooks/1187068418923438190/" + # List of Koth events that trigger the webhook + # - SPAWN: When Koth spawns + # - START: When Koth starts + # - STOP: When Koth stops + # - START_CAP: When capture starts + # - WIN: When Koth is won + # - LOOSE: When Koth capture is lost events: START: event: START title: 'Start Koth' - description: "Koth %name% has been started !" + description: "Koth %name% has been started!" # url: "" color: r: 40 @@ -142,35 +145,31 @@ webhook: text: zKoth iconUrl: https://groupez.dev/storage/images/9.png # thumbnail: "" - # image: " + # image: "" # author: - # name: "Maxlego08" - # url: "" - # iconUrl: "" + # name: "Maxlego08" + # url: "" + # iconUrl: "" # fields: # - name: Info # value: "A new koth" # inline: false +# Loot configuration for the Koth event loot: - # Takes 10 items from the list of items, to put all the items you must put -1 + # Number of random items to select from the item list; use -1 for all items random: 3 - # Available type : - # DROP - # CHEST - # INVENTORY - # NONE + # Type of loot distribution: DROP, CHEST, INVENTORY, NONE type: NONE - # Use /koth loot + # Item list for loot; configure using /koth loot items: [] - -# Allows blacklist of team IDs so that it does not participate in koth, in this example, teams with ID 0 and -1 are blacklist +# Blacklist configuration for team IDs that cannot participate in Koth blacklistTeamId: - "0" - "-1" -# Configuration for the Progress Bar. Use by placeholders +# Configuration for the Koth Progress Bar, used in placeholders progressBar: length: 20 symbol: "|"