package net.mcft.copy.backpacks.misc.util; import java.util.Collection; import java.util.HashMap; import java.util.Map; import net.minecraft.entity.passive.EntitySheep; import net.minecraft.item.EnumDyeColor; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; /** Contains utility methods related to dyes. */ public final class DyeUtils { private DyeUtils() { } private static final Map<String, Integer> dyes = new HashMap<String, Integer>(); static { // Ore dictionary dye names. EnumDyeColor uses "silver" instead // of "light gray", so this is a little more straight-forward. String[] nameLookup = { "Black", "Red" , "Green", "Brown" , "Blue" , "Purple" , "Cyan" , "LightGray", "Gray" , "Pink", "Lime" , "Yellow", "LightBlue", "Magenta", "Orange", "White" }; // Collect dye colors into map using the ore dictionary name as a key. for (EnumDyeColor color : EnumDyeColor.values()) { String name = "dye" + nameLookup[color.getDyeDamage()]; float[] values = EntitySheep.getDyeRgb(color); int r = (int)(values[0] * 255); int g = (int)(values[1] * 255); int b = (int)(values[2] * 255); dyes.put(name, ((r << 16) | (g << 8) | b)); } }; /** Gets the dye color of the item stack by checking the ore dictionary. * Return -1 if the stack is not a dye. */ public static int getDyeColor(ItemStack stack) { if (stack.isEmpty()) return -1; int[] oreIds = OreDictionary.getOreIDs(stack); for (int ore : oreIds) { String name = OreDictionary.getOreName(ore); Integer color = dyes.get(name); if (color != null) return color; } return -1; } /** Returns if the item stack is a dye. */ public static boolean isDye(ItemStack stack) { return (getDyeColor(stack) >= 0); } /** Returns the combined color of all the dyes and the base color. */ public static int getColorFromDyes(int color, Collection<ItemStack> dyes) { int number = dyes.size(); if (number < 1) return color; int r = 0, g = 0, b = 0; if (color >= 0) { r = (color >> 16); g = ((color >> 8) & 0xFF); b = (color & 0xFF); number++; } for (ItemStack dye : dyes) { color = getDyeColor(dye); if (color < 0) continue; r += (color >> 16); g += ((color >> 8) & 0xFF); b += (color & 0xFF); } r /= number; g /= number; b /= number; return ((r << 16) | (g << 8) | b); } /** Returns the combined color of all the dyes. */ public static int getColorFromDyes(Collection<ItemStack> dyes) { return getColorFromDyes(-1, dyes); } }