#if defined mention_included
#endinput
#endif
#define mention_included
///
/// Número máximo de citaçõs em um texto.
///
#define MAX_MENTION (3)
///
/// Texto/Caractere que irá aparecer na citação de um jogador bloqueado.
///
#define BLOCKED_MENTION_TEXT "*"
///
/// Variável interna responsável por gerenciar os bloqueios de citações.
///
static bool:blockedPlayer[MAX_PLAYERS][MAX_PLAYERS];
///
/// Chamado quando um jogador cita outro(s).
///
/// ID do jogador que realizou a citação.
/// ID do jogador citado.
/// True caso o jogador (citedid) esteja bloqueado e False caso contrário.
/// 1
forward OnPlayerMentionPlayer(playerid, citedid, bool:blocked);
///
/// Pega citações em um texto no formato '@000'
///
/// String passada por referência.
/// String contendo citações.
/// 1
stock GetMention(str[], out_str[], playerid = INVALID_PLAYER_ID)
{
new str2[500],
name[MAX_MENTION][MAX_PLAYER_NAME + 10],
strId[MAX_MENTION][3],
idx1 = -1,
idx2 = -1,
count = 0;
strcat(str2, str, sizeof str2);
while(count < MAX_MENTION)
{
idx1 = strfind(str2, "@", true, idx1+1);
idx2 = strfind(str2, " ", true, idx1);
if(idx1 > -1)
{
strmid(strId[count], str2, idx1+1, idx2, MAX_PLAYER_NAME + 10);
IsNumber(strId[count]);
if(IsNumber(strId[count]))
{
new id = strval(strId[count]);
if(playerid != INVALID_PLAYER_ID)
{
OnPlayerMentionPlayer(playerid, id, blockedPlayer[id][playerid]);
}
if(IsPlayerConnected(id))
{
strdel(str2, idx1, idx2);
GetPlayerName(id, name[count], MAX_PLAYER_NAME);
format(name[count], MAX_PLAYER_NAME + 10, "@%s", (blockedPlayer[id][playerid] ? (BLOCKED_MENTION_TEXT) : (name[count])));
strins(str2, name[count], idx1, sizeof str2);
}
}
}
else
break;
count ++;
}
strcat(out_str, str2, sizeof str2);
return 1;
}
///
/// Verifica se um jogador bloqueou outro.
///
/// ID do jogador que irá bloquear.
/// ID do jogador que será bloqueado.
/// True para bloquear um jogador e False para desbloquear
/// 1
stock PlayerBlockPlayerMention(playerid, targetid, bool:toggle)
{
blockedPlayer[playerid][targetid] = toggle;
return 1;
}
///
/// Verifica se um jogador bloqueou outro.
///
/// ID do jogador que bloqueou.
/// ID do jogador que foi bloqueado.
/// True caso o playerid esteja bloqueado para o targetid e False caso contrário.
stock IsPlayerBlockedMentionForPlayer(playerid, targetid)
return blockedPlayer[playerid][targetid];
///
/// Função interna que verifica se a string contém somente números.
///
/// String que será verificada.
/// True caso contenha somente números ou False caso contenha caracteres não-inteiros.
static IsNumber(str[])
{
for(new i = 0; i < strlen(str); i ++)
{
if(i > 0)
{
switch(str[i])
{
case '0'..'9': continue;
default: return 0;
}
}
}
return 1;
}