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.