summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErik Broes <erikbroes@grum.nl>2011-03-21 00:25:26 +0100
committerErik Broes <erikbroes@grum.nl>2011-03-21 00:31:13 +0100
commit324efa8224818aa04402203b1ccbb9839b44061e (patch)
tree8f5550f37a671bf2bce48f318354e518570bb97b
parent0d2dc3902c1341be9bb1c51ab7e2be1a925788e3 (diff)
downloadcraftbukkit-324efa8224818aa04402203b1ccbb9839b44061e.tar
craftbukkit-324efa8224818aa04402203b1ccbb9839b44061e.tar.gz
craftbukkit-324efa8224818aa04402203b1ccbb9839b44061e.tar.lz
craftbukkit-324efa8224818aa04402203b1ccbb9839b44061e.tar.xz
craftbukkit-324efa8224818aa04402203b1ccbb9839b44061e.zip
Fix BlockPlace
-rw-r--r--src/main/java/net/minecraft/server/ItemBed.java66
-rw-r--r--src/main/java/net/minecraft/server/ItemBlock.java53
-rw-r--r--src/main/java/net/minecraft/server/ItemDoor.java97
-rw-r--r--src/main/java/net/minecraft/server/ItemFlintAndSteel.java44
-rw-r--r--src/main/java/net/minecraft/server/ItemHoe.java31
-rw-r--r--src/main/java/net/minecraft/server/ItemRedstone.java36
-rw-r--r--src/main/java/net/minecraft/server/ItemReed.java48
-rw-r--r--src/main/java/net/minecraft/server/ItemSeeds.java32
-rw-r--r--src/main/java/net/minecraft/server/ItemSign.java42
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java5
-rw-r--r--src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java103
11 files changed, 355 insertions, 202 deletions
diff --git a/src/main/java/net/minecraft/server/ItemBed.java b/src/main/java/net/minecraft/server/ItemBed.java
new file mode 100644
index 00000000..7debae06
--- /dev/null
+++ b/src/main/java/net/minecraft/server/ItemBed.java
@@ -0,0 +1,66 @@
+package net.minecraft.server;
+
+// CraftBukkit start
+import org.bukkit.block.BlockState;
+import org.bukkit.craftbukkit.block.CraftBlockState;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.event.block.BlockPlaceEvent;
+// CraftBukkit end
+
+public class ItemBed extends Item {
+
+ public ItemBed(int i) {
+ super(i);
+ }
+
+ public boolean a(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l) {
+ if (l != 1) {
+ return false;
+ } else {
+ int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit;
+
+ ++j;
+ BlockBed blockbed = (BlockBed) Block.BED;
+ int i1 = MathHelper.b((double) (entityhuman.yaw * 4.0F / 360.0F) + 0.5D) & 3;
+ byte b0 = 0;
+ byte b1 = 0;
+
+ if (i1 == 0) {
+ b1 = 1;
+ }
+
+ if (i1 == 1) {
+ b0 = -1;
+ }
+
+ if (i1 == 2) {
+ b1 = -1;
+ }
+
+ if (i1 == 3) {
+ b0 = 1;
+ }
+
+ if (world.isEmpty(i, j, k) && world.isEmpty(i + b0, j, k + b1) && world.d(i, j - 1, k) && world.d(i + b0, j - 1, k + b1)) {
+ BlockState blockState = CraftBlockState.getBlockState(world, i, j, k); // CraftBukkit
+
+ world.b(i, j, k, blockbed.id, i1);
+
+ // CraftBukkit start - bed
+ BlockPlaceEvent event = CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockState, clickedX, clickedY, clickedZ, blockbed);
+
+ if (event.isCancelled() || !event.canBuild()) {
+ event.getBlockPlaced().setTypeIdAndData(blockState.getTypeId(), blockState.getRawData(), false);
+ return false;
+ }
+ // CraftBukkit end
+
+ world.b(i + b0, j, k + b1, blockbed.id, i1 + 8);
+ --itemstack.count;
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/server/ItemBlock.java b/src/main/java/net/minecraft/server/ItemBlock.java
index e70dfa9d..a7eb4f22 100644
--- a/src/main/java/net/minecraft/server/ItemBlock.java
+++ b/src/main/java/net/minecraft/server/ItemBlock.java
@@ -1,13 +1,11 @@
package net.minecraft.server;
// CraftBukkit start
+import org.bukkit.Material;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
-import org.bukkit.craftbukkit.block.CraftBlock;
import org.bukkit.craftbukkit.block.CraftBlockState;
-import org.bukkit.craftbukkit.inventory.CraftItemStack;
-import org.bukkit.entity.Player;
-import org.bukkit.event.Event.Type;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
import org.bukkit.event.block.BlockPlaceEvent;
// CraftBukkit end
@@ -22,14 +20,7 @@ public class ItemBlock extends Item {
}
public boolean a(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l) {
- // CraftBukkit start -- Bail if we have nothing of the item in hand
- if (itemstack.count == 0) {
- return false;
- }
-
- CraftBlock blockClicked = (CraftBlock) ((WorldServer) world).getWorld().getBlockAt(i, j, k);
- BlockFace faceClicked = CraftBlock.notchToBlockFace(l);
- // CraftBukkit end
+ int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit;
if (world.getTypeId(i, j, k) == Block.SNOW.id) {
l = 0;
@@ -62,23 +53,16 @@ public class ItemBlock extends Item {
if (itemstack.count == 0) {
return false;
} else {
- // CraftBukkit start
- /* We store the old data so we can undo it. Snow(78) and half-steps(44) are special in that they replace the block itself,
- * rather than the block touching the face we clicked on.
- */
- int typeId = blockClicked.getTypeId();
- org.bukkit.block.Block placedBlock = blockClicked.getFace(faceClicked);
-
- if (typeId == Block.SNOW.id || (typeId == Block.STEP.id && itemstack.id == Block.STEP.id && faceClicked == BlockFace.UP))
- placedBlock = blockClicked;
-
- final BlockState replacedBlockState = new CraftBlockState(placedBlock);
- // CraftBukkit end
-
if (world.a(this.a, i, j, k, false)) {
Block block = Block.byId[this.a];
// CraftBukkit start - This executes the placement of the block
+ BlockState replacedBlockState = CraftBlockState.getBlockState(world, i, j, k);
+
+ // Special case the silly stepstone :'(
+ if (l == 1 && world.getTypeId(i, j - 1, k) == Block.STEP.id && itemstack.id == Block.STEP.id) {
+ replacedBlockState = CraftBlockState.getBlockState(world, i, j - 1, k);
+ }
/**
* @see net.minecraft.server.World#b(int i, int j, int k, int l, int i1)
*
@@ -90,22 +74,7 @@ public class ItemBlock extends Item {
* replace this with.
*/
if (world.setTypeIdAndData(i, j, k, a, a(itemstack.h()))) { // <-- world.b does this to place the block
- org.bukkit.Server server = ((WorldServer) world).getServer();
- Type eventType = Type.BLOCK_PLACE;
- org.bukkit.inventory.ItemStack itemInHand = new CraftItemStack(itemstack);
- Player thePlayer = (entityhuman == null) ? null : (Player) entityhuman.getBukkitEntity();
-
- ChunkCoordinates chunkcoordinates = world.l();
- int spawnX = chunkcoordinates.a;
- int spawnZ = chunkcoordinates.c;
-
- int distanceFromSpawn = (int) Math.max(Math.abs(i - spawnX), Math.abs(k - spawnZ));
-
- // CraftBukkit Configurable spawn protection start
- boolean canBuild = distanceFromSpawn > ((WorldServer) world).x.spawnProtection || thePlayer.isOp();
-
- BlockPlaceEvent event = new BlockPlaceEvent(eventType, placedBlock, replacedBlockState, blockClicked, itemInHand, thePlayer, canBuild);
- server.getPluginManager().callEvent(event);
+ BlockPlaceEvent event = CraftEventFactory.callBlockPlaceEvent(world, entityhuman, replacedBlockState, clickedX, clickedY, clickedZ, block);
if (event.isCancelled() || !event.canBuild()) {
// CraftBukkit Undo!
@@ -116,7 +85,7 @@ public class ItemBlock extends Item {
} else {
- if (this.a == block.ICE.id) {
+ if (this.a == Block.ICE.id) {
// Ice will explode if we set straight to 0
world.setTypeId(i, j, k, 20);
}
diff --git a/src/main/java/net/minecraft/server/ItemDoor.java b/src/main/java/net/minecraft/server/ItemDoor.java
new file mode 100644
index 00000000..7a9c0969
--- /dev/null
+++ b/src/main/java/net/minecraft/server/ItemDoor.java
@@ -0,0 +1,97 @@
+package net.minecraft.server;
+
+// CraftBukkit start
+import org.bukkit.block.BlockState;
+import org.bukkit.craftbukkit.block.CraftBlockState;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.event.block.BlockPlaceEvent;
+// CraftBukkit end
+
+public class ItemDoor extends Item {
+
+ private Material a;
+
+ public ItemDoor(int i, Material material) {
+ super(i);
+ this.a = material;
+ this.durability = 64;
+ this.maxStackSize = 1;
+ }
+
+ public boolean a(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l) {
+ if (l != 1) {
+ return false;
+ } else {
+ int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit;
+
+ ++j;
+ Block block;
+
+ if (this.a == Material.WOOD) {
+ block = Block.WOODEN_DOOR;
+ } else {
+ block = Block.IRON_DOOR_BLOCK;
+ }
+
+ if (!block.a(world, i, j, k)) {
+ return false;
+ } else {
+ int i1 = MathHelper.b((double) ((entityhuman.yaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3;
+ byte b0 = 0;
+ byte b1 = 0;
+
+ if (i1 == 0) {
+ b1 = 1;
+ }
+
+ if (i1 == 1) {
+ b0 = -1;
+ }
+
+ if (i1 == 2) {
+ b1 = -1;
+ }
+
+ if (i1 == 3) {
+ b0 = 1;
+ }
+
+ int j1 = (world.d(i - b0, j, k - b1) ? 1 : 0) + (world.d(i - b0, j + 1, k - b1) ? 1 : 0);
+ int k1 = (world.d(i + b0, j, k + b1) ? 1 : 0) + (world.d(i + b0, j + 1, k + b1) ? 1 : 0);
+ boolean flag = world.getTypeId(i - b0, j, k - b1) == block.id || world.getTypeId(i - b0, j + 1, k - b1) == block.id;
+ boolean flag1 = world.getTypeId(i + b0, j, k + b1) == block.id || world.getTypeId(i + b0, j + 1, k + b1) == block.id;
+ boolean flag2 = false;
+
+ if (flag && !flag1) {
+ flag2 = true;
+ } else if (k1 > j1) {
+ flag2 = true;
+ }
+
+ if (flag2) {
+ i1 = i1 - 1 & 3;
+ i1 += 4;
+ }
+
+ BlockState blockState = CraftBlockState.getBlockState(world, i, j, k); // CraftBukkit
+
+ world.e(i, j, k, block.id);
+ world.c(i, j, k, i1);
+
+ // CraftBukkit start - bed
+ BlockPlaceEvent event = CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockState, clickedX, clickedY, clickedZ, block);
+
+ if (event.isCancelled() || !event.canBuild()) {
+ event.getBlockPlaced().setTypeIdAndData(blockState.getTypeId(), blockState.getRawData(), false);
+ return false;
+ }
+ // CraftBukkit end
+
+ world.e(i, j + 1, k, block.id);
+ world.c(i, j + 1, k, i1 + 8);
+ --itemstack.count;
+ return true;
+ }
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/server/ItemFlintAndSteel.java b/src/main/java/net/minecraft/server/ItemFlintAndSteel.java
index 8affb99b..cad14054 100644
--- a/src/main/java/net/minecraft/server/ItemFlintAndSteel.java
+++ b/src/main/java/net/minecraft/server/ItemFlintAndSteel.java
@@ -1,15 +1,14 @@
package net.minecraft.server;
// CraftBukkit start
-import org.bukkit.block.BlockFace;
+import org.bukkit.block.BlockState;
import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.craftbukkit.CraftWorld;
-import org.bukkit.craftbukkit.block.CraftBlock;
-import org.bukkit.craftbukkit.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.block.CraftBlockState;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
import org.bukkit.entity.Player;
-import org.bukkit.event.Event.Type;
-import org.bukkit.event.player.PlayerItemEvent;
import org.bukkit.event.block.BlockIgniteEvent;
+import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.block.BlockIgniteEvent.IgniteCause;
// CraftBukkit end
@@ -22,11 +21,7 @@ public class ItemFlintAndSteel extends Item {
}
public boolean a(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l) {
- // CraftBukkit start - store the clicked block
- CraftWorld craftWorld = ((WorldServer) world).getWorld();
- CraftServer craftServer = ((WorldServer) world).getServer();
- org.bukkit.block.Block blockClicked = craftWorld.getBlockAt(i, j, k);
- // CraftBukkit end
+ int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit;
if (l == 0) {
--j;
@@ -55,34 +50,37 @@ public class ItemFlintAndSteel extends Item {
int i1 = world.getTypeId(i, j, k);
if (i1 == 0) {
- // CraftBukkit start - Flint and steel
- Type eventType = Type.PLAYER_ITEM;
- Player thePlayer = (Player) entityhuman.getBukkitEntity();
- CraftItemStack itemInHand = new CraftItemStack(itemstack);
- BlockFace blockFace = CraftBlock.notchToBlockFace(l);
-
- PlayerItemEvent event = new PlayerItemEvent(eventType, thePlayer, itemInHand, blockClicked, blockFace);
- craftServer.getPluginManager().callEvent(event);
+ // CraftBukkit start - store the clicked block
+ CraftWorld craftWorld = ((WorldServer) world).getWorld();
+ CraftServer craftServer = ((WorldServer) world).getServer();
+ org.bukkit.block.Block blockClicked = craftWorld.getBlockAt(i, j, k);
- boolean preventLighter = event.isCancelled();
+ Player thePlayer = (Player) entityhuman.getBukkitEntity();
IgniteCause igniteCause = BlockIgniteEvent.IgniteCause.FLINT_AND_STEEL;
BlockIgniteEvent eventIgnite = new BlockIgniteEvent(blockClicked, igniteCause, thePlayer);
craftServer.getPluginManager().callEvent(eventIgnite);
boolean preventFire = eventIgnite.isCancelled();
- if (preventLighter) {
- return false;
- }
-
if (preventFire) {
itemstack.b(1);
return false;
}
// CraftBukkit end
+ BlockState blockState = CraftBlockState.getBlockState(world, i, j, k); // CraftBukkit
+
world.a((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, "fire.ignite", 1.0F, b.nextFloat() * 0.4F + 0.8F);
world.e(i, j, k, Block.FIRE.id);
+
+ // CraftBukkit start
+ BlockPlaceEvent placeEvent = CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockState, clickedX, clickedY, clickedZ, Block.FIRE.id);
+
+ if (placeEvent.isCancelled() || !placeEvent.canBuild()) {
+ placeEvent.getBlockPlaced().setTypeIdAndData(0, (byte)0, false);
+ return false;
+ }
+ // CraftBukkit end
}
itemstack.b(1);
diff --git a/src/main/java/net/minecraft/server/ItemHoe.java b/src/main/java/net/minecraft/server/ItemHoe.java
index a8db7f88..3a651a17 100644
--- a/src/main/java/net/minecraft/server/ItemHoe.java
+++ b/src/main/java/net/minecraft/server/ItemHoe.java
@@ -1,14 +1,10 @@
package net.minecraft.server;
// CraftBukkit start
-import org.bukkit.block.BlockFace;
-import org.bukkit.craftbukkit.CraftServer;
-import org.bukkit.craftbukkit.CraftWorld;
-import org.bukkit.craftbukkit.block.CraftBlock;
-import org.bukkit.craftbukkit.inventory.CraftItemStack;
-import org.bukkit.entity.Player;
-import org.bukkit.event.Event.Type;
-import org.bukkit.event.player.PlayerItemEvent;
+import org.bukkit.block.BlockState;
+import org.bukkit.craftbukkit.block.CraftBlockState;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.event.block.BlockPlaceEvent;
// CraftBukkit end
public class ItemHoe extends Item {
@@ -32,25 +28,18 @@ public class ItemHoe extends Item {
if (world.isStatic) {
return true;
} else {
- // CraftBukkit start - Hoes
- CraftWorld craftWorld = ((WorldServer) world).getWorld();
- CraftServer craftServer = ((WorldServer) world).getServer();
+ BlockState blockState = CraftBlockState.getBlockState(world, i, j, k); // CraftBukkit
- Type eventType = Type.PLAYER_ITEM;
- Player who = (entityhuman == null) ? null : (Player) entityhuman.getBukkitEntity();
- org.bukkit.inventory.ItemStack itemInHand = new CraftItemStack(itemstack);
- org.bukkit.block.Block blockClicked = craftWorld.getBlockAt(i, j, k);
- BlockFace blockFace = CraftBlock.notchToBlockFace(l);
-
- PlayerItemEvent event = new PlayerItemEvent(eventType, who, itemInHand, blockClicked, blockFace);
- craftServer.getPluginManager().callEvent(event);
+ world.e(i, j, k, block.id);
- if (event.isCancelled()) {
+ // CraftBukkit start - Hoes - blockface -1 for 'SELF'
+ BlockPlaceEvent event = CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockState, i, j, k, block);
+ if (event.isCancelled() || !event.canBuild()) {
+ event.getBlockPlaced().setTypeId(blockState.getTypeId());
return false;
}
// CraftBukkit end
- world.e(i, j, k, block.id);
itemstack.b(1);
if (world.k.nextInt(8) == 0 && i1 == Block.GRASS.id) {
byte b0 = 1;
diff --git a/src/main/java/net/minecraft/server/ItemRedstone.java b/src/main/java/net/minecraft/server/ItemRedstone.java
index 6c111221..0ba156e6 100644
--- a/src/main/java/net/minecraft/server/ItemRedstone.java
+++ b/src/main/java/net/minecraft/server/ItemRedstone.java
@@ -1,14 +1,10 @@
package net.minecraft.server;
// CraftBukkit start
-import org.bukkit.block.BlockFace;
-import org.bukkit.craftbukkit.CraftServer;
-import org.bukkit.craftbukkit.CraftWorld;
-import org.bukkit.craftbukkit.block.CraftBlock;
-import org.bukkit.craftbukkit.inventory.CraftItemStack;
-import org.bukkit.entity.Player;
-import org.bukkit.event.Event.Type;
-import org.bukkit.event.player.PlayerItemEvent;
+import org.bukkit.block.BlockState;
+import org.bukkit.craftbukkit.block.CraftBlockState;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.event.block.BlockPlaceEvent;
// CraftBukkit end
public class ItemRedstone extends Item {
@@ -18,11 +14,7 @@ public class ItemRedstone extends Item {
}
public boolean a(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l) {
- // CraftBukkit start - store the clicked block
- CraftWorld craftWorld = ((WorldServer) world).getWorld();
- CraftServer craftServer = ((WorldServer) world).getServer();
- org.bukkit.block.Block blockClicked = craftWorld.getBlockAt(i, j, k);
- // CraftBukkit end
+ int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit;
if (l == 0) {
--j;
@@ -52,22 +44,20 @@ public class ItemRedstone extends Item {
return false;
} else {
if (Block.REDSTONE_WIRE.a(world, i, j, k)) {
- // CraftBukkit start - Redstone
- Type eventType = Type.PLAYER_ITEM;
- Player who = (entityhuman == null) ? null : (Player) entityhuman.getBukkitEntity();
- org.bukkit.inventory.ItemStack itemInHand = new CraftItemStack(itemstack);
- BlockFace blockface = CraftBlock.notchToBlockFace(l);
+ BlockState blockState = CraftBlockState.getBlockState(world, i, j, k); // CraftBukkit
- PlayerItemEvent event = new PlayerItemEvent(eventType, who, itemInHand, blockClicked, blockface);
- craftServer.getPluginManager().callEvent(event);
+ world.e(i, j, k, Block.REDSTONE_WIRE.id);
+
+ // CraftBukkit start - redstone
+ BlockPlaceEvent event = CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockState, clickedX, clickedY, clickedZ, Block.REDSTONE_WIRE);
- if (event.isCancelled()) {
+ if (event.isCancelled() || !event.canBuild()) {
+ event.getBlockPlaced().setTypeIdAndData(blockState.getTypeId(), blockState.getRawData(), false);
return false;
}
// CraftBukkit end
- --itemstack.count;
- world.e(i, j, k, Block.REDSTONE_WIRE.id);
+ --itemstack.count; // CraftBukkit -- ORDER MATTERS
}
return true;
diff --git a/src/main/java/net/minecraft/server/ItemReed.java b/src/main/java/net/minecraft/server/ItemReed.java
index 159dbe22..49338122 100644
--- a/src/main/java/net/minecraft/server/ItemReed.java
+++ b/src/main/java/net/minecraft/server/ItemReed.java
@@ -1,16 +1,10 @@
package net.minecraft.server;
// CraftBukkit start
-import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
-import org.bukkit.craftbukkit.block.CraftBlock;
import org.bukkit.craftbukkit.block.CraftBlockState;
-import org.bukkit.craftbukkit.inventory.CraftItemStack;
-import org.bukkit.entity.Player;
-import org.bukkit.event.Event.Type;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
import org.bukkit.event.block.BlockPlaceEvent;
-import org.bukkit.Material;
-import org.bukkit.event.player.PlayerVegetationPlantEvent;
// CraftBukkit end
public class ItemReed extends Item {
@@ -23,14 +17,7 @@ public class ItemReed extends Item {
}
public boolean a(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l) {
- // CraftBukkit start -- Bail if we have nothing of the item in hand
- if (itemstack.count == 0) {
- return false;
- }
-
- CraftBlock blockClicked = (CraftBlock) ((WorldServer) world).getWorld().getBlockAt(i, j, k);
- BlockFace faceClicked = CraftBlock.notchToBlockFace(l);
- // CraftBukkit end
+ int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit;
if (world.getTypeId(i, j, k) == Block.SNOW.id) {
l = 0;
@@ -63,23 +50,11 @@ public class ItemReed extends Item {
if (itemstack.count == 0) {
return false;
} else {
- // CraftBukkit start
- /* We store the old data so we can undo it. Snow(78) and half-steps(44) are special in that they replace the block itself,
- * rather than the block touching the face we clicked on.
- */
- int typeId = blockClicked.getTypeId();
- org.bukkit.block.Block placedBlock = blockClicked.getFace(faceClicked);
-
- if (typeId == Block.SNOW.id || (typeId == Block.STEP.id && itemstack.id == Block.STEP.id && faceClicked == BlockFace.UP))
- placedBlock = blockClicked;
-
- final BlockState replacedBlockState = new CraftBlockState(placedBlock);
- // CraftBukkit end
-
if (world.a(this.a, i, j, k, false)) {
Block block = Block.byId[this.a];
// CraftBukkit start - This executes the placement of the block
+ BlockState replacedBlockState = CraftBlockState.getBlockState(world, i, j, k); // CraftBukkit
/**
* @see net.minecraft.server.World#e(int i, int j, int k, int l)
*
@@ -91,22 +66,7 @@ public class ItemReed extends Item {
* replace this with.
*/
if (world.setTypeId(i, j, k, this.a)) { // <-- world.e does this to place the block
- org.bukkit.Server server = ((WorldServer) world).getServer();
- Type eventType = Type.BLOCK_PLACE;
- org.bukkit.inventory.ItemStack itemInHand = new CraftItemStack(itemstack);
- Player thePlayer = (entityhuman == null) ? null : (Player) entityhuman.getBukkitEntity();
-
- ChunkCoordinates chunkcoordinates = world.l();
- int spawnX = chunkcoordinates.a;
- int spawnZ = chunkcoordinates.c;
-
- int distanceFromSpawn = (int) Math.max(Math.abs(i - spawnX), Math.abs(k - spawnZ));
-
- // CraftBukkit Configurable spawn protection start
- boolean canBuild = distanceFromSpawn > ((WorldServer) world).x.spawnProtection || thePlayer.isOp();
-
- BlockPlaceEvent event = new BlockPlaceEvent(eventType, placedBlock, replacedBlockState, blockClicked, itemInHand, thePlayer, canBuild);
- server.getPluginManager().callEvent(event);
+ BlockPlaceEvent event = CraftEventFactory.callBlockPlaceEvent(world, entityhuman, replacedBlockState, clickedX, clickedY, clickedZ, block);
if (event.isCancelled() || !event.canBuild()) {
// CraftBukkit Undo -- this only has reed, repeater and pie blocks
diff --git a/src/main/java/net/minecraft/server/ItemSeeds.java b/src/main/java/net/minecraft/server/ItemSeeds.java
index 8599ddfc..79de16ef 100644
--- a/src/main/java/net/minecraft/server/ItemSeeds.java
+++ b/src/main/java/net/minecraft/server/ItemSeeds.java
@@ -1,14 +1,10 @@
package net.minecraft.server;
// CraftBukkit start
-import org.bukkit.block.BlockFace;
-import org.bukkit.craftbukkit.CraftServer;
-import org.bukkit.craftbukkit.CraftWorld;
-import org.bukkit.craftbukkit.block.CraftBlock;
-import org.bukkit.craftbukkit.inventory.CraftItemStack;
-import org.bukkit.entity.Player;
-import org.bukkit.event.Event.Type;
-import org.bukkit.event.player.PlayerItemEvent;
+import org.bukkit.block.BlockState;
+import org.bukkit.craftbukkit.block.CraftBlockState;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.event.block.BlockPlaceEvent;
// CraftBukkit end
public class ItemSeeds extends Item {
@@ -27,25 +23,17 @@ public class ItemSeeds extends Item {
int i1 = world.getTypeId(i, j, k);
if (i1 == Block.SOIL.id && world.isEmpty(i, j + 1, k)) {
- // CraftBukkit start - Seeds
- CraftWorld craftWorld = ((WorldServer) world).getWorld();
- CraftServer craftServer = ((WorldServer) world).getServer();
+ BlockState blockState = CraftBlockState.getBlockState( world, i, j + 1, k); // CraftBukkit
- Type eventType = Type.PLAYER_ITEM;
- Player who = (entityhuman == null) ? null : (Player) entityhuman.getBukkitEntity();
- org.bukkit.inventory.ItemStack itemInHand = new CraftItemStack(itemstack);
- org.bukkit.block.Block blockClicked = craftWorld.getBlockAt(i, j, k);
- BlockFace blockface = CraftBlock.notchToBlockFace(l);
-
- PlayerItemEvent event = new PlayerItemEvent(eventType, who, itemInHand, blockClicked, blockface);
- craftServer.getPluginManager().callEvent(event);
+ world.e(i, j + 1, k, this.a);
- if (event.isCancelled()) {
+ // CraftBukkit start - seeds
+ BlockPlaceEvent event = CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockState, i, j, k, this.a);
+ if (event.isCancelled() || !event.canBuild()) {
+ event.getBlockPlaced().setTypeId(0);
return false;
}
// CraftBukkit end
-
- world.e(i, j + 1, k, this.a);
--itemstack.count;
return true;
} else {
diff --git a/src/main/java/net/minecraft/server/ItemSign.java b/src/main/java/net/minecraft/server/ItemSign.java
index d2e6bcaa..959522c5 100644
--- a/src/main/java/net/minecraft/server/ItemSign.java
+++ b/src/main/java/net/minecraft/server/ItemSign.java
@@ -1,14 +1,10 @@
package net.minecraft.server;
// CraftBukkit start
-import org.bukkit.block.BlockFace;
-import org.bukkit.craftbukkit.CraftServer;
-import org.bukkit.craftbukkit.CraftWorld;
-import org.bukkit.craftbukkit.block.CraftBlock;
-import org.bukkit.craftbukkit.inventory.CraftItemStack;
-import org.bukkit.entity.Player;
-import org.bukkit.event.Event.Type;
-import org.bukkit.event.player.PlayerItemEvent;
+import org.bukkit.block.BlockState;
+import org.bukkit.craftbukkit.block.CraftBlockState;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.event.block.BlockPlaceEvent;
// CraftBukkit end
public class ItemSign extends Item {
@@ -25,11 +21,7 @@ public class ItemSign extends Item {
} else if (!world.getMaterial(i, j, k).isBuildable()) {
return false;
} else {
- // CraftBukkit start - store the clicked block
- CraftWorld craftWorld = ((WorldServer) world).getWorld();
- CraftServer craftServer = ((WorldServer) world).getServer();
- org.bukkit.block.Block blockClicked = craftWorld.getBlockAt(i, j, k);
- // CraftBukkit end
+ int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit;
if (l == 1) {
++j;
@@ -54,20 +46,7 @@ public class ItemSign extends Item {
if (!Block.SIGN_POST.a(world, i, j, k)) {
return false;
} else {
- // CraftBukkit start
- // Signs
- Type eventType = Type.PLAYER_ITEM;
- Player who = (entityhuman == null) ? null : (Player) entityhuman.getBukkitEntity();
- org.bukkit.inventory.ItemStack itemInHand = new CraftItemStack(itemstack);
- BlockFace blockface = CraftBlock.notchToBlockFace(l);
-
- PlayerItemEvent event = new PlayerItemEvent(eventType, who, itemInHand, blockClicked, blockface);
- craftServer.getPluginManager().callEvent(event);
-
- if (event.isCancelled()) {
- return false;
- }
- // CraftBukkit end
+ BlockState blockState = CraftBlockState.getBlockState(world, i, j, k); // CraftBukkit
if (l == 1) {
world.b(i, j, k, Block.SIGN_POST.id, MathHelper.b((double) ((entityhuman.yaw + 180.0F) * 16.0F / 360.0F) + 0.5D) & 15);
@@ -75,6 +54,15 @@ public class ItemSign extends Item {
world.b(i, j, k, Block.WALL_SIGN.id, l);
}
+ // CraftBukkit start - sign
+ BlockPlaceEvent event = CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockState, clickedX, clickedY, clickedZ, l == 1 ? Block.SIGN_POST : Block.WALL_SIGN);
+
+ if (event.isCancelled() || !event.canBuild()) {
+ event.getBlockPlaced().setTypeIdAndData(blockState.getTypeId(), blockState.getRawData(), false);
+ return false;
+ }
+ // CraftBukkit end
+
--itemstack.count;
TileEntitySign tileentitysign = (TileEntitySign) world.getTileEntity(i, j, k);
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java
index 9475b146..ad5bc042 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java
@@ -10,6 +10,7 @@ import org.bukkit.block.BlockState;
import org.bukkit.craftbukkit.CraftChunk;
import org.bukkit.craftbukkit.CraftWorld;
import org.bukkit.material.MaterialData;
+import net.minecraft.server.WorldServer;
public class CraftBlockState implements BlockState {
private final CraftWorld world;
@@ -33,6 +34,10 @@ public class CraftBlockState implements BlockState {
createData(block.getData());
}
+ public static BlockState getBlockState( net.minecraft.server.World world, int x, int y, int z) {
+ return new CraftBlockState( ((WorldServer) world).getWorld().getBlockAt(x, y, z) );
+ }
+
/**
* Gets the world which contains this Block
*
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
new file mode 100644
index 00000000..275b13ba
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -0,0 +1,103 @@
+package org.bukkit.craftbukkit.event;
+
+import net.minecraft.server.ChunkCoordinates;
+import net.minecraft.server.EntityHuman;
+import net.minecraft.server.Item;
+import net.minecraft.server.ItemStack;
+import net.minecraft.server.World;
+import net.minecraft.server.WorldServer;
+
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.block.BlockFace;
+import org.bukkit.block.BlockState;
+import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.craftbukkit.CraftWorld;
+import org.bukkit.craftbukkit.block.CraftBlock;
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
+import org.bukkit.entity.Player;
+import org.bukkit.event.Event.Type;
+import org.bukkit.event.block.BlockPlaceEvent;
+import org.bukkit.event.player.PlayerBucketEmptyEvent;
+import org.bukkit.event.player.PlayerBucketFillEvent;
+import org.bukkit.event.player.PlayerEvent;
+
+public class CraftEventFactory {
+ private static boolean canBuild(CraftWorld world, Player player, int x, int z) {
+ WorldServer worldServer = world.getHandle();
+ int spawnSize = worldServer.x.spawnProtection;
+
+ if (spawnSize <= 0) return true;
+ if (player.isOp()) return true;
+
+ ChunkCoordinates chunkcoordinates = worldServer.l();
+
+ int distanceFromSpawn = (int) Math.max(Math.abs(x - chunkcoordinates.a), Math.abs(z - chunkcoordinates.c));
+ return distanceFromSpawn > spawnSize;
+ }
+
+ /**
+ * Block place methods
+ */
+ public static BlockPlaceEvent callBlockPlaceEvent(World world, EntityHuman who, BlockState replacedBlockState, int clickedX, int clickedY, int clickedZ, int type) {
+ return callBlockPlaceEvent(world, who, replacedBlockState, clickedX, clickedY, clickedZ, net.minecraft.server.Block.byId[type]);
+ }
+
+ public static BlockPlaceEvent callBlockPlaceEvent(World world, EntityHuman who, BlockState replacedBlockState, int clickedX, int clickedY, int clickedZ, net.minecraft.server.Block block) {
+ return callBlockPlaceEvent(world, who, replacedBlockState, clickedX, clickedY, clickedZ, new ItemStack(block));
+ }
+
+ public static BlockPlaceEvent callBlockPlaceEvent(World world, EntityHuman who, BlockState replacedBlockState, int clickedX, int clickedY, int clickedZ, ItemStack itemstack) {
+ CraftWorld craftWorld = ((WorldServer) world).getWorld();
+ CraftServer craftServer = ((WorldServer) world).getServer();
+
+ Player player = (who == null) ? null : (Player) who.getBukkitEntity();
+ CraftItemStack itemInHand = new CraftItemStack(itemstack);
+
+ Block blockClicked = craftWorld.getBlockAt(clickedX, clickedY, clickedZ);
+ Block placedBlock = replacedBlockState.getBlock();
+
+ boolean canBuild = canBuild(craftWorld, player, placedBlock.getX(), placedBlock.getZ());
+
+ BlockPlaceEvent event = new BlockPlaceEvent(Type.BLOCK_PLACE, placedBlock, replacedBlockState, blockClicked, itemInHand, player, canBuild);
+ craftServer.getPluginManager().callEvent(event);
+
+ return event;
+ }
+
+ /**
+ * Bucket methods
+ */
+ public static PlayerBucketEmptyEvent callPlayerBucketEmptyEvent(EntityHuman who, int clickedX, int clickedY, int clickedZ, int clickedFace, ItemStack itemInHand) {
+ return (PlayerBucketEmptyEvent) getPlayerBucketEvent(Type.PLAYER_BUCKET_EMPTY, who, clickedX, clickedY, clickedZ, clickedFace, itemInHand, Item.BUCKET);
+ }
+
+ public static PlayerBucketFillEvent callPlayerBucketFillEvent(EntityHuman who, int clickedX, int clickedY, int clickedZ, int clickedFace, ItemStack itemInHand, net.minecraft.server.Item bucket) {
+ return (PlayerBucketFillEvent) getPlayerBucketEvent(Type.PLAYER_BUCKET_FILL, who, clickedX, clickedY, clickedZ, clickedFace, itemInHand, bucket);
+ }
+
+ private static PlayerEvent getPlayerBucketEvent(Type type, EntityHuman who, int clickedX, int clickedY, int clickedZ, int clickedFace, ItemStack itemstack, net.minecraft.server.Item item) {
+ Player player = (who == null) ? null : (Player) who.getBukkitEntity();
+ CraftItemStack itemInHand = new CraftItemStack(new ItemStack(item));
+ Material bucket = Material.getMaterial(itemstack.id);
+
+ CraftWorld craftWorld = (CraftWorld) player.getWorld();
+ CraftServer craftServer = (CraftServer) player.getServer();
+
+ Block blockClicked = craftWorld.getBlockAt(clickedX, clickedY, clickedZ);
+ BlockFace blockFace = CraftBlock.notchToBlockFace(clickedFace);
+
+ PlayerEvent event = null;
+ if (type == Type.PLAYER_BUCKET_EMPTY) {
+ event = new PlayerBucketEmptyEvent(player, blockClicked, blockFace, bucket, itemInHand);
+ ((PlayerBucketEmptyEvent) event).setCancelled(!canBuild(craftWorld, player, clickedX, clickedZ));
+ } else if(type == Type.PLAYER_BUCKET_FILL) {
+ event = new PlayerBucketFillEvent(player, blockClicked, blockFace, bucket, itemInHand);
+ ((PlayerBucketFillEvent) event).setCancelled(!canBuild(craftWorld, player, clickedX, clickedZ));
+ }
+
+ craftServer.getPluginManager().callEvent(event);
+
+ return event;
+ }
+}