underwoker
24.07.2014, 06:01
И так, всем доброго времени суток! Надеюсь кому нибудь этот мануальчик будет полезен. Старался все расписать более менее подробно и настолько чтобы нубам было понятно.
Ув. Модераторы и пользователи, если увидите макрос который не указан в теме, напишите пожалуйста. А так же приветствуется адекватная критика.
Начнемс. Учтите, что нам понадобится инклуд и плагин mysql (https://github.com/pBlueG/SA-MP-MySQL/releases/download/R39-2/mysql-r39-2-win.zip),sscanf (http://dl.dropbox.com/u/21683085/sscanf.rar),mxdate (http://rghost.ru/35622578) и DC_CMD (http://pro-pawn.ru/showthread.php?1028-DC_CMD-v2-8-%2823-03-14%29).
Добавим пару макросов, переменных и массивов в начало мода, дабы было удобнее далее их использовать. Если у вас есть уже они, то не добавляйте, а измените на свои.
#define NewKick(%0) SetTimerEx("DelayedKick", 1000, false, "d", (%0))
#define fpub:%0(%1) forward %0(%1); public %0(%1)
#define GetName(%1) pPlayerName[%1]
new querybans[200];
new pPlayerName[MAX_PLAYERS][MAX_PLAYER_NAME];
В конец мода добавим этот паблик и форвард:
forward DelayedKick(playerid);
public DelayedKick(playerid) return Kick(playerid); // Этот паблик относится к таймеру, который был объявлен макросом в начале мануала. Тут мы кикаем игрока через 1000 милисекунд.
Добавим в OnPlayerConnect, после проверки на то, есть ли аккаунт игрока на сервере, запросы в бд, на нахождение ника в списке банов и IP адреса.
GetPlayerName(playerid, pPlayerName[playerid], MAX_PLAYER_NAME);
format(querybans, sizeof(querybans), "SELECT * FROM `Bans` WHERE `Nick` = '%s'", GetName(playerid)); // Форматируем запрос в бд
mysql_function_query(1, querybans, true, "CheckBan", "d", playerid); // Отправляем запрос.
new ipStr[16];
GetPlayerIp( playerid, ipStr, 16 );
format(querybans, sizeof(querybans), "SELECT * FROM `Bans` WHERE `IP` = '%s'", ipStr); // Форматируем запрос в бд
mysql_function_query(1, querybans, true, "CheckBanIP", "d", playerid); // Отправляем запрос.
Добавим паблики в конец мода, так же, в которых будем брать данные из БД после запроса который сделали в OnPlayerConnect
fpub:CheckBanIP(playerid)
{
new unbandate;
new rows,fields;
cache_get_data(rows, fields);
if(rows)
{
unbandate = cache_get_field_content_int(0, "UnbanDate");
if(gettime() >= unbandate)// Если сейчас дата больше чем та что была записана при бане, разбаниваем игрока
{
format(querybans, sizeof(querybans), "DELETE FROM `Bans` WHERE `Nick` = '%s'",GetName(playerid)); // Форматируем.
mysql_function_query(1, querybans, false, "",""); // Отправляем запрос.
return true;
}
else// Иначе выводим диалог что посиди еще в бане, время не вышло.
{
new str[100];
format(str, sizeof(str),"Ваш аккаунт заблокирован\nДата разблокировки: %s",date("%dd/%mm/%yyyy в %hh:%ii:%ss",unbandate));
ShowPlayerDialog(playerid,91,0,"Аккаунт заблокирован:",str,"Ok","");
NewKick(playerid);
}
}
return true;
}
fpub:CheckBan(playerid)
{
new rows,fields;
new unbandate;
cache_get_data(rows, fields);
if(rows)
{
unbandate = cache_get_field_content_int(0, "UnbanDate"); //
if(gettime() >= unbandate) // Если сейчас дата больше чем та что была записана при бане, разбаниваем игрока
{
format(querybans, sizeof(querybans), "DELETE FROM `Bans` WHERE `Nick` = '%s'",GetName(playerid)); // форматируем.
mysql_function_query(1, querybans, false, "","");// Отправляем запрос.
return true;
}
else // Иначе выводим диалог что посиди еще в бане, время не вышло.
{
new str[100];
format(str, sizeof(str),"Ваш аккаунт заблокирован\nДата разблокировки: %s",date("%dd/%mm/%yyyy в %hh:%ii:%ss",unbandate));
ShowPlayerDialog(playerid,91,0,"Аккаунт заблокирован:",str,"Ok","");
NewKick(playerid);
}
}
return true;
}
fpub:GetBan(playerid)
{
new rows,fields;
new str[100],unbandate;
cache_get_data(rows, fields);
if(rows) //Если в бд строки найдены
{
unbandate = cache_get_field_content_int(0, "UnbanDate");
format(str, sizeof(str),"Аккаунт заблокирован. Дата разблокировки: %s",date("%dd/%mm/%yyyy Время: %hh:%ii:%ss",unbandate));
SendClientMessage(playerid, -1, str);
return true;
}
else return SendClientMessage(playerid, -1, "Аккаунт не в бане");// иначе пишем игроку что не заблокирован.
}
fpub:GetBanIP(playerid, ip[])
{
new rows,fields;
new str[100],unbandate;
cache_get_data(rows, fields);
if(rows) //Если в бд строки найдены
{
unbandate = cache_get_field_content_int(0, "UnbanDate");
format(str, sizeof(str),"IP заблокирован. Дата разблокировки: %s",date("%dd/%mm/%yyyy Время: %hh:%ii:%ss",unbandate));
SendClientMessage(playerid, -1, str);
return true;
}
else return SendClientMessage(playerid, -1, "IP не заблокирован."); // иначе пишем игроку что не заблокирован.
}
fpub:Unban(i,nick[])
{
new rows,fields;
cache_get_data(rows, fields);
if(!rows) // Если в бд строки не найдены
{
SendClientMessage(i,-1,"Нету игрока с таким ником в бане!");
}
else // Иначе(если найдены)
{
new string[31+24];
format(querybans, sizeof(querybans), "DELETE FROM `Bans` WHERE `Nick` = '%s'",nick);// Форматируем запрос в бд
mysql_function_query(1, querybans, false, "",""); // отправляем запрос.
format(string, sizeof(string), "Вы успешно разбанили игрока %s!",nick); //форматируем
SendClientMessage(i,-1,string);// отправляем
}
return true;
}
Добавим команды бана, разбана, проверки на бан(Показываю на примере DC_CMD):
CMD:getban_player(playerid, params[])
{
//if(PINFO[playerid][pAdminLVL] < 1) return true; // Данную строчку расскоментируйте и измените переменную админки на свою.
if(sscanf(params,"s[25]",params[0])) return SendClientMessage(playerid, 0x00D900C8, "- Подсказка:{FFFFFF} /getban_player [Ник]");
format(querybans, sizeof(querybans), "SELECT * FROM `Bans` WHERE `Nick` = '%s'", params[0]);// Форматируем запрос в бд
mysql_function_query(1, querybans, true, "GetBan", "d", playerid); // отправляем запрос.
return true;
}
CMD:getban_playerip(playerid, params[])
{
//if(PINFO[playerid][pAdminLVL] < 1) return true; // Данную строчку расскоментируйте и измените переменную админки на свою.
if(sscanf(params,"s[20]",params[0])) return SendClientMessage(playerid, 0x00D900C8, "- Подсказка:{FFFFFF} /getban_playerip [ip]");
format(querybans, sizeof(querybans), "SELECT * FROM `Bans` WHERE `IP` = '%s'", params[0]);// Форматируем запрос в бд
mysql_function_query(1, querybans, true, "GetBanIP", "ds", playerid, params[0]); // отправляем запрос.
return true;
}
CMD:ban(playerid, params[])
{
//if(gPlayerLogged[playerid] == false) return true; //Переменная авторизации игрока поменяйте на свою
//if(PINFO[playerid][pAdminLVL] <= 0) return SendClientMessage(playerid, 0xFF0000AA, "Недостаточно прав!");// Данную строчку расскоментируйте и измените переменную админки на свою.
new string[144],id,days,unbandate2;
if(sscanf(params,"dds[99]",id,days)) return SendClientMessage(playerid, -1, "Используй: /ban [id] [Дни] [причина]"); //
//if(PINFO[params[0]][pAdminLVL] > PINFO[playerid][pAdminLVL]) return SendClientMessage(playerid,-1,"Нельзя забанить администратора");// Данную строчку расскоментируйте и измените переменную админки на свою.
if(!IsPlayerConnected(id)) return SendClientMessage(playerid, 0xFF0000AA, "Ошибка! Введёный id не верен или не в сети!"); // Проверка на онлайн игрока
if(days > 30 || days < 1) return SendClientMessage(playerid, 0xFF0000AA, "Ошибка! Дней от 1-30"); // Проверка на введенные дни
unbandate2 = gettime() + days*86400; // Бан на дни. Записываем нынешнюю дату + число умноженное на 86400 = дни бана.
format(querybans, sizeof(querybans), "INSERT INTO `Bans` (`Nick`, `UnbanDate`) VALUES ('%s', '%d')",GetName(id),unbandate2); // Форматируем запрос в бд
mysql_function_query(1, querybans, false, "",""); Отправляем запрос в бд
format(string, sizeof(string), "%s забанил [ID:%d]%s на %d дней(я)",GetName(playerid),id, GetName(id),days);// Форматируем
SendClientMessageToAll(-1, string);// отправляем всем форматированное сообщение.
NewKick(id); // кикаем игрока
return true;
}
CMD:unban(playerid, params[])
{
//if(gPlayerLogged[playerid] == false) return true; //Переменная авторизации игрока поменяйте на свою и расскоментируйте
//if(PINFO[playerid][pAdminLVL] < 5) return SendClientMessage(playerid, -1, YouCanNot); // Данную строчку расскоментируйте и измените переменную админки на свою.
if(sscanf(params,"s[24]",params[0])) return SendClientMessage(playerid, -1, "Используйте: /unban [Ник]");
format(querybans,sizeof(querybans),"SELECT * FROM Bans WHERE Nick = '%s'", params[0]);// Форматируем запрос в бд
mysql_function_query(1, querybans, true, "Unban", "ds",playerid, params[0]); // отправляем запрос в бд
return true;
}
Скачать саму таблицу Bans для Базы данных:
Тык (https://www.dropbox.com/s/snq9wg57cpicel7/Bans.sql)
Автор мануала: underwoker aka Be3yXa
Ув. Модераторы и пользователи, если увидите макрос который не указан в теме, напишите пожалуйста. А так же приветствуется адекватная критика.
Начнемс. Учтите, что нам понадобится инклуд и плагин mysql (https://github.com/pBlueG/SA-MP-MySQL/releases/download/R39-2/mysql-r39-2-win.zip),sscanf (http://dl.dropbox.com/u/21683085/sscanf.rar),mxdate (http://rghost.ru/35622578) и DC_CMD (http://pro-pawn.ru/showthread.php?1028-DC_CMD-v2-8-%2823-03-14%29).
Добавим пару макросов, переменных и массивов в начало мода, дабы было удобнее далее их использовать. Если у вас есть уже они, то не добавляйте, а измените на свои.
#define NewKick(%0) SetTimerEx("DelayedKick", 1000, false, "d", (%0))
#define fpub:%0(%1) forward %0(%1); public %0(%1)
#define GetName(%1) pPlayerName[%1]
new querybans[200];
new pPlayerName[MAX_PLAYERS][MAX_PLAYER_NAME];
В конец мода добавим этот паблик и форвард:
forward DelayedKick(playerid);
public DelayedKick(playerid) return Kick(playerid); // Этот паблик относится к таймеру, который был объявлен макросом в начале мануала. Тут мы кикаем игрока через 1000 милисекунд.
Добавим в OnPlayerConnect, после проверки на то, есть ли аккаунт игрока на сервере, запросы в бд, на нахождение ника в списке банов и IP адреса.
GetPlayerName(playerid, pPlayerName[playerid], MAX_PLAYER_NAME);
format(querybans, sizeof(querybans), "SELECT * FROM `Bans` WHERE `Nick` = '%s'", GetName(playerid)); // Форматируем запрос в бд
mysql_function_query(1, querybans, true, "CheckBan", "d", playerid); // Отправляем запрос.
new ipStr[16];
GetPlayerIp( playerid, ipStr, 16 );
format(querybans, sizeof(querybans), "SELECT * FROM `Bans` WHERE `IP` = '%s'", ipStr); // Форматируем запрос в бд
mysql_function_query(1, querybans, true, "CheckBanIP", "d", playerid); // Отправляем запрос.
Добавим паблики в конец мода, так же, в которых будем брать данные из БД после запроса который сделали в OnPlayerConnect
fpub:CheckBanIP(playerid)
{
new unbandate;
new rows,fields;
cache_get_data(rows, fields);
if(rows)
{
unbandate = cache_get_field_content_int(0, "UnbanDate");
if(gettime() >= unbandate)// Если сейчас дата больше чем та что была записана при бане, разбаниваем игрока
{
format(querybans, sizeof(querybans), "DELETE FROM `Bans` WHERE `Nick` = '%s'",GetName(playerid)); // Форматируем.
mysql_function_query(1, querybans, false, "",""); // Отправляем запрос.
return true;
}
else// Иначе выводим диалог что посиди еще в бане, время не вышло.
{
new str[100];
format(str, sizeof(str),"Ваш аккаунт заблокирован\nДата разблокировки: %s",date("%dd/%mm/%yyyy в %hh:%ii:%ss",unbandate));
ShowPlayerDialog(playerid,91,0,"Аккаунт заблокирован:",str,"Ok","");
NewKick(playerid);
}
}
return true;
}
fpub:CheckBan(playerid)
{
new rows,fields;
new unbandate;
cache_get_data(rows, fields);
if(rows)
{
unbandate = cache_get_field_content_int(0, "UnbanDate"); //
if(gettime() >= unbandate) // Если сейчас дата больше чем та что была записана при бане, разбаниваем игрока
{
format(querybans, sizeof(querybans), "DELETE FROM `Bans` WHERE `Nick` = '%s'",GetName(playerid)); // форматируем.
mysql_function_query(1, querybans, false, "","");// Отправляем запрос.
return true;
}
else // Иначе выводим диалог что посиди еще в бане, время не вышло.
{
new str[100];
format(str, sizeof(str),"Ваш аккаунт заблокирован\nДата разблокировки: %s",date("%dd/%mm/%yyyy в %hh:%ii:%ss",unbandate));
ShowPlayerDialog(playerid,91,0,"Аккаунт заблокирован:",str,"Ok","");
NewKick(playerid);
}
}
return true;
}
fpub:GetBan(playerid)
{
new rows,fields;
new str[100],unbandate;
cache_get_data(rows, fields);
if(rows) //Если в бд строки найдены
{
unbandate = cache_get_field_content_int(0, "UnbanDate");
format(str, sizeof(str),"Аккаунт заблокирован. Дата разблокировки: %s",date("%dd/%mm/%yyyy Время: %hh:%ii:%ss",unbandate));
SendClientMessage(playerid, -1, str);
return true;
}
else return SendClientMessage(playerid, -1, "Аккаунт не в бане");// иначе пишем игроку что не заблокирован.
}
fpub:GetBanIP(playerid, ip[])
{
new rows,fields;
new str[100],unbandate;
cache_get_data(rows, fields);
if(rows) //Если в бд строки найдены
{
unbandate = cache_get_field_content_int(0, "UnbanDate");
format(str, sizeof(str),"IP заблокирован. Дата разблокировки: %s",date("%dd/%mm/%yyyy Время: %hh:%ii:%ss",unbandate));
SendClientMessage(playerid, -1, str);
return true;
}
else return SendClientMessage(playerid, -1, "IP не заблокирован."); // иначе пишем игроку что не заблокирован.
}
fpub:Unban(i,nick[])
{
new rows,fields;
cache_get_data(rows, fields);
if(!rows) // Если в бд строки не найдены
{
SendClientMessage(i,-1,"Нету игрока с таким ником в бане!");
}
else // Иначе(если найдены)
{
new string[31+24];
format(querybans, sizeof(querybans), "DELETE FROM `Bans` WHERE `Nick` = '%s'",nick);// Форматируем запрос в бд
mysql_function_query(1, querybans, false, "",""); // отправляем запрос.
format(string, sizeof(string), "Вы успешно разбанили игрока %s!",nick); //форматируем
SendClientMessage(i,-1,string);// отправляем
}
return true;
}
Добавим команды бана, разбана, проверки на бан(Показываю на примере DC_CMD):
CMD:getban_player(playerid, params[])
{
//if(PINFO[playerid][pAdminLVL] < 1) return true; // Данную строчку расскоментируйте и измените переменную админки на свою.
if(sscanf(params,"s[25]",params[0])) return SendClientMessage(playerid, 0x00D900C8, "- Подсказка:{FFFFFF} /getban_player [Ник]");
format(querybans, sizeof(querybans), "SELECT * FROM `Bans` WHERE `Nick` = '%s'", params[0]);// Форматируем запрос в бд
mysql_function_query(1, querybans, true, "GetBan", "d", playerid); // отправляем запрос.
return true;
}
CMD:getban_playerip(playerid, params[])
{
//if(PINFO[playerid][pAdminLVL] < 1) return true; // Данную строчку расскоментируйте и измените переменную админки на свою.
if(sscanf(params,"s[20]",params[0])) return SendClientMessage(playerid, 0x00D900C8, "- Подсказка:{FFFFFF} /getban_playerip [ip]");
format(querybans, sizeof(querybans), "SELECT * FROM `Bans` WHERE `IP` = '%s'", params[0]);// Форматируем запрос в бд
mysql_function_query(1, querybans, true, "GetBanIP", "ds", playerid, params[0]); // отправляем запрос.
return true;
}
CMD:ban(playerid, params[])
{
//if(gPlayerLogged[playerid] == false) return true; //Переменная авторизации игрока поменяйте на свою
//if(PINFO[playerid][pAdminLVL] <= 0) return SendClientMessage(playerid, 0xFF0000AA, "Недостаточно прав!");// Данную строчку расскоментируйте и измените переменную админки на свою.
new string[144],id,days,unbandate2;
if(sscanf(params,"dds[99]",id,days)) return SendClientMessage(playerid, -1, "Используй: /ban [id] [Дни] [причина]"); //
//if(PINFO[params[0]][pAdminLVL] > PINFO[playerid][pAdminLVL]) return SendClientMessage(playerid,-1,"Нельзя забанить администратора");// Данную строчку расскоментируйте и измените переменную админки на свою.
if(!IsPlayerConnected(id)) return SendClientMessage(playerid, 0xFF0000AA, "Ошибка! Введёный id не верен или не в сети!"); // Проверка на онлайн игрока
if(days > 30 || days < 1) return SendClientMessage(playerid, 0xFF0000AA, "Ошибка! Дней от 1-30"); // Проверка на введенные дни
unbandate2 = gettime() + days*86400; // Бан на дни. Записываем нынешнюю дату + число умноженное на 86400 = дни бана.
format(querybans, sizeof(querybans), "INSERT INTO `Bans` (`Nick`, `UnbanDate`) VALUES ('%s', '%d')",GetName(id),unbandate2); // Форматируем запрос в бд
mysql_function_query(1, querybans, false, "",""); Отправляем запрос в бд
format(string, sizeof(string), "%s забанил [ID:%d]%s на %d дней(я)",GetName(playerid),id, GetName(id),days);// Форматируем
SendClientMessageToAll(-1, string);// отправляем всем форматированное сообщение.
NewKick(id); // кикаем игрока
return true;
}
CMD:unban(playerid, params[])
{
//if(gPlayerLogged[playerid] == false) return true; //Переменная авторизации игрока поменяйте на свою и расскоментируйте
//if(PINFO[playerid][pAdminLVL] < 5) return SendClientMessage(playerid, -1, YouCanNot); // Данную строчку расскоментируйте и измените переменную админки на свою.
if(sscanf(params,"s[24]",params[0])) return SendClientMessage(playerid, -1, "Используйте: /unban [Ник]");
format(querybans,sizeof(querybans),"SELECT * FROM Bans WHERE Nick = '%s'", params[0]);// Форматируем запрос в бд
mysql_function_query(1, querybans, true, "Unban", "ds",playerid, params[0]); // отправляем запрос в бд
return true;
}
Скачать саму таблицу Bans для Базы данных:
Тык (https://www.dropbox.com/s/snq9wg57cpicel7/Bans.sql)
Автор мануала: underwoker aka Be3yXa