Smelting now works with custom ores.

Also fixed exploit where smelting XP could be awarded for some
non-smeltable materials.
This commit is contained in:
GJ 2013-10-31 13:25:06 -04:00
parent 1785bab504
commit de3c4f8fd7
10 changed files with 65 additions and 24 deletions

View File

@ -10,9 +10,11 @@ Key:
Version 1.4.08-dev Version 1.4.08-dev
+ Added the possibility to gain experience when using Fishing "Shake" + Added the possibility to gain experience when using Fishing "Shake"
+ Added config options to disable various sound effects + 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 bug with toggle commands not properly displaying the success message.
= Fixed IllegalArgumentException caused by an empty Fishing treasure category = Fixed IllegalArgumentException caused by an empty Fishing treasure category
= Fixed bug with Salvage not reading the config value for the anvil material. = 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 Version 1.4.07
+ Added XP boost to Acrobatics when wearing Boots of Feather Falling + Added XP boost to Acrobatics when wearing Boots of Feather Falling

View File

@ -92,9 +92,11 @@ public class CustomBlockConfig extends ConfigLoader {
} }
int xp = config.getInt(skillType + "." + blockName + ".XP_Gain"); int xp = config.getInt(skillType + "." + blockName + ".XP_Gain");
int smeltingXp = 0;
if (skillType.equals("Mining") && config.getBoolean(skillType + "." + blockName + ".Is_Ore")) { if (skillType.equals("Mining") && config.getBoolean(skillType + "." + blockName + ".Is_Ore")) {
customOres.add(blockMaterialData); customOres.add(blockMaterialData);
smeltingXp = config.getInt(skillType + "." + blockName + ".Smelting_XP_Gain", xp / 10);
} }
else if (skillType.equals("Woodcutting")) { else if (skillType.equals("Woodcutting")) {
if (config.getBoolean(skillType + "." + blockName + ".Is_Log")) { 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));
} }
} }

View File

@ -3,10 +3,12 @@ package com.gmail.nossr50.datatypes.mods;
public class CustomBlock { public class CustomBlock {
private int xpGain; private int xpGain;
private boolean canDoubleDrop; private boolean canDoubleDrop;
private int smeltingXpGain;
public CustomBlock(int xpGain, boolean canDoubleDrop) { public CustomBlock(int xpGain, boolean canDoubleDrop, int smeltingXpGain) {
this.xpGain = xpGain; this.xpGain = xpGain;
this.canDoubleDrop = canDoubleDrop; this.canDoubleDrop = canDoubleDrop;
this.smeltingXpGain = smeltingXpGain;
} }
public int getXpGain() { public int getXpGain() {
@ -16,4 +18,8 @@ public class CustomBlock {
public boolean isDoubleDropEnabled() { public boolean isDoubleDropEnabled() {
return canDoubleDrop; return canDoubleDrop;
} }
public int getSmeltingXpGain() {
return smeltingXpGain;
}
} }

View File

@ -83,7 +83,7 @@ public class InventoryListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onFurnaceSmeltEvent(FurnaceSmeltEvent event) { public void onFurnaceSmeltEvent(FurnaceSmeltEvent event) {
Block furnaceBlock = event.getBlock(); Block furnaceBlock = event.getBlock();
ItemStack smelting = Misc.getSmeltingFromFurnace(furnaceBlock); ItemStack smelting = event.getSource();
if (!ItemUtils.isSmeltable(smelting)) { if (!ItemUtils.isSmeltable(smelting)) {
return; return;
@ -95,7 +95,7 @@ public class InventoryListener implements Listener {
return; 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) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)

View File

@ -22,16 +22,11 @@ public class Mining {
*/ */
protected static int getBlockXp(BlockState blockState) { protected static int getBlockXp(BlockState blockState) {
Material blockType = blockState.getType(); 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 (xp == 0 && ModUtils.isCustomMiningBlock(blockState)) {
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(); xp = ModUtils.getCustomBlock(blockState).getXpGain();
} }
}
return xp; return xp;
} }

View File

@ -1,10 +1,12 @@
package com.gmail.nossr50.skills.smelting; package com.gmail.nossr50.skills.smelting;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.AdvancedConfig;
import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.config.experience.ExperienceConfig;
import com.gmail.nossr50.datatypes.skills.SkillType; import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.util.ModUtils;
public class Smelting { public class Smelting {
// The order of the values is extremely important, a few methods depend on it to work properly // 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 int fluxMiningUnlockLevel = AdvancedConfig.getInstance().getFluxMiningUnlockLevel();
public static double fluxMiningChance = AdvancedConfig.getInstance().getFluxMiningChance(); public static double fluxMiningChance = AdvancedConfig.getInstance().getFluxMiningChance();
protected static int getResourceXp(Material resourceType) { protected static int getResourceXp(ItemStack smelting) {
int xp = ExperienceConfig.getInstance().getXp(SkillType.SMELTING, resourceType); Material resourceType = smelting.getType();
if (resourceType == Material.GLOWING_REDSTONE_ORE) { int xp = ExperienceConfig.getInstance().getXp(SkillType.SMELTING, resourceType != Material.GLOWING_REDSTONE_ORE ? resourceType : Material.REDSTONE_ORE);
xp = ExperienceConfig.getInstance().getXp(SkillType.SMELTING, Material.REDSTONE_ORE);
if (xp == 0 && ModUtils.isCustomOreBlock(smelting)) {
xp = ModUtils.getCustomSmeltingBlock(smelting).getSmeltingXpGain();
} }
return xp; return xp;

View File

@ -81,10 +81,10 @@ public class SmeltingManager extends SkillManager {
return (int) (burnTime * burnModifier); return (int) (burnTime * burnModifier);
} }
public ItemStack smeltProcessing(Material resourceType, ItemStack result) { public ItemStack smeltProcessing(ItemStack smelting, ItemStack result) {
Player player = getPlayer(); Player player = getPlayer();
applyXpGain(Smelting.getResourceXp(resourceType)); applyXpGain(Smelting.getResourceXp(smelting));
if (Permissions.doubleDrops(player, skill) && SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Smelting.secondSmeltMaxChance, Smelting.secondSmeltMaxLevel)) { if (Permissions.doubleDrops(player, skill) && SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Smelting.secondSmeltMaxChance, Smelting.secondSmeltMaxLevel)) {
ItemStack newResult = result.clone(); ItemStack newResult = result.clone();

View File

@ -1,14 +1,22 @@
package com.gmail.nossr50.util; package com.gmail.nossr50.util;
import java.util.List;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.CoalType;
import org.bukkit.DyeColor; import org.bukkit.DyeColor;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.inventory.FurnaceRecipe;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.Recipe;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.material.Coal;
import org.bukkit.material.Dye; import org.bukkit.material.Dye;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.config.mods.CustomArmorConfig; 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.mods.CustomToolConfig;
import com.gmail.nossr50.config.party.ItemWeightConfig; import com.gmail.nossr50.config.party.ItemWeightConfig;
import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.locale.LocaleLoader;
@ -514,7 +522,7 @@ public class ItemUtils {
return true; return true;
default: default:
return false; return Config.getInstance().getBlockModsEnabled() && CustomBlockConfig.getInstance().isCustomOre(item.getData());
} }
} }
@ -525,6 +533,8 @@ public class ItemUtils {
switch (item.getType()) { switch (item.getType()) {
case COAL: case COAL:
return ((Coal) item.getData()).getType() == CoalType.COAL;
case DIAMOND: case DIAMOND:
case REDSTONE: case REDSTONE:
case GOLD_INGOT: case GOLD_INGOT:
@ -537,6 +547,14 @@ public class ItemUtils {
return ((Dye) item.getData()).getColor() == DyeColor.BLUE; return ((Dye) item.getData()).getColor() == DyeColor.BLUE;
default: default:
List<Recipe> 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; return false;
} }
} }

View File

@ -19,11 +19,9 @@ import com.gmail.nossr50.datatypes.mods.CustomTool;
public final class ModUtils { public final class ModUtils {
private static Config configInstance = Config.getInstance(); private static boolean customToolsEnabled = Config.getInstance().getToolModsEnabled();
private static boolean customBlocksEnabled = Config.getInstance().getBlockModsEnabled();
private static boolean customToolsEnabled = configInstance.getToolModsEnabled(); private static boolean customEntitiesEnabled = Config.getInstance().getEntityModsEnabled();
private static boolean customBlocksEnabled = configInstance.getBlockModsEnabled();
private static boolean customEntitiesEnabled = configInstance.getEntityModsEnabled();
private ModUtils() {} private ModUtils() {}
@ -57,6 +55,10 @@ public final class ModUtils {
return CustomBlockConfig.getInstance().getCustomBlock(blockState.getData()); 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. * Check if a custom block is a woodcutting block.
* *
@ -137,6 +139,16 @@ public final class ModUtils {
return customBlocksEnabled && CustomBlockConfig.getInstance().isCustomOre(blockState.getData()); 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. * Checks to see if an item is a custom tool.
* *

View File

@ -28,10 +28,12 @@ Mining:
XP_Gain: 99 XP_Gain: 99
Double_Drops_Enabled: true Double_Drops_Enabled: true
Is_Ore: true Is_Ore: true
Smelting_XP_Gain: 9
Block_2|0: Block_2|0:
XP_Gain: 99 XP_Gain: 99
Double_Drops_Enabled: true Double_Drops_Enabled: true
Is_Ore: true Is_Ore: true
Smelting_XP_Gain: 9
# #
# Settings for Custom Woodcutting Blocks # Settings for Custom Woodcutting Blocks