MartinJoys

Система Vip аккаунта по времени на MySql

В теме 1 сообщение

Всем привет на связи MartinJoys | Cherlock
Cегодня мы научимся делать вип аккаунты по времени, с автоматическим удалением по истечению времени.
Перейдем в самый вверх вашего мода и впишем туда этот код:

Спойлер

#include <a_samp>// стандартный инклуд
#include <YSI\y_commands> //для работы с командами
#include <mxdate>
#include <a_mysql> //для работы с бд
#include <sscanf> //
#define MYSQL_HOST     "localhost" // IP адресс БД.
#define MYSQL_USER     "root" // Login БД.
#define MYSQL_DB       "Samp" // Название БД.
#define MYSQL_PASS     "root" // Пароль БД.

 

 

Теперь необходимо установить подключение к базе при включении мода, перейдем в OnGameModeInit и впишем туда этот код:

 

mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DB, MYSQL_PASS); //устанавливаем подключение
switch(mysql_ping())
{
    case 1: print("Соединение установлено"); // Если подключена БД.
    case -1: print("Нет соединения с БД"); // Если не подключена БД.
}  

 

Теперь если все будет нормально то в консоли появится инфа о том что соединение установлено.
Сейчас сделаем отключение от базы при выключении/перезагрузке мода, перейдем в OnGameModeExit и впишем:

mysql_close();

Теперь нужно сделать проверку, переходим в OnPlayerConnect и вписываем:

 

Спойлер

new query[100],name[24],string[240]sqlname[24],days;//
    GetPlayerName(playerid,name,sizeof(name));//узнаем имя
    mysql_real_escape_string(name,sqlname);
    format(query,sizeof(query),"SELECT * FROM `Donate` WHERE `Name` = '%s'",sqlname);
    mysql_query(query);//отправляем запрос
    mysql_store_result();//получаем ответ
    if(mysql_fetch_row(query) && mysql_num_rows() == 1)//если есть поле с именем игрока
    {
        mysql_get_field("Days", string);
        days=strval(string);//получаем время на которое выдан аккаунт
        if(gettime() >= days) //если срок закончился
        {
            SendClientMessage(playerid,0xFFFFFFFF,"Действие вашего аккаунта закончилось");
            format(string,sizeof(string),"DELETE FROM `Donate` WHERE `Name`='%s'",name);
            mysql_query(string);//удаляем его из бд
            //PlayerInfo[playerid][pDonate]=0; сюда впишите вашу випку
        }
        else//если действие аккаунта еще не закончилось
        {
            //PlayerInfo[playerid][pDonate]=1; ваша випка
            format(string,sizeof(string),"Действие вашего аккаунта закончится  %s ",date("%dd.%mm.%yyyy в %hh:%ii:%ss",days));
            SendClientMessage(playerid,0xFFFFFFFF,string);//выведем информацию о том когда закончится действие аккаунта
        }
    }
    mysql_free_result();//очищаем  

 

 

Теперь построим команду для выдачи випки. Внимание команда построена на YCM

 

Спойлер

YCMD:donate(playerid, params[ ] ,help)//donate это название команды
{
     if(!IsPlayerAdmin(playerid)return SendClientMessage(playerid,-1,"Вы не администратор.");//проверка на администратора
    new string[144];
    if(!strlen(params[0])|| !strlen(params[1])) return SendClientMessage(playerid,0xFFFFFFFF,"{0099FF}Используйте:     {FFFFFF}/donate {99D938}[playerid] [Day] ");//если параметры не указанны
    DonatePlayer(params[0],params[1]);//если указанны то дадим випку и занесем в бд
    format(string,sizeof(string),"Вам выдан Вип аккаунт на %d дней",params[1]);
    SendClientMessage(params[0],0xFFFFFFFF,string);//покажем сообщение игроку которому выдали
    //ваша випка PlayerInfo[params[0]][pDonate]=1;
    return true;
}

 

 Теперь сделаем функцию выдачи випки, перейдем в низ вашего мода и напишем следующий код:
Спойлер

stock DonatePlayer(playerid,days)
{
    new query[256],name[24];
    GetPlayerName(playerid,name,sizeof(name));//узнаем имя
    format(query, sizeof(query), "INSERT INTO `Donate` (`Name`, `Days`) VALUE ('%s','%d')",name,gettime()+86400*days);//gettime()вернет время в секундах, 86400 секунд в одних сутках, days количество дней на которое будет установлен вип аккаунт
    mysql_query(query);//отправим запрос
    return true;
}  

 

 

Теперь нужно создать таблицу в нашей бд:
Создаем таблицу с именем Donate, делаем 2 столбца Name и Days.
В первом укажем значение string(24), а во втором int(11).

 

Необходимые для работы инклуды а так же плагины можете скачать по этой ссылкам:
http://rghost.ru/40382201
http://rghost.ru/40382221
http://rghost.ru/40382234
http://rghost.ru/40382569


Автор: Я MartinJoys | Cherlock

 

Отредактировано пользователем Cawfee

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • MCrown
      От MCrown
      Приветствую вас дорогие друзья!
      Хочу собрать команду энтузиастов (бесплатная основа до открытия) для создания и успешного запуска амбициозного проекта в индустрии SA:MP.
       
      Важны любые умения! Вы креативный и амбициозный человек желающий реализовать свои идеи и доказать всем что всё что кажется невозможно - вполне реально!
      Сам же я являюсь скриптером с многолетним опытом как в разработке так и работы в команде. Я же буду заниматься финансированием всех необходимых ресурсов самого проекта (оплата необходимых ресурсов для разработки). 
      Совсем не важно в чём вы хороши, важно что вы имеете стимул и желание работать в проекте и развивать свои навыки!
      В общем, все остальные подробности можно будет обсудить уже в ходе личного общения. Если ты это читаешь то знай, я жду именно тебя!
    • DEST
      От DEST
      ДИНАМИЧЕСКИЕ ЗОНЫ (streamer плагин)
       
      ОБЩЕЕ ОПИСАНИЕ: 
      Как я заметил, многие интересуются, как создать действие для игрока в какой-либо определенной точке карты. Например, как выдать игроку бутылку пива автоматически при заходе в клуб? Конечно, можно это сделать, создав секундный таймер и выполнять действия там, но как по мне, динамические зоны справятся  с этим лучше. 
      ТРЕБОВАНИЯ: 
      Для работы необходимо: 
      1) Плагин streamer. 
      2) Инклуд streamer. 
      Желательно иметь актуальную версию плагина и инклуда, хотя это не обязательно. 
      ТЕХНИЧЕСКОЕ ОПИСАНИЕ РАБОТЫ: 
      Принцип работы данных зон прост: когда игрок заходит в зону, которая создается кстати, в виде геометрических фигур (об этом позже) для него срабатывает коллбэк - OnPlayerEnterDynamicArea. После того, как игрок покидает динамическую зону для него срабатывает другой коллбэк - OnPlayerLeaveDynamicArea. В оба эти коллбэка поступают одинаковые аргументы - playerid, areaid. Где playerid - ид игрока, который вошел / покинул зону, а areaid - ид самой зоны. 
      ТИПЫ СОЗДАВАЕМЫХ ЗОН: 
      1) Круг. Для создания данной зоны потребуются X и Y координата центра круга, а также радиус создаваемой зоны. 
      2) Прямоугольник. Для создания данной зоны, необходимо иметь координаты противоположных углов, образующих прямоугольник. 
      3) Сфера. Для данной зоны требуются X, Y, Z координаты центра сферы и ее размер (радиус). 
      4) Куб. Точно также как и прямоугольник, только потребуются еще и Z координаты противоположных углов. Рисунок не требуется. 
      Пример использования:
      new zone_army; public OnGameModeInit(playerid) { zone_army = zone51 = CreateDynamicCube(-13.0555,1702.1824, 15.0,405.9110, 2071.6646, 850.0); return 1; } public OnPlayerEnterDynamicArea(playerid, areaid) { if(areaid == zone_army) SendClientMessage(playerid,-1,"Покиньте охряняемую зону. Иначе будет открыт огонь."); return 1; } public OnPlayerLeaveDynamicArea(playerid, areaid) { if(areaid == zone_army) SendClientMessage(playerid,-1,"Благодарим за понимание."); return 1; } Пример взят с сайта forum-pawno.ru. 
      СВЯЗАННЫЕ ФУНКЦИИ: 
      DestroyDynamicArea(areaid); - уничтожение динамической зоны.  IsValidDynamicArea(areaid); - проверка за существование динамической зоны с данным ID.  TogglePlayerDynamicArea(playerid, areaid, toggle); - скрытие динамической зоны для игрока.  TogglePlayerAllDynamicAreas(playerid, toggle); - скрытие всех динамических зон для игрока.  IsPlayerInDynamicArea(playerid, areaid); - проверка на нахождение игрока в динамической зоне с определенным ID.  AttachDynamicAreaToPlayer(areaid, playerid); - прикрепление динамической зоны с определенным ID к игроку.  AttachDynamicAreaToVehicle(areaid, vehicleid); - прикрепление динамической зоны с определенным ID к машине.  DestroyAllDynamicAreas(); - уничтожение всех динамических зон.  CountDynamicAreas(); - подсчет количества динамических зон.  Внимание! К игрокам и машинам можно прикрепить только зоны с типом круг и сфера. 
      На этом все! 
      Благодарности: 
      Благодарность выражается следующим веб-ресурсам: 
      forum-pawno.ru
      forum.sa-mp.com
      Автор: @DEST.
       
    • Гость stibs
      От Гость stibs
      Всем привет! 
      Сегодня я вам поведаю  про такую прекрасную штуку как тернарный оператор. В принципе, тернарный оператор это такая же конструкция как и конструкция if/else. 
       
      Конструкция  оператора.
      условие ? правда : ложь
       
      Пример использования.
      Например, на конструкции if/else одно выражение может выглядеть вот так: 
      if (z > y) {     x = 5; } else {     x = 3; } А вот так это будет выглядеть с использованием тернарного оператора:
      x = (z > y) ? (5) : (3);  
    • Aurum
      От Aurum
      Здравствуйте.
      Решил рассказать про виды диалоговых окон.
       
      Начнем.
      Диалоги бывают 4-ех видов, это..
      DIALOG_STYLE_MSGBOX DIALOG_STYLE_INPUT DIALOG_STYLE_LIST DIALOG_STYLE_PASSWORD  
       
      Разберемся, что к чему.
       
       
      Первый вид диалога - DIALOG_STYLE_MSGBOX.
      Его действие - Показывает сообщение игроку. Пример: Правила сервера.
      Код диалога: 
      ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Тут название", "Тут текст", "Кнопка1", "Кнопка2");  
      Второй вид диалога - DIALOG_STYLE_INPUT
      Его действие - Показывает сообщение игроку + есть поле для ввода информации. Пример: Ввод email при регистрации на РП сервере.
      Код диалога: 
      ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Тут название","Тут ваш текст","Кнопка1","Кнопка2");  
      Третий вид диалога - DIALOG_STYLE_LIST
      Его действие - Показывает игроку список. ( Диалог со списком ). Пример такого диалога - Команда /mn и тому подобное.
      Код диалога: 
      ShowPlayerDialog(playerid, 2, DIALOG_STYLE_LIST, "Тут название", "Пункт 1\nПункт 2", "Кнопка1", "Кнопка2");  
      Четвертый и последний вид диалога - DIALOG_STYLE_PASSWORD
      Его действие - Диалог с инфрмацией и полем для ввода, где введенные символы будут заменены на звездочки ( Поле для ввода пароля ).
      Код диалога: 
      ShowPlayerDialog(playerid, 3, DIALOG_STYLE_PASSWORD, "Тут название", "Тут текст(можете написать 'Введите пароль')", "Кнопка1", "Кнопка2");  
      На этом все 
    • turpal098
      От turpal098
      Здравствуйте.
      У меня вопрос как сделать так чтобы объявление было не так часто  у меня на сервере объявление каждый 30 секунд как изменить это? заранее спасибо.