Чтобы сделать бан чата на время, будем использовать OnPlayerClickPlayer, т.е. клик по нику в табе.
1. В начало мода добавим:
Код
#define DLG_ADMIN_CMD 1 // id диалогов, ставьте свои
#define DLG_ADMIN_BanChat 2
new TMR_BanChat[MAX_PLAYERS]; // timerid
new Chosen[MAX_PLAYERS]; // для записи id игрока в табе
Если у вас есть в моде enum pInfo, то вставьте pMutes в конец:
Код
enum pInfo
{
--------,
--------,
pMutes
}
Если нет enum pInfo, то сделайте переменную pMutes:
Код
new pMutes[MAX_PLAYERS];
Будем считать что у Вас enum pInfo есть, поэтому будем использовать PlayerInfo[playerid][pMutes]. Иначе используйте pMutes[playerid]
В OnPlayerConnect вставим:
Код
PlayerInfo[playerid][pMutes] = 0;
2. В OnPlayerClickPlayer вставляем:
Код
new string1[128],string2[128],clickedname[24];
Chosen[playerid] = clickedplayerid;
GetPlayerName(Chosen[playerid],clickedname,24); // запись имени игрока
clickedplayerid обязательно нужно записать в глобальную переменную Chosen, т.к. это пригодится при работе в других пабликах.
Далее делаем проверку на rcon админа:
Код
if(IsPlayerAdmin(playerid))
{
}
Вставляем в это условие:
Код
format(string1,sizeof(string),"Доступные действия над игроком %s[%d]:",clickedname,Chosen[playerid]);
if(PlayerInfo[clickedplayerid][pMutes] == 0)
{
format(string2,sizeof(string),"Дать бан чата");
}
else format(string2,sizeof(string),"Снять бан чата");
ShowPlayerDialog(playerid,DLG_ADMIN_CMD,DIALOG_STYLE_LIST,string1,string2,"Выбрать","Выход");
Ну здесь думаю понятно. В первой строке мы делаем заголовок диалога. А во второй, форматируем текст в зависимости от того, есть ли бан чата у игрока или нет.
Можно добавить не обязательное условие после проверки на rcon админа:
Код
else if(!IsPlayerAdmin(playerid)) SendClientMessage(playerid,COLOR_RED,"Это действие доступно только администратору!");
3. В public OnDialogResponse:
Код
new clickedname[24];
GetPlayerName(Chosen[playerid],clickedname,24);
if(dialogid == DLG_ADMIN_CMD && response)
{
switch(listitem)
{
case 0://бан чата
{
if(PlayerInfo[Chosen[playerid]][pMutes] == 0)
{
format(string,256,"Чтобы дать игроку %s бан чата,\nвведите время в минутах:",clickedname);
ShowPlayerDialog(playerid,DLG_ADMIN_BanChat,1,"Бан чата на время",string,"Ок","Отмена");
}
else if(PlayerInfo[Chosen[playerid]][pMutes] == 1)
{
PlayerInfo[Chosen[playerid]][pMutes] = 0;
SendClientMessage(Chosen[playerid],COLOR_GREEN,"Администратор разрешил Вам писать в чат!");
KillTimer(TMR_BanChat[Chosen[playerid]]);
}
}
}
}
Разберём. Если бана чата ещё не было у выбранного игрока, то запускаем диалог ввода. Если бан уже стоит, то обнуляем переменную pMutes, и убиваем таймер TMR_BanChat о котором будет описано ниже.
4. В этом же паблике ниже вставляем:
Код
if(dialogid == DLG_ADMIN_BanChat && response)//бан чата
{
PlayerInfo[Chosen[playerid]][pMutes] = 1;
TMR_BanChat[Chosen[playerid]] = SetTimer("BanChat",1000*60*strval(inputtext),false);
format(string,256,"Администратор заткнул Вас на %d мин.!",strval(inputtext));
SendClientMessage(playerid,COLOR_RED,string);
}
Здесь мы устанавливаем бан чата, и запускаем таймер TMR_BanChat.
5. В любом месте вставим паблик BanChat:
Код
forward BanChat(playerid);
public BanChat(playerid)
{
PlayerInfo[Chosen[playerid]][pMutes] = 0;
SendClientMessage(Chosen[playerid],COLOR_GREEN,"Время молчанки истекло, теперь вы можете писать в чат!");
return 1;
}
Здесь всё понятно.
6. В public OnPlayerText добавим:
Код
if(PlayerInfo[playerid][pMutes] == 1)
{
SendClientMessage(playerid,COLOR_RED,"*Вам запрещено писать в чат!");
return 0;
}
Вот и всё!
Автор урока: fenix05
Для www.SAMP-TEAM.com