001    package net.minecraft.src;
002    
003    import cpw.mods.fml.common.Side;
004    import cpw.mods.fml.common.asm.SideOnly;
005    import java.util.List;
006    import java.util.Random;
007    
008    public class BlockTripWire extends Block
009    {
010        public BlockTripWire(int par1)
011        {
012            super(par1, 173, Material.circuits);
013            this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.15625F, 1.0F);
014            this.setTickRandomly(true);
015        }
016    
017        /**
018         * How many world ticks before ticking
019         */
020        public int tickRate()
021        {
022            return 10;
023        }
024    
025        /**
026         * Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been
027         * cleared to be reused)
028         */
029        public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
030        {
031            return null;
032        }
033    
034        /**
035         * Is this block (a) opaque and (b) a full 1m cube?  This determines whether or not to render the shared face of two
036         * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
037         */
038        public boolean isOpaqueCube()
039        {
040            return false;
041        }
042    
043        /**
044         * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
045         */
046        public boolean renderAsNormalBlock()
047        {
048            return false;
049        }
050    
051        @SideOnly(Side.CLIENT)
052    
053        /**
054         * Returns which pass should this block be rendered on. 0 for solids and 1 for alpha
055         */
056        public int getRenderBlockPass()
057        {
058            return 1;
059        }
060    
061        /**
062         * The type of render function that is called for this block
063         */
064        public int getRenderType()
065        {
066            return 30;
067        }
068    
069        /**
070         * Returns the ID of the items to drop on destruction.
071         */
072        public int idDropped(int par1, Random par2Random, int par3)
073        {
074            return Item.silk.shiftedIndex;
075        }
076    
077        @SideOnly(Side.CLIENT)
078    
079        /**
080         * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative)
081         */
082        public int idPicked(World par1World, int par2, int par3, int par4)
083        {
084            return Item.silk.shiftedIndex;
085        }
086    
087        /**
088         * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are
089         * their own) Args: x, y, z, neighbor blockID
090         */
091        public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5)
092        {
093            int var6 = par1World.getBlockMetadata(par2, par3, par4);
094            boolean var7 = (var6 & 2) == 2;
095            boolean var8 = !par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4);
096    
097            if (var7 != var8)
098            {
099                this.dropBlockAsItem(par1World, par2, par3, par4, var6, 0);
100                par1World.setBlockWithNotify(par2, par3, par4, 0);
101            }
102        }
103    
104        /**
105         * Updates the blocks bounds based on its current state. Args: world, x, y, z
106         */
107        public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
108        {
109            int var5 = par1IBlockAccess.getBlockMetadata(par2, par3, par4);
110            boolean var6 = (var5 & 4) == 4;
111            boolean var7 = (var5 & 2) == 2;
112    
113            if (!var7)
114            {
115                this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.09375F, 1.0F);
116            }
117            else if (!var6)
118            {
119                this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F);
120            }
121            else
122            {
123                this.setBlockBounds(0.0F, 0.0625F, 0.0F, 1.0F, 0.15625F, 1.0F);
124            }
125        }
126    
127        /**
128         * Called whenever the block is added into the world. Args: world, x, y, z
129         */
130        public void onBlockAdded(World par1World, int par2, int par3, int par4)
131        {
132            int var5 = par1World.doesBlockHaveSolidTopSurface(par2, par3 - 1, par4) ? 0 : 2;
133            par1World.setBlockMetadataWithNotify(par2, par3, par4, var5);
134            this.func_72149_e(par1World, par2, par3, par4, var5);
135        }
136    
137        /**
138         * ejects contained items into the world, and notifies neighbours of an update, as appropriate
139         */
140        public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6)
141        {
142            this.func_72149_e(par1World, par2, par3, par4, par6 | 1);
143        }
144    
145        /**
146         * Called when the block is attempted to be harvested
147         */
148        public void onBlockHarvested(World par1World, int par2, int par3, int par4, int par5, EntityPlayer par6EntityPlayer)
149        {
150            if (!par1World.isRemote)
151            {
152                if (par6EntityPlayer.getCurrentEquippedItem() != null && par6EntityPlayer.getCurrentEquippedItem().itemID == Item.shears.shiftedIndex)
153                {
154                    par1World.setBlockMetadataWithNotify(par2, par3, par4, par5 | 8);
155                }
156            }
157        }
158    
159        private void func_72149_e(World par1World, int par2, int par3, int par4, int par5)
160        {
161            int var6 = 0;
162    
163            while (var6 < 2)
164            {
165                int var7 = 1;
166    
167                while (true)
168                {
169                    if (var7 < 42)
170                    {
171                        int var8 = par2 + Direction.offsetX[var6] * var7;
172                        int var9 = par4 + Direction.offsetZ[var6] * var7;
173                        int var10 = par1World.getBlockId(var8, par3, var9);
174    
175                        if (var10 == Block.tripWireSource.blockID)
176                        {
177                            int var11 = par1World.getBlockMetadata(var8, par3, var9) & 3;
178    
179                            if (var11 == Direction.footInvisibleFaceRemap[var6])
180                            {
181                                Block.tripWireSource.func_72143_a(par1World, var8, par3, var9, var10, par1World.getBlockMetadata(var8, par3, var9), true, var7, par5);
182                            }
183                        }
184                        else if (var10 == Block.tripWire.blockID)
185                        {
186                            ++var7;
187                            continue;
188                        }
189                    }
190    
191                    ++var6;
192                    break;
193                }
194            }
195        }
196    
197        /**
198         * Triggered whenever an entity collides with this block (enters into the block). Args: world, x, y, z, entity
199         */
200        public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity)
201        {
202            if (!par1World.isRemote)
203            {
204                if ((par1World.getBlockMetadata(par2, par3, par4) & 1) != 1)
205                {
206                    this.updateTripWireState(par1World, par2, par3, par4);
207                }
208            }
209        }
210    
211        /**
212         * Ticks the block if it's been scheduled
213         */
214        public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random)
215        {
216            if (!par1World.isRemote)
217            {
218                if ((par1World.getBlockMetadata(par2, par3, par4) & 1) == 1)
219                {
220                    this.updateTripWireState(par1World, par2, par3, par4);
221                }
222            }
223        }
224    
225        private void updateTripWireState(World par1World, int par2, int par3, int par4)
226        {
227            int var5 = par1World.getBlockMetadata(par2, par3, par4);
228            boolean var6 = (var5 & 1) == 1;
229            boolean var7 = false;
230            List var8 = par1World.getEntitiesWithinAABBExcludingEntity((Entity)null, AxisAlignedBB.getAABBPool().addOrModifyAABBInPool((double)par2 + this.minX, (double)par3 + this.minY, (double)par4 + this.minZ, (double)par2 + this.maxX, (double)par3 + this.maxY, (double)par4 + this.maxZ));
231    
232            if (!var8.isEmpty())
233            {
234                var7 = true;
235            }
236    
237            if (var7 && !var6)
238            {
239                var5 |= 1;
240            }
241    
242            if (!var7 && var6)
243            {
244                var5 &= -2;
245            }
246    
247            if (var7 != var6)
248            {
249                par1World.setBlockMetadataWithNotify(par2, par3, par4, var5);
250                this.func_72149_e(par1World, par2, par3, par4, var5);
251            }
252    
253            if (var7)
254            {
255                par1World.scheduleBlockUpdate(par2, par3, par4, this.blockID, this.tickRate());
256            }
257        }
258    
259        @SideOnly(Side.CLIENT)
260        public static boolean func_72148_a(IBlockAccess par0IBlockAccess, int par1, int par2, int par3, int par4, int par5)
261        {
262            int var6 = par1 + Direction.offsetX[par5];
263            int var8 = par3 + Direction.offsetZ[par5];
264            int var9 = par0IBlockAccess.getBlockId(var6, par2, var8);
265            boolean var10 = (par4 & 2) == 2;
266            int var11;
267    
268            if (var9 == Block.tripWireSource.blockID)
269            {
270                var11 = par0IBlockAccess.getBlockMetadata(var6, par2, var8);
271                int var13 = var11 & 3;
272                return var13 == Direction.footInvisibleFaceRemap[par5];
273            }
274            else if (var9 == Block.tripWire.blockID)
275            {
276                var11 = par0IBlockAccess.getBlockMetadata(var6, par2, var8);
277                boolean var12 = (var11 & 2) == 2;
278                return var10 == var12;
279            }
280            else
281            {
282                return false;
283            }
284        }
285    }