BanEx
Материал из Pro-Pawn Wiki
Описание:
Закрывает соединение между сервером и клиентом (игроком) и блокирует его IP-адрес с записью указанной причины блокировки.
Параметры:
(playerid, reason[]) |
playerid | ID игрока, которого требуется заблокировать. |
reason[] | Причина блокировки. |
Возвращаемое значение:
1
, если до блокировки игрок был подключен, иначе 0
.
Баг SA-MP |
Если незадолго до закрытия соединения с игроком были совершены какие-либо действия (например, отправка сообщений с помощью SendClientMessage() ), эффект от этих действий не будет виден на стороне игрока. Для обхода этой проблемы можно создать таймер с задержкой в 200-1000 миллисекунд и из него вызывать функцию BanEx() , либо использовать уже готовое решение, например, dc_kickfix.inc или u_kickfix.inc.
|
Пример использования:
const COLOR_RED = 0xFF604000;
CMD:ban(playerid, params[])
{
new targetid;
if (sscanf(params, "us", targetid, params))
return SendClientMessage(playerid, -1, "Использование: /ban [ID игрока/часть ника] [причина]");
if (targetid == INVALID_PLAYER_ID)
return SendClientMessage(playerid, -1, "Игрок не найден.");
// Многократная передача массивов/строк через SetTimerEx() приводит к исчерпанию места
// в секции стека/кучи (см. http://wiki.pro-pawn.ru/wiki/SetTimerEx).
// Для обхода проблемы сохраним причину бана в PVar'е.
SetPVarString(targetid, "ban_reason", params);
// Установим таймер.
SetTimerEx("@_DelayedBanEx", 800, false, "d", playerid);
// Выведем сообщения о том, что игрок был забанен.
new string[144], pname[MAX_PLAYER_NAME + 1], tname[MAX_PLAYER_NAME + 1];
GetPlayerName(playerid, pname, sizeof(pname));
GetPlayerName(playerid, tname, sizeof(tname));
format(string, sizeof(string), "Вы были забанены администратором %s, причина: %s", pname, params);
SendClientMessage(targetid, COLOR_RED, string);
format(string, sizeof(string), "Администратор %s забанил игрока %s, причина: %s", pname, tname, params);
return SendClientMessageToAll(COLOR_RED, string);
}
@_DelayedBanEx(playerid);
@_DelayedBanEx(playerid)
{
new reason[128];
GetPVarString(targetid, "ban_reason", reason, sizeof(reason));
// На этот раз баг в GetPVarString() (см. http://wiki.pro-pawn.ru/wiki/GetPVarString).
// Исправим символы в строке перед тем, как передать её в BanEx().
static i; i = -1;
do {} while((text[++i] &= 0xFF) != '\0');
return BanEx(playerid, reason);
}
CMD:ban(playerid, params[])
{
new targetid;
if (sscanf(params, "us", targetid, params))
return SendClientMessage(playerid, -1, "Использование: /ban [ID игрока/часть ника] [причина]");
if (targetid == INVALID_PLAYER_ID)
return SendClientMessage(playerid, -1, "Игрок не найден.");
// Многократная передача массивов/строк через SetTimerEx() приводит к исчерпанию места
// в секции стека/кучи (см. http://wiki.pro-pawn.ru/wiki/SetTimerEx).
// Для обхода проблемы сохраним причину бана в PVar'е.
SetPVarString(targetid, "ban_reason", params);
// Установим таймер.
SetTimerEx("@_DelayedBanEx", 800, false, "d", playerid);
// Выведем сообщения о том, что игрок был забанен.
new string[144], pname[MAX_PLAYER_NAME + 1], tname[MAX_PLAYER_NAME + 1];
GetPlayerName(playerid, pname, sizeof(pname));
GetPlayerName(playerid, tname, sizeof(tname));
format(string, sizeof(string), "Вы были забанены администратором %s, причина: %s", pname, params);
SendClientMessage(targetid, COLOR_RED, string);
format(string, sizeof(string), "Администратор %s забанил игрока %s, причина: %s", pname, tname, params);
return SendClientMessageToAll(COLOR_RED, string);
}
@_DelayedBanEx(playerid);
@_DelayedBanEx(playerid)
{
new reason[128];
GetPVarString(targetid, "ban_reason", reason, sizeof(reason));
// На этот раз баг в GetPVarString() (см. http://wiki.pro-pawn.ru/wiki/GetPVarString).
// Исправим символы в строке перед тем, как передать её в BanEx().
static i; i = -1;
do {} while((text[++i] &= 0xFF) != '\0');
return BanEx(playerid, reason);
}
См. также: