diff --git a/pom.xml b/pom.xml index 350950c82..bb1c1b80e 100755 --- a/pom.xml +++ b/pom.xml @@ -228,6 +228,14 @@ com.sk89q.worldguard worldguard-core 7.0.1-SNAPSHOT + + + + + com.google.code.findbugs + jsr305 + + com.sk89q.worldguard diff --git a/src/main/java/com/gmail/nossr50/api/exceptions/IncompleteNamespacedKeyRegister.java b/src/main/java/com/gmail/nossr50/api/exceptions/IncompleteNamespacedKeyRegister.java index 92b97ca88..5bc8b5c9f 100644 --- a/src/main/java/com/gmail/nossr50/api/exceptions/IncompleteNamespacedKeyRegister.java +++ b/src/main/java/com/gmail/nossr50/api/exceptions/IncompleteNamespacedKeyRegister.java @@ -1,7 +1,11 @@ package com.gmail.nossr50.api.exceptions; +import org.jetbrains.annotations.NotNull; + public class IncompleteNamespacedKeyRegister extends RuntimeException { - public IncompleteNamespacedKeyRegister(String message) { + private static final long serialVersionUID = -6905157273569301219L; + + public IncompleteNamespacedKeyRegister(@NotNull String message) { super(message); } } diff --git a/src/main/java/com/gmail/nossr50/api/exceptions/McMMOPlayerNotFoundException.java b/src/main/java/com/gmail/nossr50/api/exceptions/McMMOPlayerNotFoundException.java index b0b0f0087..d2df14a70 100644 --- a/src/main/java/com/gmail/nossr50/api/exceptions/McMMOPlayerNotFoundException.java +++ b/src/main/java/com/gmail/nossr50/api/exceptions/McMMOPlayerNotFoundException.java @@ -1,11 +1,12 @@ package com.gmail.nossr50.api.exceptions; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class McMMOPlayerNotFoundException extends RuntimeException { private static final long serialVersionUID = 761917904993202836L; - public McMMOPlayerNotFoundException(Player player) { + public McMMOPlayerNotFoundException(@NotNull Player player) { super("McMMOPlayer object was not found for [NOTE: This can mean the profile is not loaded yet!] : " + player.getName() + " " + player.getUniqueId()); } } diff --git a/src/main/java/com/gmail/nossr50/chat/ChatManagerFactory.java b/src/main/java/com/gmail/nossr50/chat/ChatManagerFactory.java index 4146d26c7..299a3e271 100644 --- a/src/main/java/com/gmail/nossr50/chat/ChatManagerFactory.java +++ b/src/main/java/com/gmail/nossr50/chat/ChatManagerFactory.java @@ -1,15 +1,26 @@ package com.gmail.nossr50.chat; -import com.gmail.nossr50.datatypes.chat.ChatMode; -import org.bukkit.plugin.Plugin; - import java.util.HashMap; +import java.util.Map; -public class ChatManagerFactory { - private static final HashMap adminChatManagers = new HashMap<>(); - private static final HashMap partyChatManagers = new HashMap<>(); +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; - public static ChatManager getChatManager(Plugin plugin, ChatMode mode) { +import com.gmail.nossr50.datatypes.chat.ChatMode; + +public final class ChatManagerFactory { + private static final Map adminChatManagers = new HashMap<>(); + private static final Map partyChatManagers = new HashMap<>(); + + /** + * This is a static utility class, therefore we don't want any instances of + * this class. Making the constructor private prevents accidents like that. + */ + private ChatManagerFactory() {} + + @Nullable + public static ChatManager getChatManager(@NotNull Plugin plugin, @NotNull ChatMode mode) { switch (mode) { case ADMIN: if (!adminChatManagers.containsKey(plugin)) { diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index a13c755ff..c005a38fb 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -42,6 +42,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.entity.*; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.potion.PotionEffect; @@ -1068,10 +1069,13 @@ public class EntityListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) return; - if(event.getPotion().getItem().getItemMeta() == null) - return; + ItemMeta meta = event.getPotion().getItem().getItemMeta(); - for (PotionEffect effect : ((PotionMeta) event.getPotion().getItem().getItemMeta()).getCustomEffects()) { + if (meta == null) { + return; + } + + for (PotionEffect effect : ((PotionMeta) meta).getCustomEffects()) { if (!effect.getType().equals(PotionEffectType.SATURATION)) { return; } diff --git a/src/main/java/com/gmail/nossr50/skills/salvage/Salvage.java b/src/main/java/com/gmail/nossr50/skills/salvage/Salvage.java index dde4962c6..0e94b0589 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/Salvage.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/Salvage.java @@ -4,7 +4,14 @@ import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.Config; import org.bukkit.Material; -public class Salvage { +public final class Salvage { + + /** + * This is a static utility class, therefore we don't want any instances of + * this class. Making the constructor private prevents accidents like that. + */ + private Salvage() {} + public static Material anvilMaterial = Config.getInstance().getSalvageAnvilMaterial(); /*public static int salvageMaxPercentageLevel = AdvancedConfig.getInstance().getSalvageMaxPercentageLevel(); @@ -15,7 +22,7 @@ public class Salvage { public static boolean arcaneSalvageDowngrades = AdvancedConfig.getInstance().getArcaneSalvageEnchantDowngradeEnabled(); public static boolean arcaneSalvageEnchantLoss = AdvancedConfig.getInstance().getArcaneSalvageEnchantLossEnabled(); - protected static int calculateSalvageableAmount(short currentDurability, short maxDurability, int baseAmount) { + static int calculateSalvageableAmount(int currentDurability, short maxDurability, int baseAmount) { double percentDamaged = (maxDurability <= 0) ? 1D : (double) (maxDurability - currentDurability) / maxDurability; return (int) Math.floor(baseAmount * percentDamaged); diff --git a/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java b/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java index cb4374b5a..161eaa84a 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java @@ -1,5 +1,18 @@ package com.gmail.nossr50.skills.salvage; +import java.util.Map; +import java.util.Map.Entry; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.EnchantmentStorageMeta; +import org.bukkit.inventory.meta.ItemMeta; + +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.experience.ExperienceConfig; @@ -8,7 +21,6 @@ import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.SkillManager; import com.gmail.nossr50.skills.salvage.salvageables.Salvageable; import com.gmail.nossr50.util.EventUtils; @@ -22,15 +34,6 @@ import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.EnchantmentStorageMeta; - -import java.util.Map; -import java.util.Map.Entry; public class SalvageManager extends SkillManager { private boolean placedAnvil; @@ -65,8 +68,9 @@ public class SalvageManager extends SkillManager { Player player = getPlayer(); Salvageable salvageable = mcMMO.getSalvageableManager().getSalvageable(item.getType()); - - if (item.getItemMeta() != null && item.getItemMeta().isUnbreakable()) { + ItemMeta meta = item.getItemMeta(); + + if (meta != null && meta.isUnbreakable()) { NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE_FAILED, "Anvil.Unbreakable"); return; } @@ -91,7 +95,8 @@ public class SalvageManager extends SkillManager { return; } - int potentialSalvageYield = Salvage.calculateSalvageableAmount(item.getDurability(), salvageable.getMaximumDurability(), salvageable.getMaximumQuantity()); + int durability = meta instanceof Damageable ? ((Damageable) meta).getDamage(): 0; + int potentialSalvageYield = Salvage.calculateSalvageableAmount(durability, salvageable.getMaximumDurability(), salvageable.getMaximumQuantity()); if (potentialSalvageYield <= 0) { NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE_FAILED, "Salvage.Skills.TooDamaged"); diff --git a/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SalvageableFactory.java b/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SalvageableFactory.java index f22108157..d408b1992 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SalvageableFactory.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SalvageableFactory.java @@ -4,7 +4,13 @@ import com.gmail.nossr50.datatypes.skills.ItemType; import com.gmail.nossr50.datatypes.skills.MaterialType; import org.bukkit.Material; -public class SalvageableFactory { +public final class SalvageableFactory { + /** + * This is a static utility class, therefore we don't want any instances of + * this class. Making the constructor private prevents accidents like that. + */ + private SalvageableFactory() {} + public static Salvageable getSalvageable(Material itemMaterial, Material recipeMaterial, int maximumQuantity, short maximumDurability) { return getSalvageable(itemMaterial, recipeMaterial, 0, maximumQuantity, maximumDurability, ItemType.OTHER, MaterialType.OTHER, 1); } diff --git a/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SimpleSalvageableManager.java b/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SimpleSalvageableManager.java index db886c189..0262ca768 100644 --- a/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SimpleSalvageableManager.java +++ b/src/main/java/com/gmail/nossr50/skills/salvage/salvageables/SimpleSalvageableManager.java @@ -1,14 +1,14 @@ package com.gmail.nossr50.skills.salvage.salvageables; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import org.bukkit.Material; import org.bukkit.inventory.ItemStack; -import java.util.HashMap; -import java.util.List; - - public class SimpleSalvageableManager implements SalvageableManager { - private final HashMap salvageables; + private final Map salvageables; public SimpleSalvageableManager() { this(55); diff --git a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java index 07c47a1f3..cff867c9c 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -25,6 +25,8 @@ import org.bukkit.block.BlockState; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerItemDamageEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; import java.util.ArrayList; import java.util.HashSet; @@ -32,7 +34,6 @@ import java.util.List; import java.util.Set; public class WoodcuttingManager extends SkillManager { - private boolean treeFellerReachedThreshold = false; private static int treeFellerThreshold; //TODO: Shared setting, will be removed in 2.2 @@ -207,11 +208,13 @@ public class WoodcuttingManager extends SkillManager { */ private static boolean handleDurabilityLoss(Set treeFellerBlocks, ItemStack inHand, Player player) { //Treat the NBT tag for unbreakable and the durability enchant differently - if(inHand.getItemMeta() != null && inHand.getItemMeta().isUnbreakable()) { + ItemMeta meta = inHand.getItemMeta(); + + if (meta != null && meta.isUnbreakable()) { return true; } - short durabilityLoss = 0; + int durabilityLoss = 0; Material type = inHand.getType(); for (BlockState blockState : treeFellerBlocks) { @@ -230,7 +233,8 @@ public class WoodcuttingManager extends SkillManager { } SkillUtils.handleDurabilityChange(inHand, durabilityLoss); - return (inHand.getDurability() < (mcMMO.getRepairableManager().isRepairable(type) ? mcMMO.getRepairableManager().getRepairable(type).getMaximumDurability() : type.getMaxDurability())); + int durability = meta instanceof Damageable ? ((Damageable) meta).getDamage(): 0; + return (durability < (mcMMO.getRepairableManager().isRepairable(type) ? mcMMO.getRepairableManager().getRepairable(type).getMaximumDurability() : type.getMaxDurability())); } /** diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index 4fca5938b..4e70625e6 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -18,6 +18,10 @@ import org.jetbrains.annotations.NotNull; import java.util.List; public final class ItemUtils { + /** + * This is a static utility class, therefore we don't want any instances of + * this class. Making the constructor private prevents accidents like that. + */ private ItemUtils() {} /** diff --git a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java index 76c73d391..668f41976 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -35,7 +35,12 @@ import org.jetbrains.annotations.Nullable; import java.util.Iterator; -public class SkillUtils { +public final class SkillUtils { + /** + * This is a static utility class, therefore we don't want any instances of + * this class. Making the constructor private prevents accidents like that. + */ + private SkillUtils() {} public static void applyXpGain(McMMOPlayer mcMMOPlayer, PrimarySkillType skill, float xp, XPGainReason xpGainReason) { mcMMOPlayer.beginXpGain(skill, xp, xpGainReason, XPGainSource.SELF); @@ -217,10 +222,8 @@ public class SkillUtils { if(compatLayer.isLegacyAbilityTool(itemStack)) { ItemMeta itemMeta = itemStack.getItemMeta(); - //TODO: can be optimized - if(itemMeta.hasEnchant(Enchantment.DIG_SPEED)) { - itemMeta.removeEnchant(Enchantment.DIG_SPEED); - } + // This is safe to call without prior checks. + itemMeta.removeEnchant(Enchantment.DIG_SPEED); itemStack.setItemMeta(itemMeta); ItemUtils.removeAbilityLore(itemStack); @@ -264,7 +267,8 @@ public class SkillUtils { return false; } - protected static Material getRepairAndSalvageItem(ItemStack inHand) { + @Nullable + public static Material getRepairAndSalvageItem(@NotNull ItemStack inHand) { if (ItemUtils.isDiamondTool(inHand) || ItemUtils.isDiamondArmor(inHand)) { return Material.DIAMOND; }