package joshie.harvest.core.util.holders; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import joshie.harvest.api.HFApi; import joshie.harvest.api.core.Mod; import joshie.harvest.api.core.Ore; import joshie.harvest.core.base.item.ItemHFSizeable; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; import java.util.Collection; public class HolderRegistrySet { private final Multimap<Item, AbstractItemHolder> setMap = HashMultimap.create(); private void registerHolder(Item item, AbstractItemHolder holder) { setMap.get(item).add(holder); } private void unregisterHolder(Item item, AbstractItemHolder holder) { setMap.remove(item, holder); if (setMap.get(item).size() == 0) { setMap.removeAll(item); } } public void unregister(Object object) { if (object instanceof Item) unregisterHolder((Item)object, ItemHolder.of((Item)object)); if (object instanceof Block) { ItemStack stack = new ItemStack((Block)object); unregisterHolder(stack.getItem(), ItemHolder.of(stack.getItem())); } else if (object instanceof ItemStack) { unregisterHolder(((ItemStack)object).getItem(), getHolder((ItemStack)object)); } else if (object instanceof Mod) { Mod mod = (Mod) object; ModHolder holder = ModHolder.of(mod.getMod()); for (Item item: Item.REGISTRY) { if (item.getRegistryName().getResourceDomain().equals(mod.getMod())) { unregisterHolder(item, holder); } } } else if (object instanceof Ore) { Ore ore = (Ore) object; OreHolder holder = OreHolder.of(ore.getOre(), ore.getType()); for (ItemStack stack: OreDictionary.getOres(ore.getOre())) { unregisterHolder(stack.getItem(), holder); } } } public void register(Object object) { if (object instanceof Item) registerHolder((Item)object, ItemHolder.of((Item)object)); if (object instanceof Block) { ItemStack stack = new ItemStack((Block)object); registerHolder(stack.getItem(), ItemHolder.of(stack.getItem())); } else if (object instanceof ItemStack) { registerHolder(((ItemStack)object).getItem(), getHolder((ItemStack)object)); } else if (object instanceof Mod) { Mod mod = (Mod) object; ModHolder holder = ModHolder.of(mod.getMod()); for (Item item: Item.REGISTRY) { if (item.getRegistryName().getResourceDomain().equals(mod.getMod())) { registerHolder(item, holder); } } } else if (object instanceof Ore) { Ore ore = (Ore) object; OreHolder holder = OreHolder.of(ore.getOre(), ore.getType()); for (ItemStack stack: holder.getMatchingStacks()) { registerHolder(stack.getItem(), holder); } } } public boolean contains(ItemStack stack) { Collection<AbstractItemHolder> holders = setMap.get(stack.getItem()); for (AbstractItemHolder holder: holders) { if (holder.matches(stack)) { return true; } } return false; } private AbstractItemHolder getHolder(ItemStack stack) { if (stack.getItemDamage() == OreDictionary.WILDCARD_VALUE) return ItemHolder.of(stack.getItem()); else if (stack.getItem() instanceof ItemHFSizeable) return SizeableHolder.of(stack); else if (HFApi.crops.getCropFromStack(stack) != null) return CropHolder.of(HFApi.crops.getCropFromStack(stack)); else return ItemStackHolder.of(stack); } }