From 1a6f99603ec7c98fd02a69588db408437a70cc10 Mon Sep 17 00:00:00 2001 From: Goosius1 <50219223+Goosius1@users.noreply.github.com> Date: Thu, 6 Jul 2023 09:18:35 +0100 Subject: [PATCH] Battle Commanders / Mobile Spawn Points (#856) * Added battle commanders feature --------- Authored-by: Goosius1 --- pom.xml | 4 +- .../com/gmail/goosius/siegewar/SiegeWar.java | 2 +- .../siegewar/command/SiegeWarCommand.java | 30 +++++- .../enums/SiegeWarPermissionNodes.java | 1 + .../SiegeWarBukkitEventListener.java | 7 ++ .../gmail/goosius/siegewar/objects/Siege.java | 19 ++++ .../siegewar/settings/ConfigNodes.java | 21 +++- .../siegewar/settings/SiegeWarSettings.java | 4 + .../utils/SiegeWarBattleCommanderUtil.java | 65 +++++++++++++ .../utils/SiegeWarBattleSessionUtil.java | 3 + .../siegewar/utils/SiegeWarDistanceUtil.java | 4 + .../siegewar/utils/SiegeWarSpawnUtil.java | 96 +++++++++++++++++++ src/main/resources/lang/en-US.yml | 20 +++- src/main/resources/plugin.yml | 6 ++ 14 files changed, 274 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarBattleCommanderUtil.java create mode 100644 src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarSpawnUtil.java diff --git a/pom.xml b/pom.xml index fcc9385cc..83b1b58bb 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 1.8 1.13 UTF-8 - 0.99.1.0 + 0.99.3.0 @@ -45,7 +45,7 @@ com.palmergames.bukkit.towny towny - 0.99.1.0 + 0.99.3.0 provided diff --git a/src/main/java/com/gmail/goosius/siegewar/SiegeWar.java b/src/main/java/com/gmail/goosius/siegewar/SiegeWar.java index 2c8e153da..84f2a60fe 100644 --- a/src/main/java/com/gmail/goosius/siegewar/SiegeWar.java +++ b/src/main/java/com/gmail/goosius/siegewar/SiegeWar.java @@ -41,7 +41,7 @@ public class SiegeWar extends JavaPlugin { private static SiegeWar plugin; - private final String requiredTownyVersion = "0.99.1.0"; + private final String requiredTownyVersion = "0.99.3.0"; private static final SiegeHUDManager siegeHUDManager = new SiegeHUDManager(); private final Object scheduler; diff --git a/src/main/java/com/gmail/goosius/siegewar/command/SiegeWarCommand.java b/src/main/java/com/gmail/goosius/siegewar/command/SiegeWarCommand.java index bb29a2f89..c80fcfd0e 100644 --- a/src/main/java/com/gmail/goosius/siegewar/command/SiegeWarCommand.java +++ b/src/main/java/com/gmail/goosius/siegewar/command/SiegeWarCommand.java @@ -10,6 +10,7 @@ import com.gmail.goosius.siegewar.utils.BossBarUtil; import com.gmail.goosius.siegewar.utils.CosmeticUtil; import com.gmail.goosius.siegewar.utils.SiegeWarMoneyUtil; +import com.gmail.goosius.siegewar.utils.SiegeWarSpawnUtil; import com.gmail.goosius.siegewar.utils.SiegeWarTownPeacefulnessUtil; import com.palmergames.bukkit.towny.TownyAPI; import com.palmergames.bukkit.towny.TownyEconomyHandler; @@ -36,7 +37,7 @@ public class SiegeWarCommand implements CommandExecutor, TabCompleter { - private static final List siegewarTabCompletes = Arrays.asList("collect", "town", "nation", "hud", "preference", "version", "nextsession"); + private static final List siegewarTabCompletes = Arrays.asList("collect", "town", "nation", "hud", "preference", "version", "nextsession", "spawn"); private static final List siegewarTownTabCompletes = Arrays.asList("togglepeaceful"); @@ -56,6 +57,7 @@ public List onTabComplete(CommandSender sender, Command command, String return NameUtil.filterByStart(siegewarTownTabCompletes, args[1]); break; case "hud": + case "spawn": if (args.length == 2) return NameUtil.filterByStart(new ArrayList<>(SiegeController.getNamesOfActivelySiegedTowns()), args[1]); break; @@ -76,12 +78,18 @@ public List onTabComplete(CommandSender sender, Command command, String private void showSiegeWarHelp(CommandSender sender) { TownyMessaging.sendMessage(sender, ChatTools.formatTitle("/siegewar")); TownyMessaging.sendMessage(sender, ChatTools.formatCommand("Eg", "/sw hud", "[town]", "")); + TownyMessaging.sendMessage(sender, ChatTools.formatCommand("Eg", "/sw spawn", "[town]", "")); TownyMessaging.sendMessage(sender, ChatTools.formatCommand("Eg", "/sw collect", "", Translatable.of("nation_help_11").forLocale(sender))); TownyMessaging.sendMessage(sender, ChatTools.formatCommand("Eg", "/sw nation", "paysoldiers [amount]", Translatable.of("nation_help_12").forLocale(sender))); TownyMessaging.sendMessage(sender, ChatTools.formatCommand("Eg", "/sw town", "togglepeaceful", Translatable.of("town_help_toggle_peaceful").forLocale(sender))); - TownyMessaging.sendMessage(sender, ChatTools.formatCommand("Eg", "/sw preference", "beacons [on/off]", "")); TownyMessaging.sendMessage(sender, ChatTools.formatCommand("Eg", "/sw nextsession", "", "")); TownyMessaging.sendMessage(sender, ChatTools.formatCommand("Eg", "/sw version", "", "")); + TownyMessaging.sendMessage(sender, ChatTools.formatCommand("Eg", "/sw preference", "beacons [on/off]", "")); + } + + private void showSpawnHelp(CommandSender sender) { + TownyMessaging.sendMessage(sender, ChatTools.formatTitle("/siegewar spawn")); + TownyMessaging.sendMessage(sender, ChatTools.formatCommand("Eg", "/sw spawn", "[town]", "")); } private void showNationHelp(CommandSender sender) { @@ -127,6 +135,9 @@ private void parseSiegeWarCommand(Player player, String[] args) { case "hud": parseSiegeWarHudCommand(player, StringMgmt.remFirstArg(args)); break; + case "spawn": + parseSiegeWarSpawnCommand(player, StringMgmt.remFirstArg(args)); + break; case "town": parseSiegeWarTownCommand(player, StringMgmt.remFirstArg(args)); break; @@ -211,6 +222,21 @@ private void parseSiegeWarHudCommand(Player player, String[] args) { } } + private void parseSiegeWarSpawnCommand(Player player, String[] args) { + try { + if (args.length == 0) { + showSpawnHelp(player); + } else { + Town town = TownyUniverse.getInstance().getTown(args[0]); + if (town == null) + throw new TownyException(Translatable.of("msg_err_town_not_registered", args[0])); + SiegeWarSpawnUtil.evaluateSpawnToSiegeRequest(player, town); + } + } catch (TownyException e) { + Messaging.sendErrorMsg(player, e.getMessage(player)); + } + } + private void parseSiegeWarNationCommand(Player player, String[] args) { if (args.length == 0) { showNationHelp(player); diff --git a/src/main/java/com/gmail/goosius/siegewar/enums/SiegeWarPermissionNodes.java b/src/main/java/com/gmail/goosius/siegewar/enums/SiegeWarPermissionNodes.java index 576f90da8..8db66dd17 100644 --- a/src/main/java/com/gmail/goosius/siegewar/enums/SiegeWarPermissionNodes.java +++ b/src/main/java/com/gmail/goosius/siegewar/enums/SiegeWarPermissionNodes.java @@ -35,6 +35,7 @@ public enum SiegeWarPermissionNodes { SIEGEWAR_COMMAND_SIEGEWAR_NATION_PAYSOLDIERS("siegewar.command.siegewar.nation.paysoldiers"), SIEGEWAR_COMMAND_SIEGEWAR_COLLECT("siegewar.command.siegewar.collect"), SIEGEWAR_COMMAND_SIEGEWAR_HUD("siegewar.command.siegewar.hud"), + SIEGEWAR_COMMAND_SIEGEWAR_SPAWN("siegewar.command.siegewar.spawn"), SIEGEWAR_COMMAND_SIEGEWAR_PREFERENCE("siegewar.command.siegewar.preference"), SIEGEWAR_COMMAND_SIEGEWAR_NEXTSESSION("siegewar.command.siegewar.nextsession"), diff --git a/src/main/java/com/gmail/goosius/siegewar/listeners/SiegeWarBukkitEventListener.java b/src/main/java/com/gmail/goosius/siegewar/listeners/SiegeWarBukkitEventListener.java index f89e1e4b2..ef79e01c5 100644 --- a/src/main/java/com/gmail/goosius/siegewar/listeners/SiegeWarBukkitEventListener.java +++ b/src/main/java/com/gmail/goosius/siegewar/listeners/SiegeWarBukkitEventListener.java @@ -5,6 +5,7 @@ import com.gmail.goosius.siegewar.objects.BattleSession; import com.gmail.goosius.siegewar.utils.DataCleanupUtil; import com.gmail.goosius.siegewar.utils.SiegeWarNotificationUtil; +import com.gmail.goosius.siegewar.utils.SiegeWarSpawnUtil; import com.gmail.goosius.siegewar.utils.SiegeWarWarningsUtil; import org.bukkit.Material; import org.bukkit.World; @@ -163,6 +164,12 @@ public void onPlayerTeleport(PlayerTeleportEvent event) { if (PluginIntegrations.getInstance().checkCitizens(event.getPlayer())) return; + // Don't stop a player if they have a teleport pass + if(SiegeWarSpawnUtil.doesPlayerHasTeleportPass(event.getPlayer())) { + SiegeWarSpawnUtil.removePlayerTeleportPass(event.getPlayer()); + return; + } + // The teleport destination is in the wilderness. if (TownyAPI.getInstance().isWilderness(event.getTo())) { // A part of an active siege zone in the wilderness, we stop it. diff --git a/src/main/java/com/gmail/goosius/siegewar/objects/Siege.java b/src/main/java/com/gmail/goosius/siegewar/objects/Siege.java index 3716c1e7b..65fbdaff8 100644 --- a/src/main/java/com/gmail/goosius/siegewar/objects/Siege.java +++ b/src/main/java/com/gmail/goosius/siegewar/objects/Siege.java @@ -56,6 +56,8 @@ public class Siege { private int attackerBattlePoints; private int defenderBattlePoints; private int numberOfBannerControlReversals; + private Resident attackingCommander; + private Resident defendingCommander; public Siege(Town town) { this.town = town; @@ -75,6 +77,8 @@ public Siege(Town town) { attackerBattlePoints = 0; defenderBattlePoints = 0; numberOfBannerControlReversals = 0; + attackingCommander = null; + defendingCommander = null; } public Town getTown() { @@ -405,4 +409,19 @@ public void setNumberOfBannerControlReversals(int numberOfBannerControlReversals this.numberOfBannerControlReversals = numberOfBannerControlReversals; } + public Resident getAttackingCommander() { + return attackingCommander; + } + + public void setAttackingCommander(Resident attackingCommander) { + this.attackingCommander = attackingCommander; + } + + public Resident getDefendingCommander() { + return defendingCommander; + } + + public void setDefendingCommander(Resident defendingCommander) { + this.defendingCommander = defendingCommander; + } } \ No newline at end of file diff --git a/src/main/java/com/gmail/goosius/siegewar/settings/ConfigNodes.java b/src/main/java/com/gmail/goosius/siegewar/settings/ConfigNodes.java index 21987f973..2b578d242 100644 --- a/src/main/java/com/gmail/goosius/siegewar/settings/ConfigNodes.java +++ b/src/main/java/com/gmail/goosius/siegewar/settings/ConfigNodes.java @@ -1058,7 +1058,26 @@ public enum ConfigNodes { "# This value determines the ideal configured occupation-tax value.", "# Example: If the ideal percentage is 0.375, then on each new day, we want to take 0.375% of the estimated town value.", "# TIP: Generally you want to keep this low enough so that fake sieges for immunity purposes are not worthwhile.", - "# The default value is 0.375"); + "# The default value is 0.375"), + BATTLE_COMMANDERS( + "battle_commanders", + "", + "", + "", + "############################################################", + "# +------------------------------------------------------+ #", + "# | BATTLE COMMANDERS | #", + "# +------------------------------------------------------+ #", + "############################################################", + ""), + BATTLE_COMMANDERS_ENABLED( + "battle_commanders.enabled", + "true", + "", + "# If this value is true, then the Battle Commander feature is enabled.", + "# When a battle sessions starts, then for each siege, one player from each side may be designated as the Battle Commander.", + "# To qualify as a battle commander, a player must be an official participant with general or king rank, and be online and in the Siege-Zone.", + "# If one side has a battle commander, then any member can run /sw spawn to spawn on the commander."); private final String Root; private final String Default; private String[] comments; diff --git a/src/main/java/com/gmail/goosius/siegewar/settings/SiegeWarSettings.java b/src/main/java/com/gmail/goosius/siegewar/settings/SiegeWarSettings.java index ac5d63440..84ad4a1c2 100644 --- a/src/main/java/com/gmail/goosius/siegewar/settings/SiegeWarSettings.java +++ b/src/main/java/com/gmail/goosius/siegewar/settings/SiegeWarSettings.java @@ -554,4 +554,8 @@ public static double getBadConfigWarningsIdealUpfrontCostPercentage() { public static double getBadConfigWarningsIdealOccupationTaxPercentage() { return Settings.getDouble(ConfigNodes.BAD_CONFIG_WARNINGS_IDEAL_OCCUPATIONTAX_PERCENTAGE); } + + public static boolean isBattleCommandersEnabled() { + return Settings.getBoolean(ConfigNodes.BATTLE_COMMANDERS_ENABLED); + } } diff --git a/src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarBattleCommanderUtil.java b/src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarBattleCommanderUtil.java new file mode 100644 index 000000000..ef6fcb60c --- /dev/null +++ b/src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarBattleCommanderUtil.java @@ -0,0 +1,65 @@ +package com.gmail.goosius.siegewar.utils; + +import com.gmail.goosius.siegewar.SiegeController; +import com.gmail.goosius.siegewar.enums.SiegeSide; +import com.gmail.goosius.siegewar.enums.SiegeWarPermissionNodes; +import com.gmail.goosius.siegewar.objects.Siege; +import com.gmail.goosius.siegewar.settings.SiegeWarSettings; +import com.palmergames.bukkit.towny.TownyAPI; +import com.palmergames.bukkit.towny.object.Translatable; +import com.palmergames.bukkit.towny.object.Translation; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.Locale; + +public class SiegeWarBattleCommanderUtil { + + /** + * Assign the siege commanders for this battle session + * To qualify, a player must be: + * - Online + * - In the siege zone + * - Nation king or general + * - An official siege participant + */ + public static void assignBattleCommanders() { + if(!SiegeWarSettings.isBattleCommandersEnabled()) { + return; + } + Player attackingCommander = null; + Player defendingCommander = null; + String attackingCommanderName; + String defendingCommanderName; + for(Siege siege: SiegeController.getSieges()) { + if(siege.getStatus().isActive()) { + //Wipe the current commanders + siege.setAttackingCommander(null); + siege.setDefendingCommander(null); + //Find the commanders for the siege + for(Player player: Bukkit.getOnlinePlayers()) { + if (SiegeWarDistanceUtil.isPlayerRegisteredToActiveSiegeZone(player) + && player.hasPermission(SiegeWarPermissionNodes.SIEGEWAR_NATION_SIEGE_STARTCONQUESTSIEGE.getNode())) + { + if(SiegeSide.getPlayerSiegeSide(siege,player) == SiegeSide.ATTACKERS) { + if(attackingCommander == null) { + attackingCommander = player; + siege.setAttackingCommander(TownyAPI.getInstance().getResident(player)); + } + } else if (SiegeSide.getPlayerSiegeSide(siege,player) == SiegeSide.DEFENDERS) { + if(defendingCommander == null) { + defendingCommander = player; + siege.setDefendingCommander(TownyAPI.getInstance().getResident(player)); + } + } + } + } + + //Display the commanders to all participants + attackingCommanderName = attackingCommander == null ? Translation.of("no_battle_commander") : attackingCommander.getName(); + defendingCommanderName = defendingCommander == null ? Translation.of("no_battle_commander") : defendingCommander.getName(); + SiegeWarNotificationUtil.informSiegeParticipants(siege, Translatable.of("msg_battle_commanders_assigned", siege.getTown().getName(), attackingCommanderName, defendingCommanderName)); + } + } + } +} diff --git a/src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarBattleSessionUtil.java b/src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarBattleSessionUtil.java index 75bec6735..79af106a3 100644 --- a/src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarBattleSessionUtil.java +++ b/src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarBattleSessionUtil.java @@ -71,6 +71,8 @@ public static void startBattleSession() { message.append(Translatable.of("msg_can_also_chat_in_discord", discordLink)); } Messaging.sendGlobalMessage(message); + //Assign siege commanders + SiegeWarBattleCommanderUtil.assignBattleCommanders(); //Start the bossbar for the Battle Session BossBarUtil.updateBattleSessionBossBar(); } @@ -347,4 +349,5 @@ private static Long getConfiguredStartTimeOfNextBattleSession() { return null; } } + } diff --git a/src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarDistanceUtil.java b/src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarDistanceUtil.java index 2765b4c72..6418662ae 100644 --- a/src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarDistanceUtil.java +++ b/src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarDistanceUtil.java @@ -65,6 +65,10 @@ public static boolean isPlayerRegisteredToActiveSiegeZone(Player player) { return playersRegisteredToActiveSiegeZones.containsKey(player); } + public static Siege getActiveSiegeZonePlayerIsRegisteredTo(Player player) { + return playersRegisteredToActiveSiegeZones.get(player); + } + public static void recalculatePlayersRegisteredToActiveSiegeZones() { playersRegisteredToActiveSiegeZones.clear(); for(Player player: Bukkit.getOnlinePlayers()) { diff --git a/src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarSpawnUtil.java b/src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarSpawnUtil.java new file mode 100644 index 000000000..7fb05739d --- /dev/null +++ b/src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarSpawnUtil.java @@ -0,0 +1,96 @@ +package com.gmail.goosius.siegewar.utils; + +import com.gmail.goosius.siegewar.SiegeController; +import com.gmail.goosius.siegewar.enums.SiegeSide; +import com.gmail.goosius.siegewar.objects.BattleSession; +import com.gmail.goosius.siegewar.objects.Siege; +import com.gmail.goosius.siegewar.settings.SiegeWarSettings; +import com.palmergames.bukkit.towny.TownyAPI; +import com.palmergames.bukkit.towny.exceptions.TownyException; +import com.palmergames.bukkit.towny.object.Resident; +import com.palmergames.bukkit.towny.object.Town; +import com.palmergames.bukkit.towny.object.Translatable; +import com.palmergames.bukkit.towny.object.WorldCoord; +import org.bukkit.entity.Player; + +import java.util.HashSet; +import java.util.Set; + +public class SiegeWarSpawnUtil { + + private static final Set playersWithTeleportPasses = new HashSet<>(); + + public static boolean doesPlayerHasTeleportPass(Player player) { + return playersWithTeleportPasses.contains(player); + } + + private static void grandTeleportPassToPlayer(Player player) { + playersWithTeleportPasses.add(player); + } + + public static void removePlayerTeleportPass(Player player) { + playersWithTeleportPasses.remove(player); + } + + /** + * Evaluate a spawn to siege request + * + * - If the primary nation/town has just 1 general/mayor in the siegezone, spawn to them. + * - If any allied nation has just 1 general in the siegezone, spawn to them. + * - Otherwise spawn is unavailable. + * + * @param player the player trying to spawn + * @param besiegedTown the besieged town + */ + public static void evaluateSpawnToSiegeRequest(Player player, Town besiegedTown) throws TownyException { + if(!SiegeWarSettings.isBattleCommandersEnabled()) { + throw new TownyException(Translatable.of("msg_err_cannot_spawn_feature_not_active")); + } + Siege siege = SiegeController.getSiege(besiegedTown); + if(siege == null) { + throw new TownyException(Translatable.of("msg_err_not_being_sieged", besiegedTown.getName())); + } + if(!siege.getStatus().isActive()) { + throw new TownyException(Translatable.of("msg_err_cannot_spawn_siege_not_active")); + } + if(!BattleSession.getBattleSession().isActive()) { + throw new TownyException(Translatable.of("msg_err_cannot_spawn_battle_session_not_active")); + } + SiegeSide playerSide = SiegeSide.getPlayerSiegeSide(siege, player); + Resident battleCommanderResident; + switch (playerSide) { + case ATTACKERS: + battleCommanderResident = siege.getAttackingCommander(); + break; + case DEFENDERS: + battleCommanderResident = siege.getDefendingCommander(); + break; + default: + throw new TownyException(Translatable.of("msg_err_cannot_spawn_not_participant")); + } + if(battleCommanderResident == null) { + throw new TownyException(Translatable.of("msg_err_cannot_spawn_no_battle_commander")); + } + Player battleCommander = TownyAPI.getInstance().getPlayer(battleCommanderResident); + if(battleCommander == null || !battleCommander.isOnline()) { + throw new TownyException(Translatable.of("msg_err_cannot_spawn_no_battle_commander_offline")); + } + if(battleCommander.isDead()) { + throw new TownyException(Translatable.of("msg_err_cannot_spawn_battle_commander_dead")); + } + if(!SiegeWarDistanceUtil.isPlayerRegisteredToActiveSiegeZone(battleCommander)) { + throw new TownyException(Translatable.of("msg_err_cannot_spawn_battle_commander_not_in_siegezone")); + } + if(SiegeWarDistanceUtil.getActiveSiegeZonePlayerIsRegisteredTo(battleCommander) != siege) { + throw new TownyException(Translatable.of("msg_err_cannot_spawn_battle_commander_not_in_siegezone")); + } + Resident spawnerResident = TownyAPI.getInstance().getResident(player); + if(!WorldCoord.parseWorldCoord(player).equals(spawnerResident.getTown().getHomeBlock().getWorldCoord())) { + throw new TownyException(Translatable.of("msg_err_cannot_spawn_not_in_homeblock")); + } + //Grant teleport pass in order to bypass SW's teleport blocker + grandTeleportPassToPlayer(player); + //SPAWN! + player.teleport(battleCommander); + } +} diff --git a/src/main/resources/lang/en-US.yml b/src/main/resources/lang/en-US.yml index fc446bfb6..a418619e3 100644 --- a/src/main/resources/lang/en-US.yml +++ b/src/main/resources/lang/en-US.yml @@ -113,7 +113,7 @@ config_and_lang_file_reloaded_successfully: 'Config and Language file reloaded s config_and_lang_file_could_not_be_loaded: 'Reload unsuccessful. See console for details.' #Added in 0.05: -msg_err_not_being_sieged: '&cTown %s does not have any active sieges.' +msg_err_not_being_sieged: '&cTown %s does not have an active siege.' msg_err_town_not_registered: '&cTown %s is not registered.' #Scoreboard @@ -636,4 +636,20 @@ msg_err_note_about_warnings: "&cNOTE: If you have 'test/debug' towns or nations, #Block Placement -msg_err_banner_cannot_be_more_than_one_block_away: "&cThe banner cannot be more than 1 block away from the target town." \ No newline at end of file +msg_err_banner_cannot_be_more_than_one_block_away: "&cThe banner cannot be more than 1 block away from the target town." + +#Battle Commanders / Mobile Spawn Points + +msg_battle_commanders_assigned: "&bSiege at %s > Battle Commanders Assigned. Attacking Commander: %s. Defending Commander: %s." +no_battle_commander: "" +msg_err_cannot_spawn_feature_not_active: "&cYou cannot spawn to the siege because the 'battle commanders' feature is disabled by your server." +msg_err_cannot_spawn_siege_not_active: "&cYou cannot spawn to the siege because the siege is not active." +msg_err_cannot_spawn_battle_session_not_active: "&cYou cannot spawn to the siege because there is no active battle session." +msg_err_cannot_spawn_not_participant: "&cYou cannot spawn to the siege because you are not an official participant in the siege." +msg_err_cannot_spawn_no_battle_commander: "&cYou cannot spawn to the siege because your team has no battle commander." +msg_err_cannot_spawn_battle_commander_offline: "&cYou cannot spawn to the siege because your team's battle commander is offline." +msg_err_cannot_spawn_battle_commander_dead: "&cYou cannot spawn to the siege because your team's battle commander is dead." +msg_err_cannot_spawn_battle_commander_not_in_siegezone: "&cYou cannot spawn to the siege because your team's battle commander is not in the Siege-Zone." +msg_err_cannot_spawn_not_in_homeblock: "&cYou must be in your town homeblock to spawn to the siege." + + diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index e65458feb..32f8d02fd 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -62,6 +62,12 @@ permissions: default: true children: siegewar.command.siegewar.hud: true + + siegewar.command.siegewar.spawn.*: + description: User is able to do all /siegewar spawn commands. + default: true + children: + siegewar.command.siegewar.spawn: true siegewar.command.siegewar.town.*: description: User is able to do all /siegewar town commands.