001    package org.bukkit.event.block;
002    
003    import org.bukkit.block.Block;
004    import org.bukkit.block.BlockState;
005    import org.bukkit.entity.Player;
006    import org.bukkit.event.Cancellable;
007    import org.bukkit.event.HandlerList;
008    import org.bukkit.inventory.ItemStack;
009    
010    /**
011     * Called when a block is placed by a player.
012     * <p>
013     * If a Block Place event is cancelled, the block will not be placed.
014     */
015    public class BlockPlaceEvent extends BlockEvent implements Cancellable {
016        private static final HandlerList handlers = new HandlerList();
017        protected boolean cancel;
018        protected boolean canBuild;
019        protected Block placedAgainst;
020        protected BlockState replacedBlockState;
021        protected ItemStack itemInHand;
022        protected Player player;
023    
024        public BlockPlaceEvent(final Block placedBlock, final BlockState replacedBlockState, final Block placedAgainst, final ItemStack itemInHand, final Player thePlayer, final boolean canBuild) {
025            super(placedBlock);
026            this.placedAgainst = placedAgainst;
027            this.itemInHand = itemInHand;
028            this.player = thePlayer;
029            this.replacedBlockState = replacedBlockState;
030            this.canBuild = canBuild;
031            cancel = false;
032        }
033    
034        public boolean isCancelled() {
035            return cancel;
036        }
037    
038        public void setCancelled(boolean cancel) {
039            this.cancel = cancel;
040        }
041    
042        /**
043         * Gets the player who placed the block involved in this event.
044         *
045         * @return The Player who placed the block involved in this event
046         */
047        public Player getPlayer() {
048            return player;
049        }
050    
051        /**
052         * Clarity method for getting the placed block. Not really needed except
053         * for reasons of clarity.
054         *
055         * @return The Block that was placed
056         */
057        public Block getBlockPlaced() {
058            return getBlock();
059        }
060    
061        /**
062         * Gets the BlockState for the block which was replaced. Material type air
063         * mostly.
064         *
065         * @return The BlockState for the block which was replaced.
066         */
067        public BlockState getBlockReplacedState() {
068            return this.replacedBlockState;
069        }
070    
071        /**
072         * Gets the block that this block was placed against
073         *
074         * @return Block the block that the new block was placed against
075         */
076        public Block getBlockAgainst() {
077            return placedAgainst;
078        }
079    
080        /**
081         * Gets the item in the player's hand when they placed the block.
082         *
083         * @return The ItemStack for the item in the player's hand when they
084         *     placed the block
085         */
086        public ItemStack getItemInHand() {
087            return itemInHand;
088        }
089    
090        /**
091         * Gets the value whether the player would be allowed to build here.
092         * Defaults to spawn if the server was going to stop them (such as, the
093         * player is in Spawn). Note that this is an entirely different check
094         * than BLOCK_CANBUILD, as this refers to a player, not universe-physics
095         * rule like cactus on dirt.
096         *
097         * @return boolean whether the server would allow a player to build here
098         */
099        public boolean canBuild() {
100            return this.canBuild;
101        }
102    
103        /**
104         * Sets the canBuild state of this event. Set to true if you want the
105         * player to be able to build.
106         *
107         * @param canBuild true if you want the player to be able to build
108         */
109        public void setBuild(boolean canBuild) {
110            this.canBuild = canBuild;
111        }
112    
113        @Override
114        public HandlerList getHandlers() {
115            return handlers;
116        }
117    
118        public static HandlerList getHandlerList() {
119            return handlers;
120        }
121    }