PDA

Просмотр полной версии : [Мануал] Улучшенный глобальный чат.



TheMallard
23.03.2016, 14:28
Улучшенный глобальный чат с антифлудом от Londlem.

http://ihost.pro-pawn.ru/image.php?di=0CSX



public OnPlayerText(playerid, text[])
{
new server_tick = GetTickCount();
if(GetPVarInt(playerid, "anti_flood") > server_tick)
return 0;
SetPVarInt(playerid, "anti_flood", server_tick + 1000);

static const admin_rank[] = "Администратор ";
static const format_str[] = "%s ({%06x}%s%s{ECF0F1})";

#define MAX_PLAYER_TEXT (MAX_CHATBUBBLE_LENGTH - (sizeof(format_str) - \
(2 * 3 + 6 + 8 + 2) + MAX_PLAYER_NAME * 2 + sizeof(admin_rank) + 1))
if(strlen(text) > MAX_PLAYER_TEXT)
return 0;
#undef MAX_PLAYER_TEXT

new player_name[MAX_PLAYER_NAME + 1];
GetPlayerName(playerid, player_name, MAX_PLAYER_NAME);

new player_msg[MAX_CHATBUBBLE_LENGTH];
format(player_msg, sizeof(player_msg), format_str,
text, GetPlayerColor(playerid) >>> 8,
IsPlayerAdmin(playerid) ? admin_rank : "", player_name);
SendClientMessageToAll(0xECF0F1FF, player_msg);
return 0;
}

ziggi
23.03.2016, 15:24
Он не улучшенный, а просто другой (я, например, предпочитаю видеть ник (и ID) перед сообщением). Ещё ты не учёл случай, когда игрок введёт больше, чем MAX_PLAYER_TEXT символов. И высчитывать размер для player_msg смысла нет, он фиксирован (144).

Так, по моему, будет правильнее:

public OnPlayerText(playerid, text[])
{
static const
adm_pfx[] = "Администратор ",
fmt_str[] = "%s ({%06x}%s%s{ECF0F1})";

#define MAX_PLAYER_TEXT (MAX_CHATBUBBLE_LENGTH - MAX_PLAYER_NAME \
- sizeof(adm_pfx) \
- (sizeof(fmt_str) - 2 + 2 - 4))
#assert MAX_PLAYER_TEXT > 0

text[MAX_PLAYER_TEXT] = 0;

new player_name[MAX_PLAYER_NAME + 1];
GetPlayerName(playerid, player_name, MAX_PLAYER_NAME);

new player_msg[144];
format(player_msg, sizeof(player_msg), fmt_str,
text,
GetPlayerColor(playerid) >>> 8,
IsPlayerAdmin(playerid) ? adm_pfx : "",
player_name);

SendClientMessageToAll(0xECF0F1FF, player_msg);

#undef MAX_PLAYER_TEXT
return 0;
}

TheMallard
23.03.2016, 15:57
И правда, что как-то не очень вышло. Перепишу, спасибо.

Giffka
20.04.2016, 21:44
Он не улучшенный, а просто другой (я, например, предпочитаю видеть ник (и ID) перед сообщением). Ещё ты не учёл случай, когда игрок введёт больше, чем MAX_PLAYER_TEXT символов. И высчитывать размер для player_msg смысла нет, он фиксирован (144).

Так, по моему, будет правильнее:

public OnPlayerText(playerid, text[])
{
static const
adm_pfx[] = "Администратор ",
fmt_str[] = "%s ({%06x}%s%s{ECF0F1})";

#define MAX_PLAYER_TEXT (MAX_CHATBUBBLE_LENGTH - MAX_PLAYER_NAME \
- sizeof(adm_pfx) \
- (sizeof(fmt_str) - 2 + 2 - 4))
#assert MAX_PLAYER_TEXT > 0

text[MAX_PLAYER_TEXT] = 0;

new player_name[MAX_PLAYER_NAME + 1];
GetPlayerName(playerid, player_name, MAX_PLAYER_NAME);

new player_msg[144];
format(player_msg, sizeof(player_msg), fmt_str,
text,
GetPlayerColor(playerid) >>> 8,
IsPlayerAdmin(playerid) ? adm_pfx : "",
player_name);

SendClientMessageToAll(0xECF0F1FF, player_msg);

#undef MAX_PLAYER_TEXT
return 0;
}

Данный код не является работоспособным, хоть и компилируется без единой ошибки.