Код:
/*
Lite Translit - легкая версия транслита :)
Нет ничего кроме тегов в чате и ну и собственно транслита;)
CREDITS:
* Основа от CrAsH
* Stock colorchat от Subb98
* * За это им спасибо;)
*/
#include <amxmodx>
#define ADBLOCK // Блокировка рекламы в чате
//#define TAGS // Теги в чате Гл. Админ | Админ | VIP
//#define ADMIN ADMIN_MENU // Флаг доступа для тега "Админ" в чате || Просмотр всего чата
#if defined TAGS
//#define GL_ADMIN ADMIN_RCON // Флаг доступа для тега "Гл. Админ" в чате
//#define VIP ADMIN_LEVEL_H // Флаг доступа для тега "VIP" в чате
//#define GREEN_MSG // Гл. Админ | Админ | VIP будут писать зеленым. Чтобы выключить, закомментируйте
new iFlags
#endif
#define get_bit(%1,%2) (%1 & (1 << (%2 & 31)))
#define set_bit(%1,%2) %1 |= (1 << (%2 & 31))
#define clr_bit(%1,%2) %1 &= ~(1 << (%2 & 31))
new szMessage[192]
new iPlayerRus[33], iPlayerRusInfo[33]
new iIgnorePlayer, iMaxPlayers
#if defined ADBLOCK
new blockedMsgsCounter, approvedMsgsCounter
new blocked_msgs[128][192], approved_msgs[128][192]
#endif
new const eng[][]={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","{","}",":",'"',"<",">","~","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","[","]",";","'",",",".","`","?","/","@","$","^^","&"};
new const rus[][]={"Ф","И","С","В","У","А","П","Р","Ш","О","Л","Д","Ь","Т","Щ","З","Й","К","Ы","Е","Г","М","Ц","Ч","Н","Я","Х","Ъ","ж","Э","Б","Ю","Ё","ф","и","с","в","у","а","п","р","ш","о","л","д","ь","т","щ","з","й","к","ы","е","г","м","ц","ч","н","я","х","ъ","ж","э","б","ю","ё",",",".","'",";", ":","?"};
public plugin_init()
{
register_plugin("Lite Translit", "1.7", "neygomon")
register_dictionary("lite_translit.txt")
register_cvar("lt_version", "1.7", FCVAR_SPONLY | FCVAR_SERVER | FCVAR_UNLOGGED)
new const szRegisterClmd[][] =
{
"say /rus", "LangRus",
"say /eng", "LangEng",
"say", "Say",
"say_team", "SayTeam"
}
for(new a; a < sizeof szRegisterClmd; a += 2)
register_clcmd(szRegisterClmd[a],szRegisterClmd[a + 1]);
iMaxPlayers = get_maxplayers()
}
#if defined ADBLOCK
public plugin_cfg()
{
new file_path[64], configsdir[64]
get_localinfo("amxx_configsdir", configsdir, charsmax(configsdir))
format(file_path, 63,"%s/lt_blockmessages.ini", configsdir)
new file = fopen(file_path, "rt")
if(file)
{
new buffer[192], i, j
while(!feof(file))
{
fgets(file, buffer, 191)
trim(buffer)
if(buffer[0] == ';') continue
if(buffer[0] != '!')
{
blocked_msgs[i++] = buffer
blockedMsgsCounter++
}
else
{
buffer[0] = '^x20'
trim(buffer)
approved_msgs[j++] = buffer
approvedMsgsCounter++
}
}
fclose(file)
}
else log_to_file("error_lt.log", "[Error] File ^"%s^" not found!", file_path)
}
#endif
public client_putinserver(id)
if(is_user_hltv(id) || is_user_bot(id)) set_bit(iIgnorePlayer, id)
public client_disconnect(id)
clr_bit(iIgnorePlayer, id)
public LangRus(id)
{
if(!iPlayerRus[id])
{
iPlayerRus[id] = true
PrintMsg(id, "%L", id, "LT_RUS")
}
else PrintMsg(id, "%L", id, "LT_RUS_ALREADY")
}
public LangEng(id)
{
if(iPlayerRus[id])
{
iPlayerRus[id] = false
PrintMsg(id, "%L", id, "LT_ENG")
}
else PrintMsg(id, "%L", id, "LT_ENG_ALREADY")
}
public Say(id)
{
if(get_bit(iIgnorePlayer, id)) return 0
read_args(szMessage, charsmax(szMessage))
remove_quotes(szMessage)
#if defined ADBLOCK
if(szMessage[0] == '/' || Flood_Control(id, szMessage)) return PLUGIN_HANDLED // блочим слеш в чате и спам в чате
#else
if(szMessage[0] == '/') return PLUGIN_HANDLED // блочим слеш в чате
#endif
while(replace(szMessage, charsmax(szMessage), "%", "")) {} // фиксим багу с %S%S%S%S%S и им подобными
if(!iPlayerRusInfo[id])
{
if(!iPlayerRus[id])
{
iPlayerRusInfo[id] = true
PrintMsg(id, "%L", id, "LT_RUS_INFO")
}
}
if(iPlayerRus[id])
{
for(new i; i < sizeof eng; i++)
{
while(replace(szMessage, charsmax(szMessage), eng[i], rus[i])) {}
}
}
new szNewMessage[512], szLen, szName[32]
get_user_name(id, szName, charsmax(szName))
#if defined TAGS
iFlags = get_user_flags(id)
#endif
switch(is_user_alive(id))
{
case 0:
{
szLen = format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!y*Мертвый* ")
#if defined TAGS
#if defined GREEN_MSG
if(iFlags & GL_ADMIN) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[Гл. Админ] !t%s!y :!g ", szName)
else if(iFlags & ADMIN) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[Админ] !t%s!y :!g ", szName)
else if(iFlags & VIP) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[VIP] !t%s!y :!g ", szName)
#else
if(iFlags & GL_ADMIN) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[Гл. Админ] !t%s!y : ", szName)
else if(iFlags & ADMIN) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[Админ] !t%s!y : ", szName)
else if(iFlags & VIP) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[VIP] !t%s!y : ", szName)
#endif
#else
szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!t%s!y : ", szName)
#endif
szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "%s", szMessage)
for(new i = 1; i <= iMaxPlayers; i++)
{
if(!is_user_connected(i)) continue;
if(!is_user_alive(i))
PrintMsg(i, szNewMessage)
}
}
case 1:
{
#if defined TAGS
#if defined GREEN_MSG
if(iFlags & GL_ADMIN) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[Гл. Админ] !t%s!y :!g ", szName)
else if(iFlags & ADMIN) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[Админ] !t%s!y :!g ", szName)
else if(iFlags & VIP) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[VIP] !t%s!y :!g ", szName)
#else
if(iFlags & GL_ADMIN) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[Гл. Админ] !t%s!y : ", szName)
else if(iFlags & ADMIN) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[Админ] !t%s!y : ", szName)
else if(iFlags & VIP) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[VIP] !t%s!y : ", szName)
#endif
#else
szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!t%s!y : ", szName)
#endif
szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "%s", szMessage)
for(new i = 1; i <= iMaxPlayers; i++)
{
if(!is_user_connected(i)) continue;
if(is_user_alive(i))
PrintMsg(i, szNewMessage)
}
}
}
return PLUGIN_HANDLED
}
public SayTeam(id)
{
if(get_bit(iIgnorePlayer, id)) return 0
read_args(szMessage, charsmax(szMessage))
remove_quotes(szMessage)
#if defined ADBLOCK
if(szMessage[0] == '/' || Flood_Control(id, szMessage)) return PLUGIN_HANDLED // блочим слеш в чате и спам в чате
#else
if(szMessage[0] == '/') return PLUGIN_HANDLED // блочим слеш в чате
#endif
while(replace(szMessage, charsmax(szMessage), "%", "")) {} // фиксим багу с %S%S%S%S%S и им подобными
if(!iPlayerRusInfo[id])
{
if(!iPlayerRus[id])
{
iPlayerRusInfo[id] = true
PrintMsg(id, "%L", id, "LT_RUS_INFO")
}
}
if(iPlayerRus[id])
{
for(new i; i < sizeof eng; i++)
{
while(replace(szMessage, charsmax(szMessage), eng[i], rus[i])) {}
}
}
new szNewMessage[512], szLen, szName[32]
get_user_name(id, szName, charsmax(szName))
#if defined TAGS
iFlags = get_user_flags(id)
#endif
switch(is_user_alive(id))
{
case 0:
{
switch(get_user_team(id))
{
case 1: szLen = format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!y*Мертвый* !t[Террорист] ")
case 2: szLen = format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!y*Мертвый* !t[Мент] ")
case 3: szLen = format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!t[Наблюдатель] ")
}
#if defined TAGS
#if defined GREEN_MSG
if(iFlags & GL_ADMIN) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[Гл. Админ] !t%s!y :!g ", szName)
else if(iFlags & ADMIN) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[Админ] !t%s!y :!g ", szName)
else if(iFlags & VIP) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[VIP] !t%s!y :!g ", szName)
#else
if(iFlags & GL_ADMIN) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[Гл. Админ] !t%s!y : ", szName)
else if(iFlags & ADMIN) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[Админ] !t%s!y : ", szName)
else if(iFlags & VIP) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[VIP] !t%s!y : ", szName)
#endif
#else
szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!t%s!y : ", szName)
#endif
szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "%s", szMessage)
for(new i = 1; i <= iMaxPlayers; i++)
{
if(!is_user_connected(i)) continue;
if(get_user_flags(i) & ADMIN || (get_user_team(id) == get_user_team(i) && !is_user_alive(i)))
PrintMsg(i, szNewMessage)
}
}
case 1:
{
switch(get_user_team(id))
{
case 1: szLen = format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!t[Террорист] ")
case 2: szLen = format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!t[Мент] ")
case 3: szLen = format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!t[Наблюдатель] ")
}
#if defined TAGS
#if defined GREEN_MSG
if(iFlags & GL_ADMIN) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[Гл. Админ] !t%s!y :!g ", szName)
else if(iFlags & ADMIN) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[Админ] !t%s!y :!g ", szName)
else if(iFlags & VIP) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[VIP] !t%s!y :!g ", szName)
#else
if(iFlags & GL_ADMIN) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[Гл. Админ] !t%s!y : ", szName)
else if(iFlags & ADMIN) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[Админ] !t%s!y : ", szName)
else if(iFlags & VIP) szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!g[VIP] !t%s!y : ", szName)
#endif
#else
szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "!t%s!y : ", szName)
#endif
szLen += format(szNewMessage[szLen], charsmax(szNewMessage) - 1, "%s", szMessage)
for(new i = 1; i <= iMaxPlayers; i++)
{
if(!is_user_connected(i)) continue;
if(get_user_flags(i) & ADMIN || (get_user_team(id) == get_user_team(i) && is_user_alive(i)))
PrintMsg(i, szNewMessage)
}
}
}
return PLUGIN_HANDLED
}
stock PrintMsg(const id, const szMessage[], any:...)
{
new szMsg[191]
vformat(szMsg, charsmax(szMsg), szMessage, 3)
while(replace(szMsg, charsmax(szMsg), "!y", "^1")) {}
while(replace(szMsg, charsmax(szMsg), "!t", "^3")) {}
while(replace(szMsg, charsmax(szMsg), "!g", "^4")) {}
message_begin(MSG_ONE_UNRELIABLE, 76, _, id)
write_byte(id)
write_string(szMsg)
message_end()
}
#if defined ADBLOCK
bool:Flood_Control(id, iMsg[])
{
for(new i; i < approvedMsgsCounter; i++)
{
if(containi(iMsg, approved_msgs[i]) != -1) return false
}
static last_msg[33], said_len
said_len = strlen(iMsg)
if(said_len > 13 && last_msg[id] == said_len) return true
last_msg[id] = said_len
for(new i; i < blockedMsgsCounter; i++)
{
if(containi(iMsg, blocked_msgs[i]) != -1) return true
}
return false
}
#endif