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 return target instanceof DungeonMob && type.equals(((DungeonMob)target).type);
099 }
100 }
101
102 static
103 {
104 addDungeonMob("Skeleton", 100);
105 addDungeonMob("Zombie", 200);
106 addDungeonMob("Spider", 100);
107 }
108
109
110 @Deprecated //Moved to ChestGenHooks
111 public static void setDungeonLootTries(int number)
112 {
113 ChestGenHooks.getInfo(DUNGEON_CHEST).setMax(number);
114 ChestGenHooks.getInfo(DUNGEON_CHEST).setMin(number);
115 }
116 @Deprecated //Moved to ChestGenHooks
117 public static int getDungeonLootTries() { return ChestGenHooks.getInfo(DUNGEON_CHEST).getMax(); }
118 @Deprecated //Moved to ChestGenHooks
119 public void addDungeonLoot(DungeonLoot loot){ ChestGenHooks.getInfo(DUNGEON_CHEST).addItem(loot); }
120 @Deprecated //Moved to ChestGenHooks
121 public boolean removeDungeonLoot(DungeonLoot loot){ return ChestGenHooks.getInfo(DUNGEON_CHEST).contents.remove(loot); }
122 @Deprecated //Moved to ChestGenHooks
123 public static void addDungeonLoot(ItemStack item, int rarity){ addDungeonLoot(item, rarity, 1, 1); }
124 @Deprecated //Moved to ChestGenHooks
125 public static float addDungeonLoot(ItemStack item, int rarity, int minCount, int maxCount)
126 {
127 ChestGenHooks.addDungeonLoot(ChestGenHooks.getInfo(DUNGEON_CHEST), item, rarity, minCount, maxCount);
128 return rarity;
129 }
130 @Deprecated //Moved to ChestGenHooks
131 public static void removeDungeonLoot(ItemStack item){ ChestGenHooks.removeItem(DUNGEON_CHEST, item); }
132 @Deprecated //Moved to ChestGenHooks
133 public static void removeDungeonLoot(ItemStack item, int minCount, int maxCount){ ChestGenHooks.removeItem(DUNGEON_CHEST, item); }
134 @Deprecated //Moved to ChestGenHooks
135 public static ItemStack getRandomDungeonLoot(Random rand){ return ChestGenHooks.getOneItem(DUNGEON_CHEST, rand); }
136
137 @Deprecated //Moved to ChestGenHooks
138 public static class DungeonLoot extends WeightedRandomChestContent
139 {
140 @Deprecated
141 public DungeonLoot(int weight, ItemStack item, int min, int max)
142 {
143 super(item, weight, min, max);
144 }
145
146 @Deprecated
147 public ItemStack generateStack(Random rand)
148 {
149 int min = theMinimumChanceToGenerateItem;
150 int max = theMaximumChanceToGenerateItem;
151
152 ItemStack ret = this.theItemId.copy();
153 ret.stackSize = min + (rand.nextInt(max - min + 1));
154 return ret;
155 }
156
157 public boolean equals(ItemStack item, int min, int max)
158 {
159 int minCount = theMinimumChanceToGenerateItem;
160 int maxCount = theMaximumChanceToGenerateItem;
161 return (min == minCount && max == maxCount && item.isItemEqual(theItemId) && ItemStack.areItemStackTagsEqual(item, theItemId));
162 }
163 public boolean equals(ItemStack item){ return item.isItemEqual(theItemId) && ItemStack.areItemStackTagsEqual(item, theItemId); }
164 }
165 }