Сообщение от
Untonyst
Нашел
PHP код:
public OnPlayerText(playerid, text[])
{
new PlayerName[MAX_PLAYER_NAME];
for(new i = strfind(text, "@", true), a = 0, tmp[4]; i != -1; i = strfind(text, "@", true, i)) // нашли включение обращения
{
++i, a = 0; // если их несколько - продолжаем до конца
while(48 <= text[i] <= 57 && a != 4) tmp[a++] = text[i++]; // ы
if(tmp[0] == EOS) continue; // если не найден
GetPlayerName(strval(tmp), PlayerName, sizeof(PlayerName)); // получаем имя введённого в чат ID
strdel(text, i - a - 1, i); // удаляем символ и ID
strins(text, PlayerName, i - a - 1, 128); // вставляем ник в чат
}
GetPlayerName(playerid, PlayerName, sizeof(PlayerName));
format(text, 128, "%s: {FFFFF}%s", PlayerName, text);
SendClientMessageToAll(GetPlayerColor(playerid), text);
return 0;
}
Этот код изменяет ту же строку, что и получает на входе, при этом в функцию strins в качестве длины строки всё время передаётся 128, из-за чего не мудрено словить выход за пределы массива. Мало того, этот выход будет не в коде на Pawn, а в нативной функции, что может привести к крашу или другим непредсказуемым результатам. Легендарный код такой легендарный.
Точно помню, что делал что-то подобное раньше, попробую поискать в своих заготовках.
UPD: Пример кода, на котором фейлится функция от OKStyle:
PHP код:
#include <a_samp>
my_GetPlayerName(playerid, output[], size)
{
static const names[][MAX_PLAYER_NAME] =
{
{"Nick1"},
{"Nick2"},
{"Nick_Abcdefgh"}
};
if((playerid < 0) || (playerid >= sizeof(names)))
return 0;
output[0] = '\0';
return strcat(output, names[playerid], size);
}
#if defined _ALS_GetPlayerName
#undef GetPlayerName
#else
#define _ALS_GetPlayerName
#endif
#define GetPlayerName my_GetPlayerName
public OnPlayerText(playerid, text[])
{
new PlayerName[MAX_PLAYER_NAME];
for(new i = strfind(text, "@", true), a = 0, tmp[4]; i != -1; i = strfind(text, "@", true, i))
{
++i, a = 0;
while(48 <= text[i] <= 57 && a != 4) tmp[a++] = text[i++];
if(tmp[0] == EOS) continue;
GetPlayerName(strval(tmp), PlayerName, sizeof(PlayerName));
strdel(text, i - a - 1, i);
strins(text, PlayerName, i - a - 1, 128);
}
GetPlayerName(playerid, PlayerName, sizeof(PlayerName));
format(text, 128, "%s: {FFFFF}%s", PlayerName, text);
SendClientMessageToAll(GetPlayerColor(playerid), text);
return 0;
}
main()
{
static test_string[] = "Wassup, @0! @2? @3?";
OnPlayerText(0, test_string);
print(test_string);
}