From 37aebc1716b82274adfcf1bc3a420e2fb7ab4747 Mon Sep 17 00:00:00 2001 From: TfT_02 Date: Sun, 8 Jun 2014 23:03:26 +0200 Subject: [PATCH] Calculate Alchemy XP based on potion stage Adds #1926 --- Changelog.txt | 1 + .../config/experience/ExperienceConfig.java | 9 ++- .../datatypes/skills/alchemy/PotionStage.java | 70 +++++++++++++++++++ .../skills/alchemy/AlchemyManager.java | 5 +- .../skills/alchemy/AlchemyPotionBrewer.java | 4 +- src/main/resources/experience.yml | 12 +++- 6 files changed, 94 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/datatypes/skills/alchemy/PotionStage.java diff --git a/Changelog.txt b/Changelog.txt index 910c21bc3..5415cc9f9 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -25,6 +25,7 @@ Version 1.5.01-dev ! Changed player data saving. Save tasks are now asynchronous ! Vanished players no longer get hit by AoE effects ! Changed Alchemy config option 'Prevent_Hopper_Transfer' renamed to 'Prevent_Hopper_Transfer_Ingredients' + ! Changed Alchemy XP distribution. XP is granted based on the stage of the potion. - Removed salvage ability from Repair, salvage has it's own (child) skill now Version 1.5.00 diff --git a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java index 5babcc826..a3f8160f4 100644 --- a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java +++ b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java @@ -13,6 +13,7 @@ import com.gmail.nossr50.config.AutoUpdateConfigLoader; import com.gmail.nossr50.datatypes.experience.FormulaType; import com.gmail.nossr50.datatypes.skills.MaterialType; import com.gmail.nossr50.datatypes.skills.SkillType; +import com.gmail.nossr50.datatypes.skills.alchemy.PotionStage; import com.gmail.nossr50.util.StringUtils; public class ExperienceConfig extends AutoUpdateConfigLoader { @@ -80,8 +81,10 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { */ /* Alchemy */ - if (getPotionXP() <= 0) { - reason.add("Experience.Alchemy.Potion should be greater than 0!"); + for (PotionStage potionStage : PotionStage.values()) { + if (getPotionXP(potionStage) < 0) { + reason.add("Experience.Alchemy.Potion_Stage_" + potionStage.toNumerical() + " should be at least 0!"); + } } /* Combat XP Multipliers */ @@ -201,7 +204,7 @@ public class ExperienceConfig extends AutoUpdateConfigLoader { public double getFeatherFallXPModifier() { return config.getDouble("Experience.Acrobatics.FeatherFall_Multiplier", 2.0); } /* Alchemy */ - public double getPotionXP() { return config.getDouble("Experience.Alchemy.Potion", 150D); } + public double getPotionXP(PotionStage stage) { return config.getDouble("Experience.Alchemy.Potion_Stage_" + stage.toNumerical(), 10D); } /* Fishing */ public int getFishXp(MaterialData data) { diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/alchemy/PotionStage.java b/src/main/java/com/gmail/nossr50/datatypes/skills/alchemy/PotionStage.java new file mode 100644 index 000000000..9f8df4fba --- /dev/null +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/alchemy/PotionStage.java @@ -0,0 +1,70 @@ +package com.gmail.nossr50.datatypes.skills.alchemy; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.Potion; + +public enum PotionStage { + FIVE(5), + FOUR(4), + THREE(3), + TWO(2), + ONE(1); + + int numerical; + + private PotionStage(int numerical) { + this.numerical = numerical; + } + + public int toNumerical() { + return numerical; + } + + private static PotionStage getPotionStageNumerical(int numerical) { + for (PotionStage potionStage : values()) { + if (numerical >= potionStage.toNumerical()) { + return potionStage; + } + } + + return ONE; + } + + public static PotionStage getPotionStage(AlchemyPotion input, AlchemyPotion output) { + PotionStage potionStage = getPotionStage(output); + if (getPotionStage(input) == potionStage) { + potionStage = PotionStage.FIVE; + } + + return potionStage; + } + + public static PotionStage getPotionStage(AlchemyPotion alchemyPotion) { + Potion potion = Potion.fromItemStack(new ItemStack(Material.POTION, 1, alchemyPotion.getDataValue())); + + int stage = 1; + + // Check if potion isn't awkward or mundane + if (potion.getType() != null) { + stage++; + } + + // Check if potion has a glowstone dust amplifier + if (potion.getLevel() > 1) { + stage++; + } + + // Check if potion has a redstone dust amplifier + if (potion.hasExtendedDuration()) { + stage++; + } + + // Check if potion has a gunpowder amplifier + if (potion.isSplash()) { + stage++; + } + + return PotionStage.getPotionStageNumerical(stage); + } +} diff --git a/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyManager.java b/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyManager.java index 93dc5dbb8..3448567a4 100644 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyManager.java +++ b/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyManager.java @@ -9,6 +9,7 @@ import com.gmail.nossr50.config.skills.alchemy.PotionConfig; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.SkillType; import com.gmail.nossr50.datatypes.skills.XPGainReason; +import com.gmail.nossr50.datatypes.skills.alchemy.PotionStage; import com.gmail.nossr50.skills.SkillManager; import com.gmail.nossr50.util.StringUtils; @@ -64,7 +65,7 @@ public class AlchemyManager extends SkillManager { return Math.min(Alchemy.catalysisMaxSpeed, Alchemy.catalysisMinSpeed + (Alchemy.catalysisMaxSpeed - Alchemy.catalysisMinSpeed) * (skillLevel - Alchemy.catalysisUnlockLevel) / (Alchemy.catalysisMaxBonusLevel - Alchemy.catalysisUnlockLevel)) * (isLucky ? LUCKY_MODIFIER : 1.0); } - public void handlePotionBrewSuccesses(int amount) { - applyXpGain((float) (ExperienceConfig.getInstance().getPotionXP() * amount), XPGainReason.PVE); + public void handlePotionBrewSuccesses(PotionStage potionStage, int amount) { + applyXpGain((float) (ExperienceConfig.getInstance().getPotionXP(potionStage) * amount), XPGainReason.PVE); } } diff --git a/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java b/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java index 494f3c8bc..46fc14141 100644 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java +++ b/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java @@ -18,6 +18,7 @@ import com.gmail.nossr50.config.skills.alchemy.PotionConfig; import com.gmail.nossr50.datatypes.skills.SecondaryAbility; import com.gmail.nossr50.datatypes.skills.alchemy.AlchemyPotion; import com.gmail.nossr50.events.fake.FakeBrewEvent; +import com.gmail.nossr50.datatypes.skills.alchemy.PotionStage; import com.gmail.nossr50.runnables.player.PlayerUpdateInventoryTask; import com.gmail.nossr50.runnables.skills.AlchemyBrewCheckTask; import com.gmail.nossr50.util.Permissions; @@ -122,7 +123,8 @@ public final class AlchemyPotionBrewer { inventory.setItem(i, output.toItemStack(item.getAmount()).clone()); if (player != null) { - UserManager.getPlayer(player).getAlchemyManager().handlePotionBrewSuccesses(1); + PotionStage potionStage = PotionStage.getPotionStage(input, output); + UserManager.getPlayer(player).getAlchemyManager().handlePotionBrewSuccesses(potionStage, 1); } } } diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml index 0c49b3a60..167c5dbcd 100644 --- a/src/main/resources/experience.yml +++ b/src/main/resources/experience.yml @@ -80,7 +80,17 @@ Experience: # FeatherFall_Multiplier: Multiply Acrobatics XP by this value when wearing boots with the Feather Fall enchant FeatherFall_Multiplier: 2.0 Alchemy: - Potion: 120 + # Alchemy potion stages are based on the number of ingredients added + # Potion_Stage_1 represents a base potion + # Potion_Stage_2 represents a base potion with one ingredient + # Potion_Stage_3 represents a base potion with one ingredient and one amplifier + # Potion_Stage_4 represents a base potion with one ingredient and two amplifiers + # Potion_Stage_5 represents a base potion with one ingredient where the amplifiers are swapped + Potion_Stage_1: 15 + Potion_Stage_2: 30 + Potion_Stage_3: 60 + Potion_Stage_4: 120 + Potion_Stage_5: 0 Fishing: Raw_Fish: 800 Raw_Salmon: 800