001package net.minecraftforge.common;
002
003import java.util.ArrayList;
004import java.util.Random;
005
006import cpw.mods.fml.common.FMLLog;
007
008import net.minecraft.inventory.IInventory;
009import net.minecraft.item.Item;
010import net.minecraft.item.ItemStack;
011import net.minecraft.util.WeightedRandom;
012import net.minecraft.util.WeightedRandomChestContent;
013import net.minecraft.util.WeightedRandomItem;
014
015import static net.minecraftforge.common.ChestGenHooks.DUNGEON_CHEST;
016
017public class DungeonHooks
018{
019    private static ArrayList<DungeonMob> dungeonMobs = new ArrayList<DungeonMob>();
020
021    /**
022     * Adds a mob to the possible list of creatures the spawner will create.
023     * If the mob is already in the spawn list, the rarity will be added to the existing one,
024     * causing the mob to be more common.
025     *
026     * @param name The name of the monster, use the same name used when registering the entity.
027     * @param rarity The rarity of selecting this mob over others. Must be greater then 0.
028     *        Vanilla Minecraft has the following mobs:
029     *        Spider   100
030     *        Skeleton 100
031     *        Zombie   200
032     *        Meaning, Zombies are twice as common as spiders or skeletons.
033     * @return The new rarity of the monster,
034     */
035    public static float addDungeonMob(String name, int rarity)
036    {
037        if (rarity <= 0)
038        {
039            throw new IllegalArgumentException("Rarity must be greater then zero");
040        }
041
042        for (DungeonMob mob : dungeonMobs)
043        {
044            if (name.equals(mob.type))
045            {
046                return mob.itemWeight += rarity;
047            }
048        }
049
050        dungeonMobs.add(new DungeonMob(rarity, name));
051        return rarity;
052    }
053
054    /**
055     * Will completely remove a Mob from the dungeon spawn list.
056     *
057     * @param name The name of the mob to remove
058     * @return The rarity of the removed mob, prior to being removed.
059     */
060    public static int removeDungeonMob(String name)
061    {
062        for (DungeonMob mob : dungeonMobs)
063        {
064            if (name.equals(mob.type))
065            {
066                dungeonMobs.remove(mob);
067                return mob.itemWeight;
068            }
069        }
070        return 0;
071    }
072
073    /**
074     * Gets a random mob name from the list.
075     * @param rand World generation random number generator
076     * @return The mob name
077     */
078    public static String getRandomDungeonMob(Random rand)
079    {
080        DungeonMob mob = (DungeonMob)WeightedRandom.getRandomItem(rand, dungeonMobs);
081        if (mob == null)
082        {
083            return "";
084        }
085        return mob.type;
086    }
087
088
089    public static class DungeonMob extends WeightedRandomItem
090    {
091        public String type;
092        public DungeonMob(int weight, String type)
093        {
094            super(weight);
095            this.type = type;
096        }
097
098        @Override
099        public boolean equals(Object target)
100        {
101            return target instanceof DungeonMob && type.equals(((DungeonMob)target).type);
102        }
103    }
104
105    static
106    {
107        addDungeonMob("Skeleton", 100);
108        addDungeonMob("Zombie",   200);
109        addDungeonMob("Spider",   100);
110    }
111}