• Гость, перед открытием темы прочитай описание раздела, чтобы не ошибиться. Любые вопросы по настройке сервера создаются в разделе Технической Поддержки.

Решено Lite translit

Статус
В этой теме нельзя размещать новые ответы.

adolfzigger

Участник
Сообщения
8
Симпатии
0
Баллы
57
#1
Заметил такую проблемку в плагине lite translit
Когда игрок не имеет никаких привелегий "Админок-Випок и тд"
При ввода что то им в чат все работает нормально и отправляются длинные сообщения.
Когда игрок имеет какую то из привелегий то в чате как будто ставится ограничение на количество букв из-за этого сообщения получаются короткими
/*
Lite Translit - легкая версия транслита aka Fuck you SkaJlbneJlb :D
Доп плюшки(отключаются):
* Блокировка рекламы в чате
* Теги в чате Гл. Админ | Админ | VIP
* Поддержка системы армейских званий - AES ( [Сообщение форума] )
* Админ видит весь чат
* Зеленый чат для админов и випов [ Только "Общий чат" ]
Credits:
* Спасибо serfreeman1337 за помощь по коду и профилирование
* Спасибо WarDeN4ik и его клавиатуре :D за тесты антикраша при длинном сообщении
* А так же спасибо всем тем, кто помогал тестировать и скидывал баг-репорты
*/
#include <amxmodx>

#define ADBLOCK // Блокировка рекламы в чате [ По дефолту выключено ]
#define TAGS // Теги в чате Гл. Админ | Админ | VIP [ По дефолту включено ]
#define AES // Поддержка системы армейских званий - AES ( [Сообщение форума] ) [ По дефолту выключено ]
// #define ADMIN_ALLCHAT // Админ видит весь чат [ По дефолту выключено ]
#define ADMIN ADMIN_MENU // Флаг доступа для тега "Админ" в чате || Просмотр всего чата
#if defined TAGS
#define GL_ADMIN ADMIN_RCON // Флаг доступа для тега "Гл. Админ" в чате
#define VIP ADMIN_LEVEL_H // Флаг доступа для тега "VIP" в чате
// #define GREEN_MSG // Зеленый чат для админов и випов [ Только "Общий чат" ] [ По дефолту выключено ]
new iSetPlayerTag, iMessageTag[33][64]
#endif
#if defined AES
#include <aes_main>
#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 iIgnorePlayer, iPlayerRus[33], iPlayerRusInfo[33]
#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", "2.2", "neygomon")
register_cvar("lt_version", "2.2", FCVAR_SERVER | FCVAR_SPONLY)
register_message(get_user_msgid("SayText"), "HookSay")
register_clcmd("say /rus", "LangRus")
register_clcmd("say /eng", "LangEng")
}

#if defined ADBLOCK
public plugin_cfg()
{
new file_path[64], configsdir[64]
get_localinfo("amxx_configsdir", configsdir, charsmax(configsdir))
formatex(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] || 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)
return
}
#if defined TAGS
if(get_bit(iSetPlayerTag, id)) return
switch(CheckFlags(id))
{
case 0: iMessageTag[id] = ""
case 1: iMessageTag[id] = "^1[^4Гл. Админ^1] "
case 2: iMessageTag[id] = "^1[^4Админ^1] "
case 3: iMessageTag[id] = "^1[^4VIP^1] "
}
set_bit(iSetPlayerTag, id)
#endif
}

public client_disconnect(id)
{
clr_bit(iIgnorePlayer, id)
#if defined TAGS
clr_bit(iSetPlayerTag, id)
#endif
}

public LangRus(id)
{
if(!iPlayerRus[id])
{
iPlayerRus[id] = true
PrintMsg(id, 0, "^1[^4LT^1] ^4Русский чат ^3активирован!")
}
else PrintMsg(id, 0, "^1[^4LT^1] ^4Русский чат ^3уже ^4активирован!")
}

public LangEng(id)
{
if(iPlayerRus[id])
{
iPlayerRus[id] = false
PrintMsg(id, 0, "^1[^4LT^1] ^4Английский чат ^3активирован!")
}
else PrintMsg(id, 0, "^1[^4LT^1] ^4Английский чат ^3уже ^4активирован!")
}

public HookSay(msgId, msgDest, msgReciever)
{
if(msgDest != MSG_ONE) return PLUGIN_CONTINUE

new id = get_msg_arg_int(1)
if(get_bit(iIgnorePlayer, id)) return PLUGIN_CONTINUE

static Header[64], szMessage[191], szFormatedMsg[191]
get_msg_arg_string(2, Header, charsmax(Header))
get_msg_arg_string(4, szMessage, charsmax(szMessage))

#if defined ADBLOCK
if(szMessage[0] == '/' || Flood_Control(id, szMessage)) return PLUGIN_HANDLED // блочим слеш и спам в чате
#else
if(szMessage[0] == '/') return PLUGIN_HANDLED // блочим слеш в чате
#endif
while(replace_all2(szMessage, charsmax(szMessage), "%", "")) {} // фиксим багу с %S%S%S%S%S и им подобными

if(!iPlayerRusInfo[id])
{
if(!iPlayerRus[id])
{
iPlayerRusInfo[id] = true
PrintMsg(id, 0, "^1[^4LT^1] ^4У ^3Вас ^4есть возможность писать ^3по-русски. ^4Наберите ^3/rus ^4или ^3/eng ^4для переключения.")
}
}
if(iPlayerRus[id])
{
for(new i; i < sizeof eng; i++)
while(replace_all2(szMessage, charsmax(szMessage), eng, rus)) {}
}
new szLen
#if defined AES
static AESLvl[33][64], aStats[AES_ST_END]
aes_get_player_stats(id, aStats)
aes_get_level_name(aStats[AES_ST_LEVEL], AESLvl[id], 63, LANG_SERVER)

szLen += formatex(szFormatedMsg[szLen], charsmax(szFormatedMsg) - szLen, "^1[^4%s^1] ", AESLvl[id])
#endif
#if defined TAGS
szLen += formatex(szFormatedMsg[szLen], charsmax(szFormatedMsg) - szLen, "%s", iMessageTag[id])
#endif
if(!strcmp(Header, "#Cstrike_Chat_All"))
{
#if defined GREEN_MSG
if(equal(iMessageTag[id], "")) szLen += formatex(szFormatedMsg[szLen], charsmax(szFormatedMsg), "^3%%s1 ^1: %%s2")
else szLen += formatex(szFormatedMsg[szLen], charsmax(szFormatedMsg), "^3%%s1 ^1:^4 %%s2")
#else
szLen += formatex(szFormatedMsg[szLen], charsmax(szFormatedMsg), "^3%%s1 ^1: %%s2")
#endif
}
else szLen += formatex(szFormatedMsg[szLen], charsmax(szFormatedMsg), "%s", Header)

if(strlen(szFormatedMsg) + strlen(szMessage) >= 190)
{
PrintMsg(id, 0, "^4[Guard] ^3*** Ваше сообщение слишком длинное! ***")
return PLUGIN_HANDLED // fixed crash SayText 192 bytes
}
set_msg_arg_string(2, szFormatedMsg)
set_msg_arg_string(4, szMessage)

#if defined ADMIN_ALLCHAT
static players[32], pcount, sz2Msg[191]; get_players(players, pcount, "ch"); new sz2Len
sz2Len += formatex(sz2Msg[sz2Len], charsmax(sz2Msg), "%s ", szFormatedMsg)
sz2Len += formatex(sz2Msg[sz2Len], charsmax(sz2Msg) - sz2Len, "%s", szMessage)
for(new i; i < pcount; i++)
{
if(get_user_flags(players) & ADMIN && msgReciever ^ players)
PrintMsg(players, id, "%s", sz2Msg)
}
#endif
return PLUGIN_CONTINUE
}

stock PrintMsg(const iReceiver, const iSender, const szMessage[], any:...)
{
new szMsg[191]
vformat(szMsg, charsmax(szMsg), szMessage, 4)
message_begin(MSG_ONE_UNRELIABLE, 76, _, iReceiver)
write_byte(iSender ? iSender : iReceiver)
write_string(szMsg)
message_end()
}
#if defined ADBLOCK
bool:Flood_Control(id, szMsg[])
{
for(new i; i < approvedMsgsCounter; i++)
if(containi(szMsg, approved_msgs) != -1) return false

static last_msg[33], said_len
said_len = strlen(szMsg)
if(said_len > 13 && last_msg[id] == said_len) return true
last_msg[id] = said_len

for(new i; i < blockedMsgsCounter; i++)
if(containi(szMsg, blocked_msgs) != -1) return true
return false
}
#endif
#if defined TAGS
CheckFlags(id)
{
static iFlags
iFlags = get_user_flags(id)
if(iFlags & GL_ADMIN) return 1
else if(iFlags & ADMIN) return 2
else if(iFlags & VIP) return 3
return 0
}
#endif
// serfreeman1337 fixed. thx =)
stock replace_all2(string[], len, const what[], const with[])
{
new pos
if((pos = contain(string, what)) == -1) return 0
new total, with_len = strlen(with), diff = strlen(what) - with_len, total_len = strlen(string), temp_pos
while(total_len + with_len < len && replace(string[pos], len - pos, what, with) != 0)
{
total++
pos += with_len
total_len -= diff
if (pos >= total_len) break
temp_pos = contain(string[pos], what)
if (temp_pos == -1) break
pos += temp_pos
}
return total
}
 

KRYSIS

by MAPS
Участник
Сообщения
83
Симпатии
7
Баллы
29
Возраст
31
#2
Заметил такую проблемку в плагине lite translit
Когда игрок не имеет никаких привелегий "Админок-Випок и тд"
При ввода что то им в чат все работает нормально и отправляются длинные сообщения.
Когда игрок имеет какую то из привелегий то в чате как будто ставится ограничение на количество букв из-за этого сообщения получаются короткими
/*
Lite Translit - легкая версия транслита aka Fuck you SkaJlbneJlb :D
Доп плюшки(отключаются):
* Блокировка рекламы в чате
* Теги в чате Гл. Админ | Админ | VIP
* Поддержка системы армейских званий - AES ( [Сообщение форума] )
* Админ видит весь чат
* Зеленый чат для админов и випов [ Только "Общий чат" ]
Credits:
* Спасибо serfreeman1337 за помощь по коду и профилирование
* Спасибо WarDeN4ik и его клавиатуре :D за тесты антикраша при длинном сообщении
* А так же спасибо всем тем, кто помогал тестировать и скидывал баг-репорты
*/
#include <amxmodx>

#define ADBLOCK // Блокировка рекламы в чате [ По дефолту выключено ]
#define TAGS // Теги в чате Гл. Админ | Админ | VIP [ По дефолту включено ]
#define AES // Поддержка системы армейских званий - AES ( [Сообщение форума] ) [ По дефолту выключено ]
// #define ADMIN_ALLCHAT // Админ видит весь чат [ По дефолту выключено ]
#define ADMIN ADMIN_MENU // Флаг доступа для тега "Админ" в чате || Просмотр всего чата
#if defined TAGS
#define GL_ADMIN ADMIN_RCON // Флаг доступа для тега "Гл. Админ" в чате
#define VIP ADMIN_LEVEL_H // Флаг доступа для тега "VIP" в чате
// #define GREEN_MSG // Зеленый чат для админов и випов [ Только "Общий чат" ] [ По дефолту выключено ]
new iSetPlayerTag, iMessageTag[33][64]
#endif
#if defined AES
#include <aes_main>
#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 iIgnorePlayer, iPlayerRus[33], iPlayerRusInfo[33]
#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", "2.2", "neygomon")
register_cvar("lt_version", "2.2", FCVAR_SERVER | FCVAR_SPONLY)
register_message(get_user_msgid("SayText"), "HookSay")
register_clcmd("say /rus", "LangRus")
register_clcmd("say /eng", "LangEng")
}

#if defined ADBLOCK
public plugin_cfg()
{
new file_path[64], configsdir[64]
get_localinfo("amxx_configsdir", configsdir, charsmax(configsdir))
formatex(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] || 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)
return
}
#if defined TAGS
if(get_bit(iSetPlayerTag, id)) return
switch(CheckFlags(id))
{
case 0: iMessageTag[id] = ""
case 1: iMessageTag[id] = "^1[^4Гл. Админ^1] "
case 2: iMessageTag[id] = "^1[^4Админ^1] "
case 3: iMessageTag[id] = "^1[^4VIP^1] "
}
set_bit(iSetPlayerTag, id)
#endif
}

public client_disconnect(id)
{
clr_bit(iIgnorePlayer, id)
#if defined TAGS
clr_bit(iSetPlayerTag, id)
#endif
}

public LangRus(id)
{
if(!iPlayerRus[id])
{
iPlayerRus[id] = true
PrintMsg(id, 0, "^1[^4LT^1] ^4Русский чат ^3активирован!")
}
else PrintMsg(id, 0, "^1[^4LT^1] ^4Русский чат ^3уже ^4активирован!")
}

public LangEng(id)
{
if(iPlayerRus[id])
{
iPlayerRus[id] = false
PrintMsg(id, 0, "^1[^4LT^1] ^4Английский чат ^3активирован!")
}
else PrintMsg(id, 0, "^1[^4LT^1] ^4Английский чат ^3уже ^4активирован!")
}

public HookSay(msgId, msgDest, msgReciever)
{
if(msgDest != MSG_ONE) return PLUGIN_CONTINUE

new id = get_msg_arg_int(1)
if(get_bit(iIgnorePlayer, id)) return PLUGIN_CONTINUE

static Header[64], szMessage[191], szFormatedMsg[191]
get_msg_arg_string(2, Header, charsmax(Header))
get_msg_arg_string(4, szMessage, charsmax(szMessage))

#if defined ADBLOCK
if(szMessage[0] == '/' || Flood_Control(id, szMessage)) return PLUGIN_HANDLED // блочим слеш и спам в чате
#else
if(szMessage[0] == '/') return PLUGIN_HANDLED // блочим слеш в чате
#endif
while(replace_all2(szMessage, charsmax(szMessage), "%", "")) {} // фиксим багу с %S%S%S%S%S и им подобными

if(!iPlayerRusInfo[id])
{
if(!iPlayerRus[id])
{
iPlayerRusInfo[id] = true
PrintMsg(id, 0, "^1[^4LT^1] ^4У ^3Вас ^4есть возможность писать ^3по-русски. ^4Наберите ^3/rus ^4или ^3/eng ^4для переключения.")
}
}
if(iPlayerRus[id])
{
for(new i; i < sizeof eng; i++)
while(replace_all2(szMessage, charsmax(szMessage), eng, rus)) {}
}
new szLen
#if defined AES
static AESLvl[33][64], aStats[AES_ST_END]
aes_get_player_stats(id, aStats)
aes_get_level_name(aStats[AES_ST_LEVEL], AESLvl[id], 63, LANG_SERVER)


szLen += formatex(szFormatedMsg[szLen], charsmax(szFormatedMsg) - szLen, "^1[^4%s^1] ", AESLvl[id])
#endif
#if defined TAGS
szLen += formatex(szFormatedMsg[szLen], charsmax(szFormatedMsg) - szLen, "%s", iMessageTag[id])
#endif
if(!strcmp(Header, "#Cstrike_Chat_All"))
{
#if defined GREEN_MSG
if(equal(iMessageTag[id], "")) szLen += formatex(szFormatedMsg[szLen], charsmax(szFormatedMsg), "^3%%s1 ^1: %%s2")
else szLen += formatex(szFormatedMsg[szLen], charsmax(szFormatedMsg), "^3%%s1 ^1:^4 %%s2")
#else
szLen += formatex(szFormatedMsg[szLen], charsmax(szFormatedMsg), "^3%%s1 ^1: %%s2")
#endif
}
else szLen += formatex(szFormatedMsg[szLen], charsmax(szFormatedMsg), "%s", Header)

if(strlen(szFormatedMsg) + strlen(szMessage) >= 190)
{
PrintMsg(id, 0, "^4[Guard] ^3*** Ваше сообщение слишком длинное! ***")
return PLUGIN_HANDLED // fixed crash SayText 192 bytes
}
set_msg_arg_string(2, szFormatedMsg)
set_msg_arg_string(4, szMessage)


#if defined ADMIN_ALLCHAT
static players[32], pcount, sz2Msg[191]; get_players(players, pcount, "ch"); new sz2Len
sz2Len += formatex(sz2Msg[sz2Len], charsmax(sz2Msg), "%s ", szFormatedMsg)
sz2Len += formatex(sz2Msg[sz2Len], charsmax(sz2Msg) - sz2Len, "%s", szMessage)
for(new i; i < pcount; i++)
{
if(get_user_flags(players) & ADMIN && msgReciever ^ players)
PrintMsg(players, id, "%s", sz2Msg)
}
#endif
return PLUGIN_CONTINUE
}


stock PrintMsg(const iReceiver, const iSender, const szMessage[], any:...)
{
new szMsg[191]
vformat(szMsg, charsmax(szMsg), szMessage, 4)
message_begin(MSG_ONE_UNRELIABLE, 76, _, iReceiver)
write_byte(iSender ? iSender : iReceiver)
write_string(szMsg)
message_end()
}
#if defined ADBLOCK
bool:Flood_Control(id, szMsg[])
{
for(new i; i < approvedMsgsCounter; i++)
if(containi(szMsg, approved_msgs) != -1) return false

static last_msg[33], said_len
said_len = strlen(szMsg)
if(said_len > 13 && last_msg[id] == said_len) return true
last_msg[id] = said_len

for(new i; i < blockedMsgsCounter; i++)
if(containi(szMsg, blocked_msgs) != -1) return true
return false
}
#endif
#if defined TAGS
CheckFlags(id)
{
static iFlags
iFlags = get_user_flags(id)
if(iFlags & GL_ADMIN) return 1
else if(iFlags & ADMIN) return 2
else if(iFlags & VIP) return 3
return 0
}
#endif
// serfreeman1337 fixed. thx =)
stock replace_all2(string[], len, const what[], const with[])
{
new pos
if((pos = contain(string, what)) == -1) return 0
new total, with_len = strlen(with), diff = strlen(what) - with_len, total_len = strlen(string), temp_pos
while(total_len + with_len < len && replace(string[pos], len - pos, what, with) != 0)
{
total++
pos += with_len
total_len -= diff
if (pos >= total_len) break
temp_pos = contain(string[pos], what)
if (temp_pos == -1) break
pos += temp_pos
}
return total
}
Все правильно, так и должно быть.
Префиксы и прочая белиберда типа званий, ранга, стима отображаемая перед ником так же забирает Н-ое кол-во символов, соответственно на сообщение их остается меньше.
 

adolfzigger

Участник
Сообщения
8
Симпатии
0
Баллы
57
#3
Все правильно, так и должно быть.
Префиксы и прочая белиберда типа званий, ранга, стима отображаемая перед ником так же забирает Н-ое кол-во символов, соответственно на сообщение их остается меньше.
Спасибо за ответ
 

KRYSIS

by MAPS
Участник
Сообщения
83
Симпатии
7
Баллы
29
Возраст
31
#4
Если вам интересно.
Могу посоветовать только оставить звание (если есть) и префиксы и все. тем самым с экономите место в чате.

А остальные данные можно вывести информером обычно (зависит от системы которую используете).
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху