PDA

Просмотр полной версии : [Вопрос] Анти-Капс



Skyline
11.03.2015, 16:41
Здравствуйте, подскажите, как можно сделать, когда игрок пишет в какой либо чат, предложение становилось такого формата:

Из
ВСЕМ ПРИВЕТ ДРУЗЬЯ.
В
Всем Привет Друзья.

Буду очень благодарен.

MR_BEN
11.03.2015, 17:46
Кликабельно (http://pro-pawn.ru/showthread.php?9233-toupper-и-tolower-%28-регистры-%29)

L0ndl3m
11.03.2015, 18:20
Держите:


stock RegularizeString(source[])
{
for(new i = 0, start; source[(0 == i) ? i : i - 1] != EOS; i++)
{
if(source[i] == ' ' && !('а' <= source[i + 1] <= 'Я'))
start = 0;
else
{
source[i] = !start ? toupper(source[i]) : tolower(source[i]);
start = 1;
}
}
}


Использование:


new
source[128];

source = "ВСЕМ ПРИВЕТ ДРУЗЬЯ.";

RegularizeString(source);

print(source); // вывод: "Всем Привет Друзья."




new
source[128];

source = "ВсЕМ прИВЕт дрУЗья.";

RegularizeString(source);

print(source); // вывод: "Всем привет друзья."

Skyline
12.03.2015, 18:03
Немного не понимаю.
Как сделать для команды например чтоб текст выводило?

if(strcmp(cmd, "/ooa", true) == 0)
{
if(IsPlayerConnected(playerid))
{
if(gPlayerLogged[playerid] == 0) return SendClientMessage(playerid, COLOR_GREY, "Вы ещё не вошли в игру !");
if(PlayerInfo[playerid][pAdmin] == 6)
{
new length = strlen(cmdtext);
while ((idx < length) && (cmdtext[idx] <= ' '))
{
idx++;
}
new offset = idx;
new result[64];
while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
{
result[idx - offset] = cmdtext[idx];
idx++;
}
result[idx - offset] = EOS;
new s[75];
format(s, sizeof(s), "Отправитель AscarY: %s ",result);
SendClientMessageToAll(COLOR_YELLOW, s);
RegularizeString(s)
}
}
return 1;
}
Так ведь?

L0ndl3m
12.03.2015, 18:21
Функцию перед SendClientMessageToAll поставьте.

Skyline
12.03.2015, 21:27
А если переделывать всю строку, изменяет и ник.

format(string, sizeof(string), "%s[%d] кричит: %s!", sendername,playerid, result);
RegularizeString(string);
Итог такой, если ник SKYLINE

Skyline[0] кричит: Всем Привет!
А если сделать так, то ничего не выводит, как сделать чтобы действовало именно на сообщение?

format(string, sizeof(string), "%s[%d] кричит: %s!", sendername,playerid, result);
RegularizeString(result);

L0ndl3m
12.03.2015, 21:55
Если честно, я не понял.

Skyline
12.03.2015, 22:03
Вообщем как сделать,чтобы Анти-Капс действовал только на выводимое сообщение игрока result А не на всю строку string

L0ndl3m
12.03.2015, 23:20
Так как вы сейчас делаете - это и есть решение.

Skyline
12.03.2015, 23:40
Да, он у меня сейчас изменяет всю строку, даже Ник, чего не нужно, мне нужно чтобы изменял отправленное сообщение, т.е. result

BaBuIIIkaDrifteR
13.03.2015, 00:40
onplayertext

new AntiCaps;


for(new i = 0; i <= strlen(text); i++)
{
switch(text[i])
{
case 'A'..'Z', 'А'..'Я': AntiCaps++;
}
if(AntiCaps > 3) text[i] = tolower(text[i]);
}

MR_BEN
13.03.2015, 15:18
if(strcmp(cmd, "/ooa", true) == 0)
{
if(IsPlayerConnected(playerid))
{
if(gPlayerLogged[playerid] == 0) return SendClientMessage(playerid, COLOR_GREY, "Вы ещё не вошли в игру !");
if(PlayerInfo[playerid][pAdmin] == 6)
{
new length = strlen(cmdtext);
while ((idx < length) && (cmdtext[idx] <= ' '))
{
idx++;
}
new offset = idx;
new result[64];
while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
{
result[idx - offset] = cmdtext[idx];
idx++;
}
result[idx - offset] = EOS;
new s[75];
RegularizeString(result);
format(s, sizeof(s), "Отправитель AscarY: %s ",result);
SendClientMessageToAll(COLOR_YELLOW, s);

}
}
return 1;
}

BaBuIIIkaDrifteR
13.03.2015, 17:57
Deleted sorry

Skyline
13.03.2015, 23:28
if(strcmp(cmd, "/ooa", true) == 0)
{
if(IsPlayerConnected(playerid))
{
if(gPlayerLogged[playerid] == 0) return SendClientMessage(playerid, COLOR_GREY, "Вы ещё не вошли в игру !");
if(PlayerInfo[playerid][pAdmin] == 6)
{
new length = strlen(cmdtext);
while ((idx < length) && (cmdtext[idx] <= ' '))
{
idx++;
}
new offset = idx;
new result[64];
while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
{
result[idx - offset] = cmdtext[idx];
idx++;
}
result[idx - offset] = EOS;
new s[75];
RegularizeString(result);
format(s, sizeof(s), "Отправитель AscarY: %s ",result);
SendClientMessageToAll(COLOR_YELLOW, s);

}
}
return 1;
}

Не работает так.
Если например написать сообщение "ВСЕМ привет" - Выведет вот так - "Всем Привет".
И каждое следующее слово начинает с заглавной буквы, но это не только если так попробывать..

BaBuIIIkaDrifteR
13.03.2015, 23:46
Мой способ пробуй в начало паблика.

Skyline
13.03.2015, 23:49
Просто в OnPlayerText? В командах проверки не нужны?