From a9c796f12cf00276e4e22de8a54138235c1cea72 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 5 Aug 2018 11:21:01 +1000 Subject: [PATCH] SPIGOT-4184: Fix furnaces not matching Vanilla smelt or animations --- nms-patches/TileEntityFurnace.patch | 87 ++++++----------------------- 1 file changed, 17 insertions(+), 70 deletions(-) diff --git a/nms-patches/TileEntityFurnace.patch b/nms-patches/TileEntityFurnace.patch index 3597409b08..0e20cc1c2e 100644 --- a/nms-patches/TileEntityFurnace.patch +++ b/nms-patches/TileEntityFurnace.patch @@ -6,22 +6,21 @@ import javax.annotation.Nullable; +// CraftBukkit start +import java.util.List; -+ ++import org.bukkit.craftbukkit.block.CraftBlock; ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.entity.HumanEntity; +import org.bukkit.event.inventory.FurnaceBurnEvent; +import org.bukkit.event.inventory.FurnaceSmeltEvent; -+import org.bukkit.craftbukkit.entity.CraftHumanEntity; +// CraftBukkit end public class TileEntityFurnace extends TileEntityContainer implements IWorldInventory, RecipeHolder, AutoRecipeOutput, ITickable { -@@ -93,6 +102,32 @@ +@@ -93,6 +102,31 @@ return linkedhashmap; } + // CraftBukkit start - add fields and methods -+ private int lastTick = MinecraftServer.currentTick; + private int maxStack = MAX_STACK; + public List transaction = new java.util.ArrayList(); + @@ -49,7 +48,7 @@ public TileEntityFurnace() { super(TileEntityTypes.b); this.items = NonNullList.a(3, ItemStack.a); -@@ -220,11 +255,30 @@ +@@ -220,7 +254,7 @@ } public void Y_() { @@ -57,73 +56,31 @@ + boolean flag = this.getBlock().get(BlockFurnace.LIT); // CraftBukkit - SPIGOT-844 - Check if furnace block is lit using the block instead of burn time boolean flag1 = false; -+ // CraftBukkit start - Use wall time instead of ticks for cooking -+ int elapsedTicks = MinecraftServer.currentTick - this.lastTick; -+ this.lastTick = MinecraftServer.currentTick; -+ -+ // CraftBukkit - moved from below - edited for wall time -+ IRecipe irecipe = this.world.D().b(this, this.world); -+ if (this.isBurning() && this.canBurn(irecipe)) { -+ this.cookTime += elapsedTicks; -+ if (this.cookTime >= this.cookTimeTotal) { -+ this.cookTime = 0; -+ this.cookTimeTotal = this.s(); -+ this.burn(irecipe); -+ flag1 = true; -+ } -+ } else { -+ this.cookTime = 0; -+ } -+ // CraftBukkit end -+ if (this.isBurning()) { -- --this.burnTime; -+ this.burnTime -= elapsedTicks; // CraftBukkit - use elapsedTicks in place of constant - } +@@ -238,9 +272,20 @@ + IRecipe irecipe = this.world.D().b(this, this.world); - if (!this.world.isClientSide) { -@@ -235,12 +289,21 @@ - this.cookTime = MathHelper.clamp(this.cookTime - 2, 0, this.cookTimeTotal); - } - } else { -- IRecipe irecipe = this.world.D().b(this, this.world); -+ // CraftBukkit start - Handle multiple elapsed ticks -+ if (this.burnTime <= 0 && this.canBurn(irecipe)) { // CraftBukkit - == to <= + if (!this.isBurning() && this.canBurn(irecipe)) { +- this.burnTime = fuelTime(itemstack); ++ // CraftBukkit start + CraftItemStack fuel = CraftItemStack.asCraftMirror(itemstack); + -+ FurnaceBurnEvent furnaceBurnEvent = new FurnaceBurnEvent(this.world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), fuel, fuelTime(itemstack)); ++ FurnaceBurnEvent furnaceBurnEvent = new FurnaceBurnEvent(CraftBlock.at(this.world, this.position), fuel, fuelTime(itemstack)); + this.world.getServer().getPluginManager().callEvent(furnaceBurnEvent); - -- if (!this.isBurning() && this.canBurn(irecipe)) { -- this.burnTime = fuelTime(itemstack); -- this.ticksForCurrentFuel = this.burnTime; -- if (this.isBurning()) { ++ + if (furnaceBurnEvent.isCancelled()) { + return; + } + -+ this.ticksForCurrentFuel = furnaceBurnEvent.getBurnTime(); -+ this.burnTime += this.ticksForCurrentFuel; -+ if (this.burnTime > 0 && furnaceBurnEvent.isBurning()) { ++ this.burnTime = furnaceBurnEvent.getBurnTime(); + this.ticksForCurrentFuel = this.burnTime; +- if (this.isBurning()) { ++ if (this.isBurning() && furnaceBurnEvent.isBurning()) { + // CraftBukkit end flag1 = true; if (!itemstack.isEmpty()) { Item item = itemstack.getItem(); -@@ -255,6 +318,7 @@ - } - } - -+ /* CraftBukkit start - Moved up - if (this.isBurning() && this.canBurn(irecipe)) { - ++this.cookTime; - if (this.cookTime == this.cookTimeTotal) { -@@ -266,11 +330,13 @@ - } else { - this.cookTime = 0; - } -+ */ - } - +@@ -271,6 +316,7 @@ if (flag != this.isBurning()) { flag1 = true; this.world.setTypeAndData(this.position, (IBlockData) this.world.getType(this.position).set(BlockFurnace.LIT, Boolean.valueOf(this.isBurning())), 3); @@ -131,17 +88,7 @@ } } -@@ -295,7 +361,8 @@ - } else { - ItemStack itemstack1 = (ItemStack) this.items.get(2); - -- return itemstack1.isEmpty() ? true : (!itemstack1.doMaterialsMatch(itemstack) ? false : (itemstack1.getCount() < this.getMaxStackSize() && itemstack1.getCount() < itemstack1.getMaxStackSize() ? true : itemstack1.getCount() < itemstack.getMaxStackSize())); -+ // CraftBukkit - consider resultant count instead of current count -+ return itemstack1.isEmpty() ? true : (!itemstack1.doMaterialsMatch(itemstack) ? false : (itemstack1.getCount() + itemstack.getCount() <= this.getMaxStackSize() && itemstack1.getCount() + itemstack.getCount() < itemstack1.getMaxStackSize() ? true : itemstack1.getCount() + itemstack.getCount() <= itemstack.getMaxStackSize())); - } - } else { - return false; -@@ -308,11 +375,38 @@ +@@ -308,11 +354,38 @@ ItemStack itemstack1 = irecipe.d(); ItemStack itemstack2 = (ItemStack) this.items.get(2);