diff --git a/Changelog.txt b/Changelog.txt index 359ece921..633dcd1b5 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -5,6 +5,8 @@ Version 2.2.0 !!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!! mcMMO's config system has been rewritten + Retro and Standard mode have been removed, now levels are based around 1-1000 and are changed based on a new setting + Added Cosmetic Level Scaling setting to the leveling config, you can use this to for example, make the max level 100 instead of 1000 mcMMO build management is now handled by Gradle (KTS) instead of Maven Nearly every config setting has been renamed and most have brand new comments You can now add an unlimited number of custom XP perks with custom defined XP boosts @@ -201,6 +203,22 @@ Version 2.2.0 Added API method to check if a skill was being level capped Added 'UndefinedSkillBehaviour' for trying to use a method that has no behaviour defined for the provided skill +Version 2.1.114 + Fix some more locale usages, should aim to further prevent issues with oddball locales + Fixed a bug where newer versions of MySQL did not like our rank command + Added a new setting to turn off the Snow Golem Exploit prevention to experience.yml next to the other exploit fixes + Fixed a bug which stopped the optional Endermite XP exploit fix from working + +Version 2.1.113 + Activating Berserk on a soft block (glass, snow, dirts) will break that material right away instead of only breaking subsequent blocks hit by the player + Berserk will now break glass and glass pane blocks + Hitting glass with berserk readied will activate it + Added GLASS settings to sounds.yml for Berserk + Fixed bug where BlockCracker didn't work on infested_stone_bricks + Fixed a bug where beacons could be duplicated + Check player's PTP world permissions before executing a party teleport + Improved how mcMMO handles randomness + Version 2.1.112 Correct locale usage for enum access, now enforces using the english locale to prevent issues with oddball locales for configs/commands Fixed a NPE that can occur if a player engages in combat with specific skills before their profile is loaded diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpCommand.java b/mcmmo-core/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpCommand.java index d1d69d34a..16c6a3ba0 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpCommand.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpCommand.java @@ -7,7 +7,6 @@ import com.gmail.nossr50.datatypes.party.PartyTeleportRecord; import com.gmail.nossr50.datatypes.player.BukkitMMOPlayer; import com.gmail.nossr50.mcMMO; import com.google.common.collect.ImmutableList; - import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java b/mcmmo-core/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java index 58d9a93f4..4ab82cace 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java @@ -19,6 +19,7 @@ import org.bukkit.entity.Player; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.Set; public abstract class SkillCommand implements TabExecutor { @@ -131,7 +132,7 @@ public abstract class SkillCommand implements TabExecutor { } } - player.sendMessage(pluginRef.getLocaleManager().getString("Guides.Available", skillName, skillName.toLowerCase())); + player.sendMessage(pluginRef.getLocaleManager().getString("Guides.Available", skillName, skillName.toLowerCase(Locale.ENGLISH))); } private void sendSkillCommandHeader(Player player, BukkitMMOPlayer mcMMOPlayer, int skillValue) { diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/ConfigManager.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/ConfigManager.java index 0bbedea78..5dbf72d81 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/ConfigManager.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/ConfigManager.java @@ -51,7 +51,6 @@ import com.gmail.nossr50.datatypes.experience.FormulaType; import com.gmail.nossr50.datatypes.party.PartyFeature; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.properties.DamageProperty; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import com.gmail.nossr50.datatypes.skills.subskills.taming.CallOfTheWildType; import com.gmail.nossr50.datatypes.skills.subskills.taming.TamingSummon; import com.gmail.nossr50.mcMMO; @@ -266,7 +265,6 @@ public final class ConfigManager { customSerializers.registerType(TypeToken.of(CustomXPPerk.class), new CustomXPPerkSerializer()); customSerializers.registerType(TypeToken.of(DamageProperty.class), new DamagePropertySerializer()); customSerializers.registerType(TypeToken.of(SkillRankProperty.class), new SkillRankPropertySerializer()); - customSerializers.registerType(TypeToken.of(MaxBonusLevel.class), new MaxBonusLevelSerializer()); customSerializers.registerType(TypeToken.of(PlayerNotificationSettings.class), new PlayerNotificationSerializer()); customSerializers.registerType(TypeToken.of(SoundSetting.class), new SoundSettingSerializer()); // customSerializers.registerType(TypeToken.of(ItemWildcards.class), new ItemWildcardSerializer()); @@ -483,17 +481,6 @@ public final class ConfigManager { return configRanks.getRootNode(); } - /** - * Checks if this plugin is using retro mode - * Retro mode is a 0-1000 skill system - * Standard mode is scaled for 1-100 - * - * @return true if retro mode is enabled - */ - public boolean isRetroMode() { - return getConfigLeveling().getConfigSectionLevelingGeneral().getConfigSectionLevelScaling().isRetroModeEnabled(); - } - public ConfigExperience getConfigExperience() { return configExperience.getConfig(); } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/General.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/General.java index 29cacef0d..98f46d596 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/General.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/General.java @@ -5,5 +5,4 @@ import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @ConfigSerializable public class General { - } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/SkillConfigFactory.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/SkillConfigFactory.java index 50eed1303..7f9f07ff0 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/SkillConfigFactory.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/SkillConfigFactory.java @@ -4,11 +4,13 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.StringUtils; +import java.util.Locale; + public class SkillConfigFactory { protected static SerializedConfigLoader initSkillConfig(mcMMO pluginRef, PrimarySkillType primarySkillType, Class clazz) { return new SerializedConfigLoader(pluginRef, clazz, - primarySkillType.toString().toLowerCase() + ".conf", + primarySkillType.toString().toLowerCase(Locale.ENGLISH) + ".conf", StringUtils.getCapitalized(primarySkillType.toString()), null); } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/antiexploit/ConfigExploitPrevention.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/antiexploit/ConfigExploitPrevention.java index 46934961c..c4d7277ca 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/antiexploit/ConfigExploitPrevention.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/antiexploit/ConfigExploitPrevention.java @@ -119,4 +119,8 @@ public class ConfigExploitPrevention { public ConfigSectionExploitTaming getConfigSectionExploitTaming() { return configSectionExploitSkills.getConfigSectionExploitTaming(); } + + public boolean isSnowGolemExploitPrevented() { + return configSectionExploitSkills.isSnowGolemExploitPrevented(); + } } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/antiexploit/ConfigSectionExploitExcavation.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/antiexploit/ConfigSectionExploitExcavation.java new file mode 100644 index 000000000..d16bfb0dc --- /dev/null +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/antiexploit/ConfigSectionExploitExcavation.java @@ -0,0 +1,17 @@ +package com.gmail.nossr50.config.antiexploit; + +import ninja.leaping.configurate.objectmapping.Setting; +import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; + +@ConfigSerializable +public class ConfigSectionExploitExcavation { + + public static final boolean DEFAULT_SNOW_GOLEM = true; + @Setting(value = "Snow-Golem-Exploit", comment = "If set to true, the snow made by snow golems will not reward XP." + + "\nDefault value: "+DEFAULT_SNOW_GOLEM) + private boolean snowGolemExploit = DEFAULT_SNOW_GOLEM; + + public boolean isSnowGolemExploitPrevented() { + return snowGolemExploit; + } +} diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/antiexploit/ConfigSectionExploitSkills.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/antiexploit/ConfigSectionExploitSkills.java index fb114b1f9..ba841e27f 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/antiexploit/ConfigSectionExploitSkills.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/antiexploit/ConfigSectionExploitSkills.java @@ -26,6 +26,9 @@ public class ConfigSectionExploitSkills { @Setting(value = "Taming", comment = "Exploit settings related to Taming") private ConfigSectionExploitTaming configSectionExploitTaming = new ConfigSectionExploitTaming(); + @Setting(value = "Excavation", comment = "Exploit settings related to Excavation.") + private ConfigSectionExploitExcavation configSectionExploitExcavation = new ConfigSectionExploitExcavation(); + public ConfigSectionExploitAcrobatics getConfigSectionExploitAcrobatics() { return configSectionExploitAcrobatics; } @@ -46,6 +49,10 @@ public class ConfigSectionExploitSkills { return configSectionExploitMining.isPreventCobblestoneStoneGeneratorXP(); } + public boolean isSnowGolemExploitPrevented() { + return configSectionExploitExcavation.isSnowGolemExploitPrevented(); + } + public boolean areSummonsBreedable() { return configSectionExploitTaming.areSummonsBreedable(); } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/playerleveling/ConfigLeveling.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/playerleveling/ConfigLeveling.java index e98f6034c..eaa62dfe3 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/playerleveling/ConfigLeveling.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/playerleveling/ConfigLeveling.java @@ -129,6 +129,10 @@ public class ConfigLeveling { return configSectionLevelCaps; } + public int getCosmeticLevelScaleModifier() { + return configSectionLevelingGeneral.getCosmeticLevelScaleModifier(); + } + public ConfigSectionSkillLevelCap getPowerLevelSettings() { return configSectionLevelCaps.getPowerLevelSettings(); } @@ -161,10 +165,6 @@ public class ConfigLeveling { return configExperienceFormula.getFormulaType(); } - public boolean isRetroModeEnabled() { - return getConfigSectionLevelScaling().isRetroModeEnabled(); - } - public ConfigExperienceFormulaLinear getConfigExperienceFormulaLinear() { return configExperienceFormula.getConfigExperienceFormulaLinear(); } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/playerleveling/ConfigSectionLevelScaling.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/playerleveling/ConfigSectionLevelScaling.java index 224c5d406..07bac6d44 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/playerleveling/ConfigSectionLevelScaling.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/playerleveling/ConfigSectionLevelScaling.java @@ -7,22 +7,19 @@ import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; public class ConfigSectionLevelScaling { /* DEFAULT VALUES */ - public static final boolean USE_RETRO_MODE_DEFAULT = true; + public static final int LEVEL_SCALE_MODIFIER_DEFAULT = 1; /* * CONFIG NODES */ - @Setting(value = "Use-Retro-Mode", - comment = "Enables 1-1000 Level Scaling" + - "\nIf set to false, Standard Scaling is used instead (1-100 Level Scaling)") - private boolean useRetroMode = USE_RETRO_MODE_DEFAULT; + @Setting(value = "Cosmetic-Level-Scaling", + comment = "Changes the max number of levels and adjusts settings appropriately" + + "\nThe default value will make level 1000 the max level, settings in the configs are based around that and are mutated based on this setting." + + "\nLeave this setting at a value of 1 if you do not wish to change the cosmetic amount of levels") + private int cosmeticLevelScaleModifier = LEVEL_SCALE_MODIFIER_DEFAULT; - /* - * GETTER BOILERPLATE - */ - - public boolean isRetroModeEnabled() { - return useRetroMode; + public int getCosmeticLevelScaleModifier() { + return cosmeticLevelScaleModifier; } } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/playerleveling/ConfigSectionLevelingGeneral.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/playerleveling/ConfigSectionLevelingGeneral.java index a5a8fe53f..7c6081ab6 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/playerleveling/ConfigSectionLevelingGeneral.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/playerleveling/ConfigSectionLevelingGeneral.java @@ -15,16 +15,8 @@ public class ConfigSectionLevelingGeneral { @Setting(value = "Player-Level-Scaling", comment = "Level Scaling is a new feature of mcMMO." + - "\nServer admins can choose between two level scaling modes." + - "\nEach mode is meant to be identical to each other in terms of the speed of progression." + - "\nIn Retro player skills and levels scale the way they always have, on a 1-1000 scale." + - "\nIn Standard player skills scale instead from 1-100." + - "\nAs an example, reaching level 10 in Standard will take the same amount of time as reaching level 100 in Retro" + - "\n\nTo make upgrading mcMMO easier for the vast majority of existing servers, RetroMode will be turned on by default in the following circumstances" + - "\n1) That your server has a config.yml file that does not yet have a RetroMode setting (this means your server has not yet updated from the old system which did not have two level scaling options)" + - "\n2) You are already using RetroMode in your old YAML config files" + - "\n\nIf either of these is true, RetroMode will be turned on by default. If for some reason you had wiped your config files, you will need to come in here and turn RetroMode back on." + - "\nNOTE: RetroMode and Standard use the EXACT same DB, it does not alter any information within that DB. It is not dangerous to switch between Standard and Retro.") + "\nServer admins can adjust level scaling modifiers to tweak a bunch of settings related to progression at once." + + "\nIt is not recommended to change this away from defaults unless you know what you are doing.") private ConfigSectionLevelScaling configSectionLevelScaling = new ConfigSectionLevelScaling(); @Setting(value = "Player-Starting-Level", @@ -44,4 +36,8 @@ public class ConfigSectionLevelingGeneral { public ConfigSectionLevelScaling getConfigSectionLevelScaling() { return configSectionLevelScaling; } + + public int getCosmeticLevelScaleModifier() { + return configSectionLevelScaling.getCosmeticLevelScaleModifier(); + } } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/serializers/MaxBonusLevelSerializer.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/serializers/MaxBonusLevelSerializer.java deleted file mode 100644 index 5345d65fb..000000000 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/serializers/MaxBonusLevelSerializer.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.gmail.nossr50.config.serializers; - -import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; -import com.google.common.reflect.TypeToken; -import ninja.leaping.configurate.ConfigurationNode; -import ninja.leaping.configurate.objectmapping.ObjectMappingException; -import ninja.leaping.configurate.objectmapping.serialize.TypeSerializer; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; - -public class MaxBonusLevelSerializer implements TypeSerializer { - - public static final String STANDARD_NODE = "Standard-Max-Bonus-Level"; - public static final String RETRO_NODE = "Retro-Max-Bonus-Level"; - - @Nullable - @Override - public MaxBonusLevel deserialize(@NonNull TypeToken type, @NonNull ConfigurationNode value) throws ObjectMappingException { - int standard = value.getNode(STANDARD_NODE).getValue(TypeToken.of(Integer.class)); - int retro = value.getNode(RETRO_NODE).getValue(TypeToken.of(Integer.class)); - - AbstractMaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(standard, retro); - return maxBonusLevel; - } - - @Override - public void serialize(@NonNull TypeToken type, @Nullable MaxBonusLevel obj, @NonNull ConfigurationNode value) throws ObjectMappingException { - value.getNode(STANDARD_NODE).setValue(obj.getStandardScaleValue()); - value.getNode(RETRO_NODE).setValue(obj.getRetroScaleValue()); - } - -} diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/serializers/SkillRankPropertySerializer.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/serializers/SkillRankPropertySerializer.java index df55e4fa8..fc3608d42 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/serializers/SkillRankPropertySerializer.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/serializers/SkillRankPropertySerializer.java @@ -13,21 +13,17 @@ import java.util.Map; public class SkillRankPropertySerializer implements TypeSerializer { - private static final String STANDARD_RANK_UNLOCK_LEVEL_REQUIREMENTS = "Standard-Rank-Unlock-Level-Requirements"; - private static final String RETRO_RANK_UNLOCK_LEVEL_REQUIREMENTS = "Retro-Rank-Unlock-Level-Requirements"; + private static final String RANK_UNLOCK_LEVEL_REQUIREMENTS = "Standard-Rank-Unlock-Level-Requirements"; @Nullable @Override public SkillRankProperty deserialize(@NonNull TypeToken type, @NonNull ConfigurationNode value) throws ObjectMappingException { HashMap standardHashMap; - HashMap retroHashMap; try { - Map standardMap = value.getNode(STANDARD_RANK_UNLOCK_LEVEL_REQUIREMENTS).getValue(new TypeToken>() {}); - Map retroMap = value.getNode(RETRO_RANK_UNLOCK_LEVEL_REQUIREMENTS).getValue(new TypeToken>() {}); + Map standardMap = value.getNode(RANK_UNLOCK_LEVEL_REQUIREMENTS).getValue(new TypeToken>() {}); standardHashMap = new HashMap<>(standardMap); - retroHashMap = new HashMap<>(retroMap); } catch (ObjectMappingException e) { System.out.println("[mcMMO Deserializer Debug] Unable to deserialize rank property information from the config, make sure the ranks are correctly set in the config. You can delete the rank config to generate a new one if problems persist."); @@ -35,15 +31,13 @@ public class SkillRankPropertySerializer implements TypeSerializer type, @Nullable SkillRankProperty obj, @NonNull ConfigurationNode value) throws ObjectMappingException { - value.getNode(STANDARD_RANK_UNLOCK_LEVEL_REQUIREMENTS).setValue(obj.getStandardRanks()); - value.getNode(RETRO_RANK_UNLOCK_LEVEL_REQUIREMENTS).setValue(obj.getRetroRanks()); + value.getNode(RANK_UNLOCK_LEVEL_REQUIREMENTS).setValue(obj.getRanks()); } } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/ConfigMaxLevel.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/ConfigMaxLevel.java index 55170d36f..0d648ad66 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/ConfigMaxLevel.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/ConfigMaxLevel.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.config.skills; import com.gmail.nossr50.config.ConfigConstants; -import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -11,9 +9,9 @@ public class ConfigMaxLevel { @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME, comment = "Max bonus level is the level a player needs to reach in this skill to receive maximum benefits, such as better RNG odds or otherwise." + "\nSkills dynamically adjust their rewards to match the max bonus level, you can think of it as a curve that calculates what bonuses " + "\n a player should have based on how far they are from the max bonus level value, and the other parameters used for the scaling of the sub-skill.") - private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100); + private int maxBonusLevel = 1000; - public MaxBonusLevel getMaxBonusLevel() { + public int getMaxBonusLevel() { return maxBonusLevel; } } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/acrobatics/dodge/ConfigDodge.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/acrobatics/dodge/ConfigDodge.java index 2c0becdbf..f3ea06d03 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/acrobatics/dodge/ConfigDodge.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/acrobatics/dodge/ConfigDodge.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.config.skills.acrobatics.dodge; import com.gmail.nossr50.config.ConfigConstants; -import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -22,25 +20,11 @@ public class ConfigDodge { "\nDefault value: " + DAMAGE_REDUCTION_DIVISOR_DEFAULT) private double damageReductionDivisor = DAMAGE_REDUCTION_DIVISOR_DEFAULT; - @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME, comment = "Max bonus level is the level a player needs to reach in this skill to receive maximum benefits, such as better RNG odds or otherwise." + - "\nSkills dynamically adjust their rewards to match the max bonus level, you can think of it as a curve that calculates what bonuses " + - "\n a player should have based on how far they are from the max bonus level value, and the other parameters used for the scaling of the sub-skill.") - private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100); - - @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = "The maximum success chance for this Sub-Skill." + - "\nA value of 100.0 would be equivalent to 100% chance of success." + - "\nPlayers only have Max-Success-Chance when their skill level has reached the maximum bonus level." + - "\nMax skill chance is dynamically adjusted based on the players level difference from the \"Max-Bonus-Level\", you can think of it as a curve where reaching \"Max-Bonus-Level\" is the peak." + - "\nAs an example, imagine \""+ConfigConstants.MAX_CHANCE_FIELD_NAME+"\" was set to " + FIFTY_PERCENT_EXAMPLE + " and the \""+ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME+"\" was " + MAX_BONUS_LEVEL_EXAMPLE + "," + - "\n and the player was level " + FIFTY_PERCENT_EXAMPLE + " for this skill, that would give the player " + ODDS_PERCENTAGE_EXAMPLE + " odds to succeed with this skill.") - private double chanceAtMaxSkill = CHANCE_AT_MAX_SKILL_DEFAULT; - - public MaxBonusLevel getMaxBonusLevel() { - return maxBonusLevel; - } + @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION) + private double maxChance = 100.0; public double getChanceAtMaxSkill() { - return chanceAtMaxSkill; + return maxChance; } public double getDamageReductionDivisor() { diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/acrobatics/roll/ConfigRoll.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/acrobatics/roll/ConfigRoll.java index d13bcfeed..e32901511 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/acrobatics/roll/ConfigRoll.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/acrobatics/roll/ConfigRoll.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.config.skills.acrobatics.roll; import com.gmail.nossr50.config.ConfigConstants; -import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -10,9 +8,6 @@ import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; public class ConfigRoll { public static final double ROLL_DAMAGE_THRESHOLD_DEFAULT = 7.0D; - public static final String FIFTY_PERCENT_EXAMPLE = "50"; - public static final String MAX_BONUS_LEVEL_EXAMPLE = "100"; - public static final String ODDS_PERCENTAGE_EXAMPLE = "25%"; public static final double CHANCE_AT_MAX_SKILL_DEFAULT = 100.0D; @Setting(value = "Damage-Threshold", comment = "Rolling will reduce up to this much damage." + @@ -24,24 +19,10 @@ public class ConfigRoll { return damageTheshold; } - @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME, comment = "Max bonus level is the level a player needs to reach in this skill to receive maximum benefits, such as better RNG odds or otherwise." + - "\nSkills dynamically adjust their rewards to match the max bonus level, you can think of it as a curve that calculates what bonuses " + - "\n a player should have based on how far they are from the max bonus level value, and the other parameters used for the scaling of the sub-skill.") - private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100); - - @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = "The maximum success chance for this Sub-Skill." + - "\nA value of 100.0 would be equivalent to 100% chance of success." + - "\nPlayers only have Max-Success-Chance when their skill level has reached the maximum bonus level." + - "\nMax skill chance is dynamically adjusted based on the players level difference from the \"Max-Bonus-Level\", you can think of it as a curve where reaching \"Max-Bonus-Level\" is the peak." + - "\nAs an example, imagine \""+ConfigConstants.MAX_CHANCE_FIELD_NAME+"\" was set to " + FIFTY_PERCENT_EXAMPLE + " and the \""+ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME+"\" was " + MAX_BONUS_LEVEL_EXAMPLE + "," + - "\n and the player was level " + FIFTY_PERCENT_EXAMPLE + " for this skill, that would give the player " + ODDS_PERCENTAGE_EXAMPLE + " odds to succeed with this skill.") - private double chanceAtMaxSkill = CHANCE_AT_MAX_SKILL_DEFAULT; - - public MaxBonusLevel getMaxBonusLevel() { - return maxBonusLevel; - } + @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION) + private double maxChance = 100.0D; public double getChanceAtMaxSkill() { - return chanceAtMaxSkill; + return maxChance; } } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/archery/ConfigArcheryArrowRetrieval.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/archery/ConfigArcheryArrowRetrieval.java index cf0749122..7556df7ef 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/archery/ConfigArcheryArrowRetrieval.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/archery/ConfigArcheryArrowRetrieval.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.config.skills.archery; import com.gmail.nossr50.config.ConfigConstants; -import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -12,14 +10,7 @@ public class ConfigArcheryArrowRetrieval { @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION) private double maxChance = 100.0D; - @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME) - private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100); - public double getMaxChance() { return maxChance; } - - public MaxBonusLevel getMaxBonusLevel() { - return maxBonusLevel; - } } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/archery/ConfigArcheryDaze.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/archery/ConfigArcheryDaze.java index 844c78301..b9845c86b 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/archery/ConfigArcheryDaze.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/archery/ConfigArcheryDaze.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.config.skills.archery; import com.gmail.nossr50.config.ConfigConstants; -import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -15,9 +13,6 @@ public class ConfigArcheryDaze { + "\nDefault value: "+DAZE_MAX_CHANCE_DEFAULT) private double maxChance = DAZE_MAX_CHANCE_DEFAULT; - @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME) - private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100); - @Setting(value = "Bonus-Damage", comment = "How much bonus damage is applied when daze is applied to a target." + "\nDefault value: "+DAZE_BONUS_DMG_DEFAULT) private double bonusDamage = DAZE_BONUS_DMG_DEFAULT; @@ -26,10 +21,6 @@ public class ConfigArcheryDaze { return maxChance; } - public MaxBonusLevel getMaxBonusLevel() { - return maxBonusLevel; - } - public double getDazeBonusDamage() { return bonusDamage; } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/axes/ConfigAxesCriticalStrikes.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/axes/ConfigAxesCriticalStrikes.java index 9c1d267a7..f72729318 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/axes/ConfigAxesCriticalStrikes.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/axes/ConfigAxesCriticalStrikes.java @@ -2,7 +2,6 @@ package com.gmail.nossr50.config.skills.axes; import com.gmail.nossr50.config.ConfigConstants; import com.gmail.nossr50.datatypes.skills.properties.AbstractDamageProperty; -import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel; import com.gmail.nossr50.datatypes.skills.properties.DamageProperty; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -12,18 +11,14 @@ public class ConfigAxesCriticalStrikes { private static final double MAX_ACTIVATION_CHANCE_DEFAULT = 37.50D; - @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = "This is max percentage chance that is used to determine whether or not the ability is successful." + - "\nA value of 50.0 would mean at most the ability can only have a 50% chance to work at max skill level.") - private double maxActivationChance = MAX_ACTIVATION_CHANCE_DEFAULT; - - @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME, comment = ConfigConstants.MAX_BONUS_LEVEL_DESCRIPTION) - private AbstractMaxBonusLevel maximumProgressionLevel = new AbstractMaxBonusLevel(100); + @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION) + private double maxChance = MAX_ACTIVATION_CHANCE_DEFAULT; @Setting(value = "Damage-Modifiers", comment = "Damage dealt is multiplied by these values when this skill is successfully activated.") private DamageProperty damageProperty = new AbstractDamageProperty(1.5, 2.0); public double getMaxActivationChance() { - return maxActivationChance; + return maxChance; } public DamageProperty getDamageProperty() { diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismDoubleDrops.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismDoubleDrops.java index f286d0f08..078877171 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismDoubleDrops.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismDoubleDrops.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.config.skills.herbalism; import com.gmail.nossr50.config.ConfigConstants; -import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -11,8 +9,4 @@ public class ConfigHerbalismDoubleDrops { @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION) private double maxChance = 100.0; - - @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME) - private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100); - } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismGreenThumb.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismGreenThumb.java index 5bd7f9bec..8dfa44de9 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismGreenThumb.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismGreenThumb.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.config.skills.herbalism; import com.gmail.nossr50.config.ConfigConstants; -import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -11,8 +9,4 @@ public class ConfigHerbalismGreenThumb { @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION) private double maxChance = 100.0; - - @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME) - private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100); - } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismHylianLuck.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismHylianLuck.java index 46291e22f..af546136a 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismHylianLuck.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismHylianLuck.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.config.skills.herbalism; import com.gmail.nossr50.config.ConfigConstants; -import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -11,8 +9,4 @@ public class ConfigHerbalismHylianLuck { @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION) private double maxChance = 10.0; - - @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME) - private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100); - } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismShroomThumb.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismShroomThumb.java index c7b37be90..36fe0d105 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismShroomThumb.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/herbalism/ConfigHerbalismShroomThumb.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.config.skills.herbalism; import com.gmail.nossr50.config.ConfigConstants; -import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -12,7 +10,4 @@ public class ConfigHerbalismShroomThumb { @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION) private double maxChance = 50.0; - @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME) - private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100); - } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/mining/ConfigMiningDoubleDrops.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/mining/ConfigMiningDoubleDrops.java index 66be8fa93..cec0ddd12 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/mining/ConfigMiningDoubleDrops.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/mining/ConfigMiningDoubleDrops.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.config.skills.mining; import com.gmail.nossr50.config.ConfigConstants; -import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -11,9 +9,6 @@ public class ConfigMiningDoubleDrops { @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION) private double maxChance = 100.0; - @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME) - private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100); - @Setting(value = "Silk-Touch-Double-Drops", comment = "Allow silk touch to benefit from double drops.") private boolean allowSilkTouchDoubleDrops = true; diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/ranks/SkillRankProperty.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/ranks/SkillRankProperty.java index 819750803..96220ee83 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/ranks/SkillRankProperty.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/ranks/SkillRankProperty.java @@ -2,13 +2,14 @@ package com.gmail.nossr50.config.skills.ranks; import com.gmail.nossr50.api.exceptions.MissingSkillPropertyDefinition; import com.gmail.nossr50.datatypes.skills.properties.SkillProperty; +import com.gmail.nossr50.mcMMO; +import org.apache.logging.log4j.Level; import java.util.HashMap; public class SkillRankProperty implements SkillProperty { - private HashMap standardRanks; - private HashMap retroRanks; + private HashMap ranks; public SkillRankProperty(Integer... rankDefinitions) { initRankMaps(); @@ -16,88 +17,59 @@ public class SkillRankProperty implements SkillProperty { for(int x = 0; x < rankDefinitions.length; x++) { int curRank = x+1; - addStandardAndRetroRank(curRank, rankDefinitions[x]); + addRank(curRank, rankDefinitions[x]); } } - public SkillRankProperty(HashMap standardRanks, HashMap retroRanks) { - this.standardRanks = standardRanks; - this.retroRanks = retroRanks; + public SkillRankProperty(HashMap ranks) { + this.ranks = ranks; } /** - * Convenience method to add Standard and Retro at the same time for default initialization of values - * Only requires standard values be passed + * Fill in the rank map and mutate it by the cosmetic modifier * @param curRank the rank to fill in the value for - * @param standardValue the value of the rank in Standard + * @param rankValue the value of the rank in Standard */ - private void addStandardAndRetroRank(int curRank, int standardValue) { - //Retro will be equal to standards rank requirement multiplied by 10 unless that value is 1, in which case it will also be 1 - int retroValue = standardValue == 1 ? 1 : standardValue * 10; - + private void addRank(int curRank, int rankValue) { //Avoid negative numbers - if(standardValue < 0) { - standardRanks.put(curRank, 0); - retroRanks.put(curRank, 0); - } else { - standardRanks.put(curRank, standardValue); - retroRanks.put(curRank, retroValue); - } - } + rankValue = Math.max(0, rankValue); - /** - * Convenience method to add Standard and Retro at the same time - * @param curRank the rank to fill in the value for - * @param standardValue the value of the rank in Standard - * @param retroValue the value of the rank in Retro - */ - private void addStandardAndRetroRank(int curRank, int standardValue, int retroValue) { - //Avoid negative numbers - standardValue = Math.max(0, standardValue); - retroValue = Math.max(0, retroValue); - - standardRanks.put(curRank, standardValue); - retroRanks.put(curRank, retroValue); + ranks.put(curRank, rankValue); } private void initRankMaps() { - standardRanks = new HashMap<>(); - retroRanks = new HashMap<>(); + ranks = new HashMap<>(); } /** * Gets the unlock level for this skill as defined by this SkillRankProperty - * @param retroMode whether or not mcMMO is using RetroMode, true for if it is * @param targetRank the rank to get the unlock level for * @return the unlock level for target rank */ - public int getUnlockLevel(boolean retroMode, int targetRank) throws MissingSkillPropertyDefinition { - if(retroMode) { - if(retroRanks.get(targetRank) == null) { - throw new MissingSkillPropertyDefinition("No definition found for rank:"+targetRank+" using Retro scaling"); - } - return retroRanks.get(targetRank); - } else { - if(standardRanks.get(targetRank) == null) { - throw new MissingSkillPropertyDefinition("No definition found for rank:"+targetRank+" using Standard scaling"); - } - return standardRanks.get(targetRank); + public int getUnlockLevel(mcMMO pluginRef, int targetRank) throws MissingSkillPropertyDefinition { + if(ranks.get(targetRank) == null) { + throw new MissingSkillPropertyDefinition("No definition found for rank:"+targetRank+" using Standard scaling"); } + + //Avoid zero or lower + int cosmeticModifier = Math.max(1, pluginRef.getPlayerLevelingSettings().getCosmeticLevelScaleModifier()); + + if(cosmeticModifier == 1) + return ranks.get(targetRank); + + //Mutate rank + int rankValue = ranks.get(targetRank); + rankValue = rankValue / cosmeticModifier; + + return rankValue; } - public void setStandardRanks(HashMap standardRanks) { - this.standardRanks = standardRanks; + public void setRanks(HashMap ranks) { + this.ranks = ranks; } - public void setRetroRanks(HashMap retroRanks) { - this.retroRanks = retroRanks; + public HashMap getRanks() { + return ranks; } - public HashMap getStandardRanks() { - return standardRanks; - } - - public HashMap getRetroRanks() { - return retroRanks; - } } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/repair/ConfigRepairSuperRepair.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/repair/ConfigRepairSuperRepair.java index cabddd2c0..ec6f94de0 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/repair/ConfigRepairSuperRepair.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/repair/ConfigRepairSuperRepair.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.config.skills.repair; import com.gmail.nossr50.config.ConfigConstants; -import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -14,17 +12,7 @@ public class ConfigRepairSuperRepair { private static final String ODDS_PERCENTAGE_EXAMPLE = "25%"; private static final double CHANCE_AT_MAX_SKILL_DEFAULT = 100.0D; - @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME, comment = "Max bonus level is the level a player needs to reach in this skill to receive maximum benefits, such as better RNG odds or otherwise." + - "\nSkills dynamically adjust their rewards to match the max bonus level, you can think of it as a curve that calculates what bonuses " + - "\n a player should have based on how far they are from the max bonus level value, and the other parameters used for the scaling of the sub-skill.") - private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100); - - @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = "The maximum success chance for this Sub-Skill." + - "\nA value of 100.0 would be equivalent to 100% chance of success." + - "\nPlayers only have Max-Success-Chance when their skill level has reached the maximum bonus level." + - "\nMax skill chance is dynamically adjusted based on the players level difference from the \"Max-Bonus-Level\", you can think of it as a curve where reaching \"Max-Bonus-Level\" is the peak." + - "\nAs an example, imagine \""+ConfigConstants.MAX_CHANCE_FIELD_NAME+"\" was set to " + FIFTY_PERCENT_EXAMPLE + " and the \""+ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME+"\" was " + MAX_BONUS_LEVEL_EXAMPLE + "," + - "\n and the player was level " + FIFTY_PERCENT_EXAMPLE + " for this skill, that would give the player " + ODDS_PERCENTAGE_EXAMPLE + " odds to succeed with this skill.") - private double chanceAtMaxSkill = CHANCE_AT_MAX_SKILL_DEFAULT; + @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION) + private double maxChance = 100.0; } \ No newline at end of file diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/repair/repairmastery/ConfigRepairRepairMastery.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/repair/repairmastery/ConfigRepairRepairMastery.java index 3f019124f..aab83a678 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/repair/repairmastery/ConfigRepairRepairMastery.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/repair/repairmastery/ConfigRepairRepairMastery.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.config.skills.repair.repairmastery; import com.gmail.nossr50.config.ConfigConstants; -import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -12,14 +10,7 @@ public class ConfigRepairRepairMastery { @Setting(value = ConfigConstants.MAX_BONUS_PERCENTAGE_FIELD_NAME) private double maxBonusPercentage = 200.0D; - @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME, comment = ConfigConstants.MAX_BONUS_LEVEL_DESCRIPTION) - private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100); - public double getMaxBonusPercentage() { return maxBonusPercentage; } - - public MaxBonusLevel getMaxBonusLevel() { - return maxBonusLevel; - } } \ No newline at end of file diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/smelting/ConfigSmelting.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/smelting/ConfigSmelting.java index 8d64d2448..abc06412e 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/smelting/ConfigSmelting.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/smelting/ConfigSmelting.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.config.skills.smelting; import com.gmail.nossr50.config.ConfigConstants; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -13,7 +12,7 @@ public class ConfigSmelting { @Setting(value = ConfigConstants.SUB_SKILL_NODE) private ConfigSmeltingSubSkills subskills = new ConfigSmeltingSubSkills(); - public ConfigSmeltingSubSkills getSubskills() { + public ConfigSmeltingSubSkills getSubSkills() { return subskills; } @@ -26,10 +25,6 @@ public class ConfigSmelting { return subskills.getMaxChance(); } - public MaxBonusLevel getMaxBonusLevel() { - return subskills.getMaxBonusLevel(); - } - public HashMap getXpMultiplierTable() { return subskills.getXpMultiplierTable(); } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/smelting/ConfigSmeltingSecondSmelt.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/smelting/ConfigSmeltingSecondSmelt.java index a673fbb44..8bf52605a 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/smelting/ConfigSmeltingSecondSmelt.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/smelting/ConfigSmeltingSecondSmelt.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.config.skills.smelting; import com.gmail.nossr50.config.ConfigConstants; -import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -28,17 +26,10 @@ public class ConfigSmeltingSecondSmelt { @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION) private double maxChance = 50.0; - @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME, comment = ConfigConstants.MAX_BONUS_LEVEL_DESCRIPTION) - private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100); - public double getMaxChance() { return maxChance; } - public MaxBonusLevel getMaxBonusLevel() { - return maxBonusLevel; - } - @Setting(value = "XP-Multiplier-Per-Rank") private HashMap xpMultiplierTable = XP_MULT_MAP_DEFAULT; diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/smelting/ConfigSmeltingSubSkills.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/smelting/ConfigSmeltingSubSkills.java index 26e25a850..4caa53c32 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/smelting/ConfigSmeltingSubSkills.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/smelting/ConfigSmeltingSubSkills.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.config.skills.smelting; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -20,10 +19,6 @@ public class ConfigSmeltingSubSkills { return smeltingSecondSmelt.getMaxChance(); } - public MaxBonusLevel getMaxBonusLevel() { - return smeltingSecondSmelt.getMaxBonusLevel(); - } - public HashMap getXpMultiplierTable() { return smeltingSecondSmelt.getXpMultiplierTable(); } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwords.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwords.java index 498097fb5..85e032dfb 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwords.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwords.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.config.skills.swords; import com.gmail.nossr50.config.ConfigConstants; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -31,10 +30,6 @@ public class ConfigSwords { return subSkills.getCounterAttackMaxChance(); } - public MaxBonusLevel getCounterAttackMaxBonusLevel() { - return subSkills.getCounterAttackMaxBonusLevel(); - } - public double getCounterAttackDamageModifier() { return subSkills.getCounterAttackDamageModifier(); } @@ -47,10 +42,6 @@ public class ConfigSwords { return subSkills.getRuptureMaxChance(); } - public MaxBonusLevel getRuptureMaxBonusLevel() { - return subSkills.getRuptureMaxBonusLevel(); - } - public double getRuptureDamagePlayer() { return subSkills.getRuptureDamagePlayer(); } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwordsCounterAttack.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwordsCounterAttack.java index c67c873bb..b047173ec 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwordsCounterAttack.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwordsCounterAttack.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.config.skills.swords; import com.gmail.nossr50.config.ConfigConstants; -import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -14,9 +12,6 @@ public class ConfigSwordsCounterAttack { @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION) private double maxChance = 30.0; - @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME, comment = ConfigConstants.MAX_BONUS_LEVEL_DESCRIPTION) - private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100); - @Setting(value = "Damage-Modifier", comment = "The damage returned from Counter-Attack will be equal to the damage dealt divided by this number." + "\nDefault value: "+DAMAGE_MODIFIER_DEFAULT) private double damageModifier = DAMAGE_MODIFIER_DEFAULT; @@ -25,10 +20,6 @@ public class ConfigSwordsCounterAttack { return maxChance; } - public MaxBonusLevel getCounterAttackMaxBonusLevel() { - return maxBonusLevel; - } - public double getCounterAttackDamageModifier() { return damageModifier; } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwordsRupture.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwordsRupture.java index 027470292..3323488f4 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwordsRupture.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwordsRupture.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.config.skills.swords; import com.gmail.nossr50.config.ConfigConstants; -import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -17,9 +15,6 @@ public class ConfigSwordsRupture { @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION) private double maxChance = MAX_CHANCE_DEFAULT; - @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME) - private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100); - @Setting(value = "Damage-Per-Tick-PVP") private double damagePlayer = DAMAGE_PVP_DEFAULT; @@ -35,10 +30,6 @@ public class ConfigSwordsRupture { return maxChance; } - public MaxBonusLevel getRuptureMaxBonusLevel() { - return maxBonusLevel; - } - public double getRuptureDamagePlayer() { return damagePlayer; } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwordsSubSkills.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwordsSubSkills.java index 97290467e..dd9689dc4 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwordsSubSkills.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/swords/ConfigSwordsSubSkills.java @@ -1,6 +1,5 @@ package com.gmail.nossr50.config.skills.swords; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -35,10 +34,6 @@ public class ConfigSwordsSubSkills { return counterAttack.getCounterAttackMaxChance(); } - public MaxBonusLevel getCounterAttackMaxBonusLevel() { - return counterAttack.getCounterAttackMaxBonusLevel(); - } - public double getCounterAttackDamageModifier() { return counterAttack.getCounterAttackDamageModifier(); } @@ -51,10 +46,6 @@ public class ConfigSwordsSubSkills { return rupture.getRuptureMaxChance(); } - public MaxBonusLevel getRuptureMaxBonusLevel() { - return rupture.getRuptureMaxBonusLevel(); - } - public double getRuptureDamagePlayer() { return rupture.getRuptureDamagePlayer(); } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/taming/ConfigTamingGore.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/taming/ConfigTamingGore.java index e261e1d4e..67e5b0552 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/taming/ConfigTamingGore.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/taming/ConfigTamingGore.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.config.skills.taming; import com.gmail.nossr50.config.ConfigConstants; -import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -15,9 +13,6 @@ public class ConfigTamingGore { @Setting(value = "Gore-Bleed-Tick-Length", comment = "How many times to apply the bleed DOT from gore before it wears off.") private int goreBleedTicks = 2; - @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME, comment = ConfigConstants.MAX_BONUS_LEVEL_DESCRIPTION) - private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100); - @Setting(value = "Gore-Damage-Modifier") private double goreMofifier = 2.0; @@ -25,10 +20,6 @@ public class ConfigTamingGore { return maxChance; } - public MaxBonusLevel getMaxBonusLevel() { - return maxBonusLevel; - } - public double getGoreMofifier() { return goreMofifier; } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/woodcutting/ConfigWoodcuttingHarvest.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/woodcutting/ConfigWoodcuttingHarvest.java index 57e1796d7..71386205e 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/woodcutting/ConfigWoodcuttingHarvest.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/skills/woodcutting/ConfigWoodcuttingHarvest.java @@ -1,8 +1,6 @@ package com.gmail.nossr50.config.skills.woodcutting; import com.gmail.nossr50.config.ConfigConstants; -import com.gmail.nossr50.datatypes.skills.properties.AbstractMaxBonusLevel; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; @@ -14,15 +12,8 @@ public class ConfigWoodcuttingHarvest { @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION) private double maxChance = MAX_CHANCE_DEFAULT; - @Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME) - private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100); - public double getMaxChance() { return maxChance; } - public MaxBonusLevel getMaxBonusLevel() { - return maxBonusLevel; - } - } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/config/sound/ConfigSound.java b/mcmmo-core/src/main/java/com/gmail/nossr50/config/sound/ConfigSound.java index dee1e4932..b026aa887 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/config/sound/ConfigSound.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/config/sound/ConfigSound.java @@ -29,6 +29,7 @@ public class ConfigSound { SOUND_SETTINGS_MAP_DEFAULT.put(SoundType.ABILITY_ACTIVATED_BERSERK, new SoundSetting(0.5, 1.7)); SOUND_SETTINGS_MAP_DEFAULT.put(SoundType.TIRED, new SoundSetting(1.0, 1.7)); SOUND_SETTINGS_MAP_DEFAULT.put(SoundType.BLEED, new SoundSetting(2.0, 2.0)); + SOUND_SETTINGS_MAP_DEFAULT.put(SoundType.GLASS, new SoundSetting(1.0, 1.0)); } @Setting(value = "Sound-Settings", comment = "Adjust sound settings for various mcMMO sounds here." + diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/core/MaterialMapStore.java b/mcmmo-core/src/main/java/com/gmail/nossr50/core/MaterialMapStore.java index 162f2c0b8..3f723a04c 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/core/MaterialMapStore.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/core/MaterialMapStore.java @@ -3,6 +3,7 @@ package com.gmail.nossr50.core; import org.bukkit.Material; import java.util.HashSet; +import java.util.Locale; /** * Stores hash tables for item and block names @@ -21,6 +22,7 @@ public class MaterialMapStore { private HashSet canMakeShroomyWhiteList; private HashSet multiBlockPlant; private HashSet foodItemWhiteList; + private HashSet glassBlocks; public MaterialMapStore() { abilityBlackList = new HashSet<>(); @@ -32,6 +34,7 @@ public class MaterialMapStore { canMakeShroomyWhiteList = new HashSet<>(); multiBlockPlant = new HashSet<>(); foodItemWhiteList = new HashSet<>(); + glassBlocks = new HashSet<>(); fillHardcodedHashSets(); } @@ -79,6 +82,44 @@ public class MaterialMapStore { fillShroomyWhiteList(); fillMultiBlockEntitiesList(); fillFoodWhiteList(); + fillGlassBlockWhiteList(); + } + + private void fillGlassBlockWhiteList() { + glassBlocks.add("glass"); + glassBlocks.add("glass_pane"); + glassBlocks.add("black_stained_glass"); + glassBlocks.add("black_stained_glass_pane"); + glassBlocks.add("blue_stained_glass"); + glassBlocks.add("blue_stained_glass_pane"); + glassBlocks.add("brown_stained_glass"); + glassBlocks.add("brown_stained_glass_pane"); + glassBlocks.add("cyan_stained_glass"); + glassBlocks.add("cyan_stained_glass_pane"); + glassBlocks.add("gray_stained_glass"); + glassBlocks.add("gray_stained_glass_pane"); + glassBlocks.add("green_stained_glass"); + glassBlocks.add("green_stained_glass_pane"); + glassBlocks.add("light_blue_stained_glass"); + glassBlocks.add("light_blue_stained_glass_pane"); + glassBlocks.add("light_gray_stained_glass"); + glassBlocks.add("light_gray_stained_glass_pane"); + glassBlocks.add("lime_stained_glass"); + glassBlocks.add("lime_stained_glass_pane"); + glassBlocks.add("magenta_stained_glass"); + glassBlocks.add("magenta_stained_glass_pane"); + glassBlocks.add("orange_stained_glass"); + glassBlocks.add("orange_stained_glass_pane"); + glassBlocks.add("pink_stained_glass"); + glassBlocks.add("pink_stained_glass_pane"); + glassBlocks.add("purple_stained_glass"); + glassBlocks.add("purple_stained_glass_pane"); + glassBlocks.add("red_stained_glass"); + glassBlocks.add("red_stained_glass_pane"); + glassBlocks.add("white_stained_glass"); + glassBlocks.add("white_stained_glass_pane"); + glassBlocks.add("yellow_stained_glass"); + glassBlocks.add("yellow_stained_glass_pane"); } private void fillFoodWhiteList() { @@ -120,6 +161,10 @@ public class MaterialMapStore { foodItemWhiteList.add("tropical_fish"); } + public boolean isGlass(Material material) { + return glassBlocks.contains(material.getKey().getKey()); + } + public boolean isFood(Material material) { return foodItemWhiteList.contains(material.getKey().getKey()); } @@ -146,6 +191,8 @@ public class MaterialMapStore { private void fillBlockCrackerWhiteList() { blockCrackerWhiteList.add("stone_bricks"); + blockCrackerWhiteList.add("infested_stone_bricks"); + } private void fillHerbalismAbilityBlackList() { @@ -426,7 +473,8 @@ public class MaterialMapStore { toolBlackList.add("stonecutter"); } - private void addToHashSet(String string, HashSet stringHashSet) { - stringHashSet.add(string.toLowerCase()); + private void addToHashSet(String string, HashSet stringHashSet) + { + stringHashSet.add(string.toLowerCase(Locale.ENGLISH)); } } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/core/SkillPropertiesManager.java b/mcmmo-core/src/main/java/com/gmail/nossr50/core/SkillPropertiesManager.java index 7e1df84c9..3d1a1fd75 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/core/SkillPropertiesManager.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/core/SkillPropertiesManager.java @@ -3,7 +3,6 @@ package com.gmail.nossr50.core; import com.gmail.nossr50.config.ConfigConstants; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; -import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.random.InvalidStaticChance; import com.google.common.reflect.TypeToken; @@ -31,8 +30,8 @@ public class SkillPropertiesManager { staticActivationChanceMap = new HashMap<>(); } - public void registerMaxBonusLevel(SubSkillType subSkillType, MaxBonusLevel maxBonusLevel) { - maxBonusLevelMap.put(subSkillType, pluginRef.isRetroModeEnabled() ? maxBonusLevel.getRetroScaleValue() : maxBonusLevel.getStandardScaleValue()); + public void registerMaxBonusLevel(SubSkillType subSkillType, int maxBonusLevel) { + maxBonusLevelMap.put(subSkillType, maxBonusLevel); } public void registerMaxBonus(SubSkillType subSkillType, double maxBonus) { @@ -133,13 +132,9 @@ public class SkillPropertiesManager { } private void attemptRegisterMaxBonusLevel(SubSkillType subSkillType, CommentedConfigurationNode childNode) { - try { - pluginRef.getLogger().info("Registering MaxBonusLevel for "+subSkillType.toString()); - MaxBonusLevel maxBonusLevel = childNode.getValue(TypeToken.of(MaxBonusLevel.class)); - registerMaxBonusLevel(subSkillType, maxBonusLevel); - } catch (ObjectMappingException e) { - //This time a silent exception is fine - } + pluginRef.getLogger().info("Registering MaxBonusLevel for "+subSkillType.toString()); + int maxBonusLevel = childNode.getInt(); + registerMaxBonusLevel(subSkillType, maxBonusLevel); } private void attemptRegisterMaxChance(SubSkillType subSkillType, CommentedConfigurationNode childNode) { diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/mcmmo-core/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index e0ceaaebb..6182376d6 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -361,7 +361,7 @@ public final class SQLDatabaseManager implements DatabaseManager { public List readLeaderboard(PrimarySkillType skill, int pageNumber, int statsPerPage) { List stats = new ArrayList<>(); - String query = skill == null ? ALL_QUERY_VERSION : skill.name().toLowerCase(); + String query = skill == null ? ALL_QUERY_VERSION : skill.name().toLowerCase(Locale.ENGLISH); ResultSet resultSet = null; PreparedStatement statement = null; Connection connection = null; @@ -403,9 +403,9 @@ public final class SQLDatabaseManager implements DatabaseManager { try { connection = getConnection(PoolIdentifier.MISC); for (PrimarySkillType primarySkillType : pluginRef.getSkillTools().NON_CHILD_SKILLS) { - String skillName = primarySkillType.name().toLowerCase(); + String skillName = primarySkillType.name().toLowerCase(Locale.ENGLISH); // Get count of all users with higher skill level than player - String sql = "SELECT COUNT(*) AS rank FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id WHERE " + skillName + " > 0 " + + String sql = "SELECT COUNT(*) AS 'rank' FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id WHERE " + skillName + " > 0 " + "AND " + skillName + " > (SELECT " + skillName + " FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id " + "WHERE user = ?)"; @@ -439,7 +439,7 @@ public final class SQLDatabaseManager implements DatabaseManager { statement.close(); } - String sql = "SELECT COUNT(*) AS rank FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id " + + String sql = "SELECT COUNT(*) AS 'rank' FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id " + "WHERE " + ALL_QUERY_VERSION + " > 0 " + "AND " + ALL_QUERY_VERSION + " > " + "(SELECT " + ALL_QUERY_VERSION + " " + @@ -914,7 +914,7 @@ public final class SQLDatabaseManager implements DatabaseManager { //Shrink skills above the cap int cap = pluginRef.getPlayerLevelingSettings().getSkillLevelCap(skill); - statement = connection.prepareStatement("UPDATE `" + tablePrefix + "skills` SET `" + skill.name().toLowerCase() + "` = " + cap + " WHERE `" + skill.name().toLowerCase() + "` > " + cap); + statement = connection.prepareStatement("UPDATE `" + tablePrefix + "skills` SET `" + skill.name().toLowerCase(Locale.ENGLISH) + "` = " + cap + " WHERE `" + skill.name().toLowerCase(Locale.ENGLISH) + "` > " + cap); statement.executeUpdate(); tryClose(statement); } @@ -951,7 +951,7 @@ public final class SQLDatabaseManager implements DatabaseManager { break; } if (connection == null) { - throw new RuntimeException("getConnection() for " + identifier.name().toLowerCase() + " pool timed out. Increase max connections settings."); + throw new RuntimeException("getConnection() for " + identifier.name().toLowerCase(Locale.ENGLISH) + " pool timed out. Increase max connections settings."); } return connection; } @@ -1249,7 +1249,7 @@ public final class SQLDatabaseManager implements DatabaseManager { pluginRef.getLogger().info("Indexing tables, this may take a while on larger databases"); for (PrimarySkillType skill : pluginRef.getSkillTools().NON_CHILD_SKILLS) { - String skill_name = skill.name().toLowerCase(); + String skill_name = skill.name().toLowerCase(Locale.ENGLISH); try { statement.executeUpdate("ALTER TABLE `" + tablePrefix + "skills` ADD INDEX `idx_" + skill_name + "` (`" + skill_name + "`) USING BTREE"); diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java b/mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java index 85497e25c..3d4053580 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java @@ -4,6 +4,8 @@ import com.gmail.nossr50.config.HOCONUtil; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.StringUtils; +import java.util.Locale; + public enum SubSkillType { /* !! Warning -- Do not let subskills share a name with any existing PrimarySkillType as it will clash with the static import !! */ @@ -142,7 +144,7 @@ public enum SubSkillType { */ public String getPermissionNodeAddress(mcMMO pluginRef) { //TODO: This could be optimized - return "mcmmo.ability." + getParentSkill(pluginRef).toString().toLowerCase() + "." + getConfigName(toString()).toLowerCase(); + return "mcmmo.ability." + getParentSkill(pluginRef).toString().toLowerCase(Locale.ENGLISH) + "." + getConfigName(toString()).toLowerCase(Locale.ENGLISH); } /** diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/properties/AbstractMaxBonusLevel.java b/mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/properties/AbstractMaxBonusLevel.java deleted file mode 100644 index 0de9d10ca..000000000 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/properties/AbstractMaxBonusLevel.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.gmail.nossr50.datatypes.skills.properties; - -public class AbstractMaxBonusLevel implements MaxBonusLevel { - - private int retro; - private int standard; - - public AbstractMaxBonusLevel(int standard, int retro) { - this.standard = standard; - this.retro = retro; - } - - public AbstractMaxBonusLevel(int standard) { - this.standard = standard; - this.retro = standard * 10; - } - - @Override - public int getRetroScaleValue() { - return retro; - } - - @Override - public int getStandardScaleValue() { - return standard; - } - - public void setRetro(int retro) { - this.retro = retro; - } - - public void setStandard(int standard) { - this.standard = standard; - } -} diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/properties/AbstractScalingProperty.java b/mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/properties/AbstractScalingProperty.java deleted file mode 100644 index be43b6dab..000000000 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/properties/AbstractScalingProperty.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.gmail.nossr50.datatypes.skills.properties; - -import com.gmail.nossr50.datatypes.skills.SubSkillType; - -public abstract class AbstractScalingProperty implements ScalingProperty { - public SubSkillType subSkillType; - - public AbstractScalingProperty(SubSkillType subSkillType) { - super(); - this.subSkillType = subSkillType; - } - - @Override - public String toString() { - return "AbstractScalingProperty{" + - "subSkillType=" + subSkillType + - '}'; - } -} diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/properties/MaxBonusLevel.java b/mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/properties/MaxBonusLevel.java deleted file mode 100644 index 990f5d12a..000000000 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/properties/MaxBonusLevel.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.gmail.nossr50.datatypes.skills.properties; - -public interface MaxBonusLevel { - - /** - * Get the max level for this skill for Retro scaling - * @return Retro Mode max bonus level - */ - int getRetroScaleValue(); - - /** - * Get the max level for this skill for Standard scaling - * @return Standard Mode max bonus level - */ - int getStandardScaleValue(); - -} diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/properties/ScalingProperty.java b/mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/properties/ScalingProperty.java deleted file mode 100644 index 88b2a09ed..000000000 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/properties/ScalingProperty.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.gmail.nossr50.datatypes.skills.properties; - -public interface ScalingProperty extends SkillProperty { - /** - * Returns the appropriate value for this scaling property whether it is Standard or Retro - * - * @return the value used in scaling calculations for this ScalingProperty - */ - double getValue(); -} diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java b/mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java index 75f52b8ec..c95f557c6 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java @@ -20,6 +20,8 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.inventory.ItemStack; +import java.util.Locale; + public class Roll extends AcrobaticsSubSkill { private final mcMMO pluginRef; @@ -95,7 +97,7 @@ public class Roll extends AcrobaticsSubSkill { */ @Override public String getPermissionNode() { - return ("mcmmo.ability." + getPrimaryKeyName() + "." + getConfigKeyName()).toLowerCase(); + return ("mcmmo.ability." + getPrimaryKeyName() + "." + getConfigKeyName()).toLowerCase(Locale.ENGLISH); } /** @@ -370,7 +372,7 @@ public class Roll extends AcrobaticsSubSkill { //Chance to roll at half max skill RandomChanceSkill rollHalfMaxSkill = new RandomChanceSkill(pluginRef, null, subSkillType); - int halfMaxSkillValue = pluginRef.isRetroModeEnabled() ? 500 : 50; + int halfMaxSkillValue = (int) pluginRef.getDynamicSettingsManager().getSkillMaxBonusLevel(subSkillType) / 2; rollHalfMaxSkill.setSkillLevel(halfMaxSkillValue); //Chance to graceful roll at full skill diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/dumpster/PotionGenerator.java b/mcmmo-core/src/main/java/com/gmail/nossr50/dumpster/PotionGenerator.java index e7107a645..b2540508b 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/dumpster/PotionGenerator.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/dumpster/PotionGenerator.java @@ -253,7 +253,7 @@ // if (target.equals("II")) { // hacks // return target; // } -// return target.substring(0, 1).toUpperCase() + target.substring(1).toLowerCase(); +// return target.substring(0, 1).toUpperCase() + target.substring(1).toLowerCase(Locale.ENGLISH); // } // // private static String getName(PotionEffectType type) { diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/mcmmo-core/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 15ccfa753..260e2a925 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -160,7 +160,7 @@ public class BlockListener implements Listener { if (pluginRef.getDynamicSettingsManager().isWorldBlacklisted(event.getBlock().getWorld().getName())) return; - if (pluginRef.getBlockTools().shouldBeWatched(event.getNewState())) { + if (pluginRef.getConfigManager().getConfigExploitPrevention().isSnowGolemExploitPrevented() && pluginRef.getBlockTools().shouldBeWatched(event.getNewState())) { pluginRef.getPlaceStore().setTrue(event.getNewState().getBlock()); } } @@ -481,8 +481,27 @@ public class BlockListener implements Listener { mcMMOPlayer.checkAbilityActivation(PrimarySkillType.MINING); } else if (mcMMOPlayer.getToolPreparationMode(ToolType.SHOVEL) && pluginRef.getItemTools().isShovel(heldItem) && pluginRef.getBlockTools().affectedByGigaDrillBreaker(blockState) && pluginRef.getPermissionTools().gigaDrillBreaker(player)) { mcMMOPlayer.checkAbilityActivation(PrimarySkillType.EXCAVATION); - } else if (mcMMOPlayer.getToolPreparationMode(ToolType.FISTS) && heldItem.getType() == Material.AIR && (pluginRef.getBlockTools().affectedByGigaDrillBreaker(blockState) || blockState.getType() == Material.SNOW || pluginRef.getBlockTools().affectedByBlockCracker(blockState) && pluginRef.getPermissionTools().berserk(player))) { + } else if (mcMMOPlayer.getToolPreparationMode(ToolType.FISTS) + && heldItem.getType() == Material.AIR + && ((pluginRef.getBlockTools().affectedByGigaDrillBreaker(blockState) + || blockState.getType() == Material.SNOW + || pluginRef.getBlockTools().affectedByBlockCracker(blockState) + || pluginRef.getMaterialMapStore().isGlass(blockState.getType())) + && pluginRef.getPermissionTools().berserk(player))) { mcMMOPlayer.checkAbilityActivation(PrimarySkillType.UNARMED); + + if(mcMMOPlayer.getSuperAbilityMode(SuperAbilityType.BERSERK)) { + if (pluginRef.getSkillTools().superAbilityBlockCheck(SuperAbilityType.BERSERK, blockState) + && pluginRef.getEventManager().simulateBlockBreak(blockState.getBlock(), player, true)) { + event.setInstaBreak(true); + + if(blockState.getType().getKey().getKey().contains("glass")) { + pluginRef.getSoundManager().worldSendSound(player.getWorld(), blockState.getLocation(), SoundType.GLASS); + } else { + pluginRef.getSoundManager().sendSound(player, blockState.getLocation(), SoundType.POP); + } + } + } } } @@ -556,12 +575,30 @@ public class BlockListener implements Listener { && pluginRef.getEventManager().simulateBlockBreak(block, player, true)) { event.setInstaBreak(true); pluginRef.getSoundManager().sendSound(player, block.getLocation(), SoundType.POP); - } else if (mcMMOPlayer.getUnarmedManager().canUseBlockCracker() && pluginRef.getBlockTools().affectedByBlockCracker(blockState) && pluginRef.getEventManager().simulateBlockBreak(block, player, true)) { + } else if (mcMMOPlayer.getUnarmedManager().canUseBlockCracker() + && pluginRef.getBlockTools().affectedByBlockCracker(blockState) + && pluginRef.getEventManager().simulateBlockBreak(block, player, true)) { if (mcMMOPlayer.getUnarmedManager().blockCrackerCheck(blockState)) { blockState.update(); } } - } else if (mcMMOPlayer.getWoodcuttingManager().canUseLeafBlower(heldItem) && pluginRef.getBlockTools().isLeaves(blockState) && pluginRef.getEventManager().simulateBlockBreak(block, player, true)) { + //Only run if insta-break isn't on, this is because we turn it on in another event of this same type but different priority under certain conditions + else if (!event.getInstaBreak() + && pluginRef.getBlockTools().canActivateAbilities(blockState) + && pluginRef.getEventManager().simulateBlockBreak(block, player, true)) { + event.setInstaBreak(true); + + //Break Glass + if(blockState.getType().getKey().getKey().contains("glass")) { + pluginRef.getSoundManager().worldSendSound(player.getWorld(), block.getLocation(), SoundType.GLASS); + } else { + pluginRef.getSoundManager().sendSound(player, block.getLocation(), SoundType.POP); + } + } + } + else if (mcMMOPlayer.getWoodcuttingManager().canUseLeafBlower(heldItem) + && pluginRef.getBlockTools().isLeaves(blockState) + && pluginRef.getEventManager().simulateBlockBreak(block, player, true)) { event.setInstaBreak(true); pluginRef.getSoundManager().sendSound(player, block.getLocation(), SoundType.POP); } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/mcmmo-core/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 3e337ab92..7e340f313 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -60,7 +60,7 @@ public class EntityListener implements Listener { //Prevent entities from giving XP if they target endermite if (event.getTarget() instanceof Endermite) { - if (event.getEntity().hasMetadata(MetadataConstants.UNNATURAL_MOB_METAKEY)) + if (!event.getEntity().hasMetadata(MetadataConstants.UNNATURAL_MOB_METAKEY)) event.getEntity().setMetadata(MetadataConstants.UNNATURAL_MOB_METAKEY, MetadataConstants.metadataValue); } } @@ -793,26 +793,6 @@ public class EntityListener implements Listener { } } - /** - * Handle EntityExplode events that involve modifying the event. - * - * @param event The event to modify - */ - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) - public void onEntityExplodeMonitor(EntityExplodeEvent event) { - /* WORLD BLACKLIST CHECK */ - if (pluginRef.getDynamicSettingsManager().isWorldBlacklisted(event.getEntity().getWorld().getName())) - return; - - Entity entity = event.getEntity(); - - if (!(entity instanceof TNTPrimed) || !entity.hasMetadata(MetadataConstants.SAFE_TNT_METAKEY)) { - return; - } - - event.blockList().clear(); - } - /** * Handle FoodLevelChange events that involve modifying the event. * diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/listeners/InteractionManager.java b/mcmmo-core/src/main/java/com/gmail/nossr50/listeners/InteractionManager.java index 5080de891..5d116eab3 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/listeners/InteractionManager.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/listeners/InteractionManager.java @@ -9,6 +9,7 @@ import org.bukkit.event.Event; import java.util.ArrayList; import java.util.HashMap; +import java.util.Locale; public class InteractionManager { private static HashMap> interactRegister; @@ -46,7 +47,7 @@ public class InteractionManager { //Register skill arrayRef.add(abstractSubSkill); - String lowerCaseName = abstractSubSkill.getConfigKeyName().toLowerCase(); + String lowerCaseName = abstractSubSkill.getConfigKeyName().toLowerCase(Locale.ENGLISH); //Register in name map subSkillNameMap.putIfAbsent(lowerCaseName, abstractSubSkill); @@ -62,7 +63,7 @@ public class InteractionManager { * @return null if the subskill is not registered */ public static AbstractSubSkill getAbstractByName(String name) { - return subSkillNameMap.get(name.toLowerCase()); + return subSkillNameMap.get(name.toLowerCase(Locale.ENGLISH)); } /** diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/mcmmo-core/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index cfb3ed939..554a1e225 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -34,6 +34,8 @@ import org.bukkit.event.player.*; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; +import java.util.Locale; + public class PlayerListener implements Listener { private final mcMMO pluginRef; @@ -880,12 +882,12 @@ public class PlayerListener implements Listener { if (!pluginRef.getConfigManager().getConfigLanguage().getTargetLanguage().equalsIgnoreCase("en_US")) { String message = event.getMessage(); String command = message.substring(1).split(" ")[0]; - String lowerCaseCommand = command.toLowerCase(); + String lowerCaseCommand = command.toLowerCase(Locale.ENGLISH); // Do these ACTUALLY have to be lower case to work properly? for (PrimarySkillType primarySkillType : PrimarySkillType.values()) { - String skillName = primarySkillType.toString().toLowerCase(); - String localizedName = pluginRef.getSkillTools().getLocalizedSkillName(primarySkillType).toLowerCase(); + String skillName = primarySkillType.toString().toLowerCase(Locale.ENGLISH); + String localizedName = pluginRef.getSkillTools().getLocalizedSkillName(primarySkillType).toLowerCase(Locale.ENGLISH); if (command.equalsIgnoreCase(localizedName)) { event.setMessage(message.replace(command, skillName)); diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/mcMMO.java b/mcmmo-core/src/main/java/com/gmail/nossr50/mcMMO.java index aa89dac9b..f6e97bb6c 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/mcMMO.java @@ -68,6 +68,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; +import java.util.Locale; public class mcMMO implements McMMOApi { /* Managers */ @@ -88,6 +89,7 @@ public class mcMMO implements McMMOApi { private ScoreboardManager scoreboardManager; private SoundManager soundManager; private HardcoreManager hardcoreManager; + private WorldGuardManager worldGuardManager; /* Not-Managers but my naming scheme sucks */ private DatabaseManagerFactory databaseManagerFactory; @@ -240,10 +242,14 @@ public class mcMMO implements McMMOApi { metrics = new Metrics(this); metrics.addCustomChart(new Metrics.SimplePie("version", () -> getDescription().getVersion())); - if (!configManager.getConfigLeveling().getConfigSectionLevelingGeneral().getConfigSectionLevelScaling().isRetroModeEnabled()) + int levelScaleModifier = configManager.getConfigLeveling().getConfigSectionLevelingGeneral().getConfigSectionLevelScaling().getCosmeticLevelScaleModifier(); + + if (levelScaleModifier == 10) metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Standard")); - else + else if (levelScaleModifier == 1) metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Retro")); + else + metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Custom")); } } catch (Throwable t) { getLogger().severe("There was an error while enabling mcMMO!"); @@ -310,13 +316,15 @@ public class mcMMO implements McMMOApi { public void onLoad() { + worldGuardUtils = new WorldGuardUtils(this); //Init WGU + if(getServer().getPluginManager().getPlugin("WorldGuard") != null) { - worldGuardUtils = new WorldGuardUtils(); //Init WGU if(worldGuardUtils.isWorldGuardLoaded()) { //Register flags System.out.println("[mcMMO - Registering World Guard Flags...]"); - worldGuardUtils.getWorldGuardManager().registerFlags(); + worldGuardManager = new WorldGuardManager(); + worldGuardManager.registerFlags(); } } } @@ -382,9 +390,9 @@ public class mcMMO implements McMMOApi { * @return the ServerSoftwareType which likely matches the server */ private ServerSoftwareType getServerSoftware() { - if (Bukkit.getVersion().toLowerCase().contains("paper")) + if (Bukkit.getVersion().toLowerCase(Locale.ENGLISH).contains("paper")) return ServerSoftwareType.PAPER; - else if (Bukkit.getVersion().toLowerCase().contains("spigot")) + else if (Bukkit.getVersion().toLowerCase(Locale.ENGLISH).contains("spigot")) return ServerSoftwareType.SPIGOT; else return ServerSoftwareType.CRAFTBUKKIT; @@ -513,17 +521,6 @@ public class mcMMO implements McMMOApi { return healthBarPluginEnabled; } - /** - * Checks if this plugin is using retro mode - * Retro mode is a 0-1000 skill system - * Standard mode is scaled for 1-100 - * - * @return true if retro mode is enabled - */ - public boolean isRetroModeEnabled() { - return configManager.isRetroMode(); - } - public ConfigManager getConfigManager() { return configManager; } @@ -763,7 +760,7 @@ public class mcMMO implements McMMOApi { } public WorldGuardManager getWorldGuardManager() { - return worldGuardUtils.getWorldGuardManager(); + return worldGuardManager; } public PartyManager getPartyManager() { diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/runnables/MobHealthDisplayUpdaterTask.java b/mcmmo-core/src/main/java/com/gmail/nossr50/runnables/MobHealthDisplayUpdaterTask.java index 3577163b7..b156a5972 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/runnables/MobHealthDisplayUpdaterTask.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/runnables/MobHealthDisplayUpdaterTask.java @@ -2,7 +2,6 @@ package com.gmail.nossr50.runnables; import com.gmail.nossr50.core.MetadataConstants; import com.gmail.nossr50.mcMMO; - import org.bukkit.entity.LivingEntity; import org.bukkit.scheduler.BukkitRunnable; diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java b/mcmmo-core/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java index 033fd7661..8ed7d880f 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -155,7 +155,8 @@ public class MiningManager extends SkillManager { if (pluginRef.getBlockTools().isOre(blockState)) { ores.add(blockState); - } else { + //A bug where beacons can drop when yield is set to 0 on explosion events is prevented here + } else if(blockState.getType() != Material.BEACON) { debris.add(blockState); } } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/util/MiscTools.java b/mcmmo-core/src/main/java/com/gmail/nossr50/util/MiscTools.java index 366b9de7e..564379715 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/util/MiscTools.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/util/MiscTools.java @@ -12,6 +12,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; import java.util.Collection; +import java.util.Locale; import java.util.Random; import java.util.Set; @@ -208,7 +209,7 @@ public final class MiscTools { String[] materialSplit = materialName.split("_"); if (materialSplit.length > 1) { - return materialSplit[0].toLowerCase(); + return materialSplit[0].toLowerCase(Locale.ENGLISH); } return "UnknownMods"; diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/util/PermissionTools.java b/mcmmo-core/src/main/java/com/gmail/nossr50/util/PermissionTools.java index e7fb54db5..784291b93 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/util/PermissionTools.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/util/PermissionTools.java @@ -18,6 +18,8 @@ import org.bukkit.permissions.PermissionDefault; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.SimplePluginManager; +import java.util.Locale; + public final class PermissionTools { private final mcMMO pluginRef; @@ -175,7 +177,7 @@ public final class PermissionTools { } public boolean mctop(Permissible permissible, PrimarySkillType skill) { - return permissible.hasPermission("mcmmo.commands.mctop." + skill.toString().toLowerCase()); + return permissible.hasPermission("mcmmo.commands.mctop." + skill.toString().toLowerCase(Locale.ENGLISH)); } public boolean mmoedit(Permissible permissible) { @@ -195,7 +197,7 @@ public final class PermissionTools { } public boolean skillreset(Permissible permissible, PrimarySkillType skill) { - return permissible.hasPermission("mcmmo.commands.skillreset." + skill.toString().toLowerCase()); + return permissible.hasPermission("mcmmo.commands.skillreset." + skill.toString().toLowerCase(Locale.ENGLISH)); } public boolean skillresetOthers(Permissible permissible) { @@ -203,11 +205,11 @@ public final class PermissionTools { } public boolean skillresetOthers(Permissible permissible, PrimarySkillType skill) { - return permissible.hasPermission("mcmmo.commands.skillreset.others." + skill.toString().toLowerCase()); + return permissible.hasPermission("mcmmo.commands.skillreset.others." + skill.toString().toLowerCase(Locale.ENGLISH)); } public boolean xplock(Permissible permissible, PrimarySkillType skill) { - return permissible.hasPermission("mcmmo.commands.xplock." + skill.toString().toLowerCase()); + return permissible.hasPermission("mcmmo.commands.xplock." + skill.toString().toLowerCase(Locale.ENGLISH)); } public boolean xprateSet(Permissible permissible) { @@ -257,32 +259,32 @@ public final class PermissionTools { } public boolean lucky(Permissible permissible, PrimarySkillType skill) { - return permissible.hasPermission("mcmmo.perks.lucky." + skill.toString().toLowerCase()); + return permissible.hasPermission("mcmmo.perks.lucky." + skill.toString().toLowerCase(Locale.ENGLISH)); } /* XP PERKS */ public boolean quadrupleXp(Permissible permissible, PrimarySkillType skill) { - return permissible.hasPermission("mcmmo.perks.xp.quadruple." + skill.toString().toLowerCase()); + return permissible.hasPermission("mcmmo.perks.xp.quadruple." + skill.toString().toLowerCase(Locale.ENGLISH)); } public boolean tripleXp(Permissible permissible, PrimarySkillType skill) { - return permissible.hasPermission("mcmmo.perks.xp.triple." + skill.toString().toLowerCase()); + return permissible.hasPermission("mcmmo.perks.xp.triple." + skill.toString().toLowerCase(Locale.ENGLISH)); } public boolean doubleAndOneHalfXp(Permissible permissible, PrimarySkillType skill) { - return permissible.hasPermission("mcmmo.perks.xp.150percentboost." + skill.toString().toLowerCase()); + return permissible.hasPermission("mcmmo.perks.xp.150percentboost." + skill.toString().toLowerCase(Locale.ENGLISH)); } public boolean doubleXp(Permissible permissible, PrimarySkillType skill) { - return permissible.hasPermission("mcmmo.perks.xp.double." + skill.toString().toLowerCase()); + return permissible.hasPermission("mcmmo.perks.xp.double." + skill.toString().toLowerCase(Locale.ENGLISH)); } public boolean oneAndOneHalfXp(Permissible permissible, PrimarySkillType skill) { - return permissible.hasPermission("mcmmo.perks.xp.50percentboost." + skill.toString().toLowerCase()); + return permissible.hasPermission("mcmmo.perks.xp.50percentboost." + skill.toString().toLowerCase(Locale.ENGLISH)); } public boolean oneAndOneTenthXp(Permissible permissible, PrimarySkillType skill) { - return permissible.hasPermission("mcmmo.perks.xp.10percentboost." + skill.toString().toLowerCase()); + return permissible.hasPermission("mcmmo.perks.xp.10percentboost." + skill.toString().toLowerCase(Locale.ENGLISH)); } public boolean hasCustomXPPerk(Permissible permissible, CustomXPPerk customXPPerk) { @@ -320,11 +322,11 @@ public final class PermissionTools { */ public boolean skillEnabled(Permissible permissible, PrimarySkillType skill) { - return permissible.hasPermission("mcmmo.skills." + skill.toString().toLowerCase()); + return permissible.hasPermission("mcmmo.skills." + skill.toString().toLowerCase(Locale.ENGLISH)); } public boolean vanillaXpBoost(Permissible permissible, PrimarySkillType skill) { - return permissible.hasPermission("mcmmo.ability." + skill.toString().toLowerCase() + ".vanillaxpboost"); + return permissible.hasPermission("mcmmo.ability." + skill.toString().toLowerCase(Locale.ENGLISH) + ".vanillaxpboost"); } public boolean isSubSkillEnabled(Permissible permissible, SubSkillType subSkillType) { @@ -336,7 +338,7 @@ public final class PermissionTools { } public boolean bonusDamage(Permissible permissible, PrimarySkillType skill) { - return permissible.hasPermission("mcmmo.ability." + skill.toString().toLowerCase() + ".bonusdamage"); + return permissible.hasPermission("mcmmo.ability." + skill.toString().toLowerCase(Locale.ENGLISH) + ".bonusdamage"); } /* ACROBATICS */ @@ -386,11 +388,11 @@ public final class PermissionTools { } public boolean greenThumbBlock(Permissible permissible, Material material) { - return permissible.hasPermission("mcmmo.ability.herbalism.greenthumb.blocks." + material.toString().replace("_", "").toLowerCase()); + return permissible.hasPermission("mcmmo.ability.herbalism.greenthumb.blocks." + material.toString().replace("_", "").toLowerCase(Locale.ENGLISH)); } public boolean greenThumbPlant(Permissible permissible, Material material) { - return permissible.hasPermission("mcmmo.ability.herbalism.greenthumb.plants." + material.toString().replace("_", "").toLowerCase()); + return permissible.hasPermission("mcmmo.ability.herbalism.greenthumb.plants." + material.toString().replace("_", "").toLowerCase(Locale.ENGLISH)); } /* MINING */ @@ -412,11 +414,11 @@ public final class PermissionTools { /* REPAIR */ public boolean repairItemType(Permissible permissible, ItemType repairItemType) { - return permissible.hasPermission("mcmmo.ability.repair." + repairItemType.toString().toLowerCase() + "repair"); + return permissible.hasPermission("mcmmo.ability.repair." + repairItemType.toString().toLowerCase(Locale.ENGLISH) + "repair"); } public boolean repairMaterialType(Permissible permissible, ItemMaterialCategory repairItemMaterialCategory) { - return permissible.hasPermission("mcmmo.ability.repair." + repairItemMaterialCategory.toString().toLowerCase() + "repair"); + return permissible.hasPermission("mcmmo.ability.repair." + repairItemMaterialCategory.toString().toLowerCase(Locale.ENGLISH) + "repair"); } /* SALVAGE */ @@ -429,11 +431,11 @@ public final class PermissionTools { } public boolean salvageItemType(Permissible permissible, ItemType salvageItemType) { - return permissible.hasPermission("mcmmo.ability.salvage." + salvageItemType.toString().toLowerCase() + "salvage"); + return permissible.hasPermission("mcmmo.ability.salvage." + salvageItemType.toString().toLowerCase(Locale.ENGLISH) + "salvage"); } public boolean salvageMaterialType(Permissible permissible, ItemMaterialCategory salvageItemMaterialCategory) { - return permissible.hasPermission("mcmmo.ability.salvage." + salvageItemMaterialCategory.toString().toLowerCase() + "salvage"); + return permissible.hasPermission("mcmmo.ability.salvage." + salvageItemMaterialCategory.toString().toLowerCase(Locale.ENGLISH) + "salvage"); } /* SMELTING */ @@ -452,7 +454,7 @@ public final class PermissionTools { /* TAMING */ public boolean callOfTheWild(Permissible permissible, EntityType type) { - return permissible.hasPermission("mcmmo.ability.taming.callofthewild." + type.toString().toLowerCase()); + return permissible.hasPermission("mcmmo.ability.taming.callofthewild." + type.toString().toLowerCase(Locale.ENGLISH)); } /* UNARMED */ @@ -477,7 +479,7 @@ public final class PermissionTools { } public boolean partySubcommand(Permissible permissible, PartySubcommandType subcommand) { - return permissible.hasPermission("mcmmo.commands.party." + subcommand.toString().toLowerCase()); + return permissible.hasPermission("mcmmo.commands.party." + subcommand.toString().toLowerCase(Locale.ENGLISH)); } public boolean friendlyFire(Permissible permissible) { diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/util/StringUtils.java b/mcmmo-core/src/main/java/com/gmail/nossr50/util/StringUtils.java index 4d6cd6383..f774e9d4d 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/util/StringUtils.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/util/StringUtils.java @@ -7,6 +7,8 @@ import org.bukkit.block.data.Ageable; import org.bukkit.block.data.BlockData; import org.bukkit.entity.EntityType; +import java.util.Locale; + public class StringUtils { /** @@ -16,7 +18,7 @@ public class StringUtils { * @return the capitalized string */ public static String getCapitalized(String target) { - return target.substring(0, 1).toUpperCase() + target.substring(1).toLowerCase(); + return target.substring(0, 1).toUpperCase() + target.substring(1).toLowerCase(Locale.ENGLISH); } /** diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java b/mcmmo-core/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java index 07259f7a8..00cd70ef1 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/util/TextComponentFactory.java @@ -14,6 +14,7 @@ import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.List; +import java.util.Locale; /** * This class handles many of the JSON components that mcMMO makes and uses @@ -537,7 +538,7 @@ public class TextComponentFactory { TextComponent unlockMessage = new TextComponent(""); unlockMessage.setText(pluginRef.getLocaleManager().getString("JSON.SkillUnlockMessage", subSkillType.getLocaleName(pluginRef), pluginRef.getRankTools().getRank(player, subSkillType))); unlockMessage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, getSubSkillHoverComponent(player, subSkillType))); - unlockMessage.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/" + pluginRef.getSkillTools().getPrimarySkillBySubSkill(subSkillType).toString().toLowerCase())); + unlockMessage.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/" + pluginRef.getSkillTools().getPrimarySkillBySubSkill(subSkillType).toString().toLowerCase(Locale.ENGLISH))); return unlockMessage; } } \ No newline at end of file diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java b/mcmmo-core/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java index e60e09f27..8fc2f31a7 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -25,6 +25,7 @@ import org.bukkit.command.PluginCommand; import java.util.ArrayList; import java.util.List; +import java.util.Locale; public final class CommandRegistrationManager { private final mcMMO pluginRef; @@ -37,8 +38,8 @@ public final class CommandRegistrationManager { private void registerSkillCommands() { for (PrimarySkillType primarySkillType : PrimarySkillType.values()) { - String commandName = primarySkillType.toString().toLowerCase(); - String localizedName = pluginRef.getSkillTools().getLocalizedSkillName(primarySkillType).toLowerCase(); + String commandName = primarySkillType.toString().toLowerCase(Locale.ENGLISH); + String localizedName = pluginRef.getSkillTools().getLocalizedSkillName(primarySkillType).toLowerCase(Locale.ENGLISH); PluginCommand command; diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/util/commands/CommandTools.java b/mcmmo-core/src/main/java/com/gmail/nossr50/util/commands/CommandTools.java index d3a0d8026..427cae861 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/util/commands/CommandTools.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/util/commands/CommandTools.java @@ -12,6 +12,7 @@ import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.List; +import java.util.Locale; public final class CommandTools { private final mcMMO pluginRef; @@ -288,7 +289,7 @@ public final class CommandTools { break; } - if (playerName.toLowerCase().contains(partialName.toLowerCase())) { + if (playerName.toLowerCase(Locale.ENGLISH).contains(partialName.toLowerCase(Locale.ENGLISH))) { // Partial match matchedPlayers.add(playerName); } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java b/mcmmo-core/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java index 9611f1a7f..b90ce6de0 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java @@ -9,10 +9,10 @@ import java.util.Map; public class FormulaManager { // Experience needed to reach a level, cached values for speed - private Map experienceNeededRetroLinear; - private Map experienceNeededStandardLinear; - private Map experienceNeededRetroExponential; - private Map experienceNeededStandardExponential; + private Map experienceNeededCosmeticLinear; + private Map experienceNeededLinear; + private Map experienceNeededCosmeticExponential; + private Map experienceNeededExponential; private FormulaType currentFormula; private final mcMMO pluginRef; @@ -27,10 +27,10 @@ public class FormulaManager { * Initialize maps used for XP to next level */ private void initExperienceNeededMaps() { - experienceNeededRetroLinear = new HashMap<>(); - experienceNeededRetroExponential = new HashMap<>(); - experienceNeededStandardLinear = new HashMap<>(); - experienceNeededStandardExponential = new HashMap<>(); + experienceNeededCosmeticLinear = new HashMap<>(); + experienceNeededCosmeticExponential = new HashMap<>(); + experienceNeededLinear = new HashMap<>(); + experienceNeededExponential = new HashMap<>(); } /** @@ -120,34 +120,21 @@ public class FormulaManager { return processXPToNextLevel(level, currentFormula); } - /** - * Gets the value of XP needed for the next level based on the level Scaling, the level, and the formula type - * @param level target level - * @param formulaType target formulaType - */ - private int processXPToNextLevel(int level, FormulaType formulaType) { - if(pluginRef.isRetroModeEnabled()) - { - return processXPRetroToNextLevel(level, formulaType); - } else { - return processStandardXPToNextLevel(level, formulaType); - } - } - /** * Calculate the XP needed for the next level for the linear formula for Standard scaling (1-100) * @param level target level * @return raw xp needed to reach the next level */ - private int processStandardXPToNextLevel(int level, FormulaType formulaType) { - Map experienceMapRef = formulaType == FormulaType.LINEAR ? experienceNeededStandardLinear : experienceNeededStandardExponential; + private int processXPToNextLevel(int level, FormulaType formulaType) { + Map experienceMapRef = formulaType == FormulaType.LINEAR ? experienceNeededLinear : experienceNeededExponential; if(!experienceMapRef.containsKey(level)) { + int cosmeticScaleMod = pluginRef.getPlayerLevelingSettings().getCosmeticLevelScaleModifier(); int experienceSum = 0; - int retroIndex = (level * 10) + 1; + int cosmeticIndex = (level * cosmeticScaleMod) + 1; //Sum the range of levels in Retro that this Standard level would represent - for(int x = retroIndex; x < (retroIndex + 10); x++) { + for(int x = cosmeticIndex; x < (cosmeticIndex + cosmeticScaleMod); x++) { //calculateXPNeeded doesn't cache results so we use that instead of invoking the Retro XP methods to avoid memory bloat experienceSum += calculateXPNeeded(x, formulaType); } @@ -166,7 +153,7 @@ public class FormulaManager { * @return raw xp needed to reach the next level based on formula type */ private int processXPRetroToNextLevel(int level, FormulaType formulaType) { - Map experienceMapRef = formulaType == FormulaType.LINEAR ? experienceNeededRetroLinear : experienceNeededRetroExponential; + Map experienceMapRef = formulaType == FormulaType.LINEAR ? experienceNeededCosmeticLinear : experienceNeededCosmeticExponential; if (!experienceMapRef.containsKey(level)) { int experience = calculateXPNeeded(level, formulaType); diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/util/random/RandomChanceTools.java b/mcmmo-core/src/main/java/com/gmail/nossr50/util/random/RandomChanceTools.java index da78e3a19..ec49f7702 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/util/random/RandomChanceTools.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/util/random/RandomChanceTools.java @@ -10,7 +10,7 @@ import com.gmail.nossr50.util.skills.SkillActivationType; import org.bukkit.entity.Player; import java.text.DecimalFormat; -import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; public class RandomChanceTools { @@ -79,10 +79,8 @@ public class RandomChanceTools { return rollDice(chance, 10000); } - public boolean rollDice(double chanceOfSuccess, int bound) { - Random random = new Random(); - - return chanceOfSuccess > random.nextInt(bound); + public static boolean rollDice(double chanceOfSuccess, int bound) { + return chanceOfSuccess > ThreadLocalRandom.current().nextInt(bound); } /** diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java b/mcmmo-core/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java index 25f693237..40919a5b4 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java @@ -163,7 +163,7 @@ public class ScoreboardWrapper { revertTask = new ScoreboardChangeTask().runTaskLater(pluginRef, ticks); // TODO is there any way to do the time that looks acceptable? - // player.sendMessage(pluginRef.getLocaleManager().getString("Commands.ConfigScoreboard.Timer", StringUtils.capitalize(sidebarType.toString().toLowerCase()), ticks / 20F)); + // player.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Timer", StringUtils.capitalize(sidebarType.toString().toLowerCase(Locale.ENGLISH)), ticks / 20F)); if (pluginRef.getUserManager().getPlayer(playerName) == null) return; diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/util/skills/RankTools.java b/mcmmo-core/src/main/java/com/gmail/nossr50/util/skills/RankTools.java index f4b6af076..76559bcf7 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/util/skills/RankTools.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/util/skills/RankTools.java @@ -392,7 +392,7 @@ public class RankTools { .getNode(subSkillType.getHoconFriendlyConfigName()) .getValue(TypeToken.of(SkillRankProperty.class)); - int unlockLevel = skillRankProperty.getUnlockLevel(pluginRef.isRetroModeEnabled(), rank); + int unlockLevel = skillRankProperty.getUnlockLevel(pluginRef, rank); return unlockLevel; } catch (ObjectMappingException | MissingSkillPropertyDefinition | NullPointerException e) { diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/util/sounds/SoundManager.java b/mcmmo-core/src/main/java/com/gmail/nossr50/util/sounds/SoundManager.java index 3de1da72b..580b8f7af 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/util/sounds/SoundManager.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/util/sounds/SoundManager.java @@ -93,6 +93,8 @@ public class SoundManager { case DEFLECT_ARROWS: case BLEED: return Sound.ENTITY_ENDER_EYE_DEATH; + case GLASS: + return Sound.BLOCK_GLASS_BREAK; default: return null; } diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/util/sounds/SoundType.java b/mcmmo-core/src/main/java/com/gmail/nossr50/util/sounds/SoundType.java index c4d428be5..f1eacd550 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/util/sounds/SoundType.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/util/sounds/SoundType.java @@ -14,6 +14,7 @@ public enum SoundType { ABILITY_ACTIVATED_GENERIC, ABILITY_ACTIVATED_BERSERK, BLEED, + GLASS, TIRED; public boolean usesCustomPitch() { diff --git a/mcmmo-core/src/main/java/com/gmail/nossr50/worldguard/WorldGuardUtils.java b/mcmmo-core/src/main/java/com/gmail/nossr50/worldguard/WorldGuardUtils.java index 3c745dad6..3b1899b2e 100644 --- a/mcmmo-core/src/main/java/com/gmail/nossr50/worldguard/WorldGuardUtils.java +++ b/mcmmo-core/src/main/java/com/gmail/nossr50/worldguard/WorldGuardUtils.java @@ -1,6 +1,9 @@ package com.gmail.nossr50.worldguard; +import com.gmail.nossr50.mcMMO; +import com.sk89q.worldguard.WorldGuard; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; +import com.sk89q.worldguard.protection.flags.registry.SimpleFlagRegistry; import org.bukkit.plugin.Plugin; import java.util.ArrayList; @@ -12,10 +15,7 @@ public class WorldGuardUtils { private boolean isLoaded = false; private boolean detectedIncompatibleWG = false; private static final ArrayList WGClassList; - private WorldGuardManager worldGuardManager; - - public WorldGuardUtils() { - } + protected final mcMMO pluginRef; static { /* @@ -41,6 +41,10 @@ public class WorldGuardUtils { WGClassList.add("com.sk89q.worldguard.protection.regions.RegionQuery"); } + public WorldGuardUtils(mcMMO pluginRef) { + this.pluginRef = pluginRef; + } + public boolean isWorldGuardLoaded() { if(detectedIncompatibleWG) @@ -68,7 +72,7 @@ public class WorldGuardUtils { if(plugin == null) { //WG is not present detectedIncompatibleWG = true; - System.out.println("[mcMMO WorldGuardUtils Debug] WorldGuard was not detected."); + pluginRef.getLogger().info("WorldGuard was not detected."); } else { //Check that its actually of class WorldGuardPlugin if(plugin instanceof WorldGuardPlugin) @@ -77,9 +81,6 @@ public class WorldGuardUtils { { worldGuardPluginRef = (WorldGuardPlugin) plugin; isLoaded = true; - - //Init WG Manager - worldGuardManager = new WorldGuardManager(); } } else { //Plugin is not of the expected type @@ -87,6 +88,7 @@ public class WorldGuardUtils { } } + return worldGuardPluginRef; } @@ -98,7 +100,10 @@ public class WorldGuardUtils { */ private boolean isCompatibleVersion(Plugin plugin) { //Check that the version of WG is at least version 7.xx -// boolean allClassesFound = true; + boolean allClassesFound = true; + if (detectedIncompatibleWG) { + return false; + } if (!plugin.getDescription().getVersion().startsWith("7")) { markWGIncompatible(); @@ -107,10 +112,9 @@ public class WorldGuardUtils { for(String classString : WGClassList) { try { Class checkForClass = Class.forName(classString); - detectedIncompatibleWG = false; //In case this was set to true previously } catch (ClassNotFoundException | NoClassDefFoundError e) { -// allClassesFound = false; - System.out.println("[mcMMO WorldGuardUtils Debug] Missing WorldGuard class - "+classString); + allClassesFound = false; + pluginRef.getLogger().severe("Missing WorldGuard class - "+classString); markWGIncompatible(); } } @@ -118,17 +122,17 @@ public class WorldGuardUtils { /* * If WG appears to have all of its classes we can then check to see if its been initialized properly */ -// try { -// if(allClassesFound) { -// if(!((SimpleFlagRegistry) WorldGuard.getInstance().getFlagRegistry()).isInitialized()) { -// markWGIncompatible(); -// System.out.println("[mcMMO WorldGuardUtils Debug] WG did not initialize properly, this can cause errors with mcMMO so mcMMO is disabling certain features."); -// } -// } -// } catch (Exception e) { -// markWGIncompatible(); -// e.printStackTrace(); -// } + try { + if(allClassesFound) { + if(!((SimpleFlagRegistry) WorldGuard.getInstance().getFlagRegistry()).isInitialized()) { + markWGIncompatible(); + pluginRef.getLogger().severe("WG did not initialize properly, this can cause errors with mcMMO so mcMMO is disabling certain features."); + } + } + } catch (Exception e) { + markWGIncompatible(); + e.printStackTrace(); + } } return !detectedIncompatibleWG; @@ -138,14 +142,10 @@ public class WorldGuardUtils { * Mark WG as being incompatible to avoid unnecessary operations */ private void markWGIncompatible() { - System.out.println("[mcMMO WorldGuardUtils Debug] You are using a version of WG that is not compatible with mcMMO, " + + pluginRef.getLogger().severe("You are using a version of WG that is not compatible with mcMMO, " + "WG features for mcMMO will be disabled. mcMMO requires you to be using a new version of WG7 " + "in order for it to use WG features. Not all versions of WG7 are compatible."); - System.out.println("[mcMMO WorldGuardUtils Debug] mcMMO will continue to function normally, but if you wish to use WG support you must use a compatible version."); + pluginRef.getLogger().severe("mcMMO will continue to function normally, but if you wish to use WG support you must use a compatible version."); detectedIncompatibleWG = true; } - - public WorldGuardManager getWorldGuardManager() { - return worldGuardManager; - } } diff --git a/mcmmo-core/src/main/resources/config.yml b/mcmmo-core/src/main/resources/config.yml index 5464e7223..973e2c8cc 100644 --- a/mcmmo-core/src/main/resources/config.yml +++ b/mcmmo-core/src/main/resources/config.yml @@ -436,7 +436,7 @@ Bonus_Drops: Melon_Slice: true Nether_Wart: true Potatoes: true - Potatoe: true + Potato: true Pumpkin: true Red_Mushroom: true Sugar_Cane: true diff --git a/mcmmo-core/src/main/resources/experience.yml b/mcmmo-core/src/main/resources/experience.yml index 920805fd2..88a77a3c1 100644 --- a/mcmmo-core/src/main/resources/experience.yml +++ b/mcmmo-core/src/main/resources/experience.yml @@ -33,6 +33,7 @@ ExploitFix: LavaStoneAndCobbleFarming: true TreeFellerReducedXP: true PistonCheating: true + SnowGolemExcavation: true Experience_Bars: # Turn this to false if you wanna disable XP bars Enable: true diff --git a/mcmmo-core/src/main/resources/fishing_treasures.yml b/mcmmo-core/src/main/resources/fishing_treasures.yml index c0a474089..2e64ea16e 100644 --- a/mcmmo-core/src/main/resources/fishing_treasures.yml +++ b/mcmmo-core/src/main/resources/fishing_treasures.yml @@ -561,6 +561,7 @@ Enchantment_Drop_Rates: LEGENDARY: 0.75 # # Settings for Excavation's Archaeology +# If you are in retro mode, Drop_Level is multiplied by 10. ### Excavation: CAKE: @@ -691,6 +692,7 @@ Excavation: Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand] # # Settings for Hylian Luck +# If you are in retro mode, Drop_Level is multiplied by 10. ### Hylian_Luck: MELON_SEEDS: @@ -748,7 +750,8 @@ Hylian_Luck: Drop_Level: 0 Drops_From: [Pots] # -# Settings for Shake +# Settings for Shake +# If you are in retro mode, Drop_Level is multiplied by 10. ### Shake: BLAZE: diff --git a/mcmmo-core/src/main/resources/sounds.yml b/mcmmo-core/src/main/resources/sounds.yml index d34ddddcd..837559568 100644 --- a/mcmmo-core/src/main/resources/sounds.yml +++ b/mcmmo-core/src/main/resources/sounds.yml @@ -4,6 +4,10 @@ Sounds: # 1.0 = Max volume # 0.0 = No Volume MasterVolume: 1.0 + GLASS: + Enable: true + Volume: 1.0 + Pitch: 1.0 ANVIL: Enable: true Volume: 1.0