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;
}