    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    }