From e76e3380f1b1b91a4c2737f063fc66213abceb54 Mon Sep 17 00:00:00 2001 From: Dron-elektron Date: Sat, 6 Apr 2024 14:33:25 +0300 Subject: [PATCH 1/4] Remove "morecolors" library * All colors are hardcoded into translations. --- scripting/include/morecolors.inc | 674 ------------------- scripting/include/ru/message.inc | 4 +- scripting/modules/message.sp | 6 +- scripting/respawn-unlocker.sp | 5 - translations/respawn-unlocker.phrases.txt | 11 +- translations/ru/respawn-unlocker.phrases.txt | 6 +- 6 files changed, 17 insertions(+), 689 deletions(-) delete mode 100644 scripting/include/morecolors.inc diff --git a/scripting/include/morecolors.inc b/scripting/include/morecolors.inc deleted file mode 100644 index 881d3ef..0000000 --- a/scripting/include/morecolors.inc +++ /dev/null @@ -1,674 +0,0 @@ -// 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; -} diff --git a/scripting/include/ru/message.inc b/scripting/include/ru/message.inc index d0acb1e..013587f 100644 --- a/scripting/include/ru/message.inc +++ b/scripting/include/ru/message.inc @@ -3,7 +3,9 @@ #endif #define _ru_message_included +#define COLOR_DEFAULT "\x01" + #define PREFIX "[Respawn unlocker] " -#define PREFIX_COLORED "{fuchsia}[Respawn unlocker] " +#define PREFIX_COLORED "Prefix colored" #define CONSOLE 0 diff --git a/scripting/modules/message.sp b/scripting/modules/message.sp index e0c1321..4a9938a 100644 --- a/scripting/modules/message.sp +++ b/scripting/modules/message.sp @@ -1,13 +1,13 @@ void MessagePrint_WallsDisabled() { - CPrintToChatAll("%s%t", PREFIX_COLORED, "Walls disabled"); + PrintToChatAll(COLOR_DEFAULT ... "%t%t", PREFIX_COLORED, "Walls disabled"); } void MessagePrint_TriggersDisabled() { - CPrintToChatAll("%s%t", PREFIX_COLORED, "Triggers disabled"); + PrintToChatAll(COLOR_DEFAULT ... "%t%t", PREFIX_COLORED, "Triggers disabled"); } void MessagePrint_CratesAdded() { - CPrintToChatAll("%s%t", PREFIX_COLORED, "Crates added"); + PrintToChatAll(COLOR_DEFAULT ... "%t%t", PREFIX_COLORED, "Crates added"); } void Message_CratesLoaded(int client) { diff --git a/scripting/respawn-unlocker.sp b/scripting/respawn-unlocker.sp index 5a25793..927bda8 100644 --- a/scripting/respawn-unlocker.sp +++ b/scripting/respawn-unlocker.sp @@ -3,11 +3,6 @@ #undef REQUIRE_PLUGIN #include -#include "morecolors" - -#pragma semicolon 1 -#pragma newdecls required - #include "ru/entity" #include "ru/math" #include "ru/menu" diff --git a/translations/respawn-unlocker.phrases.txt b/translations/respawn-unlocker.phrases.txt index c71b400..1a65c54 100644 --- a/translations/respawn-unlocker.phrases.txt +++ b/translations/respawn-unlocker.phrases.txt @@ -1,18 +1,23 @@ "Phrases" { + "Prefix colored" + { + "en" "FF00FF[Respawn unlocker] " + } + "Walls disabled" { - "en" "{default}Invisible walls are disabled" + "en" "Invisible walls are disabled" } "Triggers disabled" { - "en" "{default}Triggers are disabled" + "en" "Triggers are disabled" } "Crates added" { - "en" "{default}Crates are added" + "en" "Crates are added" } "Crate added" diff --git a/translations/ru/respawn-unlocker.phrases.txt b/translations/ru/respawn-unlocker.phrases.txt index da53c59..6d3131f 100644 --- a/translations/ru/respawn-unlocker.phrases.txt +++ b/translations/ru/respawn-unlocker.phrases.txt @@ -2,17 +2,17 @@ { "Walls disabled" { - "ru" "{default}Невидимые стены отключены" + "ru" "Невидимые стены отключены" } "Triggers disabled" { - "ru" "{default}Триггеры отключены" + "ru" "Триггеры отключены" } "Crates added" { - "ru" "{default}Ящики добавлены" + "ru" "Ящики добавлены" } "Crate added" From 7620e1d01b61dc763f49b3fbc45c2d7b7207c23a Mon Sep 17 00:00:00 2001 From: Dron-elektron Date: Sat, 6 Apr 2024 14:34:26 +0300 Subject: [PATCH 2/4] Use full plugin name for header files --- .../include/{ru => respawn-unlocker}/entity.inc | 4 ++-- scripting/include/{ru => respawn-unlocker}/math.inc | 4 ++-- scripting/include/{ru => respawn-unlocker}/menu.inc | 4 ++-- .../include/{ru => respawn-unlocker}/message.inc | 4 ++-- .../include/{ru => respawn-unlocker}/storage.inc | 4 ++-- .../include/{ru => respawn-unlocker}/visualizer.inc | 4 ++-- scripting/respawn-unlocker.sp | 12 ++++++------ 7 files changed, 18 insertions(+), 18 deletions(-) rename scripting/include/{ru => respawn-unlocker}/entity.inc (77%) rename scripting/include/{ru => respawn-unlocker}/math.inc (79%) rename scripting/include/{ru => respawn-unlocker}/menu.inc (89%) rename scripting/include/{ru => respawn-unlocker}/message.inc (61%) rename scripting/include/{ru => respawn-unlocker}/storage.inc (86%) rename scripting/include/{ru => respawn-unlocker}/visualizer.inc (78%) diff --git a/scripting/include/ru/entity.inc b/scripting/include/respawn-unlocker/entity.inc similarity index 77% rename from scripting/include/ru/entity.inc rename to scripting/include/respawn-unlocker/entity.inc index 9ef5840..dad6dd3 100644 --- a/scripting/include/ru/entity.inc +++ b/scripting/include/respawn-unlocker/entity.inc @@ -1,7 +1,7 @@ -#if defined _ru_entity_included +#if defined _respawn_unlocker_entity_included #endinput #endif -#define _ru_entity_included +#define _respawn_unlocker_entity_included #define ENTITY_NOT_FOUND -1 diff --git a/scripting/include/ru/math.inc b/scripting/include/respawn-unlocker/math.inc similarity index 79% rename from scripting/include/ru/math.inc rename to scripting/include/respawn-unlocker/math.inc index 409ce73..19b37da 100644 --- a/scripting/include/ru/math.inc +++ b/scripting/include/respawn-unlocker/math.inc @@ -1,7 +1,7 @@ -#if defined _ru_math_included +#if defined _respawn_unlocker_math_included #endinput #endif -#define _ru_math_included +#define _respawn_unlocker_math_included #define X 0 #define Y 1 diff --git a/scripting/include/ru/menu.inc b/scripting/include/respawn-unlocker/menu.inc similarity index 89% rename from scripting/include/ru/menu.inc rename to scripting/include/respawn-unlocker/menu.inc index 36a97ca..1bb194b 100644 --- a/scripting/include/ru/menu.inc +++ b/scripting/include/respawn-unlocker/menu.inc @@ -1,7 +1,7 @@ -#if defined _ru_menu_included +#if defined _respawn_unlocker_menu_included #endinput #endif -#define _ru_menu_included +#define _respawn_unlocker_menu_included #define TEXT_BUFFER_MAX_SIZE (256 * 4) #define MENU_ITEM_INFO_MAX_SIZE 32 diff --git a/scripting/include/ru/message.inc b/scripting/include/respawn-unlocker/message.inc similarity index 61% rename from scripting/include/ru/message.inc rename to scripting/include/respawn-unlocker/message.inc index 013587f..3f7d0e7 100644 --- a/scripting/include/ru/message.inc +++ b/scripting/include/respawn-unlocker/message.inc @@ -1,7 +1,7 @@ -#if defined _ru_message_included +#if defined _respawn_unlocker_message_included #endinput #endif -#define _ru_message_included +#define _respawn_unlocker_message_included #define COLOR_DEFAULT "\x01" diff --git a/scripting/include/ru/storage.inc b/scripting/include/respawn-unlocker/storage.inc similarity index 86% rename from scripting/include/ru/storage.inc rename to scripting/include/respawn-unlocker/storage.inc index 4695520..19cdf84 100644 --- a/scripting/include/ru/storage.inc +++ b/scripting/include/respawn-unlocker/storage.inc @@ -1,7 +1,7 @@ -#if defined _ru_storage_included +#if defined _respawn_unlocker_storage_included #endinput #endif -#define _ru_storage_included +#define _respawn_unlocker_storage_included #define PERMISSIONS_USER (FPERM_U_READ | FPERM_U_WRITE | FPERM_U_EXEC) #define PERMISSIONS_GROUP (FPERM_G_READ | FPERM_G_WRITE | FPERM_G_EXEC) diff --git a/scripting/include/ru/visualizer.inc b/scripting/include/respawn-unlocker/visualizer.inc similarity index 78% rename from scripting/include/ru/visualizer.inc rename to scripting/include/respawn-unlocker/visualizer.inc index 4b925ed..29689a9 100644 --- a/scripting/include/ru/visualizer.inc +++ b/scripting/include/respawn-unlocker/visualizer.inc @@ -1,7 +1,7 @@ -#if defined _ru_visualizer_included +#if defined _respawn_unlocker_visualizer_included #endinput #endif -#define _ru_visualizer_included +#define _respawn_unlocker_visualizer_included #define BEAM_START_FRAME 0 #define BEAM_FRAME_RATE 0 diff --git a/scripting/respawn-unlocker.sp b/scripting/respawn-unlocker.sp index 927bda8..5755df7 100644 --- a/scripting/respawn-unlocker.sp +++ b/scripting/respawn-unlocker.sp @@ -3,12 +3,12 @@ #undef REQUIRE_PLUGIN #include -#include "ru/entity" -#include "ru/math" -#include "ru/menu" -#include "ru/message" -#include "ru/storage" -#include "ru/visualizer" +#include "respawn-unlocker/entity" +#include "respawn-unlocker/math" +#include "respawn-unlocker/menu" +#include "respawn-unlocker/message" +#include "respawn-unlocker/storage" +#include "respawn-unlocker/visualizer" #include "modules/console-command.sp" #include "modules/console-variable.sp" From 03fc193ffe3a11145661f5b8018ccf2f8baae1a2 Mon Sep 17 00:00:00 2001 From: Dron-elektron Date: Sat, 6 Apr 2024 14:34:37 +0300 Subject: [PATCH 3/4] Bump plugin version to 1.6.4 --- scripting/respawn-unlocker.sp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripting/respawn-unlocker.sp b/scripting/respawn-unlocker.sp index 5755df7..e54f3dc 100644 --- a/scripting/respawn-unlocker.sp +++ b/scripting/respawn-unlocker.sp @@ -29,7 +29,7 @@ public Plugin myinfo = { name = "Respawn unlocker", author = "Dron-elektron", description = "Allows you to unlock respawn at the end of the round", - version = "1.6.3", + version = "1.6.4", url = "https://github.com/dronelektron/respawn-unlocker" }; From 52b019679d5ac42c1fe02c2dd6765942239f4f50 Mon Sep 17 00:00:00 2001 From: Dron-elektron Date: Sat, 6 Apr 2024 14:35:46 +0300 Subject: [PATCH 4/4] Add "event" module --- scripting/modules/event.sp | 19 +++++++++++++++++++ scripting/respawn-unlocker.sp | 19 ++----------------- 2 files changed, 21 insertions(+), 17 deletions(-) create mode 100644 scripting/modules/event.sp diff --git a/scripting/modules/event.sp b/scripting/modules/event.sp new file mode 100644 index 0000000..fc33832 --- /dev/null +++ b/scripting/modules/event.sp @@ -0,0 +1,19 @@ +void Event_Create() { + HookEvent("dod_round_start", Event_RoundStart); + HookEvent("dod_round_win", Event_RoundWin); +} + +public Action Event_RoundStart(Event event, const char[] name, bool dontBroadcast) { + UseCase_RestoreWalls(); + CrateEditor_Clear(); + + return Plugin_Continue; +} + +public Action Event_RoundWin(Event event, const char[] name, bool dontBroadcast) { + UseCase_DisableWalls(); + UseCase_DisableTriggers(); + UseCase_AddCrates(); + + return Plugin_Continue; +} diff --git a/scripting/respawn-unlocker.sp b/scripting/respawn-unlocker.sp index e54f3dc..32d7957 100644 --- a/scripting/respawn-unlocker.sp +++ b/scripting/respawn-unlocker.sp @@ -15,6 +15,7 @@ #include "modules/crate-editor.sp" #include "modules/crate-list.sp" #include "modules/entity.sp" +#include "modules/event.sp" #include "modules/math.sp" #include "modules/menu.sp" #include "modules/message.sp" @@ -41,8 +42,7 @@ public void OnPluginStart() { TriggerList_Create(); CrateEditor_Create(); AdminMenu_Create(); - HookEvent("dod_round_start", Event_RoundStart); - HookEvent("dod_round_win", Event_RoundWin); + Event_Create(); LoadTranslations("respawn-unlocker.phrases"); AutoExecConfig(true, "respawn-unlocker"); } @@ -75,18 +75,3 @@ public void OnLibraryRemoved(const char[] name) { AdminMenu_Destroy(); } } - -public Action Event_RoundStart(Event event, const char[] name, bool dontBroadcast) { - UseCase_RestoreWalls(); - CrateEditor_Clear(); - - return Plugin_Continue; -} - -public Action Event_RoundWin(Event event, const char[] name, bool dontBroadcast) { - UseCase_DisableWalls(); - UseCase_DisableTriggers(); - UseCase_AddCrates(); - - return Plugin_Continue; -}