package net.glowstone.block.entity; import net.glowstone.EventFactory; import net.glowstone.GlowServer; import net.glowstone.block.GlowBlock; import net.glowstone.block.GlowBlockState; import net.glowstone.block.state.GlowFurnace; import net.glowstone.inventory.GlowFurnaceInventory; import net.glowstone.inventory.crafting.CraftingManager; import net.glowstone.util.InventoryUtil; import net.glowstone.util.nbt.CompoundTag; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.event.inventory.FurnaceBurnEvent; import org.bukkit.event.inventory.FurnaceSmeltEvent; import org.bukkit.inventory.InventoryView.Property; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.Recipe; public class FurnaceEntity extends ContainerEntity { private short burnTime; private short cookTime; private short burnTimeFuel; public FurnaceEntity(GlowBlock block) { super(block, new GlowFurnaceInventory(new GlowFurnace(block, (short) 0, (short) 0))); setSaveId("minecraft:furnace"); } @Override public GlowBlockState getState() { return new GlowFurnace(block); } @Override public void saveNbt(CompoundTag tag) { super.saveNbt(tag); tag.putShort("BurnTime", burnTime); tag.putShort("CookTime", cookTime); } @Override public void loadNbt(CompoundTag tag) { super.loadNbt(tag); if (tag.isShort("BurnTime")) { burnTime = tag.getShort("BurnTime"); } if (tag.isShort("CookTime")) { cookTime = tag.getShort("CookTime"); } } public short getBurnTime() { return burnTime; } public void setBurnTime(short burnTime) { this.burnTime = burnTime; } public short getCookTime() { return cookTime; } public void setCookTime(short cookTime) { this.cookTime = cookTime; } // TODO: Change block on burning public void burn() { GlowFurnaceInventory inv = (GlowFurnaceInventory) getInventory(); if (burnTime > 0) burnTime--; boolean isBurnable = isBurnable(); if (cookTime > 0 && isBurnable) { cookTime++; } else if (burnTime != 0) { cookTime = 0; } if (cookTime == 0 && isBurnable) { cookTime = 1; } if (burnTime == 0) { if (isBurnable) { CraftingManager cm = ((GlowServer) Bukkit.getServer()).getCraftingManager(); FurnaceBurnEvent burnEvent = new FurnaceBurnEvent(block, inv.getFuel(), cm.getFuelTime(inv.getFuel().getType())); EventFactory.callEvent(burnEvent); if (!burnEvent.isCancelled() && burnEvent.isBurning()) { burnTime = (short) burnEvent.getBurnTime(); burnTimeFuel = burnTime; if (inv.getFuel().getAmount() == 1) { if (inv.getFuel().getType().equals(Material.LAVA_BUCKET)) { inv.setFuel(new ItemStack(Material.BUCKET)); } else { inv.setFuel(null); } } else { inv.getFuel().setAmount(inv.getFuel().getAmount() - 1); } } else if (cookTime != 0) { if (cookTime % 2 == 0) { cookTime = (short) (cookTime - 2); } else { cookTime--; } } } else if (cookTime != 0) { if (cookTime % 2 == 0) { cookTime = (short) (cookTime - 2); } else { cookTime--; } } } if (cookTime == 200) { CraftingManager cm = ((GlowServer) Bukkit.getServer()).getCraftingManager(); Recipe recipe = cm.getFurnaceRecipe(inv.getSmelting()); if (recipe != null) { FurnaceSmeltEvent smeltEvent = new FurnaceSmeltEvent(block, inv.getSmelting(), recipe.getResult()); EventFactory.callEvent(smeltEvent); if (!smeltEvent.isCancelled()) { if (inv.getSmelting().getType().equals(Material.SPONGE) && inv.getSmelting().getData().getData() == 1 && inv.getFuel() != null && inv.getFuel().getType().equals(Material.BUCKET) && inv.getFuel().getAmount() == 1) { inv.setFuel(new ItemStack(Material.WATER_BUCKET)); } if (inv.getResult() == null || inv.getResult().getType().equals(Material.AIR)) { inv.setResult(smeltEvent.getResult()); } else if (inv.getResult().getType().equals(smeltEvent.getResult().getType())) { inv.getResult().setAmount(inv.getResult().getAmount() + smeltEvent.getResult().getAmount()); } if (inv.getSmelting().getAmount() == 1) { inv.setSmelting(null); } else { inv.getSmelting().setAmount(inv.getSmelting().getAmount() - 1); } } cookTime = 0; } } inv.getViewersSet().forEach(human -> { human.setWindowProperty(Property.BURN_TIME, burnTime); human.setWindowProperty(Property.TICKS_FOR_CURRENT_FUEL, burnTimeFuel); human.setWindowProperty(Property.COOK_TIME, cookTime); human.setWindowProperty(Property.TICKS_FOR_CURRENT_SMELTING, 200); }); if (!isBurnable && burnTime == 0 && cookTime == 0) { getState().getBlock().getWorld().cancelPulse(getState().getBlock()); } } private boolean isBurnable() { GlowFurnaceInventory inv = (GlowFurnaceInventory) getInventory(); if ((burnTime != 0 || !InventoryUtil.isEmpty(inv.getFuel())) && !InventoryUtil.isEmpty(inv.getSmelting())) { if ((InventoryUtil.isEmpty(inv.getFuel()) || InventoryUtil.isEmpty(inv.getSmelting())) && burnTime == 0) { return false; } CraftingManager cm = ((GlowServer) Bukkit.getServer()).getCraftingManager(); if (burnTime != 0 || cm.isFuel(inv.getFuel().getType())) { Recipe recipe = cm.getFurnaceRecipe(inv.getSmelting()); if (recipe != null && (InventoryUtil.isEmpty(inv.getResult()) || inv.getResult().getType().equals(recipe.getResult().getType()) && inv.getResult().getAmount() + recipe.getResult().getAmount() <= recipe.getResult().getMaxStackSize())) { return true; } } } return false; } }