package com.demigodsrpg.util;
import com.google.common.collect.ImmutableBiMap;
import com.google.common.collect.Maps;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.material.MaterialData;
import java.awt.*;
import java.util.Map;
public class ColorUtil {
/**
* Linking ChatColor objects to the corresponding Color.
*/
public static final ImmutableBiMap<ChatColor, Color> CHAT_COLOR;
static {
Map<ChatColor, Color> chatColorColor = Maps.newHashMap();
chatColorColor.put(ChatColor.BLACK, new Color(0, 0, 0));
chatColorColor.put(ChatColor.DARK_BLUE, new Color(0, 0, 170));
chatColorColor.put(ChatColor.DARK_GREEN, new Color(0, 170, 0));
chatColorColor.put(ChatColor.DARK_AQUA, new Color(0, 170, 170));
chatColorColor.put(ChatColor.DARK_RED, new Color(170, 0, 0));
chatColorColor.put(ChatColor.DARK_PURPLE, new Color(170, 0, 170));
chatColorColor.put(ChatColor.GOLD, new Color(255, 170, 0));
chatColorColor.put(ChatColor.GRAY, new Color(170, 170, 170));
chatColorColor.put(ChatColor.DARK_GRAY, new Color(85, 85, 85));
chatColorColor.put(ChatColor.BLUE, new Color(85, 85, 255));
chatColorColor.put(ChatColor.GREEN, new Color(85, 255, 85));
chatColorColor.put(ChatColor.AQUA, new Color(85, 255, 255));
chatColorColor.put(ChatColor.RED, new Color(255, 85, 85));
chatColorColor.put(ChatColor.LIGHT_PURPLE, new Color(255, 85, 255));
chatColorColor.put(ChatColor.YELLOW, new Color(255, 255, 85));
chatColorColor.put(ChatColor.WHITE, new Color(255, 255, 255));
CHAT_COLOR = ImmutableBiMap.copyOf(chatColorColor);
}
/**
* Linking block materials to their corresponding Color.
*/
public static ImmutableBiMap<MaterialData, Color> BLOCK_COLOR;
static {
Map<MaterialData, Color> blockColor = Maps.newHashMap();
// WOOL
blockColor.put(new MaterialData(Material.WOOL, (byte) 0), new Color(238, 238, 238));
blockColor.put(new MaterialData(Material.WOOL, (byte) 1), new Color(213, 116, 50));
blockColor.put(new MaterialData(Material.WOOL, (byte) 2), new Color(168, 65, 177));
blockColor.put(new MaterialData(Material.WOOL, (byte) 3), new Color(113, 141, 201));
blockColor.put(new MaterialData(Material.WOOL, (byte) 4), new Color(193, 181, 45));
blockColor.put(new MaterialData(Material.WOOL, (byte) 5), new Color(66, 171, 55));
blockColor.put(new MaterialData(Material.WOOL, (byte) 6), new Color(203, 125, 146));
blockColor.put(new MaterialData(Material.WOOL, (byte) 7), new Color(72, 72, 72));
blockColor.put(new MaterialData(Material.WOOL, (byte) 8), new Color(127, 135, 135));
blockColor.put(new MaterialData(Material.WOOL, (byte) 9), new Color(39, 94, 117));
blockColor.put(new MaterialData(Material.WOOL, (byte) 10), new Color(120, 55, 173));
blockColor.put(new MaterialData(Material.WOOL, (byte) 11), new Color(39, 45, 116));
blockColor.put(new MaterialData(Material.WOOL, (byte) 12), new Color(74, 46, 29));
blockColor.put(new MaterialData(Material.WOOL, (byte) 13), new Color(36, 48, 19));
blockColor.put(new MaterialData(Material.WOOL, (byte) 14), new Color(153, 35, 38));
blockColor.put(new MaterialData(Material.WOOL, (byte) 15), new Color(25, 25, 25));
// HARD CLAY
blockColor.put(new MaterialData(Material.HARD_CLAY, (byte) 0), new Color(221, 176, 152));
blockColor.put(new MaterialData(Material.HARD_CLAY, (byte) 1), new Color(185, 82, 36));
blockColor.put(new MaterialData(Material.HARD_CLAY, (byte) 2), new Color(163, 83, 98));
blockColor.put(new MaterialData(Material.HARD_CLAY, (byte) 3), new Color(121, 106, 129));
blockColor.put(new MaterialData(Material.HARD_CLAY, (byte) 4), new Color(206, 132, 35));
blockColor.put(new MaterialData(Material.HARD_CLAY, (byte) 5), new Color(102, 115, 58));
blockColor.put(new MaterialData(Material.HARD_CLAY, (byte) 6), new Color(179, 75, 73));
blockColor.put(new MaterialData(Material.HARD_CLAY, (byte) 7), new Color(64, 44, 39));
blockColor.put(new MaterialData(Material.HARD_CLAY, (byte) 8), new Color(141, 102, 88));
blockColor.put(new MaterialData(Material.HARD_CLAY, (byte) 9), new Color(80, 86, 82));
blockColor.put(new MaterialData(Material.HARD_CLAY, (byte) 10), new Color(124, 67, 79));
blockColor.put(new MaterialData(Material.HARD_CLAY, (byte) 11), new Color(77, 63, 86));
blockColor.put(new MaterialData(Material.HARD_CLAY, (byte) 12), new Color(83, 55, 39));
blockColor.put(new MaterialData(Material.HARD_CLAY, (byte) 13), new Color(73, 82, 46));
blockColor.put(new MaterialData(Material.HARD_CLAY, (byte) 14), new Color(166, 61, 46));
blockColor.put(new MaterialData(Material.HARD_CLAY, (byte) 15), new Color(44, 32, 19));
// SAND
blockColor.put(new MaterialData(Material.SAND, (byte) 0), new Color(247, 233, 163));
blockColor.put(new MaterialData(Material.SANDSTONE, (byte) 0), new Color(213, 201, 140));
// STONE
blockColor.put(new MaterialData(Material.STONE, (byte) 0), new Color(144, 144, 144));
blockColor.put(new MaterialData(Material.SMOOTH_BRICK, (byte) 0), new Color(117, 117, 117));
// REDSTONE
blockColor.put(new MaterialData(Material.REDSTONE_BLOCK, (byte) 0), new Color(255, 0, 0));
// ICE
blockColor.put(new MaterialData(Material.PACKED_ICE, (byte) 0), new Color(160, 160, 255));
blockColor.put(new MaterialData(Material.ICE, (byte) 0), new Color(138, 138, 220));
// DIRT
blockColor.put(new MaterialData(Material.DIRT, (byte) 0), new Color(73, 58, 35));
// NETHER
blockColor.put(new MaterialData(Material.NETHER_BRICK, (byte) 0), new Color(112, 2, 0));
// OBSIDIAN
blockColor.put(new MaterialData(Material.OBSIDIAN, (byte) 0), new Color(21, 20, 31));
// COAL
blockColor.put(new MaterialData(Material.COAL_BLOCK, (byte) 0), new Color(12, 12, 12));
// EMERALD
blockColor.put(new MaterialData(Material.EMERALD_BLOCK, (byte) 0), new Color(0, 217, 58));
BLOCK_COLOR = ImmutableBiMap.copyOf(blockColor);
}
/**
* Color distance formula.
*
* @param c1 Color one.
* @param c2 Color two.
* @return The 'distance' between the two colors.
*/
public static double getColorDistance(Color c1, Color c2) {
double rmean = (c1.getRed() + c2.getRed()) / 2;
int r = c1.getRed() - c2.getRed();
int g = c1.getGreen() - c2.getGreen();
int b = c1.getBlue() - c2.getBlue();
double weightR = 2 + rmean / 256;
double weightG = 4.0;
double weightB = 2 + (255 - rmean) / 256;
return Math.sqrt(weightR * r * r + weightG * g * g + weightB * b * b);
}
/**
* Get a ChatColor that is best related to a given Color.
*
* @param color Color to be matched.
* @return Best ChatColor found.
*/
public static ChatColor getChatColor(final Color color) {
Color nearestColor = Color.WHITE;
double bestDistance = Double.MAX_VALUE;
for (Color chatColor : CHAT_COLOR.values()) {
double distance = getColorDistance(chatColor, color);
if (distance < bestDistance) {
nearestColor = chatColor;
bestDistance = distance;
}
}
return CHAT_COLOR.inverse().get(nearestColor);
}
/**
* Get a Color that is best related to a given ChatColor.
*
* @param color ChatColor to be matched.
* @return Best Color found.
*/
public static Color getColor(final ChatColor color) {
return CHAT_COLOR.get(color);
}
/**
* Get MaterialData that is best related to a given ChatColor.
*
* @param color ChatColor to be matched.
* @return Best MaterialData found.
*/
public static MaterialData getMaterial(final ChatColor color) {
return getMaterial(Color.WHITE, getColor(color));
}
/**
* Get MaterialData that is best related to a given Color.
*
* @param color Color to be matched.
* @return Best MaterialData found.
*/
public static MaterialData getMaterial(Color average, final Color color) {
Color nearestColor = average;
double bestDistance = Double.MAX_VALUE;
for (Color theColor : BLOCK_COLOR.values()) {
double distance = getColorDistance(theColor, color);
if (distance < bestDistance) {
nearestColor = theColor;
bestDistance = distance;
}
}
return BLOCK_COLOR.inverse().get(nearestColor);
}
/**
* Returns a color (red, yellow, green) based on the <code>value</code> and <code>max</code> passed in.
*
* @param value the actual value.
* @param max the maximum value possible.
*/
public static ChatColor getColor(double value, double max) {
ChatColor color = ChatColor.RESET;
if (value < Math.ceil(0.33 * max)) color = ChatColor.RED;
else if (value < Math.ceil(0.66 * max) && value > Math.ceil(0.33 * max)) color = ChatColor.YELLOW;
if (value > Math.ceil(0.66 * max)) color = ChatColor.GREEN;
return color;
}
}