001    package net.minecraft.block.material;
002    
003    public class Material
004    {
005        public static final Material air = new MaterialTransparent(MapColor.airColor);
006    
007        /** The material used by BlockGrass. */
008        public static final Material grass = new Material(MapColor.grassColor);
009        public static final Material ground = new Material(MapColor.dirtColor);
010        public static final Material wood = (new Material(MapColor.woodColor)).setBurning();
011        public static final Material rock = (new Material(MapColor.stoneColor)).setRequiresTool();
012        public static final Material iron = (new Material(MapColor.ironColor)).setRequiresTool();
013        public static final Material anvil = (new Material(MapColor.ironColor)).setRequiresTool().setImmovableMobility();
014        public static final Material water = (new MaterialLiquid(MapColor.waterColor)).setNoPushMobility();
015        public static final Material lava = (new MaterialLiquid(MapColor.tntColor)).setNoPushMobility();
016        public static final Material leaves = (new Material(MapColor.foliageColor)).setBurning().setTranslucent().setNoPushMobility();
017        public static final Material plants = (new MaterialLogic(MapColor.foliageColor)).setNoPushMobility();
018        public static final Material vine = (new MaterialLogic(MapColor.foliageColor)).setBurning().setNoPushMobility().setReplaceable();
019        public static final Material sponge = new Material(MapColor.clothColor);
020        public static final Material cloth = (new Material(MapColor.clothColor)).setBurning();
021        public static final Material fire = (new MaterialTransparent(MapColor.airColor)).setNoPushMobility();
022        public static final Material sand = new Material(MapColor.sandColor);
023        public static final Material circuits = (new MaterialLogic(MapColor.airColor)).setNoPushMobility();
024        public static final Material glass = (new Material(MapColor.airColor)).setTranslucent().func_85158_p();
025        public static final Material redstoneLight = (new Material(MapColor.airColor)).func_85158_p();
026        public static final Material tnt = (new Material(MapColor.tntColor)).setBurning().setTranslucent();
027        public static final Material coral = (new Material(MapColor.foliageColor)).setNoPushMobility();
028        public static final Material ice = (new Material(MapColor.iceColor)).setTranslucent().func_85158_p();
029        public static final Material snow = (new MaterialLogic(MapColor.snowColor)).setReplaceable().setTranslucent().setRequiresTool().setNoPushMobility();
030    
031        /** The material for crafted snow. */
032        public static final Material craftedSnow = (new Material(MapColor.snowColor)).setRequiresTool();
033        public static final Material cactus = (new Material(MapColor.foliageColor)).setTranslucent().setNoPushMobility();
034        public static final Material clay = new Material(MapColor.clayColor);
035    
036        /** pumpkin */
037        public static final Material pumpkin = (new Material(MapColor.foliageColor)).setNoPushMobility();
038        public static final Material dragonEgg = (new Material(MapColor.foliageColor)).setNoPushMobility();
039    
040        /** Material used for portals */
041        public static final Material portal = (new MaterialPortal(MapColor.airColor)).setImmovableMobility();
042    
043        /** Cake's material, see BlockCake */
044        public static final Material cake = (new Material(MapColor.airColor)).setNoPushMobility();
045    
046        /** Web's material. */
047        public static final Material web = (new MaterialWeb(MapColor.clothColor)).setRequiresTool().setNoPushMobility();
048    
049        /** Pistons' material. */
050        public static final Material piston = (new Material(MapColor.stoneColor)).setImmovableMobility();
051    
052        /** Bool defining if the block can burn or not. */
053        private boolean canBurn;
054    
055        /**
056         * Determines whether blocks with this material can be "overwritten" by other blocks when placed - eg snow, vines
057         * and tall grass.
058         */
059        private boolean replaceable;
060    
061        /** Indicates if the material is translucent */
062        private boolean isTranslucent;
063    
064        /** The color index used to draw the blocks of this material on maps. */
065        public final MapColor materialMapColor;
066    
067        /**
068         * Determines if the material can be harvested without a tool (or with the wrong tool)
069         */
070        private boolean requiresNoTool = true;
071    
072        /**
073         * Mobility information flag. 0 indicates that this block is normal, 1 indicates that it can't push other blocks, 2
074         * indicates that it can't be pushed.
075         */
076        private int mobilityFlag;
077        private boolean field_85159_M;
078    
079        public Material(MapColor par1MapColor)
080        {
081            this.materialMapColor = par1MapColor;
082        }
083    
084        /**
085         * Returns if blocks of these materials are liquids.
086         */
087        public boolean isLiquid()
088        {
089            return false;
090        }
091    
092        public boolean isSolid()
093        {
094            return true;
095        }
096    
097        /**
098         * Will prevent grass from growing on dirt underneath and kill any grass below it if it returns true
099         */
100        public boolean getCanBlockGrass()
101        {
102            return true;
103        }
104    
105        /**
106         * Returns if this material is considered solid or not
107         */
108        public boolean blocksMovement()
109        {
110            return true;
111        }
112    
113        /**
114         * Marks the material as translucent
115         */
116        private Material setTranslucent()
117        {
118            this.isTranslucent = true;
119            return this;
120        }
121    
122        /**
123         * Makes blocks with this material require the correct tool to be harvested.
124         */
125        protected Material setRequiresTool()
126        {
127            this.requiresNoTool = false;
128            return this;
129        }
130    
131        /**
132         * Set the canBurn bool to True and return the current object.
133         */
134        protected Material setBurning()
135        {
136            this.canBurn = true;
137            return this;
138        }
139    
140        /**
141         * Returns if the block can burn or not.
142         */
143        public boolean getCanBurn()
144        {
145            return this.canBurn;
146        }
147    
148        /**
149         * Sets {@link #replaceable} to true.
150         */
151        public Material setReplaceable()
152        {
153            this.replaceable = true;
154            return this;
155        }
156    
157        /**
158         * Returns whether the material can be replaced by other blocks when placed - eg snow, vines and tall grass.
159         */
160        public boolean isReplaceable()
161        {
162            return this.replaceable;
163        }
164    
165        /**
166         * Indicate if the material is opaque
167         */
168        public boolean isOpaque()
169        {
170            return this.isTranslucent ? false : this.blocksMovement();
171        }
172    
173        /**
174         * Returns true if the material can be harvested without a tool (or with the wrong tool)
175         */
176        public boolean isToolNotRequired()
177        {
178            return this.requiresNoTool;
179        }
180    
181        /**
182         * Returns the mobility information of the material, 0 = free, 1 = can't push but can move over, 2 = total
183         * immobility and stop pistons.
184         */
185        public int getMaterialMobility()
186        {
187            return this.mobilityFlag;
188        }
189    
190        /**
191         * This type of material can't be pushed, but pistons can move over it.
192         */
193        protected Material setNoPushMobility()
194        {
195            this.mobilityFlag = 1;
196            return this;
197        }
198    
199        /**
200         * This type of material can't be pushed, and pistons are blocked to move.
201         */
202        protected Material setImmovableMobility()
203        {
204            this.mobilityFlag = 2;
205            return this;
206        }
207    
208        protected Material func_85158_p()
209        {
210            this.field_85159_M = true;
211            return this;
212        }
213    
214        public boolean func_85157_q()
215        {
216            return this.field_85159_M;
217        }
218    }