001    package org.bukkit;
002    
003    /**
004     * Represents a countable statistic, which is tracked by the server.
005     */
006    public enum Statistic {
007        DAMAGE_DEALT,
008        DAMAGE_TAKEN,
009        DEATHS,
010        MOB_KILLS,
011        PLAYER_KILLS,
012        FISH_CAUGHT,
013        ANIMALS_BRED,
014        TREASURE_FISHED,
015        JUNK_FISHED,
016        LEAVE_GAME,
017        JUMP,
018        DROP,
019        PLAY_ONE_TICK,
020        WALK_ONE_CM,
021        SWIM_ONE_CM,
022        FALL_ONE_CM,
023        CLIMB_ONE_CM,
024        FLY_ONE_CM,
025        DIVE_ONE_CM,
026        MINECART_ONE_CM,
027        BOAT_ONE_CM,
028        PIG_ONE_CM,
029        HORSE_ONE_CM,
030        MINE_BLOCK(Type.BLOCK),
031        USE_ITEM(Type.ITEM),
032        BREAK_ITEM(Type.ITEM),
033        CRAFT_ITEM(Type.ITEM),
034        KILL_ENTITY(Type.ENTITY),
035        ENTITY_KILLED_BY(Type.ENTITY);
036    
037        private final Type type;
038    
039        private Statistic() {
040            this(Type.UNTYPED);
041        }
042    
043        private Statistic(Type type) {
044            this.type = type;
045        }
046    
047        /**
048         * Gets the type of this statistic.
049         *
050         * @return the type of this statistic
051         */
052        public Type getType() {
053            return type;
054        }
055    
056        /**
057         * Checks if this is a substatistic.
058         * <p>
059         * A substatistic exists en masse for each block, item, or entitytype, depending on
060         * {@link #getType()}.
061         * <p>
062         * This is a redundant method and equivalent to checking
063         * <code>getType() != Type.UNTYPED</code>
064         *
065         * @return true if this is a substatistic
066         */
067        public boolean isSubstatistic() {
068            return type != Type.UNTYPED;
069        }
070    
071        /**
072         * Checks if this is a substatistic dealing with blocks.
073         * <p>
074         * This is a redundant method and equivalent to checking
075         * <code>getType() == Type.BLOCK</code>
076         *
077         * @return true if this deals with blocks
078         */
079        public boolean isBlock() {
080            return type == Type.BLOCK;
081        }
082    
083        /**
084         * The type of statistic.
085         *
086         */
087        public enum Type {
088            /**
089             * Statistics of this type do not require a qualifier.
090             */
091            UNTYPED,
092    
093            /**
094             * Statistics of this type require an Item Material qualifier.
095             */
096            ITEM,
097    
098            /**
099             * Statistics of this type require a Block Material qualifier.
100             */
101            BLOCK,
102    
103            /**
104             * Statistics of this type require an EntityType qualifier.
105             */
106            ENTITY;
107        }
108    }