    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}