diff --git a/build.gradle b/build.gradle index ce661c4..39c59bf 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group 'sh.okx' -version '3.4' +version '3.4.1' repositories { mavenCentral() diff --git a/src/main/java/sh/okx/rankup/Rankup.java b/src/main/java/sh/okx/rankup/Rankup.java index 5d27bfd..c5e9181 100644 --- a/src/main/java/sh/okx/rankup/Rankup.java +++ b/src/main/java/sh/okx/rankup/Rankup.java @@ -1,6 +1,5 @@ package sh.okx.rankup; -import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import lombok.Getter; import net.milkbowl.vault.economy.Economy; import net.milkbowl.vault.permission.Permission; @@ -47,6 +46,7 @@ import sh.okx.rankup.requirements.requirement.advancedachievements.AdvancedAchie import sh.okx.rankup.requirements.requirement.advancedachievements.AdvancedAchievementsTotalRequirement; import sh.okx.rankup.requirements.requirement.mcmmo.McMMOPowerLevelRequirement; import sh.okx.rankup.requirements.requirement.mcmmo.McMMOSkillRequirement; +import sh.okx.rankup.requirements.requirement.mcmmo.McMMOSkillUtil; import java.io.File; import java.text.DecimalFormat; @@ -219,14 +219,16 @@ public class Rankup extends JavaPlugin { private void registerRequirements() { requirementRegistry = new RequirementRegistry(); - requirementRegistry.addRequirement(new MoneyRequirement(this)); + if (economy != null) { + requirementRegistry.addRequirement(new MoneyRequirement(this)); + } requirementRegistry.addRequirement(new XpLevelRequirement(this)); requirementRegistry.addRequirement(new PlaytimeMinutesRequirement(this)); requirementRegistry.addRequirement(new GroupRequirement(this)); requirementRegistry.addRequirement(new PermissionRequirement(this)); requirementRegistry.addRequirement(new PlaceholderRequirement(this)); if (Bukkit.getPluginManager().isPluginEnabled("mcMMO")) { - for (PrimarySkillType skill : PrimarySkillType.values()) { + for (String skill : McMMOSkillUtil.getInstance().getSkills()) { requirementRegistry.addRequirement(new McMMOSkillRequirement(this, skill)); } requirementRegistry.addRequirement(new McMMOPowerLevelRequirement(this)); diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/mcmmo/McMMOSkillRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/mcmmo/McMMOSkillRequirement.java index 9b809c9..a0bcd0c 100644 --- a/src/main/java/sh/okx/rankup/requirements/requirement/mcmmo/McMMOSkillRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/requirement/mcmmo/McMMOSkillRequirement.java @@ -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 diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/mcmmo/McMMOSkillUtil.java b/src/main/java/sh/okx/rankup/requirements/requirement/mcmmo/McMMOSkillUtil.java new file mode 100644 index 0000000..78237af --- /dev/null +++ b/src/main/java/sh/okx/rankup/requirements/requirement/mcmmo/McMMOSkillUtil.java @@ -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); + } + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 519def3..e137490 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: Rankup -version: 3.4 +version: 3.4.1 main: sh.okx.rankup.Rankup author: Okx depend: [Vault]