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

This commit is contained in:
GJ 2013-03-08 10:23:21 -05:00
parent e31b7d5c48
commit d9bd0ace9a
3 changed files with 29 additions and 35 deletions

View File

@ -10,6 +10,7 @@ Key:
Version 1.4.03-dev Version 1.4.03-dev
+ Added option to advanced.yml to determine the # of enchant levels used when buffing Super Breaker & Giga Drill Breaker + 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 + 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 Blast Mining not dropping blocks correctly
= Fixed bug with custom blocks not working = Fixed bug with custom blocks not working
= Fixed bug where Blast Mining was awarding too much XP = Fixed bug where Blast Mining was awarding too much XP

View File

@ -1,5 +1,6 @@
package com.gmail.nossr50.listeners; package com.gmail.nossr50.listeners;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState; import org.bukkit.block.BlockState;
import org.bukkit.block.Furnace; import org.bukkit.block.Furnace;
import org.bukkit.entity.HumanEntity; import org.bukkit.entity.HumanEntity;
@ -16,6 +17,7 @@ import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.inventory.FurnaceInventory; import org.bukkit.inventory.FurnaceInventory;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.datatypes.skills.SkillType; import com.gmail.nossr50.datatypes.skills.SkillType;
@ -49,11 +51,12 @@ public class InventoryListener implements Listener {
if (furnace == null) { if (furnace == null) {
return; return;
} }
if (furnace.getBurnTime() == 0) {
Block furnaceBlock = furnace.getBlock();
BlockState furnaceBlock = furnace.getBlock().getState(); if (!furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey)) {
furnaceBlock.setMetadata(mcMMO.furnaceMetadataKey, new FixedMetadataValue(plugin, player.getName()));
if (furnace.getBurnTime() == 0 && !plugin.furnaceIsTracked(furnaceBlock)) { }
plugin.addToOpenFurnaceTracker(furnaceBlock, player.getName());
} }
} }
} }
@ -75,23 +78,27 @@ public class InventoryListener implements Listener {
return; return;
} }
BlockState furnaceBlock = furnace.getBlock().getState(); if (furnace.getBurnTime() == 0) {
Block furnaceBlock = furnace.getBlock();
if (furnace.getBurnTime() == 0 && plugin.furnaceIsTracked(furnaceBlock)) { if (furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey)) {
plugin.removeFromFurnaceTracker(furnaceBlock); furnaceBlock.removeMetadata(mcMMO.furnaceMetadataKey, plugin);
}
} }
} }
} }
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onFurnaceBurnEvent(FurnaceBurnEvent event) { 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(); ItemStack smelting = ((Furnace) furnaceBlock).getInventory().getSmelting();
if (plugin.furnaceIsTracked(furnaceBlock) && smelting != null && ItemUtils.isSmeltable(smelting)) { if (furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey) && smelting != null && ItemUtils.isSmeltable(smelting)) {
Player player = plugin.getFurnacePlayer(furnaceBlock); // 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)) { if (Misc.isNPCEntity(player) || !Permissions.fuelEfficiency(player)) {
return; return;
@ -104,13 +111,15 @@ 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) {
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(); ItemStack smelting = ((Furnace) furnaceBlock).getInventory().getSmelting();
if (plugin.furnaceIsTracked(furnaceBlock) && smelting != null && ItemUtils.isSmeltable(smelting)) { if (furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey) && smelting != null && ItemUtils.isSmeltable(smelting)) {
Player player = plugin.getFurnacePlayer(furnaceBlock); // 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)) { if (Misc.isNPCEntity(player) || !Permissions.skillEnabled(player, SkillType.SMELTING)) {
return; return;
@ -128,8 +137,9 @@ public class InventoryListener implements Listener {
if (furnaceBlock instanceof Furnace) { if (furnaceBlock instanceof Furnace) {
ItemStack result = ((Furnace) furnaceBlock).getInventory().getResult(); ItemStack result = ((Furnace) furnaceBlock).getInventory().getResult();
if (plugin.furnaceIsTracked(furnaceBlock) && result != null && ItemUtils.isSmelted(result)) { if (furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey) && result != null && ItemUtils.isSmelted(result)) {
Player player = event.getPlayer(); // 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(); SmeltingManager smeltingManager = UserManager.getPlayer(player).getSmeltingManager();

View File

@ -10,7 +10,6 @@ import net.shatteredlands.shatt.backup.ZipLibrary;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.block.BlockState;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.FixedMetadataValue;
@ -66,7 +65,6 @@ public class mcMMO extends JavaPlugin {
private final WorldListener worldListener = new WorldListener(); private final WorldListener worldListener = new WorldListener();
private HashMap<Integer, String> tntTracker = new HashMap<Integer, String>(); private HashMap<Integer, String> tntTracker = new HashMap<Integer, String>();
private HashMap<BlockState, String> furnaceTracker = new HashMap<BlockState, String>();
public static mcMMO p; public static mcMMO p;
@ -95,6 +93,7 @@ public class mcMMO extends JavaPlugin {
public static FixedMetadataValue metadataValue; public static FixedMetadataValue metadataValue;
public final static String entityMetadataKey = "mcMMO: Spawned Entity"; public final static String entityMetadataKey = "mcMMO: Spawned Entity";
public final static String blockMetadataKey = "mcMMO: Piston Tracking"; 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. * Things to be run when the plugin is enabled.
@ -273,22 +272,6 @@ public class mcMMO extends JavaPlugin {
tntTracker.remove(tntID); 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() { public static String getMainDirectory() {
return mainDirectory; return mainDirectory;
} }