// Path: src/com/jaquadro/minecraft/chameleon/resources/IItemEnum.java
// public interface IItemEnum extends IStringSerializable
// {
//     String getUnlocalizedName ();
// 
//     int getMetadata ();
// }
// 
// Path: src/com/jaquadro/minecraft/chameleon/resources/IItemMeshMapper.java
// public interface IItemMeshMapper
// {
//     List<Pair<ItemStack, ModelResourceLocation>> getMeshMappings ();
// }
// 
// Path: src/com/jaquadro/minecraft/chameleon/resources/IItemVariantProvider.java
// public interface IItemVariantProvider
// {
//     List<ResourceLocation> getItemVariants ();
// }


import com.jaquadro.minecraft.chameleon.resources.IItemEnum;
import com.jaquadro.minecraft.chameleon.resources.IItemMeshMapper;
import com.jaquadro.minecraft.chameleon.resources.IItemVariantProvider;
import net.minecraft.block.Block;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.registry.ForgeRegistries;
import org.apache.commons.lang3.tuple.Pair;
import java.util.ArrayList;
import java.util.List;
import java.util.function.IntFunction;
        setMaxDamage(0);
        setHasSubtypes(true);
    }

    @Override
    public int getMetadata (int damage) {
        return damage;
    }

    @Override
    public String getUnlocalizedName (ItemStack itemStack) {
        T material = metaLookup.apply(itemStack.getMetadata());
        return super.getUnlocalizedName() + "." + material.getUnlocalizedName();
    }

    @Override
    public List<Pair<ItemStack, ModelResourceLocation>> getMeshMappings () {
        List<Pair<ItemStack, ModelResourceLocation>> mappings = new ArrayList<Pair<ItemStack, ModelResourceLocation>>();

        for (T entry : clazz.getEnumConstants()) {
            IBlockState state = block.getDefaultState().withProperty(property, entry);
            ModelResourceLocation location = new ModelResourceLocation(block.getRegistryName().toString() + '_' + entry.getName(), "inventory");
            mappings.add(Pair.of(new ItemStack(this, 1, block.getMetaFromState(state)), location));
        }

        return mappings;
    }

    @Override
    public List<ResourceLocation> getItemVariants () {
// Path: src/com/jaquadro/minecraft/chameleon/resources/IItemEnum.java
// public interface IItemEnum extends IStringSerializable
// {
//     String getUnlocalizedName ();
// 
//     int getMetadata ();
// }
// 
// Path: src/com/jaquadro/minecraft/chameleon/resources/IItemMeshMapper.java
// public interface IItemMeshMapper
// {
//     List<Pair<ItemStack, ModelResourceLocation>> getMeshMappings ();
// }
// 
// Path: src/com/jaquadro/minecraft/chameleon/resources/IItemVariantProvider.java
// public interface IItemVariantProvider
// {
//     List<ResourceLocation> getItemVariants ();
// }


// Path: src/com/jaquadro/minecraft/chameleon/item/ChamMultiItemBlock.java
import com.jaquadro.minecraft.chameleon.resources.IItemEnum;
import com.jaquadro.minecraft.chameleon.resources.IItemMeshMapper;
import com.jaquadro.minecraft.chameleon.resources.IItemVariantProvider;
import net.minecraft.block.Block;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.registry.ForgeRegistries;
import org.apache.commons.lang3.tuple.Pair;
import java.util.ArrayList;
import java.util.List;
import java.util.function.IntFunction;

        setMaxDamage(0);
        setHasSubtypes(true);
    }

    @Override
    public int getMetadata (int damage) {
        return damage;
    }

    @Override
    public String getUnlocalizedName (ItemStack itemStack) {
        T material = metaLookup.apply(itemStack.getMetadata());
        return super.getUnlocalizedName() + "." + material.getUnlocalizedName();
    }

    @Override
    public List<Pair<ItemStack, ModelResourceLocation>> getMeshMappings () {
        List<Pair<ItemStack, ModelResourceLocation>> mappings = new ArrayList<Pair<ItemStack, ModelResourceLocation>>();

        for (T entry : clazz.getEnumConstants()) {
            IBlockState state = block.getDefaultState().withProperty(property, entry);
            ModelResourceLocation location = new ModelResourceLocation(block.getRegistryName().toString() + '_' + entry.getName(), "inventory");
            mappings.add(Pair.of(new ItemStack(this, 1, block.getMetaFromState(state)), location));
        }

        return mappings;
    }

    @Override
    public List<ResourceLocation> getItemVariants () {
        ResourceLocation location = ForgeRegistries.ITEMS.getKey(this);