PDA

Просмотр полной версии : [Мануал] Бан с выбором причины из диалога



L0ndl3m
23.03.2014, 15:09
`Из названия темы всё понятно.
Для работы потребуется плагин sscanf2.

Добавляем ко всем new:


#define BAN_DIALOG_ID 58 // Вместо 58 выставляете свободный ID диалога, такой ID, которого нет в public OnDialogResponse

#define MAX_BAN_REASON 20
#define MAX_BAN_REASON_DESC 24

enum e_ban_reasons
{
banReason[MAX_BAN_REASON],
banReasonDesc[MAX_BAN_REASON_DESC]
};

static const
g_ban_reasons[10][e_ban_reasons] =
{
{{"God Mode"}, {"Бесконечное здоровье"}},
{{"Speed Hack"}, {"Чит на скорость"}},
{{"Air Brake"}, {"Чит на полёт"}},
{{"Weapon Hack"}, {"Чит на оружие"}},
{{"No Reload"}, {"Бесконечное оружие"}},
{{"HP Regen"}, {"Восстановление здоровья"}},
{{"VHP Refit"}, {"Восстановление здоровья транспорта"}},
{{"Insults"}, {"Оскорбления"}},
{{"AFK In Fight"}, {"AFK в бою"}},
{{"Fly Hack"}, {"Чит на полёт"}}
};


Добавляем команду для бана игрока:



CMD:ban(playerid, params[])
{
if(!IsPlayerAdmin(playerid))
return 1; // Проверка на админа, можете заменить на свою
extract params -> new player: targetid; else
return SendClientMessage(playerid, -1, "Используйте: /ban [playerid]");
if(IsPlayerConnected(targetid) == 0)
return SendClientMessage(playerid, -1, "Такого игрока нет на сервере.");

SetPVarInt(playerid, "BanTarget", targetid);
static const
concat_str0[] = "{ff0000}",
concat_str1[] = "\t\t{ffffff}[";

new
string[((sizeof(concat_str0) - 1) + (MAX_BAN_REASON - 1) + (sizeof(concat_str1) - 1) + (MAX_BAN_REASON_DESC - 1) + 2) * sizeof(g_ban_reasons) - 1 + 1];
string[0] = '\0';

new
len = 0;

for(new i = 0; i < sizeof(g_ban_reasons); ++i)
len += strcat(string, concat_str0) + strcat(string, g_ban_reasons[i][banReason]),
len += strcat(string, concat_str1) + strcat(string, g_ban_reasons[i][banReasonDesc]),
string[len++] = ']', string[len++] = '\n', string[len] = '\0';
string[--len] = '\0';
return ShowPlayerDialog(playerid, BAN_DIALOG_ID, DIALOG_STYLE_LIST, "Выберите причину", string, "Забанить", "Отмена");
}





if(strcmp(cmdtext, "/ban", true) == 0)
{
if(!IsPlayerAdmin(playerid))
return 1; // Проверка на админа, можете заменить на свою
extract cmdtext -> new player: targetid; else
return SendClientMessage(playerid, -1, "Используйте: /ban [playerid]");
if(IsPlayerConnected(targetid) == 0)
return SendClientMessage(playerid, -1, "Такого игрока нет на сервере.");

SetPVarInt(playerid, "BanTarget", targetid);
static const
concat_str0[] = "{ff0000}",
concat_str1[] = "\t\t{ffffff}[";
new
string[((sizeof(concat_str0) - 1) + (MAX_BAN_REASON - 1) + (sizeof(concat_str1) - 1) + (MAX_BAN_REASON_DESC - 1) + 2) * sizeof(g_ban_reasons) - 1 + 1];
string[0] = '\0';

new
len = 0;

for(new i = 0; i < sizeof(g_ban_reasons); ++i)
len += strcat(string, concat_str0) + strcat(string, g_ban_reasons[i][banReason]),
len += strcat(string, concat_str1) + strcat(string, g_ban_reasons[i][banReasonDesc]),
string[len++] = ']', string[len++] = '\n', string[len] = '\0';
string[--len] = '\0';
return ShowPlayerDialog(playerid, BAN_DIALOG_ID, DIALOG_STYLE_LIST, "Выберите причину", string, "Забанить", "Отмена");
}



Добавим распознавание диалога, в public OnDialogResponse:



case BAN_DIALOG_ID:
{
if(response == 0)
return 1;
new
targetname[MAX_PLAYER_NAME+1],
targetid = GetPVarInt(playerid, "BanTarget");

static const
fmt_str[] = "%s (%d) забанил %s (%d) по причине: %s";

new
str[sizeof(fmt_str) + (-2 + MAX_PLAYER_NAME) + (-2 + 4) + (-2 + MAX_PLAYER_NAME) + (-2 + 4) + (-2 + MAX_BAN_REASON - 1)];
GetPlayerName(playerid, str, sizeof(str));
GetPlayerName(targetid, targetname, sizeof(targetname));
format(str, sizeof(str), fmt_str, str, playerid, targetname, targetid, g_ban_reasons[listitem][banReason]);
SendClientMessageToAll(-1, str);
return Ban(targetid);
}


Автор: Londlem (http://pro-pawn.ru/member.php?2057-Londlem)

Специально для: Pro-Pawn.Ru (http://pro-pawn.ru)

Копирование данной статьи без разрешения автора запрещено!

Salvacore
23.03.2014, 17:27
Отлично!

=SAN=
23.03.2014, 19:49
Удобно.Не нужно писать лишний текст и т.д

Accord
27.03.2014, 17:12
Лучше уж сделать различные причины, а не только виды читов.


new const CheatNames[][] = {"Читы", "Оск. Родных", "Взломан/Передан", и так далее};

Caypen
27.03.2014, 18:32
Хорошо конечно но
1. Диалог не завершает клбэк а значит дальше будет перебирать диалоги.
2. Иногда нужно быстро забанить игрока а с этими диалогами так врят-ли получится.
3. Зачем эти гм,спидхак и т.д. можно же просто как в посте выше написано сделать.
4. Лучше еще добавить графу "Другое" куда можно будет вписать свою причину,ну или продумывать все возможные варианты причин.

"Volk"
27.03.2014, 20:19
ну тут дашь бан он перезайдёт и опять в игре

L0ndl3m
27.03.2014, 20:23
ну тут дашь бан он перезайдёт и опять в игре

На локалке тестировали что-ли?

"Volk"
28.03.2014, 08:22
На локалке тестировали что-ли?
да)))

Kenny_Dalglish
28.03.2014, 16:51
Подобное в скарлекс есть

Salvacore
28.03.2014, 17:16
Подобное в скарлекс есть
Где-где?

Kenny_Dalglish
28.03.2014, 17:44
Где-где?

SkrilaxRP