diff options
author | Travis Watkins <amaranth@ubuntu.com> | 2012-10-29 12:38:34 -0500 |
---|---|---|
committer | Travis Watkins <amaranth@ubuntu.com> | 2012-10-29 12:54:16 -0500 |
commit | 216cddb2ab1473c642c40b9f09b612fa0877a13b (patch) | |
tree | 0ff5ab825a04bdf550c9bc8ae8699299ffde1c07 /src/main/java/net | |
parent | 14f4bd9024cfdeb3a7d04c1ce3e688e38038722d (diff) | |
download | craftbukkit-216cddb2ab1473c642c40b9f09b612fa0877a13b.tar craftbukkit-216cddb2ab1473c642c40b9f09b612fa0877a13b.tar.gz craftbukkit-216cddb2ab1473c642c40b9f09b612fa0877a13b.tar.lz craftbukkit-216cddb2ab1473c642c40b9f09b612fa0877a13b.tar.xz craftbukkit-216cddb2ab1473c642c40b9f09b612fa0877a13b.zip |
Get skull data before destroying block. Fixes BUKKIT-2723
Skull blocks store their type in a tile entity and use their block data
as rotation. When breaking a block the block data is used for determining
what item to drop. Simply changing this to use the skull method for getting
their drop data is not enough because their tile entity is already gone.
Therefore we have to special case skulls to get the correct data _and_ get
that data before breaking the block.
Diffstat (limited to 'src/main/java/net')
-rw-r--r-- | src/main/java/net/minecraft/server/Explosion.java | 10 | ||||
-rw-r--r-- | src/main/java/net/minecraft/server/ItemInWorldManager.java | 5 |
2 files changed, 13 insertions, 2 deletions
diff --git a/src/main/java/net/minecraft/server/Explosion.java b/src/main/java/net/minecraft/server/Explosion.java index fb30dc10..cf2108c6 100644 --- a/src/main/java/net/minecraft/server/Explosion.java +++ b/src/main/java/net/minecraft/server/Explosion.java @@ -264,8 +264,14 @@ public class Explosion { // CraftBukkit - stop explosions from putting out fire if (l > 0 && l != Block.FIRE.id) { - // CraftBukkit - Block.byId[l].dropNaturally(this.world, i, j, k, this.world.getData(i, j, k), event.getYield(), 0); + // 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.byId[l].dropNaturally(this.world, i, j, k, data, 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 cb13808f..025c25a7 100644 --- a/src/main/java/net/minecraft/server/ItemInWorldManager.java +++ b/src/main/java/net/minecraft/server/ItemInWorldManager.java @@ -291,6 +291,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); + } + // CraftBukkit end this.world.a(this.player, 2001, i, j, k, l + (this.world.getData(i, j, k) << 12)); boolean flag = this.d(i, j, k); |