001    package org.bukkit.event.player;
002    
003    import org.bukkit.entity.CreatureType;
004    import org.bukkit.entity.Egg;
005    import org.bukkit.entity.EntityType;
006    import org.bukkit.entity.Player;
007    import org.bukkit.event.HandlerList;
008    
009    /**
010     * Called when a player throws an egg and it might hatch
011     */
012    public class PlayerEggThrowEvent extends PlayerEvent {
013        private static final HandlerList handlers = new HandlerList();
014        private final Egg egg;
015        private boolean hatching;
016        private EntityType hatchType;
017        private byte numHatches;
018    
019        public PlayerEggThrowEvent(final Player player, final Egg egg, final boolean hatching, final byte numHatches, final EntityType hatchingType) {
020            super(player);
021            this.egg = egg;
022            this.hatching = hatching;
023            this.numHatches = numHatches;
024            this.hatchType = hatchingType;
025        }
026    
027        @Deprecated
028        public PlayerEggThrowEvent(Player player, Egg egg, boolean hatching, byte numHatches, CreatureType hatchingType) {
029            this(player, egg, hatching, numHatches, hatchingType.toEntityType());
030        }
031    
032        /**
033         * Gets the egg involved in this event.
034         *
035         * @return the egg involved in this event
036         */
037        public Egg getEgg() {
038            return egg;
039        }
040    
041        /**
042         * Gets whether the egg is hatching or not. Will be what the server
043         * would've done without interaction.
044         *
045         * @return boolean Whether the egg is going to hatch or not
046         */
047        public boolean isHatching() {
048            return hatching;
049        }
050    
051        /**
052         * Sets whether the egg will hatch or not.
053         *
054         * @param hatching true if you want the egg to hatch, false if you want it
055         *     not to
056         */
057        public void setHatching(boolean hatching) {
058            this.hatching = hatching;
059        }
060    
061        /**
062         * Get the type of the mob being hatched (EntityType.CHICKEN by default)
063         *
064         * @return The type of the mob being hatched by the egg
065         * @deprecated In favour of {@link #getHatchingType()}.
066         */
067        @Deprecated
068        public CreatureType getHatchType() {
069            return CreatureType.fromEntityType(hatchType);
070        }
071    
072        /**
073         * Get the type of the mob being hatched (EntityType.CHICKEN by default)
074         *
075         * @return The type of the mob being hatched by the egg
076         */
077        public EntityType getHatchingType() {
078            return hatchType;
079        }
080    
081        /**
082         * Change the type of mob being hatched by the egg
083         *
084         * @param hatchType The type of the mob being hatched by the egg
085         * @deprecated In favour of {@link #setHatchingType(EntityType)}.
086         */
087        @Deprecated
088        public void setHatchType(CreatureType hatchType) {
089            this.hatchType = hatchType.toEntityType();
090        }
091    
092        /**
093         * Change the type of mob being hatched by the egg
094         *
095         * @param hatchType The type of the mob being hatched by the egg
096         */
097        public void setHatchingType(EntityType hatchType) {
098            if(!hatchType.isSpawnable()) throw new IllegalArgumentException("Can't spawn that entity type from an egg!");
099            this.hatchType = hatchType;
100        }
101    
102        /**
103         * Get the number of mob hatches from the egg. By default the number will
104         * be the number the server would've done
105         * <ul>
106         * <li>7/8 chance of being 0
107         * <li>31/256 ~= 1/8 chance to be 1
108         * <li>1/256 chance to be 4
109         * </ul>
110         *
111         * @return The number of mobs going to be hatched by the egg
112         */
113        public byte getNumHatches() {
114            return numHatches;
115        }
116    
117        /**
118         * Change the number of mobs coming out of the hatched egg
119         * <p>
120         * The boolean hatching will override this number. Ie. If hatching =
121         * false, this number will not matter
122         *
123         * @param numHatches The number of mobs coming out of the egg
124         */
125        public void setNumHatches(byte numHatches) {
126            this.numHatches = numHatches;
127        }
128    
129        @Override
130        public HandlerList getHandlers() {
131            return handlers;
132        }
133    
134        public static HandlerList getHandlerList() {
135            return handlers;
136        }
137    }