package net.minecraft.server; // Spigot start import java.util.UUID; import org.apache.commons.codec.Charsets; // Spigot end import javax.annotation.Nullable; public class EntityItemFrame extends EntityHanging { private static final DataWatcherObject<ItemStack> c = DataWatcher.a(EntityItemFrame.class, DataWatcherRegistry.f); private static final DataWatcherObject<Integer> d = DataWatcher.a(EntityItemFrame.class, DataWatcherRegistry.b); private float e = 1.0F; public EntityItemFrame(World world) { super(world); } public EntityItemFrame(World world, BlockPosition blockposition, EnumDirection enumdirection) { super(world, blockposition); this.setDirection(enumdirection); } protected void i() { this.getDataWatcher().register(EntityItemFrame.c, ItemStack.a); this.getDataWatcher().register(EntityItemFrame.d, Integer.valueOf(0)); } public float aA() { return 0.0F; } public boolean damageEntity(DamageSource damagesource, float f) { if (this.isInvulnerable(damagesource)) { return false; } else if (!damagesource.isExplosion() && !this.getItem().isEmpty()) { if (!this.world.isClientSide) { // CraftBukkit start - fire EntityDamageEvent if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f, false) || this.dead) { return true; } // CraftBukkit end this.b(damagesource.getEntity(), false); this.a(SoundEffects.dh, 1.0F, 1.0F); this.setItem(ItemStack.a); } return true; } else { return super.damageEntity(damagesource, f); } } public int getWidth() { return 12; } public int getHeight() { return 12; } public void a(@Nullable Entity entity) { this.a(SoundEffects.df, 1.0F, 1.0F); this.b(entity, true); } public void o() { this.a(SoundEffects.dg, 1.0F, 1.0F); } public void b(@Nullable Entity entity, boolean flag) { if (this.world.getGameRules().getBoolean("doEntityDrops")) { ItemStack itemstack = this.getItem(); if (entity instanceof EntityHuman) { EntityHuman entityhuman = (EntityHuman) entity; if (entityhuman.abilities.canInstantlyBuild) { this.b(itemstack); return; } } if (flag) { this.a(new ItemStack(Items.ITEM_FRAME), 0.0F); } if (!itemstack.isEmpty() && this.random.nextFloat() < this.e) { itemstack = itemstack.cloneItemStack(); this.b(itemstack); this.a(itemstack, 0.0F); } } } private void b(ItemStack itemstack) { if (!itemstack.isEmpty()) { if (itemstack.getItem() == Items.FILLED_MAP) { WorldMap worldmap = ((ItemWorldMap) itemstack.getItem()).getSavedMap(itemstack, this.world); worldmap.decorations.remove(UUID.nameUUIDFromBytes(("frame-" + this.getId()).getBytes(Charsets.US_ASCII))); // Spigot } itemstack.a((EntityItemFrame) null); } } public ItemStack getItem() { return (ItemStack) this.getDataWatcher().get(EntityItemFrame.c); } public void setItem(ItemStack itemstack) { this.setItem(itemstack, true); } private void setItem(ItemStack itemstack, boolean flag) { if (!itemstack.isEmpty()) { itemstack = itemstack.cloneItemStack(); itemstack.setCount(1); itemstack.a(this); } this.getDataWatcher().set(EntityItemFrame.c, itemstack); this.getDataWatcher().markDirty(EntityItemFrame.c); if (!itemstack.isEmpty()) { this.a(SoundEffects.de, 1.0F, 1.0F); } if (flag && this.blockPosition != null) { this.world.updateAdjacentComparators(this.blockPosition, Blocks.AIR); } } public void a(DataWatcherObject<?> datawatcherobject) { if (datawatcherobject.equals(EntityItemFrame.c)) { ItemStack itemstack = this.getItem(); if (!itemstack.isEmpty() && itemstack.A() != this) { itemstack.a(this); } } } public int getRotation() { return ((Integer) this.getDataWatcher().get(EntityItemFrame.d)).intValue(); } public void setRotation(int i) { this.setRotation(i, true); } private void setRotation(int i, boolean flag) { this.getDataWatcher().set(EntityItemFrame.d, Integer.valueOf(i % 8)); if (flag && this.blockPosition != null) { this.world.updateAdjacentComparators(this.blockPosition, Blocks.AIR); } } public static void a(DataConverterManager dataconvertermanager) { dataconvertermanager.a(DataConverterTypes.ENTITY, (DataInspector) (new DataInspectorItem(EntityItemFrame.class, new String[] { "Item"}))); } public void b(NBTTagCompound nbttagcompound) { if (!this.getItem().isEmpty()) { nbttagcompound.set("Item", this.getItem().save(new NBTTagCompound())); nbttagcompound.setByte("ItemRotation", (byte) this.getRotation()); nbttagcompound.setFloat("ItemDropChance", this.e); } super.b(nbttagcompound); } public void a(NBTTagCompound nbttagcompound) { NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("Item"); if (nbttagcompound1 != null && !nbttagcompound1.isEmpty()) { this.setItem(new ItemStack(nbttagcompound1), false); this.setRotation(nbttagcompound.getByte("ItemRotation"), false); if (nbttagcompound.hasKeyOfType("ItemDropChance", 99)) { this.e = nbttagcompound.getFloat("ItemDropChance"); } } super.a(nbttagcompound); } public boolean b(EntityHuman entityhuman, EnumHand enumhand) { ItemStack itemstack = entityhuman.b(enumhand); if (!this.world.isClientSide) { if (this.getItem().isEmpty()) { if (!itemstack.isEmpty()) { this.setItem(itemstack); if (!entityhuman.abilities.canInstantlyBuild) { itemstack.subtract(1); } } } else { this.a(SoundEffects.di, 1.0F, 1.0F); this.setRotation(this.getRotation() + 1); } } return true; } public int t() { return this.getItem().isEmpty() ? 0 : this.getRotation() % 8 + 1; } }