package game.item; import java.util.List; import game.block.Block; import game.color.TextColor; import game.entity.Entity; import game.entity.npc.EntityNPC; import game.init.BlockRegistry; import game.init.Blocks; import game.nbt.NBTTagCompound; import game.renderer.blockmodel.ModelBlock; import game.renderer.blockmodel.Transforms; import game.tileentity.TileEntity; import game.world.BlockPos; import game.world.Facing; import game.world.State; import game.world.World; public class ItemBlock extends Item { protected final Block block; protected final String flatTexture; public ItemBlock(Block block, String flatTexture) { this.block = block; this.flatTexture = flatTexture; } public ItemBlock(Block block) { this(block, null); } /** * Sets the unlocalized name of this item to the string passed as the parameter, prefixed by "item." */ public ItemBlock setDisplay(String unlocalizedName) { super.setDisplay(unlocalizedName); return this; } public ItemBlock setColor(TextColor color) { super.setColor(color); return this; } /** * 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) { State iblockstate = worldIn.getState(pos); Block block = iblockstate.getBlock(); if (!block.isReplaceable(worldIn, pos)) { pos = pos.offset(side); } if (stack.stackSize == 0) { return false; } else if (!playerIn.canPlayerEdit(pos, side, stack)) { return false; } else if (worldIn.canBlockBePlaced(this.block, pos, false, side, (Entity)null, stack)) { int i = this.getMetadata(stack.getMetadata()); State iblockstate1 = this.block.onBlockPlaced(worldIn, pos, side, hitX, hitY, hitZ, i, playerIn); if (worldIn.setState(pos, iblockstate1, 3)) { iblockstate1 = worldIn.getState(pos); if (iblockstate1.getBlock() == this.block) { setTileEntityNBT(worldIn, playerIn, pos, stack); this.block.onBlockPlacedBy(worldIn, pos, iblockstate1, playerIn, stack); } worldIn.playSound(this.block.sound.getPlaceSound(), (double)((float)pos.getX() + 0.5F), (double)((float)pos.getY() + 0.5F), (double)((float)pos.getZ() + 0.5F), (this.block.sound.getVolume() + 1.0F) / 2.0F, this.block.sound.getFrequency() * 0.8F); --stack.stackSize; } return true; } else { return false; } } public static boolean setTileEntityNBT(World worldIn, EntityNPC pos, BlockPos stack, ItemStack p_179224_3_) { // Server server = Server.getServer(); // // if (server == null) // { // return false; // } // else // { if (p_179224_3_.hasTagCompound() && p_179224_3_.getTagCompound().hasKey("BlockEntityTag", 10)) { TileEntity tileentity = worldIn.getTileEntity(stack); if (tileentity != null) { if (!worldIn.client /* && tileentity.hasSpecialNBT() */ && !pos.connection.isAdmin()) { return false; } NBTTagCompound nbttagcompound = new NBTTagCompound(); NBTTagCompound nbttagcompound1 = (NBTTagCompound)nbttagcompound.copy(); tileentity.writeToNBT(nbttagcompound); NBTTagCompound nbttagcompound2 = (NBTTagCompound)p_179224_3_.getTagCompound().getTag("BlockEntityTag"); nbttagcompound.merge(nbttagcompound2); nbttagcompound.setInteger("x", stack.getX()); nbttagcompound.setInteger("y", stack.getY()); nbttagcompound.setInteger("z", stack.getZ()); if (!nbttagcompound.equals(nbttagcompound1)) { tileentity.readFromNBT(nbttagcompound); tileentity.markDirty(); return true; } } } return false; // } } public boolean canPlaceBlockOnSide(World worldIn, BlockPos pos, Facing side, EntityNPC player, ItemStack stack) { Block block = worldIn.getState(pos).getBlock(); if (block == Blocks.snow_layer) { side = Facing.UP; } else if (!block.isReplaceable(worldIn, pos)) { pos = pos.offset(side); } return worldIn.canBlockBePlaced(this.block, pos, false, side, (Entity)null, stack); } /** * 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 getDisplay(ItemStack stack) { return this.block.getDisplay(); } // /** // * Returns the unlocalized name of this item. // */ // public String getUnlocalizedName() // { // return this.block.getUnlocalizedName(); // } /** * gets the tab this item is displayed on */ public CheatTab getTab() { return this.block.getTab(); } /** * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) */ public void getSubItems(Item itemIn, CheatTab tab, List subItems) { this.block.getSubBlocks(itemIn, tab, subItems); } public Block getBlock() { return this.block; } // public Set getValidTags() { // return Sets.newHashSet("BlockEntityTag"); // } // // protected boolean validateNbt(NBTTagCompound tag) { // if(tag.hasKey("BlockEntityTag")) { // if(!tag.hasKey("BlockEntityTag", 10)) { // return false; // } // } // return true; // } public boolean isMagnetic() { return this.block.isMagnetic(); } public Transforms getTransform() { return this.flatTexture != null ? super.getTransform() : this.block.getTransform(); } public ModelBlock getModel(String name, int meta) { return this.flatTexture != null ? new ModelBlock(this.getTransform(), !this.flatTexture.isEmpty() ? this.flatTexture : this.block.getModel(BlockRegistry.REGISTRY.getNameForObject(this.block).toString(), this.block.getStateFromMeta(this.getMetadata(meta))).getPrimary() /* "blocks/" + name */) : new ModelBlock(this.block.getModel(BlockRegistry.REGISTRY.getNameForObject(this.block).toString(), this.block.getStateFromMeta(this.getMetadata(meta))), this.getTransform()); } }