001package net.minecraft.block.material;
002
003public 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().setAlwaysHarvested();
025    public static final Material redstoneLight = (new Material(MapColor.airColor)).setAlwaysHarvested();
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().setAlwaysHarvested();
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    /**
209     * Set as harvestable in any case.
210     */
211    protected Material setAlwaysHarvested()
212    {
213        this.field_85159_M = true;
214        return this;
215    }
216
217    /**
218     * Check to see if we can harvest it in any case.
219     */
220    public boolean isAlwaysHarvested()
221    {
222        return this.field_85159_M;
223    }
224}