diff --git a/pom.xml b/pom.xml index 4a061c4..b02998d 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - nl.pim16aap2.armoredElytra + net.knarcraft.armoredElytra ArmoredElytra 3.0 @@ -17,10 +17,10 @@ 3.0.0-M5 1.17.1-R0.1-SNAPSHOT - 2.2.1 - 9.1 + 3.0.1 + 10.8.1 4.0.0 - 5.8.1 + 5.9.2 @@ -84,6 +84,12 @@ ${version.mockito} test + + org.jetbrains + annotations + 20.1.0 + compile + diff --git a/src/main/java/nl/pim16aap2/armoredElytra/ArmoredElytra.java b/src/main/java/net/knarcraft/armoredelytra/ArmoredElytra.java similarity index 83% rename from src/main/java/nl/pim16aap2/armoredElytra/ArmoredElytra.java rename to src/main/java/net/knarcraft/armoredelytra/ArmoredElytra.java index 7ed8033..989a57a 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/ArmoredElytra.java +++ b/src/main/java/net/knarcraft/armoredelytra/ArmoredElytra.java @@ -1,22 +1,22 @@ -package nl.pim16aap2.armoredElytra; +package net.knarcraft.armoredelytra; -import nl.pim16aap2.armoredElytra.handlers.AnvilHandler; -import nl.pim16aap2.armoredElytra.handlers.CommandHandler; -import nl.pim16aap2.armoredElytra.handlers.EventHandlers; -import nl.pim16aap2.armoredElytra.handlers.FlyDurabilityHandler; -import nl.pim16aap2.armoredElytra.handlers.ItemDropListener; -import nl.pim16aap2.armoredElytra.handlers.NetheriteUpgradeListener; -import nl.pim16aap2.armoredElytra.handlers.SmithingTableCraftHandler; -import nl.pim16aap2.armoredElytra.handlers.Uninstaller; -import nl.pim16aap2.armoredElytra.nbtEditor.DurabilityManager; -import nl.pim16aap2.armoredElytra.nbtEditor.NBTEditor; -import nl.pim16aap2.armoredElytra.util.ArmorTier; -import nl.pim16aap2.armoredElytra.util.ArmorTierName; -import nl.pim16aap2.armoredElytra.util.ConfigLoader; -import nl.pim16aap2.armoredElytra.util.MinecraftVersion; -import nl.pim16aap2.armoredElytra.util.UpdateManager; -import nl.pim16aap2.armoredElytra.util.messages.Message; -import nl.pim16aap2.armoredElytra.util.messages.Messages; +import net.knarcraft.armoredelytra.command.ArmoredElytraCommand; +import net.knarcraft.armoredelytra.config.ConfigLoader; +import net.knarcraft.armoredelytra.config.message.Message; +import net.knarcraft.armoredelytra.config.message.Messages; +import net.knarcraft.armoredelytra.container.ArmorTierName; +import net.knarcraft.armoredelytra.listener.AnvilListener; +import net.knarcraft.armoredelytra.listener.FlyDurabilityListener; +import net.knarcraft.armoredelytra.listener.ItemDropListener; +import net.knarcraft.armoredelytra.listener.NetheriteUpgradeListener; +import net.knarcraft.armoredelytra.listener.PlayerEventListener; +import net.knarcraft.armoredelytra.listener.SmithingTableCraftHandler; +import net.knarcraft.armoredelytra.listener.Uninstaller; +import net.knarcraft.armoredelytra.metadata.DurabilityManager; +import net.knarcraft.armoredelytra.metadata.NBTEditor; +import net.knarcraft.armoredelytra.property.ArmorTier; +import net.knarcraft.armoredelytra.property.MinecraftVersion; +import net.knarcraft.armoredelytra.update.UpdateManager; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -35,8 +35,8 @@ import java.util.Objects; import java.util.logging.Level; public class ArmoredElytra extends JavaPlugin implements Listener { - private static final MinecraftVersion minecraftVersion = MinecraftVersion - .get(Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]); + private static final MinecraftVersion minecraftVersion = MinecraftVersion.get( + Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]); private static ArmoredElytra INSTANCE; private Messages messages; @@ -81,18 +81,18 @@ public class ArmoredElytra extends JavaPlugin implements Listener { "seeing higher user numbers helps me stay motivated!"); } - Bukkit.getPluginManager().registerEvents(new EventHandlers(this, nbtEditor, durabilityManager), this); + Bukkit.getPluginManager().registerEvents(new PlayerEventListener(this, nbtEditor, durabilityManager), this); Objects.requireNonNull(getCommand("ArmoredElytra"), "ArmoredElytra base command not found!") - .setExecutor(new CommandHandler(this, nbtEditor, durabilityManager)); + .setExecutor(new ArmoredElytraCommand(this, nbtEditor, durabilityManager)); // Load the plugin normally if not in uninstall mode. if (!config.uninstallMode()) { - Bukkit.getPluginManager().registerEvents(new FlyDurabilityHandler(config.noFlightDurability(), + Bukkit.getPluginManager().registerEvents(new FlyDurabilityListener(config.noFlightDurability(), nbtEditor, durabilityManager), this); final Listener creationListener = config.craftingInSmithingTable() ? new SmithingTableCraftHandler(this, nbtEditor, durabilityManager, config) : - new AnvilHandler(this, nbtEditor, durabilityManager, config); + new AnvilListener(this, true, nbtEditor, durabilityManager, config); Bukkit.getPluginManager().registerEvents(creationListener, this); if (config.allowUpgradeToNetherite()) { @@ -114,10 +114,6 @@ public class ArmoredElytra extends JavaPlugin implements Listener { } } - public MinecraftVersion getMinecraftVersion() { - return minecraftVersion; - } - public Messages getMyMessages() { return messages; } @@ -178,7 +174,7 @@ public class ArmoredElytra extends JavaPlugin implements Listener { // Send the usageDeniedMessage message to the player. public void usageDeniedMessage(HumanEntity player, ArmorTier armorTier) { - final String message = getMessageWithTierNames(Message.MESSAGES_USAGEDENIED, armorTier); + final String message = getMessageWithTierNames(Message.MESSAGES_USAGE_DENIED, armorTier); if (!message.equals("NONE")) { messagePlayer(player, ChatColor.RED, message); } @@ -186,14 +182,14 @@ public class ArmoredElytra extends JavaPlugin implements Listener { // Send the elytraReceivedMessage message to the player. public void elytraReceivedMessage(HumanEntity player, ArmorTier armorTier) { - final String message = getMessageWithTierNames(Message.MESSAGES_ELYTRARECEIVED, armorTier); + final String message = getMessageWithTierNames(Message.MESSAGES_ELYTRA_RECEIVED, armorTier); if (!message.equals("NONE")) { messagePlayer(player, ChatColor.GREEN, message); } } public void sendNoGivePermissionMessage(HumanEntity player, ArmorTier armorTier) { - final String message = getMessageWithTierNames(Message.MESSAGES_NOGIVEPERMISSION, armorTier); + final String message = getMessageWithTierNames(Message.MESSAGES_NO_GIVE_PERMISSION, armorTier); messagePlayer(player, ChatColor.RED, message); } diff --git a/src/main/java/nl/pim16aap2/armoredElytra/handlers/CommandHandler.java b/src/main/java/net/knarcraft/armoredelytra/command/ArmoredElytraCommand.java similarity index 84% rename from src/main/java/nl/pim16aap2/armoredElytra/handlers/CommandHandler.java rename to src/main/java/net/knarcraft/armoredelytra/command/ArmoredElytraCommand.java index f2e5706..1a951c3 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/handlers/CommandHandler.java +++ b/src/main/java/net/knarcraft/armoredelytra/command/ArmoredElytraCommand.java @@ -1,11 +1,11 @@ -package nl.pim16aap2.armoredElytra.handlers; +package net.knarcraft.armoredelytra.command; -import nl.pim16aap2.armoredElytra.ArmoredElytra; -import nl.pim16aap2.armoredElytra.nbtEditor.ArmoredElytraBuilder.ArmoredElytraBuilder; -import nl.pim16aap2.armoredElytra.nbtEditor.DurabilityManager; -import nl.pim16aap2.armoredElytra.nbtEditor.NBTEditor; -import nl.pim16aap2.armoredElytra.util.ArmorTier; -import nl.pim16aap2.armoredElytra.util.messages.Message; +import net.knarcraft.armoredelytra.ArmoredElytra; +import net.knarcraft.armoredelytra.config.message.Message; +import net.knarcraft.armoredelytra.metadata.DurabilityManager; +import net.knarcraft.armoredelytra.metadata.NBTEditor; +import net.knarcraft.armoredelytra.metadata.builder.ArmoredElytraBuilder; +import net.knarcraft.armoredelytra.property.ArmorTier; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.NamespacedKey; @@ -14,40 +14,39 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; import java.util.Map; import java.util.logging.Level; -public class CommandHandler implements CommandExecutor { +public class ArmoredElytraCommand implements CommandExecutor { private final ArmoredElytra plugin; private static Field BY_KEY_FIELD; private final ArmoredElytraBuilder armoredElytraBuilder; - public CommandHandler(ArmoredElytra plugin, NBTEditor nbtEditor, DurabilityManager durabilityManager) { + public ArmoredElytraCommand(ArmoredElytra plugin, NBTEditor nbtEditor, DurabilityManager durabilityManager) { this.plugin = plugin; armoredElytraBuilder = new ArmoredElytraBuilder(nbtEditor, durabilityManager, plugin.getConfigLoader(), plugin); } @Override - public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, String[] args) { Player player; if (sender instanceof Player) { player = (Player) sender; if (plugin.getConfigLoader().uninstallMode()) { - plugin.messagePlayer(player, plugin.getMyMessages().getString(Message.MESSAGES_UNINSTALLMODE)); + plugin.messagePlayer(player, plugin.getMyMessages().getString(Message.MESSAGES_UNINSTALL_MODE)); return true; } if (cmd.getName().equalsIgnoreCase("ArmoredElytra")) { if (args.length == 1 || args.length == 2) { - ItemStack newElytra = null; - String tier = null; + String tier; Player receiver; - boolean allowed = false; + boolean allowed; if (args.length == 1) { receiver = player; @@ -66,7 +65,7 @@ public class CommandHandler implements CommandExecutor { allowed = player.hasPermission("armoredelytra.give." + ArmorTier.getName(armorTier)); } else { plugin.messagePlayer(player, plugin.getMyMessages() - .getString(Message.MESSAGES_UNSUPPORTEDTIER)); + .getString(Message.MESSAGES_UNSUPPORTED_TIER)); return false; } diff --git a/src/main/java/nl/pim16aap2/armoredElytra/util/ConfigLoader.java b/src/main/java/net/knarcraft/armoredelytra/config/ConfigLoader.java similarity index 97% rename from src/main/java/nl/pim16aap2/armoredElytra/util/ConfigLoader.java rename to src/main/java/net/knarcraft/armoredelytra/config/ConfigLoader.java index 79ad5a9..b518d63 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/util/ConfigLoader.java +++ b/src/main/java/net/knarcraft/armoredelytra/config/ConfigLoader.java @@ -1,6 +1,8 @@ -package nl.pim16aap2.armoredElytra.util; +package net.knarcraft.armoredelytra.config; -import nl.pim16aap2.armoredElytra.ArmoredElytra; +import net.knarcraft.armoredelytra.ArmoredElytra; +import net.knarcraft.armoredelytra.property.ArmorTier; +import net.knarcraft.armoredelytra.util.GenericUtil; import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; import org.bukkit.configuration.file.FileConfiguration; @@ -96,7 +98,7 @@ public class ConfigLoader { "Just add their 'NamespacedKey'. Ask the enchantment plugin dev for more info if you need it." }; String[] dropNetheriteAsChestplateComment = { - "Whether to drop Netherite Armored Elytras as netherite chestplates when they are dropped", + "Whether to drop Netherite Armored Elytras as netherite chest-plates when they are dropped", "This means that they won't burn in lava etc.", "When you pick them up, they will turn into Netherite Armored Elytras again." }; @@ -172,7 +174,7 @@ public class ConfigLoader { // Only the first one should have the comment. final @Nullable String[] comment = armorTierId == 1 ? repairComment : null; - final String name = Util.snakeToCamelCase(ArmorTier.getRepairItem(armorTier).name()); + final String name = GenericUtil.snakeToCamelCase(ArmorTier.getRepairItem(armorTier).name()); final int defaultRepairCount = ArmorTier.getDefaultRepairCount(armorTier); repairCounts[armorTierId] = addNewConfigOption(config, name, defaultRepairCount, comment); diff --git a/src/main/java/nl/pim16aap2/armoredElytra/util/ConfigOption.java b/src/main/java/net/knarcraft/armoredelytra/config/ConfigOption.java similarity index 89% rename from src/main/java/nl/pim16aap2/armoredElytra/util/ConfigOption.java rename to src/main/java/net/knarcraft/armoredelytra/config/ConfigOption.java index ea29efe..a08c035 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/util/ConfigOption.java +++ b/src/main/java/net/knarcraft/armoredelytra/config/ConfigOption.java @@ -1,6 +1,7 @@ -package nl.pim16aap2.armoredElytra.util; +package net.knarcraft.armoredelytra.config; -import nl.pim16aap2.armoredElytra.ArmoredElytra; +import net.knarcraft.armoredelytra.ArmoredElytra; +import net.knarcraft.armoredelytra.util.GenericUtil; import org.bukkit.configuration.file.FileConfiguration; import javax.annotation.Nullable; @@ -37,7 +38,7 @@ public class ConfigOption { } catch (Exception e) { plugin.myLogger(java.util.logging.Level.WARNING, "Failed to read config value of: \"" + optionName + "\"! Using default value instead!"); - plugin.myLogger(java.util.logging.Level.WARNING, Util.exceptionToString(e)); + plugin.myLogger(java.util.logging.Level.WARNING, GenericUtil.exceptionToString(e)); value = defaultValue; } } @@ -67,7 +68,7 @@ public class ConfigOption { string.append(optionName).append(": "); if (value.getClass().isAssignableFrom(String.class)) { - string.append("\'").append(value).append("\'"); + string.append("'").append(value).append("'"); } else if (value instanceof List) { StringBuilder builder = new StringBuilder(); builder.append("\n"); diff --git a/src/main/java/nl/pim16aap2/armoredElytra/util/messages/Message.java b/src/main/java/net/knarcraft/armoredelytra/config/message/Message.java similarity index 80% rename from src/main/java/nl/pim16aap2/armoredElytra/util/messages/Message.java rename to src/main/java/net/knarcraft/armoredelytra/config/message/Message.java index b8e666b..038f3ea 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/util/messages/Message.java +++ b/src/main/java/net/knarcraft/armoredelytra/config/message/Message.java @@ -1,11 +1,12 @@ -package nl.pim16aap2.armoredElytra.util.messages; +package net.knarcraft.armoredelytra.config.message; /** - * Represents a localizable message. + * Represents a message able to be localized. * * @author Pim */ public enum Message implements MessageVariable { + EMPTY(), TIER_LEATHER(), @@ -22,14 +23,14 @@ public enum Message implements MessageVariable { TIER_SHORT_DIAMOND(), TIER_SHORT_NETHERITE(), - MESSAGES_UNINSTALLMODE(), - MESSAGES_UNSUPPORTEDTIER(), + MESSAGES_UNINSTALL_MODE(), + MESSAGES_UNSUPPORTED_TIER(), - MESSAGES_REPAIRNEEDED(), + MESSAGES_REPAIR_NEEDED(), MESSAGES_LORE(VARIABLE_TIER_NAME, VARIABLE_TIER_NAME_SHORT), - MESSAGES_NOGIVEPERMISSION(VARIABLE_TIER_NAME, VARIABLE_TIER_NAME_SHORT), - MESSAGES_USAGEDENIED(VARIABLE_TIER_NAME, VARIABLE_TIER_NAME_SHORT), - MESSAGES_ELYTRARECEIVED(VARIABLE_TIER_NAME, VARIABLE_TIER_NAME_SHORT), + MESSAGES_NO_GIVE_PERMISSION(VARIABLE_TIER_NAME, VARIABLE_TIER_NAME_SHORT), + MESSAGES_USAGE_DENIED(VARIABLE_TIER_NAME, VARIABLE_TIER_NAME_SHORT), + MESSAGES_ELYTRA_RECEIVED(VARIABLE_TIER_NAME, VARIABLE_TIER_NAME_SHORT), ; @@ -61,7 +62,7 @@ public enum Message implements MessageVariable { } /** - * Gets the names of the variables for the given message.. + * Gets the names of the variables for the given message. * * @param msg The message for which to retrieve the variable names. * @return The names of the variables of this message. @@ -79,4 +80,5 @@ public enum Message implements MessageVariable { public static int getVariableCount(final Message msg) { return msg.variableNames.length; } + } diff --git a/src/main/java/nl/pim16aap2/armoredElytra/util/messages/MessageVariable.java b/src/main/java/net/knarcraft/armoredelytra/config/message/MessageVariable.java similarity index 60% rename from src/main/java/nl/pim16aap2/armoredElytra/util/messages/MessageVariable.java rename to src/main/java/net/knarcraft/armoredelytra/config/message/MessageVariable.java index fb0a7f8..0975083 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/util/messages/MessageVariable.java +++ b/src/main/java/net/knarcraft/armoredelytra/config/message/MessageVariable.java @@ -1,7 +1,7 @@ -package nl.pim16aap2.armoredElytra.util.messages; +package net.knarcraft.armoredelytra.config.message; /** - * Represents supported variables in localizable messages. + * Represents supported variables in localize-able messages. * * @author Pim */ diff --git a/src/main/java/nl/pim16aap2/armoredElytra/util/messages/Messages.java b/src/main/java/net/knarcraft/armoredelytra/config/message/Messages.java similarity index 97% rename from src/main/java/nl/pim16aap2/armoredElytra/util/messages/Messages.java rename to src/main/java/net/knarcraft/armoredelytra/config/message/Messages.java index e234979..73fbe4e 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/util/messages/Messages.java +++ b/src/main/java/net/knarcraft/armoredelytra/config/message/Messages.java @@ -1,6 +1,6 @@ -package nl.pim16aap2.armoredElytra.util.messages; +package net.knarcraft.armoredelytra.config.message; -import nl.pim16aap2.armoredElytra.ArmoredElytra; +import net.knarcraft.armoredelytra.ArmoredElytra; import java.io.BufferedReader; import java.io.FileNotFoundException; @@ -24,6 +24,7 @@ import java.util.logging.Level; import java.util.regex.Pattern; public class Messages { + private static final String DEFAULT_FILENAME = "en_US.txt"; /** @@ -65,10 +66,9 @@ public class Messages { * * @param br The {@link BufferedReader} that supplies the text. * @param action The action to take for every message and value combination that is encountered. - * @throws IOException + * @throws IOException

If a problem occurs during the processing of the file

*/ - private void processFile(final BufferedReader br, final BiConsumer action) - throws IOException { + private void processFile(final BufferedReader br, final BiConsumer action) throws IOException { String sCurrentLine; while ((sCurrentLine = br.readLine()) != null) { @@ -225,4 +225,5 @@ public class Messages { } return files; } + } diff --git a/src/main/java/nl/pim16aap2/armoredElytra/util/ArmorTierName.java b/src/main/java/net/knarcraft/armoredelytra/container/ArmorTierName.java similarity index 92% rename from src/main/java/nl/pim16aap2/armoredElytra/util/ArmorTierName.java rename to src/main/java/net/knarcraft/armoredelytra/container/ArmorTierName.java index 1c41439..13ad84a 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/util/ArmorTierName.java +++ b/src/main/java/net/knarcraft/armoredelytra/container/ArmorTierName.java @@ -1,9 +1,10 @@ -package nl.pim16aap2.armoredElytra.util; +package net.knarcraft.armoredelytra.container; /** * @author Pim */ public class ArmorTierName { + private String longName, shortName; public ArmorTierName(final String longName, final String shortName) { @@ -26,4 +27,5 @@ public class ArmorTierName { public void setShortName(final String shortName) { this.shortName = shortName; } + } diff --git a/src/main/java/nl/pim16aap2/armoredElytra/util/EnchantmentContainer.java b/src/main/java/net/knarcraft/armoredelytra/container/EnchantmentContainer.java similarity index 96% rename from src/main/java/nl/pim16aap2/armoredElytra/util/EnchantmentContainer.java rename to src/main/java/net/knarcraft/armoredelytra/container/EnchantmentContainer.java index 7864034..a83a21b 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/util/EnchantmentContainer.java +++ b/src/main/java/net/knarcraft/armoredelytra/container/EnchantmentContainer.java @@ -1,6 +1,7 @@ -package nl.pim16aap2.armoredElytra.util; +package net.knarcraft.armoredelytra.container; -import nl.pim16aap2.armoredElytra.ArmoredElytra; +import net.knarcraft.armoredelytra.ArmoredElytra; +import net.knarcraft.armoredelytra.config.ConfigLoader; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; @@ -151,9 +152,9 @@ public class EnchantmentContainer implements Iterable blackList = second.keySet().stream() - .flatMap(ench -> getMutuallyExclusiveEnchantments(ench).stream()) + .flatMap(enchantment -> getMutuallyExclusiveEnchantments(enchantment).stream()) .toList(); blackList.forEach(first.keySet()::remove); diff --git a/src/main/java/nl/pim16aap2/armoredElytra/lib/armorequip/ArmorEquipEvent.java b/src/main/java/net/knarcraft/armoredelytra/event/ArmorEquipEvent.java similarity index 61% rename from src/main/java/nl/pim16aap2/armoredElytra/lib/armorequip/ArmorEquipEvent.java rename to src/main/java/net/knarcraft/armoredelytra/event/ArmorEquipEvent.java index 0a3da5b..c9937de 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/lib/armorequip/ArmorEquipEvent.java +++ b/src/main/java/net/knarcraft/armoredelytra/event/ArmorEquipEvent.java @@ -1,20 +1,24 @@ -package nl.pim16aap2.armoredElytra.lib.armorequip; +package net.knarcraft.armoredelytra.event; +import net.knarcraft.armoredelytra.property.ArmorChangeMethod; +import net.knarcraft.armoredelytra.property.ArmorType; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.HandlerList; import org.bukkit.event.player.PlayerEvent; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; /** * @author Arnah * @since Jul 30, 2015 */ public final class ArmorEquipEvent extends PlayerEvent implements Cancellable { + private static final HandlerList handlers = new HandlerList(); private boolean cancel = false; - private final EquipMethod equipType; + private final ArmorChangeMethod equipType; private final ArmorType type; private ItemStack oldArmorPiece, newArmorPiece; @@ -26,7 +30,7 @@ public final class ArmorEquipEvent extends PlayerEvent implements Cancellable { * @param oldArmorPiece The ItemStack of the armor removed. * @param newArmorPiece The ItemStack of the armor added. */ - public ArmorEquipEvent(final Player player, final EquipMethod equipType, final ArmorType type, + public ArmorEquipEvent(final Player player, final ArmorChangeMethod equipType, final ArmorType type, final ItemStack oldArmorPiece, final ItemStack newArmorPiece) { super(player); this.equipType = equipType; @@ -40,6 +44,7 @@ public final class ArmorEquipEvent extends PlayerEvent implements Cancellable { * * @return A list of handlers handling this event. */ + @SuppressWarnings("unused") public static HandlerList getHandlerList() { return handlers; } @@ -50,7 +55,7 @@ public final class ArmorEquipEvent extends PlayerEvent implements Cancellable { * @return A list of handlers handling this event. */ @Override - public HandlerList getHandlers() { + public @NotNull HandlerList getHandlers() { return handlers; } @@ -79,67 +84,36 @@ public final class ArmorEquipEvent extends PlayerEvent implements Cancellable { } /** - * Returns the last equipped armor piece, could be a piece of armor, {@link Material#Air}, or null. + * Gets the previous (current) item in the armor slot. + * + * @return

The previously equipped armor piece, could be a piece of armor, {@link Material#AIR}, or null.

*/ public ItemStack getOldArmorPiece() { return oldArmorPiece; } + public void setOldArmorPiece(final ItemStack oldArmorPiece) { this.oldArmorPiece = oldArmorPiece; } /** - * Returns the newly equipped armor, could be a piece of armor, {@link Material#Air}, or null. + * Returns the newly equipped armor, could be a piece of armor, {@link Material#AIR}, or null. */ public ItemStack getNewArmorPiece() { return newArmorPiece; } + public void setNewArmorPiece(final ItemStack newArmorPiece) { this.newArmorPiece = newArmorPiece; } /** - * Gets the method used to either equip or unequip an armor piece. + * Gets the method used to either equip or un-equip an armor piece. */ - public EquipMethod getMethod() { + public ArmorChangeMethod getMethod() { return equipType; } - public enum EquipMethod { - /** - * When you shift click an armor piece to equip or unequip - */ - SHIFT_CLICK, - /** - * When you drag and drop the item to equip or unequip - */ - DRAG, - /** - * When you manually equip or unequip the item. Use to be DRAG - */ - PICK_DROP, - /** - * When you right click an armor piece in the hotbar without the inventory open to equip. - */ - HOTBAR, - /** - * When you press the hotbar slot number while hovering over the armor slot to equip or unequip - */ - HOTBAR_SWAP, - /** - * When in range of a dispenser that shoots an armor piece to equip.
Requires the spigot version to have - * {@link org.bukkit.event.block.BlockDispenseArmorEvent} implemented. - */ - DISPENSER, - /** - * When an armor piece is removed due to it losing all durability. - */ - BROKE, - /** - * When you die causing all armor to unequip - */ - DEATH, - } } diff --git a/src/main/java/nl/pim16aap2/armoredElytra/handlers/AnvilHandler.java b/src/main/java/net/knarcraft/armoredelytra/listener/AnvilListener.java similarity index 90% rename from src/main/java/nl/pim16aap2/armoredElytra/handlers/AnvilHandler.java rename to src/main/java/net/knarcraft/armoredelytra/listener/AnvilListener.java index daf9180..880faa5 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/handlers/AnvilHandler.java +++ b/src/main/java/net/knarcraft/armoredelytra/listener/AnvilListener.java @@ -1,12 +1,12 @@ -package nl.pim16aap2.armoredElytra.handlers; +package net.knarcraft.armoredelytra.listener; -import nl.pim16aap2.armoredElytra.ArmoredElytra; -import nl.pim16aap2.armoredElytra.nbtEditor.DurabilityManager; -import nl.pim16aap2.armoredElytra.nbtEditor.NBTEditor; -import nl.pim16aap2.armoredElytra.util.Action; -import nl.pim16aap2.armoredElytra.util.ArmorTier; -import nl.pim16aap2.armoredElytra.util.ConfigLoader; -import nl.pim16aap2.armoredElytra.util.Util; +import net.knarcraft.armoredelytra.ArmoredElytra; +import net.knarcraft.armoredelytra.config.ConfigLoader; +import net.knarcraft.armoredelytra.metadata.DurabilityManager; +import net.knarcraft.armoredelytra.metadata.NBTEditor; +import net.knarcraft.armoredelytra.property.Action; +import net.knarcraft.armoredelytra.property.ArmorTier; +import net.knarcraft.armoredelytra.util.GenericUtil; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -23,17 +23,12 @@ import org.bukkit.inventory.meta.ItemMeta; import javax.annotation.Nullable; import java.util.logging.Level; -public class AnvilHandler extends ArmoredElytraHandler implements Listener { - protected AnvilHandler(ArmoredElytra plugin, boolean creationEnabled, - NBTEditor nbtEditor, DurabilityManager durabilityManager, ConfigLoader config) { +public class AnvilListener extends ArmoredElytraHandler implements Listener { + public AnvilListener(ArmoredElytra plugin, boolean creationEnabled, + NBTEditor nbtEditor, DurabilityManager durabilityManager, ConfigLoader config) { super(plugin, creationEnabled, nbtEditor, durabilityManager, config); } - public AnvilHandler(ArmoredElytra plugin, NBTEditor nbtEditor, - DurabilityManager durabilityManager, ConfigLoader config) { - super(plugin, true, nbtEditor, durabilityManager, config); - } - // Valid inputs: // - Elytra (armored or not) + chestplate -> Create Armored Elytra // - Elytra (armored) + enchanted book -> Enchant @@ -56,7 +51,7 @@ public class AnvilHandler extends ArmoredElytraHandler implements Listener { final Material matTwo = itemTwo.getType(); // If the elytra is to be combined with chest armor... - if (Util.isChestPlate(matTwo)) { + if (GenericUtil.isChestPlate(matTwo)) { return creationEnabled ? Action.CREATE : Action.NONE; } @@ -127,7 +122,7 @@ public class AnvilHandler extends ArmoredElytraHandler implements Listener { final ArmorTier newArmorTier; if (action == Action.CREATE) { - newArmorTier = Util.armorToTier(itemB); + newArmorTier = GenericUtil.armorToTier(itemB); } else if (action == Action.COMBINE) { newArmorTier = nbtEditor.getArmorTier(itemB); } else { diff --git a/src/main/java/nl/pim16aap2/armoredElytra/lib/armorequip/ArmorListener.java b/src/main/java/net/knarcraft/armoredelytra/listener/ArmorListener.java similarity index 80% rename from src/main/java/nl/pim16aap2/armoredElytra/lib/armorequip/ArmorListener.java rename to src/main/java/net/knarcraft/armoredelytra/listener/ArmorListener.java index c75bac5..545bd96 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/lib/armorequip/ArmorListener.java +++ b/src/main/java/net/knarcraft/armoredelytra/listener/ArmorListener.java @@ -1,6 +1,9 @@ -package nl.pim16aap2.armoredElytra.lib.armorequip; +package net.knarcraft.armoredelytra.listener; -import nl.pim16aap2.armoredElytra.lib.armorequip.ArmorEquipEvent.EquipMethod; +import net.knarcraft.armoredelytra.event.ArmorEquipEvent; +import net.knarcraft.armoredelytra.property.ArmorChangeMethod; +import net.knarcraft.armoredelytra.property.ArmorType; +import net.knarcraft.armoredelytra.util.ItemHelper; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -26,6 +29,7 @@ import java.util.List; * @since Jul 30, 2015 */ public class ArmorListener implements Listener { + private final List blockedMaterials; public ArmorListener(List blockedMaterials) { @@ -34,7 +38,7 @@ public class ArmorListener implements Listener { @EventHandler public final void inventoryClick(final InventoryClickEvent e) { - boolean shift = false, numberkey = false; + boolean shift = false, numberKey = false; if (e.isCancelled()) { return; } @@ -47,7 +51,7 @@ public class ArmorListener implements Listener { shift = true; } if (e.getClick().equals(ClickType.NUMBER_KEY)) { - numberkey = true; + numberKey = true; } if (e.getSlotType() != SlotType.ARMOR && e.getSlotType() != SlotType.QUICKBAR && e.getSlotType() != SlotType.CONTAINER) { @@ -82,7 +86,7 @@ public class ArmorListener implements Listener { e.getWhoClicked().getInventory().getLeggings())) || newArmorType.equals(ArmorType.BOOTS) && (equipping == isAirOrNull(e.getWhoClicked().getInventory().getBoots()))) { ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent((Player) e.getWhoClicked(), - EquipMethod.SHIFT_CLICK, newArmorType, + ArmorChangeMethod.SHIFT_CLICK, newArmorType, equipping ? null : e.getCurrentItem(), equipping ? e.getCurrentItem() : null); Bukkit.getServer().getPluginManager().callEvent(armorEquipEvent); @@ -94,11 +98,11 @@ public class ArmorListener implements Listener { } else { ItemStack newArmorPiece = e.getCursor(); ItemStack oldArmorPiece = e.getCurrentItem(); - if (numberkey) { + if (numberKey) { if (e.getClickedInventory().getType().equals(InventoryType.PLAYER)) { // Prevents shit in the 2by2 crafting // e.getClickedInventory() == The players inventory - // e.getHotBarButton() == key people are pressing to equip or unequip the item + // e.getHotBarButton() == key people are pressing to equip or un-equip the item // to or from. // e.getRawSlot() == The slot the item is going to. // e.getSlot() == Armor slot, can't use e.getRawSlot() as that gives a hotbar @@ -110,23 +114,23 @@ public class ArmorListener implements Listener { newArmorPiece = hotbarItem; oldArmorPiece = e.getClickedInventory().getItem(e.getSlot()); } else - // Unequipping + // Un-equipping { newArmorType = ArmorType .matchType(!isAirOrNull(e.getCurrentItem()) ? e.getCurrentItem() : e.getCursor()); } } else { if (isAirOrNull(e.getCursor()) && !isAirOrNull(e.getCurrentItem())) - // unequip with no new item going into the slot. + // un-equip with no new item going into the slot. { newArmorType = ArmorType.matchType(e.getCurrentItem()); } } } if (newArmorType != null && e.getRawSlot() == newArmorType.getSlot()) { - EquipMethod method = EquipMethod.PICK_DROP; - if (e.getAction().equals(InventoryAction.HOTBAR_SWAP) || numberkey) { - method = EquipMethod.HOTBAR_SWAP; + ArmorChangeMethod method = ArmorChangeMethod.PICK_DROP; + if (e.getAction().equals(InventoryAction.HOTBAR_SWAP) || numberKey) { + method = ArmorChangeMethod.HOTBAR_SWAP; } ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent((Player) e.getWhoClicked(), method, newArmorType, oldArmorPiece, newArmorPiece); @@ -147,7 +151,7 @@ public class ArmorListener implements Listener { final Player player = e.getPlayer(); if (e.getClickedBlock() != null && e.getAction() == Action.RIGHT_CLICK_BLOCK) { // Having both of these checks is useless, might as well do it though. - // Some blocks have actions when you right click them which stops the client + // Some blocks have actions when you right-click them which stops the client // from equipping the armor in hand. Material mat = e.getClickedBlock().getType(); for (String s : blockedMaterials) @@ -163,7 +167,7 @@ public class ArmorListener implements Listener { newArmorType .equals(ArmorType.LEGGINGS) && isAirOrNull(e.getPlayer().getInventory().getLeggings()) || newArmorType.equals(ArmorType.BOOTS) && isAirOrNull(e.getPlayer().getInventory().getBoots())) { - ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent(e.getPlayer(), EquipMethod.HOTBAR, + ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent(e.getPlayer(), ArmorChangeMethod.HOTBAR, ArmorType.matchType(e.getItem()), null, e.getItem()); Bukkit.getServer().getPluginManager().callEvent(armorEquipEvent); @@ -184,12 +188,12 @@ public class ArmorListener implements Listener { // Can't replace armor using this method making getCursor() useless. ArmorType type = ArmorType.matchType(event.getOldCursor()); if (event.getRawSlots().isEmpty()) - // Idk if this will ever happen + // IDK if this will ever happen { return; } if (type != null && type.getSlot() == event.getRawSlots().stream().findFirst().orElse(0)) { - ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent((Player) event.getWhoClicked(), EquipMethod.DRAG, + ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent((Player) event.getWhoClicked(), ArmorChangeMethod.DRAG, type, null, event.getOldCursor()); Bukkit.getServer().getPluginManager().callEvent(armorEquipEvent); if (armorEquipEvent.isCancelled()) { @@ -200,25 +204,31 @@ public class ArmorListener implements Listener { } @EventHandler - public void itemBreakEvent(PlayerItemBreakEvent e) { - ArmorType type = ArmorType.matchType(e.getBrokenItem()); - if (type != null) { - Player p = e.getPlayer(); - ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent(p, EquipMethod.BROKE, type, e.getBrokenItem(), null); - Bukkit.getServer().getPluginManager().callEvent(armorEquipEvent); - if (armorEquipEvent.isCancelled()) { - ItemStack i = e.getBrokenItem().clone(); - i.setAmount(1); - i.setDurability((short) (i.getDurability() - 1)); - if (type.equals(ArmorType.HELMET)) { - p.getInventory().setHelmet(i); - } else if (type.equals(ArmorType.CHESTPLATE)) { - p.getInventory().setChestplate(i); - } else if (type.equals(ArmorType.LEGGINGS)) { - p.getInventory().setLeggings(i); - } else if (type.equals(ArmorType.BOOTS)) { - p.getInventory().setBoots(i); - } + public void itemBreakEvent(PlayerItemBreakEvent itemBreakEvent) { + ArmorType armorType = ArmorType.matchType(itemBreakEvent.getBrokenItem()); + if (armorType == null) { + return; + } + + Player player = itemBreakEvent.getPlayer(); + ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent(player, ArmorChangeMethod.BROKEN, armorType, + itemBreakEvent.getBrokenItem(), null); + Bukkit.getServer().getPluginManager().callEvent(armorEquipEvent); + + if (armorEquipEvent.isCancelled()) { + ItemStack brokenItem = itemBreakEvent.getBrokenItem().clone(); + brokenItem.setAmount(1); + if (!ItemHelper.updateDamage(brokenItem, ItemHelper.getDamage(brokenItem) + 1)) { + throw new IllegalArgumentException("Cannot update damage for non-damageable item!"); + } + if (armorType.equals(ArmorType.HELMET)) { + player.getInventory().setHelmet(brokenItem); + } else if (armorType.equals(ArmorType.CHESTPLATE)) { + player.getInventory().setChestplate(brokenItem); + } else if (armorType.equals(ArmorType.LEGGINGS)) { + player.getInventory().setLeggings(brokenItem); + } else if (armorType.equals(ArmorType.BOOTS)) { + player.getInventory().setBoots(brokenItem); } } } @@ -229,7 +239,7 @@ public class ArmorListener implements Listener { for (ItemStack oldArmor : p.getInventory().getArmorContents()) if (!isAirOrNull(oldArmor)) { ArmorType type = ArmorType.matchType(oldArmor); - Bukkit.getServer().getPluginManager().callEvent(new ArmorEquipEvent(p, EquipMethod.DEATH, + Bukkit.getServer().getPluginManager().callEvent(new ArmorEquipEvent(p, ArmorChangeMethod.DEATH, type, oldArmor, null)); // No way to cancel a death event. } @@ -241,4 +251,5 @@ public class ArmorListener implements Listener { private boolean isAirOrNull(ItemStack item) { return item == null || item.getType().equals(Material.AIR); } + } diff --git a/src/main/java/nl/pim16aap2/armoredElytra/handlers/ArmoredElytraHandler.java b/src/main/java/net/knarcraft/armoredelytra/listener/ArmoredElytraHandler.java similarity index 85% rename from src/main/java/nl/pim16aap2/armoredElytra/handlers/ArmoredElytraHandler.java rename to src/main/java/net/knarcraft/armoredelytra/listener/ArmoredElytraHandler.java index 90428a8..b42c07e 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/handlers/ArmoredElytraHandler.java +++ b/src/main/java/net/knarcraft/armoredelytra/listener/ArmoredElytraHandler.java @@ -1,10 +1,10 @@ -package nl.pim16aap2.armoredElytra.handlers; +package net.knarcraft.armoredelytra.listener; -import nl.pim16aap2.armoredElytra.ArmoredElytra; -import nl.pim16aap2.armoredElytra.nbtEditor.ArmoredElytraBuilder.ArmoredElytraBuilder; -import nl.pim16aap2.armoredElytra.nbtEditor.DurabilityManager; -import nl.pim16aap2.armoredElytra.nbtEditor.NBTEditor; -import nl.pim16aap2.armoredElytra.util.ConfigLoader; +import net.knarcraft.armoredelytra.ArmoredElytra; +import net.knarcraft.armoredelytra.config.ConfigLoader; +import net.knarcraft.armoredelytra.metadata.DurabilityManager; +import net.knarcraft.armoredelytra.metadata.NBTEditor; +import net.knarcraft.armoredelytra.metadata.builder.ArmoredElytraBuilder; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -15,7 +15,8 @@ import javax.annotation.CheckReturnValue; * * @author Pim */ -abstract class ArmoredElytraHandler { +public abstract class ArmoredElytraHandler { + protected final ArmoredElytra plugin; protected final boolean creationEnabled; protected final ConfigLoader config; @@ -62,4 +63,5 @@ abstract class ArmoredElytraHandler { } return true; } + } diff --git a/src/main/java/net/knarcraft/armoredelytra/listener/DispenserArmorListener.java b/src/main/java/net/knarcraft/armoredelytra/listener/DispenserArmorListener.java new file mode 100644 index 0000000..02b7892 --- /dev/null +++ b/src/main/java/net/knarcraft/armoredelytra/listener/DispenserArmorListener.java @@ -0,0 +1,33 @@ +package net.knarcraft.armoredelytra.listener; + +import net.knarcraft.armoredelytra.event.ArmorEquipEvent; +import net.knarcraft.armoredelytra.property.ArmorChangeMethod; +import net.knarcraft.armoredelytra.property.ArmorType; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockDispenseArmorEvent; + +/** + * @author Arnah + * @since Feb 08, 2019 + */ +public class DispenserArmorListener implements Listener { + + @EventHandler + public void dispenseArmorEvent(BlockDispenseArmorEvent event) { + ArmorType type = ArmorType.matchType(event.getItem()); + if (type == null || !(event.getTargetEntity() instanceof Player p)) { + return; + } + + ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent(p, ArmorChangeMethod.DISPENSER, type, null, + event.getItem()); + Bukkit.getServer().getPluginManager().callEvent(armorEquipEvent); + if (armorEquipEvent.isCancelled()) { + event.setCancelled(true); + } + } + +} diff --git a/src/main/java/nl/pim16aap2/armoredElytra/handlers/FlyDurabilityHandler.java b/src/main/java/net/knarcraft/armoredelytra/listener/FlyDurabilityListener.java similarity index 73% rename from src/main/java/nl/pim16aap2/armoredElytra/handlers/FlyDurabilityHandler.java rename to src/main/java/net/knarcraft/armoredelytra/listener/FlyDurabilityListener.java index e7b36eb..d322ddc 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/handlers/FlyDurabilityHandler.java +++ b/src/main/java/net/knarcraft/armoredelytra/listener/FlyDurabilityListener.java @@ -1,21 +1,21 @@ -package nl.pim16aap2.armoredElytra.handlers; +package net.knarcraft.armoredelytra.listener; -import nl.pim16aap2.armoredElytra.nbtEditor.DurabilityManager; -import nl.pim16aap2.armoredElytra.nbtEditor.NBTEditor; -import nl.pim16aap2.armoredElytra.util.ArmorTier; -import nl.pim16aap2.armoredElytra.util.Util; +import net.knarcraft.armoredelytra.metadata.DurabilityManager; +import net.knarcraft.armoredelytra.metadata.NBTEditor; +import net.knarcraft.armoredelytra.property.ArmorTier; +import net.knarcraft.armoredelytra.util.GenericUtil; import org.bukkit.Material; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerItemDamageEvent; -public class FlyDurabilityHandler implements Listener { +public class FlyDurabilityListener implements Listener { private final boolean disableDurability; private final NBTEditor nbtEditor; private final DurabilityManager durabilityManager; - public FlyDurabilityHandler(boolean disableDurability, NBTEditor nbtEditor, DurabilityManager durabilityManager) { + public FlyDurabilityListener(boolean disableDurability, NBTEditor nbtEditor, DurabilityManager durabilityManager) { this.disableDurability = disableDurability; this.nbtEditor = nbtEditor; this.durabilityManager = durabilityManager; @@ -46,7 +46,7 @@ public class FlyDurabilityHandler implements Listener { final int newDurability = durabilityManager.removeDurability(e.getItem(), e.getDamage(), armorTier); if (durabilityManager.isBroken(newDurability, armorTier)) { - Util.moveChestplateToInventory(e.getPlayer()); + GenericUtil.moveChestplateToInventory(e.getPlayer()); } } } diff --git a/src/main/java/nl/pim16aap2/armoredElytra/handlers/ItemDropListener.java b/src/main/java/net/knarcraft/armoredelytra/listener/ItemDropListener.java similarity index 95% rename from src/main/java/nl/pim16aap2/armoredElytra/handlers/ItemDropListener.java rename to src/main/java/net/knarcraft/armoredelytra/listener/ItemDropListener.java index cb6328e..fc0531b 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/handlers/ItemDropListener.java +++ b/src/main/java/net/knarcraft/armoredelytra/listener/ItemDropListener.java @@ -1,7 +1,7 @@ -package nl.pim16aap2.armoredElytra.handlers; +package net.knarcraft.armoredelytra.listener; -import nl.pim16aap2.armoredElytra.nbtEditor.NBTEditor; -import nl.pim16aap2.armoredElytra.util.ArmorTier; +import net.knarcraft.armoredelytra.metadata.NBTEditor; +import net.knarcraft.armoredelytra.property.ArmorTier; import org.bukkit.Material; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; diff --git a/src/main/java/net/knarcraft/armoredelytra/listener/LoginListener.java b/src/main/java/net/knarcraft/armoredelytra/listener/LoginListener.java new file mode 100644 index 0000000..505fae7 --- /dev/null +++ b/src/main/java/net/knarcraft/armoredelytra/listener/LoginListener.java @@ -0,0 +1,30 @@ +package net.knarcraft.armoredelytra.listener; + +import net.knarcraft.armoredelytra.ArmoredElytra; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerLoginEvent; + +public class LoginListener implements Listener { + + private final ArmoredElytra plugin; + private final String message; + + public LoginListener(ArmoredElytra plugin, String message) { + this.plugin = plugin; + this.message = message; + } + + @EventHandler + public void onLogin(PlayerLoginEvent event) { + Player player = event.getPlayer(); + if (player.hasPermission("armoredElytra.admin")) { + // Slight delay so the player actually receives the message; + Bukkit.getScheduler().runTaskLater(plugin, () -> plugin.messagePlayer(player, ChatColor.AQUA, message), 10); + } + } + +} diff --git a/src/main/java/nl/pim16aap2/armoredElytra/handlers/NetheriteUpgradeListener.java b/src/main/java/net/knarcraft/armoredelytra/listener/NetheriteUpgradeListener.java similarity index 81% rename from src/main/java/nl/pim16aap2/armoredElytra/handlers/NetheriteUpgradeListener.java rename to src/main/java/net/knarcraft/armoredelytra/listener/NetheriteUpgradeListener.java index e12e3fd..22c8978 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/handlers/NetheriteUpgradeListener.java +++ b/src/main/java/net/knarcraft/armoredelytra/listener/NetheriteUpgradeListener.java @@ -1,10 +1,10 @@ -package nl.pim16aap2.armoredElytra.handlers; +package net.knarcraft.armoredelytra.listener; -import nl.pim16aap2.armoredElytra.ArmoredElytra; -import nl.pim16aap2.armoredElytra.nbtEditor.DurabilityManager; -import nl.pim16aap2.armoredElytra.nbtEditor.NBTEditor; -import nl.pim16aap2.armoredElytra.util.ArmorTier; -import nl.pim16aap2.armoredElytra.util.ConfigLoader; +import net.knarcraft.armoredelytra.ArmoredElytra; +import net.knarcraft.armoredelytra.config.ConfigLoader; +import net.knarcraft.armoredelytra.metadata.DurabilityManager; +import net.knarcraft.armoredelytra.metadata.NBTEditor; +import net.knarcraft.armoredelytra.property.ArmorTier; import org.bukkit.Material; import org.bukkit.event.EventHandler; import org.bukkit.event.inventory.InventoryClickEvent; @@ -36,11 +36,7 @@ public class NetheriteUpgradeListener extends SmithingTableListener { return; } - event.setResult(armoredElytraBuilder - .newBuilder() - .ofElytra(itemStackA) - .upgradeToTier(ArmorTier.NETHERITE) - .build()); + event.setResult(armoredElytraBuilder.newBuilder().ofElytra(itemStackA).upgradeToTier(ArmorTier.NETHERITE).build()); } private boolean validInput(@Nullable ItemStack itemStackA, @Nullable ItemStack itemStackB) { diff --git a/src/main/java/nl/pim16aap2/armoredElytra/handlers/EventHandlers.java b/src/main/java/net/knarcraft/armoredelytra/listener/PlayerEventListener.java similarity index 68% rename from src/main/java/nl/pim16aap2/armoredElytra/handlers/EventHandlers.java rename to src/main/java/net/knarcraft/armoredelytra/listener/PlayerEventListener.java index 6d0e6ea..be7ece5 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/handlers/EventHandlers.java +++ b/src/main/java/net/knarcraft/armoredelytra/listener/PlayerEventListener.java @@ -1,16 +1,15 @@ -package nl.pim16aap2.armoredElytra.handlers; +package net.knarcraft.armoredelytra.listener; -import nl.pim16aap2.armoredElytra.ArmoredElytra; -import nl.pim16aap2.armoredElytra.lib.armorequip.ArmorEquipEvent; -import nl.pim16aap2.armoredElytra.lib.armorequip.ArmorListener; -import nl.pim16aap2.armoredElytra.lib.armorequip.ArmorType; -import nl.pim16aap2.armoredElytra.lib.armorequip.DispenserArmorListener; -import nl.pim16aap2.armoredElytra.nbtEditor.DurabilityManager; -import nl.pim16aap2.armoredElytra.nbtEditor.NBTEditor; -import nl.pim16aap2.armoredElytra.util.AllowedToWearEnum; -import nl.pim16aap2.armoredElytra.util.ArmorTier; -import nl.pim16aap2.armoredElytra.util.Util; -import nl.pim16aap2.armoredElytra.util.messages.Message; +import net.knarcraft.armoredelytra.ArmoredElytra; +import net.knarcraft.armoredelytra.config.message.Message; +import net.knarcraft.armoredelytra.event.ArmorEquipEvent; +import net.knarcraft.armoredelytra.metadata.DurabilityManager; +import net.knarcraft.armoredelytra.metadata.NBTEditor; +import net.knarcraft.armoredelytra.property.AllowedToWearEnum; +import net.knarcraft.armoredelytra.property.ArmorChangeMethod; +import net.knarcraft.armoredelytra.property.ArmorTier; +import net.knarcraft.armoredelytra.property.ArmorType; +import net.knarcraft.armoredelytra.util.GenericUtil; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; @@ -26,13 +25,13 @@ import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.Random; -public class EventHandlers implements Listener { +public class PlayerEventListener implements Listener { private final Random random = new Random(); private final ArmoredElytra plugin; private final NBTEditor nbtEditor; private final DurabilityManager durabilityManager; - public EventHandlers(ArmoredElytra plugin, NBTEditor nbtEditor, DurabilityManager durabilityManager) { + public PlayerEventListener(ArmoredElytra plugin, NBTEditor nbtEditor, DurabilityManager durabilityManager) { this.plugin = plugin; this.nbtEditor = nbtEditor; this.durabilityManager = durabilityManager; @@ -50,11 +49,11 @@ public class EventHandlers implements Listener { if (armorTier.equals(ArmorTier.NONE)) { return AllowedToWearEnum.ALLOWED; } - if (Util.isBroken(elytra)) { + if (GenericUtil.isBroken(elytra)) { return AllowedToWearEnum.BROKEN; } if (!plugin.playerHasWearPerm(player, armorTier)) { - return AllowedToWearEnum.NOPERMISSION; + return AllowedToWearEnum.NO_PERMISSION; } return AllowedToWearEnum.ALLOWED; } @@ -98,7 +97,7 @@ public class EventHandlers implements Listener { final int durabilityLoss = removeDurability ? (int) Math.max(1, e.getDamage() / 4) : 0; final int newDurability = durabilityManager.removeDurability(elytra, durabilityLoss, armorTier); if (durabilityManager.isBroken(newDurability, armorTier)) { - Util.moveChestplateToInventory(p); + GenericUtil.moveChestplateToInventory(p); } } @@ -117,28 +116,31 @@ public class EventHandlers implements Listener { } @EventHandler - public void onEquip(ArmorEquipEvent e) { - if (e.getMethod().equals(ArmorEquipEvent.EquipMethod.DEATH) || - e.getMethod().equals(ArmorEquipEvent.EquipMethod.BROKE)) { + public void onEquip(ArmorEquipEvent equipEvent) { + //If death caused it, or the item actually broke, do nothing + if (equipEvent.getMethod().equals(ArmorChangeMethod.DEATH) || + equipEvent.getMethod().equals(ArmorChangeMethod.BROKEN)) { return; } - if (!e.getType().equals(ArmorType.CHESTPLATE) || - e.getNewArmorPiece() == null || - !e.getNewArmorPiece().getType().equals(Material.ELYTRA)) { + //Check if an elytra is involved + if (!equipEvent.getType().equals(ArmorType.CHESTPLATE) || + equipEvent.getNewArmorPiece() == null || + !equipEvent.getNewArmorPiece().getType().equals(Material.ELYTRA)) { return; } - final ArmorTier armorTier = nbtEditor.getArmorTier(e.getNewArmorPiece()); - final AllowedToWearEnum allowed = isAllowedToWear(e.getNewArmorPiece(), e.getPlayer(), armorTier); + final ArmorTier armorTier = nbtEditor.getArmorTier(equipEvent.getNewArmorPiece()); + final AllowedToWearEnum allowed = isAllowedToWear(equipEvent.getNewArmorPiece(), equipEvent.getPlayer(), + armorTier); switch (allowed) { case BROKEN -> { - plugin.messagePlayer(e.getPlayer(), plugin.getMyMessages().getString(Message.MESSAGES_REPAIRNEEDED)); - e.setCancelled(true); + plugin.messagePlayer(equipEvent.getPlayer(), plugin.getMyMessages().getString(Message.MESSAGES_REPAIR_NEEDED)); + equipEvent.setCancelled(true); } - case NOPERMISSION -> { - plugin.usageDeniedMessage(e.getPlayer(), armorTier); - e.setCancelled(true); + case NO_PERMISSION -> { + plugin.usageDeniedMessage(equipEvent.getPlayer(), armorTier); + equipEvent.setCancelled(true); } default -> { } diff --git a/src/main/java/nl/pim16aap2/armoredElytra/handlers/SmithingTableCraftHandler.java b/src/main/java/net/knarcraft/armoredelytra/listener/SmithingTableCraftHandler.java similarity index 73% rename from src/main/java/nl/pim16aap2/armoredElytra/handlers/SmithingTableCraftHandler.java rename to src/main/java/net/knarcraft/armoredelytra/listener/SmithingTableCraftHandler.java index 30a202c..58b3ab5 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/handlers/SmithingTableCraftHandler.java +++ b/src/main/java/net/knarcraft/armoredelytra/listener/SmithingTableCraftHandler.java @@ -1,11 +1,11 @@ -package nl.pim16aap2.armoredElytra.handlers; +package net.knarcraft.armoredelytra.listener; -import nl.pim16aap2.armoredElytra.ArmoredElytra; -import nl.pim16aap2.armoredElytra.nbtEditor.DurabilityManager; -import nl.pim16aap2.armoredElytra.nbtEditor.NBTEditor; -import nl.pim16aap2.armoredElytra.util.ArmorTier; -import nl.pim16aap2.armoredElytra.util.ConfigLoader; -import nl.pim16aap2.armoredElytra.util.Util; +import net.knarcraft.armoredelytra.ArmoredElytra; +import net.knarcraft.armoredelytra.config.ConfigLoader; +import net.knarcraft.armoredelytra.metadata.DurabilityManager; +import net.knarcraft.armoredelytra.metadata.NBTEditor; +import net.knarcraft.armoredelytra.property.ArmorTier; +import net.knarcraft.armoredelytra.util.GenericUtil; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.event.EventHandler; @@ -20,7 +20,7 @@ public class SmithingTableCraftHandler extends SmithingTableListener { super(plugin, true, nbtEditor, durabilityManager, config); // Register the anvil handler with creation disabled so AEs can still be repaired and stuff. Bukkit.getPluginManager() - .registerEvents(new AnvilHandler(plugin, false, nbtEditor, durabilityManager, config), plugin); + .registerEvents(new AnvilListener(plugin, false, nbtEditor, durabilityManager, config), plugin); } @EventHandler(ignoreCancelled = true) @@ -45,11 +45,11 @@ public class SmithingTableCraftHandler extends SmithingTableListener { protected ArmorTier getNewArmorTier(ItemStack itemStackA, ItemStack itemStackB) { if (itemStackA == null || itemStackB == null || - itemStackA.getType() != Material.ELYTRA || !Util.isChestPlate(itemStackB)) { + itemStackA.getType() != Material.ELYTRA || !GenericUtil.isChestPlate(itemStackB)) { return ArmorTier.NONE; } - return Util.armorToTier(itemStackB.getType()); + return GenericUtil.armorToTier(itemStackB.getType()); } @Override diff --git a/src/main/java/nl/pim16aap2/armoredElytra/handlers/SmithingTableListener.java b/src/main/java/net/knarcraft/armoredelytra/listener/SmithingTableListener.java similarity index 88% rename from src/main/java/nl/pim16aap2/armoredElytra/handlers/SmithingTableListener.java rename to src/main/java/net/knarcraft/armoredelytra/listener/SmithingTableListener.java index 763d53a..200fa3a 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/handlers/SmithingTableListener.java +++ b/src/main/java/net/knarcraft/armoredelytra/listener/SmithingTableListener.java @@ -1,10 +1,10 @@ -package nl.pim16aap2.armoredElytra.handlers; +package net.knarcraft.armoredelytra.listener; -import nl.pim16aap2.armoredElytra.ArmoredElytra; -import nl.pim16aap2.armoredElytra.nbtEditor.DurabilityManager; -import nl.pim16aap2.armoredElytra.nbtEditor.NBTEditor; -import nl.pim16aap2.armoredElytra.util.ArmorTier; -import nl.pim16aap2.armoredElytra.util.ConfigLoader; +import net.knarcraft.armoredelytra.ArmoredElytra; +import net.knarcraft.armoredelytra.config.ConfigLoader; +import net.knarcraft.armoredelytra.metadata.DurabilityManager; +import net.knarcraft.armoredelytra.metadata.NBTEditor; +import net.knarcraft.armoredelytra.property.ArmorTier; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.Listener; @@ -15,7 +15,7 @@ import org.bukkit.inventory.SmithingInventory; import java.util.logging.Level; -abstract class SmithingTableListener extends ArmoredElytraHandler implements Listener { +public abstract class SmithingTableListener extends ArmoredElytraHandler implements Listener { protected SmithingTableListener(ArmoredElytra plugin, boolean creationEnabled, NBTEditor nbtEditor, DurabilityManager durabilityManager, ConfigLoader config) { super(plugin, creationEnabled, nbtEditor, durabilityManager, config); diff --git a/src/main/java/nl/pim16aap2/armoredElytra/handlers/Uninstaller.java b/src/main/java/net/knarcraft/armoredelytra/listener/Uninstaller.java similarity index 92% rename from src/main/java/nl/pim16aap2/armoredElytra/handlers/Uninstaller.java rename to src/main/java/net/knarcraft/armoredelytra/listener/Uninstaller.java index 7d2cfdb..5b7c0f6 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/handlers/Uninstaller.java +++ b/src/main/java/net/knarcraft/armoredelytra/listener/Uninstaller.java @@ -1,8 +1,8 @@ -package nl.pim16aap2.armoredElytra.handlers; +package net.knarcraft.armoredelytra.listener; -import nl.pim16aap2.armoredElytra.ArmoredElytra; -import nl.pim16aap2.armoredElytra.nbtEditor.NBTEditor; -import nl.pim16aap2.armoredElytra.util.ArmorTier; +import net.knarcraft.armoredelytra.ArmoredElytra; +import net.knarcraft.armoredelytra.metadata.NBTEditor; +import net.knarcraft.armoredelytra.property.ArmorTier; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.event.EventHandler; @@ -68,4 +68,5 @@ public class Uninstaller implements Listener { } }.runTaskLater(plugin, 20); } + } diff --git a/src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/DurabilityManager.java b/src/main/java/net/knarcraft/armoredelytra/metadata/DurabilityManager.java similarity index 94% rename from src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/DurabilityManager.java rename to src/main/java/net/knarcraft/armoredelytra/metadata/DurabilityManager.java index fabe239..de79a78 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/DurabilityManager.java +++ b/src/main/java/net/knarcraft/armoredelytra/metadata/DurabilityManager.java @@ -1,8 +1,8 @@ -package nl.pim16aap2.armoredElytra.nbtEditor; +package net.knarcraft.armoredelytra.metadata; -import nl.pim16aap2.armoredElytra.util.ArmorTier; -import nl.pim16aap2.armoredElytra.util.ConfigLoader; -import nl.pim16aap2.armoredElytra.util.Util; +import net.knarcraft.armoredelytra.config.ConfigLoader; +import net.knarcraft.armoredelytra.property.ArmorTier; +import net.knarcraft.armoredelytra.util.GenericUtil; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -12,7 +12,7 @@ public class DurabilityManager { private static final int ELYTRA_MAX_DURABILITY = Material.ELYTRA.getMaxDurability(); private final int[] repairAmounts = new int[ArmorTier.values().length]; - private final int[] maxDurabilities = new int[ArmorTier.values().length]; + private final int[] maxDurabilityValues = new int[ArmorTier.values().length]; private final NBTEditor nbtEditor; private final ConfigLoader config; @@ -78,7 +78,7 @@ public class DurabilityManager { (otherMaxDurability - otherDurability) - (currentMaxDurability - currentDurability); - return Util.between(combinedDurability, 0, targetMaxDurability); + return GenericUtil.between(combinedDurability, 0, targetMaxDurability); } /** @@ -97,7 +97,7 @@ public class DurabilityManager { final ArmorTier currentTier = providedTier == null ? nbtEditor.getArmorTier(armoredElytra) : providedTier; final int currentDurability = getRealDurability(armoredElytra, currentTier); - final int newDurability = Util.between(currentDurability + durabilityLoss, 0, getMaxDurability(currentTier)); + final int newDurability = GenericUtil.between(currentDurability + durabilityLoss, 0, getMaxDurability(currentTier)); setDurability(armoredElytra, newDurability, providedTier); return newDurability; } @@ -257,7 +257,7 @@ public class DurabilityManager { * @return The maximum durability of the given armor tier. */ private int getMaxDurability(ArmorTier armorTier) { - return maxDurabilities[armorTier.ordinal()]; + return maxDurabilityValues[armorTier.ordinal()]; } /** @@ -282,22 +282,22 @@ public class DurabilityManager { */ private int getRemappedDurability(int durability, int oldMax, int newMax) { final float relativeDurability = (float) durability / oldMax; - return Util.between((int) Math.ceil(relativeDurability * newMax), 0, newMax); + return GenericUtil.between((int) Math.ceil(relativeDurability * newMax), 0, newMax); } /** - * Initializes the {@link #maxDurabilities} and {@link #repairAmounts} arrays. + * Initializes the {@link #maxDurabilityValues} and {@link #repairAmounts} arrays. */ private void init() { repairAmounts[0] = 0; - maxDurabilities[0] = ELYTRA_MAX_DURABILITY; + maxDurabilityValues[0] = ELYTRA_MAX_DURABILITY; final ArmorTier[] armorTiers = ArmorTier.values(); for (int idx = 1; idx < armorTiers.length; ++idx) { final ArmorTier armorTier = armorTiers[idx]; final int maxDurability = calculateMaxDurability(armorTier); - maxDurabilities[idx] = maxDurability; + this.maxDurabilityValues[idx] = maxDurability; final int steps = Math.max(1, config.getFullRepairItemCount(armorTier)); repairAmounts[idx] = (int) Math.ceil((float) maxDurability / steps); diff --git a/src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/NBTEditor.java b/src/main/java/net/knarcraft/armoredelytra/metadata/NBTEditor.java similarity index 72% rename from src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/NBTEditor.java rename to src/main/java/net/knarcraft/armoredelytra/metadata/NBTEditor.java index 58895c9..a2b757d 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/NBTEditor.java +++ b/src/main/java/net/knarcraft/armoredelytra/metadata/NBTEditor.java @@ -1,7 +1,7 @@ -package nl.pim16aap2.armoredElytra.nbtEditor; +package net.knarcraft.armoredelytra.metadata; -import nl.pim16aap2.armoredElytra.ArmoredElytra; -import nl.pim16aap2.armoredElytra.util.ArmorTier; +import net.knarcraft.armoredelytra.ArmoredElytra; +import net.knarcraft.armoredelytra.property.ArmorTier; import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.Material; @@ -14,6 +14,7 @@ import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.util.Collection; @@ -29,12 +30,39 @@ public class NBTEditor { private static final NamespacedKey DURABILITY_KEY = new NamespacedKey(ArmoredElytra.getInstance(), "ARMORED_ELYTRA_DURABILITY"); + private static final NamespacedKey ORIGINAL_METADATA_KEY = new NamespacedKey(ArmoredElytra.getInstance(), + "ORIGINAL_METADATA"); + + /** + * Updates the original metadata for the given item. + * + * @param itemStack

The item to update.

+ * @param metadata

The original metadata to store.

+ */ + public void updateOriginalMetadata(@NotNull ItemStack itemStack, @NotNull OriginalMetadata metadata) { + final ItemMeta meta = getOrCreateItemMeta(itemStack); + meta.getPersistentDataContainer().set(ORIGINAL_METADATA_KEY, new PersistentMetadata(), metadata); + itemStack.setItemMeta(meta); + } + + /** + * Gets the original metadata for the given item. + * + * @param itemStack

The item to get metadata for.

+ * @return

The stored metadata, or null if none has been stored.

+ */ + public @Nullable OriginalMetadata getOriginalMetadata(@NotNull ItemStack itemStack) { + final @Nullable ItemMeta meta = itemStack.getItemMeta(); + return Objects.requireNonNull(meta, "Meta cannot be null for armored elytras!" + ).getPersistentDataContainer().get(ORIGINAL_METADATA_KEY, new PersistentMetadata()); + } + /** * Gets the real durability value as stored in the NBT of an armored elytra. * - * @param itemStack The item for which to retrieve the real durability. - * @param providedTier The armor tier of the armored elytra. If this is null, it will be retrieved from NBT. - * @return The real durability of the itemstack if the itemstack has the AE durability attribute, or -1 otherwise. + * @param itemStack

The item for which to retrieve the real durability.

+ * @param providedTier

The armor tier of the armored elytra. If this is null, it will be retrieved from NBT.

+ * @return

The real durability of the item-stack if the item-stack has the AE durability attribute, or -1 otherwise.

*/ public int getRealDurability(ItemStack itemStack, @Nullable ArmorTier providedTier) { final @Nullable ItemMeta meta = itemStack.getItemMeta(); @@ -49,8 +77,8 @@ public class NBTEditor { } final @Nullable Integer realDurability = - Objects.requireNonNull(meta, "Meta cannot be null for armored elytras!") - .getPersistentDataContainer().get(DURABILITY_KEY, PersistentDataType.INTEGER); + Objects.requireNonNull(meta, "Meta cannot be null for armored elytras!" + ).getPersistentDataContainer().get(DURABILITY_KEY, PersistentDataType.INTEGER); return realDurability == null ? -1 : realDurability; } @@ -58,7 +86,7 @@ public class NBTEditor { /** * Updates the durability values of an item. * - * @param itemStack The itemstack to which the durability values will be applied. + * @param itemStack The item-stack to which the durability values will be applied. * @param realDurability The real durability to store in NBT. * @param displayDurability The durability value to display on the item. This is the durability value the client can * actually see.This only works if the item's meta is an instance of {@link Damageable}. @@ -74,6 +102,10 @@ public class NBTEditor { itemStack.setItemMeta(meta); } + //TODO: To be able to properly split the elytra from the armor, information of which metadata belongs to what needs + // to be stored. Notably, which item which enchantment belongs to. Which item the name and lore was taken from. + // Note that enchantments could be taken from both. + /** * Adds a given {@link ArmorTier} to an item. The item will be cloned. Note that setting the armor tier to {@link * ArmorTier#NONE} has no effect (besides making a copy of the item). @@ -127,18 +159,25 @@ public class NBTEditor { return returnedItem; } - void overwriteNBTValue(ItemMeta meta, Attribute attribute, double value, String modifierName) { + /** + * Overwrites the attribute modifier for the given attribute, on the chest slot + * + * @param meta

The metadata to edit

+ * @param attribute

The attribute to modify

+ * @param value

The new value of the attribute

+ * @param modifierName

The name of the attribute modifier

+ */ + private void overwriteNBTValue(ItemMeta meta, Attribute attribute, double value, String modifierName) { if (meta.hasAttributeModifiers()) { meta.removeAttributeModifier(attribute); } final AttributeModifier attributeModifier = new AttributeModifier(UUID.randomUUID(), modifierName, value, - AttributeModifier.Operation.ADD_NUMBER, - EquipmentSlot.CHEST); + AttributeModifier.Operation.ADD_NUMBER, EquipmentSlot.CHEST); meta.addAttributeModifier(attribute, attributeModifier); } - ArmorTier getArmorTier(@Nullable ItemMeta meta) { + private ArmorTier getArmorTier(@Nullable ItemMeta meta) { if (meta == null || !meta.hasAttributeModifiers()) { return ArmorTier.NONE; } @@ -215,13 +254,19 @@ public class NBTEditor { return rgb == null ? null : Color.fromRGB(rgb); } - static ItemMeta getOrCreateItemMeta(ItemStack item) { - final ItemMeta meta = item.hasItemMeta() ? - item.getItemMeta() : + /** + * Gets existing metadata, or creates new metadata for the given item + * + * @param item

The item to get item meta for

+ * @return

The existing or new item meta

+ */ + private static ItemMeta getOrCreateItemMeta(ItemStack item) { + final ItemMeta meta = item.hasItemMeta() ? item.getItemMeta() : Bukkit.getItemFactory().getItemMeta(item.getType()); if (meta == null) { throw new IllegalArgumentException("Tried to add armor to invalid item: " + item); } return meta; } + } diff --git a/src/main/java/net/knarcraft/armoredelytra/metadata/OriginalMetadata.java b/src/main/java/net/knarcraft/armoredelytra/metadata/OriginalMetadata.java new file mode 100644 index 0000000..a458550 --- /dev/null +++ b/src/main/java/net/knarcraft/armoredelytra/metadata/OriginalMetadata.java @@ -0,0 +1,166 @@ +package net.knarcraft.armoredelytra.metadata; + +import org.bukkit.enchantments.Enchantment; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; + +/** + * An object for storing the original metadata for an armored elytra. + * + *

The intended usage of this class is to keep track of the original metadata of the armor and the elytra for each + * armored elytra, to prevent problems when splitting them. If an armor used to upgrade the armored elytra has a custom + * name or lore, and none is stored already, the name and lore should be updated. Additionally, any enchantments found + * on armor used to upgrade the armored elytra should be combined with the original armor enchantments.

+ */ +public class OriginalMetadata implements Serializable { + + private Set armorEnchantments = new HashSet<>(); + private Set elytraEnchantments = new HashSet<>(); + private String elytraLore; + private String elytraName; + private String armorLore; + private String armorName; + + public OriginalMetadata() { + + } + + /** + * Gets the armor enchantments stored in this metadata. + * + * @return

The stored armor enchantments.

+ */ + public @NotNull Set getArmorEnchantments() { + return new HashSet<>(armorEnchantments); + } + + /** + * Gets the elytra enchantments stored in this metadata. + * + * @return

The stored elytra enchantments.

+ */ + public @NotNull Set getElytraEnchantments() { + return new HashSet<>(elytraEnchantments); + } + + /** + * Gets the original lore of this elytra. + * + * @return

The original elytra lore.

+ */ + public @Nullable String getElytraLore() { + return this.elytraLore; + } + + /** + * Gets the original name of this elytra. + * + * @return

The original elytra name.

+ */ + public @Nullable String getElytraName() { + return this.elytraName; + } + + /** + * Gets the original lore of this armor. + * + * @return

The original armor lore.

+ */ + public @Nullable String getArmorLore() { + return this.armorLore; + } + + /** + * Gets the original name of this armor. + * + * @return

The original armor name.

+ */ + public @Nullable String getArmorName() { + return this.armorName; + } + + /** + * Sets the stored lore of this armored elytra's armor. + * + * @param armorLore

The armor lore to store.

+ * @return

This original metadata.

+ */ + public OriginalMetadata setArmorLore(@NotNull String armorLore) { + this.armorLore = armorLore; + return this; + } + + /** + * Sets the stored elytra lore of this armored elytra's elytra. + * + * @param elytraLore

The elytra lore to store.

+ * @return

This original metadata.

+ */ + public OriginalMetadata setElytraLore(@NotNull String elytraLore) { + this.elytraLore = elytraLore; + return this; + } + + /** + * Sets the stored elytra name of this armored elytra's elytra. + * + * @param elytraName

The elytra name to store.

+ * @return

This original metadata.

+ */ + public OriginalMetadata setElytraName(@NotNull String elytraName) { + this.elytraName = elytraName; + return this; + } + + /** + * Sets the stored armor name of this armored elytra's armor. + * + * @param armorName

The armor name to store.

+ * @return

This original metadata.

+ */ + public OriginalMetadata setArmorName(@NotNull String armorName) { + this.armorName = armorName; + return this; + } + + /** + * Sets the stored enchantments for this armored elytra's armor. + * + * @param armorEnchantments

The armor enchantments to store.

+ * @return

This original metadata.

+ */ + public OriginalMetadata setArmorEnchantments(@NotNull Set armorEnchantments) { + this.armorEnchantments = armorEnchantments; + return this; + } + + /** + * Sets the stored enchantments for this armored elytra's elytra. + * + * @param elytraEnchantments

The elytra enchantments to store.

+ * @return

This original metadata.

+ */ + public OriginalMetadata setElytraEnchantments(@NotNull Set elytraEnchantments) { + this.elytraEnchantments = elytraEnchantments; + return this; + } + + /** + * Adds the given enchantments to armor enchantments. + * + *

The purpose of this method is to combine enchantments for the original chestplate, and any chest-plates used + * to upgrade the armored elytra.

+ * + * @param enchantments

The enchantments to add

+ * @return

This original metadata.

+ */ + public OriginalMetadata addArmorEnchantments(@NotNull Set enchantments) { + this.armorEnchantments.addAll(enchantments); + return this; + } + +} diff --git a/src/main/java/net/knarcraft/armoredelytra/metadata/PersistentMetadata.java b/src/main/java/net/knarcraft/armoredelytra/metadata/PersistentMetadata.java new file mode 100644 index 0000000..11c08fe --- /dev/null +++ b/src/main/java/net/knarcraft/armoredelytra/metadata/PersistentMetadata.java @@ -0,0 +1,52 @@ +package net.knarcraft.armoredelytra.metadata; + +import org.bukkit.persistence.PersistentDataAdapterContext; +import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +/** + * A persistent data type for persistently storing the original metadata of an armored elytra + */ +public class PersistentMetadata implements PersistentDataType { + + @NotNull + @Override + public Class getPrimitiveType() { + return byte[].class; + } + + @NotNull + @Override + public Class getComplexType() { + return OriginalMetadata.class; + } + + @Override + public byte @NotNull [] toPrimitive(@NotNull OriginalMetadata complex, @NotNull PersistentDataAdapterContext context) { + try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) { + objectOutputStream.writeObject(complex); + return byteArrayOutputStream.toByteArray(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @NotNull + @Override + public OriginalMetadata fromPrimitive(byte @NotNull [] primitive, @NotNull PersistentDataAdapterContext context) { + try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(primitive); + ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)) { + return (OriginalMetadata) objectInputStream.readObject(); + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/ArmoredElytraBuilder/ArmoredElytraBuilder.java b/src/main/java/net/knarcraft/armoredelytra/metadata/builder/ArmoredElytraBuilder.java similarity index 91% rename from src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/ArmoredElytraBuilder/ArmoredElytraBuilder.java rename to src/main/java/net/knarcraft/armoredelytra/metadata/builder/ArmoredElytraBuilder.java index 8b8607a..4c8f391 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/ArmoredElytraBuilder/ArmoredElytraBuilder.java +++ b/src/main/java/net/knarcraft/armoredelytra/metadata/builder/ArmoredElytraBuilder.java @@ -1,11 +1,11 @@ -package nl.pim16aap2.armoredElytra.nbtEditor.ArmoredElytraBuilder; +package net.knarcraft.armoredelytra.metadata.builder; -import nl.pim16aap2.armoredElytra.ArmoredElytra; -import nl.pim16aap2.armoredElytra.nbtEditor.DurabilityManager; -import nl.pim16aap2.armoredElytra.nbtEditor.NBTEditor; -import nl.pim16aap2.armoredElytra.util.ArmorTier; -import nl.pim16aap2.armoredElytra.util.ConfigLoader; -import nl.pim16aap2.armoredElytra.util.EnchantmentContainer; +import net.knarcraft.armoredelytra.ArmoredElytra; +import net.knarcraft.armoredelytra.config.ConfigLoader; +import net.knarcraft.armoredelytra.container.EnchantmentContainer; +import net.knarcraft.armoredelytra.metadata.DurabilityManager; +import net.knarcraft.armoredelytra.metadata.NBTEditor; +import net.knarcraft.armoredelytra.property.ArmorTier; import org.bukkit.inventory.ItemStack; import javax.annotation.Nullable; diff --git a/src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/ArmoredElytraBuilder/Builder.java b/src/main/java/net/knarcraft/armoredelytra/metadata/builder/Builder.java similarity index 90% rename from src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/ArmoredElytraBuilder/Builder.java rename to src/main/java/net/knarcraft/armoredelytra/metadata/builder/Builder.java index f4db75e..de3e503 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/ArmoredElytraBuilder/Builder.java +++ b/src/main/java/net/knarcraft/armoredelytra/metadata/builder/Builder.java @@ -1,12 +1,12 @@ -package nl.pim16aap2.armoredElytra.nbtEditor.ArmoredElytraBuilder; +package net.knarcraft.armoredelytra.metadata.builder; -import nl.pim16aap2.armoredElytra.ArmoredElytra; -import nl.pim16aap2.armoredElytra.nbtEditor.DurabilityManager; -import nl.pim16aap2.armoredElytra.nbtEditor.NBTEditor; -import nl.pim16aap2.armoredElytra.util.ArmorTier; -import nl.pim16aap2.armoredElytra.util.ConfigLoader; -import nl.pim16aap2.armoredElytra.util.EnchantmentContainer; -import nl.pim16aap2.armoredElytra.util.Util; +import net.knarcraft.armoredelytra.ArmoredElytra; +import net.knarcraft.armoredelytra.config.ConfigLoader; +import net.knarcraft.armoredelytra.container.EnchantmentContainer; +import net.knarcraft.armoredelytra.metadata.DurabilityManager; +import net.knarcraft.armoredelytra.metadata.NBTEditor; +import net.knarcraft.armoredelytra.property.ArmorTier; +import net.knarcraft.armoredelytra.util.GenericUtil; import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.Material; @@ -16,9 +16,7 @@ import org.bukkit.inventory.meta.LeatherArmorMeta; import javax.annotation.Nullable; import java.util.List; -import static nl.pim16aap2.armoredElytra.util.Util.getTextureIdFromArmorTier; - -final class Builder implements ItemCreator, ItemCombinator, ItemMetadataSetter { +public final class Builder implements ItemCreator, ItemCombinator, ItemMetadataSetter { private static final Color DEFAULT_LEATHER_COLOR = Bukkit.getServer().getItemFactory().getDefaultLeatherColor(); @@ -116,7 +114,7 @@ final class Builder implements ItemCreator, ItemCombinator, ItemMetadataSetter { if (textureId != null) { this.textureId = textureId; } else if (newArmorTier != null) { - this.textureId = getTextureIdFromArmorTier(newArmorTier); + this.textureId = GenericUtil.getTextureIdFromArmorTier(newArmorTier); } else { this.textureId = null; } @@ -159,7 +157,7 @@ final class Builder implements ItemCreator, ItemCombinator, ItemMetadataSetter { public ItemMetadataSetter combineWith(ItemStack item, ArmorTier armorTier) { // Note: This method is almost always run. Important building steps should happen here. - if (armorTier == ArmorTier.NONE && !Util.isChestPlate(item)) { + if (armorTier == ArmorTier.NONE && !GenericUtil.isChestPlate(item)) { throw new IllegalArgumentException("Non-armored elytras can only be combined with chest plates!"); } @@ -181,7 +179,7 @@ final class Builder implements ItemCreator, ItemCombinator, ItemMetadataSetter { @Override public ItemMetadataSetter combineWith(ItemStack item) { final ArmorTier armorTier = item.getType().equals(Material.ELYTRA) ? - nbtEditor.getArmorTier(item) : Util.armorToTier(item.getType()); + nbtEditor.getArmorTier(item) : GenericUtil.armorToTier(item.getType()); return combineWith(item, armorTier); } diff --git a/src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/ArmoredElytraBuilder/ItemCombinator.java b/src/main/java/net/knarcraft/armoredelytra/metadata/builder/ItemCombinator.java similarity index 91% rename from src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/ArmoredElytraBuilder/ItemCombinator.java rename to src/main/java/net/knarcraft/armoredelytra/metadata/builder/ItemCombinator.java index 5d0ed3d..879f476 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/ArmoredElytraBuilder/ItemCombinator.java +++ b/src/main/java/net/knarcraft/armoredelytra/metadata/builder/ItemCombinator.java @@ -1,7 +1,7 @@ -package nl.pim16aap2.armoredElytra.nbtEditor.ArmoredElytraBuilder; +package net.knarcraft.armoredelytra.metadata.builder; -import nl.pim16aap2.armoredElytra.util.ArmorTier; -import nl.pim16aap2.armoredElytra.util.EnchantmentContainer; +import net.knarcraft.armoredelytra.container.EnchantmentContainer; +import net.knarcraft.armoredelytra.property.ArmorTier; import org.bukkit.inventory.ItemStack; /** diff --git a/src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/ArmoredElytraBuilder/ItemCreator.java b/src/main/java/net/knarcraft/armoredelytra/metadata/builder/ItemCreator.java similarity index 86% rename from src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/ArmoredElytraBuilder/ItemCreator.java rename to src/main/java/net/knarcraft/armoredelytra/metadata/builder/ItemCreator.java index 82a3319..f707266 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/ArmoredElytraBuilder/ItemCreator.java +++ b/src/main/java/net/knarcraft/armoredelytra/metadata/builder/ItemCreator.java @@ -1,6 +1,6 @@ -package nl.pim16aap2.armoredElytra.nbtEditor.ArmoredElytraBuilder; +package net.knarcraft.armoredelytra.metadata.builder; -import nl.pim16aap2.armoredElytra.util.ArmorTier; +import net.knarcraft.armoredelytra.property.ArmorTier; import org.bukkit.inventory.ItemStack; /** diff --git a/src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/ArmoredElytraBuilder/ItemMetadataSetter.java b/src/main/java/net/knarcraft/armoredelytra/metadata/builder/ItemMetadataSetter.java similarity index 94% rename from src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/ArmoredElytraBuilder/ItemMetadataSetter.java rename to src/main/java/net/knarcraft/armoredelytra/metadata/builder/ItemMetadataSetter.java index 4311a60..5d2df8c 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/nbtEditor/ArmoredElytraBuilder/ItemMetadataSetter.java +++ b/src/main/java/net/knarcraft/armoredelytra/metadata/builder/ItemMetadataSetter.java @@ -1,6 +1,6 @@ -package nl.pim16aap2.armoredElytra.nbtEditor.ArmoredElytraBuilder; +package net.knarcraft.armoredelytra.metadata.builder; -import nl.pim16aap2.armoredElytra.util.ConfigLoader; +import net.knarcraft.armoredelytra.config.ConfigLoader; import org.bukkit.Color; import org.bukkit.inventory.ItemStack; diff --git a/src/main/java/nl/pim16aap2/armoredElytra/util/Action.java b/src/main/java/net/knarcraft/armoredelytra/property/Action.java similarity index 91% rename from src/main/java/nl/pim16aap2/armoredElytra/util/Action.java rename to src/main/java/net/knarcraft/armoredelytra/property/Action.java index 1178b17..3ef663e 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/util/Action.java +++ b/src/main/java/net/knarcraft/armoredelytra/property/Action.java @@ -1,6 +1,7 @@ -package nl.pim16aap2.armoredElytra.util; +package net.knarcraft.armoredelytra.property; public enum Action { + /** * Take no action at all and let vanilla (or some other plugin) handle the process. */ @@ -30,4 +31,5 @@ public enum Action { * Blocks an otherwise valid input. */ BLOCK + } diff --git a/src/main/java/net/knarcraft/armoredelytra/property/AllowedToWearEnum.java b/src/main/java/net/knarcraft/armoredelytra/property/AllowedToWearEnum.java new file mode 100644 index 0000000..e483900 --- /dev/null +++ b/src/main/java/net/knarcraft/armoredelytra/property/AllowedToWearEnum.java @@ -0,0 +1,7 @@ +package net.knarcraft.armoredelytra.property; + +public enum AllowedToWearEnum { + + BROKEN, NO_PERMISSION, ALLOWED + +} diff --git a/src/main/java/net/knarcraft/armoredelytra/property/ArmorChangeMethod.java b/src/main/java/net/knarcraft/armoredelytra/property/ArmorChangeMethod.java new file mode 100644 index 0000000..d0140f8 --- /dev/null +++ b/src/main/java/net/knarcraft/armoredelytra/property/ArmorChangeMethod.java @@ -0,0 +1,49 @@ +package net.knarcraft.armoredelytra.property; + +/** + * A representation of all the ways a piece of equipped armor can change + */ +public enum ArmorChangeMethod { + + /** + * When you shift click an armor piece to equip or un-equip + */ + SHIFT_CLICK, + + /** + * When you drag and drop the item to equip or un-equip + */ + DRAG, + + /** + * When you manually equip or un-equip the item. Use to be DRAG + */ + PICK_DROP, + + /** + * When you right-click an armor piece in the hotbar without the inventory open to equip. + */ + HOTBAR, + + /** + * When you press the hotbar slot number while hovering over the armor slot to equip or un-equip + */ + HOTBAR_SWAP, + + /** + * When in range of a dispenser that shoots an armor piece to equip.
Requires the spigot version to have + * {@link org.bukkit.event.block.BlockDispenseArmorEvent} implemented. + */ + DISPENSER, + + /** + * When an armor piece is removed due to it losing all durability. + */ + BROKEN, + + /** + * When you die causing all armor to un-equip + */ + DEATH, + +} diff --git a/src/main/java/nl/pim16aap2/armoredElytra/util/ArmorTier.java b/src/main/java/net/knarcraft/armoredelytra/property/ArmorTier.java similarity index 98% rename from src/main/java/nl/pim16aap2/armoredElytra/util/ArmorTier.java rename to src/main/java/net/knarcraft/armoredelytra/property/ArmorTier.java index d8d9a59..4c2d91c 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/util/ArmorTier.java +++ b/src/main/java/net/knarcraft/armoredelytra/property/ArmorTier.java @@ -1,4 +1,4 @@ -package nl.pim16aap2.armoredElytra.util; +package net.knarcraft.armoredelytra.property; import org.bukkit.Material; diff --git a/src/main/java/nl/pim16aap2/armoredElytra/lib/armorequip/ArmorType.java b/src/main/java/net/knarcraft/armoredelytra/property/ArmorType.java similarity index 96% rename from src/main/java/nl/pim16aap2/armoredElytra/lib/armorequip/ArmorType.java rename to src/main/java/net/knarcraft/armoredelytra/property/ArmorType.java index c28f9d3..2660171 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/lib/armorequip/ArmorType.java +++ b/src/main/java/net/knarcraft/armoredelytra/property/ArmorType.java @@ -1,4 +1,4 @@ -package nl.pim16aap2.armoredElytra.lib.armorequip; +package net.knarcraft.armoredelytra.property; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -8,6 +8,7 @@ import org.bukkit.inventory.ItemStack; * @since Jul 30, 2015 */ public enum ArmorType { + HELMET(5), CHESTPLATE(6), LEGGINGS(7), @@ -49,4 +50,5 @@ public enum ArmorType { public int getSlot() { return slot; } + } diff --git a/src/main/java/nl/pim16aap2/armoredElytra/util/MinecraftVersion.java b/src/main/java/net/knarcraft/armoredelytra/property/MinecraftVersion.java similarity index 96% rename from src/main/java/nl/pim16aap2/armoredElytra/util/MinecraftVersion.java rename to src/main/java/net/knarcraft/armoredelytra/property/MinecraftVersion.java index f8baacc..22e162b 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/util/MinecraftVersion.java +++ b/src/main/java/net/knarcraft/armoredelytra/property/MinecraftVersion.java @@ -1,4 +1,4 @@ -package nl.pim16aap2.armoredElytra.util; +package net.knarcraft.armoredelytra.property; public enum MinecraftVersion { v1_6, diff --git a/src/main/java/nl/pim16aap2/armoredElytra/util/UpdateChecker.java b/src/main/java/net/knarcraft/armoredelytra/update/UpdateChecker.java similarity index 51% rename from src/main/java/nl/pim16aap2/armoredElytra/util/UpdateChecker.java rename to src/main/java/net/knarcraft/armoredelytra/update/UpdateChecker.java index fccd6a4..5d171f0 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/util/UpdateChecker.java +++ b/src/main/java/net/knarcraft/armoredelytra/update/UpdateChecker.java @@ -1,12 +1,11 @@ -package nl.pim16aap2.armoredElytra.util; +package net.knarcraft.armoredelytra.update; import com.google.common.base.Preconditions; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.JsonSyntaxException; -import nl.pim16aap2.armoredElytra.ArmoredElytra; -import org.apache.commons.lang.math.NumberUtils; +import net.knarcraft.armoredelytra.ArmoredElytra; import org.bukkit.plugin.java.JavaPlugin; import java.io.IOException; @@ -16,8 +15,6 @@ import java.net.URL; import java.time.Instant; import java.util.concurrent.CompletableFuture; import java.util.logging.Level; -import java.util.regex.Matcher; -import java.util.regex.Pattern; /** * A utility class to assist in checking for updates for plugins uploaded to @@ -35,39 +32,19 @@ import java.util.regex.Pattern; * @author Parker Hawke - 2008Choco */ public final class UpdateChecker { - public static final IVersionScheme VERSION_SCHEME_DECIMAL = (first, second) -> - { - String[] firstSplit = splitVersionInfo(first), secondSplit = splitVersionInfo(second); - if (firstSplit == null || secondSplit == null) { - return null; - } - - for (int i = 0; i < Math.min(firstSplit.length, secondSplit.length); i++) { - int currentValue = NumberUtils.toInt(firstSplit[i]), newestValue = NumberUtils.toInt(secondSplit[i]); - - if (newestValue > currentValue) { - return second; - } else if (newestValue < currentValue) { - return first; - } - } - - return (secondSplit.length > firstSplit.length) ? second : first; - }; private static final String USER_AGENT = "ArmoredElytra-update-checker"; private static final String UPDATE_URL = "https://api.spiget.org/v2/resources/%d/versions?size=1&sort=-releaseDate"; - private static final Pattern DECIMAL_SCHEME_PATTERN = Pattern.compile("\\d+(?:\\.\\d+)*"); private static UpdateChecker instance; - private UpdateResult lastResult = null; + UpdateResult lastResult = null; - private final ArmoredElytra plugin; + final ArmoredElytra plugin; private final int pluginID; - private final IVersionScheme versionScheme; + private final VersionScheme versionScheme; - private UpdateChecker(final ArmoredElytra plugin, final int pluginID, final IVersionScheme versionScheme) { + private UpdateChecker(final ArmoredElytra plugin, final int pluginID, final VersionScheme versionScheme) { this.plugin = plugin; this.pluginID = pluginID; this.versionScheme = versionScheme; @@ -81,8 +58,7 @@ public final class UpdateChecker { */ public CompletableFuture requestUpdateCheck() { return CompletableFuture.supplyAsync( - () -> - { + () -> { int responseCode; try { URL url = new URL(String.format(UPDATE_URL, pluginID)); @@ -94,7 +70,7 @@ public final class UpdateChecker { JsonElement element = new JsonParser().parse(reader); if (!element.isJsonArray()) { - return new UpdateResult(UpdateReason.INVALID_JSON); + return new UpdateResult(this, UpdateReason.INVALID_JSON); } reader.close(); @@ -115,21 +91,21 @@ public final class UpdateChecker { String latest = versionScheme.compareVersions(current, newest); if (latest == null) { - return new UpdateResult(UpdateReason.UNSUPPORTED_VERSION_SCHEME); + return new UpdateResult(this, UpdateReason.UNSUPPORTED_VERSION_SCHEME); } else if (latest.equals(current)) { - return new UpdateResult(current.equals(newest) ? + return new UpdateResult(this, current.equals(newest) ? UpdateReason.UP_TO_DATE : UpdateReason.UNRELEASED_VERSION, current, age); } else if (latest.equals(newest)) { - return new UpdateResult(UpdateReason.NEW_UPDATE, latest, age); + return new UpdateResult(this, UpdateReason.NEW_UPDATE, latest, age); } } catch (IOException e) { - return new UpdateResult(UpdateReason.COULD_NOT_CONNECT); + return new UpdateResult(this, UpdateReason.COULD_NOT_CONNECT); } catch (JsonSyntaxException e) { - return new UpdateResult(UpdateReason.INVALID_JSON); + return new UpdateResult(this, UpdateReason.INVALID_JSON); } - return new UpdateResult(responseCode == 401 ? + return new UpdateResult(this, responseCode == 401 ? UpdateReason.UNAUTHORIZED_QUERY : UpdateReason.UNKNOWN_ERROR); }); } @@ -155,28 +131,20 @@ public final class UpdateChecker { return lastResult; } - private static String[] splitVersionInfo(String version) { - Matcher matcher = DECIMAL_SCHEME_PATTERN.matcher(version); - if (!matcher.find()) { - return null; - } - - return matcher.group().split("\\."); - } - /** * Initializes this update checker with the specified values and return its instance. If an instance of * UpdateChecker has already been initialized, this method will act similarly to {@link #get()} (which is * recommended after initialization). * * @param plugin the plugin for which to check updates. Cannot be null - * @param pluginID the ID of the plugin as identified in the SpigotMC resource link. For example, - * "https://www.spigotmc.org/resources/veinminer.12038/" would expect "12038" as a - * value. The value must be greater than 0 + * @param pluginID

The ID of the plugin as identified in the SpigotMC resource link. For example, + * " + * https://www.spigotmc.org/resources/veinminer/12038/" would expect "12038" as a + * value. The value must be greater than 0

* @param versionScheme a custom version scheme parser. Cannot be null * @return the UpdateChecker instance */ - public static UpdateChecker init(final ArmoredElytra plugin, final int pluginID, final IVersionScheme versionScheme) { + public static UpdateChecker init(final ArmoredElytra plugin, final int pluginID, final VersionScheme versionScheme) { Preconditions.checkArgument(pluginID > 0, "Plugin ID must be greater than 0"); return (instance == null) ? instance = new UpdateChecker(plugin, pluginID, versionScheme) : instance; @@ -188,13 +156,14 @@ public final class UpdateChecker { * recommended after initialization). * * @param plugin the plugin for which to check updates. Cannot be null - * @param pluginID the ID of the plugin as identified in the SpigotMC resource link. For example, - * "https://www.spigotmc.org/resources/veinminer.12038/" would expect "12038" as a value. The - * value must be greater than 0 + * @param pluginID

The ID of the plugin as identified in the SpigotMC resource link. For example, + * " + * https://www.spigotmc.org/resources/veinminer/12038/" would expect "12038" as a value. The + * value must be greater than 0

* @return the UpdateChecker instance */ public static UpdateChecker init(final ArmoredElytra plugin, final int pluginID) { - return init(plugin, pluginID, VERSION_SCHEME_DECIMAL); + return init(plugin, pluginID, new VersionScheme()); } /** @@ -219,137 +188,4 @@ public final class UpdateChecker { return instance != null; } - /** - * A functional interface to compare two version Strings with similar version schemes. - */ - @FunctionalInterface - public interface IVersionScheme { - - /** - * Compare two versions and return the higher of the two. If null is returned, it is assumed that at least one - * of the two versions are unsupported by this version scheme parser. - * - * @param first the first version to check - * @param second the second version to check - * @return the greater of the two versions. null if unsupported version schemes - */ - String compareVersions(String first, String second); - - } - - /** - * A constant reason for the result of {@link UpdateResult}. - */ - public enum UpdateReason { - - /** - * A new update is available for download. - *

- * This is the only reason that requires an update. - */ - NEW_UPDATE, - - /** - * A successful connection to the SpiGet API could not be established. - */ - COULD_NOT_CONNECT, - - /** - * The JSON retrieved from SpiGet was invalid or malformed. - */ - INVALID_JSON, - - /** - * A 401 error was returned by the SpiGet API. - */ - UNAUTHORIZED_QUERY, - - /** - * The version of the plugin installed on the server is greater than the one uploaded to SpigotMC's resources - * section. - */ - UNRELEASED_VERSION, - - /** - * An unknown error occurred. - */ - UNKNOWN_ERROR, - - /** - * The plugin uses an unsupported version scheme, therefore a proper comparison between versions could not be - * made. - */ - UNSUPPORTED_VERSION_SCHEME, - - /** - * The plugin is up to date with the version released on SpigotMC's resources section. - */ - UP_TO_DATE - - } - - /** - * Represents a result for an update query performed by {@link UpdateChecker#requestUpdateCheck()}. - */ - public final class UpdateResult { - private final UpdateReason reason; - private final String newestVersion; - private final long age; - - { - lastResult = this; - } - - private UpdateResult(final UpdateReason reason, final String newestVersion, final long age) { - this.reason = reason; - this.newestVersion = newestVersion; - this.age = age; - } - - private UpdateResult(final UpdateReason reason) { - Preconditions - .checkArgument(reason != UpdateReason.NEW_UPDATE && reason != UpdateReason.UP_TO_DATE, - "Reasons that might require updates must also provide the latest version String"); - this.reason = reason; - newestVersion = plugin.getDescription().getVersion(); - age = -1; - } - - /** - * Gets the constant reason of this result. - * - * @return the reason - */ - public UpdateReason getReason() { - return reason; - } - - /** - * Checks whether or not this result requires the user to update. - * - * @return true if requires update, false otherwise - */ - public boolean requiresUpdate() { - return reason == UpdateReason.NEW_UPDATE; - } - - /** - * Gets the latest version of the plugin. This may be the currently installed version, it may not be. This - * depends entirely on the result of the update. - * - * @return the newest version of the plugin - */ - public String getNewestVersion() { - return newestVersion; - } - - /** - * Gets the number of seconds since the last update was released. - * - * @return The number of seconds since the last update was released or -1 if unavailable. - */ - public long getAge() { - return age; - } - } } diff --git a/src/main/java/nl/pim16aap2/armoredElytra/util/UpdateManager.java b/src/main/java/net/knarcraft/armoredelytra/update/UpdateManager.java similarity index 96% rename from src/main/java/nl/pim16aap2/armoredElytra/util/UpdateManager.java rename to src/main/java/net/knarcraft/armoredelytra/update/UpdateManager.java index acfb4b9..489ae81 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/util/UpdateManager.java +++ b/src/main/java/net/knarcraft/armoredelytra/update/UpdateManager.java @@ -1,6 +1,6 @@ -package nl.pim16aap2.armoredElytra.util; +package net.knarcraft.armoredelytra.update; -import nl.pim16aap2.armoredElytra.ArmoredElytra; +import net.knarcraft.armoredelytra.ArmoredElytra; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; @@ -76,4 +76,5 @@ public final class UpdateManager { } } } + } diff --git a/src/main/java/net/knarcraft/armoredelytra/update/UpdateReason.java b/src/main/java/net/knarcraft/armoredelytra/update/UpdateReason.java new file mode 100644 index 0000000..396242e --- /dev/null +++ b/src/main/java/net/knarcraft/armoredelytra/update/UpdateReason.java @@ -0,0 +1,52 @@ +package net.knarcraft.armoredelytra.update; + +/** + * A constant reason for the result of {@link UpdateResult}. + */ +public enum UpdateReason { + + /** + * A new update is available for download. + *

+ * This is the only reason that requires an update. + */ + NEW_UPDATE, + + /** + * A successful connection to the SpiGet API could not be established. + */ + COULD_NOT_CONNECT, + + /** + * The JSON retrieved from SpiGet was invalid or malformed. + */ + INVALID_JSON, + + /** + * A 401 error was returned by the SpiGet API. + */ + UNAUTHORIZED_QUERY, + + /** + * The version of the plugin installed on the server is greater than the one uploaded to SpigotMC's resources + * section. + */ + UNRELEASED_VERSION, + + /** + * An unknown error occurred. + */ + UNKNOWN_ERROR, + + /** + * The plugin uses an unsupported version scheme, therefore a proper comparison between versions could not be + * made. + */ + UNSUPPORTED_VERSION_SCHEME, + + /** + * The plugin is up-to-date with the version released on SpigotMC's resources section. + */ + UP_TO_DATE + +} diff --git a/src/main/java/net/knarcraft/armoredelytra/update/UpdateResult.java b/src/main/java/net/knarcraft/armoredelytra/update/UpdateResult.java new file mode 100644 index 0000000..09f916c --- /dev/null +++ b/src/main/java/net/knarcraft/armoredelytra/update/UpdateResult.java @@ -0,0 +1,67 @@ +package net.knarcraft.armoredelytra.update; + +import com.google.common.base.Preconditions; + +/** + * Represents a result for an update query performed by {@link UpdateChecker#requestUpdateCheck()}. + */ +public final class UpdateResult { + + private final UpdateReason reason; + private final String newestVersion; + private final long age; + + UpdateResult(UpdateChecker updateChecker, final UpdateReason reason, final String newestVersion, final long age) { + updateChecker.lastResult = this; + this.reason = reason; + this.newestVersion = newestVersion; + this.age = age; + } + + UpdateResult(UpdateChecker updateChecker, final UpdateReason reason) { + Preconditions + .checkArgument(reason != UpdateReason.NEW_UPDATE && reason != UpdateReason.UP_TO_DATE, + "Reasons that might require updates must also provide the latest version String"); + this.reason = reason; + newestVersion = updateChecker.plugin.getDescription().getVersion(); + age = -1; + } + + /** + * Gets the constant reason of this result. + * + * @return the reason + */ + public UpdateReason getReason() { + return reason; + } + + /** + * Checks whether this result requires the user to update. + * + * @return true if an update is required, false otherwise + */ + public boolean requiresUpdate() { + return reason == UpdateReason.NEW_UPDATE; + } + + /** + * Gets the latest version of the plugin. This may be the currently installed version, it may not be. This + * depends entirely on the result of the update. + * + * @return the newest version of the plugin + */ + public String getNewestVersion() { + return newestVersion; + } + + /** + * Gets the number of seconds since the last update was released. + * + * @return The number of seconds since the last update was released or -1 if unavailable. + */ + public long getAge() { + return age; + } + +} diff --git a/src/main/java/net/knarcraft/armoredelytra/update/VersionScheme.java b/src/main/java/net/knarcraft/armoredelytra/update/VersionScheme.java new file mode 100644 index 0000000..e47653a --- /dev/null +++ b/src/main/java/net/knarcraft/armoredelytra/update/VersionScheme.java @@ -0,0 +1,51 @@ +package net.knarcraft.armoredelytra.update; + +import org.apache.commons.lang.math.NumberUtils; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * A functional interface to compare two version Strings with similar version schemes. + */ +public class VersionScheme { + + private static final Pattern DECIMAL_SCHEME_PATTERN = Pattern.compile("\\d+(?:\\.\\d+)*"); + + /** + * Compare two versions and return the higher of the two. If null is returned, it is assumed that at least one + * of the two versions are unsupported by this version scheme parser. + * + * @param first the first version to check + * @param second the second version to check + * @return the greater of the two versions. null if unsupported version schemes + */ + String compareVersions(String first, String second) { + String[] firstSplit = splitVersionInfo(first), secondSplit = splitVersionInfo(second); + if (firstSplit == null || secondSplit == null) { + return null; + } + + for (int i = 0; i < Math.min(firstSplit.length, secondSplit.length); i++) { + int currentValue = NumberUtils.toInt(firstSplit[i]), newestValue = NumberUtils.toInt(secondSplit[i]); + + if (newestValue > currentValue) { + return second; + } else if (newestValue < currentValue) { + return first; + } + } + + return (secondSplit.length > firstSplit.length) ? second : first; + } + + private static String[] splitVersionInfo(String version) { + Matcher matcher = DECIMAL_SCHEME_PATTERN.matcher(version); + if (!matcher.find()) { + return null; + } + + return matcher.group().split("\\."); + } + +} diff --git a/src/main/java/nl/pim16aap2/armoredElytra/util/Util.java b/src/main/java/net/knarcraft/armoredelytra/util/GenericUtil.java similarity index 96% rename from src/main/java/nl/pim16aap2/armoredElytra/util/Util.java rename to src/main/java/net/knarcraft/armoredelytra/util/GenericUtil.java index 456c363..057c288 100644 --- a/src/main/java/nl/pim16aap2/armoredElytra/util/Util.java +++ b/src/main/java/net/knarcraft/armoredelytra/util/GenericUtil.java @@ -1,5 +1,6 @@ -package nl.pim16aap2.armoredElytra.util; +package net.knarcraft.armoredelytra.util; +import net.knarcraft.armoredelytra.property.ArmorTier; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; @@ -12,7 +13,7 @@ import java.io.StringWriter; import java.util.Locale; import java.util.Map; -public class Util { +public final class GenericUtil { public static String errorToString(Error e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); @@ -27,7 +28,7 @@ public class Util { // Check if an item is broken or not. public static boolean isBroken(ItemStack item) { - return item.getDurability() >= item.getType().getMaxDurability(); + return ItemHelper.getDurability(item) >= ItemHelper.getMaxDurability(item); } // Get the armor tier from a chest plate. diff --git a/src/main/java/net/knarcraft/armoredelytra/util/ItemHelper.java b/src/main/java/net/knarcraft/armoredelytra/util/ItemHelper.java new file mode 100644 index 0000000..a673d2e --- /dev/null +++ b/src/main/java/net/knarcraft/armoredelytra/util/ItemHelper.java @@ -0,0 +1,117 @@ +package net.knarcraft.armoredelytra.util; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.List; + +/** + * A helper class for getting information about items + */ +public final class ItemHelper { + + private ItemHelper() { + + } + + /** + * Gets whether the given item is repairable + * + * @param item

The item to check

+ * @return

True if the item is repairable

+ */ + public static boolean isRepairable(ItemStack item) { + return item.getItemMeta() instanceof Damageable && getMaxDurability(item) > 0; + } + + /** + * Gets the max durability of an item + * + * @param itemStack

The item to get the durability of

+ * @return

The max durability of the item

+ */ + public static short getMaxDurability(ItemStack itemStack) { + return itemStack.getType().getMaxDurability(); + } + + /** + * Gets the current durability of the given item + * + * @param itemStack

The item to get the durability of

+ * @return

The durability of the item

+ */ + public static short getDurability(ItemStack itemStack) { + Damageable damageable = (Damageable) itemStack.getItemMeta(); + int maxDurability = getMaxDurability(itemStack); + if (damageable != null) { + return (short) (maxDurability - damageable.getDamage()); + } else { + return (short) maxDurability; + } + } + + /** + * Gets the damage done to the given item + * + * @param itemStack

The damage done to the item

+ * @return

The damage done to the item

+ */ + public static short getDamage(ItemStack itemStack) { + Damageable damageable = (Damageable) itemStack.getItemMeta(); + if (damageable != null) { + return (short) damageable.getDamage(); + } else { + return 0; + } + } + + /** + * Updates the damage done to an item + * + * @param item

The item to update damage for

+ * @param newDamage

The new damage done

+ * @return

True if the damage was updated. False if not damageable.

+ */ + public static boolean updateDamage(ItemStack item, int newDamage) { + ItemMeta meta = item.getItemMeta(); + if (!(meta instanceof Damageable damageable)) { + return false; + } + damageable.setDamage(newDamage); + item.setItemMeta(meta); + return true; + } + + /** + * Gets a complete list of all reforge-able materials + * + * @return

A complete list of reforge-able materials

+ */ + public static List getAllReforgeAbleMaterials() { + List reforgeAbleMaterials = new ArrayList<>(); + for (Material material : Material.values()) { + ItemStack item = new ItemStack(material); + if (isRepairable(item)) { + reforgeAbleMaterials.add(material); + } + } + return reforgeAbleMaterials; + } + + /** + * Checks whether the given material is an anvil + * + * @param material

The material to check

+ * @param requireDamaged

Whether only a damaged anvil should count

+ * @return

True if the given material is an anvil

+ */ + public static boolean isAnvil(Material material, boolean requireDamaged) { + boolean isDamagedAnvil = material == Material.CHIPPED_ANVIL || material == Material.DAMAGED_ANVIL; + boolean isAnvil = isDamagedAnvil || material == Material.ANVIL; + return (requireDamaged && isDamagedAnvil) || (!requireDamaged && isAnvil); + } + +} diff --git a/src/main/java/nl/pim16aap2/armoredElytra/handlers/LoginHandler.java b/src/main/java/nl/pim16aap2/armoredElytra/handlers/LoginHandler.java deleted file mode 100644 index f587249..0000000 --- a/src/main/java/nl/pim16aap2/armoredElytra/handlers/LoginHandler.java +++ /dev/null @@ -1,34 +0,0 @@ -package nl.pim16aap2.armoredElytra.handlers; - -import nl.pim16aap2.armoredElytra.ArmoredElytra; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.scheduler.BukkitRunnable; - -public class LoginHandler implements Listener { - private final ArmoredElytra plugin; - private final String message; - - public LoginHandler(ArmoredElytra plugin, String message) { - this.plugin = plugin; - this.message = message; - } - - @EventHandler - public void onLogin(PlayerLoginEvent event) { - Player player = event.getPlayer(); - if (player.hasPermission("armoredElytra.admin")) - // Slight delay so the player actually receives the message; - { - new BukkitRunnable() { - @Override - public void run() { - plugin.messagePlayer(player, ChatColor.AQUA, message); - } - }.runTaskLater(plugin, 10); - } - } -} diff --git a/src/main/java/nl/pim16aap2/armoredElytra/lib/armorequip/DispenserArmorListener.java b/src/main/java/nl/pim16aap2/armoredElytra/lib/armorequip/DispenserArmorListener.java deleted file mode 100644 index 43abdd6..0000000 --- a/src/main/java/nl/pim16aap2/armoredElytra/lib/armorequip/DispenserArmorListener.java +++ /dev/null @@ -1,28 +0,0 @@ -package nl.pim16aap2.armoredElytra.lib.armorequip; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockDispenseArmorEvent; - -/** - * @author Arnah - * @since Feb 08, 2019 - */ -public class DispenserArmorListener implements Listener { - @EventHandler - public void dispenseArmorEvent(BlockDispenseArmorEvent event) { - ArmorType type = ArmorType.matchType(event.getItem()); - if (type != null) { - if (event.getTargetEntity() instanceof Player p) { - ArmorEquipEvent armorEquipEvent = new ArmorEquipEvent(p, ArmorEquipEvent.EquipMethod.DISPENSER, type, - null, event.getItem()); - Bukkit.getServer().getPluginManager().callEvent(armorEquipEvent); - if (armorEquipEvent.isCancelled()) { - event.setCancelled(true); - } - } - } - } -} diff --git a/src/main/java/nl/pim16aap2/armoredElytra/util/AllowedToWearEnum.java b/src/main/java/nl/pim16aap2/armoredElytra/util/AllowedToWearEnum.java deleted file mode 100644 index f7151a1..0000000 --- a/src/main/java/nl/pim16aap2/armoredElytra/util/AllowedToWearEnum.java +++ /dev/null @@ -1,5 +0,0 @@ -package nl.pim16aap2.armoredElytra.util; - -public enum AllowedToWearEnum { - BROKEN, NOPERMISSION, ALLOWED -} diff --git a/src/main/resources/en_US.txt b/src/main/resources/en_US.txt index 77df85c..7186dad 100644 --- a/src/main/resources/en_US.txt +++ b/src/main/resources/en_US.txt @@ -1,7 +1,7 @@ # This file contains all the (partial) sentences used in this plugin. # You can change which file will be used in the config.yml. # The format is "key=value" (without quotation marks). You can modify the values, but not the keys. -# Order doesn't matter and you can use comments if you so desire. +# Order doesn't matter, and you can use comments if you so desire. # Please do note that white space does matter! (so spaces at the end of lines, for example). # The long names (without 'SHORT') are the names the elytras will have. TIER.Leather=&2Leather Armored Elytra diff --git a/src/main/resources/it_IT.txt b/src/main/resources/it_IT.txt index b19db70..0bc6bf1 100644 --- a/src/main/resources/it_IT.txt +++ b/src/main/resources/it_IT.txt @@ -1,7 +1,7 @@ # This file contains all the (partial) sentences used in this plugin. # You can change which file will be used in the config.yml. # The format is "key=value" (without quotation marks). You can modify the values, but not the keys. -# Order doesn't matter and you can use comments if you so desire. +# Order doesn't matter, and you can use comments if you so desire. # Please do note that white space does matter! (so spaces at the end of lines, for example). # The long names (without 'SHORT') are the names the elytras will have. TIER.Leather=&2Elytra corazzata di pelle diff --git a/src/main/resources/zh_TW.txt b/src/main/resources/zh_TW.txt index 87bfe05..a4f0286 100644 --- a/src/main/resources/zh_TW.txt +++ b/src/main/resources/zh_TW.txt @@ -1,7 +1,7 @@ # This file contains all the (partial) sentences used in this plugin. # You can change which file will be used in the config.yml. # The format is "key=value" (without quotation marks). You can modify the values, but not the keys. -# Order doesn't matter and you can use comments if you so desire. +# Order doesn't matter, and you can use comments if you so desire. # Please do note that white space does matter! (so spaces at the end of lines, for example). # The long names (without 'SHORT') are the names the elytras will have. TIER.Leather=&2皮革裝甲鞘翅 diff --git a/src/test/java/net/knarcraft/armoredelytra/util/GenericUtilTest.java b/src/test/java/net/knarcraft/armoredelytra/util/GenericUtilTest.java new file mode 100644 index 0000000..bd83c17 --- /dev/null +++ b/src/test/java/net/knarcraft/armoredelytra/util/GenericUtilTest.java @@ -0,0 +1,18 @@ +package net.knarcraft.armoredelytra.util; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class GenericUtilTest { + + @Test + void testSnakeToCamelCase() { + Assertions.assertEquals("testCase", GenericUtil.snakeToCamelCase("TeSt_Case")); + Assertions.assertEquals("testCase", GenericUtil.snakeToCamelCase("____test_case")); + Assertions.assertEquals("", GenericUtil.snakeToCamelCase("________")); + Assertions.assertEquals("testCase", GenericUtil.snakeToCamelCase("TeSt__Case____")); + Assertions.assertEquals("t", GenericUtil.snakeToCamelCase("_T_")); + Assertions.assertEquals("testcase", GenericUtil.snakeToCamelCase("TeStCase")); + } + +} diff --git a/src/test/java/nl/pim16aap2/armoredElytra/util/UtilTest.java b/src/test/java/nl/pim16aap2/armoredElytra/util/UtilTest.java deleted file mode 100644 index f054a77..0000000 --- a/src/test/java/nl/pim16aap2/armoredElytra/util/UtilTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package nl.pim16aap2.armoredElytra.util; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -class UtilTest { - @Test - void testSnakeToCamelCase() { - Assertions.assertEquals("testCase", Util.snakeToCamelCase("TeSt_Case")); - Assertions.assertEquals("testCase", Util.snakeToCamelCase("____test_case")); - Assertions.assertEquals("", Util.snakeToCamelCase("________")); - Assertions.assertEquals("testCase", Util.snakeToCamelCase("TeSt__Case____")); - Assertions.assertEquals("t", Util.snakeToCamelCase("_T_")); - Assertions.assertEquals("testcase", Util.snakeToCamelCase("TeStCase")); - } -}