001 package net.minecraftforge.common;
002
003 import java.util.HashMap;
004 import java.util.HashSet;
005 import java.util.Map;
006 import java.util.Set;
007
008 import net.minecraft.entity.item.EntityMinecart;
009 import net.minecraft.item.Item;
010 import net.minecraft.item.ItemStack;
011
012 public class MinecartRegistry
013 {
014 private static Map<MinecartKey, ItemStack> itemForMinecart = new HashMap<MinecartKey, ItemStack>();
015 private static Map<ItemStack, MinecartKey> minecartForItem = new HashMap<ItemStack, MinecartKey>();
016 /**
017 * Registers a custom minecart and its corresponding item.
018 * This should be the item used to place the minecart by the user,
019 * not the item dropped by the cart.
020 * @param cart The minecart.
021 * @param item The item used to place the cart.
022 */
023 public static void registerMinecart(Class<? extends EntityMinecart> cart, ItemStack item)
024 {
025 registerMinecart(cart, 0, item);
026 }
027
028 /**
029 * Registers a minecart and its corresponding item.
030 * This should be the item used to place the minecart by the user,
031 * not the item dropped by the cart.
032 * @param minecart The minecart.
033 * @param type The minecart type, used to differentiate carts that have the same class.
034 * @param item The item used to place the cart.
035 */
036 public static void registerMinecart(Class<? extends EntityMinecart> minecart, int type, ItemStack item)
037 {
038 MinecartKey key = new MinecartKey(minecart, type);
039 itemForMinecart.put(key, item);
040 minecartForItem.put(item, key);
041 }
042
043 /**
044 * Removes a previously registered Minecart. Useful for replacing the vanilla minecarts.
045 * @param minecart
046 * @param type
047 */
048 public static void removeMinecart(Class<? extends EntityMinecart> minecart, int type)
049 {
050 MinecartKey key = new MinecartKey(minecart, type);
051 ItemStack item = itemForMinecart.remove(key);
052 if (item != null)
053 {
054 minecartForItem.remove(item);
055 }
056 }
057
058 /**
059 * This function returns an ItemStack that represents this cart.
060 * The player should be able to use this item to place the minecart.
061 * This is the item that was registered with the cart via the registerMinecart function,
062 * but is not necessary the item the cart drops when destroyed.
063 * @param minecart The cart class
064 * @return An ItemStack that can be used to place the cart.
065 */
066 public static ItemStack getItemForCart(Class<? extends EntityMinecart> minecart)
067 {
068 return getItemForCart(minecart, 0);
069 }
070
071 /**
072 * This function returns an ItemStack that represents this cart.
073 * The player should be able to use this item to place the minecart.
074 * This is the item that was registered with the cart via the registerMinecart function,
075 * but is not necessary the item the cart drops when destroyed.
076 * @param minecart The cart class
077 * @param type The minecartType value
078 * @return An ItemStack that can be used to place the cart.
079 */
080 public static ItemStack getItemForCart(Class<? extends EntityMinecart> minecart, int type)
081 {
082 ItemStack item = itemForMinecart.get(new MinecartKey(minecart, type));
083 if (item == null)
084 {
085 return null;
086 }
087 return item.copy();
088 }
089
090 /**
091 * This function returns an ItemStack that represents this cart.
092 * The player should be able to use this item to place the minecart.
093 * This is the item that was registered with the cart via the registerMinecart function,
094 * but is not necessary the item the cart drops when destroyed.
095 * @param cart The cart entity
096 * @return An ItemStack that can be used to place the cart.
097 */
098 public static ItemStack getItemForCart(EntityMinecart cart)
099 {
100 return getItemForCart(cart.getClass(), cart.getMinecartType());
101 }
102
103 /**
104 * The function will return the cart class for a given item.
105 * If the item was not registered via the registerMinecart function it will return null.
106 * @param item The item to test.
107 * @return Cart if mapping exists, null if not.
108 */
109 public static Class<? extends EntityMinecart> getCartClassForItem(ItemStack item)
110 {
111 MinecartKey key = null;
112 for (Map.Entry<ItemStack, MinecartKey> entry : minecartForItem.entrySet())
113 {
114 if (entry.getKey().isItemEqual(item))
115 {
116 key = entry.getValue();
117 break;
118 }
119 }
120 if (key != null)
121 {
122 return key.minecart;
123 }
124 return null;
125 }
126
127 /**
128 * The function will return the cart type for a given item.
129 * Will return -1 if the mapping doesn't exist.
130 * If the item was not registered via the registerMinecart function it will return null.
131 * @param item The item to test.
132 * @return the cart minecartType value.
133 */
134 public static int getCartTypeForItem(ItemStack item)
135 {
136 MinecartKey key = null;
137 for (Map.Entry<ItemStack, MinecartKey> entry : minecartForItem.entrySet())
138 {
139 if (entry.getKey().isItemEqual(item))
140 {
141 key = entry.getValue();
142 break;
143 }
144 }
145 if (key != null)
146 {
147 return key.type;
148 }
149 return -1;
150 }
151
152 /**
153 * Will return a set of all registered minecart items.
154 * @return a copy of the set of all minecart items
155 */
156 public static Set<ItemStack> getAllCartItems()
157 {
158 Set<ItemStack> ret = new HashSet<ItemStack>();
159 for (ItemStack item : minecartForItem.keySet())
160 {
161 ret.add(item.copy());
162 }
163 return ret;
164 }
165
166 static
167 {
168 registerMinecart(EntityMinecart.class, 0, new ItemStack(Item.minecartEmpty));
169 registerMinecart(EntityMinecart.class, 1, new ItemStack(Item.minecartCrate));
170 registerMinecart(EntityMinecart.class, 2, new ItemStack(Item.minecartPowered));
171 }
172
173 public static class MinecartKey
174 {
175 public final Class<? extends EntityMinecart> minecart;
176 public final int type;
177
178 public MinecartKey(Class<? extends EntityMinecart> cls, int typtID)
179 {
180 minecart = cls;
181 type = typtID;
182 }
183
184 @Override
185 public boolean equals(Object obj)
186 {
187 if (obj == null)
188 {
189 return false;
190 }
191
192 if (getClass() != obj.getClass())
193 {
194 return false;
195 }
196
197 final MinecartKey other = (MinecartKey)obj;
198 if (this.minecart != other.minecart && (this.minecart == null || !this.minecart.equals(other.minecart)))
199 {
200 return false;
201 }
202
203 return (this.type == other.type);
204 }
205
206 @Override
207 public int hashCode()
208 {
209 int hash = 7;
210 hash = 59 * hash + (this.minecart != null ? this.minecart.hashCode() : 0);
211 hash = 59 * hash + this.type;
212 return hash;
213 }
214 }
215 }