diff --git a/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java b/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java index 2fc0df8..2c71e77 100644 --- a/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java +++ b/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java @@ -123,7 +123,7 @@ reg(false, org.bukkit.event.hanging.HangingPlaceEvent.class); reg(false, org.bukkit.event.inventory.BrewEvent.class); reg(false, org.bukkit.event.inventory.CraftItemEvent.class); - reg(false, org.bukkit.event.inventory.FurnaceBurnEvent.class); + reg(true, org.bukkit.event.inventory.FurnaceBurnEvent.class); reg(false, org.bukkit.event.inventory.FurnaceExtractEvent.class); reg(false, org.bukkit.event.inventory.FurnaceSmeltEvent.class); reg(false, org.bukkit.event.inventory.InventoryClickEvent.class); diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/tileentity/MixinTileEntityFurnace.java b/src/main/java/org/ultramine/mods/bukkit/mixin/tileentity/MixinTileEntityFurnace.java new file mode 100644 index 0000000..e73a0bf --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/tileentity/MixinTileEntityFurnace.java @@ -0,0 +1,110 @@ +package org.ultramine.mods.bukkit.mixin.tileentity; + +import net.minecraft.block.BlockFurnace; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityFurnace; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.inventory.FurnaceBurnEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; + +@Mixin(TileEntityFurnace.class) +public abstract class MixinTileEntityFurnace extends TileEntity +{ + @Shadow private ItemStack[] furnaceItemStacks; + @Shadow public int currentItemBurnTime; + @Shadow public int furnaceBurnTime; + @Shadow public int furnaceCookTime; + + @Shadow protected abstract boolean canSmelt(); + + @Shadow public abstract boolean isBurning(); + + @Shadow public abstract void smeltItem(); + + /** + * @author CraftBukkit Team + */ + @Overwrite + public void updateEntity() + { + boolean flag = (this.blockType == Blocks.lit_furnace); // CraftBukkit - SPIGOT-844 - Check if furnace block is lit using the block instead of burn time + boolean flag1 = false; + + // CraftBukkit - moved from below + if (this.isBurning() && this.canSmelt()) + { + ++this.furnaceCookTime; + + if (this.furnaceCookTime == 200) + { + this.furnaceCookTime = 0; + this.smeltItem(); + flag1 = true; + } + } + else + { + this.furnaceCookTime = 0; + } + + if (this.furnaceBurnTime > 0) + { + --this.furnaceBurnTime; + } + + if (!this.worldObj.isRemote) + { + if (this.furnaceBurnTime != 0 || this.furnaceItemStacks[1] != null && this.furnaceItemStacks[0] != null) + { + //CraftBukkit start + if (this.furnaceBurnTime <= 0 && this.canSmelt()) // CraftBukkit - == to <= + { + ItemStack itemstack = this.furnaceItemStacks[1]; + CraftItemStack fuel = CraftItemStack.asCraftMirror(itemstack); + FurnaceBurnEvent furnaceBurnEvent = new FurnaceBurnEvent(((IMixinWorld) this.worldObj).getWorld().getBlockAt(this.xCoord, this.yCoord, this.zCoord), fuel, TileEntityFurnace.getItemBurnTime(itemstack)); + ((IMixinWorld) this.worldObj).getServer().getPluginManager().callEvent(furnaceBurnEvent); + + if (furnaceBurnEvent.isCancelled()) + { + return; + } + + this.currentItemBurnTime = furnaceBurnEvent.getBurnTime(); + this.furnaceBurnTime += this.currentItemBurnTime; + + if (this.furnaceBurnTime > 0 && furnaceBurnEvent.isBurning()) + //CraftBukkit end + { + flag1 = true; + + if (this.furnaceItemStacks[1] != null) + { + --this.furnaceItemStacks[1].stackSize; + + if (this.furnaceItemStacks[1].stackSize == 0) + { + this.furnaceItemStacks[1] = furnaceItemStacks[1].getItem().getContainerItem(furnaceItemStacks[1]); + } + } + } + } + } + + if (flag != this.furnaceBurnTime > 0) + { + flag1 = true; + BlockFurnace.updateFurnaceBlockState(this.furnaceBurnTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord); + } + } + + if (flag1) + { + this.markDirty(); + } + } +} diff --git a/src/main/resources/mixin.umbukkitimpl.json b/src/main/resources/mixin.umbukkitimpl.json index eaf4692..170cd50 100644 --- a/src/main/resources/mixin.umbukkitimpl.json +++ b/src/main/resources/mixin.umbukkitimpl.json @@ -67,6 +67,7 @@ "network.MixinNetHLoginS", "network.MixinC08PacketPlayerBlockPlacement", "tileentity.MixinTileEntityBrewingStand", + "tileentity.MixinTileEntityFurnace", "tileentity.MixinTileEntitySkull", "tileentity.MixinTileEntityNote", "world.MixinChunk",