2015-05-25 12:37:24 +02:00
--- a/net/minecraft/server/TileEntityFurnace.java
+++ b/net/minecraft/server/TileEntityFurnace.java
2018-10-22 21:00:00 +02:00
@@ -8,6 +8,15 @@
2018-07-15 02:00:00 +02:00
import java.util.Map;
import java.util.Map.Entry;
import javax.annotation.Nullable;
2014-11-25 22:32:16 +01:00
+// CraftBukkit start
+import java.util.List;
2018-08-05 03:21:01 +02:00
+import org.bukkit.craftbukkit.block.CraftBlock;
+import org.bukkit.craftbukkit.entity.CraftHumanEntity;
2014-11-25 22:32:16 +01:00
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
+import org.bukkit.entity.HumanEntity;
+import org.bukkit.event.inventory.FurnaceBurnEvent;
+import org.bukkit.event.inventory.FurnaceSmeltEvent;
+// CraftBukkit end
2016-05-10 13:47:39 +02:00
2018-07-15 02:00:00 +02:00
public class TileEntityFurnace extends TileEntityContainer implements IWorldInventory, RecipeHolder, AutoRecipeOutput, ITickable {
2014-11-25 22:32:16 +01:00
2018-10-22 21:00:00 +02:00
@@ -92,6 +101,31 @@
2018-07-15 02:00:00 +02:00
return linkedhashmap;
}
2015-02-26 23:41:06 +01:00
2014-11-25 22:32:16 +01:00
+ // CraftBukkit start - add fields and methods
+ private int maxStack = MAX_STACK;
+ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
+
2016-11-17 02:41:03 +01:00
+ public List<ItemStack> getContents() {
2014-11-25 22:32:16 +01:00
+ return this.items;
+ }
+
+ public void onOpen(CraftHumanEntity who) {
+ transaction.add(who);
+ }
+
+ public void onClose(CraftHumanEntity who) {
+ transaction.remove(who);
+ }
+
+ public List<HumanEntity> getViewers() {
+ return transaction;
+ }
+
+ public void setMaxStackSize(int size) {
+ maxStack = size;
+ }
+ // CraftBukkit end
2015-02-26 23:41:06 +01:00
+
2016-11-17 02:41:03 +01:00
public TileEntityFurnace() {
2018-08-26 04:00:00 +02:00
super(TileEntityTypes.FURNACE);
2016-11-17 02:41:03 +01:00
this.items = NonNullList.a(3, ItemStack.a);
2018-10-22 21:00:00 +02:00
@@ -219,7 +253,7 @@
2015-05-21 09:23:29 +02:00
}
2018-12-13 01:00:00 +01:00
public void tick() {
2015-05-21 09:23:29 +02:00
- boolean flag = this.isBurning();
2018-07-15 02:00:00 +02:00
+ boolean flag = this.getBlock().get(BlockFurnace.LIT); // CraftBukkit - SPIGOT-844 - Check if furnace block is lit using the block instead of burn time
2014-11-25 22:32:16 +01:00
boolean flag1 = false;
2015-02-26 23:41:06 +01:00
2014-11-25 22:32:16 +01:00
if (this.isBurning()) {
2018-10-22 21:00:00 +02:00
@@ -237,9 +271,20 @@
2018-12-13 01:00:00 +01:00
IRecipe irecipe = this.world.getCraftingManager().b(this, this.world);
2014-11-25 22:32:16 +01:00
2018-08-05 03:21:01 +02:00
if (!this.isBurning() && this.canBurn(irecipe)) {
- this.burnTime = fuelTime(itemstack);
+ // CraftBukkit start
2016-11-17 02:41:03 +01:00
+ CraftItemStack fuel = CraftItemStack.asCraftMirror(itemstack);
2014-11-25 22:32:16 +01:00
+
2018-08-05 03:21:01 +02:00
+ FurnaceBurnEvent furnaceBurnEvent = new FurnaceBurnEvent(CraftBlock.at(this.world, this.position), fuel, fuelTime(itemstack));
2014-11-25 22:32:16 +01:00
+ this.world.getServer().getPluginManager().callEvent(furnaceBurnEvent);
2018-08-05 03:21:01 +02:00
+
2014-11-25 22:32:16 +01:00
+ if (furnaceBurnEvent.isCancelled()) {
+ return;
+ }
+
2018-08-05 03:21:01 +02:00
+ this.burnTime = furnaceBurnEvent.getBurnTime();
this.ticksForCurrentFuel = this.burnTime;
- if (this.isBurning()) {
+ if (this.isBurning() && furnaceBurnEvent.isBurning()) {
2014-11-25 22:32:16 +01:00
+ // CraftBukkit end
flag1 = true;
2016-11-17 02:41:03 +01:00
if (!itemstack.isEmpty()) {
Item item = itemstack.getItem();
2018-10-22 21:00:00 +02:00
@@ -270,6 +315,7 @@
2014-11-25 22:32:16 +01:00
if (flag != this.isBurning()) {
2015-05-21 11:02:38 +02:00
flag1 = true;
2018-12-06 00:00:00 +01:00
this.world.setTypeAndData(this.position, (IBlockData) this.world.getType(this.position).set(BlockFurnace.LIT, this.isBurning()), 3);
2018-07-15 02:00:00 +02:00
+ this.invalidateBlockCache(); // CraftBukkit - Invalidate tile entity's cached block type
2015-05-21 11:02:38 +02:00
}
}
2018-10-22 21:00:00 +02:00
@@ -280,7 +326,7 @@
2018-08-26 22:50:15 +02:00
}
private int s() {
2018-12-13 01:00:00 +01:00
- FurnaceRecipe furnacerecipe = (FurnaceRecipe) this.world.getCraftingManager().b(this, this.world);
+ FurnaceRecipe furnacerecipe = (this.hasWorld()) ? (FurnaceRecipe) this.world.getCraftingManager().b(this, this.world) : null; // CraftBukkit - SPIGOT-4302
2018-08-26 22:50:15 +02:00
return furnacerecipe != null ? furnacerecipe.h() : 200;
}
2018-10-22 21:00:00 +02:00
@@ -307,11 +353,38 @@
2018-07-15 02:00:00 +02:00
ItemStack itemstack1 = irecipe.d();
2016-11-17 02:41:03 +01:00
ItemStack itemstack2 = (ItemStack) this.items.get(2);
2015-02-26 23:41:06 +01:00
2014-11-25 22:32:16 +01:00
+ // CraftBukkit start - fire FurnaceSmeltEvent
2016-11-17 02:41:03 +01:00
+ CraftItemStack source = CraftItemStack.asCraftMirror(itemstack);
+ org.bukkit.inventory.ItemStack result = CraftItemStack.asBukkitCopy(itemstack1);
2015-02-26 23:41:06 +01:00
+
2014-11-25 22:32:16 +01:00
+ FurnaceSmeltEvent furnaceSmeltEvent = new FurnaceSmeltEvent(this.world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), source, result);
+ this.world.getServer().getPluginManager().callEvent(furnaceSmeltEvent);
+
+ if (furnaceSmeltEvent.isCancelled()) {
+ return;
+ }
+
+ result = furnaceSmeltEvent.getResult();
2016-11-17 02:41:03 +01:00
+ itemstack1 = CraftItemStack.asNMSCopy(result);
2014-11-25 22:32:16 +01:00
+
2016-11-17 02:41:03 +01:00
+ if (!itemstack1.isEmpty()) {
+ if (itemstack2.isEmpty()) {
+ this.items.set(2, itemstack1.cloneItemStack());
+ } else if (CraftItemStack.asCraftMirror(itemstack2).isSimilar(result)) {
+ itemstack2.add(itemstack1.getCount());
2014-11-25 22:32:16 +01:00
+ } else {
+ return;
+ }
+ }
2015-02-26 23:41:06 +01:00
+
2014-11-25 22:32:16 +01:00
+ /*
2016-11-17 02:41:03 +01:00
if (itemstack2.isEmpty()) {
this.items.set(2, itemstack1.cloneItemStack());
} else if (itemstack2.getItem() == itemstack1.getItem()) {
itemstack2.add(1);
2014-11-25 22:32:16 +01:00
}
+ */
+ // CraftBukkit end
2018-07-15 02:00:00 +02:00
if (!this.world.isClientSide) {
this.a(this.world, (EntityPlayer) null, irecipe);