001package cpw.mods.fml.common.registry;
002
003import java.util.Map;
004
005import net.minecraft.block.Block;
006import net.minecraft.item.Item;
007import net.minecraft.item.ItemBlock;
008import net.minecraft.nbt.NBTTagCompound;
009
010import com.google.common.base.Objects;
011import com.google.common.collect.HashMultiset;
012import com.google.common.collect.Maps;
013import com.google.common.collect.Multiset;
014
015import cpw.mods.fml.common.FMLLog;
016import cpw.mods.fml.common.Loader;
017import cpw.mods.fml.common.LoaderException;
018import cpw.mods.fml.common.ModContainer;
019
020public 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}