package joshie.harvest.core.base.item; import joshie.harvest.api.core.HFRegistry; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.registry.IForgeRegistry; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nonnull; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public abstract class ItemHFRegistry<I extends ItemHFRegistry, E extends HFRegistry<E>> extends ItemHFBase<I> { //TODO: Remove in 0.7+ private final IForgeRegistry<E> oldRegistry; private final Map<ResourceLocation, E> newRegistry; private final String nbt; public ItemHFRegistry(String nbt, IForgeRegistry<E> oldRegistry, Map<ResourceLocation, E> newRegistry, CreativeTabs tabs) { super(tabs); this.nbt = nbt; this.oldRegistry = oldRegistry; //TODO: Remove in 0.7+ this.newRegistry = newRegistry; } @Override public int getMetadata(int damage) { return damage; } @SideOnly(Side.CLIENT) @Override public void registerModels(Item item, String name) {} public ItemStack getStackFromObject(E e) { ItemStack stack = new ItemStack(this); NBTTagCompound tag = new NBTTagCompound(); tag.setString(nbt, e.getResource().toString()); stack.setTagCompound(tag); return stack; } public E getObjectFromStack(ItemStack stack) { //TODO: Remove in 0.7+ if (stack.getTagCompound() == null || !stack.getTagCompound().hasKey(nbt)) { int id = Math.max(0, Math.min(oldRegistry.getValues().size() - 1, stack.getItemDamage())); NBTTagCompound tag = stack.getTagCompound() != null ? stack.getTagCompound() : new NBTTagCompound(); E object = oldRegistry.getValues().get(id); if (object == null) object = getDefaultValue(); tag.setString(nbt, object.getResource().toString()); stack.setTagCompound(tag); return object; } else return newRegistry.get(new ResourceLocation(stack.getTagCompound().getString(nbt))); } @Override @SideOnly(Side.CLIENT) public void getSubItems(@Nonnull Item item, CreativeTabs tab, List<ItemStack> list) { list.addAll(newRegistry.values().stream().map(this::getStackFromObject).collect(Collectors.toList())); } protected abstract E getDefaultValue(); }