@EventHandler public void onSmelt(FurnaceSmeltEvent event) { // this ensures that an STB item smelted in a furnace leaves the // correct result in the furnace's output slot BaseSTBItem item = SensibleToolbox.getItemRegistry().fromItemStack(event.getSource()); if (item != null) { event.setResult(item.getSmeltingResult()); } }
private boolean validateSmeltingIngredient(ItemStack stack) { BaseSTBItem item = SensibleToolbox.getItemRegistry().fromItemStack(stack); if (item != null) { return item.getSmeltingResult() != null; } else { // vanilla item - need to ensure it's actually smeltable (i.e. wasn't added // as a furnace recipe because it's the material for some custom STB item) return RecipeCalculator.getSmeltedOutput(stack.getType()) != null; } }
@EventHandler(ignoreCancelled = true) public void onFurnaceInsert(final InventoryClickEvent event) { if (event.getInventory().getType() != InventoryType.FURNACE) { return; } if (event.getRawSlot() == 0 && event.getCursor().getType() != Material.AIR) { if (!validateSmeltingIngredient(event.getCursor())) { event.setCancelled(true); } } else if (event.getRawSlot() >= event.getView().getTopInventory().getSize()) { if (event.getAction() == InventoryAction.MOVE_TO_OTHER_INVENTORY) { if (!validateSmeltingIngredient(event.getCurrentItem()) && !STBUtil.isFuel(event.getCurrentItem().getType())) { event.setCancelled(true); int newSlot = findNewSlot(event); if (newSlot >= 0) { event.getWhoClicked().getInventory().setItem(newSlot, event.getCurrentItem()); event.setCurrentItem(null); } } } } else if (event.getRawSlot() == 2 && SensibleToolbox.getItemRegistry().isSTBItem(event.getCurrentItem())) { // work around CB bug where shift-clicking custom items out of furnace seems // to cause a de-sync, leaving phantom items in the furnace Bukkit.getScheduler() .runTask( plugin, new Runnable() { @Override public void run() { STBUtil.forceInventoryRefresh(event.getInventory()); } }); } }