diff --git a/Changelog.txt b/Changelog.txt index fc712fb1e..7d75adc2f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -10,9 +10,11 @@ Key: Version 1.4.08-dev + Added the possibility to gain experience when using Fishing "Shake" + Added config options to disable various sound effects + + Smelting now works with custom ores - add smelting XP value to blocks.yml, or it will default to 1/10th of normal XP. = Fixed bug with toggle commands not properly displaying the success message. = Fixed IllegalArgumentException caused by an empty Fishing treasure category = Fixed bug with Salvage not reading the config value for the anvil material. + = Fixed exploit where you could receive smelting XP for improper items Version 1.4.07 + Added XP boost to Acrobatics when wearing Boots of Feather Falling diff --git a/src/main/java/com/gmail/nossr50/config/mods/CustomBlockConfig.java b/src/main/java/com/gmail/nossr50/config/mods/CustomBlockConfig.java index 08211fc18..12f088e00 100644 --- a/src/main/java/com/gmail/nossr50/config/mods/CustomBlockConfig.java +++ b/src/main/java/com/gmail/nossr50/config/mods/CustomBlockConfig.java @@ -92,9 +92,11 @@ public class CustomBlockConfig extends ConfigLoader { } int xp = config.getInt(skillType + "." + blockName + ".XP_Gain"); + int smeltingXp = 0; if (skillType.equals("Mining") && config.getBoolean(skillType + "." + blockName + ".Is_Ore")) { customOres.add(blockMaterialData); + smeltingXp = config.getInt(skillType + "." + blockName + ".Smelting_XP_Gain", xp / 10); } else if (skillType.equals("Woodcutting")) { if (config.getBoolean(skillType + "." + blockName + ".Is_Log")) { @@ -106,7 +108,7 @@ public class CustomBlockConfig extends ConfigLoader { } } - customBlockMap.put(blockMaterialData, new CustomBlock(xp, config.getBoolean(skillType + "." + blockName + ".Double_Drops_Enabled"))); + customBlockMap.put(blockMaterialData, new CustomBlock(xp, config.getBoolean(skillType + "." + blockName + ".Double_Drops_Enabled"), smeltingXp)); } } diff --git a/src/main/java/com/gmail/nossr50/datatypes/mods/CustomBlock.java b/src/main/java/com/gmail/nossr50/datatypes/mods/CustomBlock.java index 900ddc623..65e9d6121 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/mods/CustomBlock.java +++ b/src/main/java/com/gmail/nossr50/datatypes/mods/CustomBlock.java @@ -3,10 +3,12 @@ package com.gmail.nossr50.datatypes.mods; public class CustomBlock { private int xpGain; private boolean canDoubleDrop; + private int smeltingXpGain; - public CustomBlock(int xpGain, boolean canDoubleDrop) { + public CustomBlock(int xpGain, boolean canDoubleDrop, int smeltingXpGain) { this.xpGain = xpGain; this.canDoubleDrop = canDoubleDrop; + this.smeltingXpGain = smeltingXpGain; } public int getXpGain() { @@ -16,4 +18,8 @@ public class CustomBlock { public boolean isDoubleDropEnabled() { return canDoubleDrop; } + + public int getSmeltingXpGain() { + return smeltingXpGain; + } } diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index 20653fc9a..325ea7099 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -83,7 +83,7 @@ public class InventoryListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onFurnaceSmeltEvent(FurnaceSmeltEvent event) { Block furnaceBlock = event.getBlock(); - ItemStack smelting = Misc.getSmeltingFromFurnace(furnaceBlock); + ItemStack smelting = event.getSource(); if (!ItemUtils.isSmeltable(smelting)) { return; @@ -95,7 +95,7 @@ public class InventoryListener implements Listener { return; } - event.setResult(UserManager.getPlayer(player).getSmeltingManager().smeltProcessing(smelting.getType(), event.getResult())); + event.setResult(UserManager.getPlayer(player).getSmeltingManager().smeltProcessing(smelting, event.getResult())); } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) diff --git a/src/main/java/com/gmail/nossr50/skills/mining/Mining.java b/src/main/java/com/gmail/nossr50/skills/mining/Mining.java index ce1c9f3e1..9860b72f5 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/Mining.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/Mining.java @@ -22,15 +22,10 @@ public class Mining { */ protected static int getBlockXp(BlockState blockState) { Material blockType = blockState.getType(); - int xp = ExperienceConfig.getInstance().getXp(SkillType.MINING, blockType); + int xp = ExperienceConfig.getInstance().getXp(SkillType.MINING, blockType != Material.GLOWING_REDSTONE_ORE ? blockType : Material.REDSTONE_ORE); - if (xp == 0) { - if (blockType == Material.GLOWING_REDSTONE_ORE) { - xp = ExperienceConfig.getInstance().getXp(SkillType.MINING, Material.REDSTONE_ORE); - } - else if (ModUtils.isCustomMiningBlock(blockState)) { - xp = ModUtils.getCustomBlock(blockState).getXpGain(); - } + if (xp == 0 && ModUtils.isCustomMiningBlock(blockState)) { + xp = ModUtils.getCustomBlock(blockState).getXpGain(); } return xp; diff --git a/src/main/java/com/gmail/nossr50/skills/smelting/Smelting.java b/src/main/java/com/gmail/nossr50/skills/smelting/Smelting.java index ca0e546c2..115bf5bdd 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/Smelting.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/Smelting.java @@ -1,10 +1,12 @@ package com.gmail.nossr50.skills.smelting; import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.skills.SkillType; +import com.gmail.nossr50.util.ModUtils; public class Smelting { // The order of the values is extremely important, a few methods depend on it to work properly @@ -46,11 +48,13 @@ public class Smelting { public static int fluxMiningUnlockLevel = AdvancedConfig.getInstance().getFluxMiningUnlockLevel(); public static double fluxMiningChance = AdvancedConfig.getInstance().getFluxMiningChance(); - protected static int getResourceXp(Material resourceType) { - int xp = ExperienceConfig.getInstance().getXp(SkillType.SMELTING, resourceType); + protected static int getResourceXp(ItemStack smelting) { + Material resourceType = smelting.getType(); - if (resourceType == Material.GLOWING_REDSTONE_ORE) { - xp = ExperienceConfig.getInstance().getXp(SkillType.SMELTING, Material.REDSTONE_ORE); + int xp = ExperienceConfig.getInstance().getXp(SkillType.SMELTING, resourceType != Material.GLOWING_REDSTONE_ORE ? resourceType : Material.REDSTONE_ORE); + + if (xp == 0 && ModUtils.isCustomOreBlock(smelting)) { + xp = ModUtils.getCustomSmeltingBlock(smelting).getSmeltingXpGain(); } return xp; diff --git a/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java index b2b85a781..78e247d57 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java @@ -81,10 +81,10 @@ public class SmeltingManager extends SkillManager { return (int) (burnTime * burnModifier); } - public ItemStack smeltProcessing(Material resourceType, ItemStack result) { + public ItemStack smeltProcessing(ItemStack smelting, ItemStack result) { Player player = getPlayer(); - applyXpGain(Smelting.getResourceXp(resourceType)); + applyXpGain(Smelting.getResourceXp(smelting)); if (Permissions.doubleDrops(player, skill) && SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Smelting.secondSmeltMaxChance, Smelting.secondSmeltMaxLevel)) { ItemStack newResult = result.clone(); diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index 23d5799f1..05171858b 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -1,14 +1,22 @@ package com.gmail.nossr50.util; +import java.util.List; + import org.bukkit.ChatColor; +import org.bukkit.CoalType; import org.bukkit.DyeColor; import org.bukkit.Material; +import org.bukkit.inventory.FurnaceRecipe; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.Recipe; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.material.Coal; import org.bukkit.material.Dye; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.mods.CustomArmorConfig; +import com.gmail.nossr50.config.mods.CustomBlockConfig; import com.gmail.nossr50.config.mods.CustomToolConfig; import com.gmail.nossr50.config.party.ItemWeightConfig; import com.gmail.nossr50.locale.LocaleLoader; @@ -514,7 +522,7 @@ public class ItemUtils { return true; default: - return false; + return Config.getInstance().getBlockModsEnabled() && CustomBlockConfig.getInstance().isCustomOre(item.getData()); } } @@ -525,6 +533,8 @@ public class ItemUtils { switch (item.getType()) { case COAL: + return ((Coal) item.getData()).getType() == CoalType.COAL; + case DIAMOND: case REDSTONE: case GOLD_INGOT: @@ -537,6 +547,14 @@ public class ItemUtils { return ((Dye) item.getData()).getColor() == DyeColor.BLUE; default: + List recipeList = mcMMO.p.getServer().getRecipesFor(item); + + for (Recipe recipe : recipeList) { + if (recipe instanceof FurnaceRecipe) { + return Config.getInstance().getBlockModsEnabled() && CustomBlockConfig.getInstance().isCustomOre(((FurnaceRecipe) recipe).getInput().getData()); + } + } + return false; } } diff --git a/src/main/java/com/gmail/nossr50/util/ModUtils.java b/src/main/java/com/gmail/nossr50/util/ModUtils.java index 93a8eae29..bc3cda88a 100644 --- a/src/main/java/com/gmail/nossr50/util/ModUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ModUtils.java @@ -19,11 +19,9 @@ import com.gmail.nossr50.datatypes.mods.CustomTool; public final class ModUtils { - private static Config configInstance = Config.getInstance(); - - private static boolean customToolsEnabled = configInstance.getToolModsEnabled(); - private static boolean customBlocksEnabled = configInstance.getBlockModsEnabled(); - private static boolean customEntitiesEnabled = configInstance.getEntityModsEnabled(); + private static boolean customToolsEnabled = Config.getInstance().getToolModsEnabled(); + private static boolean customBlocksEnabled = Config.getInstance().getBlockModsEnabled(); + private static boolean customEntitiesEnabled = Config.getInstance().getEntityModsEnabled(); private ModUtils() {} @@ -57,6 +55,10 @@ public final class ModUtils { return CustomBlockConfig.getInstance().getCustomBlock(blockState.getData()); } + public static CustomBlock getCustomSmeltingBlock(ItemStack smelting) { + return CustomBlockConfig.getInstance().getCustomBlock(smelting.getData()); + } + /** * Check if a custom block is a woodcutting block. * @@ -137,6 +139,16 @@ public final class ModUtils { return customBlocksEnabled && CustomBlockConfig.getInstance().isCustomOre(blockState.getData()); } + /** + * Check if a custom block is an ore block. + * + * @param item The ItemStack of the block to check + * @return true if the block represents an ore, false otherwise + */ + public static boolean isCustomOreBlock(ItemStack item) { + return customBlocksEnabled && CustomBlockConfig.getInstance().isCustomOre(item.getData()); + } + /** * Checks to see if an item is a custom tool. * diff --git a/src/main/resources/mods/blocks.yml b/src/main/resources/mods/blocks.yml index 6c63b8c68..65e66be50 100644 --- a/src/main/resources/mods/blocks.yml +++ b/src/main/resources/mods/blocks.yml @@ -28,10 +28,12 @@ Mining: XP_Gain: 99 Double_Drops_Enabled: true Is_Ore: true + Smelting_XP_Gain: 9 Block_2|0: XP_Gain: 99 Double_Drops_Enabled: true Is_Ore: true + Smelting_XP_Gain: 9 # # Settings for Custom Woodcutting Blocks