diff --git a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java index 0454fe821..e79152175 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatFileDatabaseManager.java @@ -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 primarySkillLevelMap = mmoDataSnapshot.getSkillLevelValues(); ImmutableMap primarySkillExperienceValueMap = mmoDataSnapshot.getSkillExperienceValues(); @@ -1267,7 +1270,7 @@ public final class FlatFileDatabaseManager extends AbstractDatabaseManager { EnumMap skillExperienceValueMap = new EnumMap(PrimarySkillType.class); // Skill & XP EnumMap skillAbilityDeactivationTimeStamp = new EnumMap(SuperAbilityType.class); // Ability & Cooldown EnumMap uniquePlayerDataMap = new EnumMap(UniqueDataType.class); - EnumMap xpBarStateMap = new EnumMap(PrimarySkillType.class); + EnumMap xpBarStateMap = new EnumMap(PrimarySkillType.class); // MobHealthBarType mobHealthbarType; int scoreboardTipsShown; diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index f4911f76f..776f39440 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -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 skillsXp = new EnumMap(PrimarySkillType.class); // Skill & XP EnumMap skillsDATS = new EnumMap(SuperAbilityType.class); // Ability & Cooldown EnumMap uniqueData = new EnumMap(UniqueDataType.class); //Chimaera wing cooldown and other misc info - EnumMap xpBarStateMap = new EnumMap(PrimarySkillType.class); + EnumMap xpBarStateMap = new EnumMap(PrimarySkillType.class); MobHealthBarType mobHealthbarType; UUID uuid; diff --git a/src/main/java/com/gmail/nossr50/datatypes/player/PersistentPlayerDataBuilder.java b/src/main/java/com/gmail/nossr50/datatypes/player/PersistentPlayerDataBuilder.java index 5b2b1640e..e41ce98bb 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/PersistentPlayerDataBuilder.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/PersistentPlayerDataBuilder.java @@ -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 skillExperienceValues; private @Nullable EnumMap abilityDeactivationTimestamps; // Ability & Cooldown private @Nullable EnumMap uniquePlayerData; //Misc data that doesn't fit into other categories (chimaera wing, etc..) - private @Nullable EnumMap barStateMap; + private @Nullable EnumMap 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 map) { - EnumMap barMapDefaults = MMOExperienceBarManager.generateDefaultBarStateMap(); + private void validateBarStateMapEntries(@NotNull EnumMap map) { + EnumMap 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 getBarStateMap() { + public @Nullable EnumMap getBarStateMap() { return barStateMap; } - public @NotNull PersistentPlayerDataBuilder setBarStateMap(@NotNull EnumMap barStateMap) { + public @NotNull PersistentPlayerDataBuilder setBarStateMap(@NotNull EnumMap barStateMap) { this.barStateMap = barStateMap; return this; } diff --git a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java index b605d613e..cac4445ab 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -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)) { diff --git a/src/main/resources/modified_skillranks.yml b/src/main/resources/modified_skillranks.yml new file mode 100644 index 000000000..c430dca6a --- /dev/null +++ b/src/main/resources/modified_skillranks.yml @@ -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 \ No newline at end of file