From 523ce30ed22b920a9c69860a313dee04ee7fd277 Mon Sep 17 00:00:00 2001 From: GabeTrafalgar <34383703+supersquids12@users.noreply.github.com> Date: Mon, 28 Apr 2025 04:35:41 -0400 Subject: [PATCH] Elytra Artillery Nerf Added the config option "DisableDirectorElytra"(default false) where when true, will prevent players with elytras on from using directors. Checks both when equipping an elytra and trying to use a director sign. Replaced calls to deprecated methods with supported ones. However, the supported ones seem to have display issues when used in chat --- .../movecraft/combat/MovecraftCombat.java | 8 ++-- .../combat/features/combat/CombatRelease.java | 4 +- .../features/directors/AADirectors.java | 24 ++++++++---- .../features/directors/ArrowDirectors.java | 19 ++++++++-- .../features/directors/CannonDirectors.java | 19 ++++++++-- .../directors/DirectorElytraListener.java | 37 +++++++++++++++++++ .../MovementTracerSettingCommand.java | 12 +++--- .../commands/TNTTracerModeCommand.java | 12 +++--- .../commands/TNTTracerSettingCommand.java | 12 +++--- src/main/resources/config.yml | 1 + .../localisation/mcclang_en.properties | 4 ++ 11 files changed, 115 insertions(+), 37 deletions(-) create mode 100644 src/main/java/net/countercraft/movecraft/combat/features/directors/DirectorElytraListener.java diff --git a/src/main/java/net/countercraft/movecraft/combat/MovecraftCombat.java b/src/main/java/net/countercraft/movecraft/combat/MovecraftCombat.java index 51f7c392..f9fd9ab4 100644 --- a/src/main/java/net/countercraft/movecraft/combat/MovecraftCombat.java +++ b/src/main/java/net/countercraft/movecraft/combat/MovecraftCombat.java @@ -2,10 +2,7 @@ import net.countercraft.movecraft.combat.features.*; import net.countercraft.movecraft.combat.features.combat.CombatRelease; -import net.countercraft.movecraft.combat.features.directors.AADirectors; -import net.countercraft.movecraft.combat.features.directors.ArrowDirectors; -import net.countercraft.movecraft.combat.features.directors.CannonDirectors; -import net.countercraft.movecraft.combat.features.directors.Directors; +import net.countercraft.movecraft.combat.features.directors.*; import net.countercraft.movecraft.combat.features.tracers.MovementTracers; import net.countercraft.movecraft.combat.features.tracers.TNTTracers; import net.countercraft.movecraft.combat.features.tracers.commands.MovementTracerSettingCommand; @@ -85,6 +82,7 @@ public void onEnable() { FireballPenetration.load(getConfig()); ReImplementTNTTranslocation.load(getConfig()); BlockBehaviorOverride.load(getConfig()); + DirectorElytraListener.load(getConfig()); // Register event translation listeners getServer().getPluginManager().registerEvents(new CraftCollisionExplosionListener(), this); @@ -104,6 +102,8 @@ public void onEnable() { var cannonDirectors = new CannonDirectors(); getServer().getPluginManager().registerEvents(cannonDirectors, this); cannonDirectors.runTaskTimer(this, 0, 1); // Every tick + var DirectorElytra = new DirectorElytraListener(); + getServer().getPluginManager().registerEvents(DirectorElytra, this); var playerManager = new PlayerManager(); getServer().getPluginManager().registerEvents(playerManager, this); diff --git a/src/main/java/net/countercraft/movecraft/combat/features/combat/CombatRelease.java b/src/main/java/net/countercraft/movecraft/combat/features/combat/CombatRelease.java index 6ffdf677..8534da82 100644 --- a/src/main/java/net/countercraft/movecraft/combat/features/combat/CombatRelease.java +++ b/src/main/java/net/countercraft/movecraft/combat/features/combat/CombatRelease.java @@ -35,7 +35,7 @@ import java.util.HashMap; import java.util.HashSet; -import static net.countercraft.movecraft.util.ChatUtils.ERROR_PREFIX; +import static net.countercraft.movecraft.util.ChatUtils.errorPrefix; public class CombatRelease extends BukkitRunnable implements Listener { public static boolean EnableCombatReleaseTracking = false; @@ -181,7 +181,7 @@ public void onCraftScuttle(@NotNull CraftScuttleEvent e) { return; e.setCancelled(true); - cause.sendMessage(ERROR_PREFIX + " You may not scuttle while in combat!"); + cause.sendMessage(errorPrefix() + " You may not scuttle while in combat!"); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) diff --git a/src/main/java/net/countercraft/movecraft/combat/features/directors/AADirectors.java b/src/main/java/net/countercraft/movecraft/combat/features/directors/AADirectors.java index 7da4c653..5e67563b 100644 --- a/src/main/java/net/countercraft/movecraft/combat/features/directors/AADirectors.java +++ b/src/main/java/net/countercraft/movecraft/combat/features/directors/AADirectors.java @@ -11,10 +11,7 @@ import net.countercraft.movecraft.craft.type.CraftType; import net.countercraft.movecraft.craft.type.property.BooleanProperty; import net.countercraft.movecraft.util.MathUtils; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.NamespacedKey; -import org.bukkit.World; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.configuration.file.FileConfiguration; @@ -28,11 +25,12 @@ import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; -import static net.countercraft.movecraft.util.ChatUtils.ERROR_PREFIX; +import static net.countercraft.movecraft.util.ChatUtils.errorPrefix; public class AADirectors extends Directors implements Listener { public static final NamespacedKey ALLOW_AA_DIRECTOR_SIGN = new NamespacedKey("movecraft-combat", "allow_aa_director_sign"); private static final String HEADER = "AA Director"; + private static boolean DisableDirectorElytra = false; public static int AADirectorDistance = 50; public static int AADirectorRange = 120; private long lastCheck = 0; @@ -48,6 +46,7 @@ public static void register() { public static void load(@NotNull FileConfiguration config) { AADirectorDistance = config.getInt("AADirectorDistance", 50); AADirectorRange = config.getInt("AADirectorRange", 120); + DisableDirectorElytra = config.getBoolean("DisableDirectorElytra", false); } @Override @@ -174,12 +173,12 @@ public void onSignClick(@NotNull PlayerInteractEvent e) { Player p = e.getPlayer(); if (foundCraft == null) { - p.sendMessage(ERROR_PREFIX + " " + I18nSupport.getInternationalisedString("Sign - Must Be Part Of Craft")); + p.sendMessage(errorPrefix() + " " + I18nSupport.getInternationalisedString("Sign - Must Be Part Of Craft")); return; } if (!foundCraft.getType().getBoolProperty(ALLOW_AA_DIRECTOR_SIGN)) { - p.sendMessage(ERROR_PREFIX + " " + I18nSupport.getInternationalisedString("AADirector - Not Allowed On Craft")); + p.sendMessage(errorPrefix() + " " + I18nSupport.getInternationalisedString("AADirector - Not Allowed On Craft")); return; } @@ -192,6 +191,17 @@ public void onSignClick(@NotNull PlayerInteractEvent e) { return; } + // check if the player has an elytra on + if (DisableDirectorElytra) { + if (p.getInventory().getChestplate() != null) { + if (p.getInventory().getChestplate().getType().equals(Material.ELYTRA)) { + p.sendMessage(I18nSupport.getInternationalisedString("AADirector - No Elytra While Directing")); + clearDirector(p); + return; + } + } + } + clearDirector(p); addDirector(foundCraft, p); p.sendMessage(I18nSupport.getInternationalisedString("AADirector - Directing")); diff --git a/src/main/java/net/countercraft/movecraft/combat/features/directors/ArrowDirectors.java b/src/main/java/net/countercraft/movecraft/combat/features/directors/ArrowDirectors.java index 5e87d539..fd241dcb 100644 --- a/src/main/java/net/countercraft/movecraft/combat/features/directors/ArrowDirectors.java +++ b/src/main/java/net/countercraft/movecraft/combat/features/directors/ArrowDirectors.java @@ -26,11 +26,12 @@ import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; -import static net.countercraft.movecraft.util.ChatUtils.ERROR_PREFIX; +import static net.countercraft.movecraft.util.ChatUtils.errorPrefix; public class ArrowDirectors extends Directors implements Listener { public static final NamespacedKey ALLOW_ARROW_DIRECTOR_SIGN = new NamespacedKey("movecraft-combat", "allow_arrow_director_sign"); private static final String HEADER = "Arrow Director"; + private static boolean DisableDirectorElytra = false; public static int ArrowDirectorDistance = 50; public static int ArrowDirectorRange = 120; private long lastCheck = 0; @@ -46,6 +47,7 @@ public static void register() { public static void load(@NotNull FileConfiguration config) { ArrowDirectorDistance = config.getInt("ArrowDirectorDistance", 50); ArrowDirectorRange = config.getInt("ArrowDirectorRange", 120); + DisableDirectorElytra = config.getBoolean("DisableDirectorElytra", false); } @Override @@ -171,12 +173,12 @@ public void onSignClick(@NotNull PlayerInteractEvent e) { Player p = e.getPlayer(); if (foundCraft == null) { - p.sendMessage(ERROR_PREFIX + " " + I18nSupport.getInternationalisedString("Sign - Must Be Part Of Craft")); + p.sendMessage(errorPrefix() + " " + I18nSupport.getInternationalisedString("Sign - Must Be Part Of Craft")); return; } if (!foundCraft.getType().getBoolProperty(ALLOW_ARROW_DIRECTOR_SIGN)) { - p.sendMessage(ERROR_PREFIX + " " + I18nSupport.getInternationalisedString("ArrowDirector - Not Allowed On Craft")); + p.sendMessage(errorPrefix() + " " + I18nSupport.getInternationalisedString("ArrowDirector - Not Allowed On Craft")); return; } @@ -189,6 +191,17 @@ public void onSignClick(@NotNull PlayerInteractEvent e) { return; } + // check if the player has an elytra on + if (DisableDirectorElytra) { + if (p.getInventory().getChestplate() != null) { + if (p.getInventory().getChestplate().getType().equals(Material.ELYTRA)) { + p.sendMessage(I18nSupport.getInternationalisedString("ArrowDirector - No Elytra While Directing")); + clearDirector(p); + return; + } + } + } + clearDirector(p); addDirector(foundCraft, p); p.sendMessage(I18nSupport.getInternationalisedString("ArrowDirector - Directing")); diff --git a/src/main/java/net/countercraft/movecraft/combat/features/directors/CannonDirectors.java b/src/main/java/net/countercraft/movecraft/combat/features/directors/CannonDirectors.java index 7f7f7058..6ca28f73 100644 --- a/src/main/java/net/countercraft/movecraft/combat/features/directors/CannonDirectors.java +++ b/src/main/java/net/countercraft/movecraft/combat/features/directors/CannonDirectors.java @@ -39,11 +39,12 @@ import java.util.List; import java.util.UUID; -import static net.countercraft.movecraft.util.ChatUtils.ERROR_PREFIX; +import static net.countercraft.movecraft.util.ChatUtils.errorPrefix; public class CannonDirectors extends Directors implements Listener { public static final NamespacedKey ALLOW_CANNON_DIRECTOR_SIGN = new NamespacedKey("movecraft-combat", "allow_cannon_director_sign"); private static final String HEADER = "Cannon Director"; + private static boolean DisableDirectorElytra = false; public static int CannonDirectorDistance = 100; public static int CannonDirectorRange = 120; private final Object2DoubleOpenHashMap tracking = new Object2DoubleOpenHashMap<>(); @@ -61,6 +62,7 @@ public static void register() { public static void load(@NotNull FileConfiguration config) { CannonDirectorDistance = config.getInt("CannonDirectorDistance", 100); CannonDirectorRange = config.getInt("CannonDirectorRange", 120); + DisableDirectorElytra = config.getBoolean("DisableDirectorElytra", false); } @Override @@ -208,12 +210,12 @@ public final void onSignClick(@NotNull PlayerInteractEvent e) { Player p = e.getPlayer(); if (foundCraft == null) { - p.sendMessage(ERROR_PREFIX + " " + I18nSupport.getInternationalisedString("Sign - Must Be Part Of Craft")); + p.sendMessage(errorPrefix() + " " + I18nSupport.getInternationalisedString("Sign - Must Be Part Of Craft")); return; } if (!foundCraft.getType().getBoolProperty(ALLOW_CANNON_DIRECTOR_SIGN)) { - p.sendMessage(ERROR_PREFIX + " " + I18nSupport.getInternationalisedString("CannonDirector - Not Allowed On Craft")); + p.sendMessage(errorPrefix() + " " + I18nSupport.getInternationalisedString("CannonDirector - Not Allowed On Craft")); return; } @@ -226,6 +228,17 @@ public final void onSignClick(@NotNull PlayerInteractEvent e) { return; } + // check if the player has an elytra on + if (DisableDirectorElytra) { + if (p.getInventory().getChestplate() != null) { + if (p.getInventory().getChestplate().getType().equals(Material.ELYTRA)) { + p.sendMessage(I18nSupport.getInternationalisedString("CannonDirector - No Elytra While Directing")); + clearDirector(p); + return; + } + } + } + clearDirector(p); addDirector(foundCraft, p); p.sendMessage(I18nSupport.getInternationalisedString("CannonDirector - Directing")); diff --git a/src/main/java/net/countercraft/movecraft/combat/features/directors/DirectorElytraListener.java b/src/main/java/net/countercraft/movecraft/combat/features/directors/DirectorElytraListener.java new file mode 100644 index 00000000..f7161f29 --- /dev/null +++ b/src/main/java/net/countercraft/movecraft/combat/features/directors/DirectorElytraListener.java @@ -0,0 +1,37 @@ +package net.countercraft.movecraft.combat.features.directors; + +import com.destroystokyo.paper.event.player.PlayerArmorChangeEvent; +import net.countercraft.movecraft.combat.localisation.I18nSupport; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; + +/** + * Determines when a player swaps an elytra on themselves + */ +public class DirectorElytraListener extends Directors implements Listener { + private static boolean DisableDirectorElytra = false; + + public static void load(@NotNull FileConfiguration config) { + DisableDirectorElytra = config.getBoolean("DisableDirectorElytra", false); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void ElytraEquipEvent(@NotNull PlayerArmorChangeEvent e) { + Player p = e.getPlayer(); + + if (!DisableDirectorElytra) + return; + + // If the player equips an elytra, remove their directors + if (e.getNewItem().getType().equals(Material.ELYTRA)) { + clearDirector(p); + p.sendMessage(I18nSupport.getInternationalisedString("Director - No Elytra While Directing")); + } + } + +} \ No newline at end of file diff --git a/src/main/java/net/countercraft/movecraft/combat/features/tracers/commands/MovementTracerSettingCommand.java b/src/main/java/net/countercraft/movecraft/combat/features/tracers/commands/MovementTracerSettingCommand.java index bda10dd5..338ada16 100644 --- a/src/main/java/net/countercraft/movecraft/combat/features/tracers/commands/MovementTracerSettingCommand.java +++ b/src/main/java/net/countercraft/movecraft/combat/features/tracers/commands/MovementTracerSettingCommand.java @@ -11,7 +11,7 @@ import java.util.ArrayList; import java.util.List; -import static net.countercraft.movecraft.util.ChatUtils.MOVECRAFT_COMMAND_PREFIX; +import static net.countercraft.movecraft.util.ChatUtils.commandPrefix; public class MovementTracerSettingCommand implements TabExecutor { @NotNull @@ -29,28 +29,28 @@ public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command return false; if(!(commandSender instanceof Player)) { - commandSender.sendMessage(MOVECRAFT_COMMAND_PREFIX + I18nSupport.getInternationalisedString("Command - Must Be Player")); + commandSender.sendMessage(commandPrefix() + I18nSupport.getInternationalisedString("Command - Must Be Player")); return true; } Player player = (Player) commandSender; if(args.length == 0) { - commandSender.sendMessage(MOVECRAFT_COMMAND_PREFIX + I18nSupport.getInternationalisedString("Command - Current Setting") + ": " + manager.getMovementSetting(player)); + commandSender.sendMessage(commandPrefix() + I18nSupport.getInternationalisedString("Command - Current Setting") + ": " + manager.getMovementSetting(player)); return true; } if (args.length != 1) { - commandSender.sendMessage(MOVECRAFT_COMMAND_PREFIX + I18nSupport.getInternationalisedString("Command - Specify Setting")); + commandSender.sendMessage(commandPrefix() + I18nSupport.getInternationalisedString("Command - Specify Setting")); return true; } String setting = args[0].toUpperCase(); try { manager.setMovementSetting(player, setting); - commandSender.sendMessage(MOVECRAFT_COMMAND_PREFIX + I18nSupport.getInternationalisedString("Command - Movement Tracer Set") + ": " + setting); + commandSender.sendMessage(commandPrefix() + I18nSupport.getInternationalisedString("Command - Movement Tracer Set") + ": " + setting); return true; } catch (IllegalArgumentException e) { - commandSender.sendMessage(MOVECRAFT_COMMAND_PREFIX + I18nSupport.getInternationalisedString("Command - Specify Valid Setting")); + commandSender.sendMessage(commandPrefix() + I18nSupport.getInternationalisedString("Command - Specify Valid Setting")); return true; } } diff --git a/src/main/java/net/countercraft/movecraft/combat/features/tracers/commands/TNTTracerModeCommand.java b/src/main/java/net/countercraft/movecraft/combat/features/tracers/commands/TNTTracerModeCommand.java index 332c8881..a5f7457a 100644 --- a/src/main/java/net/countercraft/movecraft/combat/features/tracers/commands/TNTTracerModeCommand.java +++ b/src/main/java/net/countercraft/movecraft/combat/features/tracers/commands/TNTTracerModeCommand.java @@ -11,7 +11,7 @@ import java.util.ArrayList; import java.util.List; -import static net.countercraft.movecraft.util.ChatUtils.MOVECRAFT_COMMAND_PREFIX; +import static net.countercraft.movecraft.util.ChatUtils.commandPrefix; public class TNTTracerModeCommand implements TabExecutor { @NotNull @@ -29,28 +29,28 @@ public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command return false; if (!(commandSender instanceof Player)) { - commandSender.sendMessage(MOVECRAFT_COMMAND_PREFIX + I18nSupport.getInternationalisedString("Command - Must Be Player")); + commandSender.sendMessage(commandPrefix() + I18nSupport.getInternationalisedString("Command - Must Be Player")); return true; } Player player = (Player) commandSender; if (args.length == 0) { - commandSender.sendMessage(MOVECRAFT_COMMAND_PREFIX + I18nSupport.getInternationalisedString("Command - Current Mode") + ": " + manager.getTNTMode(player)); + commandSender.sendMessage(commandPrefix() + I18nSupport.getInternationalisedString("Command - Current Mode") + ": " + manager.getTNTMode(player)); return true; } if (args.length != 1) { - commandSender.sendMessage(MOVECRAFT_COMMAND_PREFIX + I18nSupport.getInternationalisedString("Command - Specify Mode")); + commandSender.sendMessage(commandPrefix() + I18nSupport.getInternationalisedString("Command - Specify Mode")); return true; } String mode = args[0].toUpperCase(); try { manager.setTNTMode(player, mode); - commandSender.sendMessage(MOVECRAFT_COMMAND_PREFIX + I18nSupport.getInternationalisedString("Command - Tracer Set") + ": " + mode); + commandSender.sendMessage(commandPrefix() + I18nSupport.getInternationalisedString("Command - Tracer Set") + ": " + mode); return true; } catch (IllegalArgumentException e) { - commandSender.sendMessage(MOVECRAFT_COMMAND_PREFIX + I18nSupport.getInternationalisedString("Command - Specify Valid Mode")); + commandSender.sendMessage(commandPrefix() + I18nSupport.getInternationalisedString("Command - Specify Valid Mode")); return true; } } diff --git a/src/main/java/net/countercraft/movecraft/combat/features/tracers/commands/TNTTracerSettingCommand.java b/src/main/java/net/countercraft/movecraft/combat/features/tracers/commands/TNTTracerSettingCommand.java index fba499d6..8e62708b 100644 --- a/src/main/java/net/countercraft/movecraft/combat/features/tracers/commands/TNTTracerSettingCommand.java +++ b/src/main/java/net/countercraft/movecraft/combat/features/tracers/commands/TNTTracerSettingCommand.java @@ -11,7 +11,7 @@ import java.util.ArrayList; import java.util.List; -import static net.countercraft.movecraft.util.ChatUtils.MOVECRAFT_COMMAND_PREFIX; +import static net.countercraft.movecraft.util.ChatUtils.commandPrefix; public class TNTTracerSettingCommand implements TabExecutor { @NotNull @@ -29,28 +29,28 @@ public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command return false; if (!(commandSender instanceof Player)) { - commandSender.sendMessage(MOVECRAFT_COMMAND_PREFIX + I18nSupport.getInternationalisedString("Command - Must Be Player")); + commandSender.sendMessage(commandPrefix() + I18nSupport.getInternationalisedString("Command - Must Be Player")); return true; } Player player = (Player) commandSender; if (args.length == 0) { - commandSender.sendMessage(MOVECRAFT_COMMAND_PREFIX + I18nSupport.getInternationalisedString("Command - Current Setting") + ": " + manager.getTNTSetting(player)); + commandSender.sendMessage(commandPrefix() + I18nSupport.getInternationalisedString("Command - Current Setting") + ": " + manager.getTNTSetting(player)); return true; } if (args.length != 1) { - commandSender.sendMessage(MOVECRAFT_COMMAND_PREFIX + I18nSupport.getInternationalisedString("Command - Specify Setting")); + commandSender.sendMessage(commandPrefix() + I18nSupport.getInternationalisedString("Command - Specify Setting")); return true; } String setting = args[0].toUpperCase(); try { manager.setTNTSetting(player, setting); - commandSender.sendMessage(MOVECRAFT_COMMAND_PREFIX + I18nSupport.getInternationalisedString("Command - Tracer Set") + ": " + setting); + commandSender.sendMessage(commandPrefix() + I18nSupport.getInternationalisedString("Command - Tracer Set") + ": " + setting); return true; } catch (IllegalArgumentException e) { - commandSender.sendMessage(MOVECRAFT_COMMAND_PREFIX + I18nSupport.getInternationalisedString("Command - Specify Valid Setting")); + commandSender.sendMessage(commandPrefix() + I18nSupport.getInternationalisedString("Command - Specify Valid Setting")); return true; } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 635ee87b..ec5bc283 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -13,6 +13,7 @@ CannonDirectorRange: 120 # Max range at which it will direct to a block vs in th # Directors DirectorTool: STICK # Material name for director control. +DisableDirectorElytra: false # Disables the ability for players with elytras equipped to use directors TransparentBlocks: # List of MATERIAL_NAMES which are ignored for directing. See https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Material.html for a full list. - "#glass" - IRON_BARS diff --git a/src/main/resources/localisation/mcclang_en.properties b/src/main/resources/localisation/mcclang_en.properties index 000b56ac..599d34d5 100644 --- a/src/main/resources/localisation/mcclang_en.properties +++ b/src/main/resources/localisation/mcclang_en.properties @@ -1,14 +1,17 @@ AADirector\ -\ Directing=You are now directing the AA of this craft AADirector\ -\ No\ Longer\ Directing=You are no longer directing the AA of this craft AADirector\ -\ Not\ Allowed\ On\ Craft=AA Director signs are not allowed on this type of craft +AADirector\ -\ No\ Elytra\ While\ Directing=You cannot direct while wearing an elytra ArrowDirector\ -\ Directing=You are now directing the Arrows of this craft ArrowDirector\ -\ No\ Longer\ Directing=You are no longer directing the Arrows of this craft ArrowDirector\ -\ Not\ Allowed\ On\ Craft=Arrow Director signs are not allowed on this type of craft +ArrowDirector\ -\ No\ Elytra\ While\ Directing=You cannot direct while wearing an elytra Combat\ Release=Combat Release\! Combat\ Release\ Message=Combat releasing is not allowed\! CannonDirector\ -\ Directing=You are now directing the cannons of this craft CannonDirector\ -\ No\ Longer\ Directing=You are no longer directing the cannons of this craft CannonDirector\ -\ Not\ Allowed\ On\ Craft=Cannon Director signs are not allowed on this type of craft +CannonDirector\ -\ No\ Elytra\ While\ Directing=You cannot direct while wearing an elytra Command\ -\ Must\ Be\ Player=You must be a player to use that command. Command\ -\ Current\ Mode=Current mode Command\ -\ Current\ Setting=Current setting @@ -18,6 +21,7 @@ Command\ -\ Specify\ Setting=You must specify a setting. Command\ -\ Specify\ Valid\ Setting=You must specify a valid setting. Command\ -\ Tracer\ Set=TNT Tracers now set to Command\ -\ Movement\ Tracer\ Set=Movement Tracers now set to +Director\ -\ No\ Elytra\ While\ Directing=You Are Not Allowed To Direct While Wearing An Elytra Killfeed\ -\ Sunk\ By=was sunk by Killfeed\ -\ With\ Assists=with assists from Log\ -\ Enter\ Combat= has entered combat.