Здравствуйте, уважаемые пользователи форума Pro-Pawn.
Сегодня я решил написать для Вас систему блокировки аккаунта по дням с авторазбаном на MySQL R39-6.
В интернете я нашел пару таких систем, но они очень старой реализации и, к тому же, на данном форуме такой темы я не обнаружил.
Мы будем использовать MySQL R39-6, DC_CMD (можете использовать и другой, кроме стандартного, к примеру ZCMD, Pawn.CMD и так далее), sscanf 2.8.2, а также понадобится фикс для функции Kick (можете использовать фикс от Daniel_Cortez или другой).
Важно: Плюс ко всему нужен будет фикс кодировки MySQL от $continue$, чтобы в базу данных верно записывались буквы русского алфавита.
Необходимые файлы:
MySQL R39-6
DC_CMD v2.8
dc_kickfix
sscanf v2.8.2
banlist.sql
Собственно, приступим.
В OnPlayerConnect, в самое начало:
PHP код:
static const auto_query_string[] =
"SELECT * FROM `banlist` WHERE `Name` = '%s'";
new
playerid_name[MAX_PLAYER_NAME + 1],
query_string[sizeof(auto_query_string) - 2 + MAX_PLAYER_NAME + 1];
GetPlayerName(playerid, playerid_name, MAX_PLAYER_NAME);
format(query_string, sizeof(query_string), auto_query_string, playerid_name);
mysql_function_query(1, query_string, true, "OnPlayerFindInBanlist", "d", playerid);
Ко всем public добавляем следующие два:
PHP код:
forward OnPlayerUnban(playerid, targetid_name[]);
public OnPlayerUnban(playerid, targetid_name[])
{
new
rows,
fields;
cache_get_data(rows, fields);
if(!rows)
return SendClientMessage(playerid, -1, !"Аккаунт не найден.");
static const auto_query_string[] =
"DELETE FROM `banlist` WHERE `Name` = '%s'";
new
query_string[sizeof(auto_query_string) - 2 + MAX_PLAYER_NAME + 1];
format(query_string, sizeof(query_string), auto_query_string, targetid_name);
mysql_function_query(1, query_string, false, "", "");
format(query_string, sizeof(query_string), "Аккаунт %s разбанен.", targetid_name);
SendClientMessage(playerid, -1, query_string);
return 1;
}
PHP код:
forward OnPlayerFindInBanlist(playerid);
public OnPlayerFindInBanlist(playerid)
{
new
rows,
fields,
unbanunixtime;
cache_get_data(rows, fields);
if(rows)
{
unbanunixtime = cache_get_field_content_int(0, !"UnbanUNIXTime", 1);
new
playerid_name[MAX_PLAYER_NAME + 1],
admin_name[MAX_PLAYER_NAME + 1];
GetPlayerName(playerid, playerid_name, MAX_PLAYER_NAME);
if(gettime() >= unbanunixtime)
{
static const auto_query_string[] =
"DELETE FROM `banlist` WHERE `Name` = '%s'";
new
query_string[sizeof(auto_query_string) - 2 + MAX_PLAYER_NAME + 1];
format(query_string, sizeof(query_string), auto_query_string, playerid_name);
mysql_function_query(1, query_string, false, "", "");
return 1;
}
static const auto_string[] =
"Ваш аккаунт заблокирован Администратором {ff6347}%s. {ffffff}Причина: {ff6347}%s.";
new
string[sizeof(auto_string) - 2 + MAX_PLAYER_NAME - 2 + 32 + 1],
days_string[4+1],
word_string[8+1],
reason[32+1],
days = (unbanunixtime - gettime()) / 86400 + 1;
cache_get_field_content(0, !"Admin", admin_name);
cache_get_field_content(0, !"Reason", reason);
GetDeclensionWord(word_string, sizeof(word_string), days, "Остался", "Осталось", "Осталось");
GetDeclensionWord(days_string, sizeof(days_string), days, "день", "дня", "дней");
format(string, sizeof(string), auto_string, admin_name, reason);
SendClientMessage(playerid, -1, string);
format(string, sizeof(string), "%s {ff6347}%d %s {ffffff}до разблокировки.", word_string, days, days_string);
SendClientMessage(playerid, -1, string);
Kick(playerid);
}
return 1;
}
Ко всем stock:
PHP код:
stock GetDeclensionWord(result[], const size = sizeof(result), num, word_1[], word_2[], word_3[])
{
num %= 100;
if (num > 19) {
num %= 10;
}
result[0] = '\0';
switch (num) {
case 1: {
strcat(result, word_1, size);
}
case 2..4: {
strcat(result, word_2, size);
}
default: {
strcat(result, word_3, size);
}
}
}
И последний шаг - добавляем две команды бана и разбана игрока (либо в конец мода, либо там, где все Ваши команды):
PHP код:
CMD:ban(playerid, params[])
{
// if(!IsPlayerAdmin(playerid)) return 1;
new
targetid,
days,
days_string[4+1],
targetid_name[MAX_PLAYER_NAME+1],
playerid_name[MAX_PLAYER_NAME+1];
if(sscanf(params, !"uds[120]", targetid, days, params[0]))
return SendClientMessage(playerid, -1, !"Использование: /ban [ID/Ник] [Кол-во дней] [Причина]");
if(targetid == INVALID_PLAYER_ID)
return SendClientMessage(playerid, -1, !"Игрок не найден.");
if(!(1 <= days <= 100))
return SendClientMessage(playerid, -1, !"Неверное количество дней. Доступно: 1-100.");
if(strlen(params[0]) > 32)
return SendClientMessage(playerid, -1, !"Длина причины должна быть не больше 32х символов.");
GetPlayerName(playerid, playerid_name, MAX_PLAYER_NAME);
GetPlayerName(targetid, targetid_name, MAX_PLAYER_NAME);
GetDeclensionWord(days_string, sizeof(days_string), days, "день", "дня", "дней");
static const auto_string[] =
"Администратор %s[%d] забанил(а) %s[%d] на %d %s. Причина: %s";
new
string[sizeof(auto_string) - 2 + MAX_PLAYER_NAME - 2 + 4 - 2 + MAX_PLAYER_NAME - 2 + 4 - 2 + 3 - 2 + 4 - 2 + 32 + 1],
unbanunixtime = gettime() + days * 86400;
format(string, sizeof(string), auto_string, playerid_name, playerid, targetid_name, targetid, days, days_string, params[0]);
SendClientMessageToAll(-1, string);
static const auto_query_string[] =
"INSERT INTO `banlist` (`Name`, `Reason`, `Admin`, `BanDate`, `UnbanUNIXTime`) "\
"VALUES ('%s', '%s', '%s', '%s', '%d')";
new
query_string[sizeof(auto_query_string) - 2 + MAX_PLAYER_NAME - 2 + 32 - 2 + MAX_PLAYER_NAME - 2 + 20 - 2 + 11 + 1],
date_string[20+1],
year,
month,
day,
hour,
minute,
second;
getdate(year, month, day);
gettime(hour, minute, second);
format(date_string, sizeof(date_string), "%02d.%02d.%d, %02d:%02d:%02d", day, month, year, hour, minute, second);
format(query_string, sizeof(query_string), auto_query_string, targetid_name, params[0], playerid_name, date_string, unbanunixtime);
mysql_function_query(1, query_string, false, "", "");
TogglePlayerControllable(targetid, 0);
Kick(targetid);
return 1;
}
PHP код:
CMD:unban(playerid, params[])
{
// if(!IsPlayerAdmin(playerid)) return 1;
if(isnull(params))
return SendClientMessage(playerid, -1, !"Использование: /unban [Ник]");
if(strlen(params) > MAX_PLAYER_NAME)
return SendClientMessage(playerid, -1, !"Длина ника не должна превышать 24х символов.");
static auto_query_string[] =
"SELECT * FROM `banlist` WHERE `Name` = '%e'";
new
query_string[sizeof(auto_query_string) - 2 + MAX_PLAYER_NAME + 1];
mysql_format(1, query_string, sizeof(query_string), auto_query_string, params);
mysql_function_query(1, query_string, true, !"OnPlayerUnban", "ds", playerid, params);
return 1;
}
Скриншоты:
Открыть/закрыть
Примечание:
Проверку на администратора выставьте свою, ибо у каждого она разная, для примера я показал как сделать эти команды только для RCON администратора.
Если есть какие-нибудь ошибки/недочеты или же пожелания и дополнения, то с радостью Вас выслушаю. :)
При копировании урока на другие порталы, просьба указывать автора.
Автор: Skull