diff options
Diffstat (limited to 'src/main/java/net/minecraft/server')
-rw-r--r-- | src/main/java/net/minecraft/server/BlockSkull.java | 19 | ||||
-rw-r--r-- | src/main/java/net/minecraft/server/Explosion.java | 11 | ||||
-rw-r--r-- | src/main/java/net/minecraft/server/ItemInWorldManager.java | 6 |
3 files changed, 23 insertions, 13 deletions
diff --git a/src/main/java/net/minecraft/server/BlockSkull.java b/src/main/java/net/minecraft/server/BlockSkull.java index 968bd941..d5fd3ad3 100644 --- a/src/main/java/net/minecraft/server/BlockSkull.java +++ b/src/main/java/net/minecraft/server/BlockSkull.java @@ -78,8 +78,21 @@ public class BlockSkull extends BlockContainer { return i; } - // CraftBukkit - drop the item like every other block - // public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) {} + // CraftBukkit start - special case dropping so we can get info from the tile entity + public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { + if (world.random.nextFloat() < f) { + ItemStack itemstack = new ItemStack(Item.SKULL.id, 1, this.getDropData(world, i, j, k)); + TileEntitySkull tileentityskull = (TileEntitySkull) world.getTileEntity(i, j, k); + + if (tileentityskull.getSkullType() == 3 && tileentityskull.getExtraType() != null && tileentityskull.getExtraType().length() > 0) { + itemstack.setTag(new NBTTagCompound()); + itemstack.getTag().setString("SkullOwner", tileentityskull.getExtraType()); + } + + this.b(world, i, j, k, itemstack); + } + } + // CraftBukkit end public void a(World world, int i, int j, int k, int l, EntityHuman entityhuman) { if (entityhuman.abilities.canInstantlyBuild) { @@ -92,7 +105,7 @@ public class BlockSkull extends BlockContainer { public void remove(World world, int i, int j, int k, int l, int i1) { if (!world.isStatic) { - /* CraftBukkit start - don't special code dropping the item + /* CraftBukkit start - drop item in code above, not here if ((i1 & 8) == 0) { ItemStack itemstack = new ItemStack(Item.SKULL.id, 1, this.getDropData(world, i, j, k)); TileEntitySkull tileentityskull = (TileEntitySkull) world.getTileEntity(i, j, k); diff --git a/src/main/java/net/minecraft/server/Explosion.java b/src/main/java/net/minecraft/server/Explosion.java index c91c9599..fae57de1 100644 --- a/src/main/java/net/minecraft/server/Explosion.java +++ b/src/main/java/net/minecraft/server/Explosion.java @@ -264,18 +264,13 @@ public class Explosion { // CraftBukkit - stop explosions from putting out fire if (l > 0 && l != Block.FIRE.id) { - // CraftBukkit start - special case skulls, add yield - int data = this.world.getData(i, j, k); - if (l == Block.SKULL.id) { - data = Block.SKULL.getDropData(this.world, i, j, k); - } - Block block = Block.byId[l]; if (block.a(this)) { - block.dropNaturally(this.world, i, j, k, data, event.getYield(), 0); + // CraftBukkit + block.dropNaturally(this.world, i, j, k, this.world.getData(i, j, k), event.getYield(), 0); } - // CraftBukkit end + if (this.world.setRawTypeIdAndData(i, j, k, 0, 0, this.world.isStatic)) { this.world.applyPhysics(i, j, k, 0); } diff --git a/src/main/java/net/minecraft/server/ItemInWorldManager.java b/src/main/java/net/minecraft/server/ItemInWorldManager.java index 389a3ed9..771c05f0 100644 --- a/src/main/java/net/minecraft/server/ItemInWorldManager.java +++ b/src/main/java/net/minecraft/server/ItemInWorldManager.java @@ -290,9 +290,11 @@ public class ItemInWorldManager { int l = this.world.getTypeId(i, j, k); if (Block.byId[l] == null) return false; // CraftBukkit - a plugin set block to air without cancelling int i1 = this.world.getData(i, j, k); + // CraftBukkit start - special case skulls, their item data comes from a tile entity - if (l == Block.SKULL.id) { - i1 = Block.SKULL.getDropData(world, i, j, k); + if (l == Block.SKULL.id && !this.isCreative()) { + Block.SKULL.dropNaturally(world, i, j, k, i1, 1.0F, 0); + return this.d(i, j, k); } // CraftBukkit end |