Selaa lähdekoodia

Fixed /addlevels not working on offline players
Fixed /addlevels all throwing NPE because of Smelting
Removed use of Users.getProfile()

bm01 12 vuotta sitten
vanhempi
sitoutus
137864dc04

+ 1 - 0
Changelog.txt

@@ -21,6 +21,7 @@ Version 1.4.00-dev
  + Added ability to config Hylian Luck drops through treasures.yml
  + Added party XP sharing
  + Added vanilla XP boost for Fishing - includes permissions, config options, etc
+ = Fixed /addlevels not working properly on offline players
  = Fixed /mmoedit not giving feedback when modifying another players stats
  = Fixed the guide usage string showing up every time /skillname was called
  = Fixed Spout not being able to precache our resources properly, and therefore making our XP bars fail

+ 39 - 28
src/main/java/com/gmail/nossr50/commands/general/AddlevelsCommand.java

@@ -1,13 +1,12 @@
 package com.gmail.nossr50.commands.general;
 
-import org.bukkit.OfflinePlayer;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 
-import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.commands.CommandHelper;
+import com.gmail.nossr50.datatypes.McMMOPlayer;
 import com.gmail.nossr50.datatypes.PlayerProfile;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.skills.utilities.SkillTools;
@@ -19,7 +18,7 @@ import com.gmail.nossr50.util.Users;
 public class AddlevelsCommand implements CommandExecutor{
     @Override
     public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
-        OfflinePlayer modifiedPlayer;
+        Player player;
         PlayerProfile profile;
         int levels;
         SkillType skill;
@@ -38,10 +37,10 @@ public class AddlevelsCommand implements CommandExecutor{
                 }
 
                 if (Misc.isInt(args[1])) {
-                    modifiedPlayer = (Player) sender;
+                    player = (Player) sender;
                     levels = Integer.valueOf(args[1]);
                     skill = SkillTools.getSkillType(args[0]);
-                    profile = Users.getProfile(modifiedPlayer);
+                    profile = Users.getPlayer(player).getProfile();
 
                     if (skill.equals(SkillType.ALL)) {
                         sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.1", new Object[] {levels}));
@@ -64,44 +63,56 @@ public class AddlevelsCommand implements CommandExecutor{
                 return true;
             }
 
-            modifiedPlayer = mcMMO.p.getServer().getOfflinePlayer(args[0]);
-            profile = Users.getProfile(modifiedPlayer);
-
-            // TODO:Not sure if we actually need a null check here
-            if (profile == null || !profile.isLoaded()) {
-                sender.sendMessage(LocaleLoader.getString("Commands.DoesNotExist"));
+            if (!SkillTools.isSkill(args[1])) {
+                sender.sendMessage(LocaleLoader.getString("Commands.Skill.Invalid"));
                 return true;
             }
 
-            if (!SkillTools.isSkill(args[1])) {
-                sender.sendMessage(LocaleLoader.getString("Commands.Skill.Invalid"));
+            if (!Misc.isInt(args[2])) {
+                sender.sendMessage(usage);
                 return true;
             }
 
-            if (Misc.isInt(args[2])) {
-                levels = Integer.valueOf(args[2]);
-                skill = SkillTools.getSkillType(args[1]);
+            McMMOPlayer mcMMOPlayer = Users.getPlayer(args[0]);
+            levels = Integer.valueOf(args[2]);
+            skill = SkillTools.getSkillType(args[1]);
 
-                Users.getProfile(modifiedPlayer).addLevels(skill, levels);
+            // If the mcMMOPlayer doesn't exists, create a temporary profile and check if it's present in the database, if not abort the process
+            if (mcMMOPlayer == null) {
+                profile = new PlayerProfile(args[0], false);
+
+                if (!profile.isLoaded()) {
+                    sender.sendMessage(LocaleLoader.getString("Commands.DoesNotExist"));
+                    return true;
+                }
+
+                profile.addLevels(skill, levels);
+                profile.save(); // Since this is a temporary profile, we save it here.
+            }
+            else {
+                profile = mcMMOPlayer.getProfile();
+                player = mcMMOPlayer.getPlayer();
+
+                profile.addLevels(skill, levels);
+
+                // This is actually not necessary but it can avoid a string building
+                if (!player.isOnline()) {
+                    return true;
+                }
 
                 if (skill.equals(SkillType.ALL)) {
-                    sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.2", new Object[] {args[0]}));
+                    player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.1", new Object[] {levels}));
                 }
                 else {
-                    sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.2", new Object[] {Misc.getCapitalized(skill.toString()), args[0]}));
+                    player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.1", new Object[] {levels, Misc.getCapitalized(skill.toString())}));
                 }
+            }
 
-                if (modifiedPlayer.isOnline()) {
-                    if (skill.equals(SkillType.ALL)) {
-                        ((Player) modifiedPlayer).sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.1", new Object[] {levels}));
-                    }
-                    else {
-                        ((Player) modifiedPlayer).sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.1", new Object[] {levels, Misc.getCapitalized(skill.toString())}));
-                    }
-                }
+            if (skill.equals(SkillType.ALL)) {
+                sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.2", new Object[] {args[0]}));
             }
             else {
-                sender.sendMessage(usage);
+                sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.2", new Object[] {Misc.getCapitalized(skill.toString()), args[0]}));
             }
 
             return true;

+ 2 - 2
src/main/java/com/gmail/nossr50/datatypes/PlayerProfile.java

@@ -1111,9 +1111,9 @@ public class PlayerProfile {
             return;
         }
 
-        if (skillType.equals(SkillType.ALL)) {
+        if (skillType == SkillType.ALL) {
             for (SkillType skill : SkillType.values()) {
-                if (skill.equals(SkillType.ALL)) {
+                if (skill == SkillType.ALL || skill.isChildSkill()) {
                     continue;
                 }
 

+ 1 - 0
src/main/java/com/gmail/nossr50/skills/utilities/SkillType.java

@@ -144,6 +144,7 @@ public enum SkillType {
         return Users.getProfile(player).getSkillLevel(this);
     }
 
+    // TODO: This is a little "hacky", we probably need to add something to distinguish child skills in the enum, or to use another enum for them
     public boolean isChildSkill() {
         switch (this) {
         case SMELTING: