浏览代码

Fixed bug with Smelting not properly tracking furnaces. Fixes #806

GJ 12 年之前
父节点
当前提交
d9bd0ace9a

+ 1 - 0
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

+ 27 - 17
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();
 

+ 1 - 18
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<Integer, String>    tntTracker     = new HashMap<Integer, String>();
-    private HashMap<BlockState, String> furnaceTracker = new HashMap<BlockState, String>();
 
     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;
     }