001 package net.minecraft.block;
002
003 import cpw.mods.fml.relauncher.Side;
004 import cpw.mods.fml.relauncher.SideOnly;
005 import java.util.Random;
006 import net.minecraft.block.material.Material;
007 import net.minecraft.item.Item;
008 import net.minecraft.tileentity.TileEntity;
009 import net.minecraft.util.AxisAlignedBB;
010 import net.minecraft.world.IBlockAccess;
011 import net.minecraft.world.World;
012
013 public class BlockSign extends BlockContainer
014 {
015 private Class signEntityClass;
016
017 /** Whether this is a freestanding sign or a wall-mounted sign */
018 private boolean isFreestanding;
019
020 protected BlockSign(int par1, Class par2Class, boolean par3)
021 {
022 super(par1, Material.wood);
023 this.isFreestanding = par3;
024 this.blockIndexInTexture = 4;
025 this.signEntityClass = par2Class;
026 float var4 = 0.25F;
027 float var5 = 1.0F;
028 this.setBlockBounds(0.5F - var4, 0.0F, 0.5F - var4, 0.5F + var4, var5, 0.5F + var4);
029 }
030
031 /**
032 * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been
033 * cleared to be reused)
034 */
035 public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
036 {
037 return null;
038 }
039
040 @SideOnly(Side.CLIENT)
041
042 /**
043 * Returns the bounding box of the wired rectangular prism to render.
044 */
045 public AxisAlignedBB getSelectedBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
046 {
047 this.setBlockBoundsBasedOnState(par1World, par2, par3, par4);
048 return super.getSelectedBoundingBoxFromPool(par1World, par2, par3, par4);
049 }
050
051 /**
052 * Updates the blocks bounds based on its current state. Args: world, x, y, z
053 */
054 public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
055 {
056 if (!this.isFreestanding)
057 {
058 int var5 = par1IBlockAccess.getBlockMetadata(par2, par3, par4);
059 float var6 = 0.28125F;
060 float var7 = 0.78125F;
061 float var8 = 0.0F;
062 float var9 = 1.0F;
063 float var10 = 0.125F;
064 this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
065
066 if (var5 == 2)
067 {
068 this.setBlockBounds(var8, var6, 1.0F - var10, var9, var7, 1.0F);
069 }
070
071 if (var5 == 3)
072 {
073 this.setBlockBounds(var8, var6, 0.0F, var9, var7, var10);
074 }
075
076 if (var5 == 4)
077 {
078 this.setBlockBounds(1.0F - var10, var6, var8, 1.0F, var7, var9);
079 }
080
081 if (var5 == 5)
082 {
083 this.setBlockBounds(0.0F, var6, var8, var10, var7, var9);
084 }
085 }
086 }
087
088 /**
089 * The type of render function that is called for this block
090 */
091 public int getRenderType()
092 {
093 return -1;
094 }
095
096 /**
097 * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
098 */
099 public boolean renderAsNormalBlock()
100 {
101 return false;
102 }
103
104 public boolean getBlocksMovement(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
105 {
106 return true;
107 }
108
109 /**
110 * Is this block (a) opaque and (b) a full 1m cube? This determines whether or not to render the shared face of two
111 * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
112 */
113 public boolean isOpaqueCube()
114 {
115 return false;
116 }
117
118 /**
119 * Returns a new instance of a block's tile entity class. Called on placing the block.
120 */
121 public TileEntity createNewTileEntity(World par1World)
122 {
123 try
124 {
125 return (TileEntity)this.signEntityClass.newInstance();
126 }
127 catch (Exception var3)
128 {
129 throw new RuntimeException(var3);
130 }
131 }
132
133 /**
134 * Returns the ID of the items to drop on destruction.
135 */
136 public int idDropped(int par1, Random par2Random, int par3)
137 {
138 return Item.sign.itemID;
139 }
140
141 /**
142 * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are
143 * their own) Args: x, y, z, neighbor blockID
144 */
145 public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5)
146 {
147 boolean var6 = false;
148
149 if (this.isFreestanding)
150 {
151 if (!par1World.getBlockMaterial(par2, par3 - 1, par4).isSolid())
152 {
153 var6 = true;
154 }
155 }
156 else
157 {
158 int var7 = par1World.getBlockMetadata(par2, par3, par4);
159 var6 = true;
160
161 if (var7 == 2 && par1World.getBlockMaterial(par2, par3, par4 + 1).isSolid())
162 {
163 var6 = false;
164 }
165
166 if (var7 == 3 && par1World.getBlockMaterial(par2, par3, par4 - 1).isSolid())
167 {
168 var6 = false;
169 }
170
171 if (var7 == 4 && par1World.getBlockMaterial(par2 + 1, par3, par4).isSolid())
172 {
173 var6 = false;
174 }
175
176 if (var7 == 5 && par1World.getBlockMaterial(par2 - 1, par3, par4).isSolid())
177 {
178 var6 = false;
179 }
180 }
181
182 if (var6)
183 {
184 this.dropBlockAsItem(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), 0);
185 par1World.setBlockWithNotify(par2, par3, par4, 0);
186 }
187
188 super.onNeighborBlockChange(par1World, par2, par3, par4, par5);
189 }
190
191 @SideOnly(Side.CLIENT)
192
193 /**
194 * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative)
195 */
196 public int idPicked(World par1World, int par2, int par3, int par4)
197 {
198 return Item.sign.itemID;
199 }
200 }