From 1c6b0363cea79b7ae4ae7099d52afcec4dd5a957 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sun, 12 May 2019 00:53:15 -0700 Subject: [PATCH] Step 1 of rewriting Alchemy - Removing all the old code --- .../commands/skills/AlchemyCommand.java | 198 +++-- .../gmail/nossr50/config/ConfigManager.java | 11 +- .../config/skills/alchemy/PotionManager.java | 202 ----- .../skills/alchemy/AlchemyPotion.java | 167 ---- .../datatypes/skills/alchemy/PotionStage.java | 86 -- .../dumpster/AlchemyBrewCheckTask.java | 38 + .../nossr50/dumpster/AlchemyBrewTask.java | 118 +++ .../gmail/nossr50/dumpster/AlchemyPotion.java | 167 ++++ .../nossr50/dumpster/AlchemyPotionBrewer.java | 251 ++++++ .../CheckDateTask.java | 0 .../{util => dumpster}/HolidayManager.java | 0 .../{util => dumpster}/ModManager.java | 0 .../nossr50/dumpster/PotionGenerator.java | 740 ++++++++++++++++++ .../gmail/nossr50/dumpster/PotionManager.java | 170 ++++ .../gmail/nossr50/dumpster/PotionStage.java | 86 ++ .../nossr50/listeners/BlockListener.java | 12 +- .../nossr50/listeners/InventoryListener.java | 228 +++--- .../nossr50/listeners/WorldListener.java | 3 +- src/main/java/com/gmail/nossr50/mcMMO.java | 3 +- .../skills/AlchemyBrewCheckTask.java | 38 - .../runnables/skills/AlchemyBrewTask.java | 118 --- .../gmail/nossr50/skills/alchemy/Alchemy.java | 64 +- .../skills/alchemy/AlchemyManager.java | 82 +- .../skills/alchemy/AlchemyPotionBrewer.java | 251 ------ .../skills/alchemy/PotionGenerator.java | 718 ----------------- .../commands/CommandRegistrationManager.java | 2 +- 26 files changed, 1856 insertions(+), 1897 deletions(-) delete mode 100644 src/main/java/com/gmail/nossr50/config/skills/alchemy/PotionManager.java delete mode 100644 src/main/java/com/gmail/nossr50/datatypes/skills/alchemy/AlchemyPotion.java delete mode 100644 src/main/java/com/gmail/nossr50/datatypes/skills/alchemy/PotionStage.java create mode 100644 src/main/java/com/gmail/nossr50/dumpster/AlchemyBrewCheckTask.java create mode 100644 src/main/java/com/gmail/nossr50/dumpster/AlchemyBrewTask.java create mode 100644 src/main/java/com/gmail/nossr50/dumpster/AlchemyPotion.java create mode 100644 src/main/java/com/gmail/nossr50/dumpster/AlchemyPotionBrewer.java rename src/main/java/com/gmail/nossr50/{runnables => dumpster}/CheckDateTask.java (100%) rename src/main/java/com/gmail/nossr50/{util => dumpster}/HolidayManager.java (100%) rename src/main/java/com/gmail/nossr50/{util => dumpster}/ModManager.java (100%) create mode 100644 src/main/java/com/gmail/nossr50/dumpster/PotionGenerator.java create mode 100644 src/main/java/com/gmail/nossr50/dumpster/PotionManager.java create mode 100644 src/main/java/com/gmail/nossr50/dumpster/PotionStage.java delete mode 100644 src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewCheckTask.java delete mode 100644 src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewTask.java delete mode 100644 src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java delete mode 100644 src/main/java/com/gmail/nossr50/skills/alchemy/PotionGenerator.java diff --git a/src/main/java/com/gmail/nossr50/commands/skills/AlchemyCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/AlchemyCommand.java index bda8113a1..f0b51e2c0 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/AlchemyCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/AlchemyCommand.java @@ -1,102 +1,96 @@ -package com.gmail.nossr50.commands.skills; - -import com.gmail.nossr50.datatypes.skills.PrimarySkillType; -import com.gmail.nossr50.datatypes.skills.SubSkillType; -import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.skills.alchemy.AlchemyManager; -import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.TextComponentFactory; -import com.gmail.nossr50.util.player.UserManager; -import com.gmail.nossr50.util.skills.RankUtils; -import net.md_5.bungee.api.chat.TextComponent; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class AlchemyCommand extends SkillCommand { - private String brewSpeed; - private String brewSpeedLucky; - - private int tier; - private int ingredientCount; - private String ingredientList; - - private boolean canCatalysis; - private boolean canConcoctions; - - public AlchemyCommand() { - super(PrimarySkillType.ALCHEMY); - } - - protected String[] calculateAbilityDisplayValues(Player player) { - //TODO: Needed? - if (UserManager.getPlayer(player) == null) { - player.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); - return new String[]{"DATA NOT LOADED", "DATA NOT LOADED"}; - } - - AlchemyManager alchemyManager = UserManager.getPlayer(player).getAlchemyManager(); - String[] displayValues = new String[2]; - - boolean isLucky = Permissions.lucky(player, PrimarySkillType.ALCHEMY); - - displayValues[0] = decimal.format(alchemyManager.calculateBrewSpeed(false)) + "x"; - displayValues[1] = isLucky ? decimal.format(alchemyManager.calculateBrewSpeed(true)) + "x" : null; - - return displayValues; - } - - @Override - protected void dataCalculations(Player player, float skillValue) { - // ALCHEMY_CATALYSIS - if (canCatalysis) { - String[] catalysisStrings = calculateAbilityDisplayValues(player); - brewSpeed = catalysisStrings[0]; - brewSpeedLucky = catalysisStrings[1]; - } - - // ALCHEMY_CONCOCTIONS - if (canConcoctions) { - AlchemyManager alchemyManager = UserManager.getPlayer(player).getAlchemyManager(); - tier = alchemyManager.getTier(); - ingredientCount = alchemyManager.getIngredients().size(); - ingredientList = alchemyManager.getIngredientList(); - } - } - - @Override - protected void permissionsCheck(Player player) { - canCatalysis = canUseSubskill(player, SubSkillType.ALCHEMY_CATALYSIS); - canConcoctions = canUseSubskill(player, SubSkillType.ALCHEMY_CONCOCTIONS); - } - - @Override - protected List statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { - List messages = new ArrayList<>(); - - if (canCatalysis) { - messages.add(getStatMessage(SubSkillType.ALCHEMY_CATALYSIS, brewSpeed) - + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", brewSpeedLucky) : "")); - } - - if (canConcoctions) { - messages.add(getStatMessage(false, true, SubSkillType.ALCHEMY_CONCOCTIONS, String.valueOf(tier), String.valueOf(RankUtils.getHighestRank(SubSkillType.ALCHEMY_CONCOCTIONS)))); - messages.add(getStatMessage(true, true, SubSkillType.ALCHEMY_CONCOCTIONS, String.valueOf(ingredientCount), ingredientList)); - - //messages.add(LocaleLoader.getString("Alchemy.Concoctions.Rank", tier, RankUtils.getHighestRank(SubSkillType.ALCHEMY_CONCOCTIONS))); - //messages.add(LocaleLoader.getString("Alchemy.Concoctions.Ingredients", ingredientCount, ingredientList)); - } - - return messages; - } - - @Override - protected List getTextComponents(Player player) { - List textComponents = new ArrayList<>(); - - TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.ALCHEMY); - - return textComponents; - } -} +//package com.gmail.nossr50.commands.skills; +// +//import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +//import com.gmail.nossr50.util.TextComponentFactory; +//import net.md_5.bungee.api.chat.TextComponent; +//import org.bukkit.entity.Player; +// +//import java.util.ArrayList; +//import java.util.List; +// +//public class AlchemyCommand extends SkillCommand { +//// private String brewSpeed; +//// private String brewSpeedLucky; +//// +//// private int tier; +//// private int ingredientCount; +//// private String ingredientList; +//// +//// private boolean canCatalysis; +//// private boolean canConcoctions; +// +// public AlchemyCommand() { +// super(PrimarySkillType.ALCHEMY); +// } +// +//// protected String[] calculateAbilityDisplayValues(Player player) { +//// //TODO: Needed? +//// if (UserManager.getPlayer(player) == null) { +//// player.sendMessage(LocaleLoader.getString("Profile.PendingLoad")); +//// return new String[]{"DATA NOT LOADED", "DATA NOT LOADED"}; +//// } +//// +//// AlchemyManager alchemyManager = UserManager.getPlayer(player).getAlchemyManager(); +//// String[] displayValues = new String[2]; +//// +//// boolean isLucky = Permissions.lucky(player, PrimarySkillType.ALCHEMY); +//// +//// displayValues[0] = decimal.format(alchemyManager.calculateBrewSpeed(false)) + "x"; +//// displayValues[1] = isLucky ? decimal.format(alchemyManager.calculateBrewSpeed(true)) + "x" : null; +//// +//// return displayValues; +//// } +// +// @Override +// protected void dataCalculations(Player player, float skillValue) { +// // ALCHEMY_CATALYSIS +//// if (canCatalysis) { +//// String[] catalysisStrings = calculateAbilityDisplayValues(player); +//// brewSpeed = catalysisStrings[0]; +//// brewSpeedLucky = catalysisStrings[1]; +//// } +//// +//// // ALCHEMY_CONCOCTIONS +//// if (canConcoctions) { +//// AlchemyManager alchemyManager = UserManager.getPlayer(player).getAlchemyManager(); +//// tier = alchemyManager.getTier(); +//// ingredientCount = alchemyManager.getIngredients().size(); +//// ingredientList = alchemyManager.getIngredientList(); +//// } +// } +// +// @Override +// protected void permissionsCheck(Player player) { +//// canCatalysis = canUseSubskill(player, SubSkillType.ALCHEMY_CATALYSIS); +//// canConcoctions = canUseSubskill(player, SubSkillType.ALCHEMY_CONCOCTIONS); +// } +// +// @Override +// protected List statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { +// List messages = new ArrayList<>(); +// +//// if (canCatalysis) { +//// messages.add(getStatMessage(SubSkillType.ALCHEMY_CATALYSIS, brewSpeed) +//// + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", brewSpeedLucky) : "")); +//// } +//// +//// if (canConcoctions) { +//// messages.add(getStatMessage(false, true, SubSkillType.ALCHEMY_CONCOCTIONS, String.valueOf(tier), String.valueOf(RankUtils.getHighestRank(SubSkillType.ALCHEMY_CONCOCTIONS)))); +//// messages.add(getStatMessage(true, true, SubSkillType.ALCHEMY_CONCOCTIONS, String.valueOf(ingredientCount), ingredientList)); +//// +//// //messages.add(LocaleLoader.getString("Alchemy.Concoctions.Rank", tier, RankUtils.getHighestRank(SubSkillType.ALCHEMY_CONCOCTIONS))); +//// //messages.add(LocaleLoader.getString("Alchemy.Concoctions.Ingredients", ingredientCount, ingredientList)); +//// } +// +// return messages; +// } +// +// @Override +// protected List getTextComponents(Player player) { +// List textComponents = new ArrayList<>(); +// +// TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.ALCHEMY); +// +// return textComponents; +// } +//} diff --git a/src/main/java/com/gmail/nossr50/config/ConfigManager.java b/src/main/java/com/gmail/nossr50/config/ConfigManager.java index a2092f647..291ddc929 100644 --- a/src/main/java/com/gmail/nossr50/config/ConfigManager.java +++ b/src/main/java/com/gmail/nossr50/config/ConfigManager.java @@ -40,7 +40,6 @@ import com.gmail.nossr50.config.hocon.skills.unarmed.ConfigUnarmed; import com.gmail.nossr50.config.hocon.skills.woodcutting.ConfigWoodcutting; import com.gmail.nossr50.config.hocon.superabilities.ConfigSuperAbilities; import com.gmail.nossr50.config.hocon.worldblacklist.ConfigWorldBlacklist; -import com.gmail.nossr50.config.skills.alchemy.PotionManager; import com.gmail.nossr50.config.treasure.ExcavationTreasureConfig; import com.gmail.nossr50.config.treasure.FishingTreasureConfig; import com.gmail.nossr50.config.treasure.HerbalismTreasureConfig; @@ -93,7 +92,7 @@ public final class ConfigManager { /* MISC MANAGERS */ private TypeSerializerCollection customSerializers; private ExperienceMapManager experienceMapManager; - private PotionManager potionManager; +// private PotionManager potionManager; /* CONFIG INSTANCES */ @@ -333,7 +332,7 @@ public final class ConfigManager { //Set the global XP val experienceMapManager.setGlobalXpMult(getConfigExperience().getGlobalXPMultiplier()); experienceMapManager.buildBlockXPMaps(); //Block XP value maps - potionManager = new PotionManager(); +// potionManager = new PotionManager(); } /** @@ -470,9 +469,9 @@ public final class ConfigManager { return advancedConfig; } - public PotionManager getPotionManager() { - return potionManager; - } +// public PotionManager getPotionManager() { +// return potionManager; +// } public CoreSkillsConfig getCoreSkillsConfig() { return coreSkillsConfig; diff --git a/src/main/java/com/gmail/nossr50/config/skills/alchemy/PotionManager.java b/src/main/java/com/gmail/nossr50/config/skills/alchemy/PotionManager.java deleted file mode 100644 index a02db4375..000000000 --- a/src/main/java/com/gmail/nossr50/config/skills/alchemy/PotionManager.java +++ /dev/null @@ -1,202 +0,0 @@ -package com.gmail.nossr50.config.skills.alchemy; - -import com.gmail.nossr50.datatypes.skills.alchemy.AlchemyPotion; -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.skills.alchemy.PotionGenerator; -import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Eventually I'm going to delete all of our Alchemy code and rewrite it from scratch - */ -@ConfigSerializable -public class PotionManager { - - /* CONSTANTS */ - public static final String POTIONS = "Potions"; -// public static final String NAME = "Name"; -// public static final String POTION_DATA = "PotionData"; -// public static final String POTION_TYPE = "PotionType"; -// public static final String WATER = "WATER"; -// public static final String EXTENDED = "Extended"; -// public static final String UPGRADED = "Upgraded"; -// public static final String MATERIAL = "Material"; -// public static final String LORE = "Lore"; -// public static final String EFFECTS = "Effects"; -// public static final String COLOR = "Color"; -// public static final String CHILDREN = "Children"; - - /* INGREDIENTS */ - - private List ingredientTierOne; - private List ingredientTierTwo; - private List ingredientTierThree; - private List ingredientTierFour; - private List ingredientTierFive; - private List ingredientTierSix; - private List ingredientTierSeven; - private List ingredientTierEight; - - private Map potionMap = new HashMap<>(); - - public PotionManager() { - initIngredientLists(); - initPotionMap(); - } - - /** - * This grabs an instance of this config class from the Config Manager - * This method is deprecated and will be removed in the future - * - * @return the instance of this config - * @see mcMMO#getConfigManager() - * @deprecated Please use mcMMO.getConfigManager() to grab a specific config instead - */ - @Deprecated - public static PotionManager getInstance() { - return mcMMO.getConfigManager().getPotionManager(); - } - - @Override - public void unload() { - potionMap.clear(); - } - - /** - * I just want anyone who reads this to know - * This entire class is an abomination - * What you see below is a hacky solution to keep Alchemy functioning with the new config system - * Alchemy will be rewritten, until then, this disgusting class exists. - */ - private void initIngredientLists() { - ingredientTierOne = new ArrayList<>(); - ingredientTierTwo = new ArrayList<>(); - ingredientTierThree = new ArrayList<>(); - ingredientTierFour = new ArrayList<>(); - ingredientTierFive = new ArrayList<>(); - ingredientTierSix = new ArrayList<>(); - ingredientTierSeven = new ArrayList<>(); - ingredientTierEight = new ArrayList<>(); - - ingredientTierOne.add(new ItemStack(Material.BLAZE_POWDER)); - ingredientTierOne.add(new ItemStack(Material.FERMENTED_SPIDER_EYE)); - ingredientTierOne.add(new ItemStack(Material.GHAST_TEAR)); - ingredientTierOne.add(new ItemStack(Material.GLOWSTONE_DUST)); - ingredientTierOne.add(new ItemStack(Material.GOLDEN_CARROT)); - ingredientTierOne.add(new ItemStack(Material.MAGMA_CREAM)); - ingredientTierOne.add(new ItemStack(Material.NETHER_WART)); - ingredientTierOne.add(new ItemStack(Material.REDSTONE)); - ingredientTierOne.add(new ItemStack(Material.GLISTERING_MELON_SLICE)); - ingredientTierOne.add(new ItemStack(Material.SPIDER_EYE)); - ingredientTierOne.add(new ItemStack(Material.SUGAR)); - ingredientTierOne.add(new ItemStack(Material.GUNPOWDER)); - ingredientTierOne.add(new ItemStack(Material.PUFFERFISH)); - ingredientTierOne.add(new ItemStack(Material.DRAGON_BREATH)); - - ingredientTierTwo.add(new ItemStack(Material.CARROT)); - ingredientTierTwo.add(new ItemStack(Material.SLIME_BALL)); - ingredientTierTwo.add(new ItemStack(Material.PHANTOM_MEMBRANE)); - - ingredientTierThree.add(new ItemStack(Material.QUARTZ)); - ingredientTierThree.add(new ItemStack(Material.RED_MUSHROOM)); - - ingredientTierFour.add(new ItemStack(Material.APPLE)); - ingredientTierFour.add(new ItemStack(Material.ROTTEN_FLESH)); - - ingredientTierFive.add(new ItemStack(Material.BROWN_MUSHROOM)); - ingredientTierFive.add(new ItemStack(Material.INK_SAC)); - - ingredientTierSix.add(new ItemStack(Material.FERN)); - - ingredientTierSeven.add(new ItemStack(Material.POISONOUS_POTATO)); - - ingredientTierEight.add(new ItemStack(Material.GOLDEN_APPLE)); - } - - private void loadConcoctionsTier(List ingredientList, List ingredients) { - if (ingredients != null && ingredients.size() > 0) { - for (String ingredientString : ingredients) { - ItemStack ingredient = loadIngredient(ingredientString); - - if (ingredient != null) { - ingredientList.add(ingredient); - } - } - } - } - - private void initPotionMap() { - PotionGenerator potionGenerator = new PotionGenerator(); - - } - - /** - * Parse a string representation of an ingredient. - * Format: '<MATERIAL>[:data]' - * Returns null if input cannot be parsed. - * - * @param ingredient String representing an ingredient. - * @return Parsed ingredient. - */ - private ItemStack loadIngredient(String ingredient) { - if (ingredient == null || ingredient.isEmpty()) { - return null; - } - - Material material = Material.getMaterial(ingredient); - - if (material != null) { - return new ItemStack(material, 1); - } - - return null; - } - - public List getIngredients(int tier) { - switch (tier) { - case 8: - return ingredientTierEight; - case 7: - return ingredientTierSeven; - case 6: - return ingredientTierSix; - case 5: - return ingredientTierFive; - case 4: - return ingredientTierFour; - case 3: - return ingredientTierThree; - case 2: - return ingredientTierTwo; - case 1: - default: - return ingredientTierOne; - } - } - - public boolean isValidPotion(ItemStack item) { - return getPotion(item) != null; - } - - public AlchemyPotion getPotion(String name) { - return potionMap.get(name); - } - - public AlchemyPotion getPotion(ItemStack item) { - for (AlchemyPotion potion : potionMap.values()) { - if (potion.isSimilar(item)) { - return potion; - } - } - return null; - } - - - -} diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/alchemy/AlchemyPotion.java b/src/main/java/com/gmail/nossr50/datatypes/skills/alchemy/AlchemyPotion.java deleted file mode 100644 index 6e476a1e9..000000000 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/alchemy/AlchemyPotion.java +++ /dev/null @@ -1,167 +0,0 @@ -package com.gmail.nossr50.datatypes.skills.alchemy; - -import com.gmail.nossr50.config.skills.alchemy.PotionManager; -import org.bukkit.Color; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.PotionMeta; -import org.bukkit.potion.Potion; -import org.bukkit.potion.PotionData; -import org.bukkit.potion.PotionEffect; - -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -public class AlchemyPotion { - private Material material; - private PotionData data; - private String name; - private List lore; - private List effects; - private Color color; - private Map children; - - public AlchemyPotion(Material material, PotionData data, String name, List lore, List effects, Color color, Map children) { - this.material = material; - this.data = data; - this.lore = lore; - this.name = name; - this.effects = effects; - this.children = children; - this.color = color; - } - - public String toString() { - return "AlchemyPotion{" + data + ", " + name + ", Effects[" + effects.size() + "], Children[" + children.size() + "]}"; - } - - public ItemStack toItemStack(int amount) { - ItemStack potion = new ItemStack(material, amount); - PotionMeta meta = (PotionMeta) potion.getItemMeta(); - - meta.setBasePotionData(data); - if (this.getName() != null) { - meta.setDisplayName(this.getName()); - } - - if (this.getLore() != null && !this.getLore().isEmpty()) { - meta.setLore(this.getLore()); - } - - if (!this.getEffects().isEmpty()) { - for (PotionEffect effect : this.getEffects()) { - meta.addCustomEffect(effect, true); - } - } - - if (this.getColor() != null) { - meta.setColor(this.getColor()); - } - - potion.setItemMeta(meta); - return potion; - } - - public Material getMaterial() { - return material; - } - - public Potion toPotion(int amount) { - return Potion.fromItemStack(this.toItemStack(amount)); - } - - public PotionData getData() { - return data; - } - - public void setData(PotionData data) { - this.data = data; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getLore() { - return lore; - } - - public void setLore(List lore) { - this.lore = lore; - } - - public List getEffects() { - return effects; - } - - public void setEffects(List effects) { - this.effects = effects; - } - - public Color getColor() { - return color; - } - - public void setColor(Color color) { - this.color = color; - } - - public Map getChildren() { - return children; - } - - public void setChildren(Map children) { - this.children = children; - } - - public AlchemyPotion getChild(ItemStack ingredient) { - if (!children.isEmpty()) { - for (Entry child : children.entrySet()) { - if (ingredient.isSimilar(child.getKey())) { - return PotionManager.getInstance().getPotion(child.getValue()); - } - } - } - return null; - } - - public boolean isSimilar(ItemStack item) { - if (item.getType() != material) { - return false; - } - if (!item.hasItemMeta()) { - return false; - } - PotionMeta meta = (PotionMeta) item.getItemMeta(); - PotionData that = meta.getBasePotionData(); - if (data.getType() != that.getType()) { - return false; - } - if (data.isExtended() != that.isExtended()) { - return false; - } - if (data.isUpgraded() != that.isUpgraded()) { - return false; - } - for (PotionEffect effect : effects) { - if (!meta.hasCustomEffect(effect.getType())) { - return false; - } - } - if (!meta.hasLore() && !lore.isEmpty()) { - return false; - } - if (!(lore.isEmpty() && !meta.hasLore()) && !meta.getLore().equals(lore)) { - return false; - } - if (!meta.hasDisplayName() && name != null) { - return false; - } - return (name == null && !meta.hasDisplayName()) || meta.getDisplayName().equals(name); - } -} 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 deleted file mode 100644 index 95d1f7dd0..000000000 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/alchemy/PotionStage.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.gmail.nossr50.datatypes.skills.alchemy; - -import org.bukkit.Material; -import org.bukkit.potion.PotionData; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionType; - -import java.util.List; - -public enum PotionStage { - FIVE(5), - FOUR(4), - THREE(3), - TWO(2), - ONE(1); - - int numerical; - - PotionStage(int numerical) { - this.numerical = 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 (!isWaterBottle(input) && getPotionStage(input) == potionStage) { - potionStage = PotionStage.FIVE; - } - - return potionStage; - } - - private static boolean isWaterBottle(AlchemyPotion input) { - return input.getData().getType() == PotionType.WATER; - } - - public static PotionStage getPotionStage(AlchemyPotion alchemyPotion) { - PotionData data = alchemyPotion.getData(); - List effects = alchemyPotion.getEffects(); - - int stage = 1; - - // Check if potion has an effect of any sort - if (data.getType().getEffectType() != null || !effects.isEmpty()) { - stage++; - } - - // Check if potion has a glowstone dust amplifier - // Else check if the potion has a custom effect with an amplifier added by mcMMO - if (data.isUpgraded()) { - stage++; - } else if (!effects.isEmpty()) { - for (PotionEffect effect : effects) { - if (effect.getAmplifier() > 0) { - stage++; - break; - } - } - } - - // Check if potion has a redstone dust amplifier - if (data.isExtended()) { - stage++; - } - - // Check if potion has a gunpowder amplifier - if (alchemyPotion.getMaterial() == Material.SPLASH_POTION || alchemyPotion.getMaterial() == Material.LINGERING_POTION) { - stage++; - } - - return PotionStage.getPotionStageNumerical(stage); - } - - public int toNumerical() { - return numerical; - } -} diff --git a/src/main/java/com/gmail/nossr50/dumpster/AlchemyBrewCheckTask.java b/src/main/java/com/gmail/nossr50/dumpster/AlchemyBrewCheckTask.java new file mode 100644 index 000000000..35fe0cd01 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/dumpster/AlchemyBrewCheckTask.java @@ -0,0 +1,38 @@ +//package com.gmail.nossr50.runnables.skills; +// +//import com.gmail.nossr50.skills.alchemy.Alchemy; +//import com.gmail.nossr50.skills.alchemy.AlchemyPotionBrewer; +//import org.bukkit.Location; +//import org.bukkit.block.BrewingStand; +//import org.bukkit.entity.Player; +//import org.bukkit.inventory.ItemStack; +//import org.bukkit.scheduler.BukkitRunnable; +// +//import java.util.Arrays; +// +//public class AlchemyBrewCheckTask extends BukkitRunnable { +// private Player player; +// private BrewingStand brewingStand; +// private ItemStack[] oldInventory; +// +// public AlchemyBrewCheckTask(Player player, BrewingStand brewingStand) { +// this.player = player; +// this.brewingStand = brewingStand; +// this.oldInventory = Arrays.copyOfRange(brewingStand.getInventory().getContents(), 0, 4); +// } +// +// @Override +// public void run() { +// Location location = brewingStand.getLocation(); +// ItemStack[] newInventory = Arrays.copyOfRange(brewingStand.getInventory().getContents(), 0, 4); +// boolean validBrew = brewingStand.getFuelLevel() > 0 && AlchemyPotionBrewer.isValidBrew(player, newInventory); +// +// if (Alchemy.brewingStandMap.containsKey(location)) { +// if (oldInventory[Alchemy.INGREDIENT_SLOT] == null || newInventory[Alchemy.INGREDIENT_SLOT] == null || !oldInventory[Alchemy.INGREDIENT_SLOT].isSimilar(newInventory[Alchemy.INGREDIENT_SLOT]) || !validBrew) { +// Alchemy.brewingStandMap.get(location).cancelBrew(); +// } +// } else if (validBrew) { +// Alchemy.brewingStandMap.put(location, new AlchemyBrewTask(brewingStand, player)); +// } +// } +//} diff --git a/src/main/java/com/gmail/nossr50/dumpster/AlchemyBrewTask.java b/src/main/java/com/gmail/nossr50/dumpster/AlchemyBrewTask.java new file mode 100644 index 000000000..2c08df32d --- /dev/null +++ b/src/main/java/com/gmail/nossr50/dumpster/AlchemyBrewTask.java @@ -0,0 +1,118 @@ +//package com.gmail.nossr50.runnables.skills; +// +//import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +//import com.gmail.nossr50.datatypes.skills.SubSkillType; +//import com.gmail.nossr50.events.skills.alchemy.McMMOPlayerBrewEvent; +//import com.gmail.nossr50.events.skills.alchemy.McMMOPlayerCatalysisEvent; +//import com.gmail.nossr50.mcMMO; +//import com.gmail.nossr50.skills.alchemy.Alchemy; +//import com.gmail.nossr50.skills.alchemy.AlchemyPotionBrewer; +//import com.gmail.nossr50.util.Misc; +//import com.gmail.nossr50.util.Permissions; +//import com.gmail.nossr50.util.player.UserManager; +//import org.bukkit.Location; +//import org.bukkit.Material; +//import org.bukkit.block.BlockState; +//import org.bukkit.block.BrewingStand; +//import org.bukkit.entity.Player; +//import org.bukkit.scheduler.BukkitRunnable; +// +//public class AlchemyBrewTask extends BukkitRunnable { +// +// private BlockState brewingStand; +// private Location location; +// private double brewSpeed; +// private double brewTimer; +// private Player player; +// private int fuel; +// private boolean firstRun = true; +// +// public AlchemyBrewTask(BlockState brewingStand, Player player) { +// this.brewingStand = brewingStand; +// this.location = brewingStand.getLocation(); +// this.player = player; +// +// brewSpeed = 1.0; +// brewTimer = 400; +// +// if (player != null +// && !Misc.isNPCEntity(player) +// && Permissions.isSubSkillEnabled(player, SubSkillType.ALCHEMY_CATALYSIS) +// && UserManager.getPlayer(player) != null) { +// +// double catalysis = UserManager.getPlayer(player).getAlchemyManager().calculateBrewSpeed(Permissions.lucky(player, PrimarySkillType.ALCHEMY)); +// +// McMMOPlayerCatalysisEvent event = new McMMOPlayerCatalysisEvent(player, catalysis); +// mcMMO.p.getServer().getPluginManager().callEvent(event); +// +// if (!event.isCancelled()) { +// brewSpeed = catalysis; +// } +// } +// +// if (Alchemy.brewingStandMap.containsKey(location)) { +// Alchemy.brewingStandMap.get(location).cancel(); +// } +// +// fuel = ((BrewingStand) brewingStand).getFuelLevel(); +// +// if (((BrewingStand) brewingStand).getBrewingTime() == -1) // Only decrement on our end if it isn't a vanilla ingredient. +// fuel--; +// +// Alchemy.brewingStandMap.put(location, this); +// this.runTaskTimer(mcMMO.p, 1, 1); +// } +// +// @Override +// public void run() { +// if (player == null || !player.isValid() || brewingStand == null || brewingStand.getType() != Material.BREWING_STAND || !AlchemyPotionBrewer.isValidIngredient(player, ((BrewingStand) brewingStand).getInventory().getContents()[Alchemy.INGREDIENT_SLOT])) { +// if (Alchemy.brewingStandMap.containsKey(location)) { +// Alchemy.brewingStandMap.remove(location); +// } +// +// this.cancel(); +// +// return; +// } +// +// if (firstRun) { +// firstRun = false; +// ((BrewingStand) brewingStand).setFuelLevel(fuel); +// } +// +// brewTimer -= brewSpeed; +// +// // Vanilla potion brewing completes when BrewingTime == 1 +// if (brewTimer < Math.max(brewSpeed, 2)) { +// this.cancel(); +// finish(); +// } else { +// ((BrewingStand) brewingStand).setBrewingTime((int) brewTimer); +// } +// } +// +// private void finish() { +// McMMOPlayerBrewEvent event = new McMMOPlayerBrewEvent(player, brewingStand); +// mcMMO.p.getServer().getPluginManager().callEvent(event); +// +// if (!event.isCancelled()) { +// AlchemyPotionBrewer.finishBrewing(brewingStand, player, false); +// } +// +// Alchemy.brewingStandMap.remove(location); +// } +// +// public void finishImmediately() { +// this.cancel(); +// +// AlchemyPotionBrewer.finishBrewing(brewingStand, player, true); +// Alchemy.brewingStandMap.remove(location); +// } +// +// public void cancelBrew() { +// this.cancel(); +// +// ((BrewingStand) brewingStand).setBrewingTime(-1); +// Alchemy.brewingStandMap.remove(location); +// } +//} diff --git a/src/main/java/com/gmail/nossr50/dumpster/AlchemyPotion.java b/src/main/java/com/gmail/nossr50/dumpster/AlchemyPotion.java new file mode 100644 index 000000000..b1a90e89d --- /dev/null +++ b/src/main/java/com/gmail/nossr50/dumpster/AlchemyPotion.java @@ -0,0 +1,167 @@ +//package com.gmail.nossr50.datatypes.skills.alchemy; +// +//import com.gmail.nossr50.config.PotionManager; +//import org.bukkit.Color; +//import org.bukkit.Material; +//import org.bukkit.inventory.ItemStack; +//import org.bukkit.inventory.meta.PotionMeta; +//import org.bukkit.potion.Potion; +//import org.bukkit.potion.PotionData; +//import org.bukkit.potion.PotionEffect; +// +//import java.util.List; +//import java.util.Map; +//import java.util.Map.Entry; +// +//public class AlchemyPotion { +// private Material material; +// private PotionData data; +// private String name; +// private List lore; +// private List effects; +// private Color color; +// private Map children; +// +// public AlchemyPotion(Material material, PotionData data, String name, List lore, List effects, Color color, Map children) { +// this.material = material; +// this.data = data; +// this.lore = lore; +// this.name = name; +// this.effects = effects; +// this.children = children; +// this.color = color; +// } +// +// public String toString() { +// return "AlchemyPotion{" + data + ", " + name + ", Effects[" + effects.size() + "], Children[" + children.size() + "]}"; +// } +// +// public ItemStack toItemStack(int amount) { +// ItemStack potion = new ItemStack(material, amount); +// PotionMeta meta = (PotionMeta) potion.getItemMeta(); +// +// meta.setBasePotionData(data); +// if (this.getName() != null) { +// meta.setDisplayName(this.getName()); +// } +// +// if (this.getLore() != null && !this.getLore().isEmpty()) { +// meta.setLore(this.getLore()); +// } +// +// if (!this.getEffects().isEmpty()) { +// for (PotionEffect effect : this.getEffects()) { +// meta.addCustomEffect(effect, true); +// } +// } +// +// if (this.getColor() != null) { +// meta.setColor(this.getColor()); +// } +// +// potion.setItemMeta(meta); +// return potion; +// } +// +// public Material getMaterial() { +// return material; +// } +// +// public Potion toPotion(int amount) { +// return Potion.fromItemStack(this.toItemStack(amount)); +// } +// +// public PotionData getData() { +// return data; +// } +// +// public void setData(PotionData data) { +// this.data = data; +// } +// +// public String getName() { +// return name; +// } +// +// public void setName(String name) { +// this.name = name; +// } +// +// public List getLore() { +// return lore; +// } +// +// public void setLore(List lore) { +// this.lore = lore; +// } +// +// public List getEffects() { +// return effects; +// } +// +// public void setEffects(List effects) { +// this.effects = effects; +// } +// +// public Color getColor() { +// return color; +// } +// +// public void setColor(Color color) { +// this.color = color; +// } +// +// public Map getChildren() { +// return children; +// } +// +// public void setChildren(Map children) { +// this.children = children; +// } +// +// public AlchemyPotion getChild(ItemStack ingredient) { +// if (!children.isEmpty()) { +// for (Entry child : children.entrySet()) { +// if (ingredient.isSimilar(child.getKey())) { +// return PotionManager.getInstance().getPotion(child.getValue()); +// } +// } +// } +// return null; +// } +// +// public boolean isSimilar(ItemStack item) { +// if (item.getType() != material) { +// return false; +// } +// if (!item.hasItemMeta()) { +// return false; +// } +// PotionMeta meta = (PotionMeta) item.getItemMeta(); +// PotionData that = meta.getBasePotionData(); +// if (data.getType() != that.getType()) { +// return false; +// } +// if (data.isExtended() != that.isExtended()) { +// return false; +// } +// if (data.isUpgraded() != that.isUpgraded()) { +// return false; +// } +// for (PotionEffect effect : effects) { +// if (!meta.hasCustomEffect(effect.getType())) { +// return false; +// } +// } +// if (!meta.hasLore() && !lore.isEmpty()) { +// return false; +// } +// if (!(lore.isEmpty() && !meta.hasLore()) && !meta.getLore().equals(lore)) { +// return false; +// } +// if (!meta.hasDisplayName() && name != null) { +// return false; +// } +// return (name == null && !meta.hasDisplayName()) || meta.getDisplayName().equals(name); +// } +//} diff --git a/src/main/java/com/gmail/nossr50/dumpster/AlchemyPotionBrewer.java b/src/main/java/com/gmail/nossr50/dumpster/AlchemyPotionBrewer.java new file mode 100644 index 000000000..f596e5d30 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/dumpster/AlchemyPotionBrewer.java @@ -0,0 +1,251 @@ +//package com.gmail.nossr50.skills.alchemy; +// +//import com.gmail.nossr50.config.PotionManager; +//import com.gmail.nossr50.datatypes.skills.SubSkillType; +//import com.gmail.nossr50.datatypes.skills.alchemy.AlchemyPotion; +//import com.gmail.nossr50.datatypes.skills.alchemy.PotionStage; +//import com.gmail.nossr50.events.fake.FakeBrewEvent; +//import com.gmail.nossr50.mcMMO; +//import com.gmail.nossr50.runnables.player.PlayerUpdateInventoryTask; +//import com.gmail.nossr50.runnables.skills.AlchemyBrewCheckTask; +//import com.gmail.nossr50.util.Permissions; +//import com.gmail.nossr50.util.player.UserManager; +//import org.bukkit.Material; +//import org.bukkit.block.BlockState; +//import org.bukkit.block.BrewingStand; +//import org.bukkit.entity.HumanEntity; +//import org.bukkit.entity.Player; +//import org.bukkit.event.inventory.ClickType; +//import org.bukkit.inventory.BrewerInventory; +//import org.bukkit.inventory.Inventory; +//import org.bukkit.inventory.InventoryView; +//import org.bukkit.inventory.ItemStack; +// +//import java.util.ArrayList; +//import java.util.List; +// +//public final class AlchemyPotionBrewer { +// public static boolean isValidBrew(Player player, ItemStack[] contents) { +// if (!isValidIngredient(player, contents[Alchemy.INGREDIENT_SLOT])) { +// return false; +// } +// +// for (int i = 0; i < 3; i++) { +// if (contents[i] == null || contents[i].getType() != Material.POTION && contents[i].getType() != Material.SPLASH_POTION && contents[i].getType() != Material.LINGERING_POTION) { +// continue; +// } +// +// if (getChildPotion(PotionManager.getInstance().getPotion(contents[i]), contents[Alchemy.INGREDIENT_SLOT]) != null) { +// return true; +// } +// } +// +// return false; +// } +// +// private static AlchemyPotion getChildPotion(AlchemyPotion potion, ItemStack ingredient) { +// if (potion != null) { +// return potion.getChild(ingredient); +// } +// +// return null; +// } +// +// public static boolean isEmpty(ItemStack item) { +// return item == null || item.getType() == Material.AIR || item.getAmount() == 0; +// } +// +// private static void removeIngredient(BrewerInventory inventory, Player player) { +// ItemStack ingredient = inventory.getIngredient() == null ? null : inventory.getIngredient().clone(); +// +// if (isEmpty(ingredient) || !isValidIngredient(player, ingredient)) { +// } else if (ingredient.getAmount() <= 1) { +// inventory.setIngredient(null); +// } else { +// ingredient.setAmount(ingredient.getAmount() - 1); +// inventory.setIngredient(ingredient); +// } +// } +// +// private static boolean hasIngredient(BrewerInventory inventory, Player player) { +// ItemStack ingredient = inventory.getIngredient() == null ? null : inventory.getIngredient().clone(); +// +// return !isEmpty(ingredient) && isValidIngredient(player, ingredient); +// } +// +// public static boolean isValidIngredient(Player player, ItemStack item) { +// if (isEmpty(item)) { +// return false; +// } +// +// for (ItemStack ingredient : getValidIngredients(player)) { +// if (item.isSimilar(ingredient)) { +// return true; +// } +// } +// +// return false; +// } +// +// private static List getValidIngredients(Player player) { +// if (player == null || UserManager.getPlayer(player) == null) { +// return PotionManager.getInstance().getIngredients(1); +// } +// +// return PotionManager.getInstance().getIngredients(!Permissions.isSubSkillEnabled(player, SubSkillType.ALCHEMY_CONCOCTIONS) ? 1 : UserManager.getPlayer(player).getAlchemyManager().getTier()); +// } +// +// public static void finishBrewing(BlockState brewingStand, Player player, boolean forced) { +// if (!(brewingStand instanceof BrewingStand)) { +// return; +// } +// +// BrewerInventory inventory = ((BrewingStand) brewingStand).getInventory(); +// ItemStack ingredient = inventory.getIngredient() == null ? null : inventory.getIngredient().clone(); +// +// if (!hasIngredient(inventory, player)) { +// return; +// } +// +// List inputList = new ArrayList<>(); +// +// for (int i = 0; i < 3; i++) { +// ItemStack item = inventory.getItem(i); +// +// if (isEmpty(item) || item.getType() == Material.GLASS_BOTTLE || !mcMMO.getConfigManager().getPotionManager().isValidPotion(item)) { +// continue; +// } +// +// AlchemyPotion input = mcMMO.getConfigManager().getPotionManager().getPotion(item); +// AlchemyPotion output = input.getChild(ingredient); +// +// inputList.add(input); +// +// if (output != null) { +// inventory.setItem(i, output.toItemStack(item.getAmount()).clone()); +// } +// } +// +// FakeBrewEvent event = new FakeBrewEvent(brewingStand.getBlock(), inventory, ((BrewingStand) brewingStand).getFuelLevel()); +// mcMMO.p.getServer().getPluginManager().callEvent(event); +// +// if (event.isCancelled() || inputList.isEmpty()) { +// return; +// } +// +// removeIngredient(inventory, player); +// +// for (AlchemyPotion input : inputList) { +// AlchemyPotion output = input.getChild(ingredient); +// +// if (output != null && player != null) { +// PotionStage potionStage = PotionStage.getPotionStage(input, output); +// +// //TODO: hmm +// if (UserManager.hasPlayerDataKey(player)) { +// UserManager.getPlayer(player).getAlchemyManager().handlePotionBrewSuccesses(potionStage, 1); +// } +// } +// } +// +// if (!forced) { +// scheduleUpdate(inventory); +// } +// } +// +// public static boolean transferItems(InventoryView view, int fromSlot, ClickType click) { +// boolean success = false; +// +// if (click.isLeftClick()) { +// success = transferItems(view, fromSlot); +// } else if (click.isRightClick()) { +// success = transferOneItem(view, fromSlot); +// } +// +// return success; +// } +// +// private static boolean transferOneItem(InventoryView view, int fromSlot) { +// ItemStack from = view.getItem(fromSlot).clone(); +// ItemStack to = view.getItem(Alchemy.INGREDIENT_SLOT).clone(); +// +// if (isEmpty(from)) { +// return false; +// } +// +// boolean emptyTo = isEmpty(to); +// int fromAmount = from.getAmount(); +// +// if (!emptyTo && fromAmount >= from.getType().getMaxStackSize()) { +// return false; +// } else if (emptyTo || from.isSimilar(to)) { +// if (emptyTo) { +// to = from.clone(); +// to.setAmount(1); +// } else { +// to.setAmount(to.getAmount() + 1); +// } +// +// from.setAmount(fromAmount - 1); +// view.setItem(Alchemy.INGREDIENT_SLOT, to); +// view.setItem(fromSlot, from); +// +// return true; +// } +// +// return false; +// } +// +// /** +// * Transfer items between two ItemStacks, returning the leftover status +// */ +// private static boolean transferItems(InventoryView view, int fromSlot) { +// ItemStack from = view.getItem(fromSlot).clone(); +// ItemStack to = view.getItem(Alchemy.INGREDIENT_SLOT).clone(); +// +// if (isEmpty(from)) { +// return false; +// } else if (isEmpty(to)) { +// view.setItem(Alchemy.INGREDIENT_SLOT, from); +// view.setItem(fromSlot, null); +// +// return true; +// } else if (from.isSimilar(to)) { +// int fromAmount = from.getAmount(); +// int toAmount = to.getAmount(); +// int maxSize = to.getType().getMaxStackSize(); +// +// if (fromAmount + toAmount > maxSize) { +// int left = fromAmount + toAmount - maxSize; +// +// to.setAmount(maxSize); +// view.setItem(Alchemy.INGREDIENT_SLOT, to); +// +// from.setAmount(left); +// view.setItem(fromSlot, from); +// +// return true; +// } +// +// to.setAmount(fromAmount + toAmount); +// view.setItem(fromSlot, null); +// view.setItem(Alchemy.INGREDIENT_SLOT, to); +// +// return true; +// } +// +// return false; +// } +// +// public static void scheduleCheck(Player player, BrewingStand brewingStand) { +// new AlchemyBrewCheckTask(player, brewingStand).runTask(mcMMO.p); +// } +// +// public static void scheduleUpdate(Inventory inventory) { +// for (HumanEntity humanEntity : inventory.getViewers()) { +// if (humanEntity instanceof Player) { +// new PlayerUpdateInventoryTask((Player) humanEntity).runTask(mcMMO.p); +// } +// } +// } +//} diff --git a/src/main/java/com/gmail/nossr50/runnables/CheckDateTask.java b/src/main/java/com/gmail/nossr50/dumpster/CheckDateTask.java similarity index 100% rename from src/main/java/com/gmail/nossr50/runnables/CheckDateTask.java rename to src/main/java/com/gmail/nossr50/dumpster/CheckDateTask.java diff --git a/src/main/java/com/gmail/nossr50/util/HolidayManager.java b/src/main/java/com/gmail/nossr50/dumpster/HolidayManager.java similarity index 100% rename from src/main/java/com/gmail/nossr50/util/HolidayManager.java rename to src/main/java/com/gmail/nossr50/dumpster/HolidayManager.java diff --git a/src/main/java/com/gmail/nossr50/util/ModManager.java b/src/main/java/com/gmail/nossr50/dumpster/ModManager.java similarity index 100% rename from src/main/java/com/gmail/nossr50/util/ModManager.java rename to src/main/java/com/gmail/nossr50/dumpster/ModManager.java diff --git a/src/main/java/com/gmail/nossr50/dumpster/PotionGenerator.java b/src/main/java/com/gmail/nossr50/dumpster/PotionGenerator.java new file mode 100644 index 000000000..e7107a645 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/dumpster/PotionGenerator.java @@ -0,0 +1,740 @@ +//package com.gmail.nossr50.skills.alchemy; +// +//import com.gmail.nossr50.datatypes.skills.alchemy.AlchemyPotion; +//import com.gmail.nossr50.mcMMO; +//import org.bukkit.ChatColor; +//import org.bukkit.Color; +//import org.bukkit.Material; +//import org.bukkit.potion.PotionData; +//import org.bukkit.potion.PotionEffect; +//import org.bukkit.potion.PotionEffectType; +//import org.bukkit.potion.PotionType; +// +//import java.util.ArrayList; +//import java.util.HashMap; +//import java.util.List; +//import java.util.Map; +//import java.util.Map.Entry; +// +///** +// * This class is an abomination +// * Alchemy will be rewritten, unfortunately during 2.2 (the config rewrite) I stumbled upon this class +// * This class is far from proper, however due to the nature of how the current implementation of Alchemy works, it'd be a royal pain to rewrite this class to "fix" it +// * Especially considering I plan to rewrite Alchemy, it does not seem worth the time involved to fix this monster +// * +// * Shield your eyes +// * It was worse before I cleaned it up +// */ +//public class PotionGenerator { +// private HashMap potionHashMap; +//// private HashMap> childPotionMap; //Yuck +// +// public PotionGenerator() { +// potionHashMap = new HashMap<>(); +//// childPotionMap = new HashMap<>(); +// init(); +// } +// +// private void init() { +// Map> vanillaPotions = new HashMap<>(); +// Map> mcMMOPotions = new HashMap<>(); +// +// populateVanillaPotions(vanillaPotions); +// populateCustomPotions(mcMMOPotions); +// +// List sorted = new ArrayList<>(); +// +// sorted.addAll(vanillaPotions.keySet()); +// sorted.addAll(mcMMOPotions.keySet()); +// +// sorted.sort((a, b) -> { +// // All normal potions first +// if (a.mat == Material.POTION && b.mat != Material.POTION) { +// return -1; +// } +// if (b.mat == Material.POTION && a.mat != Material.POTION) { +// return 1; +// } +// // All splash potions second +// if (a.mat == Material.SPLASH_POTION && b.mat != Material.SPLASH_POTION) { +// return -1; +// } +// if (b.mat == Material.SPLASH_POTION && a.mat != Material.SPLASH_POTION) { +// return 1; +// } +// // Vanilla Potions first +// if (a.effect == null && b.effect != null) { +// return -1; +// } +// if (b.effect == null && a.effect != null) { +// return 1; +// } +// // Vanilla potions +// if (a.effect == null && b.effect == null) { +// // Order by PotionType +// if (a.data.getType() != b.data.getType()) { +// return Integer.compare(a.data.getType().ordinal(), b.data.getType().ordinal()); +// } +// // Plain before extended or upgraded +// if (!a.data.isExtended() && !a.data.isUpgraded() && (b.data.isExtended() || b.data.isUpgraded())) { +// return -1; +// } +// if (!b.data.isExtended() && !b.data.isUpgraded() && (a.data.isExtended() || a.data.isUpgraded())) { +// return 1; +// } +// // Extended before Upgraded +// if (a.data.isExtended() && b.data.isUpgraded()) { +// return -1; +// } +// if (b.data.isExtended() && a.data.isUpgraded()) { +// return -1; +// } +// // Same potion somehow? +// return 0; +// } +// // mcMMO Potions +// else { +// if ((a.baseName.contains("II") || a.baseName.contains("EXTENDED")) && !(b.baseName.contains("II") || b.baseName.contains("EXTENDED"))) { +// return 1; +// } +// if ((b.baseName.contains("II") || b.baseName.contains("EXTENDED")) && !(a.baseName.contains("II") || a.baseName.contains("EXTENDED"))) { +// return -1; +// } +// if (!a.baseName.contains("II") && b.baseName.contains("II")) { +// return -1; +// } +// if (!b.baseName.contains("II") && a.baseName.contains("II")) { +// return 1; +// } +// return a.baseName.split("_")[0].compareTo(b.baseName.split("_")[0]); +// } +// }); +// +// /* Hacky solution, this entire class disgusts me */ +// HashMap potionHashMap = new HashMap<>(); +// +// for(ProtoPotion potion : sorted) +// { +// AlchemyPotion alchemyPotion; +// +// if(vanillaPotions.containsKey(potion)) { +// potion getChildren(potion); +// +// } else { +// getChildren(potion); +// } +// potionHashMap.put(alchemyPotion.getName(), alchemyPotion); +// } +// +//// for (ProtoPotion potion : sorted) { +//// System.out.println(" " + potion.name + ":"); +//// Map children; +//// if (vanillaPotions.containsKey(potion)) { +//// children = vanillaPotions.get(potion); +//// } else { +//// System.out.println(" Name: " + prettify(potion.name)); +//// children = mcMMOPotions.get(potion); +//// } +//// System.out.println(" Material: " + potion.mat.name()); +//// System.out.println(" PotionData:"); +//// System.out.println(" PotionType: " + potion.data.getType().name()); +//// if (potion.data.isExtended()) { +//// System.out.println(" Extended: true"); +//// } +//// if (potion.data.isUpgraded()) { +//// System.out.println(" Upgraded: true"); +//// } +//// if (potion.effect != null) { +//// System.out.println(" Effects: [\"" + getName(potion.effect.getType()) + " " + potion.effect.getAmplifier() + " " + potion.effect.getDuration() + "\"]"); +//// } +//// if (children == null || children.isEmpty()) { +//// continue; +//// } +//// System.out.println(" Children:"); +//// for (Entry child : children.entrySet()) { +//// System.out.println(" " + child.getKey().name + ": " + child.getValue().name); +//// } +//// } +// } +// +// public HashMap getPotionHashMap() { +// return potionHashMap; +// } +// +// /** +// * I just want anyone who reads this to know +// * This entire class is an abomination +// * What you see below is a hacky solution to keep Alchemy functioning with the new config system +// * Alchemy will be rewritten, until then, this disgusting class exists. +// * @param protoPotion target ProtoPotion +// * @return converted ProtoPotion +// */ +// private AlchemyPotion convertWriteableToAlchemyPotion(ProtoPotion protoPotion, ) { +// try { +// +// String name = protoPotion.name; +// +// if (name != null) { +// name = prettify(ChatColor.translateAlternateColorCodes('&', name)); +// } +// +// PotionData data = protoPotion.data; +// Material material = Material.POTION; +// +// if(protoPotion.mat != null) +// material = protoPotion.mat; +// +// //Lore is unused as far as I can tell +// List lore = new ArrayList<>(); +// +// List effects = new ArrayList<>(); +// effects.add(protoPotion.effect); +// +// Color color = this.generateColor(effects); +// +// +// return new AlchemyPotion(material, data, name, lore, effects, color, getChildren(protoPotion)); +// } catch (Exception e) { +// mcMMO.p.getLogger().warning("Failed to load Alchemy potion: " + potion_section.getString()); +// return null; +// } +// } +// +// public Color generateColor(List effects) { +// if (effects != null && !effects.isEmpty()) { +// List colors = new ArrayList<>(); +// for (PotionEffect effect : effects) { +// if (effect.getType().getColor() != null) { +// colors.add(effect.getType().getColor()); +// } +// } +// if (!colors.isEmpty()) { +// if (colors.size() > 1) { +// return calculateAverageColor(colors); +// } +// return colors.get(0); +// } +// } +// return null; +// } +// +// public Color calculateAverageColor(List colors) { +// int red = 0; +// int green = 0; +// int blue = 0; +// for (Color color : colors) { +// red += color.getRed(); +// green += color.getGreen(); +// blue += color.getBlue(); +// } +// Color color = Color.fromRGB(red / colors.size(), green / colors.size(), blue / colors.size()); +// return color; +// } +// +// private static String prettify(String name) { +// String[] substrings = name.split("_"); +// String prettyString = ""; +// int size = 1; +// +// for (String string : substrings) { +// prettyString = prettyString.concat(getCapitalized(string)); +// +// if (size < substrings.length) { +// prettyString = prettyString.concat(" "); +// } +// +// size++; +// } +// +// return prettyString; +// } +// +// public static String getCapitalized(String target) { +// if (target.equals("II")) { // hacks +// return target; +// } +// return target.substring(0, 1).toUpperCase() + target.substring(1).toLowerCase(); +// } +// +// private static String getName(PotionEffectType type) { +// switch (type.getId()) { +// case 1: +// return "SPEED"; +// case 2: +// return "SLOW"; +// case 3: +// return "FAST_DIGGING"; +// case 4: +// return "SLOW_DIGGING"; +// case 5: +// return "INCREASE_DAMAGE"; +// case 6: +// return "HEAL"; +// case 7: +// return "HARM"; +// case 8: +// return "JUMP"; +// case 9: +// return "CONFUSION"; +// case 10: +// return "REGENERATION"; +// case 11: +// return "DAMAGE_RESISTANCE"; +// case 12: +// return "FIRE_RESISTANCE"; +// case 13: +// return "WATER_BREATHING"; +// case 14: +// return "INVISIBILITY"; +// case 15: +// return "BLINDNESS"; +// case 16: +// return "NIGHT_VISION"; +// case 17: +// return "HUNGER"; +// case 18: +// return "WEAKNESS"; +// case 19: +// return "POISON"; +// case 20: +// return "WITHER"; +// case 21: +// return "HEALTH_BOOST"; +// case 22: +// return "ABSORPTION"; +// case 23: +// return "SATURATION"; +// case 24: +// return "GLOWING"; +// case 25: +// return "LEVITATION"; +// case 26: +// return "LUCK"; +// case 27: +// return "UNLUCK"; +// case 28: +// return "SLOW_FALLING"; +// case 29: +// return "CONDUIT_POWER"; +// case 30: +// return "DOLPHINS_GRACE"; +// default: +// return "UNKNOWN_EFFECT_TYPE_" + type.getId(); +// } +// } +// +// private void populateVanillaPotions(Map> vanillaPotions) { +// for (PotionType type : PotionType.values()) { +// for (Material material : new Material[]{Material.POTION, Material.SPLASH_POTION, Material.LINGERING_POTION}) { +// ProtoPotion protoPotion = new ProtoPotion(material, type); +// getChildren(protoPotion); +// vanillaPotions.put(protoPotion, getChildren(protoPotion)); +// if (type.isExtendable()) { +// protoPotion = new ProtoPotion(material, new PotionData(type, true, false)); +// vanillaPotions.put(protoPotion, getChildren(protoPotion)); +// } +// if (type.isUpgradeable()) { +// protoPotion = new ProtoPotion(material, new PotionData(type, false, true)); +// vanillaPotions.put(protoPotion, getChildren(protoPotion)); +// } +// } +// } +// for (Entry> entry : vanillaPotions.entrySet()) { +// if (entry.getKey().mat == Material.POTION) { +// entry.getValue().put(new Ingredient(Material.GUNPOWDER), new ProtoPotion(Material.SPLASH_POTION, entry.getKey().data)); +// } +// if (entry.getKey().mat == Material.SPLASH_POTION) { +// entry.getValue().put(new Ingredient(Material.DRAGON_BREATH), new ProtoPotion(Material.LINGERING_POTION, entry.getKey().data)); +// } +// } +// +// //Store children +// } +// +// private HashMap getChildren(ProtoPotion protoPotion) { +// HashMap children = new HashMap<>(); +// +// switch (protoPotion.data.getType()) { +// case WATER: +// assert (!protoPotion.data.isExtended()); +// assert (!protoPotion.data.isUpgraded()); +// children.put(new Ingredient(Material.NETHER_WART), new ProtoPotion(protoPotion.mat, PotionType.AWKWARD)); +// children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new ProtoPotion(protoPotion.mat, PotionType.WEAKNESS)); +// children.put(new Ingredient(Material.REDSTONE), new ProtoPotion(protoPotion.mat, PotionType.MUNDANE)); +// children.put(new Ingredient(Material.GLOWSTONE_DUST), new ProtoPotion(protoPotion.mat, PotionType.THICK)); +// children.put(new Ingredient(Material.BLAZE_POWDER), new ProtoPotion(protoPotion.mat, PotionType.MUNDANE)); +// children.put(new Ingredient(Material.SUGAR), new ProtoPotion(protoPotion.mat, PotionType.MUNDANE)); +// children.put(new Ingredient(Material.RABBIT_FOOT), new ProtoPotion(protoPotion.mat, PotionType.MUNDANE)); +// children.put(new Ingredient(Material.SPIDER_EYE), new ProtoPotion(protoPotion.mat, PotionType.MUNDANE)); +// children.put(new Ingredient(Material.MAGMA_CREAM), new ProtoPotion(protoPotion.mat, PotionType.MUNDANE)); +// children.put(new Ingredient(Material.GLISTERING_MELON_SLICE), new ProtoPotion(protoPotion.mat, PotionType.MUNDANE)); +// children.put(new Ingredient(Material.GHAST_TEAR), new ProtoPotion(protoPotion.mat, PotionType.MUNDANE)); +// return children; +// case AWKWARD: +// assert (!protoPotion.data.isExtended()); +// assert (!protoPotion.data.isUpgraded()); +// children.put(new Ingredient(Material.GOLDEN_CARROT), new ProtoPotion(protoPotion.mat, PotionType.NIGHT_VISION)); +// children.put(new Ingredient(Material.RABBIT_FOOT), new ProtoPotion(protoPotion.mat, PotionType.JUMP)); +// children.put(new Ingredient(Material.MAGMA_CREAM), new ProtoPotion(protoPotion.mat, PotionType.FIRE_RESISTANCE)); +// children.put(new Ingredient(Material.SUGAR), new ProtoPotion(protoPotion.mat, PotionType.SPEED)); +// children.put(new Ingredient(Material.PUFFERFISH), new ProtoPotion(protoPotion.mat, PotionType.WATER_BREATHING)); +// children.put(new Ingredient(Material.GLISTERING_MELON_SLICE), new ProtoPotion(protoPotion.mat, PotionType.INSTANT_HEAL)); +// children.put(new Ingredient(Material.SPIDER_EYE), new ProtoPotion(protoPotion.mat, PotionType.POISON)); +// children.put(new Ingredient(Material.GHAST_TEAR), new ProtoPotion(protoPotion.mat, PotionType.REGEN)); +// children.put(new Ingredient(Material.BLAZE_POWDER), new ProtoPotion(protoPotion.mat, PotionType.STRENGTH)); +// children.put(new Ingredient(Material.TURTLE_HELMET), new ProtoPotion(protoPotion.mat, PotionType.TURTLE_MASTER)); +// children.put(new Ingredient(Material.PHANTOM_MEMBRANE), new ProtoPotion(protoPotion.mat, PotionType.SLOW_FALLING)); +// // mcMMO custom potions +// double mod = 1; +// if (protoPotion.mat == Material.SPLASH_POTION) { +// mod = 0.75; +// } +// if (protoPotion.mat == Material.LINGERING_POTION) { +// mod = 0.25; +// } +// children.put(new Ingredient(Material.BROWN_MUSHROOM), new ProtoPotion(protoPotion.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.CONFUSION, (int) (450 * mod), 0), "NAUSEA")); +// children.put(new Ingredient(Material.CARROT), new ProtoPotion(protoPotion.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.FAST_DIGGING, (int) (3600 * mod), 0), "HASTE")); +// children.put(new Ingredient(Material.SLIME_BALL), new ProtoPotion(protoPotion.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.SLOW_DIGGING, (int) (3600 * mod), 0), "DULLNESS")); +// children.put(new Ingredient(Material.GOLDEN_APPLE), new ProtoPotion(protoPotion.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, (int) (450 * mod), 0), "RESISTANCE")); +// children.put(new Ingredient(Material.INK_SAC), new ProtoPotion(protoPotion.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.BLINDNESS, (int) (225 * mod), 0), "BLINDNESS")); +// children.put(new Ingredient(Material.ROTTEN_FLESH), new ProtoPotion(protoPotion.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.HUNGER, (int) (900 * mod), 0), "HUNGER")); +// children.put(new Ingredient(Material.POISONOUS_POTATO), new ProtoPotion(protoPotion.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.WITHER, (int) (450 * mod), 0), "DECAY")); +// children.put(new Ingredient(Material.QUARTZ), new ProtoPotion(protoPotion.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.ABSORPTION, (int) (1800 * mod), 0), "ABSORPTION")); +// children.put(new Ingredient(Material.FERN), new ProtoPotion(protoPotion.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.SATURATION, (int) (8 * mod), 0), "SATURATION")); +// children.put(new Ingredient(Material.APPLE), new ProtoPotion(protoPotion.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.HEALTH_BOOST, (int) (1800 * mod), 0), "HEALTH_BOOST")); +// return children; +// case FIRE_RESISTANCE: +// assert (!protoPotion.data.isUpgraded()); +// if (protoPotion.data.isExtended()) { +// children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new ProtoPotion(protoPotion.mat, new PotionData(PotionType.SLOWNESS, true, false))); +// } else { +// children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new ProtoPotion(protoPotion.mat, PotionType.SLOWNESS)); +// children.put(new Ingredient(Material.REDSTONE), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), true, false))); +// } +// return children; +// case INSTANT_DAMAGE: +// assert (!protoPotion.data.isExtended()); +// if (!protoPotion.data.isUpgraded()) { +// children.put(new Ingredient(Material.GLOWSTONE_DUST), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), false, true))); +// } +// return children; +// case INSTANT_HEAL: +// assert (!protoPotion.data.isExtended()); +// if (!protoPotion.data.isUpgraded()) { +// children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new ProtoPotion(protoPotion.mat, PotionType.INSTANT_DAMAGE)); +// children.put(new Ingredient(Material.GLOWSTONE_DUST), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), false, true))); +// } else { +// children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new ProtoPotion(protoPotion.mat, new PotionData(PotionType.INSTANT_DAMAGE, false, true))); +// } +// return children; +// case INVISIBILITY: +// assert (!protoPotion.data.isUpgraded()); +// if (!protoPotion.data.isExtended()) { +// children.put(new Ingredient(Material.REDSTONE), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), true, false))); +// } +// return children; +// case JUMP: +// if (!protoPotion.data.isUpgraded() && !protoPotion.data.isExtended()) { +// children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new ProtoPotion(protoPotion.mat, PotionType.SLOWNESS)); +// children.put(new Ingredient(Material.GLOWSTONE_DUST), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), false, true))); +// children.put(new Ingredient(Material.REDSTONE), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), true, false))); +// } +// return children; +// case NIGHT_VISION: +// assert (!protoPotion.data.isUpgraded()); +// if (!protoPotion.data.isExtended()) { +// children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new ProtoPotion(protoPotion.mat, PotionType.INVISIBILITY)); +// children.put(new Ingredient(Material.REDSTONE), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), true, false))); +// } else { +// children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new ProtoPotion(protoPotion.mat, new PotionData(PotionType.INVISIBILITY, true, false))); +// } +// return children; +// case POISON: +// if (!protoPotion.data.isUpgraded() && !protoPotion.data.isExtended()) { +// children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new ProtoPotion(protoPotion.mat, PotionType.INSTANT_DAMAGE)); +// children.put(new Ingredient(Material.GLOWSTONE_DUST), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), false, true))); +// children.put(new Ingredient(Material.REDSTONE), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), true, false))); +// } else { +// children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new ProtoPotion(protoPotion.mat, new PotionData(PotionType.INSTANT_DAMAGE, false, true))); +// } +// return children; +// case REGEN: +// if (!protoPotion.data.isUpgraded() && !protoPotion.data.isExtended()) { +// children.put(new Ingredient(Material.GLOWSTONE_DUST), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), false, true))); +// children.put(new Ingredient(Material.REDSTONE), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), true, false))); +// } +// return children; +// case SLOWNESS: +// assert (!protoPotion.data.isUpgraded()); +// if (!protoPotion.data.isExtended()) { +// children.put(new Ingredient(Material.REDSTONE), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), true, false))); +// } +// return children; +// case SLOW_FALLING: +// assert (!protoPotion.data.isUpgraded()); +// if (!protoPotion.data.isExtended()) { +// children.put(new Ingredient(Material.REDSTONE), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), true, false))); +// } +// return children; +// case SPEED: +// if (!protoPotion.data.isUpgraded() && !protoPotion.data.isExtended()) { +// children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new ProtoPotion(protoPotion.mat, PotionType.SLOWNESS)); +// children.put(new Ingredient(Material.GLOWSTONE_DUST), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), false, true))); +// children.put(new Ingredient(Material.REDSTONE), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), true, false))); +// } else { +// children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new ProtoPotion(protoPotion.mat, new PotionData(PotionType.SLOWNESS, true, false))); +// } +// return children; +// case STRENGTH: +// if (!protoPotion.data.isUpgraded() && !protoPotion.data.isExtended()) { +// children.put(new Ingredient(Material.GLOWSTONE_DUST), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), false, true))); +// children.put(new Ingredient(Material.REDSTONE), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), true, false))); +// } +// return children; +// case TURTLE_MASTER: +// if (!protoPotion.data.isUpgraded() && !protoPotion.data.isExtended()) { +// children.put(new Ingredient(Material.GLOWSTONE_DUST), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), false, true))); +// children.put(new Ingredient(Material.REDSTONE), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), true, false))); +// } +// return children; +// case WATER_BREATHING: +// assert (!protoPotion.data.isUpgraded()); +// if (!protoPotion.data.isExtended()) { +// children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new ProtoPotion(protoPotion.mat, PotionType.INSTANT_DAMAGE)); +// children.put(new Ingredient(Material.REDSTONE), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), true, false))); +// } +// return children; +// case WEAKNESS: +// assert (!protoPotion.data.isUpgraded()); +// if (!protoPotion.data.isExtended()) { +// children.put(new Ingredient(Material.REDSTONE), new ProtoPotion(protoPotion.mat, new PotionData(protoPotion.data.getType(), true, false))); +// } +// return children; +// case LUCK: +// case MUNDANE: +// case THICK: +// case UNCRAFTABLE: +// assert (!protoPotion.data.isExtended()); +// assert (!protoPotion.data.isUpgraded()); +// return children; +// default: +// return children; +// } +// } +// +// private static void populateCustomPotions(Map> customPotions) { +// for (Material material : new Material[]{Material.POTION, Material.SPLASH_POTION, Material.LINGERING_POTION}) { +// ProtoPotion newPotion; +// double mod = 1; +// if (material == Material.SPLASH_POTION) { +// mod = 0.75; +// } +// if (material == Material.LINGERING_POTION) { +// mod = 0.25; +// } +// HashMap newPotionChildren; +// newPotion = new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.CONFUSION, (int) (450 * mod), 0), "NAUSEA"); +// newPotionChildren = new HashMap<>(); +// newPotionChildren.put(new Ingredient(Material.GLOWSTONE_DUST), new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(newPotion.effect.getType(), newPotion.effect.getDuration() / 2, 1), newPotion.baseName + "_II")); +// newPotionChildren.put(new Ingredient(Material.REDSTONE), new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(newPotion.effect.getType(), newPotion.effect.getDuration() * 2, 0), newPotion.baseName + "_EXTENDED")); +// for (ProtoPotion child : newPotionChildren.values()) { +// customPotions.put(child, new HashMap<>()); +// } +// customPotions.put(newPotion, newPotionChildren); +// newPotion = new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.FAST_DIGGING, (int) (3600 * mod), 0), "HASTE"); +// newPotionChildren = new HashMap<>(); +// newPotionChildren.put(new Ingredient(Material.GLOWSTONE_DUST), new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(newPotion.effect.getType(), newPotion.effect.getDuration() / 2, 1), newPotion.baseName + "_II")); +// newPotionChildren.put(new Ingredient(Material.REDSTONE), new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(newPotion.effect.getType(), newPotion.effect.getDuration() * 2, 0), newPotion.baseName + "_EXTENDED")); +// for (ProtoPotion child : newPotionChildren.values()) { +// customPotions.put(child, new HashMap<>()); +// } +// customPotions.put(newPotion, newPotionChildren); +// newPotion = new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.SLOW_DIGGING, (int) (3600 * mod), 0), "DULLNESS"); +// newPotionChildren = new HashMap<>(); +// newPotionChildren.put(new Ingredient(Material.GLOWSTONE_DUST), new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(newPotion.effect.getType(), newPotion.effect.getDuration() / 2, 1), newPotion.baseName + "_II")); +// newPotionChildren.put(new Ingredient(Material.REDSTONE), new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(newPotion.effect.getType(), newPotion.effect.getDuration() * 2, 0), newPotion.baseName + "_EXTENDED")); +// for (ProtoPotion child : newPotionChildren.values()) { +// customPotions.put(child, new HashMap<>()); +// } +// customPotions.put(newPotion, newPotionChildren); +// newPotion = new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, (int) (450 * mod), 0), "RESISTANCE"); +// newPotionChildren = new HashMap<>(); +// newPotionChildren.put(new Ingredient(Material.GLOWSTONE_DUST), new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(newPotion.effect.getType(), newPotion.effect.getDuration() / 2, 1), newPotion.baseName + "_II")); +// newPotionChildren.put(new Ingredient(Material.REDSTONE), new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(newPotion.effect.getType(), newPotion.effect.getDuration() * 2, 0), newPotion.baseName + "_EXTENDED")); +// for (ProtoPotion child : newPotionChildren.values()) { +// customPotions.put(child, new HashMap<>()); +// } +// customPotions.put(newPotion, newPotionChildren); +// newPotion = new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.BLINDNESS, (int) (225 * mod), 0), "BLINDNESS"); +// newPotionChildren = new HashMap<>(); +// newPotionChildren.put(new Ingredient(Material.GLOWSTONE_DUST), new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(newPotion.effect.getType(), newPotion.effect.getDuration() / 2, 1), newPotion.baseName + "_II")); +// newPotionChildren.put(new Ingredient(Material.REDSTONE), new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(newPotion.effect.getType(), newPotion.effect.getDuration() * 2, 0), newPotion.baseName + "_EXTENDED")); +// for (ProtoPotion child : newPotionChildren.values()) { +// customPotions.put(child, new HashMap<>()); +// } +// customPotions.put(newPotion, newPotionChildren); +// newPotion = new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.HUNGER, (int) (900 * mod), 0), "HUNGER"); +// newPotionChildren = new HashMap<>(); +// newPotionChildren.put(new Ingredient(Material.GLOWSTONE_DUST), new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(newPotion.effect.getType(), newPotion.effect.getDuration() / 2, 1), newPotion.baseName + "_II")); +// newPotionChildren.put(new Ingredient(Material.REDSTONE), new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(newPotion.effect.getType(), newPotion.effect.getDuration() * 2, 0), newPotion.baseName + "_EXTENDED")); +// for (ProtoPotion child : newPotionChildren.values()) { +// customPotions.put(child, new HashMap<>()); +// } +// customPotions.put(newPotion, newPotionChildren); +// newPotion = new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.WITHER, (int) (450 * mod), 0), "DECAY"); +// newPotionChildren = new HashMap<>(); +// newPotionChildren.put(new Ingredient(Material.GLOWSTONE_DUST), new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(newPotion.effect.getType(), newPotion.effect.getDuration() / 2, 1), newPotion.baseName + "_II")); +// newPotionChildren.put(new Ingredient(Material.REDSTONE), new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(newPotion.effect.getType(), newPotion.effect.getDuration() * 2, 0), newPotion.baseName + "_EXTENDED")); +// for (ProtoPotion child : newPotionChildren.values()) { +// customPotions.put(child, new HashMap<>()); +// } +// customPotions.put(newPotion, newPotionChildren); +// newPotion = new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.ABSORPTION, (int) (1800 * mod), 0), "ABSORPTION"); +// newPotionChildren = new HashMap<>(); +// newPotionChildren.put(new Ingredient(Material.GLOWSTONE_DUST), new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(newPotion.effect.getType(), newPotion.effect.getDuration() / 2, 1), newPotion.baseName + "_II")); +// newPotionChildren.put(new Ingredient(Material.REDSTONE), new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(newPotion.effect.getType(), newPotion.effect.getDuration() * 2, 0), newPotion.baseName + "_EXTENDED")); +// for (ProtoPotion child : newPotionChildren.values()) { +// customPotions.put(child, new HashMap<>()); +// } +// customPotions.put(newPotion, newPotionChildren); +// newPotion = new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.SATURATION, (int) (8 * mod), 0), "SATURATION"); +// newPotionChildren = new HashMap<>(); +// newPotionChildren.put(new Ingredient(Material.GLOWSTONE_DUST), new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(newPotion.effect.getType(), newPotion.effect.getDuration() / 2, 1), newPotion.baseName + "_II")); +// newPotionChildren.put(new Ingredient(Material.REDSTONE), new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(newPotion.effect.getType(), newPotion.effect.getDuration() * 2, 0), newPotion.baseName + "_EXTENDED")); +// for (ProtoPotion child : newPotionChildren.values()) { +// customPotions.put(child, new HashMap<>()); +// } +// customPotions.put(newPotion, newPotionChildren); +// newPotion = new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.HEALTH_BOOST, (int) (1800 * mod), 0), "HEALTH_BOOST"); +// newPotionChildren = new HashMap<>(); +// newPotionChildren.put(new Ingredient(Material.GLOWSTONE_DUST), new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(newPotion.effect.getType(), newPotion.effect.getDuration() / 2, 1), newPotion.baseName + "_II")); +// newPotionChildren.put(new Ingredient(Material.REDSTONE), new ProtoPotion(material, PotionType.UNCRAFTABLE, new PotionEffect(newPotion.effect.getType(), newPotion.effect.getDuration() * 2, 0), newPotion.baseName + "_EXTENDED")); +// for (ProtoPotion child : newPotionChildren.values()) { +// customPotions.put(child, new HashMap<>()); +// } +// customPotions.put(newPotion, newPotionChildren); +// } +// +// // Add all material state changes +// for (Entry> entry : customPotions.entrySet()) { +// if (entry.getKey().mat == Material.POTION) { +// PotionEffect effect = new PotionEffect(entry.getKey().effect.getType(), (int) (entry.getKey().effect.getDuration() * 0.75), entry.getKey().effect.getAmplifier()); +// entry.getValue().put(new Ingredient(Material.GUNPOWDER), new ProtoPotion(Material.SPLASH_POTION, entry.getKey().data, effect, entry.getKey().baseName)); +// } else if (entry.getKey().mat == Material.SPLASH_POTION) { +// PotionEffect effect = new PotionEffect(entry.getKey().effect.getType(), (int) (entry.getKey().effect.getDuration() * 0.33), entry.getKey().effect.getAmplifier()); +// entry.getValue().put(new Ingredient(Material.DRAGON_BREATH), new ProtoPotion(Material.LINGERING_POTION, entry.getKey().data, effect, entry.getKey().baseName)); +// } +// } +// } +// +// public static class Ingredient { +// +// public Material mat; +// public int data; +// public String name; +// +// public Ingredient(Material mat) { +// this.mat = mat; +// this.data = 0; +// name = mat.name(); +// } +// +// } +// +// public static class ProtoPotion { +// +// public String name; +// public Material mat; +// public PotionData data; +// public PotionEffect effect; +// public String baseName; +// +// public ProtoPotion(PotionData data) { +// this(Material.POTION, data); +// } +// +// public ProtoPotion(Material type, PotionData data) { +// this(type, data, null, getMCName(data.getType())); +// } +// +// public ProtoPotion(Material mat, PotionType type, PotionEffect effect, String baseName) { +// this(mat, new PotionData(type, false, false), effect, baseName); +// } +// +// public ProtoPotion(Material type, PotionData data, PotionEffect effect, String baseName) { +// this.data = data; +// this.effect = effect; +// this.mat = type; +// this.baseName = baseName; +// this.name = "POTION_OF_" + baseName; +// if (mat == Material.SPLASH_POTION) { +// this.name = "SPLASH_" + this.name; +// } +// if (mat == Material.LINGERING_POTION) { +// this.name = "LINGERING_" + this.name; +// } +// if (data.isExtended()) { +// this.name += "_EXTENDED"; +// } +// if (data.isUpgraded()) { +// this.name += "_II"; +// } +// } +// +// public ProtoPotion(PotionType type) { +// this(new PotionData(type, false, false)); +// } +// +// public ProtoPotion(Material mat, PotionType type) { +// this(mat, new PotionData(type, false, false)); +// } +// +// private static String getMCName(PotionType type) { +// switch (type) { +// case INSTANT_DAMAGE: +// return "HARMING"; +// case INSTANT_HEAL: +// return "HEALING"; +// case JUMP: +// return "LEAPING"; +// case REGEN: +// return "REGENERATION"; +// case SPEED: +// return "SWIFTNESS"; +// case UNCRAFTABLE: +// return "EMPTY"; +// case LUCK: +// case MUNDANE: +// case NIGHT_VISION: +// case POISON: +// case INVISIBILITY: +// case SLOWNESS: +// case AWKWARD: +// case STRENGTH: +// case THICK: +// case FIRE_RESISTANCE: +// case WATER: +// case WATER_BREATHING: +// case WEAKNESS: +// case TURTLE_MASTER: +// case SLOW_FALLING: +// return type.name(); +// default: +// return ""; +// } +// } +// +// public int hashCode() { +// return name.hashCode(); +// } +// +// public boolean equals(Object obj) { +// if (!(obj instanceof ProtoPotion)) { +// return false; +// } +// return name.equals(((ProtoPotion) obj).name); +// } +// +// public void setChildren() +// } +//} diff --git a/src/main/java/com/gmail/nossr50/dumpster/PotionManager.java b/src/main/java/com/gmail/nossr50/dumpster/PotionManager.java new file mode 100644 index 000000000..a7b64f9ed --- /dev/null +++ b/src/main/java/com/gmail/nossr50/dumpster/PotionManager.java @@ -0,0 +1,170 @@ +//package com.gmail.nossr50.config; +// +//import com.gmail.nossr50.datatypes.skills.alchemy.AlchemyPotion; +//import com.gmail.nossr50.skills.alchemy.PotionGenerator; +//import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; +//import org.bukkit.Material; +//import org.bukkit.inventory.ItemStack; +// +//import java.util.ArrayList; +//import java.util.HashMap; +//import java.util.List; +//import java.util.Map; +// +///** +// * Eventually I'm going to delete all of our Alchemy code and rewrite it from scratch +// */ +//@ConfigSerializable +//public class PotionManager { +// +// /* CONSTANTS */ +// public static final String POTIONS = "Potions"; +// +// /* INGREDIENTS */ +// private List ingredientTierOne; +// private List ingredientTierTwo; +// private List ingredientTierThree; +// private List ingredientTierFour; +// private List ingredientTierFive; +// private List ingredientTierSix; +// private List ingredientTierSeven; +// private List ingredientTierEight; +// +// private Map potionMap = new HashMap<>(); +// +// public PotionManager() { +// initIngredientLists(); +// initPotionMap(); +// } +// +// /** +// * I just want anyone who reads this to know +// * This entire class is an abomination +// * What you see below is a hacky solution to keep Alchemy functioning with the new config system +// * Alchemy will be rewritten, until then, this disgusting class exists. +// */ +// private void initIngredientLists() { +// ingredientTierOne = new ArrayList<>(); +// ingredientTierTwo = new ArrayList<>(); +// ingredientTierThree = new ArrayList<>(); +// ingredientTierFour = new ArrayList<>(); +// ingredientTierFive = new ArrayList<>(); +// ingredientTierSix = new ArrayList<>(); +// ingredientTierSeven = new ArrayList<>(); +// ingredientTierEight = new ArrayList<>(); +// +// ingredientTierOne.add(new ItemStack(Material.BLAZE_POWDER)); +// ingredientTierOne.add(new ItemStack(Material.FERMENTED_SPIDER_EYE)); +// ingredientTierOne.add(new ItemStack(Material.GHAST_TEAR)); +// ingredientTierOne.add(new ItemStack(Material.GLOWSTONE_DUST)); +// ingredientTierOne.add(new ItemStack(Material.GOLDEN_CARROT)); +// ingredientTierOne.add(new ItemStack(Material.MAGMA_CREAM)); +// ingredientTierOne.add(new ItemStack(Material.NETHER_WART)); +// ingredientTierOne.add(new ItemStack(Material.REDSTONE)); +// ingredientTierOne.add(new ItemStack(Material.GLISTERING_MELON_SLICE)); +// ingredientTierOne.add(new ItemStack(Material.SPIDER_EYE)); +// ingredientTierOne.add(new ItemStack(Material.SUGAR)); +// ingredientTierOne.add(new ItemStack(Material.GUNPOWDER)); +// ingredientTierOne.add(new ItemStack(Material.PUFFERFISH)); +// ingredientTierOne.add(new ItemStack(Material.DRAGON_BREATH)); +// +// ingredientTierTwo.add(new ItemStack(Material.CARROT)); +// ingredientTierTwo.add(new ItemStack(Material.SLIME_BALL)); +// ingredientTierTwo.add(new ItemStack(Material.PHANTOM_MEMBRANE)); +// +// ingredientTierThree.add(new ItemStack(Material.QUARTZ)); +// ingredientTierThree.add(new ItemStack(Material.RED_MUSHROOM)); +// +// ingredientTierFour.add(new ItemStack(Material.APPLE)); +// ingredientTierFour.add(new ItemStack(Material.ROTTEN_FLESH)); +// +// ingredientTierFive.add(new ItemStack(Material.BROWN_MUSHROOM)); +// ingredientTierFive.add(new ItemStack(Material.INK_SAC)); +// +// ingredientTierSix.add(new ItemStack(Material.FERN)); +// +// ingredientTierSeven.add(new ItemStack(Material.POISONOUS_POTATO)); +// +// ingredientTierEight.add(new ItemStack(Material.GOLDEN_APPLE)); +// } +// +// private void loadConcoctionsTier(List ingredientList, List ingredients) { +// if (ingredients != null && ingredients.size() > 0) { +// for (String ingredientString : ingredients) { +// ItemStack ingredient = loadIngredient(ingredientString); +// +// if (ingredient != null) { +// ingredientList.add(ingredient); +// } +// } +// } +// } +// +// private void initPotionMap() { +// PotionGenerator potionGenerator = new PotionGenerator(); +// potionMap = potionMap +// } +// +// /** +// * Parse a string representation of an ingredient. +// * Format: '<MATERIAL>[:data]' +// * Returns null if input cannot be parsed. +// * +// * @param ingredient String representing an ingredient. +// * @return Parsed ingredient. +// */ +// private ItemStack loadIngredient(String ingredient) { +// if (ingredient == null || ingredient.isEmpty()) { +// return null; +// } +// +// Material material = Material.getMaterial(ingredient); +// +// if (material != null) { +// return new ItemStack(material, 1); +// } +// +// return null; +// } +// +// public List getIngredients(int tier) { +// switch (tier) { +// case 8: +// return ingredientTierEight; +// case 7: +// return ingredientTierSeven; +// case 6: +// return ingredientTierSix; +// case 5: +// return ingredientTierFive; +// case 4: +// return ingredientTierFour; +// case 3: +// return ingredientTierThree; +// case 2: +// return ingredientTierTwo; +// case 1: +// default: +// return ingredientTierOne; +// } +// } +// +// public boolean isValidPotion(ItemStack item) { +// return getPotion(item) != null; +// } +// +// public AlchemyPotion getPotion(String name) { +// return potionMap.get(name); +// } +// +// public AlchemyPotion getPotion(ItemStack item) { +// for (AlchemyPotion potion : potionMap.values()) { +// if (potion.isSimilar(item)) { +// return potion; +// } +// } +// return null; +// } +// +// +//} diff --git a/src/main/java/com/gmail/nossr50/dumpster/PotionStage.java b/src/main/java/com/gmail/nossr50/dumpster/PotionStage.java new file mode 100644 index 000000000..44626dc0e --- /dev/null +++ b/src/main/java/com/gmail/nossr50/dumpster/PotionStage.java @@ -0,0 +1,86 @@ +//package com.gmail.nossr50.datatypes.skills.alchemy; +// +//import org.bukkit.Material; +//import org.bukkit.potion.PotionData; +//import org.bukkit.potion.PotionEffect; +//import org.bukkit.potion.PotionType; +// +//import java.util.List; +// +//public enum PotionStage { +// FIVE(5), +// FOUR(4), +// THREE(3), +// TWO(2), +// ONE(1); +// +// int numerical; +// +// PotionStage(int numerical) { +// this.numerical = 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 (!isWaterBottle(input) && getPotionStage(input) == potionStage) { +// potionStage = PotionStage.FIVE; +// } +// +// return potionStage; +// } +// +// private static boolean isWaterBottle(AlchemyPotion input) { +// return input.getData().getType() == PotionType.WATER; +// } +// +// public static PotionStage getPotionStage(AlchemyPotion alchemyPotion) { +// PotionData data = alchemyPotion.getData(); +// List effects = alchemyPotion.getEffects(); +// +// int stage = 1; +// +// // Check if potion has an effect of any sort +// if (data.getType().getEffectType() != null || !effects.isEmpty()) { +// stage++; +// } +// +// // Check if potion has a glowstone dust amplifier +// // Else check if the potion has a custom effect with an amplifier added by mcMMO +// if (data.isUpgraded()) { +// stage++; +// } else if (!effects.isEmpty()) { +// for (PotionEffect effect : effects) { +// if (effect.getAmplifier() > 0) { +// stage++; +// break; +// } +// } +// } +// +// // Check if potion has a redstone dust amplifier +// if (data.isExtended()) { +// stage++; +// } +// +// // Check if potion has a gunpowder amplifier +// if (alchemyPotion.getMaterial() == Material.SPLASH_POTION || alchemyPotion.getMaterial() == Material.LINGERING_POTION) { +// stage++; +// } +// +// return PotionStage.getPotionStageNumerical(stage); +// } +// +// public int toNumerical() { +// return numerical; +// } +//} diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 38f0fffc7..4798c2fc7 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -11,7 +11,6 @@ import com.gmail.nossr50.datatypes.skills.ToolType; import com.gmail.nossr50.events.fake.FakeBlockBreakEvent; import com.gmail.nossr50.events.fake.FakeBlockDamageEvent; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.skills.alchemy.Alchemy; import com.gmail.nossr50.skills.excavation.ExcavationManager; import com.gmail.nossr50.skills.herbalism.Herbalism; import com.gmail.nossr50.skills.herbalism.HerbalismManager; @@ -33,7 +32,10 @@ import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Tag; -import org.bukkit.block.*; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.BlockState; +import org.bukkit.block.Furnace; import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -254,9 +256,9 @@ public class BlockListener implements Listener { } /* ALCHEMY - Cancel any brew in progress for that BrewingStand */ - if (blockState instanceof BrewingStand && Alchemy.brewingStandMap.containsKey(location)) { - Alchemy.brewingStandMap.get(location).cancelBrew(); - } +// if (blockState instanceof BrewingStand && Alchemy.brewingStandMap.containsKey(location)) { +// Alchemy.brewingStandMap.get(location).cancelBrew(); +// } Player player = event.getPlayer(); diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index dbc501c3c..f8aaa3121 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -4,18 +4,14 @@ import com.gmail.nossr50.config.MainConfig; import com.gmail.nossr50.config.WorldBlacklist; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; -import com.gmail.nossr50.events.fake.FakeBrewEvent; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.runnables.player.PlayerUpdateInventoryTask; -import com.gmail.nossr50.skills.alchemy.Alchemy; -import com.gmail.nossr50.skills.alchemy.AlchemyPotionBrewer; import com.gmail.nossr50.util.ItemUtils; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.worldguard.WorldGuardManager; import com.gmail.nossr50.worldguard.WorldGuardUtils; -import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockState; @@ -237,78 +233,78 @@ public class InventoryListener implements Listener { return; } - BrewingStand stand = (BrewingStand) holder; - ItemStack clicked = event.getCurrentItem(); - ItemStack cursor = event.getCursor(); +// BrewingStand stand = (BrewingStand) holder; +// ItemStack clicked = event.getCurrentItem(); +// ItemStack cursor = event.getCursor(); - if ((clicked != null && (clicked.getType() == Material.POTION || clicked.getType() == Material.SPLASH_POTION || clicked.getType() == Material.LINGERING_POTION)) || (cursor != null && (cursor.getType() == Material.POTION || cursor.getType() == Material.SPLASH_POTION || cursor.getType() == Material.LINGERING_POTION))) { - AlchemyPotionBrewer.scheduleCheck(player, stand); - return; - } +// if ((clicked != null && (clicked.getType() == Material.POTION || clicked.getType() == Material.SPLASH_POTION || clicked.getType() == Material.LINGERING_POTION)) || (cursor != null && (cursor.getType() == Material.POTION || cursor.getType() == Material.SPLASH_POTION || cursor.getType() == Material.LINGERING_POTION))) { +// AlchemyPotionBrewer.scheduleCheck(player, stand); +// return; +// } +// +// ClickType click = event.getClick(); +// InventoryType.SlotType slot = event.getSlotType(); - ClickType click = event.getClick(); - InventoryType.SlotType slot = event.getSlotType(); - - if (click.isShiftClick()) { - switch (slot) { - case FUEL: - AlchemyPotionBrewer.scheduleCheck(player, stand); - return; - case CONTAINER: - case QUICKBAR: - if (!AlchemyPotionBrewer.isValidIngredient(player, clicked)) { - return; - } - - if (!AlchemyPotionBrewer.transferItems(event.getView(), event.getRawSlot(), click)) { - return; - } - - event.setCancelled(true); - AlchemyPotionBrewer.scheduleUpdate(inventory); - AlchemyPotionBrewer.scheduleCheck(player, stand); - return; - default: - } - } else if (slot == InventoryType.SlotType.FUEL) { - boolean emptyClicked = AlchemyPotionBrewer.isEmpty(clicked); - - if (AlchemyPotionBrewer.isEmpty(cursor)) { - if (emptyClicked && click == ClickType.NUMBER_KEY) { - AlchemyPotionBrewer.scheduleCheck(player, stand); - return; - } - - AlchemyPotionBrewer.scheduleCheck(player, stand); - } else if (emptyClicked) { - if (AlchemyPotionBrewer.isValidIngredient(player, cursor)) { - int amount = cursor.getAmount(); - - if (click == ClickType.LEFT || (click == ClickType.RIGHT && amount == 1)) { - event.setCancelled(true); - event.setCurrentItem(cursor.clone()); - event.setCursor(null); - - AlchemyPotionBrewer.scheduleUpdate(inventory); - AlchemyPotionBrewer.scheduleCheck(player, stand); - } else if (click == ClickType.RIGHT) { - event.setCancelled(true); - - ItemStack one = cursor.clone(); - one.setAmount(1); - - ItemStack rest = cursor.clone(); - rest.setAmount(amount - 1); - - event.setCurrentItem(one); - event.setCursor(rest); - - AlchemyPotionBrewer.scheduleUpdate(inventory); - AlchemyPotionBrewer.scheduleCheck(player, stand); - } - } - } - } +// if (click.isShiftClick()) { +// switch (slot) { +// case FUEL: +// AlchemyPotionBrewer.scheduleCheck(player, stand); +// return; +// case CONTAINER: +// case QUICKBAR: +// if (!AlchemyPotionBrewer.isValidIngredient(player, clicked)) { +// return; +// } +// +// if (!AlchemyPotionBrewer.transferItems(event.getView(), event.getRawSlot(), click)) { +// return; +// } +// +// event.setCancelled(true); +// AlchemyPotionBrewer.scheduleUpdate(inventory); +// AlchemyPotionBrewer.scheduleCheck(player, stand); +// return; +// default: +// } +// } else if (slot == InventoryType.SlotType.FUEL) { +// boolean emptyClicked = AlchemyPotionBrewer.isEmpty(clicked); +// +// if (AlchemyPotionBrewer.isEmpty(cursor)) { +// if (emptyClicked && click == ClickType.NUMBER_KEY) { +// AlchemyPotionBrewer.scheduleCheck(player, stand); +// return; +// } +// +// AlchemyPotionBrewer.scheduleCheck(player, stand); +// } else if (emptyClicked) { +// if (AlchemyPotionBrewer.isValidIngredient(player, cursor)) { +// int amount = cursor.getAmount(); +// +// if (click == ClickType.LEFT || (click == ClickType.RIGHT && amount == 1)) { +// event.setCancelled(true); +// event.setCurrentItem(cursor.clone()); +// event.setCursor(null); +// +// AlchemyPotionBrewer.scheduleUpdate(inventory); +// AlchemyPotionBrewer.scheduleCheck(player, stand); +// } else if (click == ClickType.RIGHT) { +// event.setCancelled(true); +// +// ItemStack one = cursor.clone(); +// one.setAmount(1); +// +// ItemStack rest = cursor.clone(); +// rest.setAmount(amount - 1); +// +// event.setCurrentItem(one); +// event.setCursor(rest); +// +// AlchemyPotionBrewer.scheduleUpdate(inventory); +// AlchemyPotionBrewer.scheduleCheck(player, stand); +// } +// } +// } +// } } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) @@ -335,48 +331,48 @@ public class InventoryListener implements Listener { return; } - if (!event.getInventorySlots().contains(Alchemy.INGREDIENT_SLOT)) { - return; - } - - ItemStack cursor = event.getCursor(); - ItemStack ingredient = ((BrewerInventory) inventory).getIngredient(); - - if (AlchemyPotionBrewer.isEmpty(ingredient) || ingredient.isSimilar(cursor)) { - Player player = (Player) whoClicked; - - /* WORLD GUARD MAIN FLAG CHECK */ - if (WorldGuardUtils.isWorldGuardLoaded()) { - if (!WorldGuardManager.getInstance().hasMainFlag(player)) - return; - } - - if (AlchemyPotionBrewer.isValidIngredient(player, cursor)) { - // Not handled: dragging custom ingredients over ingredient slot (does not trigger any event) - AlchemyPotionBrewer.scheduleCheck(player, (BrewingStand) holder); - return; - } - - event.setCancelled(true); - AlchemyPotionBrewer.scheduleUpdate(inventory); - } +// if (!event.getInventorySlots().contains(Alchemy.INGREDIENT_SLOT)) { +// return; +// } +// +// ItemStack cursor = event.getCursor(); +// ItemStack ingredient = ((BrewerInventory) inventory).getIngredient(); +// +// if (AlchemyPotionBrewer.isEmpty(ingredient) || ingredient.isSimilar(cursor)) { +// Player player = (Player) whoClicked; +// +// /* WORLD GUARD MAIN FLAG CHECK */ +// if (WorldGuardUtils.isWorldGuardLoaded()) { +// if (!WorldGuardManager.getInstance().hasMainFlag(player)) +// return; +// } +// +// if (AlchemyPotionBrewer.isValidIngredient(player, cursor)) { +// // Not handled: dragging custom ingredients over ingredient slot (does not trigger any event) +// AlchemyPotionBrewer.scheduleCheck(player, (BrewingStand) holder); +// return; +// } +// +// event.setCancelled(true); +// AlchemyPotionBrewer.scheduleUpdate(inventory); +// } } // Apparently sometimes vanilla brewing beats our task listener to the actual brew. We handle this by cancelling the vanilla event and finishing our brew ourselves. - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) - public void onBrew(BrewEvent event) { - /* WORLD BLACKLIST CHECK */ - if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) - return; - - if (event instanceof FakeBrewEvent) - return; - Location location = event.getBlock().getLocation(); - if (Alchemy.brewingStandMap.containsKey(location)) { - Alchemy.brewingStandMap.get(location).finishImmediately(); - event.setCancelled(true); - } - } +// @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) +// public void onBrew(BrewEvent event) { +// /* WORLD BLACKLIST CHECK */ +// if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) +// return; +// +// if (event instanceof FakeBrewEvent) +// return; +// Location location = event.getBlock().getLocation(); +// if (Alchemy.brewingStandMap.containsKey(location)) { +// Alchemy.brewingStandMap.get(location).finishImmediately(); +// event.setCancelled(true); +// } +// } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onInventoryMoveItemEvent(InventoryMoveItemEvent event) { @@ -411,9 +407,9 @@ public class InventoryListener implements Listener { return; } - if (MainConfig.getInstance().getEnabledForHoppers() && AlchemyPotionBrewer.isValidIngredient(null, item)) { - AlchemyPotionBrewer.scheduleCheck(null, (BrewingStand) holder); - } +// if (MainConfig.getInstance().getEnabledForHoppers() && AlchemyPotionBrewer.isValidIngredient(null, item)) { +// AlchemyPotionBrewer.scheduleCheck(null, (BrewingStand) holder); +// } } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) diff --git a/src/main/java/com/gmail/nossr50/listeners/WorldListener.java b/src/main/java/com/gmail/nossr50/listeners/WorldListener.java index 2ae1a0769..e88112dc4 100644 --- a/src/main/java/com/gmail/nossr50/listeners/WorldListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/WorldListener.java @@ -91,6 +91,7 @@ public class WorldListener implements Listener { Chunk chunk = event.getChunk(); - mcMMO.getPlaceStore().chunkUnloaded(chunk.getX(), chunk.getZ(), event.getWorld()); + if(chunk != null) + mcMMO.getPlaceStore().chunkUnloaded(chunk.getX(), chunk.getZ(), event.getWorld()); } } diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 157730354..fb871ab7c 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -25,7 +25,6 @@ import com.gmail.nossr50.runnables.player.ClearRegisteredXPGainTask; import com.gmail.nossr50.runnables.player.PlayerProfileLoadingTask; import com.gmail.nossr50.runnables.player.PowerLevelUpdatingTask; import com.gmail.nossr50.runnables.skills.BleedTimerTask; -import com.gmail.nossr50.skills.alchemy.Alchemy; import com.gmail.nossr50.skills.repair.repairables.RepairableManager; import com.gmail.nossr50.skills.salvage.salvageables.SalvageableManager; import com.gmail.nossr50.util.*; @@ -391,7 +390,7 @@ public class mcMMO extends JavaPlugin { @Override public void onDisable() { try { - Alchemy.finishAllBrews(); // Finish all partially complete AlchemyBrewTasks to prevent vanilla brewing continuation on restart +// Alchemy.finishAllBrews(); // Finish all partially complete AlchemyBrewTasks to prevent vanilla brewing continuation on restart UserManager.saveAll(); // Make sure to save player information if the server shuts down UserManager.clearAll(); PartyManager.saveParties(); // Save our parties diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewCheckTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewCheckTask.java deleted file mode 100644 index f978b5d29..000000000 --- a/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewCheckTask.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.gmail.nossr50.runnables.skills; - -import com.gmail.nossr50.skills.alchemy.Alchemy; -import com.gmail.nossr50.skills.alchemy.AlchemyPotionBrewer; -import org.bukkit.Location; -import org.bukkit.block.BrewingStand; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.Arrays; - -public class AlchemyBrewCheckTask extends BukkitRunnable { - private Player player; - private BrewingStand brewingStand; - private ItemStack[] oldInventory; - - public AlchemyBrewCheckTask(Player player, BrewingStand brewingStand) { - this.player = player; - this.brewingStand = brewingStand; - this.oldInventory = Arrays.copyOfRange(brewingStand.getInventory().getContents(), 0, 4); - } - - @Override - public void run() { - Location location = brewingStand.getLocation(); - ItemStack[] newInventory = Arrays.copyOfRange(brewingStand.getInventory().getContents(), 0, 4); - boolean validBrew = brewingStand.getFuelLevel() > 0 && AlchemyPotionBrewer.isValidBrew(player, newInventory); - - if (Alchemy.brewingStandMap.containsKey(location)) { - if (oldInventory[Alchemy.INGREDIENT_SLOT] == null || newInventory[Alchemy.INGREDIENT_SLOT] == null || !oldInventory[Alchemy.INGREDIENT_SLOT].isSimilar(newInventory[Alchemy.INGREDIENT_SLOT]) || !validBrew) { - Alchemy.brewingStandMap.get(location).cancelBrew(); - } - } else if (validBrew) { - Alchemy.brewingStandMap.put(location, new AlchemyBrewTask(brewingStand, player)); - } - } -} diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewTask.java deleted file mode 100644 index 4ecb1455b..000000000 --- a/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewTask.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.gmail.nossr50.runnables.skills; - -import com.gmail.nossr50.datatypes.skills.PrimarySkillType; -import com.gmail.nossr50.datatypes.skills.SubSkillType; -import com.gmail.nossr50.events.skills.alchemy.McMMOPlayerBrewEvent; -import com.gmail.nossr50.events.skills.alchemy.McMMOPlayerCatalysisEvent; -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.skills.alchemy.Alchemy; -import com.gmail.nossr50.skills.alchemy.AlchemyPotionBrewer; -import com.gmail.nossr50.util.Misc; -import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.player.UserManager; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.BlockState; -import org.bukkit.block.BrewingStand; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; - -public class AlchemyBrewTask extends BukkitRunnable { - - private BlockState brewingStand; - private Location location; - private double brewSpeed; - private double brewTimer; - private Player player; - private int fuel; - private boolean firstRun = true; - - public AlchemyBrewTask(BlockState brewingStand, Player player) { - this.brewingStand = brewingStand; - this.location = brewingStand.getLocation(); - this.player = player; - - brewSpeed = 1.0; - brewTimer = 400; - - if (player != null - && !Misc.isNPCEntity(player) - && Permissions.isSubSkillEnabled(player, SubSkillType.ALCHEMY_CATALYSIS) - && UserManager.getPlayer(player) != null) { - - double catalysis = UserManager.getPlayer(player).getAlchemyManager().calculateBrewSpeed(Permissions.lucky(player, PrimarySkillType.ALCHEMY)); - - McMMOPlayerCatalysisEvent event = new McMMOPlayerCatalysisEvent(player, catalysis); - mcMMO.p.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - brewSpeed = catalysis; - } - } - - if (Alchemy.brewingStandMap.containsKey(location)) { - Alchemy.brewingStandMap.get(location).cancel(); - } - - fuel = ((BrewingStand) brewingStand).getFuelLevel(); - - if (((BrewingStand) brewingStand).getBrewingTime() == -1) // Only decrement on our end if it isn't a vanilla ingredient. - fuel--; - - Alchemy.brewingStandMap.put(location, this); - this.runTaskTimer(mcMMO.p, 1, 1); - } - - @Override - public void run() { - if (player == null || !player.isValid() || brewingStand == null || brewingStand.getType() != Material.BREWING_STAND || !AlchemyPotionBrewer.isValidIngredient(player, ((BrewingStand) brewingStand).getInventory().getContents()[Alchemy.INGREDIENT_SLOT])) { - if (Alchemy.brewingStandMap.containsKey(location)) { - Alchemy.brewingStandMap.remove(location); - } - - this.cancel(); - - return; - } - - if (firstRun) { - firstRun = false; - ((BrewingStand) brewingStand).setFuelLevel(fuel); - } - - brewTimer -= brewSpeed; - - // Vanilla potion brewing completes when BrewingTime == 1 - if (brewTimer < Math.max(brewSpeed, 2)) { - this.cancel(); - finish(); - } else { - ((BrewingStand) brewingStand).setBrewingTime((int) brewTimer); - } - } - - private void finish() { - McMMOPlayerBrewEvent event = new McMMOPlayerBrewEvent(player, brewingStand); - mcMMO.p.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - AlchemyPotionBrewer.finishBrewing(brewingStand, player, false); - } - - Alchemy.brewingStandMap.remove(location); - } - - public void finishImmediately() { - this.cancel(); - - AlchemyPotionBrewer.finishBrewing(brewingStand, player, true); - Alchemy.brewingStandMap.remove(location); - } - - public void cancelBrew() { - this.cancel(); - - ((BrewingStand) brewingStand).setBrewingTime(-1); - Alchemy.brewingStandMap.remove(location); - } -} diff --git a/src/main/java/com/gmail/nossr50/skills/alchemy/Alchemy.java b/src/main/java/com/gmail/nossr50/skills/alchemy/Alchemy.java index dac62a3ce..200836824 100644 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/Alchemy.java +++ b/src/main/java/com/gmail/nossr50/skills/alchemy/Alchemy.java @@ -1,17 +1,5 @@ package com.gmail.nossr50.skills.alchemy; -import com.gmail.nossr50.config.AdvancedConfig; -import com.gmail.nossr50.datatypes.skills.SubSkillType; -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.runnables.skills.AlchemyBrewTask; -import com.gmail.nossr50.util.skills.RankUtils; -import org.bukkit.Location; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - public final class Alchemy { /*public enum Tier { EIGHT(8), @@ -47,30 +35,30 @@ public final class Alchemy { } }*/ - public static final int INGREDIENT_SLOT = 3; - - public static int catalysisUnlockLevel = RankUtils.getUnlockLevel(SubSkillType.ALCHEMY_CATALYSIS); - public static int catalysisMaxBonusLevel = AdvancedConfig.getInstance().getCatalysisMaxBonusLevel(); - public static double catalysisMinSpeed = AdvancedConfig.getInstance().getCatalysisMinSpeed(); - public static double catalysisMaxSpeed = AdvancedConfig.getInstance().getCatalysisMaxSpeed(); - - public static Map brewingStandMap = new HashMap<>(); - - private Alchemy() { - } - - /** - * Finish all active brews. Used upon Disable to prevent vanilla potions from being brewed upon next Enable. - */ - public static void finishAllBrews() { - mcMMO.p.debug("Completing " + brewingStandMap.size() + " unfinished Alchemy brews."); - - List toFinish = new ArrayList<>(); - - toFinish.addAll(brewingStandMap.values()); - - for (AlchemyBrewTask alchemyBrewTask : toFinish) { - alchemyBrewTask.finishImmediately(); - } - } +// public static final int INGREDIENT_SLOT = 3; +// +// public static int catalysisUnlockLevel = RankUtils.getUnlockLevel(SubSkillType.ALCHEMY_CATALYSIS); +// public static int catalysisMaxBonusLevel = AdvancedConfig.getInstance().getCatalysisMaxBonusLevel(); +// public static double catalysisMinSpeed = AdvancedConfig.getInstance().getCatalysisMinSpeed(); +// public static double catalysisMaxSpeed = AdvancedConfig.getInstance().getCatalysisMaxSpeed(); +// +// public static Map brewingStandMap = new HashMap<>(); +// +// private Alchemy() { +// } +// +// /** +// * Finish all active brews. Used upon Disable to prevent vanilla potions from being brewed upon next Enable. +// */ +// public static void finishAllBrews() { +// mcMMO.p.debug("Completing " + brewingStandMap.size() + " unfinished Alchemy brews."); +// +// List toFinish = new ArrayList<>(); +// +// toFinish.addAll(brewingStandMap.values()); +// +// for (AlchemyBrewTask alchemyBrewTask : toFinish) { +// alchemyBrewTask.finishImmediately(); +// } +// } } \ No newline at end of file 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 259cb3249..7453665fd 100644 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyManager.java +++ b/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyManager.java @@ -1,19 +1,8 @@ package com.gmail.nossr50.skills.alchemy; -import com.gmail.nossr50.config.skills.alchemy.PotionManager; -import com.gmail.nossr50.datatypes.experience.XPGainReason; -import com.gmail.nossr50.datatypes.experience.XPGainSource; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; -import com.gmail.nossr50.datatypes.skills.SubSkillType; -import com.gmail.nossr50.datatypes.skills.alchemy.PotionStage; -import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.SkillManager; -import com.gmail.nossr50.util.StringUtils; -import com.gmail.nossr50.util.skills.RankUtils; -import org.bukkit.inventory.ItemStack; - -import java.util.List; public class AlchemyManager extends SkillManager { @@ -21,39 +10,40 @@ public class AlchemyManager extends SkillManager { super(mcMMOPlayer, PrimarySkillType.ALCHEMY); } - public int getTier() { - return RankUtils.getRank(getPlayer(), SubSkillType.ALCHEMY_CONCOCTIONS); - } - - public List getIngredients() { - return PotionManager.getInstance().getIngredients(getTier()); - } - - public String getIngredientList() { - StringBuilder list = new StringBuilder(); - - for (ItemStack ingredient : getIngredients()) { - String string = StringUtils.getPrettyItemString(ingredient.getType()); - - list.append(", ").append(string); - } - - return list.substring(2); - } - - public double calculateBrewSpeed(boolean isLucky) { - int skillLevel = getSkillLevel(); - - if (skillLevel < Alchemy.catalysisUnlockLevel) { - return Alchemy.catalysisMinSpeed; - } - - double LUCKY_MODIFIER = 4.0 / 3.0; - 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(PotionStage potionStage, int amount) { - //TODO: This code disturbs me - applyXpGain((float) (mcMMO.getConfigManager().getConfigExperience().getExperienceAlchemy().getPotionXPByStage(potionStage.toNumerical()) * amount), XPGainReason.PVE, XPGainSource.PASSIVE); - } +// +// public int getTier() { +// return RankUtils.getRank(getPlayer(), SubSkillType.ALCHEMY_CONCOCTIONS); +// } +// +// public List getIngredients() { +// return PotionManager.getInstance().getIngredients(getTier()); +// } +// +// public String getIngredientList() { +// StringBuilder list = new StringBuilder(); +// +// for (ItemStack ingredient : getIngredients()) { +// String string = StringUtils.getPrettyItemString(ingredient.getType()); +// +// list.append(", ").append(string); +// } +// +// return list.substring(2); +// } +// +// public double calculateBrewSpeed(boolean isLucky) { +// int skillLevel = getSkillLevel(); +// +// if (skillLevel < Alchemy.catalysisUnlockLevel) { +// return Alchemy.catalysisMinSpeed; +// } +// +// double LUCKY_MODIFIER = 4.0 / 3.0; +// 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(PotionStage potionStage, int amount) { +// //TODO: This code disturbs me +// applyXpGain((float) (mcMMO.getConfigManager().getConfigExperience().getExperienceAlchemy().getPotionXPByStage(potionStage.toNumerical()) * amount), XPGainReason.PVE, XPGainSource.PASSIVE); +// } } \ No newline at end of file diff --git a/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java b/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java deleted file mode 100644 index 1264bb73b..000000000 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/AlchemyPotionBrewer.java +++ /dev/null @@ -1,251 +0,0 @@ -package com.gmail.nossr50.skills.alchemy; - -import com.gmail.nossr50.config.skills.alchemy.PotionManager; -import com.gmail.nossr50.datatypes.skills.SubSkillType; -import com.gmail.nossr50.datatypes.skills.alchemy.AlchemyPotion; -import com.gmail.nossr50.datatypes.skills.alchemy.PotionStage; -import com.gmail.nossr50.events.fake.FakeBrewEvent; -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.runnables.player.PlayerUpdateInventoryTask; -import com.gmail.nossr50.runnables.skills.AlchemyBrewCheckTask; -import com.gmail.nossr50.util.Permissions; -import com.gmail.nossr50.util.player.UserManager; -import org.bukkit.Material; -import org.bukkit.block.BlockState; -import org.bukkit.block.BrewingStand; -import org.bukkit.entity.HumanEntity; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.inventory.BrewerInventory; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.inventory.ItemStack; - -import java.util.ArrayList; -import java.util.List; - -public final class AlchemyPotionBrewer { - public static boolean isValidBrew(Player player, ItemStack[] contents) { - if (!isValidIngredient(player, contents[Alchemy.INGREDIENT_SLOT])) { - return false; - } - - for (int i = 0; i < 3; i++) { - if (contents[i] == null || contents[i].getType() != Material.POTION && contents[i].getType() != Material.SPLASH_POTION && contents[i].getType() != Material.LINGERING_POTION) { - continue; - } - - if (getChildPotion(PotionManager.getInstance().getPotion(contents[i]), contents[Alchemy.INGREDIENT_SLOT]) != null) { - return true; - } - } - - return false; - } - - private static AlchemyPotion getChildPotion(AlchemyPotion potion, ItemStack ingredient) { - if (potion != null) { - return potion.getChild(ingredient); - } - - return null; - } - - public static boolean isEmpty(ItemStack item) { - return item == null || item.getType() == Material.AIR || item.getAmount() == 0; - } - - private static void removeIngredient(BrewerInventory inventory, Player player) { - ItemStack ingredient = inventory.getIngredient() == null ? null : inventory.getIngredient().clone(); - - if (isEmpty(ingredient) || !isValidIngredient(player, ingredient)) { - } else if (ingredient.getAmount() <= 1) { - inventory.setIngredient(null); - } else { - ingredient.setAmount(ingredient.getAmount() - 1); - inventory.setIngredient(ingredient); - } - } - - private static boolean hasIngredient(BrewerInventory inventory, Player player) { - ItemStack ingredient = inventory.getIngredient() == null ? null : inventory.getIngredient().clone(); - - return !isEmpty(ingredient) && isValidIngredient(player, ingredient); - } - - public static boolean isValidIngredient(Player player, ItemStack item) { - if (isEmpty(item)) { - return false; - } - - for (ItemStack ingredient : getValidIngredients(player)) { - if (item.isSimilar(ingredient)) { - return true; - } - } - - return false; - } - - private static List getValidIngredients(Player player) { - if (player == null || UserManager.getPlayer(player) == null) { - return PotionManager.getInstance().getIngredients(1); - } - - return PotionManager.getInstance().getIngredients(!Permissions.isSubSkillEnabled(player, SubSkillType.ALCHEMY_CONCOCTIONS) ? 1 : UserManager.getPlayer(player).getAlchemyManager().getTier()); - } - - public static void finishBrewing(BlockState brewingStand, Player player, boolean forced) { - if (!(brewingStand instanceof BrewingStand)) { - return; - } - - BrewerInventory inventory = ((BrewingStand) brewingStand).getInventory(); - ItemStack ingredient = inventory.getIngredient() == null ? null : inventory.getIngredient().clone(); - - if (!hasIngredient(inventory, player)) { - return; - } - - List inputList = new ArrayList<>(); - - for (int i = 0; i < 3; i++) { - ItemStack item = inventory.getItem(i); - - if (isEmpty(item) || item.getType() == Material.GLASS_BOTTLE || !PotionManager.getInstance().isValidPotion(item)) { - continue; - } - - AlchemyPotion input = PotionManager.getInstance().getPotion(item); - AlchemyPotion output = input.getChild(ingredient); - - inputList.add(input); - - if (output != null) { - inventory.setItem(i, output.toItemStack(item.getAmount()).clone()); - } - } - - FakeBrewEvent event = new FakeBrewEvent(brewingStand.getBlock(), inventory, ((BrewingStand) brewingStand).getFuelLevel()); - mcMMO.p.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled() || inputList.isEmpty()) { - return; - } - - removeIngredient(inventory, player); - - for (AlchemyPotion input : inputList) { - AlchemyPotion output = input.getChild(ingredient); - - if (output != null && player != null) { - PotionStage potionStage = PotionStage.getPotionStage(input, output); - - //TODO: hmm - if (UserManager.hasPlayerDataKey(player)) { - UserManager.getPlayer(player).getAlchemyManager().handlePotionBrewSuccesses(potionStage, 1); - } - } - } - - if (!forced) { - scheduleUpdate(inventory); - } - } - - public static boolean transferItems(InventoryView view, int fromSlot, ClickType click) { - boolean success = false; - - if (click.isLeftClick()) { - success = transferItems(view, fromSlot); - } else if (click.isRightClick()) { - success = transferOneItem(view, fromSlot); - } - - return success; - } - - private static boolean transferOneItem(InventoryView view, int fromSlot) { - ItemStack from = view.getItem(fromSlot).clone(); - ItemStack to = view.getItem(Alchemy.INGREDIENT_SLOT).clone(); - - if (isEmpty(from)) { - return false; - } - - boolean emptyTo = isEmpty(to); - int fromAmount = from.getAmount(); - - if (!emptyTo && fromAmount >= from.getType().getMaxStackSize()) { - return false; - } else if (emptyTo || from.isSimilar(to)) { - if (emptyTo) { - to = from.clone(); - to.setAmount(1); - } else { - to.setAmount(to.getAmount() + 1); - } - - from.setAmount(fromAmount - 1); - view.setItem(Alchemy.INGREDIENT_SLOT, to); - view.setItem(fromSlot, from); - - return true; - } - - return false; - } - - /** - * Transfer items between two ItemStacks, returning the leftover status - */ - private static boolean transferItems(InventoryView view, int fromSlot) { - ItemStack from = view.getItem(fromSlot).clone(); - ItemStack to = view.getItem(Alchemy.INGREDIENT_SLOT).clone(); - - if (isEmpty(from)) { - return false; - } else if (isEmpty(to)) { - view.setItem(Alchemy.INGREDIENT_SLOT, from); - view.setItem(fromSlot, null); - - return true; - } else if (from.isSimilar(to)) { - int fromAmount = from.getAmount(); - int toAmount = to.getAmount(); - int maxSize = to.getType().getMaxStackSize(); - - if (fromAmount + toAmount > maxSize) { - int left = fromAmount + toAmount - maxSize; - - to.setAmount(maxSize); - view.setItem(Alchemy.INGREDIENT_SLOT, to); - - from.setAmount(left); - view.setItem(fromSlot, from); - - return true; - } - - to.setAmount(fromAmount + toAmount); - view.setItem(fromSlot, null); - view.setItem(Alchemy.INGREDIENT_SLOT, to); - - return true; - } - - return false; - } - - public static void scheduleCheck(Player player, BrewingStand brewingStand) { - new AlchemyBrewCheckTask(player, brewingStand).runTask(mcMMO.p); - } - - public static void scheduleUpdate(Inventory inventory) { - for (HumanEntity humanEntity : inventory.getViewers()) { - if (humanEntity instanceof Player) { - new PlayerUpdateInventoryTask((Player) humanEntity).runTask(mcMMO.p); - } - } - } -} diff --git a/src/main/java/com/gmail/nossr50/skills/alchemy/PotionGenerator.java b/src/main/java/com/gmail/nossr50/skills/alchemy/PotionGenerator.java deleted file mode 100644 index c653c9a7c..000000000 --- a/src/main/java/com/gmail/nossr50/skills/alchemy/PotionGenerator.java +++ /dev/null @@ -1,718 +0,0 @@ -package com.gmail.nossr50.skills.alchemy; - -import com.gmail.nossr50.datatypes.skills.alchemy.AlchemyPotion; -import com.gmail.nossr50.mcMMO; -import com.google.common.reflect.TypeToken; -import org.bukkit.ChatColor; -import org.bukkit.Color; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; -import org.bukkit.potion.PotionData; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.potion.PotionType; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -public class PotionGenerator { - private HashMap potionHashMap; - - public PotionGenerator() { - potionHashMap = new HashMap<>(); - init(); - } - - private void init() { - Map> vanillaPotions = new HashMap<>(); - populateVanillaPotions(vanillaPotions); - Map> mcMMOPotions = new HashMap<>(); - populateCustomPotions(mcMMOPotions); - List sorted = new ArrayList<>(); - sorted.addAll(vanillaPotions.keySet()); - sorted.addAll(mcMMOPotions.keySet()); - - sorted.sort((a, b) -> { - // All normal potions first - if (a.mat == Material.POTION && b.mat != Material.POTION) { - return -1; - } - if (b.mat == Material.POTION && a.mat != Material.POTION) { - return 1; - } - // All splash potions second - if (a.mat == Material.SPLASH_POTION && b.mat != Material.SPLASH_POTION) { - return -1; - } - if (b.mat == Material.SPLASH_POTION && a.mat != Material.SPLASH_POTION) { - return 1; - } - // Vanilla Potions first - if (a.effect == null && b.effect != null) { - return -1; - } - if (b.effect == null && a.effect != null) { - return 1; - } - // Vanilla potions - if (a.effect == null && b.effect == null) { - // Order by PotionType - if (a.data.getType() != b.data.getType()) { - return Integer.compare(a.data.getType().ordinal(), b.data.getType().ordinal()); - } - // Plain before extended or upgraded - if (!a.data.isExtended() && !a.data.isUpgraded() && (b.data.isExtended() || b.data.isUpgraded())) { - return -1; - } - if (!b.data.isExtended() && !b.data.isUpgraded() && (a.data.isExtended() || a.data.isUpgraded())) { - return 1; - } - // Extended before Upgraded - if (a.data.isExtended() && b.data.isUpgraded()) { - return -1; - } - if (b.data.isExtended() && a.data.isUpgraded()) { - return -1; - } - // Same potion somehow? - return 0; - } - // mcMMO Potions - else { - if ((a.baseName.contains("II") || a.baseName.contains("EXTENDED")) && !(b.baseName.contains("II") || b.baseName.contains("EXTENDED"))) { - return 1; - } - if ((b.baseName.contains("II") || b.baseName.contains("EXTENDED")) && !(a.baseName.contains("II") || a.baseName.contains("EXTENDED"))) { - return -1; - } - if (!a.baseName.contains("II") && b.baseName.contains("II")) { - return -1; - } - if (!b.baseName.contains("II") && a.baseName.contains("II")) { - return 1; - } - return a.baseName.split("_")[0].compareTo(b.baseName.split("_")[0]); - } - }); - - /* Hacky solution, this entire class disgusts me */ - HashMap potionHashMap = new HashMap<>(); - - for(WriteablePotion potion : sorted) - { - AlchemyPotion alchemyPotion = convertWriteableToAlchemyPotion(potion); - potionHashMap.put(alchemyPotion.getName(), alchemyPotion); - } - - - - -// for (WriteablePotion potion : sorted) { -// System.out.println(" " + potion.name + ":"); -// Map children; -// if (vanillaPotions.containsKey(potion)) { -// children = vanillaPotions.get(potion); -// } else { -// System.out.println(" Name: " + prettify(potion.name)); -// children = mcMMOPotions.get(potion); -// } -// System.out.println(" Material: " + potion.mat.name()); -// System.out.println(" PotionData:"); -// System.out.println(" PotionType: " + potion.data.getType().name()); -// if (potion.data.isExtended()) { -// System.out.println(" Extended: true"); -// } -// if (potion.data.isUpgraded()) { -// System.out.println(" Upgraded: true"); -// } -// if (potion.effect != null) { -// System.out.println(" Effects: [\"" + getName(potion.effect.getType()) + " " + potion.effect.getAmplifier() + " " + potion.effect.getDuration() + "\"]"); -// } -// if (children == null || children.isEmpty()) { -// continue; -// } -// System.out.println(" Children:"); -// for (Entry child : children.entrySet()) { -// System.out.println(" " + child.getKey().name + ": " + child.getValue().name); -// } -// } - } - - /** - * I just want anyone who reads this to know - * This entire class is an abomination - * What you see below is a hacky solution to keep Alchemy functioning with the new config system - * Alchemy will be rewritten, until then, this disgusting class exists. - * @param writeablePotion target WriteablePotion - * @return converted WriteablePotion - */ - private AlchemyPotion convertWriteableToAlchemyPotion(WriteablePotion writeablePotion) { - try { - - String name = writeablePotion.name; - - if (name != null) { - name = prettify(ChatColor.translateAlternateColorCodes('&', name)); - } - - PotionData data = writeablePotion.data; - Material material = Material.POTION; - - if(writeablePotion.mat != null) - material = writeablePotion.mat; - - //Lore is unused as far as I can tell - List lore = new ArrayList<>(); - - List effects = new ArrayList<>(); - effects.add(writeablePotion.effect); - - Color color = this.generateColor(effects); - - - return new AlchemyPotion(material, data, name, lore, effects, color, getChildren(writeablePotion)); - } catch (Exception e) { - mcMMO.p.getLogger().warning("Failed to load Alchemy potion: " + potion_section.getString()); - return null; - } - } - - public Color generateColor(List effects) { - if (effects != null && !effects.isEmpty()) { - List colors = new ArrayList<>(); - for (PotionEffect effect : effects) { - if (effect.getType().getColor() != null) { - colors.add(effect.getType().getColor()); - } - } - if (!colors.isEmpty()) { - if (colors.size() > 1) { - return calculateAverageColor(colors); - } - return colors.get(0); - } - } - return null; - } - - public Color calculateAverageColor(List colors) { - int red = 0; - int green = 0; - int blue = 0; - for (Color color : colors) { - red += color.getRed(); - green += color.getGreen(); - blue += color.getBlue(); - } - Color color = Color.fromRGB(red / colors.size(), green / colors.size(), blue / colors.size()); - return color; - } - - private static String prettify(String name) { - String[] substrings = name.split("_"); - String prettyString = ""; - int size = 1; - - for (String string : substrings) { - prettyString = prettyString.concat(getCapitalized(string)); - - if (size < substrings.length) { - prettyString = prettyString.concat(" "); - } - - size++; - } - - return prettyString; - } - - public static String getCapitalized(String target) { - if (target.equals("II")) { // hacks - return target; - } - return target.substring(0, 1).toUpperCase() + target.substring(1).toLowerCase(); - } - - private static String getName(PotionEffectType type) { - switch (type.getId()) { - case 1: - return "SPEED"; - case 2: - return "SLOW"; - case 3: - return "FAST_DIGGING"; - case 4: - return "SLOW_DIGGING"; - case 5: - return "INCREASE_DAMAGE"; - case 6: - return "HEAL"; - case 7: - return "HARM"; - case 8: - return "JUMP"; - case 9: - return "CONFUSION"; - case 10: - return "REGENERATION"; - case 11: - return "DAMAGE_RESISTANCE"; - case 12: - return "FIRE_RESISTANCE"; - case 13: - return "WATER_BREATHING"; - case 14: - return "INVISIBILITY"; - case 15: - return "BLINDNESS"; - case 16: - return "NIGHT_VISION"; - case 17: - return "HUNGER"; - case 18: - return "WEAKNESS"; - case 19: - return "POISON"; - case 20: - return "WITHER"; - case 21: - return "HEALTH_BOOST"; - case 22: - return "ABSORPTION"; - case 23: - return "SATURATION"; - case 24: - return "GLOWING"; - case 25: - return "LEVITATION"; - case 26: - return "LUCK"; - case 27: - return "UNLUCK"; - case 28: - return "SLOW_FALLING"; - case 29: - return "CONDUIT_POWER"; - case 30: - return "DOLPHINS_GRACE"; - default: - return "UNKNOWN_EFFECT_TYPE_" + type.getId(); - } - } - - private void populateVanillaPotions(Map> vanillaPotions) { - for (PotionType type : PotionType.values()) { - for (Material material : new Material[]{Material.POTION, Material.SPLASH_POTION, Material.LINGERING_POTION}) { - WriteablePotion writeablePotion = new WriteablePotion(material, type); - getChildren(writeablePotion); - vanillaPotions.put(writeablePotion, getChildren(writeablePotion)); - if (type.isExtendable()) { - writeablePotion = new WriteablePotion(material, new PotionData(type, true, false)); - vanillaPotions.put(writeablePotion, getChildren(writeablePotion)); - } - if (type.isUpgradeable()) { - writeablePotion = new WriteablePotion(material, new PotionData(type, false, true)); - vanillaPotions.put(writeablePotion, getChildren(writeablePotion)); - } - } - } - for (Entry> entry : vanillaPotions.entrySet()) { - if (entry.getKey().mat == Material.POTION) { - entry.getValue().put(new Ingredient(Material.GUNPOWDER), new WriteablePotion(Material.SPLASH_POTION, entry.getKey().data)); - } - if (entry.getKey().mat == Material.SPLASH_POTION) { - entry.getValue().put(new Ingredient(Material.DRAGON_BREATH), new WriteablePotion(Material.LINGERING_POTION, entry.getKey().data)); - } - } - - //Store children - } - - private HashMap getChildren(WriteablePotion writeablePotion) { - HashMap children = new HashMap<>(); - - switch (writeablePotion.data.getType()) { - case WATER: - assert (!writeablePotion.data.isExtended()); - assert (!writeablePotion.data.isUpgraded()); - children.put(new Ingredient(Material.NETHER_WART), new WriteablePotion(writeablePotion.mat, PotionType.AWKWARD)); - children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(writeablePotion.mat, PotionType.WEAKNESS)); - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(writeablePotion.mat, PotionType.MUNDANE)); - children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(writeablePotion.mat, PotionType.THICK)); - children.put(new Ingredient(Material.BLAZE_POWDER), new WriteablePotion(writeablePotion.mat, PotionType.MUNDANE)); - children.put(new Ingredient(Material.SUGAR), new WriteablePotion(writeablePotion.mat, PotionType.MUNDANE)); - children.put(new Ingredient(Material.RABBIT_FOOT), new WriteablePotion(writeablePotion.mat, PotionType.MUNDANE)); - children.put(new Ingredient(Material.SPIDER_EYE), new WriteablePotion(writeablePotion.mat, PotionType.MUNDANE)); - children.put(new Ingredient(Material.MAGMA_CREAM), new WriteablePotion(writeablePotion.mat, PotionType.MUNDANE)); - children.put(new Ingredient(Material.GLISTERING_MELON_SLICE), new WriteablePotion(writeablePotion.mat, PotionType.MUNDANE)); - children.put(new Ingredient(Material.GHAST_TEAR), new WriteablePotion(writeablePotion.mat, PotionType.MUNDANE)); - return children; - case AWKWARD: - assert (!writeablePotion.data.isExtended()); - assert (!writeablePotion.data.isUpgraded()); - children.put(new Ingredient(Material.GOLDEN_CARROT), new WriteablePotion(writeablePotion.mat, PotionType.NIGHT_VISION)); - children.put(new Ingredient(Material.RABBIT_FOOT), new WriteablePotion(writeablePotion.mat, PotionType.JUMP)); - children.put(new Ingredient(Material.MAGMA_CREAM), new WriteablePotion(writeablePotion.mat, PotionType.FIRE_RESISTANCE)); - children.put(new Ingredient(Material.SUGAR), new WriteablePotion(writeablePotion.mat, PotionType.SPEED)); - children.put(new Ingredient(Material.PUFFERFISH), new WriteablePotion(writeablePotion.mat, PotionType.WATER_BREATHING)); - children.put(new Ingredient(Material.GLISTERING_MELON_SLICE), new WriteablePotion(writeablePotion.mat, PotionType.INSTANT_HEAL)); - children.put(new Ingredient(Material.SPIDER_EYE), new WriteablePotion(writeablePotion.mat, PotionType.POISON)); - children.put(new Ingredient(Material.GHAST_TEAR), new WriteablePotion(writeablePotion.mat, PotionType.REGEN)); - children.put(new Ingredient(Material.BLAZE_POWDER), new WriteablePotion(writeablePotion.mat, PotionType.STRENGTH)); - children.put(new Ingredient(Material.TURTLE_HELMET), new WriteablePotion(writeablePotion.mat, PotionType.TURTLE_MASTER)); - children.put(new Ingredient(Material.PHANTOM_MEMBRANE), new WriteablePotion(writeablePotion.mat, PotionType.SLOW_FALLING)); - // mcMMO custom potions - double mod = 1; - if (writeablePotion.mat == Material.SPLASH_POTION) { - mod = 0.75; - } - if (writeablePotion.mat == Material.LINGERING_POTION) { - mod = 0.25; - } - children.put(new Ingredient(Material.BROWN_MUSHROOM), new WriteablePotion(writeablePotion.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.CONFUSION, (int) (450 * mod), 0), "NAUSEA")); - children.put(new Ingredient(Material.CARROT), new WriteablePotion(writeablePotion.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.FAST_DIGGING, (int) (3600 * mod), 0), "HASTE")); - children.put(new Ingredient(Material.SLIME_BALL), new WriteablePotion(writeablePotion.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.SLOW_DIGGING, (int) (3600 * mod), 0), "DULLNESS")); - children.put(new Ingredient(Material.GOLDEN_APPLE), new WriteablePotion(writeablePotion.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, (int) (450 * mod), 0), "RESISTANCE")); - children.put(new Ingredient(Material.INK_SAC), new WriteablePotion(writeablePotion.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.BLINDNESS, (int) (225 * mod), 0), "BLINDNESS")); - children.put(new Ingredient(Material.ROTTEN_FLESH), new WriteablePotion(writeablePotion.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.HUNGER, (int) (900 * mod), 0), "HUNGER")); - children.put(new Ingredient(Material.POISONOUS_POTATO), new WriteablePotion(writeablePotion.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.WITHER, (int) (450 * mod), 0), "DECAY")); - children.put(new Ingredient(Material.QUARTZ), new WriteablePotion(writeablePotion.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.ABSORPTION, (int) (1800 * mod), 0), "ABSORPTION")); - children.put(new Ingredient(Material.FERN), new WriteablePotion(writeablePotion.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.SATURATION, (int) (8 * mod), 0), "SATURATION")); - children.put(new Ingredient(Material.APPLE), new WriteablePotion(writeablePotion.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.HEALTH_BOOST, (int) (1800 * mod), 0), "HEALTH_BOOST")); - return children; - case FIRE_RESISTANCE: - assert (!writeablePotion.data.isUpgraded()); - if (writeablePotion.data.isExtended()) { - children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(writeablePotion.mat, new PotionData(PotionType.SLOWNESS, true, false))); - } else { - children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(writeablePotion.mat, PotionType.SLOWNESS)); - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), true, false))); - } - return children; - case INSTANT_DAMAGE: - assert (!writeablePotion.data.isExtended()); - if (!writeablePotion.data.isUpgraded()) { - children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), false, true))); - } - return children; - case INSTANT_HEAL: - assert (!writeablePotion.data.isExtended()); - if (!writeablePotion.data.isUpgraded()) { - children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(writeablePotion.mat, PotionType.INSTANT_DAMAGE)); - children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), false, true))); - } else { - children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(writeablePotion.mat, new PotionData(PotionType.INSTANT_DAMAGE, false, true))); - } - return children; - case INVISIBILITY: - assert (!writeablePotion.data.isUpgraded()); - if (!writeablePotion.data.isExtended()) { - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), true, false))); - } - return children; - case JUMP: - if (!writeablePotion.data.isUpgraded() && !writeablePotion.data.isExtended()) { - children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(writeablePotion.mat, PotionType.SLOWNESS)); - children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), false, true))); - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), true, false))); - } - return children; - case NIGHT_VISION: - assert (!writeablePotion.data.isUpgraded()); - if (!writeablePotion.data.isExtended()) { - children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(writeablePotion.mat, PotionType.INVISIBILITY)); - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), true, false))); - } else { - children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(writeablePotion.mat, new PotionData(PotionType.INVISIBILITY, true, false))); - } - return children; - case POISON: - if (!writeablePotion.data.isUpgraded() && !writeablePotion.data.isExtended()) { - children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(writeablePotion.mat, PotionType.INSTANT_DAMAGE)); - children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), false, true))); - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), true, false))); - } else { - children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(writeablePotion.mat, new PotionData(PotionType.INSTANT_DAMAGE, false, true))); - } - return children; - case REGEN: - if (!writeablePotion.data.isUpgraded() && !writeablePotion.data.isExtended()) { - children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), false, true))); - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), true, false))); - } - return children; - case SLOWNESS: - assert (!writeablePotion.data.isUpgraded()); - if (!writeablePotion.data.isExtended()) { - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), true, false))); - } - return children; - case SLOW_FALLING: - assert (!writeablePotion.data.isUpgraded()); - if (!writeablePotion.data.isExtended()) { - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), true, false))); - } - return children; - case SPEED: - if (!writeablePotion.data.isUpgraded() && !writeablePotion.data.isExtended()) { - children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(writeablePotion.mat, PotionType.SLOWNESS)); - children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), false, true))); - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), true, false))); - } else { - children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(writeablePotion.mat, new PotionData(PotionType.SLOWNESS, true, false))); - } - return children; - case STRENGTH: - if (!writeablePotion.data.isUpgraded() && !writeablePotion.data.isExtended()) { - children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), false, true))); - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), true, false))); - } - return children; - case TURTLE_MASTER: - if (!writeablePotion.data.isUpgraded() && !writeablePotion.data.isExtended()) { - children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), false, true))); - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), true, false))); - } - return children; - case WATER_BREATHING: - assert (!writeablePotion.data.isUpgraded()); - if (!writeablePotion.data.isExtended()) { - children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(writeablePotion.mat, PotionType.INSTANT_DAMAGE)); - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), true, false))); - } - return children; - case WEAKNESS: - assert (!writeablePotion.data.isUpgraded()); - if (!writeablePotion.data.isExtended()) { - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(writeablePotion.mat, new PotionData(writeablePotion.data.getType(), true, false))); - } - return children; - case LUCK: - case MUNDANE: - case THICK: - case UNCRAFTABLE: - assert (!writeablePotion.data.isExtended()); - assert (!writeablePotion.data.isUpgraded()); - return children; - default: - return children; - } - } - - private static void populateCustomPotions(Map> mcMMOPotions) { - for (Material material : new Material[]{Material.POTION, Material.SPLASH_POTION, Material.LINGERING_POTION}) { - WriteablePotion data; - double mod = 1; - if (material == Material.SPLASH_POTION) { - mod = 0.75; - } - if (material == Material.LINGERING_POTION) { - mod = 0.25; - } - HashMap children; - data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.CONFUSION, (int) (450 * mod), 0), "NAUSEA"); - children = new HashMap<>(); - children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II")); - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED")); - for (WriteablePotion child : children.values()) { - mcMMOPotions.put(child, new HashMap<>()); - } - mcMMOPotions.put(data, children); - data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.FAST_DIGGING, (int) (3600 * mod), 0), "HASTE"); - children = new HashMap<>(); - children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II")); - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED")); - for (WriteablePotion child : children.values()) { - mcMMOPotions.put(child, new HashMap<>()); - } - mcMMOPotions.put(data, children); - data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.SLOW_DIGGING, (int) (3600 * mod), 0), "DULLNESS"); - children = new HashMap<>(); - children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II")); - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED")); - for (WriteablePotion child : children.values()) { - mcMMOPotions.put(child, new HashMap<>()); - } - mcMMOPotions.put(data, children); - data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, (int) (450 * mod), 0), "RESISTANCE"); - children = new HashMap<>(); - children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II")); - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED")); - for (WriteablePotion child : children.values()) { - mcMMOPotions.put(child, new HashMap<>()); - } - mcMMOPotions.put(data, children); - data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.BLINDNESS, (int) (225 * mod), 0), "BLINDNESS"); - children = new HashMap<>(); - children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II")); - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED")); - for (WriteablePotion child : children.values()) { - mcMMOPotions.put(child, new HashMap<>()); - } - mcMMOPotions.put(data, children); - data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.HUNGER, (int) (900 * mod), 0), "HUNGER"); - children = new HashMap<>(); - children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II")); - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED")); - for (WriteablePotion child : children.values()) { - mcMMOPotions.put(child, new HashMap<>()); - } - mcMMOPotions.put(data, children); - data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.WITHER, (int) (450 * mod), 0), "DECAY"); - children = new HashMap<>(); - children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II")); - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED")); - for (WriteablePotion child : children.values()) { - mcMMOPotions.put(child, new HashMap<>()); - } - mcMMOPotions.put(data, children); - data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.ABSORPTION, (int) (1800 * mod), 0), "ABSORPTION"); - children = new HashMap<>(); - children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II")); - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED")); - for (WriteablePotion child : children.values()) { - mcMMOPotions.put(child, new HashMap<>()); - } - mcMMOPotions.put(data, children); - data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.SATURATION, (int) (8 * mod), 0), "SATURATION"); - children = new HashMap<>(); - children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II")); - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED")); - for (WriteablePotion child : children.values()) { - mcMMOPotions.put(child, new HashMap<>()); - } - mcMMOPotions.put(data, children); - data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.HEALTH_BOOST, (int) (1800 * mod), 0), "HEALTH_BOOST"); - children = new HashMap<>(); - children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II")); - children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED")); - for (WriteablePotion child : children.values()) { - mcMMOPotions.put(child, new HashMap<>()); - } - mcMMOPotions.put(data, children); - } - - // Add all material state changes - for (Entry> entry : mcMMOPotions.entrySet()) { - if (entry.getKey().mat == Material.POTION) { - PotionEffect effect = new PotionEffect(entry.getKey().effect.getType(), (int) (entry.getKey().effect.getDuration() * 0.75), entry.getKey().effect.getAmplifier()); - entry.getValue().put(new Ingredient(Material.GUNPOWDER), new WriteablePotion(Material.SPLASH_POTION, entry.getKey().data, effect, entry.getKey().baseName)); - } else if (entry.getKey().mat == Material.SPLASH_POTION) { - PotionEffect effect = new PotionEffect(entry.getKey().effect.getType(), (int) (entry.getKey().effect.getDuration() * 0.33), entry.getKey().effect.getAmplifier()); - entry.getValue().put(new Ingredient(Material.DRAGON_BREATH), new WriteablePotion(Material.LINGERING_POTION, entry.getKey().data, effect, entry.getKey().baseName)); - } - } - } - - public static class Ingredient { - - public Material mat; - public int data; - public String name; - - public Ingredient(Material mat) { - this.mat = mat; - this.data = 0; - name = mat.name(); - } - - } - - public static class WriteablePotion { - - public String name; - public Material mat; - public PotionData data; - public PotionEffect effect; - public String baseName; - - public WriteablePotion(PotionData data) { - this(Material.POTION, data); - } - - public WriteablePotion(Material type, PotionData data) { - this(type, data, null, getMCName(data.getType())); - } - - public WriteablePotion(Material mat, PotionType type, PotionEffect effect, String baseName) { - this(mat, new PotionData(type, false, false), effect, baseName); - } - - public WriteablePotion(Material type, PotionData data, PotionEffect effect, String baseName) { - this.data = data; - this.effect = effect; - this.mat = type; - this.baseName = baseName; - this.name = "POTION_OF_" + baseName; - if (mat == Material.SPLASH_POTION) { - this.name = "SPLASH_" + this.name; - } - if (mat == Material.LINGERING_POTION) { - this.name = "LINGERING_" + this.name; - } - if (data.isExtended()) { - this.name += "_EXTENDED"; - } - if (data.isUpgraded()) { - this.name += "_II"; - } - } - - public WriteablePotion(PotionType type) { - this(new PotionData(type, false, false)); - } - - public WriteablePotion(Material mat, PotionType type) { - this(mat, new PotionData(type, false, false)); - } - - private static String getMCName(PotionType type) { - switch (type) { - case INSTANT_DAMAGE: - return "HARMING"; - case INSTANT_HEAL: - return "HEALING"; - case JUMP: - return "LEAPING"; - case REGEN: - return "REGENERATION"; - case SPEED: - return "SWIFTNESS"; - case UNCRAFTABLE: - return "EMPTY"; - case LUCK: - case MUNDANE: - case NIGHT_VISION: - case POISON: - case INVISIBILITY: - case SLOWNESS: - case AWKWARD: - case STRENGTH: - case THICK: - case FIRE_RESISTANCE: - case WATER: - case WATER_BREATHING: - case WEAKNESS: - case TURTLE_MASTER: - case SLOW_FALLING: - return type.name(); - default: - return ""; - } - } - - public int hashCode() { - return name.hashCode(); - } - - public boolean equals(Object obj) { - if (!(obj instanceof WriteablePotion)) { - return false; - } - return name.equals(((WriteablePotion) obj).name); - } - } -} diff --git a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java index 356e63abe..b864fdc6f 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -52,7 +52,7 @@ public final class CommandRegistrationManager { break; case ALCHEMY: - command.setExecutor(new AlchemyCommand()); +// command.setExecutor(new AlchemyCommand()); break; case ARCHERY: