BanEx — различия между версиями

Материал из Pro-Pawn Wiki
Перейти к: навигация, поиск
(Новая страница: «{{Description | Закрывает соединение между сервером и клиентом (игроком) и блокирует его IP-адре…»)
 
 
Строка 1: Строка 1:
 
{{Description
 
{{Description
| Закрывает соединение между сервером и клиентом (игроком) и блокирует его IP-адрес. Отличие от [[Ban]] - возможность указать причину блокировки.
+
| Закрывает соединение между сервером и клиентом (игроком) и блокирует его IP-адрес с записью указанной причины блокировки.
 
}}
 
}}
 
{{Params|playerid, reason[]}}
 
{{Params|playerid, reason[]}}
 
{{Param
 
{{Param
 
| playerid
 
| playerid
| ID игрока, которого нужно заблокировать.
+
| ID игрока, которого требуется заблокировать.
 
}}
 
}}
 
{{Param
 
{{Param
Строка 12: Строка 12:
 
}}
 
}}
 
{{Returns
 
{{Returns
| Всегда возвращает <code>1</code>.
+
| <code>1</code>, если до блокировки игрок был подключен, иначе <code>0</code>.
 +
}}
 +
{{NoteSAMPBug
 +
| {{NoteSAMPCloseConnectionBug|BanEx}}
 
}}
 
}}
{{NoteSAMPCloseConnectionBug|BanEx}}
 
 
{{Example}}
 
{{Example}}
 
<pawn>
 
<pawn>
CMD:banex(playerid, params[])
+
const COLOR_RED = 0xFF604000;
 +
 
 +
CMD:ban(playerid, params[])
 
{
 
{
if (0 == IsPlayerAdmin(playerid))
+
new targetid;
return SendClientMessage(playerid, -1, !"Вы не администратор сервера!");
+
if (sscanf(params, "us", targetid, params))
extract params -> new player:targetid, string:reason[128]; else // sscanf2
+
return SendClientMessage(playerid, -1, "Использование: /ban [ID игрока/часть ника] [причина]");
return SendClientMessage(playerid, -1, !"Использование: /banex [ID игрока/часть ника] [причина]");
+
 
if (targetid == INVALID_PLAYER_ID)
 
if (targetid == INVALID_PLAYER_ID)
return SendClientMessage(playerid, -1, !"Игрок не найден.");
+
return SendClientMessage(playerid, -1, "Игрок не найден.");
SendClientMessage(targetid, -1, !"Вы были заблокированы администратором. Причина:");
+
 
SendClientMessage(targetid, -1, reason);
+
// Многократная передача массивов/строк через SetTimerEx() приводит к исчерпанию места
SetTimerEx(!"@_DelayedBanEx", 800, false, !"ds", playerid, reason);
+
// в секции стека/кучи (см. http://wiki.pro-pawn.ru/wiki/SetTimerEx).
return SendClientMessage(playerid, -1, !"Игрок был заблокирован.");
+
// Для обхода проблемы сохраним причину бана в 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, reason[]);
+
@_DelayedBanEx(playerid);
@_DelayedBanEx(playerid, reason[])
+
@_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);
 
return BanEx(playerid, reason);
 +
}
 
</pawn>
 
</pawn>
 +
{{SeeAlso}}
 +
* [[Ban]]
 +
* [[Kick]]
 
[[Категория:Функции SA-MP]]
 
[[Категория:Функции SA-MP]]

Текущая версия на 16:42, 8 августа 2018

Описание:

Закрывает соединение между сервером и клиентом (игроком) и блокирует его IP-адрес с записью указанной причины блокировки.

Параметры:

(playerid, reason[])
playerid ID игрока, которого требуется заблокировать.
reason[] Причина блокировки.


Возвращаемое значение:

1, если до блокировки игрок был подключен, иначе 0.

Bug.png
Баг 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);
}


См. также: