allow for all mcmmo versions 3.4.1

This commit is contained in:
okx-code
2019-01-20 21:32:23 +00:00
parent fd2a77a196
commit c99fb182a0
5 changed files with 101 additions and 11 deletions
@@ -1,16 +1,14 @@
package sh.okx.rankup.requirements.requirement.mcmmo;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.util.player.UserManager;
import org.bukkit.entity.Player;
import sh.okx.rankup.Rankup;
import sh.okx.rankup.requirements.Requirement;
public class McMMOSkillRequirement extends Requirement {
private PrimarySkillType skill;
private String skill;
public McMMOSkillRequirement(Rankup plugin, PrimarySkillType skill) {
super(plugin, "mcmmo-" + skill.toString().toLowerCase());
public McMMOSkillRequirement(Rankup plugin, String skill) {
super(plugin, "mcmmo-" + skill.toLowerCase());
this.skill = skill;
}
@@ -26,7 +24,7 @@ public class McMMOSkillRequirement extends Requirement {
@Override
public double getRemaining(Player player) {
return Math.max(0, getValueInt() - UserManager.getPlayer(player).getSkillLevel(skill));
return Math.max(0, getValueInt() - McMMOSkillUtil.getInstance().getSkillLevel(player, skill));
}
@Override
@@ -0,0 +1,90 @@
package sh.okx.rankup.requirements.requirement.mcmmo;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.util.player.UserManager;
import org.bukkit.entity.Player;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Because mcMMO like changing the name of their skill types.
* Singleton (not thread safe!) class to access different mcMMO versions.
*/
public class McMMOSkillUtil {
private static McMMOSkillUtil instance;
private Class<?> skillTypeClass;
private Method values;
private Method valueOf;
//private Class<?> userManagerClass;
private Method getSkillLevel;
private McMMOSkillUtil() {
final String pckg = "com.gmail.nossr50.datatypes.skills.";
try {
skillTypeClass = Class.forName(pckg + "PrimarySkillType");
} catch (ClassNotFoundException e0) {
try {
skillTypeClass = Class.forName(pckg + "PrimarySkill");
} catch (ClassNotFoundException e1) {
try {
skillTypeClass = Class.forName(pckg + "SkillType");
} catch (ClassNotFoundException e2) {
throw new RuntimeException("mcMMO Skill Type class not found");
}
}
}
try {
values = skillTypeClass.getMethod("values");
} catch (NoSuchMethodException e) {
throw new RuntimeException("mcMMO " + skillTypeClass + ".values() not found");
}
try {
valueOf = skillTypeClass.getMethod("valueOf", String.class);
} catch (NoSuchMethodException e) {
throw new RuntimeException("mcMMO" + skillTypeClass + ".valueOf(String) not found");
}
/*try {
userManagerClass = Class.forName("com.gmail.nossr50.util.player.UserManager");
} catch (ClassNotFoundException e) {
throw new RuntimeException("mcMMO UserManager class not found");
}*/
try {
getSkillLevel = McMMOPlayer.class.getMethod("getSkillLevel", skillTypeClass);
} catch (NoSuchMethodException e) {
throw new RuntimeException("mcMMO UserManager.getSkillLevel(" + skillTypeClass + ") not found");
}
}
public static McMMOSkillUtil getInstance() {
if (instance == null) {
instance = new McMMOSkillUtil();
}
return instance;
}
public String[] getSkills() {
try {
Enum<?>[] skills = (Enum<?>[]) values.invoke(null);
String[] stringSkills = new String[skills.length];
for (int i = 0; i < skills.length; i++) {
stringSkills[i] = skills[i].name();
}
return stringSkills;
} catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
}
public int getSkillLevel(Player player, String skill) {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
try {
Object skillType = skillTypeClass.cast(valueOf.invoke(null, skill));
return (int) getSkillLevel.invoke(mcMMOPlayer, skillType);
} catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
}
}