diff --git a/Changelog.txt b/Changelog.txt
index 9a33c8ee2..7618395dd 100644
--- a/Changelog.txt
+++ b/Changelog.txt
@@ -1,7 +1,9 @@
Version 2.1.210
Fixed a memory leak involving mob metadata
+ Fixed a potential null pointer exception in InventoryListener
NOTES:
+ If you're having issues with "immortal players" this is a known plugin incompatibility between mcMMO and another plugin, I need more info on what plugins need to be present to cause it. Please post info to GitHub issues or tag me on discord.
There was a big rewrite in this update relating to how various types of metadata were being tracked/stored/retrieved
If you run into issues with this version of mcMMO, please post about it on GitHub
diff --git a/pom.xml b/pom.xml
index 1484101cc..3aa6e813f 100755
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
4.0.0
com.gmail.nossr50.mcMMO
mcMMO
- 2.1.210-SNAPSHOT
+ 2.1.210
mcMMO
https://github.com/mcMMO-Dev/mcMMO
diff --git a/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java b/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java
index 678f1346b..7fb2ed7ee 100644
--- a/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java
+++ b/src/main/java/com/gmail/nossr50/api/ExperienceAPI.java
@@ -35,7 +35,7 @@ public final class ExperienceAPI {
* @param skillType A string that may or may not be a skill
* @return true if this is a valid mcMMO skill
*/
- public static boolean isValidSkillType(String skillType) {
+ public static boolean isValidSkillType(@NotNull String skillType) {
return mcMMO.p.getSkillTools().matchSkill(skillType) != null;
}
diff --git a/src/main/java/com/gmail/nossr50/util/player/UserManager.java b/src/main/java/com/gmail/nossr50/util/player/UserManager.java
index 732840720..ef0b63e43 100644
--- a/src/main/java/com/gmail/nossr50/util/player/UserManager.java
+++ b/src/main/java/com/gmail/nossr50/util/player/UserManager.java
@@ -8,6 +8,8 @@ import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.metadata.FixedMetadataValue;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
@@ -24,7 +26,7 @@ public final class UserManager {
*
* @param mcMMOPlayer the player profile to start tracking
*/
- public static void track(McMMOPlayer mcMMOPlayer) {
+ public static void track(@NotNull McMMOPlayer mcMMOPlayer) {
mcMMOPlayer.getPlayer().setMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA, new FixedMetadataValue(mcMMO.p, mcMMOPlayer));
if(playerDataSet == null)
@@ -43,8 +45,12 @@ public final class UserManager {
*
* @param player The Player object
*/
- public static void remove(Player player) {
+ public static void remove(@NotNull Player player) {
McMMOPlayer mcMMOPlayer = getPlayer(player);
+
+ if(mcMMOPlayer == null)
+ return;
+
mcMMOPlayer.cleanup();
player.removeMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA, mcMMO.p);
@@ -91,7 +97,7 @@ public final class UserManager {
mcMMO.p.getLogger().info("Finished save operation for "+trackedSyncData.size()+" players!");
}
- public static Collection getPlayers() {
+ public static @NotNull Collection getPlayers() {
Collection playerCollection = new ArrayList<>();
for (Player player : mcMMO.p.getServer().getOnlinePlayers()) {
@@ -109,11 +115,11 @@ public final class UserManager {
* @param playerName The name of the player whose McMMOPlayer to retrieve
* @return the player's McMMOPlayer object
*/
- public static McMMOPlayer getPlayer(String playerName) {
+ public static @Nullable McMMOPlayer getPlayer(String playerName) {
return retrieveMcMMOPlayer(playerName, false);
}
- public static McMMOPlayer getOfflinePlayer(OfflinePlayer player) {
+ public static @Nullable McMMOPlayer getOfflinePlayer(OfflinePlayer player) {
if (player instanceof Player) {
return getPlayer((Player) player);
}
@@ -121,7 +127,7 @@ public final class UserManager {
return retrieveMcMMOPlayer(player.getName(), true);
}
- public static McMMOPlayer getOfflinePlayer(String playerName) {
+ public static @Nullable McMMOPlayer getOfflinePlayer(String playerName) {
return retrieveMcMMOPlayer(playerName, true);
}
@@ -130,7 +136,7 @@ public final class UserManager {
* @param player target player
* @return McMMOPlayer object for this player, null if Player has not been loaded
*/
- public static McMMOPlayer getPlayer(Player player) {
+ public static @Nullable McMMOPlayer getPlayer(@Nullable Player player) {
//Avoid Array Index out of bounds
if(player != null && player.hasMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA))
return (McMMOPlayer) player.getMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA).get(0).value();
@@ -138,7 +144,10 @@ public final class UserManager {
return null;
}
- private static McMMOPlayer retrieveMcMMOPlayer(String playerName, boolean offlineValid) {
+ private static @Nullable McMMOPlayer retrieveMcMMOPlayer(@Nullable String playerName, boolean offlineValid) {
+ if(playerName == null)
+ return null;
+
Player player = mcMMO.p.getServer().getPlayerExact(playerName);
if (player == null) {
@@ -152,7 +161,7 @@ public final class UserManager {
return getPlayer(player);
}
- public static boolean hasPlayerDataKey(Entity entity) {
+ public static boolean hasPlayerDataKey(@Nullable Entity entity) {
return entity != null && entity.hasMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA);
}
}
diff --git a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java
index a855f3a4c..e576baae2 100644
--- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java
+++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java
@@ -320,14 +320,13 @@ public final class CombatUtils {
Entity painSource = event.getDamager();
EntityType entityType = painSource.getType();
- if (target instanceof Player) {
+ if (target instanceof Player player) {
if(ExperienceConfig.getInstance().isNPCInteractionPrevented()) {
if (Misc.isNPCEntityExcludingVillagers(target)) {
return;
}
}
- Player player = (Player) target;
if (!UserManager.hasPlayerDataKey(player)) {
return;
}
@@ -738,7 +737,7 @@ public final class CombatUtils {
* @param target The defending entity
* @param primarySkillType The skill being used
*/
- public static void processCombatXP(@NotNull McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType) {
+ public static void processCombatXP(@NotNull McMMOPlayer mcMMOPlayer, @NotNull LivingEntity target, @NotNull PrimarySkillType primarySkillType) {
processCombatXP(mcMMOPlayer, target, primarySkillType, 1.0);
}
@@ -750,7 +749,7 @@ public final class CombatUtils {
* @param primarySkillType The skill being used
* @param multiplier final XP result will be multiplied by this
*/
- public static void processCombatXP(@NotNull McMMOPlayer mcMMOPlayer, LivingEntity target, PrimarySkillType primarySkillType, double multiplier) {
+ public static void processCombatXP(@NotNull McMMOPlayer mcMMOPlayer, @NotNull LivingEntity target, @NotNull PrimarySkillType primarySkillType, double multiplier) {
double baseXP = 0;
XPGainReason xpGainReason;