И так, решил написать статью в продолжением темы по созданию плагинов. При создании своего сервера у меня возникло желание изменить в уже имеющемся плагине цвет. Однако облазив кучу сайтов я везде попадал на одну и туже статью по созданию плагинов "Урок номер 1". При этом в имеющемся уроке не нашел ответа на свой вопрос. Но мои старания были не бесполезны, так как среди кучи статей копи паста была она одна первоначальная, где автор указал свою аську для связи с ним в случае возникновения каких либо вопросов. Вот этот человек (ник - WEST) и рассказал мне как можно поменять цвета отображаемых сообщений в плагине. Посему решил отблагодарить его этой статьей, до которой у него давно "не доходили руки".
Урок
И так начнем. В качестве примера рассмотрим известный многим плагин high_ping_kicker. В верху кода находим строчки #include <amxmodx> #include <amxmisc> и дописываем имя файла с расширением inc который у нас отвечает за цвет чата и который необходимо поместить в папку "..../scripting/includes/ ". В моем случае я использовал файл colorchat.inc содержание которого я приведу позже. Рассмотрим более подробно данный inc: итак командой для вывода сообщений посредством colorchat.inc является ColorChat (id, ColorChatType:type, const msg[], {Float,Sql,Result,_}:...) Например: ColorChat( id, RED, "[Hello] Всем привет!" ) где id - показать сообщение только игроку. Если вместо idпоставить 0, то сообщение будет показываться всем. RED - цвет сообщения. Данный inc позволяет выводить следующие цвета: RED - красный; GREEN - зеленый; TEAM_COLOR - цвет команды (терористы - красный, контры - синий) GREY - типа желтый, BLUE - синий. Если вы хотите какую то часть текста выделить в один цвет а другую в другой тогда перед словом необходимо поставить одну из ниже приведенных команд (символов) !g - то все слова после этого окрасятся в зеленый цвет !t - то окрасятся в тот цвет который Вы указали перед этим !y - то окрасятся в желтый цвет Например:
ColorChat( id, RED, "!g[Hello] !tВсем привет!" )
это обозначает, что все слова после !t будут идти тем цветом какой указан перед этим. В данном случае это RED, кроме слова [Hello], которое будет отображаться зеленым цветом. Итак возвращаемся к коду high_ping_kicker.sma и дописываем третий #include. У меня получилось так:
После этого во всем коде high_ping_kicker.sma ищем команду "client_print" , которая отвечает за вывод сообщений игрокам и заменяем ее командой "ColorChat" У меня получилось так - до замены
client_print( param[0] ,print_chat,"* Players with ping higher than %d will be kicked!", get_cvar_num( "amx_hpk_ping" ) )
- после замены
ColorChat( 0 ,BLUE,"!g[Link]!t Игроки имеющие пинг больше !g%d !t будут отключены!", get_cvar_num( "amx_hpk_ping" ) ).
Ну теперь все это дело сохраняем, с указанием кодировки UTF-8. И далее действуем по известной вам схеме. А именно компилируем новы файл *.sma. В рассматриваемом случае я компилировал high_ping_kicker.sma и получил файл high_ping_kicker.amxx. Откомпилированный файл с раширением *.amxx кидаем в папочку .../plugins/. Ну вот вроде бы и все. Как видите все оказалось не так уж и тяжело Да как вы видите я изменил не только цвет, но и язык отображаемого теста. В качестве благодарности и согласия WEST указываю в качестве источника сайт amx-x.ru. Однако все остальных копипастеров прошу указывать ссылку на данный сайт http://domstudenta.ucoz.ua. Цените труд других. За ранее благодарен krash. Работу видоизмененных мною плагинов можно оценить на моих серверах, где кстати идет набор адекватных админов как бывалых так и новичков: 195.225.145.11:27017 195.225.145.11:27018
Да чуть не забыл вот сам код colorchat.inc
Code
/* * Fun functions * * by Numb * * This file is provided as is (no warranties). * */
#if defined _colorchat_included #endinput #endif #define _colorchat_included #define ColorChat_Version 1.6
for( new i=1; i<=maxclients; i++ ) { if( is_user_connected(i) ) engfunc(EngFunc_ClientPrintf, i, clamp(type, 0, 2), message); } }
return 1; }
enum ColorChatType { NORMAL = 1, // clients con_color cvar color GREEN, // Green Color TEAM_COLOR, // Red, grey, blue GREY, // grey RED, // Red BLUE, // Blue }
new message[192], TeamName[4][] = { "", "TERRORIST", "CT", "SPECTATOR" }
vformat(message[1], 191, msg, 4); if( message[1]==0x01 || message[1]==0x03 || message[1]==0x04 ) vformat(message, 192, msg, 4); else { switch( type ) { case NORMAL: message[0] = 0x01; // clients con_color cvar color case GREEN: message[0] = 0x04; // Green default: message[0] = 0x03; // White, Red, Blue } }
replace_all(message, 192, "!g", "^x04") // Green Color replace_all(message, 192, "!t", "^x03") // Normal Color replace_all(message, 192, "!y", "^x01") // Green Color
//replace_all(message, 192, "%", "%%"); // Make sure message is not longer than 192 character. Will crash the server. //message[192] = '^0'; // max len is 192 anyway