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 water = (new MaterialLiquid(MapColor.waterColor)).setNoPushMobility();
014        public static final Material lava = (new MaterialLiquid(MapColor.tntColor)).setNoPushMobility();
015        public static final Material leaves = (new Material(MapColor.foliageColor)).setBurning().setTranslucent().setNoPushMobility();
016        public static final Material plants = (new MaterialLogic(MapColor.foliageColor)).setNoPushMobility();
017        public static final Material vine = (new MaterialLogic(MapColor.foliageColor)).setBurning().setNoPushMobility().setGroundCover();
018        public static final Material sponge = new Material(MapColor.clothColor);
019        public static final Material cloth = (new Material(MapColor.clothColor)).setBurning();
020        public static final Material fire = (new MaterialTransparent(MapColor.airColor)).setNoPushMobility();
021        public static final Material sand = new Material(MapColor.sandColor);
022        public static final Material circuits = (new MaterialLogic(MapColor.airColor)).setNoPushMobility();
023        public static final Material glass = (new Material(MapColor.airColor)).setTranslucent();
024        public static final Material redstoneLight = new Material(MapColor.airColor);
025        public static final Material tnt = (new Material(MapColor.tntColor)).setBurning().setTranslucent();
026        public static final Material field_76261_t = (new Material(MapColor.foliageColor)).setNoPushMobility();
027        public static final Material ice = (new Material(MapColor.iceColor)).setTranslucent();
028        public static final Material snow = (new MaterialLogic(MapColor.snowColor)).setGroundCover().setTranslucent().setNoHarvest().setNoPushMobility();
029    
030        /** The material for crafted snow. */
031        public static final Material craftedSnow = (new Material(MapColor.snowColor)).setNoHarvest();
032        public static final Material cactus = (new Material(MapColor.foliageColor)).setTranslucent().setNoPushMobility();
033        public static final Material clay = new Material(MapColor.clayColor);
034    
035        /** pumpkin */
036        public static final Material pumpkin = (new Material(MapColor.foliageColor)).setNoPushMobility();
037        public static final Material dragonEgg = (new Material(MapColor.foliageColor)).setNoPushMobility();
038    
039        /** Material used for portals */
040        public static final Material portal = (new MaterialPortal(MapColor.airColor)).setImmovableMobility();
041    
042        /** Cake's material, see BlockCake */
043        public static final Material cake = (new Material(MapColor.airColor)).setNoPushMobility();
044    
045        /** Web's material. */
046        public static final Material web = (new MaterialWeb(MapColor.clothColor)).setNoHarvest().setNoPushMobility();
047    
048        /** Pistons' material. */
049        public static final Material piston = (new Material(MapColor.stoneColor)).setImmovableMobility();
050    
051        /** Bool defining if the block can burn or not. */
052        private boolean canBurn;
053    
054        /** Indicates if the material is a form of ground cover, e.g. Snow */
055        private boolean groundCover;
056    
057        /** Indicates if the material is translucent */
058        private boolean isTranslucent;
059    
060        /** The color index used to draw the blocks of this material on maps. */
061        public final MapColor materialMapColor;
062    
063        /**
064         * Determines if the materials is one that can be collected by the player.
065         */
066        private boolean canHarvest = true;
067    
068        /**
069         * Mobility information flag. 0 indicates that this block is normal, 1 indicates that it can't push other blocks, 2
070         * indicates that it can't be pushed.
071         */
072        private int mobilityFlag;
073    
074        public Material(MapColor par1MapColor)
075        {
076            this.materialMapColor = par1MapColor;
077        }
078    
079        /**
080         * Returns if blocks of these materials are liquids.
081         */
082        public boolean isLiquid()
083        {
084            return false;
085        }
086    
087        public boolean isSolid()
088        {
089            return true;
090        }
091    
092        /**
093         * Will prevent grass from growing on dirt underneath and kill any grass below it if it returns true
094         */
095        public boolean getCanBlockGrass()
096        {
097            return true;
098        }
099    
100        /**
101         * Returns if this material is considered solid or not
102         */
103        public boolean blocksMovement()
104        {
105            return true;
106        }
107    
108        /**
109         * Marks the material as translucent
110         */
111        private Material setTranslucent()
112        {
113            this.isTranslucent = true;
114            return this;
115        }
116    
117        /**
118         * Disables the ability to harvest this material.
119         */
120        protected Material setNoHarvest()
121        {
122            this.canHarvest = false;
123            return this;
124        }
125    
126        /**
127         * Set the canBurn bool to True and return the current object.
128         */
129        protected Material setBurning()
130        {
131            this.canBurn = true;
132            return this;
133        }
134    
135        /**
136         * Returns if the block can burn or not.
137         */
138        public boolean getCanBurn()
139        {
140            return this.canBurn;
141        }
142    
143        /**
144         * Sets the material as a form of ground cover, e.g. Snow
145         */
146        public Material setGroundCover()
147        {
148            this.groundCover = true;
149            return this;
150        }
151    
152        /**
153         * Return whether the material is a form of ground cover, e.g. Snow
154         */
155        public boolean isGroundCover()
156        {
157            return this.groundCover;
158        }
159    
160        /**
161         * Indicate if the material is opaque
162         */
163        public boolean isOpaque()
164        {
165            return this.isTranslucent ? false : this.blocksMovement();
166        }
167    
168        /**
169         * Returns true if material can be harvested by player.
170         */
171        public boolean isHarvestable()
172        {
173            return this.canHarvest;
174        }
175    
176        /**
177         * Returns the mobility information of the material, 0 = free, 1 = can't push but can move over, 2 = total
178         * immobility and stop pistons
179         */
180        public int getMaterialMobility()
181        {
182            return this.mobilityFlag;
183        }
184    
185        /**
186         * This type of material can't be pushed, but pistons can move over it.
187         */
188        protected Material setNoPushMobility()
189        {
190            this.mobilityFlag = 1;
191            return this;
192        }
193    
194        /**
195         * This type of material can't be pushed, and pistons are blocked to move.
196         */
197        protected Material setImmovableMobility()
198        {
199            this.mobilityFlag = 2;
200            return this;
201        }
202    }