// MOAR COLORS // By Dr. McKay // Inspired by: https://forums.alliedmods.net/showthread.php?t=96831 #if defined _colors_included #endinput #endif #define _colors_included #include #define MORE_COLORS_VERSION "1.9.1" #define MAX_MESSAGE_LENGTH 256 #define MAX_BUFFER_LENGTH (MAX_MESSAGE_LENGTH * 4) #define COLOR_RED 0xFF4040 #define COLOR_BLUE 0x99CCFF #define COLOR_GRAY 0xCCCCCC #define COLOR_GREEN 0x3EFF3E #define GAME_DODS 0 new bool:CSkipList[MAXPLAYERS + 1]; new Handle:CTrie; new CTeamColors[][] = {{0xCCCCCC, 0x4D7942, 0xFF4040}}; // Multi-dimensional array for games that don't support SayText2. First index is the game index (as defined by the GAME_ defines), second index is team. 0 = spectator, 1 = team1, 2 = team2 /** * Prints a message to a specific client in the chat area. * Supports color tags. * * @param client Client index. * @param message Message (formatting rules). * @noreturn * * On error/Errors: If the client is not connected an error will be thrown. */ stock CPrintToChat(client, const String:message[], any:...) { CCheckTrie(); if(client <= 0 || client > MaxClients) { ThrowError("Invalid client index %i", client); } if(!IsClientInGame(client)) { ThrowError("Client %i is not in game", client); } decl String:buffer[MAX_BUFFER_LENGTH], String:buffer2[MAX_BUFFER_LENGTH]; SetGlobalTransTarget(client); Format(buffer, sizeof(buffer), "\x01%s", message); VFormat(buffer2, sizeof(buffer2), buffer, 3); CReplaceColorCodes(buffer2); CSendMessage(client, buffer2); } /** * Prints a message to all clients in the chat area. * Supports color tags. * * @param client Client index. * @param message Message (formatting rules). * @noreturn */ stock CPrintToChatAll(const String:message[], any:...) { CCheckTrie(); decl String:buffer[MAX_BUFFER_LENGTH], String:buffer2[MAX_BUFFER_LENGTH]; for(new i = 1; i <= MaxClients; i++) { if(!IsClientInGame(i) || CSkipList[i]) { CSkipList[i] = false; continue; } SetGlobalTransTarget(i); Format(buffer, sizeof(buffer), "\x01%s", message); VFormat(buffer2, sizeof(buffer2), buffer, 2); CReplaceColorCodes(buffer2); CSendMessage(i, buffer2); } } /** * Prints a message to a specific client in the chat area. * Supports color tags and teamcolor tag. * * @param client Client index. * @param author Author index whose color will be used for teamcolor tag. * @param message Message (formatting rules). * @noreturn * * On error/Errors: If the client or author are not connected an error will be thrown */ stock CPrintToChatEx(client, author, const String:message[], any:...) { CCheckTrie(); if(client <= 0 || client > MaxClients) { ThrowError("Invalid client index %i", client); } if(!IsClientInGame(client)) { ThrowError("Client %i is not in game", client); } if(author <= 0 || author > MaxClients) { ThrowError("Invalid client index %i", author); } if(!IsClientInGame(author)) { ThrowError("Client %i is not in game", author); } decl String:buffer[MAX_BUFFER_LENGTH], String:buffer2[MAX_BUFFER_LENGTH]; SetGlobalTransTarget(client); Format(buffer, sizeof(buffer), "\x01%s", message); VFormat(buffer2, sizeof(buffer2), buffer, 4); CReplaceColorCodes(buffer2, author); CSendMessage(client, buffer2, author); } /** * Prints a message to all clients in the chat area. * Supports color tags and teamcolor tag. * * @param author Author index whose color will be used for teamcolor tag. * @param message Message (formatting rules). * @noreturn * * On error/Errors: If the author is not connected an error will be thrown. */ stock CPrintToChatAllEx(author, const String:message[], any:...) { CCheckTrie(); if(author <= 0 || author > MaxClients) { ThrowError("Invalid client index %i", author); } if(!IsClientInGame(author)) { ThrowError("Client %i is not in game", author); } decl String:buffer[MAX_BUFFER_LENGTH], String:buffer2[MAX_BUFFER_LENGTH]; for(new i = 1; i <= MaxClients; i++) { if(!IsClientInGame(i) || CSkipList[i]) { CSkipList[i] = false; continue; } SetGlobalTransTarget(i); Format(buffer, sizeof(buffer), "\x01%s", message); VFormat(buffer2, sizeof(buffer2), buffer, 3); CReplaceColorCodes(buffer2, author); CSendMessage(i, buffer2, author); } } /** * Sends a SayText2 usermessage * * @param client Client to send usermessage to * @param message Message to send * @noreturn */ stock CSendMessage(client, const String:message[], author=0) { if(author == 0) { author = client; } decl String:buffer[MAX_MESSAGE_LENGTH], String:game[16]; GetGameFolderName(game, sizeof(game)); strcopy(buffer, sizeof(buffer), message); new UserMsg:index = GetUserMessageId("SayText2"); if(index == INVALID_MESSAGE_ID) { if(StrEqual(game, "dod")) { new team = GetClientTeam(author); if(team == 0) { ReplaceString(buffer, sizeof(buffer), "\x03", "\x04", false); // Unassigned gets green } else { decl String:temp[16]; Format(temp, sizeof(temp), "\x07%06X", CTeamColors[GAME_DODS][team - 1]); ReplaceString(buffer, sizeof(buffer), "\x03", temp, false); } } PrintToChat(client, "%s", buffer); return; } new Handle:buf = StartMessageOne("SayText2", client, USERMSG_RELIABLE|USERMSG_BLOCKHOOKS); if(GetFeatureStatus(FeatureType_Native, "GetUserMessageType") == FeatureStatus_Available && GetUserMessageType() == UM_Protobuf) { PbSetInt(buf, "ent_idx", author); PbSetBool(buf, "chat", true); PbSetString(buf, "msg_name", buffer); PbAddString(buf, "params", ""); PbAddString(buf, "params", ""); PbAddString(buf, "params", ""); PbAddString(buf, "params", ""); } else { BfWriteByte(buf, author); // Message author BfWriteByte(buf, true); // Chat message BfWriteString(buf, buffer); // Message text } EndMessage(); } /** * This function should only be used right in front of * CPrintToChatAll or CPrintToChatAllEx. It causes those functions * to skip the specified client when printing the message. * After printing the message, the client will no longer be skipped. * * @param client Client index * @noreturn */ stock CSkipNextClient(client) { if(client <= 0 || client > MaxClients) { ThrowError("Invalid client index %i", client); } CSkipList[client] = true; } /** * Checks if the colors trie is initialized and initializes it if it's not (used internally) * * @return No return */ stock CCheckTrie() { if(CTrie == INVALID_HANDLE) { CTrie = InitColorTrie(); } } /** * Replaces color tags in a string with color codes (used internally by CPrintToChat, CPrintToChatAll, CPrintToChatEx, and CPrintToChatAllEx * * @param buffer String. * @param author Optional client index to use for {teamcolor} tags, or 0 for none * @param removeTags Optional boolean value to determine whether we're replacing tags with colors, or just removing tags, used by CRemoveTags * @param maxlen Optional value for max buffer length, used by CRemoveTags * @noreturn * * On error/Errors: If the client index passed for author is invalid or not in game. */ stock CReplaceColorCodes(String:buffer[], author=0, bool:removeTags=false, maxlen=MAX_BUFFER_LENGTH) { CCheckTrie(); if(!removeTags) { ReplaceString(buffer, maxlen, "{default}", "\x01", false); } else { ReplaceString(buffer, maxlen, "{default}", "", false); ReplaceString(buffer, maxlen, "{teamcolor}", "", false); } if(author != 0 && !removeTags) { if(author < 0 || author > MaxClients) { ThrowError("Invalid client index %i", author); } if(!IsClientInGame(author)) { ThrowError("Client %i is not in game", author); } ReplaceString(buffer, maxlen, "{teamcolor}", "\x03", false); } new cursor = 0; new value; decl String:tag[32], String:buff[32], String:output[maxlen]; strcopy(output, maxlen, buffer); // Since the string's size is going to be changing, output will hold the replaced string and we'll search buffer new Handle:regex = CompileRegex("{[a-zA-Z0-9]+}"); for(new i = 0; i < 1000; i++) { // The RegEx extension is quite flaky, so we have to loop here :/. This loop is supposed to be infinite and broken by return, but conditions have been added to be safe. if(MatchRegex(regex, buffer[cursor]) < 1) { CloseHandle(regex); strcopy(buffer, maxlen, output); return; } GetRegexSubString(regex, 0, tag, sizeof(tag)); CStrToLower(tag); cursor = StrContains(buffer[cursor], tag, false) + cursor + 1; strcopy(buff, sizeof(buff), tag); ReplaceString(buff, sizeof(buff), "{", ""); ReplaceString(buff, sizeof(buff), "}", ""); if(!GetTrieValue(CTrie, buff, value)) { continue; } if(removeTags) { ReplaceString(output, maxlen, tag, "", false); } else { Format(buff, sizeof(buff), "\x07%06X", value); ReplaceString(output, maxlen, tag, buff, false); } } LogError("[MORE COLORS] Infinite loop broken."); } /** * Gets a part of a string * * @param input String to get the part from * @param output Buffer to write to * @param maxlen Max length of output buffer * @param start Position to start at * @param numChars Number of characters to return, or 0 for the end of the string * @noreturn */ stock CSubString(const String:input[], String:output[], maxlen, start, numChars=0) { new i = 0; for(;;) { if(i == maxlen - 1 || i >= numChars || input[start + i] == '\0') { output[i] = '\0'; return; } output[i] = input[start + i]; i++; } } /** * Converts a string to lowercase * * @param buffer String to convert * @noreturn */ stock CStrToLower(String:buffer[]) { new len = strlen(buffer); for(new i = 0; i < len; i++) { buffer[i] = CharToLower(buffer[i]); } } /** * Adds a color to the colors trie * * @param name Color name, without braces * @param color Hexadecimal representation of the color (0xRRGGBB) * @return True if color was added successfully, false if a color already exists with that name */ stock bool:CAddColor(const String:name[], color) { CCheckTrie(); new value; if(GetTrieValue(CTrie, name, value)) { return false; } decl String:newName[64]; strcopy(newName, sizeof(newName), name); CStrToLower(newName); SetTrieValue(CTrie, newName, color); return true; } /** * Removes color tags from a message * * @param message Message to remove tags from * @param maxlen Maximum buffer length * @noreturn */ stock CRemoveTags(String:message[], maxlen) { CReplaceColorCodes(message, 0, true, maxlen); } /** * Replies to a command with colors * * @param client Client to reply to * @param message Message (formatting rules) * @noreturn */ stock CReplyToCommand(client, const String:message[], any:...) { decl String:buffer[MAX_BUFFER_LENGTH]; SetGlobalTransTarget(client); VFormat(buffer, sizeof(buffer), message, 3); if(GetCmdReplySource() == SM_REPLY_TO_CONSOLE) { CRemoveTags(buffer, sizeof(buffer)); PrintToConsole(client, "%s", buffer); } else { CPrintToChat(client, "%s", buffer); } } /** * Replies to a command with colors * * @param client Client to reply to * @param author Client to use for {teamcolor} * @param message Message (formatting rules) * @noreturn */ stock CReplyToCommandEx(client, author, const String:message[], any:...) { decl String:buffer[MAX_BUFFER_LENGTH]; SetGlobalTransTarget(client); VFormat(buffer, sizeof(buffer), message, 4); if(GetCmdReplySource() == SM_REPLY_TO_CONSOLE) { CRemoveTags(buffer, sizeof(buffer)); PrintToConsole(client, "%s", buffer); } else { CPrintToChatEx(client, author, "%s", buffer); } } /** * Shows admin activity with colors * * @param client Client performing an action * @param message Message (formatting rules) * @noreturn */ stock CShowActivity(client, const String:message[], any:...) { CCheckTrie(); if(client < 0 || client > MaxClients) { ThrowError("Invalid client index %d", client); } if(client != 0 && !IsClientInGame(client)) { ThrowError("Client %d is not in game", client); } decl String:buffer[MAX_BUFFER_LENGTH], String:buffer2[MAX_BUFFER_LENGTH]; Format(buffer, sizeof(buffer), "\x01%s", message); VFormat(buffer2, sizeof(buffer2), buffer, 3); CReplaceColorCodes(buffer2); ShowActivity(client, "%s", buffer2); } /** * Shows admin activity with colors * * @param client Client performing an action * @param tag Tag to prepend to the message (color tags supported) * @param message Message (formatting rules) * @noreturn */ stock CShowActivityEx(client, const String:tag[], const String:message[], any:...) { CCheckTrie(); if(client < 0 || client > MaxClients) { ThrowError("Invalid client index %d", client); } if(client != 0 && !IsClientInGame(client)) { ThrowError("Client %d is not in game", client); } decl String:buffer[MAX_BUFFER_LENGTH], String:buffer2[MAX_BUFFER_LENGTH]; Format(buffer, sizeof(buffer), "\x01%s", message); VFormat(buffer2, sizeof(buffer2), buffer, 4); CReplaceColorCodes(buffer2); strcopy(buffer, sizeof(buffer), tag); CReplaceColorCodes(buffer); ShowActivityEx(client, tag, "%s", buffer2); } /** * Shows admin activity with colors * * @param client Client performing an action * @param tag Tag to prepend to the message (color tags supported) * @param message Message (formatting rules) * @noreturn */ stock CShowActivity2(client, const String:tag[], const String:message[], any:...) { CCheckTrie(); if(client < 0 || client > MaxClients) { ThrowError("Invalid client index %d", client); } if(client != 0 && !IsClientInGame(client)) { ThrowError("Client %d is not in game", client); } decl String:buffer[MAX_BUFFER_LENGTH], String:buffer2[MAX_BUFFER_LENGTH]; Format(buffer, sizeof(buffer), "\x01%s", message); VFormat(buffer2, sizeof(buffer2), buffer, 4); CReplaceColorCodes(buffer2); strcopy(buffer, sizeof(buffer), tag); CReplaceColorCodes(buffer); ShowActivity2(client, buffer, "%s", buffer2); } /** * Determines whether a color name exists * * @param color The color name to check * @return True if the color exists, false otherwise */ stock bool:CColorExists(const String:color[]) { CCheckTrie(); new temp; return GetTrieValue(CTrie, color, temp); } /** * Returns the hexadecimal representation of a client's team color (will NOT initialize the trie) * * @param client Client to get the team color for * @return Client's team color in hexadecimal, or green if unknown * On error/Errors: If the client index passed is invalid or not in game. */ stock CGetTeamColor(client) { if(client <= 0 || client > MaxClients) { ThrowError("Invalid client index %i", client); } if(!IsClientInGame(client)) { ThrowError("Client %i is not in game", client); } new value; switch(GetClientTeam(client)) { case 1: { value = COLOR_GRAY; } case 2: { value = COLOR_RED; } case 3: { value = COLOR_BLUE; } default: { value = COLOR_GREEN; } } return value; } stock Handle:InitColorTrie() { new Handle:hTrie = CreateTrie(); SetTrieValue(hTrie, "aliceblue", 0xF0F8FF); SetTrieValue(hTrie, "allies", 0x4D7942); // same as Allies team in DoD:S SetTrieValue(hTrie, "ancient", 0xEB4B4B); // same as Ancient item rarity in Dota 2 SetTrieValue(hTrie, "antiquewhite", 0xFAEBD7); SetTrieValue(hTrie, "aqua", 0x00FFFF); SetTrieValue(hTrie, "aquamarine", 0x7FFFD4); SetTrieValue(hTrie, "arcana", 0xADE55C); // same as Arcana item rarity in Dota 2 SetTrieValue(hTrie, "axis", 0xFF4040); // same as Axis team in DoD:S SetTrieValue(hTrie, "azure", 0x007FFF); SetTrieValue(hTrie, "beige", 0xF5F5DC); SetTrieValue(hTrie, "bisque", 0xFFE4C4); SetTrieValue(hTrie, "black", 0x000000); SetTrieValue(hTrie, "blanchedalmond", 0xFFEBCD); SetTrieValue(hTrie, "blue", 0x99CCFF); // same as BLU/Counter-Terrorist team color SetTrieValue(hTrie, "blueviolet", 0x8A2BE2); SetTrieValue(hTrie, "brown", 0xA52A2A); SetTrieValue(hTrie, "burlywood", 0xDEB887); SetTrieValue(hTrie, "cadetblue", 0x5F9EA0); SetTrieValue(hTrie, "chartreuse", 0x7FFF00); SetTrieValue(hTrie, "chocolate", 0xD2691E); SetTrieValue(hTrie, "collectors", 0xAA0000); // same as Collector's item quality in TF2 SetTrieValue(hTrie, "common", 0xB0C3D9); // same as Common item rarity in Dota 2 SetTrieValue(hTrie, "community", 0x70B04A); // same as Community item quality in TF2 SetTrieValue(hTrie, "coral", 0xFF7F50); SetTrieValue(hTrie, "cornflowerblue", 0x6495ED); SetTrieValue(hTrie, "cornsilk", 0xFFF8DC); SetTrieValue(hTrie, "corrupted", 0xA32C2E); // same as Corrupted item quality in Dota 2 SetTrieValue(hTrie, "crimson", 0xDC143C); SetTrieValue(hTrie, "cyan", 0x00FFFF); SetTrieValue(hTrie, "darkblue", 0x00008B); SetTrieValue(hTrie, "darkcyan", 0x008B8B); SetTrieValue(hTrie, "darkgoldenrod", 0xB8860B); SetTrieValue(hTrie, "darkgray", 0xA9A9A9); SetTrieValue(hTrie, "darkgrey", 0xA9A9A9); SetTrieValue(hTrie, "darkgreen", 0x006400); SetTrieValue(hTrie, "darkkhaki", 0xBDB76B); SetTrieValue(hTrie, "darkmagenta", 0x8B008B); SetTrieValue(hTrie, "darkolivegreen", 0x556B2F); SetTrieValue(hTrie, "darkorange", 0xFF8C00); SetTrieValue(hTrie, "darkorchid", 0x9932CC); SetTrieValue(hTrie, "darkred", 0x8B0000); SetTrieValue(hTrie, "darksalmon", 0xE9967A); SetTrieValue(hTrie, "darkseagreen", 0x8FBC8F); SetTrieValue(hTrie, "darkslateblue", 0x483D8B); SetTrieValue(hTrie, "darkslategray", 0x2F4F4F); SetTrieValue(hTrie, "darkslategrey", 0x2F4F4F); SetTrieValue(hTrie, "darkturquoise", 0x00CED1); SetTrieValue(hTrie, "darkviolet", 0x9400D3); SetTrieValue(hTrie, "deeppink", 0xFF1493); SetTrieValue(hTrie, "deepskyblue", 0x00BFFF); SetTrieValue(hTrie, "dimgray", 0x696969); SetTrieValue(hTrie, "dimgrey", 0x696969); SetTrieValue(hTrie, "dodgerblue", 0x1E90FF); SetTrieValue(hTrie, "exalted", 0xCCCCCD); // same as Exalted item quality in Dota 2 SetTrieValue(hTrie, "firebrick", 0xB22222); SetTrieValue(hTrie, "floralwhite", 0xFFFAF0); SetTrieValue(hTrie, "forestgreen", 0x228B22); SetTrieValue(hTrie, "frozen", 0x4983B3); // same as Frozen item quality in Dota 2 SetTrieValue(hTrie, "fuchsia", 0xFF00FF); SetTrieValue(hTrie, "fullblue", 0x0000FF); SetTrieValue(hTrie, "fullred", 0xFF0000); SetTrieValue(hTrie, "gainsboro", 0xDCDCDC); SetTrieValue(hTrie, "genuine", 0x4D7455); // same as Genuine item quality in TF2 SetTrieValue(hTrie, "ghostwhite", 0xF8F8FF); SetTrieValue(hTrie, "gold", 0xFFD700); SetTrieValue(hTrie, "goldenrod", 0xDAA520); SetTrieValue(hTrie, "gray", 0xCCCCCC); // same as spectator team color SetTrieValue(hTrie, "grey", 0xCCCCCC); SetTrieValue(hTrie, "green", 0x3EFF3E); SetTrieValue(hTrie, "greenyellow", 0xADFF2F); SetTrieValue(hTrie, "haunted", 0x38F3AB); // same as Haunted item quality in TF2 SetTrieValue(hTrie, "honeydew", 0xF0FFF0); SetTrieValue(hTrie, "hotpink", 0xFF69B4); SetTrieValue(hTrie, "immortal", 0xE4AE33); // same as Immortal item rarity in Dota 2 SetTrieValue(hTrie, "indianred", 0xCD5C5C); SetTrieValue(hTrie, "indigo", 0x4B0082); SetTrieValue(hTrie, "ivory", 0xFFFFF0); SetTrieValue(hTrie, "khaki", 0xF0E68C); SetTrieValue(hTrie, "lavender", 0xE6E6FA); SetTrieValue(hTrie, "lavenderblush", 0xFFF0F5); SetTrieValue(hTrie, "lawngreen", 0x7CFC00); SetTrieValue(hTrie, "legendary", 0xD32CE6); // same as Legendary item rarity in Dota 2 SetTrieValue(hTrie, "lemonchiffon", 0xFFFACD); SetTrieValue(hTrie, "lightblue", 0xADD8E6); SetTrieValue(hTrie, "lightcoral", 0xF08080); SetTrieValue(hTrie, "lightcyan", 0xE0FFFF); SetTrieValue(hTrie, "lightgoldenrodyellow", 0xFAFAD2); SetTrieValue(hTrie, "lightgray", 0xD3D3D3); SetTrieValue(hTrie, "lightgrey", 0xD3D3D3); SetTrieValue(hTrie, "lightgreen", 0x99FF99); SetTrieValue(hTrie, "lightpink", 0xFFB6C1); SetTrieValue(hTrie, "lightsalmon", 0xFFA07A); SetTrieValue(hTrie, "lightseagreen", 0x20B2AA); SetTrieValue(hTrie, "lightskyblue", 0x87CEFA); SetTrieValue(hTrie, "lightslategray", 0x778899); SetTrieValue(hTrie, "lightslategrey", 0x778899); SetTrieValue(hTrie, "lightsteelblue", 0xB0C4DE); SetTrieValue(hTrie, "lightyellow", 0xFFFFE0); SetTrieValue(hTrie, "lime", 0x00FF00); SetTrieValue(hTrie, "limegreen", 0x32CD32); SetTrieValue(hTrie, "linen", 0xFAF0E6); SetTrieValue(hTrie, "magenta", 0xFF00FF); SetTrieValue(hTrie, "maroon", 0x800000); SetTrieValue(hTrie, "mediumaquamarine", 0x66CDAA); SetTrieValue(hTrie, "mediumblue", 0x0000CD); SetTrieValue(hTrie, "mediumorchid", 0xBA55D3); SetTrieValue(hTrie, "mediumpurple", 0x9370D8); SetTrieValue(hTrie, "mediumseagreen", 0x3CB371); SetTrieValue(hTrie, "mediumslateblue", 0x7B68EE); SetTrieValue(hTrie, "mediumspringgreen", 0x00FA9A); SetTrieValue(hTrie, "mediumturquoise", 0x48D1CC); SetTrieValue(hTrie, "mediumvioletred", 0xC71585); SetTrieValue(hTrie, "midnightblue", 0x191970); SetTrieValue(hTrie, "mintcream", 0xF5FFFA); SetTrieValue(hTrie, "mistyrose", 0xFFE4E1); SetTrieValue(hTrie, "moccasin", 0xFFE4B5); SetTrieValue(hTrie, "mythical", 0x8847FF); // same as Mythical item rarity in Dota 2 SetTrieValue(hTrie, "navajowhite", 0xFFDEAD); SetTrieValue(hTrie, "navy", 0x000080); SetTrieValue(hTrie, "normal", 0xB2B2B2); // same as Normal item quality in TF2 SetTrieValue(hTrie, "oldlace", 0xFDF5E6); SetTrieValue(hTrie, "olive", 0x9EC34F); SetTrieValue(hTrie, "olivedrab", 0x6B8E23); SetTrieValue(hTrie, "orange", 0xFFA500); SetTrieValue(hTrie, "orangered", 0xFF4500); SetTrieValue(hTrie, "orchid", 0xDA70D6); SetTrieValue(hTrie, "palegoldenrod", 0xEEE8AA); SetTrieValue(hTrie, "palegreen", 0x98FB98); SetTrieValue(hTrie, "paleturquoise", 0xAFEEEE); SetTrieValue(hTrie, "palevioletred", 0xD87093); SetTrieValue(hTrie, "papayawhip", 0xFFEFD5); SetTrieValue(hTrie, "peachpuff", 0xFFDAB9); SetTrieValue(hTrie, "peru", 0xCD853F); SetTrieValue(hTrie, "pink", 0xFFC0CB); SetTrieValue(hTrie, "plum", 0xDDA0DD); SetTrieValue(hTrie, "powderblue", 0xB0E0E6); SetTrieValue(hTrie, "purple", 0x800080); SetTrieValue(hTrie, "rare", 0x4B69FF); // same as Rare item rarity in Dota 2 SetTrieValue(hTrie, "red", 0xFF4040); // same as RED/Terrorist team color SetTrieValue(hTrie, "rosybrown", 0xBC8F8F); SetTrieValue(hTrie, "royalblue", 0x4169E1); SetTrieValue(hTrie, "saddlebrown", 0x8B4513); SetTrieValue(hTrie, "salmon", 0xFA8072); SetTrieValue(hTrie, "sandybrown", 0xF4A460); SetTrieValue(hTrie, "seagreen", 0x2E8B57); SetTrieValue(hTrie, "seashell", 0xFFF5EE); SetTrieValue(hTrie, "selfmade", 0x70B04A); // same as Self-Made item quality in TF2 SetTrieValue(hTrie, "sienna", 0xA0522D); SetTrieValue(hTrie, "silver", 0xC0C0C0); SetTrieValue(hTrie, "skyblue", 0x87CEEB); SetTrieValue(hTrie, "slateblue", 0x6A5ACD); SetTrieValue(hTrie, "slategray", 0x708090); SetTrieValue(hTrie, "slategrey", 0x708090); SetTrieValue(hTrie, "snow", 0xFFFAFA); SetTrieValue(hTrie, "springgreen", 0x00FF7F); SetTrieValue(hTrie, "steelblue", 0x4682B4); SetTrieValue(hTrie, "strange", 0xCF6A32); // same as Strange item quality in TF2 SetTrieValue(hTrie, "tan", 0xD2B48C); SetTrieValue(hTrie, "teal", 0x008080); SetTrieValue(hTrie, "thistle", 0xD8BFD8); SetTrieValue(hTrie, "tomato", 0xFF6347); SetTrieValue(hTrie, "turquoise", 0x40E0D0); SetTrieValue(hTrie, "uncommon", 0xB0C3D9); // same as Uncommon item rarity in Dota 2 SetTrieValue(hTrie, "unique", 0xFFD700); // same as Unique item quality in TF2 SetTrieValue(hTrie, "unusual", 0x8650AC); // same as Unusual item quality in TF2 SetTrieValue(hTrie, "valve", 0xA50F79); // same as Valve item quality in TF2 SetTrieValue(hTrie, "vintage", 0x476291); // same as Vintage item quality in TF2 SetTrieValue(hTrie, "violet", 0xEE82EE); SetTrieValue(hTrie, "wheat", 0xF5DEB3); SetTrieValue(hTrie, "white", 0xFFFFFF); SetTrieValue(hTrie, "whitesmoke", 0xF5F5F5); SetTrieValue(hTrie, "yellow", 0xFFFF00); SetTrieValue(hTrie, "yellowgreen", 0x9ACD32); return hTrie; }