package game.item; import game.block.Block; import game.block.BlockSlab; import game.entity.npc.EntityNPC; import game.world.BlockPos; import game.world.Facing; import game.world.State; import game.world.World; public class ItemSlab extends ItemBlock { private final BlockSlab slab; public ItemSlab(BlockSlab slab) { super(slab); this.slab = slab; // this.setMaxDamage(0); // this.setHasSubtypes(true); } // /** // * Converts the given ItemStack damage value into a metadata value to be placed in the world when this Item is // * placed as a Block (mostly used with ItemBlocks). // */ // public int getMetadata(int damage) // { // return damage; // } // /** // * Returns the unlocalized name of this item. This version accepts an ItemStack so different stacks can have // * different names based on their damage or NBT. // */ // public String getUnlocalizedName(ItemStack stack) // { // return this.slab.getUnlocalizedName(stack.getMetadata()); // } /** * Called when a Block is right-clicked with this Item */ public boolean onItemUse(ItemStack stack, EntityNPC playerIn, World worldIn, BlockPos pos, Facing side, float hitX, float hitY, float hitZ) { if (stack.stackSize == 0) { return false; } else if (!playerIn.canPlayerEdit(pos.offset(side), side, stack)) { return false; } else { // Object object = this.slab.getVariant(stack); State iblockstate = worldIn.getState(pos); if (iblockstate.getBlock() == this.slab) { // IProperty iproperty = this.slab.getVariantProperty(); // Comparable comparable = iblockstate.getValue(iproperty); Facing blockslab$enumblockhalf = iblockstate.getValue(BlockSlab.FACING); if ((side == Facing.UP && blockslab$enumblockhalf == Facing.DOWN || side == Facing.DOWN && blockslab$enumblockhalf == Facing.UP) && !iblockstate.getValue(BlockSlab.DOUBLE)) { State iblockstate1 = this.slab.getState().withProperty(BlockSlab.DOUBLE, true); if (worldIn.checkNoEntityCollision(this.slab.getCollisionBoundingBox(worldIn, pos, iblockstate1)) && worldIn.setState(pos, iblockstate1, 3)) { worldIn.playSound(this.slab.sound.getPlaceSound(), (double)((float)pos.getX() + 0.5F), (double)((float)pos.getY() + 0.5F), (double)((float)pos.getZ() + 0.5F), (this.slab.sound.getVolume() + 1.0F) / 2.0F); --stack.stackSize; } return true; } } return this.tryPlace(stack, worldIn, pos.offset(side)) ? true : (this.tryVerticalPlace(stack, playerIn, worldIn, pos, side, hitX, hitY, hitZ) ? true : super.onItemUse(stack, playerIn, worldIn, pos, side, hitX, hitY, hitZ)); } } public boolean canPlaceBlockOnSide(World worldIn, BlockPos pos, Facing side, EntityNPC player, ItemStack stack) { BlockPos blockpos = pos; // IProperty iproperty = this.slab.getVariantProperty(); // Object object = this.slab.getVariant(stack); State iblockstate = worldIn.getState(pos); if (iblockstate.getBlock() == this.slab && !iblockstate.getValue(BlockSlab.DOUBLE)) { boolean up = iblockstate.getValue(BlockSlab.FACING) == Facing.UP; if ((side == Facing.UP && !up || side == Facing.DOWN && up)) // && object == iblockstate.getValue(iproperty)) { return true; } } pos = pos.offset(side); State iblockstate1 = worldIn.getState(pos); return iblockstate1.getBlock() == this.slab && !iblockstate1.getValue(BlockSlab.DOUBLE) ? true : super.canPlaceBlockOnSide(worldIn, blockpos, side, player, stack); } // private boolean tryPlaceNormal(ItemStack stack, EntityNPC playerIn, World worldIn, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ) { // if (worldIn.canBlockBePlaced(this.block, pos, false, side, (Entity)null, stack)) // { // int i = this.getMetadata(stack.getMetadata()); // IBlockState iblockstate1 = this.block.onBlockPlaced(worldIn, pos, side, hitX, hitY, hitZ, i, playerIn); // // if (worldIn.setBlockState(pos, iblockstate1, 3)) // { // iblockstate1 = worldIn.getBlockState(pos); // // if (iblockstate1.getBlock() == this.block) // { // setTileEntityNBT(worldIn, playerIn, pos, stack); // this.block.onBlockPlacedBy(worldIn, pos, iblockstate1, playerIn, stack); // } // // worldIn.playSound(this.block.stepSound.getPlaceSound(), (double)((float)pos.getX() + 0.5F), (double)((float)pos.getY() + 0.5F), (double)((float)pos.getZ() + 0.5F), (this.block.stepSound.getVolume() + 1.0F) / 2.0F, this.block.stepSound.getFrequency() * 0.8F); // --stack.stackSize; // } // // return true; // } // // return false; // } private boolean tryPlace(ItemStack stack, World worldIn, BlockPos pos) { State iblockstate = worldIn.getState(pos); if (iblockstate.getBlock() == this.slab) { // Comparable comparable = iblockstate.getValue(this.slab.getVariantProperty()); if (!iblockstate.getValue(BlockSlab.DOUBLE)) { State iblockstate1 = this.slab.getState().withProperty(BlockSlab.DOUBLE, true); if (worldIn.checkNoEntityCollision(this.slab.getCollisionBoundingBox(worldIn, pos, iblockstate1)) && worldIn.setState(pos, iblockstate1, 3)) { worldIn.playSound(this.slab.sound.getPlaceSound(), (double)((float)pos.getX() + 0.5F), (double)((float)pos.getY() + 0.5F), (double)((float)pos.getZ() + 0.5F), (this.slab.sound.getVolume() + 1.0F) / 2.0F); --stack.stackSize; } return true; } } return false; } private boolean tryVerticalPlace(ItemStack stack, EntityNPC playerIn, World worldIn, BlockPos pos, Facing side, float hitX, float hitY, float hitZ) { if(hitY >= 0.34f && hitY <= 0.66f) { State iblockstate = worldIn.getState(pos); Block block = iblockstate.getBlock(); if (!block.isReplaceable(worldIn, pos)) { pos = pos.offset(side); } // BlockVerticalSlab vslab = (stack.getMetadata() & 7) < 4 ? this.verticalSlab1 : this.verticalSlab2; if (worldIn.canBlockBePlaced(this.slab, pos, false, side, null, stack)) { // int i = this.getMetadata(stack.getMetadata()); State iblockstate1 = this.slab.getState().withProperty(BlockSlab.FACING, playerIn.getHorizontalFacing()); // .onBlockPlaced(worldIn, pos, side, hitX, hitY, hitZ, i, playerIn); if (worldIn.setState(pos, iblockstate1, 3)) { worldIn.playSound(this.slab.sound.getPlaceSound(), (double)((float)pos.getX() + 0.5F), (double)((float)pos.getY() + 0.5F), (double)((float)pos.getZ() + 0.5F), (this.slab.sound.getVolume() + 1.0F) / 2.0F); --stack.stackSize; } return true; } } return false; } }