mirror of
				https://github.com/mcMMO-Dev/mcMMO.git
				synced 2025-11-04 02:53:43 +01:00 
			
		
		
		
	more API migration
This commit is contained in:
		@@ -15,7 +15,10 @@ import com.gmail.nossr50.util.experience.MMOExperienceBarManager;
 | 
			
		||||
import com.gmail.nossr50.util.skills.SkillUtils;
 | 
			
		||||
import com.gmail.nossr50.util.text.StringUtils;
 | 
			
		||||
import com.google.common.collect.ImmutableMap;
 | 
			
		||||
import com.neetgames.mcmmo.MobHealthBarType;
 | 
			
		||||
import com.neetgames.mcmmo.UniqueDataType;
 | 
			
		||||
import com.neetgames.mcmmo.exceptions.ProfileRetrievalException;
 | 
			
		||||
import com.neetgames.mcmmo.skill.SkillBossBarState;
 | 
			
		||||
import org.apache.commons.lang.NullArgumentException;
 | 
			
		||||
import org.bukkit.OfflinePlayer;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
@@ -321,7 +324,7 @@ public final class FlatFileDatabaseManager extends AbstractDatabaseManager {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void writeUserToLine(MMODataSnapshot mmoDataSnapshot, String playerName, UUID uuid, StringBuilder writer) {
 | 
			
		||||
    private void writeUserToLine(@NotNull MMODataSnapshot mmoDataSnapshot, @NotNull String playerName, @NotNull UUID uuid, @NotNull StringBuilder writer) {
 | 
			
		||||
        ImmutableMap<PrimarySkillType, Integer> primarySkillLevelMap = mmoDataSnapshot.getSkillLevelValues();
 | 
			
		||||
        ImmutableMap<PrimarySkillType, Float> primarySkillExperienceValueMap = mmoDataSnapshot.getSkillExperienceValues();
 | 
			
		||||
 | 
			
		||||
@@ -1267,7 +1270,7 @@ public final class FlatFileDatabaseManager extends AbstractDatabaseManager {
 | 
			
		||||
        EnumMap<PrimarySkillType, Float>     skillExperienceValueMap   = new EnumMap<PrimarySkillType, Float>(PrimarySkillType.class);     // Skill & XP
 | 
			
		||||
        EnumMap<SuperAbilityType, Integer> skillAbilityDeactivationTimeStamp = new EnumMap<SuperAbilityType, Integer>(SuperAbilityType.class); // Ability & Cooldown
 | 
			
		||||
        EnumMap<UniqueDataType, Integer> uniquePlayerDataMap = new EnumMap<UniqueDataType, Integer>(UniqueDataType.class);
 | 
			
		||||
        EnumMap<PrimarySkillType, MMOExperienceBarManager.BarState> xpBarStateMap = new EnumMap<PrimarySkillType, MMOExperienceBarManager.BarState>(PrimarySkillType.class);
 | 
			
		||||
        EnumMap<PrimarySkillType, SkillBossBarState> xpBarStateMap = new EnumMap<PrimarySkillType, SkillBossBarState>(PrimarySkillType.class);
 | 
			
		||||
//        MobHealthBarType mobHealthbarType;
 | 
			
		||||
        int scoreboardTipsShown;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,5 @@
 | 
			
		||||
package com.gmail.nossr50.database;
 | 
			
		||||
 | 
			
		||||
import com.gmail.nossr50.api.exceptions.InvalidSkillException;
 | 
			
		||||
import com.gmail.nossr50.api.exceptions.ProfileRetrievalException;
 | 
			
		||||
import com.gmail.nossr50.config.Config;
 | 
			
		||||
import com.gmail.nossr50.datatypes.database.DatabaseType;
 | 
			
		||||
import com.gmail.nossr50.datatypes.database.PlayerStat;
 | 
			
		||||
@@ -12,10 +10,12 @@ import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
 | 
			
		||||
import com.gmail.nossr50.mcMMO;
 | 
			
		||||
import com.gmail.nossr50.runnables.database.UUIDUpdateAsyncTask;
 | 
			
		||||
import com.gmail.nossr50.util.Misc;
 | 
			
		||||
import com.gmail.nossr50.util.experience.MMOExperienceBarManager;
 | 
			
		||||
import com.gmail.nossr50.util.skills.SkillUtils;
 | 
			
		||||
import com.neetgames.mcmmo.MobHealthBarType;
 | 
			
		||||
import com.neetgames.mcmmo.UniqueDataType;
 | 
			
		||||
import com.neetgames.mcmmo.exceptions.InvalidSkillException;
 | 
			
		||||
import com.neetgames.mcmmo.exceptions.ProfileRetrievalException;
 | 
			
		||||
import com.neetgames.mcmmo.skill.SkillBossBarState;
 | 
			
		||||
import org.apache.commons.lang.NullArgumentException;
 | 
			
		||||
import org.apache.tomcat.jdbc.pool.DataSource;
 | 
			
		||||
import org.apache.tomcat.jdbc.pool.PoolProperties;
 | 
			
		||||
@@ -1193,7 +1193,7 @@ public final class SQLDatabaseManager extends AbstractDatabaseManager {
 | 
			
		||||
        EnumMap<PrimarySkillType, Float> skillsXp = new EnumMap<PrimarySkillType, Float>(PrimarySkillType.class); // Skill & XP
 | 
			
		||||
        EnumMap<SuperAbilityType, Integer> skillsDATS = new EnumMap<SuperAbilityType, Integer>(SuperAbilityType.class); // Ability & Cooldown
 | 
			
		||||
        EnumMap<UniqueDataType, Integer> uniqueData = new EnumMap<UniqueDataType, Integer>(UniqueDataType.class); //Chimaera wing cooldown and other misc info
 | 
			
		||||
        EnumMap<PrimarySkillType, MMOExperienceBarManager.BarState> xpBarStateMap = new EnumMap<PrimarySkillType, MMOExperienceBarManager.BarState>(PrimarySkillType.class);
 | 
			
		||||
        EnumMap<PrimarySkillType, SkillBossBarState> xpBarStateMap = new EnumMap<PrimarySkillType, SkillBossBarState>(PrimarySkillType.class);
 | 
			
		||||
 | 
			
		||||
        MobHealthBarType mobHealthbarType;
 | 
			
		||||
        UUID uuid;
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,9 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 | 
			
		||||
import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
 | 
			
		||||
import com.gmail.nossr50.mcMMO;
 | 
			
		||||
import com.gmail.nossr50.util.experience.MMOExperienceBarManager;
 | 
			
		||||
import com.neetgames.mcmmo.MobHealthBarType;
 | 
			
		||||
import com.neetgames.mcmmo.UniqueDataType;
 | 
			
		||||
import com.neetgames.mcmmo.skill.SkillBossBarState;
 | 
			
		||||
import org.apache.commons.lang.NullArgumentException;
 | 
			
		||||
import org.bukkit.OfflinePlayer;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
@@ -30,7 +33,7 @@ public class PersistentPlayerDataBuilder {
 | 
			
		||||
    private @Nullable EnumMap<PrimarySkillType, Float> skillExperienceValues;
 | 
			
		||||
    private @Nullable EnumMap<SuperAbilityType, Integer> abilityDeactivationTimestamps; // Ability & Cooldown
 | 
			
		||||
    private @Nullable EnumMap<UniqueDataType, Integer> uniquePlayerData; //Misc data that doesn't fit into other categories (chimaera wing, etc..)
 | 
			
		||||
    private @Nullable EnumMap<PrimarySkillType, MMOExperienceBarManager.BarState> barStateMap;
 | 
			
		||||
    private @Nullable EnumMap<PrimarySkillType, SkillBossBarState> barStateMap;
 | 
			
		||||
 | 
			
		||||
    /* Special Flags */
 | 
			
		||||
    private boolean partyChatSpying;
 | 
			
		||||
@@ -99,8 +102,8 @@ public class PersistentPlayerDataBuilder {
 | 
			
		||||
        return new PersistentPlayerData(playerUUID, playerName, partyChatSpying, skillLevelValues, skillExperienceValues, abilityDeactivationTimestamps, uniquePlayerData, barStateMap, scoreboardTipsShown, mobHealthBarType, lastLogin, leaderBoardExemption);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void validateBarStateMapEntries(@NotNull EnumMap<PrimarySkillType, MMOExperienceBarManager.BarState> map) {
 | 
			
		||||
        EnumMap<PrimarySkillType, MMOExperienceBarManager.BarState> barMapDefaults = MMOExperienceBarManager.generateDefaultBarStateMap();
 | 
			
		||||
    private void validateBarStateMapEntries(@NotNull EnumMap<PrimarySkillType, SkillBossBarState> map) {
 | 
			
		||||
        EnumMap<PrimarySkillType, SkillBossBarState> barMapDefaults = MMOExperienceBarManager.generateDefaultBarStateMap();
 | 
			
		||||
        
 | 
			
		||||
        for(PrimarySkillType primarySkillType : PrimarySkillType.values()) {
 | 
			
		||||
            map.putIfAbsent(primarySkillType, barMapDefaults.get(primarySkillType));
 | 
			
		||||
@@ -223,11 +226,11 @@ public class PersistentPlayerDataBuilder {
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public @Nullable EnumMap<PrimarySkillType, MMOExperienceBarManager.BarState> getBarStateMap() {
 | 
			
		||||
    public @Nullable EnumMap<PrimarySkillType, SkillBossBarState> getBarStateMap() {
 | 
			
		||||
        return barStateMap;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public @NotNull PersistentPlayerDataBuilder setBarStateMap(@NotNull EnumMap<PrimarySkillType, MMOExperienceBarManager.BarState> barStateMap) {
 | 
			
		||||
    public @NotNull PersistentPlayerDataBuilder setBarStateMap(@NotNull EnumMap<PrimarySkillType, SkillBossBarState> barStateMap) {
 | 
			
		||||
        this.barStateMap = barStateMap;
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,8 @@ import com.gmail.nossr50.util.compat.layers.persistentdata.AbstractPersistentDat
 | 
			
		||||
import com.gmail.nossr50.util.experience.MMOExperienceBarManager;
 | 
			
		||||
import com.gmail.nossr50.util.player.NotificationManager;
 | 
			
		||||
import com.gmail.nossr50.util.text.StringUtils;
 | 
			
		||||
import com.neetgames.mcmmo.exceptions.UnexpectedValueException;
 | 
			
		||||
import com.neetgames.mcmmo.skill.SkillBossBarState;
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.Location;
 | 
			
		||||
import org.bukkit.Material;
 | 
			
		||||
@@ -42,30 +44,30 @@ public final class SkillUtils {
 | 
			
		||||
     */
 | 
			
		||||
    private SkillUtils() {}
 | 
			
		||||
 | 
			
		||||
    public static void applyXpGain(McMMOPlayer mmoPlayer, PrimarySkillType primarySkillType, float xp, XPGainReason xpGainReason) {
 | 
			
		||||
    public static void applyXpGain(@NotNull McMMOPlayer mmoPlayer, @NotNull PrimarySkillType primarySkillType, float xp, @NotNull XPGainReason xpGainReason) {
 | 
			
		||||
        mmoPlayer.getExperienceManager().beginXpGain(mmoPlayer.getPlayer(), primarySkillType, xp, xpGainReason, XPGainSource.SELF);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void applyXpGain(McMMOPlayer mmoPlayer, PrimarySkillType primarySkillType, float xp, XPGainReason xpGainReason, XPGainSource xpGainSource) {
 | 
			
		||||
    public static void applyXpGain(@NotNull McMMOPlayer mmoPlayer, @NotNull PrimarySkillType primarySkillType, float xp, @NotNull XPGainReason xpGainReason, @NotNull XPGainSource xpGainSource) {
 | 
			
		||||
        mmoPlayer.getExperienceManager().beginXpGain(mmoPlayer.getPlayer(), primarySkillType, xp, xpGainReason, xpGainSource);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static MMOExperienceBarManager.BarState asBarState(String str) {
 | 
			
		||||
        for(MMOExperienceBarManager.BarState barState : MMOExperienceBarManager.BarState.values()) {
 | 
			
		||||
    public static @NotNull SkillBossBarState asBarState(String str) {
 | 
			
		||||
        for(SkillBossBarState barState : SkillBossBarState.values()) {
 | 
			
		||||
            if(barState.toString().equalsIgnoreCase(str)) {
 | 
			
		||||
                return barState;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        mcMMO.p.getLogger().severe("Unable to read bar state for value " + str + " setting to default instead.");
 | 
			
		||||
        return MMOExperienceBarManager.BarState.NORMAL;
 | 
			
		||||
        return SkillBossBarState.NORMAL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Skill Stat Calculations
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
    public static String[] calculateLengthDisplayValues(Player player, float skillValue, PrimarySkillType skill) {
 | 
			
		||||
    public static @NotNull String[] calculateLengthDisplayValues(@NotNull McMMOPlayer mmoPlayer, float skillValue, @NotNull PrimarySkillType skill) {
 | 
			
		||||
        int maxLength = skill.getSuperAbilityType().getMaxLength();
 | 
			
		||||
        int abilityLengthVar = AdvancedConfig.getInstance().getAbilityLength();
 | 
			
		||||
        int abilityLengthCap = AdvancedConfig.getInstance().getAbilityLengthCap();
 | 
			
		||||
@@ -79,7 +81,7 @@ public final class SkillUtils {
 | 
			
		||||
            length = 2 + (int) (skillValue / abilityLengthVar);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        int enduranceLength = PerksUtils.handleActivationPerks(player, length, maxLength);
 | 
			
		||||
        int enduranceLength = PerksUtils.handleActivationPerks(mmoPlayer.getPlayer(), length, maxLength);
 | 
			
		||||
 | 
			
		||||
        if (maxLength != 0) {
 | 
			
		||||
            length = Math.min(length, maxLength);
 | 
			
		||||
@@ -92,10 +94,10 @@ public final class SkillUtils {
 | 
			
		||||
     * Others
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
    public static int handleFoodSkills(Player player, int eventFoodLevel, SubSkillType subSkillType) {
 | 
			
		||||
        int curRank = RankUtils.getRank(player, subSkillType);
 | 
			
		||||
    public static int handleFoodSkills(@NotNull McMMOPlayer mmoPlayer, int eventFoodLevel, @NotNull SubSkillType subSkillType) {
 | 
			
		||||
        int curRank = RankUtils.getRank(mmoPlayer, subSkillType);
 | 
			
		||||
 | 
			
		||||
        int currentFoodLevel = player.getFoodLevel();
 | 
			
		||||
        int currentFoodLevel = mmoPlayer.getPlayer().getFoodLevel();
 | 
			
		||||
        int foodChange = eventFoodLevel - currentFoodLevel;
 | 
			
		||||
 | 
			
		||||
        foodChange+=curRank;
 | 
			
		||||
@@ -108,12 +110,12 @@ public final class SkillUtils {
 | 
			
		||||
     *
 | 
			
		||||
     * @param deactivatedTimeStamp Time of deactivation
 | 
			
		||||
     * @param cooldown The length of the cooldown
 | 
			
		||||
     * @param player The Player to check for cooldown perks
 | 
			
		||||
     * @param mmoPlayer The Player to check for cooldown perks
 | 
			
		||||
     *
 | 
			
		||||
     * @return the number of seconds remaining before the cooldown expires
 | 
			
		||||
     */
 | 
			
		||||
    public static int calculateTimeLeft(long deactivatedTimeStamp, int cooldown, Player player) {
 | 
			
		||||
        return (int) (((deactivatedTimeStamp + (PerksUtils.handleCooldownPerks(player, cooldown) * Misc.TIME_CONVERSION_FACTOR)) - System.currentTimeMillis()) / Misc.TIME_CONVERSION_FACTOR);
 | 
			
		||||
    public static int calculateTimeLeft(long deactivatedTimeStamp, int cooldown, @NotNull McMMOPlayer mmoPlayer) {
 | 
			
		||||
        return (int) (((deactivatedTimeStamp + (PerksUtils.handleCooldownPerks(mmoPlayer.getPlayer(), cooldown) * Misc.TIME_CONVERSION_FACTOR)) - System.currentTimeMillis()) / Misc.TIME_CONVERSION_FACTOR);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -135,11 +137,11 @@ public final class SkillUtils {
 | 
			
		||||
     * @param skillName The name of the skill to check
 | 
			
		||||
     * @return true if this is a valid skill, false otherwise
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean isSkill(String skillName) {
 | 
			
		||||
    public static boolean isSkill(@NotNull String skillName) {
 | 
			
		||||
        return Config.getInstance().getLocale().equalsIgnoreCase("en_US") ? PrimarySkillType.getSkill(skillName) != null : isLocalizedSkill(skillName);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void sendSkillMessage(Player player, NotificationType notificationType, String key) {
 | 
			
		||||
    public static void sendSkillMessage(@NotNull Player player, @NotNull NotificationType notificationType, @NotNull String key) {
 | 
			
		||||
        Location location = player.getLocation();
 | 
			
		||||
 | 
			
		||||
        for (Player otherPlayer : player.getWorld().getPlayers()) {
 | 
			
		||||
@@ -149,7 +151,7 @@ public final class SkillUtils {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void handleAbilitySpeedIncrease(Player player) {
 | 
			
		||||
    public static void handleAbilitySpeedIncrease(@NotNull Player player) {
 | 
			
		||||
        if (HiddenConfig.getInstance().useEnchantmentBuffs()) {
 | 
			
		||||
            ItemStack heldItem = player.getInventory().getItemInMainHand();
 | 
			
		||||
 | 
			
		||||
@@ -245,7 +247,7 @@ public final class SkillUtils {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void handleDurabilityChange(ItemStack itemStack, int durabilityModifier) {
 | 
			
		||||
    public static void handleDurabilityChange(@NotNull ItemStack itemStack, int durabilityModifier) {
 | 
			
		||||
        handleDurabilityChange(itemStack, durabilityModifier, 1.0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -256,7 +258,7 @@ public final class SkillUtils {
 | 
			
		||||
     * @param durabilityModifier the amount to modify the durability by
 | 
			
		||||
     * @param maxDamageModifier the amount to adjust the max damage by
 | 
			
		||||
     */
 | 
			
		||||
    public static void handleDurabilityChange(ItemStack itemStack, double durabilityModifier, double maxDamageModifier) {
 | 
			
		||||
    public static void handleDurabilityChange(@NotNull ItemStack itemStack, double durabilityModifier, double maxDamageModifier) {
 | 
			
		||||
        if(itemStack.getItemMeta() != null && itemStack.getItemMeta().isUnbreakable()) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
@@ -278,8 +280,7 @@ public final class SkillUtils {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
    public static Material getRepairAndSalvageItem(@NotNull ItemStack inHand) {
 | 
			
		||||
    public static @Nullable Material getRepairAndSalvageItem(@NotNull ItemStack inHand) {
 | 
			
		||||
        if (ItemUtils.isDiamondTool(inHand) || ItemUtils.isDiamondArmor(inHand)) {
 | 
			
		||||
            return Material.DIAMOND;
 | 
			
		||||
        }
 | 
			
		||||
@@ -306,11 +307,16 @@ public final class SkillUtils {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static int getRepairAndSalvageQuantities(ItemStack item) {
 | 
			
		||||
    public static int getRepairAndSalvageQuantities(@NotNull ItemStack item) {
 | 
			
		||||
        if(getRepairAndSalvageItem(item) == null) {
 | 
			
		||||
            mcMMO.p.getLogger().severe("No value defined for item "+item.toString()+" in getRepairAndSalvageItem()");
 | 
			
		||||
            throw new UnexpectedValueException();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return getRepairAndSalvageQuantities(item.getType(), getRepairAndSalvageItem(item));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static int getRepairAndSalvageQuantities(Material itemMaterial, Material recipeMaterial) {
 | 
			
		||||
    public static int getRepairAndSalvageQuantities(@NotNull Material itemMaterial, @NotNull Material recipeMaterial) {
 | 
			
		||||
        int quantity = 0;
 | 
			
		||||
 | 
			
		||||
        if(mcMMO.getMaterialMapStore().isNetheriteTool(itemMaterial) || mcMMO.getMaterialMapStore().isNetheriteArmor(itemMaterial)) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										329
									
								
								src/main/resources/modified_skillranks.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										329
									
								
								src/main/resources/modified_skillranks.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,329 @@
 | 
			
		||||
# This file defines the rank level requirements for a subskill.
 | 
			
		||||
# You cannot alter how many ranks a skill has, that is coded into mcMMO directly.
 | 
			
		||||
# You can however, change when they unlock, if you make all ranks of a skill level 0 for example every player will have the most powerful version of that skill right away.
 | 
			
		||||
# Retro Mode and Standard have separate config settings to make it easier for server owners to understand the difference between the two.
 | 
			
		||||
# Retro Mode is setup to be an entirely cosmetic change, keeping the old 0-1000 feeling of mcMMO.
 | 
			
		||||
# Retro Mode has 10x faster leveling and 10x higher skill requirements, if you do the math you can see its the same as Standard and only cosmetic!.
 | 
			
		||||
###
 | 
			
		||||
Alchemy:
 | 
			
		||||
    Catalysis:
 | 
			
		||||
        Rank_1: 0
 | 
			
		||||
    Concoctions:
 | 
			
		||||
        Rank_1: 0
 | 
			
		||||
        Rank_2: 100
 | 
			
		||||
        Rank_3: 200
 | 
			
		||||
        Rank_4: 350
 | 
			
		||||
        Rank_5: 500
 | 
			
		||||
        Rank_6: 750
 | 
			
		||||
        Rank_7: 900
 | 
			
		||||
        Rank_8: 1000
 | 
			
		||||
Archery:
 | 
			
		||||
    ArcheryLimitBreak:
 | 
			
		||||
        Rank_1: 100
 | 
			
		||||
        Rank_2: 200
 | 
			
		||||
        Rank_3: 300
 | 
			
		||||
        Rank_4: 400
 | 
			
		||||
        Rank_5: 500
 | 
			
		||||
        Rank_6: 600
 | 
			
		||||
        Rank_7: 700
 | 
			
		||||
        Rank_8: 800
 | 
			
		||||
        Rank_9: 900
 | 
			
		||||
        Rank_10: 1000
 | 
			
		||||
    ArrowRetrieval:
 | 
			
		||||
        Rank_1: 1
 | 
			
		||||
    SkillShot:
 | 
			
		||||
        Rank_1: 1
 | 
			
		||||
        Rank_2: 100
 | 
			
		||||
        Rank_3: 150
 | 
			
		||||
        Rank_4: 200
 | 
			
		||||
        Rank_5: 250
 | 
			
		||||
        Rank_6: 300
 | 
			
		||||
        Rank_7: 350
 | 
			
		||||
        Rank_8: 400
 | 
			
		||||
        Rank_9: 450
 | 
			
		||||
        Rank_10: 500
 | 
			
		||||
        Rank_11: 550
 | 
			
		||||
        Rank_12: 600
 | 
			
		||||
        Rank_13: 650
 | 
			
		||||
        Rank_14: 700
 | 
			
		||||
        Rank_15: 750
 | 
			
		||||
        Rank_16: 800
 | 
			
		||||
        Rank_17: 850
 | 
			
		||||
        Rank_18: 900
 | 
			
		||||
        Rank_19: 950
 | 
			
		||||
        Rank_20: 1000
 | 
			
		||||
Acrobatics:
 | 
			
		||||
    Dodge:
 | 
			
		||||
        Rank_1: 1
 | 
			
		||||
Axes:
 | 
			
		||||
    AxesLimitBreak:
 | 
			
		||||
        Rank_1: 100
 | 
			
		||||
        Rank_2: 200
 | 
			
		||||
        Rank_3: 300
 | 
			
		||||
        Rank_4: 400
 | 
			
		||||
        Rank_5: 500
 | 
			
		||||
        Rank_6: 600
 | 
			
		||||
        Rank_7: 700
 | 
			
		||||
        Rank_8: 800
 | 
			
		||||
        Rank_9: 900
 | 
			
		||||
        Rank_10: 1000
 | 
			
		||||
    SkullSplitter:
 | 
			
		||||
        Rank_1: 50
 | 
			
		||||
    CriticalStrikes:
 | 
			
		||||
        Rank_1: 1
 | 
			
		||||
    GreaterImpact:
 | 
			
		||||
        Rank_1: 250
 | 
			
		||||
    ArmorImpact:
 | 
			
		||||
        Rank_1: 1
 | 
			
		||||
        Rank_2: 100
 | 
			
		||||
        Rank_3: 150
 | 
			
		||||
        Rank_4: 200
 | 
			
		||||
        Rank_5: 250
 | 
			
		||||
        Rank_6: 300
 | 
			
		||||
        Rank_7: 350
 | 
			
		||||
        Rank_8: 400
 | 
			
		||||
        Rank_9: 450
 | 
			
		||||
        Rank_10: 500
 | 
			
		||||
        Rank_11: 550
 | 
			
		||||
        Rank_12: 600
 | 
			
		||||
        Rank_13: 650
 | 
			
		||||
        Rank_14: 700
 | 
			
		||||
        Rank_15: 750
 | 
			
		||||
        Rank_16: 800
 | 
			
		||||
        Rank_17: 850
 | 
			
		||||
        Rank_18: 900
 | 
			
		||||
        Rank_19: 950
 | 
			
		||||
        Rank_20: 1000
 | 
			
		||||
    AxeMastery:
 | 
			
		||||
        Rank_1: 50
 | 
			
		||||
        Rank_2: 100
 | 
			
		||||
        Rank_3: 150
 | 
			
		||||
        Rank_4: 200
 | 
			
		||||
Taming:
 | 
			
		||||
    Rank_1: 1
 | 
			
		||||
    Gore:
 | 
			
		||||
        Rank_1: 150
 | 
			
		||||
    CallOfTheWild:
 | 
			
		||||
        Rank_1: 1
 | 
			
		||||
    Pummel:
 | 
			
		||||
        Rank_1: 200
 | 
			
		||||
    FastFoodService:
 | 
			
		||||
        Rank_1: 200
 | 
			
		||||
    EnvironmentallyAware:
 | 
			
		||||
        Rank_1: 100
 | 
			
		||||
    ThickFur:
 | 
			
		||||
        Rank_1: 250
 | 
			
		||||
    HolyHound:
 | 
			
		||||
        Rank_1: 350
 | 
			
		||||
    ShockProof:
 | 
			
		||||
        Rank_1: 500
 | 
			
		||||
    SharpenedClaws:
 | 
			
		||||
        Rank_1: 750
 | 
			
		||||
Smelting:
 | 
			
		||||
    FuelEfficiency:
 | 
			
		||||
        Rank_1: 100
 | 
			
		||||
        Rank_2: 500
 | 
			
		||||
        Rank_3: 750
 | 
			
		||||
    UnderstandingTheArt:
 | 
			
		||||
        Rank_1: 100
 | 
			
		||||
        Rank_2: 250
 | 
			
		||||
        Rank_3: 350
 | 
			
		||||
        Rank_4: 500
 | 
			
		||||
        Rank_5: 650
 | 
			
		||||
        Rank_6: 750
 | 
			
		||||
        Rank_7: 850
 | 
			
		||||
        Rank_8: 1000
 | 
			
		||||
Salvage:
 | 
			
		||||
    ScrapCollector:
 | 
			
		||||
        Rank_1: 1
 | 
			
		||||
        Rank_2: 100
 | 
			
		||||
        Rank_3: 150
 | 
			
		||||
        Rank_4: 200
 | 
			
		||||
        Rank_5: 250
 | 
			
		||||
        Rank_6: 300
 | 
			
		||||
        Rank_7: 350
 | 
			
		||||
        Rank_8: 400
 | 
			
		||||
    ArcaneSalvage:
 | 
			
		||||
        Rank_1: 100
 | 
			
		||||
        Rank_2: 250
 | 
			
		||||
        Rank_3: 350
 | 
			
		||||
        Rank_4: 500
 | 
			
		||||
        Rank_5: 650
 | 
			
		||||
        Rank_6: 750
 | 
			
		||||
        Rank_7: 850
 | 
			
		||||
        Rank_8: 1000
 | 
			
		||||
Mining:
 | 
			
		||||
    DoubleDrops:
 | 
			
		||||
        Rank_1: 1
 | 
			
		||||
    SuperBreaker:
 | 
			
		||||
        Rank_1: 50
 | 
			
		||||
    # For now make sure rank 1 is the same as blast mining rank 1, it's a bit hacky, I'll fix it later
 | 
			
		||||
    BiggerBombs:
 | 
			
		||||
        Rank_1: 100
 | 
			
		||||
    # For now make sure rank 1 is the same as blast mining rank 1, it's a bit hacky, I'll fix it later
 | 
			
		||||
    DemolitionsExpertise:
 | 
			
		||||
        Rank_1: 100
 | 
			
		||||
    BlastMining:
 | 
			
		||||
        Rank_1: 100
 | 
			
		||||
        Rank_2: 250
 | 
			
		||||
        Rank_3: 350
 | 
			
		||||
        Rank_4: 500
 | 
			
		||||
        Rank_5: 650
 | 
			
		||||
        Rank_6: 750
 | 
			
		||||
        Rank_7: 850
 | 
			
		||||
        Rank_8: 1000
 | 
			
		||||
Herbalism:
 | 
			
		||||
    DoubleDrops:
 | 
			
		||||
        Rank_1: 1
 | 
			
		||||
    GreenTerra:
 | 
			
		||||
        Rank_1: 50
 | 
			
		||||
    GreenThumb:
 | 
			
		||||
        Rank_1: 250
 | 
			
		||||
        Rank_2: 500
 | 
			
		||||
        Rank_3: 750
 | 
			
		||||
        Rank_4: 1000
 | 
			
		||||
    FarmersDiet:
 | 
			
		||||
        Rank_1: 200
 | 
			
		||||
        Rank_2: 400
 | 
			
		||||
        Rank_3: 600
 | 
			
		||||
        Rank_4: 800
 | 
			
		||||
        Rank_5: 1000
 | 
			
		||||
Fishing:
 | 
			
		||||
    MagicHunter:
 | 
			
		||||
        Rank_1: 200
 | 
			
		||||
    Shake:
 | 
			
		||||
        Rank_1: 150
 | 
			
		||||
    MasterAngler:
 | 
			
		||||
        Rank_1: 1
 | 
			
		||||
        Rank_2: 200
 | 
			
		||||
        Rank_3: 300
 | 
			
		||||
        Rank_4: 400
 | 
			
		||||
        Rank_5: 600
 | 
			
		||||
        Rank_6: 700
 | 
			
		||||
        Rank_7: 800
 | 
			
		||||
        Rank_8: 900
 | 
			
		||||
    IceFishing:
 | 
			
		||||
        Rank_1: 50
 | 
			
		||||
    FishermansDiet:
 | 
			
		||||
        Rank_1: 200
 | 
			
		||||
        Rank_2: 400
 | 
			
		||||
        Rank_3: 600
 | 
			
		||||
        Rank_4: 800
 | 
			
		||||
        Rank_5: 1000
 | 
			
		||||
    TreasureHunter:
 | 
			
		||||
        Rank_1: 1
 | 
			
		||||
        Rank_2: 250
 | 
			
		||||
        Rank_3: 350
 | 
			
		||||
        Rank_4: 500
 | 
			
		||||
        Rank_5: 650
 | 
			
		||||
        Rank_6: 750
 | 
			
		||||
        Rank_7: 850
 | 
			
		||||
        Rank_8: 1000
 | 
			
		||||
Swords:
 | 
			
		||||
    SwordsLimitBreak:
 | 
			
		||||
        Rank_1: 100
 | 
			
		||||
        Rank_2: 200
 | 
			
		||||
        Rank_3: 300
 | 
			
		||||
        Rank_4: 400
 | 
			
		||||
        Rank_5: 500
 | 
			
		||||
        Rank_6: 600
 | 
			
		||||
        Rank_7: 700
 | 
			
		||||
        Rank_8: 800
 | 
			
		||||
        Rank_9: 900
 | 
			
		||||
        Rank_10: 1000
 | 
			
		||||
    Stab:
 | 
			
		||||
        Rank_1: 750
 | 
			
		||||
        Rank_2: 1000
 | 
			
		||||
    CounterAttack:
 | 
			
		||||
        Rank_1: 200
 | 
			
		||||
    Rupture:
 | 
			
		||||
        Rank_1: 1
 | 
			
		||||
        Rank_2: 150
 | 
			
		||||
        Rank_3: 750
 | 
			
		||||
        Rank_4: 900
 | 
			
		||||
    SerratedStrikes:
 | 
			
		||||
        Rank_1: 50
 | 
			
		||||
Unarmed:
 | 
			
		||||
    UnarmedLimitBreak:
 | 
			
		||||
        Rank_1: 100
 | 
			
		||||
        Rank_2: 200
 | 
			
		||||
        Rank_3: 300
 | 
			
		||||
        Rank_4: 400
 | 
			
		||||
        Rank_5: 500
 | 
			
		||||
        Rank_6: 600
 | 
			
		||||
        Rank_7: 700
 | 
			
		||||
        Rank_8: 800
 | 
			
		||||
        Rank_9: 900
 | 
			
		||||
        Rank_10: 1000
 | 
			
		||||
    Berserk:
 | 
			
		||||
        Rank_1: 50
 | 
			
		||||
    ArrowDeflect:
 | 
			
		||||
        Rank_1: 200
 | 
			
		||||
    Disarm:
 | 
			
		||||
        Rank_1: 250
 | 
			
		||||
    IronGrip:
 | 
			
		||||
        Rank_1: 600
 | 
			
		||||
    SteelArmStyle:
 | 
			
		||||
        Rank_1: 1
 | 
			
		||||
        Rank_2: 100
 | 
			
		||||
        Rank_3: 150
 | 
			
		||||
        Rank_4: 200
 | 
			
		||||
        Rank_5: 250
 | 
			
		||||
        Rank_6: 300
 | 
			
		||||
        Rank_7: 350
 | 
			
		||||
        Rank_8: 400
 | 
			
		||||
        Rank_9: 450
 | 
			
		||||
        Rank_10: 500
 | 
			
		||||
        Rank_11: 550
 | 
			
		||||
        Rank_12: 600
 | 
			
		||||
        Rank_13: 650
 | 
			
		||||
        Rank_14: 700
 | 
			
		||||
        Rank_15: 750
 | 
			
		||||
        Rank_16: 800
 | 
			
		||||
        Rank_17: 850
 | 
			
		||||
        Rank_18: 900
 | 
			
		||||
        Rank_19: 950
 | 
			
		||||
        Rank_20: 1000
 | 
			
		||||
 | 
			
		||||
Woodcutting:
 | 
			
		||||
    TreeFeller:
 | 
			
		||||
        Rank_1: 50
 | 
			
		||||
        Rank_2: 250
 | 
			
		||||
        Rank_3: 500
 | 
			
		||||
        Rank_4: 750
 | 
			
		||||
        Rank_5: 1000
 | 
			
		||||
    HarvestLumber:
 | 
			
		||||
        Rank_1: 1
 | 
			
		||||
    KnockOnWood:
 | 
			
		||||
        Rank_1: 300
 | 
			
		||||
        Rank_2: 600
 | 
			
		||||
    LeafBlower:
 | 
			
		||||
        Rank_1: 150
 | 
			
		||||
        Rank_2: 350
 | 
			
		||||
        Rank_3: 650
 | 
			
		||||
Excavation:
 | 
			
		||||
    GigaDrillBreaker:
 | 
			
		||||
        Rank_1: 50
 | 
			
		||||
    Archaeology:
 | 
			
		||||
        Rank_1: 1
 | 
			
		||||
        Rank_2: 250
 | 
			
		||||
        Rank_3: 350
 | 
			
		||||
        Rank_4: 500
 | 
			
		||||
        Rank_5: 650
 | 
			
		||||
        Rank_6: 750
 | 
			
		||||
        Rank_7: 850
 | 
			
		||||
        Rank_8: 1000
 | 
			
		||||
Repair:
 | 
			
		||||
    RepairMastery:
 | 
			
		||||
        Rank_1: 1
 | 
			
		||||
    SuperRepair:
 | 
			
		||||
        Rank_1: 400
 | 
			
		||||
    ArcaneForging:
 | 
			
		||||
        Rank_1: 100
 | 
			
		||||
        Rank_2: 250
 | 
			
		||||
        Rank_3: 350
 | 
			
		||||
        Rank_4: 500
 | 
			
		||||
        Rank_5: 650
 | 
			
		||||
        Rank_6: 750
 | 
			
		||||
        Rank_7: 850
 | 
			
		||||
        Rank_8: 1000
 | 
			
		||||
		Reference in New Issue
	
	Block a user