    001    package net.minecraftforge.common;
    002
    003    import java.util.ArrayList;
    004    import java.util.Random;
    005
    006    import net.minecraft.item.Item;
    007    import net.minecraft.item.ItemStack;
    008    import net.minecraft.util.WeightedRandom;
    009    import net.minecraft.util.WeightedRandomChestContent;
    010    import net.minecraft.util.WeightedRandomItem;
    011
    012    import static net.minecraftforge.common.ChestGenHooks.DUNGEON_CHEST;
    013
    014    public class DungeonHooks
    015    {
    016        private static ArrayList<DungeonMob> dungeonMobs = new ArrayList<DungeonMob>();
    017
    018        /**
    019         * Adds a mob to the possible list of creatures the spawner will create.
    020         * If the mob is already in the spawn list, the rarity will be added to the existing one,
    021         * causing the mob to be more common.
    022         *
    023         * @param name The name of the monster, use the same name used when registering the entity.
    024         * @param rarity The rarity of selecting this mob over others. Must be greater then 0.
    025         *        Vanilla Minecraft has the following mobs:
    026         *        Spider   100
    027         *        Skeleton 100
    028         *        Zombie   200
    029         *        Meaning, Zombies are twice as common as spiders or skeletons.
    030         * @return The new rarity of the monster,
    031         */
    032        public static float addDungeonMob(String name, int rarity)
    033        {
    034            if (rarity <= 0)
    035            {
    036                throw new IllegalArgumentException("Rarity must be greater then zero");
    037            }
    038
    039            for (DungeonMob mob : dungeonMobs)
    040            {
    041                if (name.equals(mob.type))
    042                {
    043                    return mob.itemWeight += rarity;
    044                }
    045            }
    046
    047            dungeonMobs.add(new DungeonMob(rarity, name));
    048            return rarity;
    049        }
    050
    051        /**
    052         * Will completely remove a Mob from the dungeon spawn list.
    053         *
    054         * @param name The name of the mob to remove
    055         * @return The rarity of the removed mob, prior to being removed.
    056         */
    057        public static int removeDungeonMob(String name)
    058        {
    059            for (DungeonMob mob : dungeonMobs)
    060            {
    061                if (name.equals(mob.type))
    062                {
    063                    dungeonMobs.remove(mob);
    064                    return mob.itemWeight;
    065                }
    066            }
    067            return 0;
    068        }
    069
    070        /**
    071         * Gets a random mob name from the list.
    072         * @param rand World generation random number generator
    073         * @return The mob name
    074         */
    075        public static String getRandomDungeonMob(Random rand)
    076        {
    077            DungeonMob mob = (DungeonMob)WeightedRandom.getRandomItem(rand, dungeonMobs);
    078            if (mob == null)
    079            {
    080                return "";
    081            }
    082            return mob.type;
    083        }
    084
    085
    086        public static class DungeonMob extends WeightedRandomItem
    087        {
    088            public String type;
    089            public DungeonMob(int weight, String type)
    090            {
    091                super(weight);
    092                this.type = type;
    093            }
    094
    095            @Override
    096            public boolean equals(Object target)
    097            {
    098                if (target instanceof DungeonMob)
    099                {
    100                    return this.type.equals(((DungeonMob)target).type);
    101                }
    102                return false;
    103            }
    104        }
    105
    106        static
    107        {
    108            addDungeonMob("Skeleton", 100);
    109            addDungeonMob("Zombie",   200);
    110            addDungeonMob("Spider",   100);
    111        }
    112
    113
    114        @Deprecated //Moved to ChestGenHooks
    115        public static void setDungeonLootTries(int number)
    116        {
    117            ChestGenHooks.getInfo(DUNGEON_CHEST).setMax(number);
    118            ChestGenHooks.getInfo(DUNGEON_CHEST).setMin(number);
    119        }
    120        @Deprecated //Moved to ChestGenHooks
    121        public static int getDungeonLootTries() { return ChestGenHooks.getInfo(DUNGEON_CHEST).getMax(); }
    122        @Deprecated //Moved to ChestGenHooks
    123        public void addDungeonLoot(DungeonLoot loot){ ChestGenHooks.getInfo(DUNGEON_CHEST).addItem(loot); }
    124        @Deprecated //Moved to ChestGenHooks
    125        public boolean removeDungeonLoot(DungeonLoot loot){ return ChestGenHooks.getInfo(DUNGEON_CHEST).contents.remove(loot); }
    126        @Deprecated //Moved to ChestGenHooks
    127        public static void addDungeonLoot(ItemStack item, int rarity){ addDungeonLoot(item, rarity, 1, 1); }
    128        @Deprecated //Moved to ChestGenHooks
    129        public static float addDungeonLoot(ItemStack item, int rarity, int minCount, int maxCount)
    130        {
    131            ChestGenHooks.addDungeonLoot(ChestGenHooks.getInfo(DUNGEON_CHEST), item, rarity, minCount, maxCount);
    132            return rarity;
    133        }
    134        @Deprecated //Moved to ChestGenHooks
    135        public static void removeDungeonLoot(ItemStack item){ ChestGenHooks.removeItem(DUNGEON_CHEST, item); }
    136        @Deprecated //Moved to ChestGenHooks
    137        public static void removeDungeonLoot(ItemStack item, int minCount, int maxCount){ ChestGenHooks.removeItem(DUNGEON_CHEST, item); }
    138        @Deprecated //Moved to ChestGenHooks
    139        public static ItemStack getRandomDungeonLoot(Random rand){ return ChestGenHooks.getOneItem(DUNGEON_CHEST, rand); }
    140
    141        @Deprecated //Moved to ChestGenHooks
    142        public static class DungeonLoot extends WeightedRandomChestContent
    143        {
    144            @Deprecated
    145            public DungeonLoot(int weight, ItemStack item, int min, int max)
    146            {
    147                super(item, weight, min, max);
    148            }
    149
    150            @Deprecated
    151            public ItemStack generateStack(Random rand)
    152            {
    153                int min = theMinimumChanceToGenerateItem;
    154                int max = theMaximumChanceToGenerateItem;
    155
    156                ItemStack ret = this.theItemId.copy();
    157                ret.stackSize = min + (rand.nextInt(max - min + 1));
    158                return ret;
    159            }
    160
    161            public boolean equals(ItemStack item, int min, int max)
    162            {
    163                int minCount = theMinimumChanceToGenerateItem;
    164                int maxCount = theMaximumChanceToGenerateItem;
    165                return (min == minCount && max == maxCount && item.isItemEqual(theItemId) && ItemStack.areItemStackTagsEqual(item, theItemId));
    166            }
    167            public boolean equals(ItemStack item){ return item.isItemEqual(theItemId) && ItemStack.areItemStackTagsEqual(item, theItemId); }
    168        }
    169    }