--- a/net/minecraft/server/EntityItemFrame.java +++ b/net/minecraft/server/EntityItemFrame.java @@ -53,16 +53,27 @@ @Override protected void updateBoundingBox() { if (this.direction != null) { + // CraftBukkit start code moved in to calculateBoundingBox + this.a(calculateBoundingBox(this, this.blockPosition, this.direction, this.getHangingWidth(), this.getHangingHeight())); + // CraftBukkit end + } + } + + // CraftBukkit start - break out BB calc into own method + public static AxisAlignedBB calculateBoundingBox(@Nullable Entity entity, BlockPosition blockPosition, EnumDirection direction, int width, int height) { + { double d0 = 0.46875D; - double d1 = (double) this.blockPosition.getX() + 0.5D - (double) this.direction.getAdjacentX() * 0.46875D; - double d2 = (double) this.blockPosition.getY() + 0.5D - (double) this.direction.getAdjacentY() * 0.46875D; - double d3 = (double) this.blockPosition.getZ() + 0.5D - (double) this.direction.getAdjacentZ() * 0.46875D; - - this.setPositionRaw(d1, d2, d3); - double d4 = (double) this.getHangingWidth(); - double d5 = (double) this.getHangingHeight(); - double d6 = (double) this.getHangingWidth(); - EnumDirection.EnumAxis enumdirection_enumaxis = this.direction.n(); + double d1 = (double) blockPosition.getX() + 0.5D - (double) direction.getAdjacentX() * 0.46875D; + double d2 = (double) blockPosition.getY() + 0.5D - (double) direction.getAdjacentY() * 0.46875D; + double d3 = (double) blockPosition.getZ() + 0.5D - (double) direction.getAdjacentZ() * 0.46875D; + + if (entity != null) { + entity.setPositionRaw(d1, d2, d3); + } + double d4 = (double) width; + double d5 = (double) height; + double d6 = (double) width; + EnumDirection.EnumAxis enumdirection_enumaxis = direction.n(); switch (enumdirection_enumaxis) { case X: @@ -78,9 +89,10 @@ d4 /= 32.0D; d5 /= 32.0D; d6 /= 32.0D; - this.a(new AxisAlignedBB(d1 - d4, d2 - d5, d3 - d6, d1 + d4, d2 + d5, d3 + d6)); + return new AxisAlignedBB(d1 - d4, d2 - d5, d3 - d6, d1 + d4, d2 + d5, d3 + d6); } } + // CraftBukkit end @Override public boolean survives() { @@ -130,6 +142,11 @@ 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.playSound(SoundEffects.ENTITY_ITEM_FRAME_REMOVE_ITEM, 1.0F, 1.0F); } @@ -217,6 +234,12 @@ } public void setItem(ItemStack itemstack, boolean flag) { + // CraftBukkit start + this.setItem(itemstack, flag, true); + } + + public void setItem(ItemStack itemstack, boolean flag, boolean playSound) { + // CraftBukkit end if (!itemstack.isEmpty()) { itemstack = itemstack.cloneItemStack(); itemstack.setCount(1); @@ -224,7 +247,7 @@ } this.getDataWatcher().set(EntityItemFrame.ITEM, itemstack); - if (!itemstack.isEmpty()) { + if (!itemstack.isEmpty() && playSound) { // CraftBukkit this.playSound(SoundEffects.ENTITY_ITEM_FRAME_ADD_ITEM, 1.0F, 1.0F); }