001    package net.minecraft.src;
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)).setNoHarvest();
012        public static final Material iron = (new Material(MapColor.ironColor)).setNoHarvest();
013        public static final Material anvil = (new Material(MapColor.ironColor)).setNoHarvest().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().setGroundCover();
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 field_76261_t = (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)).setGroundCover().setTranslucent().setNoHarvest().setNoPushMobility();
030    
031        /** The material for crafted snow. */
032        public static final Material craftedSnow = (new Material(MapColor.snowColor)).setNoHarvest();
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)).setNoHarvest().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        /** Indicates if the material is a form of ground cover, e.g. Snow */
056        private boolean groundCover;
057    
058        /** Indicates if the material is translucent */
059        private boolean isTranslucent;
060    
061        /** The color index used to draw the blocks of this material on maps. */
062        public final MapColor materialMapColor;
063    
064        /**
065         * Determines if the materials is one that can be collected by the player.
066         */
067        private boolean canHarvest = true;
068    
069        /**
070         * Mobility information flag. 0 indicates that this block is normal, 1 indicates that it can't push other blocks, 2
071         * indicates that it can't be pushed.
072         */
073        private int mobilityFlag;
074        private boolean field_85159_M;
075    
076        public Material(MapColor par1MapColor)
077        {
078            this.materialMapColor = par1MapColor;
079        }
080    
081        /**
082         * Returns if blocks of these materials are liquids.
083         */
084        public boolean isLiquid()
085        {
086            return false;
087        }
088    
089        public boolean isSolid()
090        {
091            return true;
092        }
093    
094        /**
095         * Will prevent grass from growing on dirt underneath and kill any grass below it if it returns true
096         */
097        public boolean getCanBlockGrass()
098        {
099            return true;
100        }
101    
102        /**
103         * Returns if this material is considered solid or not
104         */
105        public boolean blocksMovement()
106        {
107            return true;
108        }
109    
110        /**
111         * Marks the material as translucent
112         */
113        private Material setTranslucent()
114        {
115            this.isTranslucent = true;
116            return this;
117        }
118    
119        /**
120         * Disables the ability to harvest this material.
121         */
122        protected Material setNoHarvest()
123        {
124            this.canHarvest = false;
125            return this;
126        }
127    
128        /**
129         * Set the canBurn bool to True and return the current object.
130         */
131        protected Material setBurning()
132        {
133            this.canBurn = true;
134            return this;
135        }
136    
137        /**
138         * Returns if the block can burn or not.
139         */
140        public boolean getCanBurn()
141        {
142            return this.canBurn;
143        }
144    
145        /**
146         * Sets the material as a form of ground cover, e.g. Snow
147         */
148        public Material setGroundCover()
149        {
150            this.groundCover = true;
151            return this;
152        }
153    
154        /**
155         * Return whether the material is a form of ground cover, e.g. Snow
156         */
157        public boolean isGroundCover()
158        {
159            return this.groundCover;
160        }
161    
162        /**
163         * Indicate if the material is opaque
164         */
165        public boolean isOpaque()
166        {
167            return this.isTranslucent ? false : this.blocksMovement();
168        }
169    
170        /**
171         * Returns true if material can be harvested by player.
172         */
173        public boolean isHarvestable()
174        {
175            return this.canHarvest;
176        }
177    
178        /**
179         * Returns the mobility information of the material, 0 = free, 1 = can't push but can move over, 2 = total
180         * immobility and stop pistons.
181         */
182        public int getMaterialMobility()
183        {
184            return this.mobilityFlag;
185        }
186    
187        /**
188         * This type of material can't be pushed, but pistons can move over it.
189         */
190        protected Material setNoPushMobility()
191        {
192            this.mobilityFlag = 1;
193            return this;
194        }
195    
196        /**
197         * This type of material can't be pushed, and pistons are blocked to move.
198         */
199        protected Material setImmovableMobility()
200        {
201            this.mobilityFlag = 2;
202            return this;
203        }
204    
205        protected Material func_85158_p()
206        {
207            this.field_85159_M = true;
208            return this;
209        }
210    
211        public boolean func_85157_q()
212        {
213            return this.field_85159_M;
214        }
215    }