    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.shiftedIndex;
    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    }