Fixed /addlevels not working on offline players

Fixed /addlevels all throwing NPE because of Smelting
Removed use of Users.getProfile()
This commit is contained in:
bm01 2013-02-01 11:49:44 +01:00
parent ef775f1c24
commit 137864dc04
4 changed files with 47 additions and 34 deletions

View File

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

View File

@ -1,13 +1,12 @@
package com.gmail.nossr50.commands.general; package com.gmail.nossr50.commands.general;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.commands.CommandHelper; import com.gmail.nossr50.commands.CommandHelper;
import com.gmail.nossr50.datatypes.McMMOPlayer;
import com.gmail.nossr50.datatypes.PlayerProfile; import com.gmail.nossr50.datatypes.PlayerProfile;
import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.utilities.SkillTools; import com.gmail.nossr50.skills.utilities.SkillTools;
@ -19,7 +18,7 @@ import com.gmail.nossr50.util.Users;
public class AddlevelsCommand implements CommandExecutor{ public class AddlevelsCommand implements CommandExecutor{
@Override @Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
OfflinePlayer modifiedPlayer; Player player;
PlayerProfile profile; PlayerProfile profile;
int levels; int levels;
SkillType skill; SkillType skill;
@ -38,10 +37,10 @@ public class AddlevelsCommand implements CommandExecutor{
} }
if (Misc.isInt(args[1])) { if (Misc.isInt(args[1])) {
modifiedPlayer = (Player) sender; player = (Player) sender;
levels = Integer.valueOf(args[1]); levels = Integer.valueOf(args[1]);
skill = SkillTools.getSkillType(args[0]); skill = SkillTools.getSkillType(args[0]);
profile = Users.getProfile(modifiedPlayer); profile = Users.getPlayer(player).getProfile();
if (skill.equals(SkillType.ALL)) { if (skill.equals(SkillType.ALL)) {
sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.1", new Object[] {levels})); sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.1", new Object[] {levels}));
@ -64,25 +63,50 @@ public class AddlevelsCommand implements CommandExecutor{
return true; 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"));
return true;
}
if (!SkillTools.isSkill(args[1])) { if (!SkillTools.isSkill(args[1])) {
sender.sendMessage(LocaleLoader.getString("Commands.Skill.Invalid")); sender.sendMessage(LocaleLoader.getString("Commands.Skill.Invalid"));
return true; return true;
} }
if (Misc.isInt(args[2])) { if (!Misc.isInt(args[2])) {
sender.sendMessage(usage);
return true;
}
McMMOPlayer mcMMOPlayer = Users.getPlayer(args[0]);
levels = Integer.valueOf(args[2]); levels = Integer.valueOf(args[2]);
skill = SkillTools.getSkillType(args[1]); 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)) {
player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.1", new Object[] {levels}));
}
else {
player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.1", new Object[] {levels, Misc.getCapitalized(skill.toString())}));
}
}
if (skill.equals(SkillType.ALL)) { if (skill.equals(SkillType.ALL)) {
sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.2", new Object[] {args[0]})); sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.2", new Object[] {args[0]}));
@ -91,19 +115,6 @@ public class AddlevelsCommand implements CommandExecutor{
sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.2", new Object[] {Misc.getCapitalized(skill.toString()), args[0]})); sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.2", new Object[] {Misc.getCapitalized(skill.toString()), args[0]}));
} }
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())}));
}
}
}
else {
sender.sendMessage(usage);
}
return true; return true;
default: default:

View File

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

View File

@ -144,6 +144,7 @@ public enum SkillType {
return Users.getProfile(player).getSkillLevel(this); 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() { public boolean isChildSkill() {
switch (this) { switch (this) {
case SMELTING: case SMELTING: