Sign in to follow this  
Followers 0
MartinJoys

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

1 post in this topic

Всем привет на связи 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

 

Edited by Cawfee

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • DEST
      By 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.
       
    • Guest stibs
      By Guest stibs
      Всем привет! 
      Сегодня я вам поведаю  про такую прекрасную штуку как тернарный оператор. В принципе, тернарный оператор это такая же конструкция как и конструкция if/else. 
       
      Конструкция  оператора.
      условие ? правда : ложь
       
      Пример использования.
      Например, на конструкции if/else одно выражение может выглядеть вот так: 
      if (z > y) {     x = 5; } else {     x = 3; } А вот так это будет выглядеть с использованием тернарного оператора:
      x = (z > y) ? (5) : (3);  
    • Aurum
      By 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
      By turpal098
      Здравствуйте.
      У меня вопрос как сделать так чтобы объявление было не так часто  у меня на сервере объявление каждый 30 секунд как изменить это? заранее спасибо.
    • Sleash
      By Sleash
      Всем привет!
      Я хотел бы рассказать о такой незаменимой вещи как цикл for. мне кажется что тут ему уделили сало места, просто закинули в тему операторов и уделили ему +-5 строчек.
      Поскольку циклы - непростая вещь я хотел бы посветить этому небольшой урок.
      Итак, давайте рассмотрим пример самого цикла:
      for(new i; i < MAX_VALUES; i++) {     // code ... } Теперь разберём каждое действие:
      1. new i;
          Тут думаю всё понятно, создаётся переменная, так же можно её сразу прировнять к чему-то: for(new i = 10; ...)
      2. i < MAX_VALUES
          Тут уже стоит условие выполнения, и пока оно будет верно - цикл будет выполняться, по сути каждый раз цикл проверяет данное условие
          Так же можно поставить другие операторы, но в основном используются < ИЛИ >
      3. i++
          Тут уже выполняется действие каждый раз, когда условие верное.
      Кстати говоря как только условие перестанет выполняться окончательно (условие перестанет быть верным), то дальше пойдёт ниже написанный код.
      ВАЖНО: return закроет цикл досрочно
      То есть:
      for(new i = 0; i < 8; i++) {     print("%d",i)); } // В этом случае нам выведет числа от 0-я до 8-и for(new i = 0; i < 8; i++) {     print("%d",i));     return true; } // А в этом выведет только 0, по-скольку return завершает цикл после первого его прохождения Так же в цикле for можно заимствовать различные из языка C++:
      continue - пропуск данного значения.
      break - полный выход из цикло (почти идентично return)
      Сейчас объясню:
      for(new i = 0; i < 8; i++) {     if(i == 5) continue; // если i равна 5-и, то пропускаем     printf("%d",i); } // Данный цикл выведет все числа от 0 до 8 КРОМЕ 5 for(new i = 0; i < 8; i++); {     if(i == 5) break; // если i равна 5-и, то завершеем     printf("%d",i); } // А данный цикл выведет все числа от 0 до 4-х, так как на 5-и мы вышли из цикла А теперь главное отличие break от return:
      break - просто выкидывает из цикла.
      return - выкидывает из цикла и возвращает значение.
      К примеру вы пишите stock или public с циклом, который должен вернуть ДА или НЕТ, тот тут уже лучше использовать return true или false, в зависимости от условий и т.д.
      И напоследок хочу сказать, что есть 2 вида использования цикла: инкремент и декремент.
      Инкремент это перебор значений, последовательно их увеличивая, по сути все разобранные нами примеры сделаны при помощи инкремента.
      Декремент же перебирает значения, последовательно их уменьшая, то есть при перечислении игроков проверка будет идти, допустим,  от 1000-го до 0-го ID. пример декремента:
      for(new i = MAX_PLAYERS; i >= 0; --i) {     // code ... } На этом мне хотелось бы закончить свой урок, если кому помог - пожалуйста, но если же кому не понятно - я помогу подробнее разобраться.