BanEx — различия между версиями
Материал из Pro-Pawn Wiki
VVWVV (обсуждение | вклад) (Новая страница: «{{Description | Закрывает соединение между сервером и клиентом (игроком) и блокирует его IP-адре…») |
|||
Строка 1: | Строка 1: | ||
{{Description | {{Description | ||
− | | Закрывает соединение между сервером и клиентом (игроком) и блокирует его IP-адрес | + | | Закрывает соединение между сервером и клиентом (игроком) и блокирует его IP-адрес с записью указанной причины блокировки. |
}} | }} | ||
{{Params|playerid, reason[]}} | {{Params|playerid, reason[]}} | ||
{{Param | {{Param | ||
| playerid | | playerid | ||
− | | ID игрока, которого | + | | ID игрока, которого требуется заблокировать. |
}} | }} | ||
{{Param | {{Param | ||
Строка 12: | Строка 12: | ||
}} | }} | ||
{{Returns | {{Returns | ||
− | | | + | | <code>1</code>, если до блокировки игрок был подключен, иначе <code>0</code>. |
+ | }} | ||
+ | {{NoteSAMPBug | ||
+ | | {{NoteSAMPCloseConnectionBug|BanEx}} | ||
}} | }} | ||
− | |||
{{Example}} | {{Example}} | ||
<pawn> | <pawn> | ||
− | CMD: | + | const COLOR_RED = 0xFF604000; |
+ | |||
+ | CMD:ban(playerid, params[]) | ||
{ | { | ||
− | if ( | + | new targetid; |
− | + | if (sscanf(params, "us", targetid, params)) | |
− | + | return SendClientMessage(playerid, -1, "Использование: /ban [ID игрока/часть ника] [причина]"); | |
− | return SendClientMessage(playerid, -1, | + | |
if (targetid == INVALID_PLAYER_ID) | if (targetid == INVALID_PLAYER_ID) | ||
− | return SendClientMessage(playerid, -1, | + | return SendClientMessage(playerid, -1, "Игрок не найден."); |
− | + | ||
− | + | // Многократная передача массивов/строк через SetTimerEx() приводит к исчерпанию места | |
− | 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); |
− | @_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
.
Баг 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);
}
См. также: