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 field_82717_g = (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();
025        public static final Material redstoneLight = new Material(MapColor.airColor);
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();
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    
075        public Material(MapColor par1MapColor)
076        {
077            this.materialMapColor = par1MapColor;
078        }
079    
080        /**
081         * Returns if blocks of these materials are liquids.
082         */
083        public boolean isLiquid()
084        {
085            return false;
086        }
087    
088        public boolean isSolid()
089        {
090            return true;
091        }
092    
093        /**
094         * Will prevent grass from growing on dirt underneath and kill any grass below it if it returns true
095         */
096        public boolean getCanBlockGrass()
097        {
098            return true;
099        }
100    
101        /**
102         * Returns if this material is considered solid or not
103         */
104        public boolean blocksMovement()
105        {
106            return true;
107        }
108    
109        /**
110         * Marks the material as translucent
111         */
112        private Material setTranslucent()
113        {
114            this.isTranslucent = true;
115            return this;
116        }
117    
118        /**
119         * Disables the ability to harvest this material.
120         */
121        protected Material setNoHarvest()
122        {
123            this.canHarvest = false;
124            return this;
125        }
126    
127        /**
128         * Set the canBurn bool to True and return the current object.
129         */
130        protected Material setBurning()
131        {
132            this.canBurn = true;
133            return this;
134        }
135    
136        /**
137         * Returns if the block can burn or not.
138         */
139        public boolean getCanBurn()
140        {
141            return this.canBurn;
142        }
143    
144        /**
145         * Sets the material as a form of ground cover, e.g. Snow
146         */
147        public Material setGroundCover()
148        {
149            this.groundCover = true;
150            return this;
151        }
152    
153        /**
154         * Return whether the material is a form of ground cover, e.g. Snow
155         */
156        public boolean isGroundCover()
157        {
158            return this.groundCover;
159        }
160    
161        /**
162         * Indicate if the material is opaque
163         */
164        public boolean isOpaque()
165        {
166            return this.isTranslucent ? false : this.blocksMovement();
167        }
168    
169        /**
170         * Returns true if material can be harvested by player.
171         */
172        public boolean isHarvestable()
173        {
174            return this.canHarvest;
175        }
176    
177        /**
178         * Returns the mobility information of the material, 0 = free, 1 = can't push but can move over, 2 = total
179         * immobility and stop pistons.
180         */
181        public int getMaterialMobility()
182        {
183            return this.mobilityFlag;
184        }
185    
186        /**
187         * This type of material can't be pushed, but pistons can move over it.
188         */
189        protected Material setNoPushMobility()
190        {
191            this.mobilityFlag = 1;
192            return this;
193        }
194    
195        /**
196         * This type of material can't be pushed, and pistons are blocked to move.
197         */
198        protected Material setImmovableMobility()
199        {
200            this.mobilityFlag = 2;
201            return this;
202        }
203    }