001 package cpw.mods.fml.common.registry;
002
003 import java.util.Map;
004
005 import net.minecraft.block.Block;
006 import net.minecraft.item.Item;
007 import net.minecraft.item.ItemBlock;
008 import net.minecraft.nbt.NBTTagCompound;
009
010 import com.google.common.base.Objects;
011 import com.google.common.collect.HashMultiset;
012 import com.google.common.collect.Maps;
013 import com.google.common.collect.Multiset;
014
015 import cpw.mods.fml.common.FMLLog;
016 import cpw.mods.fml.common.Loader;
017 import cpw.mods.fml.common.LoaderException;
018 import cpw.mods.fml.common.ModContainer;
019
020 public class ItemData {
021
022 private static Map<String, Multiset<String>> modOrdinals = Maps.newHashMap();
023 private final String modId;
024 private final String itemType;
025 private final int itemId;
026 private final int ordinal;
027 private String forcedModId;
028 private String forcedName;
029
030 public ItemData(Item item, ModContainer mc)
031 {
032 this.itemId = item.itemID;
033 if (item.getClass().equals(ItemBlock.class))
034 {
035 this.itemType = Block.blocksList[this.getItemId()].getClass().getName();
036 }
037 else
038 {
039 this.itemType = item.getClass().getName();
040 }
041 this.modId = mc.getModId();
042 if (!modOrdinals.containsKey(mc.getModId()))
043 {
044 modOrdinals.put(mc.getModId(), HashMultiset.<String>create());
045 }
046 this.ordinal = modOrdinals.get(mc.getModId()).add(itemType, 1);
047 }
048
049 public ItemData(NBTTagCompound tag)
050 {
051 this.modId = tag.getString("ModId");
052 this.itemType = tag.getString("ItemType");
053 this.itemId = tag.getInteger("ItemId");
054 this.ordinal = tag.getInteger("ordinal");
055 this.forcedModId = tag.hasKey("ForcedModId") ? tag.getString("ForcedModId") : null;
056 this.forcedName = tag.hasKey("ForcedName") ? tag.getString("ForcedName") : null;
057 }
058
059 public String getItemType()
060 {
061 return this.forcedName !=null ? forcedName : itemType;
062 }
063
064 public String getModId()
065 {
066 return this.forcedModId != null ? forcedModId : modId;
067 }
068
069 public int getOrdinal()
070 {
071 return ordinal;
072 }
073
074 public int getItemId()
075 {
076 return itemId;
077 }
078
079 public NBTTagCompound toNBT()
080 {
081 NBTTagCompound tag = new NBTTagCompound();
082 tag.setString("ModId", modId);
083 tag.setString("ItemType", itemType);
084 tag.setInteger("ItemId", itemId);
085 tag.setInteger("ordinal", ordinal);
086 if (forcedModId != null)
087 {
088 tag.setString("ForcedModId", forcedModId);
089 }
090 if (forcedName != null)
091 {
092 tag.setString("ForcedName", forcedName);
093 }
094 return tag;
095 }
096
097 @Override
098 public int hashCode()
099 {
100 return Objects.hashCode(itemId, ordinal);
101 }
102
103 @Override
104 public boolean equals(Object obj)
105 {
106 try
107 {
108 ItemData other = (ItemData) obj;
109 return Objects.equal(getModId(), other.getModId()) && Objects.equal(getItemType(), other.getItemType()) && Objects.equal(itemId, other.itemId) && ( isOveridden() || Objects.equal(ordinal, other.ordinal));
110 }
111 catch (ClassCastException cce)
112 {
113 return false;
114 }
115 }
116
117 @Override
118 public String toString()
119 {
120 return String.format("Item %d, Type %s, owned by %s, ordinal %d, name %s, claimedModId %s", itemId, itemType, modId, ordinal, forcedName, forcedModId);
121 }
122
123 public boolean mayDifferByOrdinal(ItemData rightValue)
124 {
125 return Objects.equal(getItemType(), rightValue.getItemType()) && Objects.equal(getModId(), rightValue.getModId());
126 }
127
128 public boolean isOveridden()
129 {
130 return forcedName != null;
131 }
132
133 public void setName(String name, String modId)
134 {
135 if (name == null)
136 {
137 this.forcedName = null;
138 this.forcedModId = null;
139 return;
140 }
141 String localModId = modId;
142 if (modId == null)
143 {
144 localModId = Loader.instance().activeModContainer().getModId();
145 }
146 if (modOrdinals.get(localModId).count(name)>0)
147 {
148 FMLLog.severe("The mod %s is attempting to redefine the item at id %d with a non-unique name (%s.%s)", Loader.instance().activeModContainer(), itemId, localModId, name);
149 throw new LoaderException();
150 }
151 modOrdinals.get(localModId).add(name);
152 this.forcedModId = modId;
153 this.forcedName = name;
154 }
155 }