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)
Копирование данной статьи без разрешения автора запрещено!
Для работы потребуется плагин 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)
Копирование данной статьи без разрешения автора запрещено!