Merge branch 'configurable' into api

This commit is contained in:
Shane Freeder 2020-01-30 10:24:18 +00:00
commit 4ee86bf6a6
No known key found for this signature in database
GPG Key ID: A3F61EA5A085289C
72 changed files with 353 additions and 587 deletions

View File

@ -5,6 +5,8 @@ Version 2.2.0
!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!
mcMMO's config system has been rewritten 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 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 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 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 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 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 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 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 Fixed a NPE that can occur if a player engages in combat with specific skills before their profile is loaded

View File

@ -7,7 +7,6 @@ import com.gmail.nossr50.datatypes.party.PartyTeleportRecord;
import com.gmail.nossr50.datatypes.player.BukkitMMOPlayer; import com.gmail.nossr50.datatypes.player.BukkitMMOPlayer;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandExecutor;

View File

@ -19,6 +19,7 @@ import org.bukkit.entity.Player;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Set; import java.util.Set;
public abstract class SkillCommand implements TabExecutor { 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) { private void sendSkillCommandHeader(Player player, BukkitMMOPlayer mcMMOPlayer, int skillValue) {

View File

@ -51,7 +51,6 @@ import com.gmail.nossr50.datatypes.experience.FormulaType;
import com.gmail.nossr50.datatypes.party.PartyFeature; import com.gmail.nossr50.datatypes.party.PartyFeature;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.datatypes.skills.properties.DamageProperty; 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.CallOfTheWildType;
import com.gmail.nossr50.datatypes.skills.subskills.taming.TamingSummon; import com.gmail.nossr50.datatypes.skills.subskills.taming.TamingSummon;
import com.gmail.nossr50.mcMMO; 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(CustomXPPerk.class), new CustomXPPerkSerializer());
customSerializers.registerType(TypeToken.of(DamageProperty.class), new DamagePropertySerializer()); customSerializers.registerType(TypeToken.of(DamageProperty.class), new DamagePropertySerializer());
customSerializers.registerType(TypeToken.of(SkillRankProperty.class), new SkillRankPropertySerializer()); 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(PlayerNotificationSettings.class), new PlayerNotificationSerializer());
customSerializers.registerType(TypeToken.of(SoundSetting.class), new SoundSettingSerializer()); customSerializers.registerType(TypeToken.of(SoundSetting.class), new SoundSettingSerializer());
// customSerializers.registerType(TypeToken.of(ItemWildcards.class), new ItemWildcardSerializer()); // customSerializers.registerType(TypeToken.of(ItemWildcards.class), new ItemWildcardSerializer());
@ -483,17 +481,6 @@ public final class ConfigManager {
return configRanks.getRootNode(); 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() { public ConfigExperience getConfigExperience() {
return configExperience.getConfig(); return configExperience.getConfig();
} }

View File

@ -5,5 +5,4 @@ import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
@ConfigSerializable @ConfigSerializable
public class General { public class General {
} }

View File

@ -4,11 +4,13 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.StringUtils; import com.gmail.nossr50.util.StringUtils;
import java.util.Locale;
public class SkillConfigFactory { public class SkillConfigFactory {
protected static SerializedConfigLoader initSkillConfig(mcMMO pluginRef, PrimarySkillType primarySkillType, Class<?> clazz) { protected static SerializedConfigLoader initSkillConfig(mcMMO pluginRef, PrimarySkillType primarySkillType, Class<?> clazz) {
return new SerializedConfigLoader(pluginRef, clazz, return new SerializedConfigLoader(pluginRef, clazz,
primarySkillType.toString().toLowerCase() + ".conf", primarySkillType.toString().toLowerCase(Locale.ENGLISH) + ".conf",
StringUtils.getCapitalized(primarySkillType.toString()), StringUtils.getCapitalized(primarySkillType.toString()),
null); null);
} }

View File

@ -119,4 +119,8 @@ public class ConfigExploitPrevention {
public ConfigSectionExploitTaming getConfigSectionExploitTaming() { public ConfigSectionExploitTaming getConfigSectionExploitTaming() {
return configSectionExploitSkills.getConfigSectionExploitTaming(); return configSectionExploitSkills.getConfigSectionExploitTaming();
} }
public boolean isSnowGolemExploitPrevented() {
return configSectionExploitSkills.isSnowGolemExploitPrevented();
}
} }

View File

@ -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;
}
}

View File

@ -26,6 +26,9 @@ public class ConfigSectionExploitSkills {
@Setting(value = "Taming", comment = "Exploit settings related to Taming") @Setting(value = "Taming", comment = "Exploit settings related to Taming")
private ConfigSectionExploitTaming configSectionExploitTaming = new ConfigSectionExploitTaming(); private ConfigSectionExploitTaming configSectionExploitTaming = new ConfigSectionExploitTaming();
@Setting(value = "Excavation", comment = "Exploit settings related to Excavation.")
private ConfigSectionExploitExcavation configSectionExploitExcavation = new ConfigSectionExploitExcavation();
public ConfigSectionExploitAcrobatics getConfigSectionExploitAcrobatics() { public ConfigSectionExploitAcrobatics getConfigSectionExploitAcrobatics() {
return configSectionExploitAcrobatics; return configSectionExploitAcrobatics;
} }
@ -46,6 +49,10 @@ public class ConfigSectionExploitSkills {
return configSectionExploitMining.isPreventCobblestoneStoneGeneratorXP(); return configSectionExploitMining.isPreventCobblestoneStoneGeneratorXP();
} }
public boolean isSnowGolemExploitPrevented() {
return configSectionExploitExcavation.isSnowGolemExploitPrevented();
}
public boolean areSummonsBreedable() { public boolean areSummonsBreedable() {
return configSectionExploitTaming.areSummonsBreedable(); return configSectionExploitTaming.areSummonsBreedable();
} }

View File

@ -129,6 +129,10 @@ public class ConfigLeveling {
return configSectionLevelCaps; return configSectionLevelCaps;
} }
public int getCosmeticLevelScaleModifier() {
return configSectionLevelingGeneral.getCosmeticLevelScaleModifier();
}
public ConfigSectionSkillLevelCap getPowerLevelSettings() { public ConfigSectionSkillLevelCap getPowerLevelSettings() {
return configSectionLevelCaps.getPowerLevelSettings(); return configSectionLevelCaps.getPowerLevelSettings();
} }
@ -161,10 +165,6 @@ public class ConfigLeveling {
return configExperienceFormula.getFormulaType(); return configExperienceFormula.getFormulaType();
} }
public boolean isRetroModeEnabled() {
return getConfigSectionLevelScaling().isRetroModeEnabled();
}
public ConfigExperienceFormulaLinear getConfigExperienceFormulaLinear() { public ConfigExperienceFormulaLinear getConfigExperienceFormulaLinear() {
return configExperienceFormula.getConfigExperienceFormulaLinear(); return configExperienceFormula.getConfigExperienceFormulaLinear();
} }

View File

@ -7,22 +7,19 @@ import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
public class ConfigSectionLevelScaling { public class ConfigSectionLevelScaling {
/* DEFAULT VALUES */ /* DEFAULT VALUES */
public static final boolean USE_RETRO_MODE_DEFAULT = true; public static final int LEVEL_SCALE_MODIFIER_DEFAULT = 1;
/* /*
* CONFIG NODES * CONFIG NODES
*/ */
@Setting(value = "Use-Retro-Mode", @Setting(value = "Cosmetic-Level-Scaling",
comment = "Enables 1-1000 Level Scaling" + comment = "Changes the max number of levels and adjusts settings appropriately" +
"\nIf set to false, Standard Scaling is used instead (1-100 Level Scaling)") "\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." +
private boolean useRetroMode = USE_RETRO_MODE_DEFAULT; "\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;
/* public int getCosmeticLevelScaleModifier() {
* GETTER BOILERPLATE return cosmeticLevelScaleModifier;
*/
public boolean isRetroModeEnabled() {
return useRetroMode;
} }
} }

View File

@ -15,16 +15,8 @@ public class ConfigSectionLevelingGeneral {
@Setting(value = "Player-Level-Scaling", @Setting(value = "Player-Level-Scaling",
comment = "Level Scaling is a new feature of mcMMO." + comment = "Level Scaling is a new feature of mcMMO." +
"\nServer admins can choose between two level scaling modes." + "\nServer admins can adjust level scaling modifiers to tweak a bunch of settings related to progression at once." +
"\nEach mode is meant to be identical to each other in terms of the speed of progression." + "\nIt is not recommended to change this away from defaults unless you know what you are doing.")
"\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.")
private ConfigSectionLevelScaling configSectionLevelScaling = new ConfigSectionLevelScaling(); private ConfigSectionLevelScaling configSectionLevelScaling = new ConfigSectionLevelScaling();
@Setting(value = "Player-Starting-Level", @Setting(value = "Player-Starting-Level",
@ -44,4 +36,8 @@ public class ConfigSectionLevelingGeneral {
public ConfigSectionLevelScaling getConfigSectionLevelScaling() { public ConfigSectionLevelScaling getConfigSectionLevelScaling() {
return configSectionLevelScaling; return configSectionLevelScaling;
} }
public int getCosmeticLevelScaleModifier() {
return configSectionLevelScaling.getCosmeticLevelScaleModifier();
}
} }

View File

@ -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<MaxBonusLevel> {
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());
}
}

View File

@ -13,21 +13,17 @@ import java.util.Map;
public class SkillRankPropertySerializer implements TypeSerializer<SkillRankProperty> { public class SkillRankPropertySerializer implements TypeSerializer<SkillRankProperty> {
private static final String STANDARD_RANK_UNLOCK_LEVEL_REQUIREMENTS = "Standard-Rank-Unlock-Level-Requirements"; private static final String RANK_UNLOCK_LEVEL_REQUIREMENTS = "Standard-Rank-Unlock-Level-Requirements";
private static final String RETRO_RANK_UNLOCK_LEVEL_REQUIREMENTS = "Retro-Rank-Unlock-Level-Requirements";
@Nullable @Nullable
@Override @Override
public SkillRankProperty deserialize(@NonNull TypeToken<?> type, @NonNull ConfigurationNode value) throws ObjectMappingException { public SkillRankProperty deserialize(@NonNull TypeToken<?> type, @NonNull ConfigurationNode value) throws ObjectMappingException {
HashMap<Integer, Integer> standardHashMap; HashMap<Integer, Integer> standardHashMap;
HashMap<Integer, Integer> retroHashMap;
try { try {
Map<? extends Integer, ? extends Integer> standardMap = value.getNode(STANDARD_RANK_UNLOCK_LEVEL_REQUIREMENTS).getValue(new TypeToken<Map<? extends Integer, ? extends Integer>>() {}); Map<? extends Integer, ? extends Integer> standardMap = value.getNode(RANK_UNLOCK_LEVEL_REQUIREMENTS).getValue(new TypeToken<Map<? extends Integer, ? extends Integer>>() {});
Map<? extends Integer, ? extends Integer> retroMap = value.getNode(RETRO_RANK_UNLOCK_LEVEL_REQUIREMENTS).getValue(new TypeToken<Map<? extends Integer, ? extends Integer>>() {});
standardHashMap = new HashMap<>(standardMap); standardHashMap = new HashMap<>(standardMap);
retroHashMap = new HashMap<>(retroMap);
} catch (ObjectMappingException e) { } 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."); 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<SkillRankProp
} }
SkillRankProperty skillRankProperty = new SkillRankProperty(); SkillRankProperty skillRankProperty = new SkillRankProperty();
skillRankProperty.setStandardRanks(standardHashMap); skillRankProperty.setRanks(standardHashMap);
skillRankProperty.setRetroRanks(retroHashMap);
return skillRankProperty; return skillRankProperty;
} }
@Override @Override
public void serialize(@NonNull TypeToken<?> type, @Nullable SkillRankProperty obj, @NonNull ConfigurationNode value) throws ObjectMappingException { public void serialize(@NonNull TypeToken<?> type, @Nullable SkillRankProperty obj, @NonNull ConfigurationNode value) throws ObjectMappingException {
value.getNode(STANDARD_RANK_UNLOCK_LEVEL_REQUIREMENTS).setValue(obj.getStandardRanks()); value.getNode(RANK_UNLOCK_LEVEL_REQUIREMENTS).setValue(obj.getRanks());
value.getNode(RETRO_RANK_UNLOCK_LEVEL_REQUIREMENTS).setValue(obj.getRetroRanks());
} }
} }

View File

@ -1,8 +1,6 @@
package com.gmail.nossr50.config.skills; package com.gmail.nossr50.config.skills;
import com.gmail.nossr50.config.ConfigConstants; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; 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." + @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 " + "\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.") "\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; return maxBonusLevel;
} }
} }

View File

@ -1,8 +1,6 @@
package com.gmail.nossr50.config.skills.acrobatics.dodge; package com.gmail.nossr50.config.skills.acrobatics.dodge;
import com.gmail.nossr50.config.ConfigConstants; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
@ -22,25 +20,11 @@ public class ConfigDodge {
"\nDefault value: " + DAMAGE_REDUCTION_DIVISOR_DEFAULT) "\nDefault value: " + DAMAGE_REDUCTION_DIVISOR_DEFAULT)
private double damageReductionDivisor = 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." + @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
"\nSkills dynamically adjust their rewards to match the max bonus level, you can think of it as a curve that calculates what bonuses " + private double maxChance = 100.0;
"\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;
}
public double getChanceAtMaxSkill() { public double getChanceAtMaxSkill() {
return chanceAtMaxSkill; return maxChance;
} }
public double getDamageReductionDivisor() { public double getDamageReductionDivisor() {

View File

@ -1,8 +1,6 @@
package com.gmail.nossr50.config.skills.acrobatics.roll; package com.gmail.nossr50.config.skills.acrobatics.roll;
import com.gmail.nossr50.config.ConfigConstants; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
@ -10,9 +8,6 @@ import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
public class ConfigRoll { public class ConfigRoll {
public static final double ROLL_DAMAGE_THRESHOLD_DEFAULT = 7.0D; 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; public static final double CHANCE_AT_MAX_SKILL_DEFAULT = 100.0D;
@Setting(value = "Damage-Threshold", comment = "Rolling will reduce up to this much damage." + @Setting(value = "Damage-Threshold", comment = "Rolling will reduce up to this much damage." +
@ -24,24 +19,10 @@ public class ConfigRoll {
return damageTheshold; 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." + @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
"\nSkills dynamically adjust their rewards to match the max bonus level, you can think of it as a curve that calculates what bonuses " + private double maxChance = 100.0D;
"\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;
}
public double getChanceAtMaxSkill() { public double getChanceAtMaxSkill() {
return chanceAtMaxSkill; return maxChance;
} }
} }

View File

@ -1,8 +1,6 @@
package com.gmail.nossr50.config.skills.archery; package com.gmail.nossr50.config.skills.archery;
import com.gmail.nossr50.config.ConfigConstants; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; 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) @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
private double maxChance = 100.0D; private double maxChance = 100.0D;
@Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME)
private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
public double getMaxChance() { public double getMaxChance() {
return maxChance; return maxChance;
} }
public MaxBonusLevel getMaxBonusLevel() {
return maxBonusLevel;
}
} }

View File

@ -1,8 +1,6 @@
package com.gmail.nossr50.config.skills.archery; package com.gmail.nossr50.config.skills.archery;
import com.gmail.nossr50.config.ConfigConstants; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
@ -15,9 +13,6 @@ public class ConfigArcheryDaze {
+ "\nDefault value: "+DAZE_MAX_CHANCE_DEFAULT) + "\nDefault value: "+DAZE_MAX_CHANCE_DEFAULT)
private double maxChance = 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." + @Setting(value = "Bonus-Damage", comment = "How much bonus damage is applied when daze is applied to a target." +
"\nDefault value: "+DAZE_BONUS_DMG_DEFAULT) "\nDefault value: "+DAZE_BONUS_DMG_DEFAULT)
private double bonusDamage = DAZE_BONUS_DMG_DEFAULT; private double bonusDamage = DAZE_BONUS_DMG_DEFAULT;
@ -26,10 +21,6 @@ public class ConfigArcheryDaze {
return maxChance; return maxChance;
} }
public MaxBonusLevel getMaxBonusLevel() {
return maxBonusLevel;
}
public double getDazeBonusDamage() { public double getDazeBonusDamage() {
return bonusDamage; return bonusDamage;
} }

View File

@ -2,7 +2,6 @@ package com.gmail.nossr50.config.skills.axes;
import com.gmail.nossr50.config.ConfigConstants; import com.gmail.nossr50.config.ConfigConstants;
import com.gmail.nossr50.datatypes.skills.properties.AbstractDamageProperty; 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 com.gmail.nossr50.datatypes.skills.properties.DamageProperty;
import ninja.leaping.configurate.objectmapping.Setting; import ninja.leaping.configurate.objectmapping.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
@ -12,18 +11,14 @@ public class ConfigAxesCriticalStrikes {
private static final double MAX_ACTIVATION_CHANCE_DEFAULT = 37.50D; 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." + @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
"\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 maxChance = MAX_ACTIVATION_CHANCE_DEFAULT;
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 = "Damage-Modifiers", comment = "Damage dealt is multiplied by these values when this skill is successfully activated.") @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); private DamageProperty damageProperty = new AbstractDamageProperty(1.5, 2.0);
public double getMaxActivationChance() { public double getMaxActivationChance() {
return maxActivationChance; return maxChance;
} }
public DamageProperty getDamageProperty() { public DamageProperty getDamageProperty() {

View File

@ -1,8 +1,6 @@
package com.gmail.nossr50.config.skills.herbalism; package com.gmail.nossr50.config.skills.herbalism;
import com.gmail.nossr50.config.ConfigConstants; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; 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) @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
private double maxChance = 100.0; private double maxChance = 100.0;
@Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME)
private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
} }

View File

@ -1,8 +1,6 @@
package com.gmail.nossr50.config.skills.herbalism; package com.gmail.nossr50.config.skills.herbalism;
import com.gmail.nossr50.config.ConfigConstants; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; 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) @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
private double maxChance = 100.0; private double maxChance = 100.0;
@Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME)
private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
} }

View File

@ -1,8 +1,6 @@
package com.gmail.nossr50.config.skills.herbalism; package com.gmail.nossr50.config.skills.herbalism;
import com.gmail.nossr50.config.ConfigConstants; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; 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) @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
private double maxChance = 10.0; private double maxChance = 10.0;
@Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME)
private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
} }

View File

@ -1,8 +1,6 @@
package com.gmail.nossr50.config.skills.herbalism; package com.gmail.nossr50.config.skills.herbalism;
import com.gmail.nossr50.config.ConfigConstants; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; 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) @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
private double maxChance = 50.0; private double maxChance = 50.0;
@Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME)
private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
} }

View File

@ -1,8 +1,6 @@
package com.gmail.nossr50.config.skills.mining; package com.gmail.nossr50.config.skills.mining;
import com.gmail.nossr50.config.ConfigConstants; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; 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) @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
private double maxChance = 100.0; 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.") @Setting(value = "Silk-Touch-Double-Drops", comment = "Allow silk touch to benefit from double drops.")
private boolean allowSilkTouchDoubleDrops = true; private boolean allowSilkTouchDoubleDrops = true;

View File

@ -2,13 +2,14 @@ package com.gmail.nossr50.config.skills.ranks;
import com.gmail.nossr50.api.exceptions.MissingSkillPropertyDefinition; import com.gmail.nossr50.api.exceptions.MissingSkillPropertyDefinition;
import com.gmail.nossr50.datatypes.skills.properties.SkillProperty; import com.gmail.nossr50.datatypes.skills.properties.SkillProperty;
import com.gmail.nossr50.mcMMO;
import org.apache.logging.log4j.Level;
import java.util.HashMap; import java.util.HashMap;
public class SkillRankProperty implements SkillProperty { public class SkillRankProperty implements SkillProperty {
private HashMap<Integer, Integer> standardRanks; private HashMap<Integer, Integer> ranks;
private HashMap<Integer, Integer> retroRanks;
public SkillRankProperty(Integer... rankDefinitions) { public SkillRankProperty(Integer... rankDefinitions) {
initRankMaps(); initRankMaps();
@ -16,88 +17,59 @@ public class SkillRankProperty implements SkillProperty {
for(int x = 0; x < rankDefinitions.length; x++) { for(int x = 0; x < rankDefinitions.length; x++) {
int curRank = x+1; int curRank = x+1;
addStandardAndRetroRank(curRank, rankDefinitions[x]); addRank(curRank, rankDefinitions[x]);
} }
} }
public SkillRankProperty(HashMap<Integer, Integer> standardRanks, HashMap<Integer, Integer> retroRanks) { public SkillRankProperty(HashMap<Integer, Integer> ranks) {
this.standardRanks = standardRanks; this.ranks = ranks;
this.retroRanks = retroRanks;
} }
/** /**
* Convenience method to add Standard and Retro at the same time for default initialization of values * Fill in the rank map and mutate it by the cosmetic modifier
* Only requires standard values be passed
* @param curRank the rank to fill in the value for * @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) { private void addRank(int curRank, int rankValue) {
//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;
//Avoid negative numbers //Avoid negative numbers
if(standardValue < 0) { rankValue = Math.max(0, rankValue);
standardRanks.put(curRank, 0);
retroRanks.put(curRank, 0);
} else {
standardRanks.put(curRank, standardValue);
retroRanks.put(curRank, retroValue);
}
}
/** ranks.put(curRank, 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);
} }
private void initRankMaps() { private void initRankMaps() {
standardRanks = new HashMap<>(); ranks = new HashMap<>();
retroRanks = new HashMap<>();
} }
/** /**
* Gets the unlock level for this skill as defined by this SkillRankProperty * 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 * @param targetRank the rank to get the unlock level for
* @return the unlock level for target rank * @return the unlock level for target rank
*/ */
public int getUnlockLevel(boolean retroMode, int targetRank) throws MissingSkillPropertyDefinition { public int getUnlockLevel(mcMMO pluginRef, int targetRank) throws MissingSkillPropertyDefinition {
if(retroMode) { if(ranks.get(targetRank) == null) {
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"); throw new MissingSkillPropertyDefinition("No definition found for rank:"+targetRank+" using Standard scaling");
} }
return standardRanks.get(targetRank);
} //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<Integer, Integer> standardRanks) { public void setRanks(HashMap<Integer, Integer> ranks) {
this.standardRanks = standardRanks; this.ranks = ranks;
} }
public void setRetroRanks(HashMap<Integer, Integer> retroRanks) { public HashMap<Integer, Integer> getRanks() {
this.retroRanks = retroRanks; return ranks;
} }
public HashMap<Integer, Integer> getStandardRanks() {
return standardRanks;
}
public HashMap<Integer, Integer> getRetroRanks() {
return retroRanks;
}
} }

View File

@ -1,8 +1,6 @@
package com.gmail.nossr50.config.skills.repair; package com.gmail.nossr50.config.skills.repair;
import com.gmail.nossr50.config.ConfigConstants; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; 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 String ODDS_PERCENTAGE_EXAMPLE = "25%";
private static final double CHANCE_AT_MAX_SKILL_DEFAULT = 100.0D; 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." + @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
"\nSkills dynamically adjust their rewards to match the max bonus level, you can think of it as a curve that calculates what bonuses " + private double maxChance = 100.0;
"\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;
} }

View File

@ -1,8 +1,6 @@
package com.gmail.nossr50.config.skills.repair.repairmastery; package com.gmail.nossr50.config.skills.repair.repairmastery;
import com.gmail.nossr50.config.ConfigConstants; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
@ -12,14 +10,7 @@ public class ConfigRepairRepairMastery {
@Setting(value = ConfigConstants.MAX_BONUS_PERCENTAGE_FIELD_NAME) @Setting(value = ConfigConstants.MAX_BONUS_PERCENTAGE_FIELD_NAME)
private double maxBonusPercentage = 200.0D; 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() { public double getMaxBonusPercentage() {
return maxBonusPercentage; return maxBonusPercentage;
} }
public MaxBonusLevel getMaxBonusLevel() {
return maxBonusLevel;
}
} }

View File

@ -1,7 +1,6 @@
package com.gmail.nossr50.config.skills.smelting; package com.gmail.nossr50.config.skills.smelting;
import com.gmail.nossr50.config.ConfigConstants; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
@ -13,7 +12,7 @@ public class ConfigSmelting {
@Setting(value = ConfigConstants.SUB_SKILL_NODE) @Setting(value = ConfigConstants.SUB_SKILL_NODE)
private ConfigSmeltingSubSkills subskills = new ConfigSmeltingSubSkills(); private ConfigSmeltingSubSkills subskills = new ConfigSmeltingSubSkills();
public ConfigSmeltingSubSkills getSubskills() { public ConfigSmeltingSubSkills getSubSkills() {
return subskills; return subskills;
} }
@ -26,10 +25,6 @@ public class ConfigSmelting {
return subskills.getMaxChance(); return subskills.getMaxChance();
} }
public MaxBonusLevel getMaxBonusLevel() {
return subskills.getMaxBonusLevel();
}
public HashMap<Integer, Integer> getXpMultiplierTable() { public HashMap<Integer, Integer> getXpMultiplierTable() {
return subskills.getXpMultiplierTable(); return subskills.getXpMultiplierTable();
} }

View File

@ -1,8 +1,6 @@
package com.gmail.nossr50.config.skills.smelting; package com.gmail.nossr50.config.skills.smelting;
import com.gmail.nossr50.config.ConfigConstants; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; 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) @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
private double maxChance = 50.0; 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() { public double getMaxChance() {
return maxChance; return maxChance;
} }
public MaxBonusLevel getMaxBonusLevel() {
return maxBonusLevel;
}
@Setting(value = "XP-Multiplier-Per-Rank") @Setting(value = "XP-Multiplier-Per-Rank")
private HashMap<Integer, Integer> xpMultiplierTable = XP_MULT_MAP_DEFAULT; private HashMap<Integer, Integer> xpMultiplierTable = XP_MULT_MAP_DEFAULT;

View File

@ -1,6 +1,5 @@
package com.gmail.nossr50.config.skills.smelting; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
@ -20,10 +19,6 @@ public class ConfigSmeltingSubSkills {
return smeltingSecondSmelt.getMaxChance(); return smeltingSecondSmelt.getMaxChance();
} }
public MaxBonusLevel getMaxBonusLevel() {
return smeltingSecondSmelt.getMaxBonusLevel();
}
public HashMap<Integer, Integer> getXpMultiplierTable() { public HashMap<Integer, Integer> getXpMultiplierTable() {
return smeltingSecondSmelt.getXpMultiplierTable(); return smeltingSecondSmelt.getXpMultiplierTable();
} }

View File

@ -1,7 +1,6 @@
package com.gmail.nossr50.config.skills.swords; package com.gmail.nossr50.config.skills.swords;
import com.gmail.nossr50.config.ConfigConstants; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
@ -31,10 +30,6 @@ public class ConfigSwords {
return subSkills.getCounterAttackMaxChance(); return subSkills.getCounterAttackMaxChance();
} }
public MaxBonusLevel getCounterAttackMaxBonusLevel() {
return subSkills.getCounterAttackMaxBonusLevel();
}
public double getCounterAttackDamageModifier() { public double getCounterAttackDamageModifier() {
return subSkills.getCounterAttackDamageModifier(); return subSkills.getCounterAttackDamageModifier();
} }
@ -47,10 +42,6 @@ public class ConfigSwords {
return subSkills.getRuptureMaxChance(); return subSkills.getRuptureMaxChance();
} }
public MaxBonusLevel getRuptureMaxBonusLevel() {
return subSkills.getRuptureMaxBonusLevel();
}
public double getRuptureDamagePlayer() { public double getRuptureDamagePlayer() {
return subSkills.getRuptureDamagePlayer(); return subSkills.getRuptureDamagePlayer();
} }

View File

@ -1,8 +1,6 @@
package com.gmail.nossr50.config.skills.swords; package com.gmail.nossr50.config.skills.swords;
import com.gmail.nossr50.config.ConfigConstants; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; 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) @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
private double maxChance = 30.0; 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." + @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) "\nDefault value: "+DAMAGE_MODIFIER_DEFAULT)
private double damageModifier = DAMAGE_MODIFIER_DEFAULT; private double damageModifier = DAMAGE_MODIFIER_DEFAULT;
@ -25,10 +20,6 @@ public class ConfigSwordsCounterAttack {
return maxChance; return maxChance;
} }
public MaxBonusLevel getCounterAttackMaxBonusLevel() {
return maxBonusLevel;
}
public double getCounterAttackDamageModifier() { public double getCounterAttackDamageModifier() {
return damageModifier; return damageModifier;
} }

View File

@ -1,8 +1,6 @@
package com.gmail.nossr50.config.skills.swords; package com.gmail.nossr50.config.skills.swords;
import com.gmail.nossr50.config.ConfigConstants; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; 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) @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
private double maxChance = MAX_CHANCE_DEFAULT; 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") @Setting(value = "Damage-Per-Tick-PVP")
private double damagePlayer = DAMAGE_PVP_DEFAULT; private double damagePlayer = DAMAGE_PVP_DEFAULT;
@ -35,10 +30,6 @@ public class ConfigSwordsRupture {
return maxChance; return maxChance;
} }
public MaxBonusLevel getRuptureMaxBonusLevel() {
return maxBonusLevel;
}
public double getRuptureDamagePlayer() { public double getRuptureDamagePlayer() {
return damagePlayer; return damagePlayer;
} }

View File

@ -1,6 +1,5 @@
package com.gmail.nossr50.config.skills.swords; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
@ -35,10 +34,6 @@ public class ConfigSwordsSubSkills {
return counterAttack.getCounterAttackMaxChance(); return counterAttack.getCounterAttackMaxChance();
} }
public MaxBonusLevel getCounterAttackMaxBonusLevel() {
return counterAttack.getCounterAttackMaxBonusLevel();
}
public double getCounterAttackDamageModifier() { public double getCounterAttackDamageModifier() {
return counterAttack.getCounterAttackDamageModifier(); return counterAttack.getCounterAttackDamageModifier();
} }
@ -51,10 +46,6 @@ public class ConfigSwordsSubSkills {
return rupture.getRuptureMaxChance(); return rupture.getRuptureMaxChance();
} }
public MaxBonusLevel getRuptureMaxBonusLevel() {
return rupture.getRuptureMaxBonusLevel();
}
public double getRuptureDamagePlayer() { public double getRuptureDamagePlayer() {
return rupture.getRuptureDamagePlayer(); return rupture.getRuptureDamagePlayer();
} }

View File

@ -1,8 +1,6 @@
package com.gmail.nossr50.config.skills.taming; package com.gmail.nossr50.config.skills.taming;
import com.gmail.nossr50.config.ConfigConstants; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; 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.") @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; 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") @Setting(value = "Gore-Damage-Modifier")
private double goreMofifier = 2.0; private double goreMofifier = 2.0;
@ -25,10 +20,6 @@ public class ConfigTamingGore {
return maxChance; return maxChance;
} }
public MaxBonusLevel getMaxBonusLevel() {
return maxBonusLevel;
}
public double getGoreMofifier() { public double getGoreMofifier() {
return goreMofifier; return goreMofifier;
} }

View File

@ -1,8 +1,6 @@
package com.gmail.nossr50.config.skills.woodcutting; package com.gmail.nossr50.config.skills.woodcutting;
import com.gmail.nossr50.config.ConfigConstants; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; 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) @Setting(value = ConfigConstants.MAX_CHANCE_FIELD_NAME, comment = ConfigConstants.MAX_CHANCE_FIELD_DESCRIPTION)
private double maxChance = MAX_CHANCE_DEFAULT; private double maxChance = MAX_CHANCE_DEFAULT;
@Setting(value = ConfigConstants.MAX_BONUS_LEVEL_FIELD_NAME)
private MaxBonusLevel maxBonusLevel = new AbstractMaxBonusLevel(100);
public double getMaxChance() { public double getMaxChance() {
return maxChance; return maxChance;
} }
public MaxBonusLevel getMaxBonusLevel() {
return maxBonusLevel;
}
} }

View File

@ -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.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.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.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." + @Setting(value = "Sound-Settings", comment = "Adjust sound settings for various mcMMO sounds here." +

View File

@ -3,6 +3,7 @@ package com.gmail.nossr50.core;
import org.bukkit.Material; import org.bukkit.Material;
import java.util.HashSet; import java.util.HashSet;
import java.util.Locale;
/** /**
* Stores hash tables for item and block names * Stores hash tables for item and block names
@ -21,6 +22,7 @@ public class MaterialMapStore {
private HashSet<String> canMakeShroomyWhiteList; private HashSet<String> canMakeShroomyWhiteList;
private HashSet<String> multiBlockPlant; private HashSet<String> multiBlockPlant;
private HashSet<String> foodItemWhiteList; private HashSet<String> foodItemWhiteList;
private HashSet<String> glassBlocks;
public MaterialMapStore() { public MaterialMapStore() {
abilityBlackList = new HashSet<>(); abilityBlackList = new HashSet<>();
@ -32,6 +34,7 @@ public class MaterialMapStore {
canMakeShroomyWhiteList = new HashSet<>(); canMakeShroomyWhiteList = new HashSet<>();
multiBlockPlant = new HashSet<>(); multiBlockPlant = new HashSet<>();
foodItemWhiteList = new HashSet<>(); foodItemWhiteList = new HashSet<>();
glassBlocks = new HashSet<>();
fillHardcodedHashSets(); fillHardcodedHashSets();
} }
@ -79,6 +82,44 @@ public class MaterialMapStore {
fillShroomyWhiteList(); fillShroomyWhiteList();
fillMultiBlockEntitiesList(); fillMultiBlockEntitiesList();
fillFoodWhiteList(); 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() { private void fillFoodWhiteList() {
@ -120,6 +161,10 @@ public class MaterialMapStore {
foodItemWhiteList.add("tropical_fish"); foodItemWhiteList.add("tropical_fish");
} }
public boolean isGlass(Material material) {
return glassBlocks.contains(material.getKey().getKey());
}
public boolean isFood(Material material) { public boolean isFood(Material material) {
return foodItemWhiteList.contains(material.getKey().getKey()); return foodItemWhiteList.contains(material.getKey().getKey());
} }
@ -146,6 +191,8 @@ public class MaterialMapStore {
private void fillBlockCrackerWhiteList() { private void fillBlockCrackerWhiteList() {
blockCrackerWhiteList.add("stone_bricks"); blockCrackerWhiteList.add("stone_bricks");
blockCrackerWhiteList.add("infested_stone_bricks");
} }
private void fillHerbalismAbilityBlackList() { private void fillHerbalismAbilityBlackList() {
@ -426,7 +473,8 @@ public class MaterialMapStore {
toolBlackList.add("stonecutter"); toolBlackList.add("stonecutter");
} }
private void addToHashSet(String string, HashSet<String> stringHashSet) { private void addToHashSet(String string, HashSet<String> stringHashSet)
stringHashSet.add(string.toLowerCase()); {
stringHashSet.add(string.toLowerCase(Locale.ENGLISH));
} }
} }

View File

@ -3,7 +3,6 @@ package com.gmail.nossr50.core;
import com.gmail.nossr50.config.ConfigConstants; import com.gmail.nossr50.config.ConfigConstants;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.datatypes.skills.properties.MaxBonusLevel;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.random.InvalidStaticChance; import com.gmail.nossr50.util.random.InvalidStaticChance;
import com.google.common.reflect.TypeToken; import com.google.common.reflect.TypeToken;
@ -31,8 +30,8 @@ public class SkillPropertiesManager {
staticActivationChanceMap = new HashMap<>(); staticActivationChanceMap = new HashMap<>();
} }
public void registerMaxBonusLevel(SubSkillType subSkillType, MaxBonusLevel maxBonusLevel) { public void registerMaxBonusLevel(SubSkillType subSkillType, int maxBonusLevel) {
maxBonusLevelMap.put(subSkillType, pluginRef.isRetroModeEnabled() ? maxBonusLevel.getRetroScaleValue() : maxBonusLevel.getStandardScaleValue()); maxBonusLevelMap.put(subSkillType, maxBonusLevel);
} }
public void registerMaxBonus(SubSkillType subSkillType, double maxBonus) { public void registerMaxBonus(SubSkillType subSkillType, double maxBonus) {
@ -133,13 +132,9 @@ public class SkillPropertiesManager {
} }
private void attemptRegisterMaxBonusLevel(SubSkillType subSkillType, CommentedConfigurationNode childNode) { private void attemptRegisterMaxBonusLevel(SubSkillType subSkillType, CommentedConfigurationNode childNode) {
try {
pluginRef.getLogger().info("Registering MaxBonusLevel for "+subSkillType.toString()); pluginRef.getLogger().info("Registering MaxBonusLevel for "+subSkillType.toString());
MaxBonusLevel maxBonusLevel = childNode.getValue(TypeToken.of(MaxBonusLevel.class)); int maxBonusLevel = childNode.getInt();
registerMaxBonusLevel(subSkillType, maxBonusLevel); registerMaxBonusLevel(subSkillType, maxBonusLevel);
} catch (ObjectMappingException e) {
//This time a silent exception is fine
}
} }
private void attemptRegisterMaxChance(SubSkillType subSkillType, CommentedConfigurationNode childNode) { private void attemptRegisterMaxChance(SubSkillType subSkillType, CommentedConfigurationNode childNode) {

View File

@ -361,7 +361,7 @@ public final class SQLDatabaseManager implements DatabaseManager {
public List<PlayerStat> readLeaderboard(PrimarySkillType skill, int pageNumber, int statsPerPage) { public List<PlayerStat> readLeaderboard(PrimarySkillType skill, int pageNumber, int statsPerPage) {
List<PlayerStat> stats = new ArrayList<>(); List<PlayerStat> 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; ResultSet resultSet = null;
PreparedStatement statement = null; PreparedStatement statement = null;
Connection connection = null; Connection connection = null;
@ -403,9 +403,9 @@ public final class SQLDatabaseManager implements DatabaseManager {
try { try {
connection = getConnection(PoolIdentifier.MISC); connection = getConnection(PoolIdentifier.MISC);
for (PrimarySkillType primarySkillType : pluginRef.getSkillTools().NON_CHILD_SKILLS) { 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 // 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 " + "AND " + skillName + " > (SELECT " + skillName + " FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id " +
"WHERE user = ?)"; "WHERE user = ?)";
@ -439,7 +439,7 @@ public final class SQLDatabaseManager implements DatabaseManager {
statement.close(); 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 " + "WHERE " + ALL_QUERY_VERSION + " > 0 " +
"AND " + ALL_QUERY_VERSION + " > " + "AND " + ALL_QUERY_VERSION + " > " +
"(SELECT " + ALL_QUERY_VERSION + " " + "(SELECT " + ALL_QUERY_VERSION + " " +
@ -914,7 +914,7 @@ public final class SQLDatabaseManager implements DatabaseManager {
//Shrink skills above the cap //Shrink skills above the cap
int cap = pluginRef.getPlayerLevelingSettings().getSkillLevelCap(skill); 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(); statement.executeUpdate();
tryClose(statement); tryClose(statement);
} }
@ -951,7 +951,7 @@ public final class SQLDatabaseManager implements DatabaseManager {
break; break;
} }
if (connection == null) { 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; 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"); pluginRef.getLogger().info("Indexing tables, this may take a while on larger databases");
for (PrimarySkillType skill : pluginRef.getSkillTools().NON_CHILD_SKILLS) { for (PrimarySkillType skill : pluginRef.getSkillTools().NON_CHILD_SKILLS) {
String skill_name = skill.name().toLowerCase(); String skill_name = skill.name().toLowerCase(Locale.ENGLISH);
try { try {
statement.executeUpdate("ALTER TABLE `" + tablePrefix + "skills` ADD INDEX `idx_" + skill_name + "` (`" + skill_name + "`) USING BTREE"); statement.executeUpdate("ALTER TABLE `" + tablePrefix + "skills` ADD INDEX `idx_" + skill_name + "` (`" + skill_name + "`) USING BTREE");

View File

@ -4,6 +4,8 @@ import com.gmail.nossr50.config.HOCONUtil;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.StringUtils; import com.gmail.nossr50.util.StringUtils;
import java.util.Locale;
public enum SubSkillType { public enum SubSkillType {
/* !! Warning -- Do not let subskills share a name with any existing PrimarySkillType as it will clash with the static import !! */ /* !! 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) { public String getPermissionNodeAddress(mcMMO pluginRef) {
//TODO: This could be optimized //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);
} }
/** /**

View File

@ -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;
}
}

View File

@ -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 +
'}';
}
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -20,6 +20,8 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import java.util.Locale;
public class Roll extends AcrobaticsSubSkill { public class Roll extends AcrobaticsSubSkill {
private final mcMMO pluginRef; private final mcMMO pluginRef;
@ -95,7 +97,7 @@ public class Roll extends AcrobaticsSubSkill {
*/ */
@Override @Override
public String getPermissionNode() { 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 //Chance to roll at half max skill
RandomChanceSkill rollHalfMaxSkill = new RandomChanceSkill(pluginRef, null, subSkillType); RandomChanceSkill rollHalfMaxSkill = new RandomChanceSkill(pluginRef, null, subSkillType);
int halfMaxSkillValue = pluginRef.isRetroModeEnabled() ? 500 : 50; int halfMaxSkillValue = (int) pluginRef.getDynamicSettingsManager().getSkillMaxBonusLevel(subSkillType) / 2;
rollHalfMaxSkill.setSkillLevel(halfMaxSkillValue); rollHalfMaxSkill.setSkillLevel(halfMaxSkillValue);
//Chance to graceful roll at full skill //Chance to graceful roll at full skill

View File

@ -253,7 +253,7 @@
// if (target.equals("II")) { // hacks // if (target.equals("II")) { // hacks
// return target; // 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) { // private static String getName(PotionEffectType type) {

View File

@ -160,7 +160,7 @@ public class BlockListener implements Listener {
if (pluginRef.getDynamicSettingsManager().isWorldBlacklisted(event.getBlock().getWorld().getName())) if (pluginRef.getDynamicSettingsManager().isWorldBlacklisted(event.getBlock().getWorld().getName()))
return; return;
if (pluginRef.getBlockTools().shouldBeWatched(event.getNewState())) { if (pluginRef.getConfigManager().getConfigExploitPrevention().isSnowGolemExploitPrevented() && pluginRef.getBlockTools().shouldBeWatched(event.getNewState())) {
pluginRef.getPlaceStore().setTrue(event.getNewState().getBlock()); pluginRef.getPlaceStore().setTrue(event.getNewState().getBlock());
} }
} }
@ -481,8 +481,27 @@ public class BlockListener implements Listener {
mcMMOPlayer.checkAbilityActivation(PrimarySkillType.MINING); mcMMOPlayer.checkAbilityActivation(PrimarySkillType.MINING);
} else if (mcMMOPlayer.getToolPreparationMode(ToolType.SHOVEL) && pluginRef.getItemTools().isShovel(heldItem) && pluginRef.getBlockTools().affectedByGigaDrillBreaker(blockState) && pluginRef.getPermissionTools().gigaDrillBreaker(player)) { } else if (mcMMOPlayer.getToolPreparationMode(ToolType.SHOVEL) && pluginRef.getItemTools().isShovel(heldItem) && pluginRef.getBlockTools().affectedByGigaDrillBreaker(blockState) && pluginRef.getPermissionTools().gigaDrillBreaker(player)) {
mcMMOPlayer.checkAbilityActivation(PrimarySkillType.EXCAVATION); 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); 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)) { && pluginRef.getEventManager().simulateBlockBreak(block, player, true)) {
event.setInstaBreak(true); event.setInstaBreak(true);
pluginRef.getSoundManager().sendSound(player, block.getLocation(), SoundType.POP); 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)) { if (mcMMOPlayer.getUnarmedManager().blockCrackerCheck(blockState)) {
blockState.update(); 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); event.setInstaBreak(true);
pluginRef.getSoundManager().sendSound(player, block.getLocation(), SoundType.POP); pluginRef.getSoundManager().sendSound(player, block.getLocation(), SoundType.POP);
} }

View File

@ -60,7 +60,7 @@ public class EntityListener implements Listener {
//Prevent entities from giving XP if they target endermite //Prevent entities from giving XP if they target endermite
if (event.getTarget() instanceof 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); 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. * Handle FoodLevelChange events that involve modifying the event.
* *

View File

@ -9,6 +9,7 @@ import org.bukkit.event.Event;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Locale;
public class InteractionManager { public class InteractionManager {
private static HashMap<InteractType, ArrayList<Interaction>> interactRegister; private static HashMap<InteractType, ArrayList<Interaction>> interactRegister;
@ -46,7 +47,7 @@ public class InteractionManager {
//Register skill //Register skill
arrayRef.add(abstractSubSkill); arrayRef.add(abstractSubSkill);
String lowerCaseName = abstractSubSkill.getConfigKeyName().toLowerCase(); String lowerCaseName = abstractSubSkill.getConfigKeyName().toLowerCase(Locale.ENGLISH);
//Register in name map //Register in name map
subSkillNameMap.putIfAbsent(lowerCaseName, abstractSubSkill); subSkillNameMap.putIfAbsent(lowerCaseName, abstractSubSkill);
@ -62,7 +63,7 @@ public class InteractionManager {
* @return null if the subskill is not registered * @return null if the subskill is not registered
*/ */
public static AbstractSubSkill getAbstractByName(String name) { public static AbstractSubSkill getAbstractByName(String name) {
return subSkillNameMap.get(name.toLowerCase()); return subSkillNameMap.get(name.toLowerCase(Locale.ENGLISH));
} }
/** /**

View File

@ -34,6 +34,8 @@ import org.bukkit.event.player.*;
import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import java.util.Locale;
public class PlayerListener implements Listener { public class PlayerListener implements Listener {
private final mcMMO pluginRef; private final mcMMO pluginRef;
@ -880,12 +882,12 @@ public class PlayerListener implements Listener {
if (!pluginRef.getConfigManager().getConfigLanguage().getTargetLanguage().equalsIgnoreCase("en_US")) { if (!pluginRef.getConfigManager().getConfigLanguage().getTargetLanguage().equalsIgnoreCase("en_US")) {
String message = event.getMessage(); String message = event.getMessage();
String command = message.substring(1).split(" ")[0]; 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? // Do these ACTUALLY have to be lower case to work properly?
for (PrimarySkillType primarySkillType : PrimarySkillType.values()) { for (PrimarySkillType primarySkillType : PrimarySkillType.values()) {
String skillName = primarySkillType.toString().toLowerCase(); String skillName = primarySkillType.toString().toLowerCase(Locale.ENGLISH);
String localizedName = pluginRef.getSkillTools().getLocalizedSkillName(primarySkillType).toLowerCase(); String localizedName = pluginRef.getSkillTools().getLocalizedSkillName(primarySkillType).toLowerCase(Locale.ENGLISH);
if (command.equalsIgnoreCase(localizedName)) { if (command.equalsIgnoreCase(localizedName)) {
event.setMessage(message.replace(command, skillName)); event.setMessage(message.replace(command, skillName));

View File

@ -68,6 +68,7 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.Locale;
public class mcMMO implements McMMOApi { public class mcMMO implements McMMOApi {
/* Managers */ /* Managers */
@ -88,6 +89,7 @@ public class mcMMO implements McMMOApi {
private ScoreboardManager scoreboardManager; private ScoreboardManager scoreboardManager;
private SoundManager soundManager; private SoundManager soundManager;
private HardcoreManager hardcoreManager; private HardcoreManager hardcoreManager;
private WorldGuardManager worldGuardManager;
/* Not-Managers but my naming scheme sucks */ /* Not-Managers but my naming scheme sucks */
private DatabaseManagerFactory databaseManagerFactory; private DatabaseManagerFactory databaseManagerFactory;
@ -240,10 +242,14 @@ public class mcMMO implements McMMOApi {
metrics = new Metrics(this); metrics = new Metrics(this);
metrics.addCustomChart(new Metrics.SimplePie("version", () -> getDescription().getVersion())); 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")); metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Standard"));
else else if (levelScaleModifier == 1)
metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Retro")); metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Retro"));
else
metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Custom"));
} }
} catch (Throwable t) { } catch (Throwable t) {
getLogger().severe("There was an error while enabling mcMMO!"); getLogger().severe("There was an error while enabling mcMMO!");
@ -310,13 +316,15 @@ public class mcMMO implements McMMOApi {
public void onLoad() public void onLoad()
{ {
worldGuardUtils = new WorldGuardUtils(this); //Init WGU
if(getServer().getPluginManager().getPlugin("WorldGuard") != null) { if(getServer().getPluginManager().getPlugin("WorldGuard") != null) {
worldGuardUtils = new WorldGuardUtils(); //Init WGU
if(worldGuardUtils.isWorldGuardLoaded()) { if(worldGuardUtils.isWorldGuardLoaded()) {
//Register flags //Register flags
System.out.println("[mcMMO - Registering World Guard 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 * @return the ServerSoftwareType which likely matches the server
*/ */
private ServerSoftwareType getServerSoftware() { private ServerSoftwareType getServerSoftware() {
if (Bukkit.getVersion().toLowerCase().contains("paper")) if (Bukkit.getVersion().toLowerCase(Locale.ENGLISH).contains("paper"))
return ServerSoftwareType.PAPER; return ServerSoftwareType.PAPER;
else if (Bukkit.getVersion().toLowerCase().contains("spigot")) else if (Bukkit.getVersion().toLowerCase(Locale.ENGLISH).contains("spigot"))
return ServerSoftwareType.SPIGOT; return ServerSoftwareType.SPIGOT;
else else
return ServerSoftwareType.CRAFTBUKKIT; return ServerSoftwareType.CRAFTBUKKIT;
@ -513,17 +521,6 @@ public class mcMMO implements McMMOApi {
return healthBarPluginEnabled; 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() { public ConfigManager getConfigManager() {
return configManager; return configManager;
} }
@ -763,7 +760,7 @@ public class mcMMO implements McMMOApi {
} }
public WorldGuardManager getWorldGuardManager() { public WorldGuardManager getWorldGuardManager() {
return worldGuardUtils.getWorldGuardManager(); return worldGuardManager;
} }
public PartyManager getPartyManager() { public PartyManager getPartyManager() {

View File

@ -2,7 +2,6 @@ package com.gmail.nossr50.runnables;
import com.gmail.nossr50.core.MetadataConstants; import com.gmail.nossr50.core.MetadataConstants;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;

View File

@ -155,7 +155,8 @@ public class MiningManager extends SkillManager {
if (pluginRef.getBlockTools().isOre(blockState)) { if (pluginRef.getBlockTools().isOre(blockState)) {
ores.add(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); debris.add(blockState);
} }
} }

View File

@ -12,6 +12,7 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import java.util.Collection; import java.util.Collection;
import java.util.Locale;
import java.util.Random; import java.util.Random;
import java.util.Set; import java.util.Set;
@ -208,7 +209,7 @@ public final class MiscTools {
String[] materialSplit = materialName.split("_"); String[] materialSplit = materialName.split("_");
if (materialSplit.length > 1) { if (materialSplit.length > 1) {
return materialSplit[0].toLowerCase(); return materialSplit[0].toLowerCase(Locale.ENGLISH);
} }
return "UnknownMods"; return "UnknownMods";

View File

@ -18,6 +18,8 @@ import org.bukkit.permissions.PermissionDefault;
import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.SimplePluginManager; import org.bukkit.plugin.SimplePluginManager;
import java.util.Locale;
public final class PermissionTools { public final class PermissionTools {
private final mcMMO pluginRef; private final mcMMO pluginRef;
@ -175,7 +177,7 @@ public final class PermissionTools {
} }
public boolean mctop(Permissible permissible, PrimarySkillType skill) { 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) { public boolean mmoedit(Permissible permissible) {
@ -195,7 +197,7 @@ public final class PermissionTools {
} }
public boolean skillreset(Permissible permissible, PrimarySkillType skill) { 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) { public boolean skillresetOthers(Permissible permissible) {
@ -203,11 +205,11 @@ public final class PermissionTools {
} }
public boolean skillresetOthers(Permissible permissible, PrimarySkillType skill) { 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) { 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) { public boolean xprateSet(Permissible permissible) {
@ -257,32 +259,32 @@ public final class PermissionTools {
} }
public boolean lucky(Permissible permissible, PrimarySkillType skill) { 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 */ /* XP PERKS */
public boolean quadrupleXp(Permissible permissible, PrimarySkillType skill) { 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) { 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) { 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) { 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) { 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) { 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) { public boolean hasCustomXPPerk(Permissible permissible, CustomXPPerk customXPPerk) {
@ -320,11 +322,11 @@ public final class PermissionTools {
*/ */
public boolean skillEnabled(Permissible permissible, PrimarySkillType skill) { 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) { 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) { public boolean isSubSkillEnabled(Permissible permissible, SubSkillType subSkillType) {
@ -336,7 +338,7 @@ public final class PermissionTools {
} }
public boolean bonusDamage(Permissible permissible, PrimarySkillType skill) { 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 */ /* ACROBATICS */
@ -386,11 +388,11 @@ public final class PermissionTools {
} }
public boolean greenThumbBlock(Permissible permissible, Material material) { 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) { 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 */ /* MINING */
@ -412,11 +414,11 @@ public final class PermissionTools {
/* REPAIR */ /* REPAIR */
public boolean repairItemType(Permissible permissible, ItemType repairItemType) { 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) { 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 */ /* SALVAGE */
@ -429,11 +431,11 @@ public final class PermissionTools {
} }
public boolean salvageItemType(Permissible permissible, ItemType salvageItemType) { 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) { 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 */ /* SMELTING */
@ -452,7 +454,7 @@ public final class PermissionTools {
/* TAMING */ /* TAMING */
public boolean callOfTheWild(Permissible permissible, EntityType type) { 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 */ /* UNARMED */
@ -477,7 +479,7 @@ public final class PermissionTools {
} }
public boolean partySubcommand(Permissible permissible, PartySubcommandType subcommand) { 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) { public boolean friendlyFire(Permissible permissible) {

View File

@ -7,6 +7,8 @@ import org.bukkit.block.data.Ageable;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import java.util.Locale;
public class StringUtils { public class StringUtils {
/** /**
@ -16,7 +18,7 @@ public class StringUtils {
* @return the capitalized string * @return the capitalized string
*/ */
public static String getCapitalized(String target) { 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);
} }
/** /**

View File

@ -14,6 +14,7 @@ import org.bukkit.entity.Player;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale;
/** /**
* This class handles many of the JSON components that mcMMO makes and uses * This class handles many of the JSON components that mcMMO makes and uses
@ -537,7 +538,7 @@ public class TextComponentFactory {
TextComponent unlockMessage = new TextComponent(""); TextComponent unlockMessage = new TextComponent("");
unlockMessage.setText(pluginRef.getLocaleManager().getString("JSON.SkillUnlockMessage", subSkillType.getLocaleName(pluginRef), pluginRef.getRankTools().getRank(player, subSkillType))); 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.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; return unlockMessage;
} }
} }

View File

@ -25,6 +25,7 @@ import org.bukkit.command.PluginCommand;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale;
public final class CommandRegistrationManager { public final class CommandRegistrationManager {
private final mcMMO pluginRef; private final mcMMO pluginRef;
@ -37,8 +38,8 @@ public final class CommandRegistrationManager {
private void registerSkillCommands() { private void registerSkillCommands() {
for (PrimarySkillType primarySkillType : PrimarySkillType.values()) { for (PrimarySkillType primarySkillType : PrimarySkillType.values()) {
String commandName = primarySkillType.toString().toLowerCase(); String commandName = primarySkillType.toString().toLowerCase(Locale.ENGLISH);
String localizedName = pluginRef.getSkillTools().getLocalizedSkillName(primarySkillType).toLowerCase(); String localizedName = pluginRef.getSkillTools().getLocalizedSkillName(primarySkillType).toLowerCase(Locale.ENGLISH);
PluginCommand command; PluginCommand command;

View File

@ -12,6 +12,7 @@ import org.bukkit.entity.Player;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale;
public final class CommandTools { public final class CommandTools {
private final mcMMO pluginRef; private final mcMMO pluginRef;
@ -288,7 +289,7 @@ public final class CommandTools {
break; break;
} }
if (playerName.toLowerCase().contains(partialName.toLowerCase())) { if (playerName.toLowerCase(Locale.ENGLISH).contains(partialName.toLowerCase(Locale.ENGLISH))) {
// Partial match // Partial match
matchedPlayers.add(playerName); matchedPlayers.add(playerName);
} }

View File

@ -9,10 +9,10 @@ import java.util.Map;
public class FormulaManager { public class FormulaManager {
// Experience needed to reach a level, cached values for speed // Experience needed to reach a level, cached values for speed
private Map<Integer, Integer> experienceNeededRetroLinear; private Map<Integer, Integer> experienceNeededCosmeticLinear;
private Map<Integer, Integer> experienceNeededStandardLinear; private Map<Integer, Integer> experienceNeededLinear;
private Map<Integer, Integer> experienceNeededRetroExponential; private Map<Integer, Integer> experienceNeededCosmeticExponential;
private Map<Integer, Integer> experienceNeededStandardExponential; private Map<Integer, Integer> experienceNeededExponential;
private FormulaType currentFormula; private FormulaType currentFormula;
private final mcMMO pluginRef; private final mcMMO pluginRef;
@ -27,10 +27,10 @@ public class FormulaManager {
* Initialize maps used for XP to next level * Initialize maps used for XP to next level
*/ */
private void initExperienceNeededMaps() { private void initExperienceNeededMaps() {
experienceNeededRetroLinear = new HashMap<>(); experienceNeededCosmeticLinear = new HashMap<>();
experienceNeededRetroExponential = new HashMap<>(); experienceNeededCosmeticExponential = new HashMap<>();
experienceNeededStandardLinear = new HashMap<>(); experienceNeededLinear = new HashMap<>();
experienceNeededStandardExponential = new HashMap<>(); experienceNeededExponential = new HashMap<>();
} }
/** /**
@ -120,34 +120,21 @@ public class FormulaManager {
return processXPToNextLevel(level, currentFormula); 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) * Calculate the XP needed for the next level for the linear formula for Standard scaling (1-100)
* @param level target level * @param level target level
* @return raw xp needed to reach the next level * @return raw xp needed to reach the next level
*/ */
private int processStandardXPToNextLevel(int level, FormulaType formulaType) { private int processXPToNextLevel(int level, FormulaType formulaType) {
Map<Integer, Integer> experienceMapRef = formulaType == FormulaType.LINEAR ? experienceNeededStandardLinear : experienceNeededStandardExponential; Map<Integer, Integer> experienceMapRef = formulaType == FormulaType.LINEAR ? experienceNeededLinear : experienceNeededExponential;
if(!experienceMapRef.containsKey(level)) { if(!experienceMapRef.containsKey(level)) {
int cosmeticScaleMod = pluginRef.getPlayerLevelingSettings().getCosmeticLevelScaleModifier();
int experienceSum = 0; 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 //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 //calculateXPNeeded doesn't cache results so we use that instead of invoking the Retro XP methods to avoid memory bloat
experienceSum += calculateXPNeeded(x, formulaType); experienceSum += calculateXPNeeded(x, formulaType);
} }
@ -166,7 +153,7 @@ public class FormulaManager {
* @return raw xp needed to reach the next level based on formula type * @return raw xp needed to reach the next level based on formula type
*/ */
private int processXPRetroToNextLevel(int level, FormulaType formulaType) { private int processXPRetroToNextLevel(int level, FormulaType formulaType) {
Map<Integer, Integer> experienceMapRef = formulaType == FormulaType.LINEAR ? experienceNeededRetroLinear : experienceNeededRetroExponential; Map<Integer, Integer> experienceMapRef = formulaType == FormulaType.LINEAR ? experienceNeededCosmeticLinear : experienceNeededCosmeticExponential;
if (!experienceMapRef.containsKey(level)) { if (!experienceMapRef.containsKey(level)) {
int experience = calculateXPNeeded(level, formulaType); int experience = calculateXPNeeded(level, formulaType);

View File

@ -10,7 +10,7 @@ import com.gmail.nossr50.util.skills.SkillActivationType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.util.Random; import java.util.concurrent.ThreadLocalRandom;
public class RandomChanceTools { public class RandomChanceTools {
@ -79,10 +79,8 @@ public class RandomChanceTools {
return rollDice(chance, 10000); return rollDice(chance, 10000);
} }
public boolean rollDice(double chanceOfSuccess, int bound) { public static boolean rollDice(double chanceOfSuccess, int bound) {
Random random = new Random(); return chanceOfSuccess > ThreadLocalRandom.current().nextInt(bound);
return chanceOfSuccess > random.nextInt(bound);
} }
/** /**

View File

@ -163,7 +163,7 @@ public class ScoreboardWrapper {
revertTask = new ScoreboardChangeTask().runTaskLater(pluginRef, ticks); revertTask = new ScoreboardChangeTask().runTaskLater(pluginRef, ticks);
// TODO is there any way to do the time that looks acceptable? // 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) if (pluginRef.getUserManager().getPlayer(playerName) == null)
return; return;

View File

@ -392,7 +392,7 @@ public class RankTools {
.getNode(subSkillType.getHoconFriendlyConfigName()) .getNode(subSkillType.getHoconFriendlyConfigName())
.getValue(TypeToken.of(SkillRankProperty.class)); .getValue(TypeToken.of(SkillRankProperty.class));
int unlockLevel = skillRankProperty.getUnlockLevel(pluginRef.isRetroModeEnabled(), rank); int unlockLevel = skillRankProperty.getUnlockLevel(pluginRef, rank);
return unlockLevel; return unlockLevel;
} catch (ObjectMappingException | MissingSkillPropertyDefinition | NullPointerException e) { } catch (ObjectMappingException | MissingSkillPropertyDefinition | NullPointerException e) {

View File

@ -93,6 +93,8 @@ public class SoundManager {
case DEFLECT_ARROWS: case DEFLECT_ARROWS:
case BLEED: case BLEED:
return Sound.ENTITY_ENDER_EYE_DEATH; return Sound.ENTITY_ENDER_EYE_DEATH;
case GLASS:
return Sound.BLOCK_GLASS_BREAK;
default: default:
return null; return null;
} }

View File

@ -14,6 +14,7 @@ public enum SoundType {
ABILITY_ACTIVATED_GENERIC, ABILITY_ACTIVATED_GENERIC,
ABILITY_ACTIVATED_BERSERK, ABILITY_ACTIVATED_BERSERK,
BLEED, BLEED,
GLASS,
TIRED; TIRED;
public boolean usesCustomPitch() { public boolean usesCustomPitch() {

View File

@ -1,6 +1,9 @@
package com.gmail.nossr50.worldguard; 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.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.flags.registry.SimpleFlagRegistry;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import java.util.ArrayList; import java.util.ArrayList;
@ -12,10 +15,7 @@ public class WorldGuardUtils {
private boolean isLoaded = false; private boolean isLoaded = false;
private boolean detectedIncompatibleWG = false; private boolean detectedIncompatibleWG = false;
private static final ArrayList<String> WGClassList; private static final ArrayList<String> WGClassList;
private WorldGuardManager worldGuardManager; protected final mcMMO pluginRef;
public WorldGuardUtils() {
}
static { static {
/* /*
@ -41,6 +41,10 @@ public class WorldGuardUtils {
WGClassList.add("com.sk89q.worldguard.protection.regions.RegionQuery"); WGClassList.add("com.sk89q.worldguard.protection.regions.RegionQuery");
} }
public WorldGuardUtils(mcMMO pluginRef) {
this.pluginRef = pluginRef;
}
public boolean isWorldGuardLoaded() public boolean isWorldGuardLoaded()
{ {
if(detectedIncompatibleWG) if(detectedIncompatibleWG)
@ -68,7 +72,7 @@ public class WorldGuardUtils {
if(plugin == null) { if(plugin == null) {
//WG is not present //WG is not present
detectedIncompatibleWG = true; detectedIncompatibleWG = true;
System.out.println("[mcMMO WorldGuardUtils Debug] WorldGuard was not detected."); pluginRef.getLogger().info("WorldGuard was not detected.");
} else { } else {
//Check that its actually of class WorldGuardPlugin //Check that its actually of class WorldGuardPlugin
if(plugin instanceof WorldGuardPlugin) if(plugin instanceof WorldGuardPlugin)
@ -77,9 +81,6 @@ public class WorldGuardUtils {
{ {
worldGuardPluginRef = (WorldGuardPlugin) plugin; worldGuardPluginRef = (WorldGuardPlugin) plugin;
isLoaded = true; isLoaded = true;
//Init WG Manager
worldGuardManager = new WorldGuardManager();
} }
} else { } else {
//Plugin is not of the expected type //Plugin is not of the expected type
@ -87,6 +88,7 @@ public class WorldGuardUtils {
} }
} }
return worldGuardPluginRef; return worldGuardPluginRef;
} }
@ -98,7 +100,10 @@ public class WorldGuardUtils {
*/ */
private boolean isCompatibleVersion(Plugin plugin) { private boolean isCompatibleVersion(Plugin plugin) {
//Check that the version of WG is at least version 7.xx //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")) { if (!plugin.getDescription().getVersion().startsWith("7")) {
markWGIncompatible(); markWGIncompatible();
@ -107,10 +112,9 @@ public class WorldGuardUtils {
for(String classString : WGClassList) { for(String classString : WGClassList) {
try { try {
Class<?> checkForClass = Class.forName(classString); Class<?> checkForClass = Class.forName(classString);
detectedIncompatibleWG = false; //In case this was set to true previously
} catch (ClassNotFoundException | NoClassDefFoundError e) { } catch (ClassNotFoundException | NoClassDefFoundError e) {
// allClassesFound = false; allClassesFound = false;
System.out.println("[mcMMO WorldGuardUtils Debug] Missing WorldGuard class - "+classString); pluginRef.getLogger().severe("Missing WorldGuard class - "+classString);
markWGIncompatible(); 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 * If WG appears to have all of its classes we can then check to see if its been initialized properly
*/ */
// try { try {
// if(allClassesFound) { if(allClassesFound) {
// if(!((SimpleFlagRegistry) WorldGuard.getInstance().getFlagRegistry()).isInitialized()) { if(!((SimpleFlagRegistry) WorldGuard.getInstance().getFlagRegistry()).isInitialized()) {
// markWGIncompatible(); markWGIncompatible();
// System.out.println("[mcMMO WorldGuardUtils Debug] WG did not initialize properly, this can cause errors with mcMMO so mcMMO is disabling certain features."); pluginRef.getLogger().severe("WG did not initialize properly, this can cause errors with mcMMO so mcMMO is disabling certain features.");
// } }
// } }
// } catch (Exception e) { } catch (Exception e) {
// markWGIncompatible(); markWGIncompatible();
// e.printStackTrace(); e.printStackTrace();
// } }
} }
return !detectedIncompatibleWG; return !detectedIncompatibleWG;
@ -138,14 +142,10 @@ public class WorldGuardUtils {
* Mark WG as being incompatible to avoid unnecessary operations * Mark WG as being incompatible to avoid unnecessary operations
*/ */
private void markWGIncompatible() { 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 " + "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."); "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; detectedIncompatibleWG = true;
} }
public WorldGuardManager getWorldGuardManager() {
return worldGuardManager;
}
} }

View File

@ -436,7 +436,7 @@ Bonus_Drops:
Melon_Slice: true Melon_Slice: true
Nether_Wart: true Nether_Wart: true
Potatoes: true Potatoes: true
Potatoe: true Potato: true
Pumpkin: true Pumpkin: true
Red_Mushroom: true Red_Mushroom: true
Sugar_Cane: true Sugar_Cane: true

View File

@ -33,6 +33,7 @@ ExploitFix:
LavaStoneAndCobbleFarming: true LavaStoneAndCobbleFarming: true
TreeFellerReducedXP: true TreeFellerReducedXP: true
PistonCheating: true PistonCheating: true
SnowGolemExcavation: true
Experience_Bars: Experience_Bars:
# Turn this to false if you wanna disable XP bars # Turn this to false if you wanna disable XP bars
Enable: true Enable: true

View File

@ -561,6 +561,7 @@ Enchantment_Drop_Rates:
LEGENDARY: 0.75 LEGENDARY: 0.75
# #
# Settings for Excavation's Archaeology # Settings for Excavation's Archaeology
# If you are in retro mode, Drop_Level is multiplied by 10.
### ###
Excavation: Excavation:
CAKE: CAKE:
@ -691,6 +692,7 @@ Excavation:
Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand] Drops_From: [Dirt, Coarse_Dirt, Podzol, Grass_Block, Sand, Red_Sand, Gravel, Clay, Mycelium, Soul_Sand]
# #
# Settings for Hylian Luck # Settings for Hylian Luck
# If you are in retro mode, Drop_Level is multiplied by 10.
### ###
Hylian_Luck: Hylian_Luck:
MELON_SEEDS: MELON_SEEDS:
@ -749,6 +751,7 @@ Hylian_Luck:
Drops_From: [Pots] Drops_From: [Pots]
# #
# Settings for Shake # Settings for Shake
# If you are in retro mode, Drop_Level is multiplied by 10.
### ###
Shake: Shake:
BLAZE: BLAZE:

View File

@ -4,6 +4,10 @@ Sounds:
# 1.0 = Max volume # 1.0 = Max volume
# 0.0 = No Volume # 0.0 = No Volume
MasterVolume: 1.0 MasterVolume: 1.0
GLASS:
Enable: true
Volume: 1.0
Pitch: 1.0
ANVIL: ANVIL:
Enable: true Enable: true
Volume: 1.0 Volume: 1.0