From 93d10c073978ea529d6f58ee4a7995f46fb1e562 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 26 Dec 2018 23:59:43 -0800 Subject: [PATCH] Starting work on converting skills to use the new 100-scale system --- Changelog.txt | 6 ++- pom.xml | 2 +- .../java/com/gmail/nossr50/config/Config.java | 17 ++++++++ .../nossr50/datatypes/player/McMMOPlayer.java | 13 ++++++ .../nossr50/datatypes/skills/SkillType.java | 2 + .../gmail/nossr50/skills/SkillManager.java | 1 + .../skills/woodcutting/Woodcutting.java | 1 + .../woodcutting/WoodcuttingManager.java | 2 + .../util/experience/FormulaManager.java | 4 +- .../gmail/nossr50/util/skills/SkillUtils.java | 16 ++++++-- src/main/resources/config.yml | 40 +++++++++++-------- .../resources/locale/locale_en_US.properties | 1 + 12 files changed, 82 insertions(+), 23 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 5956356e4..32d8a5037 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -7,7 +7,11 @@ Key: ! Change - Removal -Version 2.0.00 +Version 2.0.1 + ! mcMMO skills will now be on a scale from 1-100 instead of 0-1000 (I'll be explaining this in a write-up) + + +Version 2.0.0 = Fixed an interaction between Tree Feller and Stripped Wood ! Fireworks no longer fire by default for ability activation/deactivation ! Website has been changed and the MOTD string relating to it reflects this diff --git a/pom.xml b/pom.xml index 037968289..9a05b407e 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.0.0-SNAPSHOT + 2.0.1-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/config/Config.java b/src/main/java/com/gmail/nossr50/config/Config.java index 274704142..1b6860588 100644 --- a/src/main/java/com/gmail/nossr50/config/Config.java +++ b/src/main/java/com/gmail/nossr50/config/Config.java @@ -438,6 +438,7 @@ public class Config extends AutoUpdateConfigLoader { public boolean getAbilityMessagesEnabled() { return config.getBoolean("Abilities.Messages", true); } public boolean getAbilitiesEnabled() { return config.getBoolean("Abilities.Enabled", true); } public boolean getAbilitiesOnlyActivateWhenSneaking() { return config.getBoolean("Abilities.Activation.Only_Activate_When_Sneaking", false); } + public boolean getAbilitiesGateEnabled() { return config.getBoolean("Abilities.Activation.Level_Gate_Abilities"); } public int getCooldown(AbilityType ability) { return config.getInt("Abilities.Cooldowns." + ability.toString()); } public int getMaxLength(AbilityType ability) { return config.getInt("Abilities.Max_Seconds." + ability.toString()); } @@ -471,6 +472,9 @@ public class Config extends AutoUpdateConfigLoader { return disabled; } + /* Axes */ + public int getAxesGate() { return config.getInt("Skills.Axes.Ability_Activation_Level_Gate", 10); } + /* Acrobatics */ public boolean getDodgeLightningDisabled() { return config.getBoolean("Skills.Acrobatics.Prevent_Dodge_Lightning", false); } public int getXPAfterTeleportCooldown() { return config.getInt("Skills.Acrobatics.XP_After_Teleport_Cooldown", 5); } @@ -488,6 +492,10 @@ public class Config extends AutoUpdateConfigLoader { /* Mining */ public Material getDetonatorItem() { return Material.matchMaterial(config.getString("Skills.Mining.Detonator_Name", "FLINT_AND_STEEL")); } + public int getMiningGate() { return config.getInt("Skills.Mining.Ability_Activation_Level_Gate", 10); } + + /* Excavation */ + public int getExcavationGate() { return config.getInt("Skills.Excavation.Ability_Activation_Level_Gate", 10); } /* Repair */ public boolean getRepairAnvilMessagesEnabled() { return config.getBoolean("Skills.Repair.Anvil_Messages", true); } @@ -507,6 +515,10 @@ public class Config extends AutoUpdateConfigLoader { public boolean getUnarmedBlockCrackerSmoothbrickToCracked() { return config.getBoolean("Skills.Unarmed.Block_Cracker.SmoothBrick_To_CrackedBrick", true); } public boolean getUnarmedItemPickupDisabled() { return config.getBoolean("Skills.Unarmed.Item_Pickup_Disabled_Full_Inventory", true); } public boolean getUnarmedItemsAsUnarmed() { return config.getBoolean("Skills.Unarmed.Items_As_Unarmed", false); } + public int getUnarmedGate() { return config.getInt("Skills.Unarmed.Ability_Activation_Level_Gate", 10); } + + /* Swords */ + public int getSwordsGate() { return config.getInt("Skills.Swords.Ability_Activation_Level_Gate", 10); } /* Taming */ public Material getTamingCOTWMaterial(EntityType type) { return Material.matchMaterial(config.getString("Skills.Taming.Call_Of_The_Wild." + StringUtils.getPrettyEntityTypeString(type) + ".Item_Material")); } @@ -519,6 +531,7 @@ public class Config extends AutoUpdateConfigLoader { /* Woodcutting */ public boolean getWoodcuttingDoubleDropsEnabled(BlockData material) { return config.getBoolean("Double_Drops.Woodcutting." + StringUtils.getFriendlyConfigBlockDataString(material)); } public boolean getTreeFellerSoundsEnabled() { return config.getBoolean("Skills.Woodcutting.Tree_Feller_Sounds", true); } + public int getWoodcuttingGate() { return config.getInt("Skills.Woodcutting.Ability_Activation_Level_Gate", 10); } /* AFK Leveling */ public boolean getAcrobaticsPreventAFK() { return config.getBoolean("Skills.Acrobatics.Prevent_AFK_Leveling", true); } @@ -536,6 +549,10 @@ public class Config extends AutoUpdateConfigLoader { return (cap <= 0) ? Integer.MAX_VALUE : cap; } + public int getSkillAbilityGate(SkillType skill) { + return config.getInt("Skills." + StringUtils.getCapitalized(skill.toString()) + ".Ability_Activation_Level_Gate"); + } + public boolean getTruncateSkills() { return config.getBoolean("General.TruncateSkills", false); } /* PVP & PVE Settings */ diff --git a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java index 5a757b95f..31b30628d 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -726,6 +726,19 @@ public class McMMOPlayer { return; } + /* + * Check if the player has passed the gate requirement + */ + if(Config.getInstance().getAbilitiesGateEnabled()) + { + if(getSkillLevel(skill) < skill.getSkillAbilityGate()) + { + //Inform the player they are not yet skilled enough + player.sendMessage(LocaleLoader.getString("Skills.AbilityGateRequirementFail")); + return; + } + } + int timeRemaining = calculateTimeRemaining(ability); if (timeRemaining > 0) { diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/SkillType.java b/src/main/java/com/gmail/nossr50/datatypes/skills/SkillType.java index da466ea96..ec31c3bb7 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/SkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/SkillType.java @@ -119,6 +119,8 @@ public enum SkillType { return Config.getInstance().getLevelCap(this); } + public int getSkillAbilityGate() { return Config.getInstance().getSkillAbilityGate(this); } + public boolean getPVPEnabled() { return Config.getInstance().getPVPEnabled(this); } diff --git a/src/main/java/com/gmail/nossr50/skills/SkillManager.java b/src/main/java/com/gmail/nossr50/skills/SkillManager.java index 3d8ffec57..da7f63c6f 100644 --- a/src/main/java/com/gmail/nossr50/skills/SkillManager.java +++ b/src/main/java/com/gmail/nossr50/skills/SkillManager.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.skills; +import com.gmail.nossr50.config.Config; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; diff --git a/src/main/java/com/gmail/nossr50/skills/woodcutting/Woodcutting.java b/src/main/java/com/gmail/nossr50/skills/woodcutting/Woodcutting.java index 132dbf448..5e4c28306 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/Woodcutting.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/Woodcutting.java @@ -21,6 +21,7 @@ public final class Woodcutting { public static int leafBlowerUnlockLevel = AdvancedConfig.getInstance().getLeafBlowUnlockLevel(); public static int treeFellerThreshold = Config.getInstance().getTreeFellerThreshold(); + protected static boolean treeFellerReachedThreshold = false; protected enum ExperienceGainMethod { diff --git a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java index 98a841948..5793dd8e7 100644 --- a/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.skills.woodcutting; +import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.mods.CustomBlock; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.AbilityType; @@ -23,6 +24,7 @@ import java.util.HashSet; import java.util.Set; public class WoodcuttingManager extends SkillManager { + public WoodcuttingManager(McMMOPlayer mcMMOPlayer) { super(mcMMOPlayer, SkillType.WOODCUTTING); } diff --git a/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java b/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java index d78d90b3f..c3e57395d 100644 --- a/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java +++ b/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java @@ -116,7 +116,7 @@ public class FormulaManager { switch (formulaType) { case LINEAR: if (!experienceNeededLinear.containsKey(level)) { - experience = (int) Math.floor(base + level * multiplier); + experience = (int) Math.floor( 10 * (base + level * multiplier)); experienceNeededLinear.put(level, experience); } @@ -124,7 +124,7 @@ public class FormulaManager { case EXPONENTIAL: if (!experienceNeededExponential.containsKey(level)) { - experience = (int) Math.floor(multiplier * Math.pow(level, exponent) + base); + experience = (int) Math.floor( 10 * multiplier * Math.pow(level, exponent) + base); experienceNeededExponential.put(level, experience); } diff --git a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java index 46b2fad52..7a4039084 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -208,6 +208,18 @@ public class SkillUtils { public static boolean activationSuccessful(SecondaryAbility skillAbility, Player player, int skillLevel, int activationChance, double maxChance, int maxLevel) { double chance = (maxChance / maxLevel) * Math.min(skillLevel, maxLevel) / activationChance; + return propagateSecondaryAbilityEvent(skillAbility, player, activationChance, chance); + } + + /** + * Sends an event out regarding activation of RNG based sub-skills + * @param skillAbility The random-chance ability + * @param player The player that the skill belong to + * @param activationChance parameter used in activation calculations + * @param chance parameter used in activation calculations + * @return returns true if successful + */ + private static boolean propagateSecondaryAbilityEvent(SecondaryAbility skillAbility, Player player, int activationChance, double chance) { SecondaryAbilityWeightedActivationCheckEvent event = new SecondaryAbilityWeightedActivationCheckEvent(player, skillAbility, chance); mcMMO.p.getServer().getPluginManager().callEvent(event); return (event.getChance() * activationChance) > Misc.getRandom().nextInt(activationChance) && !event.isCancelled(); @@ -215,9 +227,7 @@ public class SkillUtils { public static boolean activationSuccessful(SecondaryAbility skillAbility, Player player, double staticChance, int activationChance) { double chance = staticChance / activationChance; - SecondaryAbilityWeightedActivationCheckEvent event = new SecondaryAbilityWeightedActivationCheckEvent(player, skillAbility, chance); - mcMMO.p.getServer().getPluginManager().callEvent(event); - return (event.getChance() * activationChance) > Misc.getRandom().nextInt(activationChance) && !event.isCancelled(); + return propagateSecondaryAbilityEvent(skillAbility, player, activationChance, chance); } public static boolean activationSuccessful(SecondaryAbility skillAbility, Player player) { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 85ae9db47..7aba1a00d 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -21,7 +21,7 @@ General: Prefer_Beta: false Power_Level_Cap: 0 # Should mcMMO truncate levels if you lower your max level cap for a skillname - TruncateSkills: false + TruncateSkills: true # Should mcMMO print out debug messages? Verbose_Logging: false # Should mcMMO over-write configs to update, or make new ones ending in .new? @@ -267,6 +267,8 @@ Abilities: Enabled: true Messages: true Activation: + # If set to true, abilities will not be available until they meet specific level requirements to use + Level_Gate_Abilities: true Only_Activate_When_Sneaking: false Cooldowns: Berserk: 240 @@ -305,7 +307,7 @@ Skills: Prevent_Dodge_Lightning: false # Prevent earning Acrobatics XP a few seconds after teleporting XP_After_Teleport_Cooldown: 5 - Level_Cap: 0 + Level_Cap: 100 Alchemy: # Allow Hoppers to transfer ingredients and brew Rank 1 Alchemy potions Enabled_for_Hoppers: true @@ -313,32 +315,35 @@ Skills: Prevent_Hopper_Transfer_Ingredients: false # Prevent Hoppers from transferring bottles into Brewing Stands Prevent_Hopper_Transfer_Bottles: false - Level_Cap: 0 + Level_Cap: 100 Archery: Enabled_For_PVP: true Enabled_For_PVE: true - Level_Cap: 0 + Level_Cap: 100 Axes: Enabled_For_PVP: true Enabled_For_PVE: true - Level_Cap: 0 + Level_Cap: 100 + Ability_Activation_Level_Gate: 10 Excavation: - Level_Cap: 0 + Level_Cap: 100 + Ability_Activation_Level_Gate: 10 Fishing: - Level_Cap: 0 + Level_Cap: 100 Drops_Enabled: true Override_Vanilla_Treasures: true # Always catch fish, even when treasure is found Extra_Fish: false Lure_Modifier: 4.0 Herbalism: - Level_Cap: 0 + Level_Cap: 100 Prevent_AFK_Leveling: true Mining: - Level_Cap: 0 + Level_Cap: 100 Detonator_Name: FLINT_AND_STEEL + Ability_Activation_Level_Gate: 10 Repair: - Level_Cap: 0 + Level_Cap: 100 Anvil_Messages: true Anvil_Placed_Sounds: true Anvil_Use_Sounds: true @@ -346,7 +351,7 @@ Skills: # Ask for a confirmation when a player tries to repair an enchanted item Confirm_Required: true Salvage: - Level_Cap: 0 + Level_Cap: 100 Anvil_Messages: true Anvil_Placed_Sounds: true Anvil_Use_Sounds: true @@ -354,15 +359,16 @@ Skills: # Ask for a confirmation when a player tries to salvage an enchanted item Confirm_Required: true Smelting: - Level_Cap: 0 + Level_Cap: 100 Swords: Enabled_For_PVP: true Enabled_For_PVE: true - Level_Cap: 0 + Level_Cap: 100 + Ability_Activation_Level_Gate: 10 Taming: Enabled_For_PVP: true Enabled_For_PVE: true - Level_Cap: 0 + Level_Cap: 100 Call_Of_The_Wild: # Item_Material: Material of the item needed to summon the pet # Item_Amount: Amount of items required to summon the pet @@ -394,7 +400,8 @@ Skills: Unarmed: Enabled_For_PVP: true Enabled_For_PVE: true - Level_Cap: 0 + Level_Cap: 100 + Ability_Activation_Level_Gate: 10 Block_Cracker: SmoothBrick_To_CrackedBrick: true # When using Unarmed, picked up items will automatically get moved to a free slot instead of going in the slot @@ -404,7 +411,8 @@ Skills: Items_As_Unarmed: false Woodcutting: Tree_Feller_Sounds: true - Level_Cap: 0 + Level_Cap: 100 + Ability_Activation_Level_Gate: 10 # # Settings for Double Drops diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 0354f75ad..785c1df37 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -858,6 +858,7 @@ Skills.ChildStats=[[YELLOW]]{0}[[GREEN]]{1} Skills.TooTired=[[RED]]You are too tired to use that ability again. [[YELLOW]]({0}s) Skills.Cancelled=[[RED]]{0} cancelled! Skills.ConfirmOrCancel=[[GREEN]]Right-click again to confirm [[GOLD]]{0}[[GREEN]]. Left-click to cancel. +Skills.AbilityGateRequirementFail=[[YELLOW]]You are not yet skilled enough to perform this task. #STATISTICS Stats.Header.Combat=[[GOLD]]-=COMBAT SKILLS=-