From d9bd0ace9a5d1606afd087b8458100e1c9accbef Mon Sep 17 00:00:00 2001 From: GJ Date: Fri, 8 Mar 2013 10:23:21 -0500 Subject: [PATCH] Fixed bug with Smelting not properly tracking furnaces. Fixes #806 --- Changelog.txt | 1 + .../nossr50/listeners/InventoryListener.java | 44 ++++++++++++------- src/main/java/com/gmail/nossr50/mcMMO.java | 19 +------- 3 files changed, 29 insertions(+), 35 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index aaa095fdf..b02ab6b13 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -10,6 +10,7 @@ Key: Version 1.4.03-dev + Added option to advanced.yml to determine the # of enchant levels used when buffing Super Breaker & Giga Drill Breaker + Improved stats display for child skills + = Fixed bug with Smelting not properly tracking furnaces = Fixed bug with Blast Mining not dropping blocks correctly = Fixed bug with custom blocks not working = Fixed bug where Blast Mining was awarding too much XP diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index 88f293b9a..8b4f7a2a6 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.listeners; +import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.Furnace; import org.bukkit.entity.HumanEntity; @@ -16,6 +17,7 @@ import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.inventory.FurnaceInventory; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.FixedMetadataValue; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.datatypes.skills.SkillType; @@ -49,11 +51,12 @@ public class InventoryListener implements Listener { if (furnace == null) { return; } + if (furnace.getBurnTime() == 0) { + Block furnaceBlock = furnace.getBlock(); - BlockState furnaceBlock = furnace.getBlock().getState(); - - if (furnace.getBurnTime() == 0 && !plugin.furnaceIsTracked(furnaceBlock)) { - plugin.addToOpenFurnaceTracker(furnaceBlock, player.getName()); + if (!furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey)) { + furnaceBlock.setMetadata(mcMMO.furnaceMetadataKey, new FixedMetadataValue(plugin, player.getName())); + } } } } @@ -75,23 +78,27 @@ public class InventoryListener implements Listener { return; } - BlockState furnaceBlock = furnace.getBlock().getState(); + if (furnace.getBurnTime() == 0) { + Block furnaceBlock = furnace.getBlock(); - if (furnace.getBurnTime() == 0 && plugin.furnaceIsTracked(furnaceBlock)) { - plugin.removeFromFurnaceTracker(furnaceBlock); + if (furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey)) { + furnaceBlock.removeMetadata(mcMMO.furnaceMetadataKey, plugin); + } } } } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onFurnaceBurnEvent(FurnaceBurnEvent event) { - BlockState furnaceBlock = event.getBlock().getState(); + Block furnaceBlock = event.getBlock(); + BlockState furnaceState = furnaceBlock.getState(); - if (furnaceBlock instanceof Furnace) { + if (furnaceState instanceof Furnace) { ItemStack smelting = ((Furnace) furnaceBlock).getInventory().getSmelting(); - if (plugin.furnaceIsTracked(furnaceBlock) && smelting != null && ItemUtils.isSmeltable(smelting)) { - Player player = plugin.getFurnacePlayer(furnaceBlock); + if (furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey) && smelting != null && ItemUtils.isSmeltable(smelting)) { + // We can make this assumption because we (should) be the only ones using this exact metadata + Player player = plugin.getServer().getPlayer(furnaceBlock.getMetadata(mcMMO.furnaceMetadataKey).get(0).asString()); if (Misc.isNPCEntity(player) || !Permissions.fuelEfficiency(player)) { return; @@ -104,13 +111,15 @@ public class InventoryListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onFurnaceSmeltEvent(FurnaceSmeltEvent event) { - BlockState furnaceBlock = event.getBlock().getState(); + Block furnaceBlock = event.getBlock(); + BlockState furnaceState = furnaceBlock.getState(); - if (furnaceBlock instanceof Furnace) { + if (furnaceState instanceof Furnace) { ItemStack smelting = ((Furnace) furnaceBlock).getInventory().getSmelting(); - if (plugin.furnaceIsTracked(furnaceBlock) && smelting != null && ItemUtils.isSmeltable(smelting)) { - Player player = plugin.getFurnacePlayer(furnaceBlock); + if (furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey) && smelting != null && ItemUtils.isSmeltable(smelting)) { + // We can make this assumption because we (should) be the only ones using this exact metadata + Player player = plugin.getServer().getPlayer(furnaceBlock.getMetadata(mcMMO.furnaceMetadataKey).get(0).asString()); if (Misc.isNPCEntity(player) || !Permissions.skillEnabled(player, SkillType.SMELTING)) { return; @@ -128,8 +137,9 @@ public class InventoryListener implements Listener { if (furnaceBlock instanceof Furnace) { ItemStack result = ((Furnace) furnaceBlock).getInventory().getResult(); - if (plugin.furnaceIsTracked(furnaceBlock) && result != null && ItemUtils.isSmelted(result)) { - Player player = event.getPlayer(); + if (furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey) && result != null && ItemUtils.isSmelted(result)) { + // We can make this assumption because we (should) be the only ones using this exact metadata + Player player = plugin.getServer().getPlayer(furnaceBlock.getMetadata(mcMMO.furnaceMetadataKey).get(0).asString()); SmeltingManager smeltingManager = UserManager.getPlayer(player).getSmeltingManager(); diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 261b005c3..05a43b948 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -10,7 +10,6 @@ import net.shatteredlands.shatt.backup.ZipLibrary; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; -import org.bukkit.block.BlockState; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.bukkit.metadata.FixedMetadataValue; @@ -66,7 +65,6 @@ public class mcMMO extends JavaPlugin { private final WorldListener worldListener = new WorldListener(); private HashMap tntTracker = new HashMap(); - private HashMap furnaceTracker = new HashMap(); public static mcMMO p; @@ -95,6 +93,7 @@ public class mcMMO extends JavaPlugin { public static FixedMetadataValue metadataValue; public final static String entityMetadataKey = "mcMMO: Spawned Entity"; public final static String blockMetadataKey = "mcMMO: Piston Tracking"; + public final static String furnaceMetadataKey = "mcMMO: Tracked Furnace"; /** * Things to be run when the plugin is enabled. @@ -273,22 +272,6 @@ public class mcMMO extends JavaPlugin { tntTracker.remove(tntID); } - public void addToOpenFurnaceTracker(BlockState furnace, String playerName) { - furnaceTracker.put(furnace, playerName); - } - - public boolean furnaceIsTracked(BlockState furnace) { - return furnaceTracker.containsKey(furnace); - } - - public void removeFromFurnaceTracker(BlockState furnace) { - furnaceTracker.remove(furnace); - } - - public Player getFurnacePlayer(BlockState furnace) { - return getServer().getPlayer(furnaceTracker.get(furnace)); - } - public static String getMainDirectory() { return mainDirectory; }