From 63a21cd261ef3863596416868fbd415b9f64b697 Mon Sep 17 00:00:00 2001 From: CraftBukkit/Spigot Date: Wed, 17 Dec 2014 23:45:49 +0100 Subject: [PATCH] SPIGOT-231 and SPIGOT-229. Fix itemframe behaviour. Confirmed fix for itemframes not showing up. Based on the code in CraftPainting. Besids this fix we now pass null itemstacks directly to the EntityItemFrame to allow the removal of items in ItemFrames. By: FearThe1337 --- .../craftbukkit/entity/CraftItemFrame.java | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java index 823709397..d27f24f81 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java @@ -1,6 +1,9 @@ package org.bukkit.craftbukkit.entity; +import net.minecraft.server.BlockPosition; import net.minecraft.server.EntityItemFrame; +import net.minecraft.server.EnumDirection; +import net.minecraft.server.ItemStack; import net.minecraft.server.WorldServer; import org.apache.commons.lang.Validate; @@ -23,16 +26,31 @@ public class CraftItemFrame extends CraftHanging implements ItemFrame { return false; } - WorldServer world = ((CraftWorld) this.getWorld()).getHandle(); - world.getTracker().untrackEntity(this.getHandle()); - world.getTracker().track(this.getHandle()); + update(); + return true; } + private void update() { + EntityItemFrame old = this.getHandle(); + + WorldServer world = ((CraftWorld) getWorld()).getHandle(); + BlockPosition position = old.getBlockPosition(); + EnumDirection direction = old.getDirection(); + ItemStack item = old.getItem() != null ? old.getItem().cloneItemStack() : null; + + old.die(); + + EntityItemFrame frame = new EntityItemFrame(world,position,direction); + frame.setItem(item); + world.addEntity(frame); + this.entity = frame; + } + + public void setItem(org.bukkit.inventory.ItemStack item) { if (item == null || item.getTypeId() == 0) { - getHandle().getDataWatcher().add(2, 5); - getHandle().getDataWatcher().update(2); + getHandle().setItem(null); } else { getHandle().setItem(CraftItemStack.asNMSCopy(item)); }