|
| 1 | +package gregtech.api.items.metaitem; |
| 2 | + |
| 3 | +import com.google.common.base.CaseFormat; |
| 4 | +import com.google.common.collect.ImmutableList; |
| 5 | +import gnu.trove.map.hash.TIntObjectHashMap; |
| 6 | +import gregtech.api.unification.OreDictUnifier; |
| 7 | +import gregtech.api.unification.material.info.MaterialIconSet; |
| 8 | +import gregtech.api.unification.material.info.MaterialIconType; |
| 9 | +import gregtech.api.unification.ore.OrePrefix; |
| 10 | +import net.minecraft.client.renderer.block.model.ModelBakery; |
| 11 | +import net.minecraft.client.renderer.block.model.ModelResourceLocation; |
| 12 | +import net.minecraft.item.ItemStack; |
| 13 | +import net.minecraft.util.ResourceLocation; |
| 14 | +import net.minecraftforge.fml.relauncher.Side; |
| 15 | +import net.minecraftforge.fml.relauncher.SideOnly; |
| 16 | + |
| 17 | +import java.util.HashMap; |
| 18 | +import java.util.List; |
| 19 | +import java.util.Map; |
| 20 | + |
| 21 | +public class MetaOreDictItem extends StandardMetaItem { |
| 22 | + |
| 23 | + private static final Map<Short, OreDictValueItem> ITEMS = new HashMap<>(); |
| 24 | + private static final List<MaterialIconType> DISALLOWED_TYPES = ImmutableList.of( |
| 25 | + MaterialIconType.block, MaterialIconType.foilBlock, MaterialIconType.wire, |
| 26 | + MaterialIconType.ore, MaterialIconType.frameGt, MaterialIconType.pipeHuge, |
| 27 | + MaterialIconType.pipeLarge, MaterialIconType.pipeSide, MaterialIconType.pipeSmall, |
| 28 | + MaterialIconType.pipeMedium, MaterialIconType.pipeTiny); |
| 29 | + |
| 30 | + public MetaOreDictItem(short metaItemOffset) { |
| 31 | + super(metaItemOffset); |
| 32 | + } |
| 33 | + |
| 34 | + @Override |
| 35 | + public void registerSubItems() { |
| 36 | + for (OreDictValueItem item : ITEMS.values()) { |
| 37 | + addItem(item.id, item.getName()); |
| 38 | + OreDictUnifier.registerOre(new ItemStack(this, 1, item.id), item.getOre()); |
| 39 | + } |
| 40 | + } |
| 41 | + |
| 42 | + @Override |
| 43 | + @SideOnly(Side.CLIENT) |
| 44 | + protected int getColorForItemStack(ItemStack stack, int tintIndex) { |
| 45 | + if (tintIndex == 0) { |
| 46 | + OreDictValueItem item = ITEMS.get((short) stack.getItemDamage()); |
| 47 | + return item == null ? 0xFFFFFF : item.materialRGB; |
| 48 | + } |
| 49 | + return super.getColorForItemStack(stack, tintIndex); |
| 50 | + } |
| 51 | + |
| 52 | + @Override |
| 53 | + @SideOnly(Side.CLIENT) |
| 54 | + public void registerModels() { |
| 55 | + super.registerModels(); |
| 56 | + TIntObjectHashMap<ModelResourceLocation> alreadyRegistered = new TIntObjectHashMap<>(); |
| 57 | + for (Map.Entry<Short, OreDictValueItem> metaItem : ITEMS.entrySet()) { |
| 58 | + OrePrefix prefix = metaItem.getValue().orePrefix; |
| 59 | + MaterialIconSet materialIconSet = metaItem.getValue().materialIconSet; |
| 60 | + if (prefix.materialIconType == null || DISALLOWED_TYPES.contains(prefix.materialIconType)) |
| 61 | + continue; |
| 62 | + int registrationKey = prefix.id * 1000 + materialIconSet.ordinal(); |
| 63 | + if (!alreadyRegistered.containsKey(registrationKey)) { |
| 64 | + prefix.materialIconType.getItemModelPath(materialIconSet); |
| 65 | + ResourceLocation resourceLocation = prefix.materialIconType.getItemModelPath(materialIconSet); |
| 66 | + ModelBakery.registerItemVariants(this, resourceLocation); |
| 67 | + alreadyRegistered.put(registrationKey, new ModelResourceLocation(resourceLocation, "inventory")); |
| 68 | + } |
| 69 | + ModelResourceLocation resourceLocation = alreadyRegistered.get(registrationKey); |
| 70 | + metaItemsModels.put(metaItem.getKey(), resourceLocation); |
| 71 | + } |
| 72 | + } |
| 73 | + |
| 74 | + public static class OreDictValueItem { |
| 75 | + |
| 76 | + private final String materialName; |
| 77 | + private final int materialRGB; |
| 78 | + private final MaterialIconSet materialIconSet; |
| 79 | + private final short id; |
| 80 | + private final OrePrefix orePrefix; |
| 81 | + |
| 82 | + public OreDictValueItem(short id, String materialName, int materialRGB, MaterialIconSet materialIconSet, OrePrefix orePrefix) { |
| 83 | + this.id = id; |
| 84 | + this.materialName = materialName; |
| 85 | + this.materialRGB = materialRGB; |
| 86 | + this.materialIconSet = materialIconSet; |
| 87 | + this.orePrefix = orePrefix; |
| 88 | + ITEMS.put(id, this); |
| 89 | + } |
| 90 | + |
| 91 | + public String getOre() { |
| 92 | + return orePrefix.name() + CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, materialName); |
| 93 | + } |
| 94 | + |
| 95 | + public ItemStack getItemStack(int amount) { |
| 96 | + ItemStack stack = OreDictUnifier.get(getOre()); |
| 97 | + stack.setCount(amount); |
| 98 | + return stack; |
| 99 | + } |
| 100 | + |
| 101 | + public ItemStack getItemStack() { |
| 102 | + return getItemStack(1); |
| 103 | + } |
| 104 | + |
| 105 | + public String getName() { |
| 106 | + return materialName + '_' + CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, orePrefix.name()); |
| 107 | + } |
| 108 | + } |
| 109 | +} |
0 commit comments