Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Система Patch Notes (Список обновлений сервера) MySQL

Bren

Изучающий
Пользователь
Регистрация
17 Янв 2014
Сообщения
255
Лучшие ответы
0
Репутация
39
Довольно полезная система для информирования игроков о выходе нового обновления на сервере.
Это удобно когда есть возможность в самой игре ознакомиться со всеми изменениями.


Возможности
  • Статистика просмотра.
  • Оценка обновления (Отлично, Хорошо, Плохо).
  • Уведомление о выходе нового обновления.
  • Возможность скрывать обновление из общего списка.

Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!

Нужны плагины
PHP:
MySQL R41-4
sscanf2

Сам код
Ко всем new
PHP:
new UpdateList[MAX_PLAYERS][4], UpdateListValues[MAX_PLAYERS][20], ServerLastUpdate;

В OnGameModeInit
Делаем запрос к базе, и узнаем ID последнего обновления.
Это нужно для уведомление игрока о выходе нового обновления.
PHP:
mysql_tquery(/*тут используйте свою переменную mysql connect, у меня это: */MysqlConnectID, "SELECT id FROM `update` WHERE closed=0 ORDER BY id DESC LIMIT 1", "OnUpdateServer", "dd", 0, 7);//Узнаем ID последнего обновления

В OnDialogResponse
PHP:
case 3102:
{
    if(!response) return 1;
    switch(listitem)
    {
        case 20:
        {
            if(UpdateList[playerid][1] >= 1 && UpdateList[playerid][1] == listitem+1 && UpdateList[playerid][0] >= 1)
            {
                UpdateList[playerid][0] --;
                UpdateList[playerid][1] = 0;
            }
            else UpdateList[playerid][0] ++;
            return OnUpdateServer(playerid, 1, 0, 0);
        }
        case 21:
        {
            if(UpdateList[playerid][0] <= 0) return 1;
            UpdateList[playerid][0] --;
            return OnUpdateServer(playerid, 1, 0, 0);
        }
        default:
        {
            if(UpdateList[playerid][1] >= 1 && UpdateList[playerid][1] == listitem+1 && UpdateList[playerid][0] >= 1)
            {
                UpdateList[playerid][0] --;
                UpdateList[playerid][1] = 0;
                return OnUpdateServer(playerid, 1, 0, 0);
            }
            UpdateList[playerid][2] = UpdateListValues[playerid][listitem];
            new string[42+10];
            format(string, sizeof(string), "SELECT * FROM `update` WHERE id=%d LIMIT 1", UpdateListValues[playerid][listitem]);
            return mysql_tquery(MysqlConnectID, string, "OnUpdateServer", "dd", playerid, 3);
        }
    }
    return 1;
}
case 3103:
{
    if(!response)
    {
        if(GetPVarInt(playerid, "ClosDiaUp") == 1) return DeletePVar(playerid, "ClosDiaUp");
        return OnUpdateServer(playerid, 1, 0, 0);
    }
        //Тут можно сделать проверку по левлу например, чтоб новички не шалили :)
    return ShowPlayerDialog(playerid, 3104, DIALOG_STYLE_LIST, "Оцените обновление", "- Отлично\n- Хорошо\n- Плохо", "Выбрать", "Назад");
}
case 3104:
{
    new string[80+24+10], name[24];
    if(!response)
    {
        format(string, sizeof(string), "SELECT * FROM `update` WHERE id=%d LIMIT 1", UpdateList[playerid][2]);
        return mysql_tquery(MysqlConnectID, string, "OnUpdateServer", "dd", playerid, 3);
    }

    GetPlayerName(playerid, name, MAX_PLAYER_NAME);
    format(string, sizeof(string), "SELECT id,numberUp,stats FROM updatevote WHERE name='%s' AND numberUp=%d LIMIT 1", name, UpdateList[playerid][2]);
    return mysql_tquery(MysqlConnectID, string, "OnUpdateServer", "ddd", playerid, 6, listitem);
}
case 3105:
{
    new string[50+10];
    UpdateList[playerid][3] = ServerLastUpdate;
    /* Пример сохранение в аккаунте
    ОБНОВЛЯЕМ UpdateServer

    format(string, sizeof(string), "UPDATE accounts SET UpdateServer=%d WHERE id=%d", ServerLastUpdate, PlayerInfo[playerid][RoomAccount]);
    mysql_tquery(MysqlConnectID, string);*/

    if(!response)
    {
        format(string, sizeof(string), "SELECT id,stats FROM `update` WHERE id=%d LIMIT 1", ServerLastUpdate);//Если диалог был закрыт то прибавляет значение к 'Скипу'
        return mysql_tquery(MysqlConnectID, string, "OnUpdateServer", "ddd", playerid, 5, 4);
    }
    SetPVarInt(playerid, "ClosDiaUp", 1);
    UpdateList[playerid][2] = ServerLastUpdate;
    format(string, sizeof(string), "SELECT * FROM `update` WHERE id=%d LIMIT 1", ServerLastUpdate);
    return mysql_tquery(MysqlConnectID, string, "OnUpdateServer", "dd", playerid, 3);
}

В самый конец мода добавляем public
PHP:
forward OnUpdateServer(playerid, line, line2, line3);
public OnUpdateServer(playerid, line, line2, line3)
{
    new rows, slot[6];
    switch(line)
    {
        case 1://показ списка
        {
            new string[82+20];
            if(line2 == 1)//первый показ с обнулением
            {
                UpdateList[playerid][0] = 0;
                UpdateList[playerid][1] = 0;
            }
            format(string, sizeof(string), "SELECT id,version,date FROM `update` WHERE closed=0 ORDER BY `id` DESC LIMIT %d,%d", 20*UpdateList[playerid][0], 20*UpdateList[playerid][0]+21);
            return mysql_tquery(MysqlConnectID, string, "OnUpdateServer", "dd", playerid, 2);
        }
        case 2:
        {
            cache_get_row_count(rows);
            if(!rows) return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Обновления сервера", "{FFFFFF}Обновления сервера нет!", "Закрыть", "");
            new string[50*20 +39], date[28], version[10];
            for(new x; x < rows; x ++)
            {
                slot[0] ++;
                if(slot[0] <= 20)
                {
                    if(x >= rows)
                    {
                        if(UpdateList[playerid][0] >= 1)
                        {
                            slot[1] = 1;
                            strcat(string, "< Назад\n");
                            UpdateList[playerid][1] = slot[0]+1;
                        }
                        break;
                    }
                    cache_get_value_name_int(x, "id", slot[2]);
                    cache_get_value_name(x, "version", version);
                    cache_get_value_name(x, "date", date);

                    format(string, sizeof(string), "%s- %s\t%s\n", string, version, date);
                    UpdateListValues[playerid][slot[0]-1] = slot[2];
                }
                else
                {
                    slot[1] = 1;
                    if(UpdateList[playerid][0] >= 1) strcat(string, "> Дальше\n< Назад");
                    else strcat(string, "> Дальше\n");
                    break;
                }
            }
            if(slot[0] == 0) return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Обновления сервера", "{FFFFFF}Обновления сервера нет!", "Закрыть", "");
            if(UpdateList[playerid][0] >= 1 && slot[1] == 0)
            {
                strcat(string, "< Назад\n");
                UpdateList[playerid][1] = slot[0]+1;
            }
            return ShowPlayerDialog(playerid, 3102, DIALOG_STYLE_TABLIST, "Обновления сервера", string, "Выбрать", "Назад");
        }
        case 3:
        {
            cache_get_row_count(rows);
            if(!rows) return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Обновления сервера", "{FFFFFF}Обновления сервера нет!", "Закрыть", "");
            new version[10], date[28], string[1100+ 70+28+ 120], stats[120];
            cache_get_value_name_int(0, "id", slot[5]);
            cache_get_value_name(0, "stats", string);
            sscanf(string, "p<,>ddddd", slot[0], slot[1], slot[2], slot[3], slot[4]);//Просмотров | Скипов | Отлично | Хорошо | Плохо
            cache_get_value_name(0, "version", version);
            cache_get_value_name(0, "date", date);
            cache_get_value_name(0, "text", string);

            format(stats, sizeof(stats), "\n\nПросмотров: %d | Скипов: %d | Отлично: %d | Хорошо: %d | Плохо: %d", slot[0], slot[1], slot[2], slot[3], slot[4]);//Это для админив. Тут нужна проверка
            for(new x; x < strlen(string); x ++)
            {
                if(string[x] != 94 && string[x] != 46) continue;//поиск символов ^ .
                if(string[x] == 94) string[x] = 31;//замена символа ^
                strins(string, "\n", x+1);
            }
            format(string, sizeof(string), "{FFFFFF}Обновление: {00FF00}%s{FFFFFF}\nОт: {00FF00}%s\n\n{FFFFFF}%s%s", version, date, string, stats);
            ShowPlayerDialog(playerid, 3103, DIALOG_STYLE_MSGBOX, "Обновление сервера", string, "Оценить", "Назад");

            GetPlayerName(playerid, date, MAX_PLAYER_NAME);
            format(string, sizeof(string), "SELECT name FROM updatevote WHERE name='%s' AND numberUp=%d LIMIT 1", date, slot[5]);//проверка было просмотрено или нет
            return mysql_tquery(MysqlConnectID, string, "OnUpdateServer", "ddd", playerid, 4, slot[5]);
        }
        case 4:
        {
            cache_get_row_count(rows);
            if(rows) return 1;
            new string[61+ 24+10], name[24];
            GetPlayerName(playerid, name, MAX_PLAYER_NAME);
            format(string, sizeof(string), "INSERT INTO updatevote (`name`,`numberUp`) VALUES ('%s','%d')", name, line2);
            mysql_tquery(MysqlConnectID, string);

            format(string, sizeof(string), "SELECT id,stats FROM `update` WHERE id=%d LIMIT 1", line2);
            return mysql_tquery(MysqlConnectID, string, "OnUpdateServer", "ddd", playerid, 5, 3);
        }
        case 5:
        {
            cache_get_row_count(rows);
            if(!rows) return 1;
            new string[56+ 6*10];
            cache_get_value_name_int(0, "id", slot[5]);
            cache_get_value_name(0, "stats", string);
            sscanf(string, "p<,>ddddd", slot[0], slot[1], slot[2], slot[3], slot[4]);//Просмотров | Скипов | Отлично | Хорошо | Плохо
            switch(line2)
            {
                case 0..2:
                {
                    slot[line2+2] ++;
                    if(line3 >= 0 && slot[line3+2] >= 1) slot[line3+2] --;//если ранее уже было оценено то отнимаем голос
                }
                case 3: slot[0] ++;
                case 4: slot[1] ++;
            }
            format(string, sizeof(string), "UPDATE `update` SET `stats`='%d,%d,%d,%d,%d' WHERE id=%d", slot[0], slot[1], slot[2], slot[3], slot[4], slot[5]);
            return mysql_tquery(MysqlConnectID, string);
        }
        case 6:
        {
            cache_get_row_count(rows);
            if(!rows) return SendClientMessage(playerid, -1, "Обновление не найдено.");
            new string[49+10];
            cache_get_value_name_int(0, "id", slot[0]);
            cache_get_value_name_int(0, "numberUp", slot[1]);
            cache_get_value_name_int(0, "stats", slot[2]);
            if(slot[2] == line2)
            {
                SendClientMessage(playerid, -1, "Вы уже оценивали обновление.");
                return ShowPlayerDialog(playerid, 3104, DIALOG_STYLE_LIST, "Оцените обновление", "- Отлично\n- Хорошо\n- Плохо", "Выбрать", "Назад");
            }
            SendClientMessage(playerid, -1, "Спасибо за ваш отзыв.");
            if(GetPVarInt(playerid, "ClosDiaUp") == 1) DeletePVar(playerid, "ClosDiaUp");

            format(string, sizeof(string), "UPDATE updatevote SET stats=%d WHERE id=%d", line2, slot[0]);
            mysql_tquery(MysqlConnectID, string);

            format(string, sizeof(string), "SELECT id,stats FROM `update` WHERE id=%d LIMIT 1", slot[1]);
            return mysql_tquery(MysqlConnectID, string, "OnUpdateServer", "dddd", playerid, 5, line2, slot[2]);
        }
        case 7:
        {
            cache_get_row_count(rows);
            if(!rows) return print("Нет списка обновлений");
            return cache_get_value_name_int(0, "id", ServerLastUpdate);
        }
        case 8:
        {
            cache_get_row_count(rows);
            if(!rows) return SendClientMessage(playerid, -1, "Обновление не найдено.");
            new string[107+ 10+28], version[10], date[28];
            cache_get_value_name(0, "version", version);
            cache_get_value_name(0, "date", date);

            PlayerPlaySound(playerid, 1149, 0.0, 0.0, 0.0);
            format(string, sizeof(string), "{FFFFFF}Доступно новое обновление сервера {00FF00}%s от %s{FFFFFF}\n\nЖелаете посмотреть список изменений ?", version, date);
            return ShowPlayerDialog(playerid, 3105, DIALOG_STYLE_MSGBOX, "Обновление сервера", string, "Далее", "Закрыть");
        }
    }
    return 1;
}

Дальше вы должны создать новое поле в таблице со всеми вашими аккаунтами.
Это нужно для того, чтобы игрокам не приходило повторное уведомление о обновлении.

Название поля: UpdateServer
Тип поля: int
Длинна поля: 10
Значение по умолчанию: 0
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!


Дальше, не забудьте добавить get_value туда где у вас происходит прогрузка аккаунта.
Переменная UpdateList[playerid][3] отвечает за последний номер обновления.
PHP:
cache_get_value_name_int(0, "UpdateServer", UpdateList[playerid][3]);

Дальше, данная строчка отвечает за уведомление об обновлении.
Вы можете её вставить после прогрузки аккаунта например.
PHP:
if(UpdateList[playerid][3] != ServerLastUpdate) mysql_tquery(MysqlConnectID, "SELECT version,date FROM `update` WHERE closed=0 ORDER BY id DESC LIMIT 1", "OnUpdateServer", "dd", playerid, 8);

Для отображение списка обновлений, используйте вызов паблика со следующими значениями:
PHP:
OnUpdateServer(playerid, 1, 1, 0);

Таблица MySQL
Первая таблица со списком обновлений
PHP:
CREATE TABLE `update` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `closed` int(1) NOT NULL DEFAULT '0' COMMENT 'Не показывать в списке обновлений',
  `stats` varchar(55) NOT NULL DEFAULT '0,0,0,0,0' COMMENT 'Просмотров | Скипов | Отлично | Хорошо | Плохо ',
  `version` varchar(10) NOT NULL COMMENT 'Номер выпуска',
  `date` varchar(28) NOT NULL COMMENT 'Дата выпуска',
  `text` varchar(1100) NOT NULL COMMENT 'Текст',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Во второй таблице хранятся данные игроков, которые просмотрели обновление и оценили его
PHP:
CREATE TABLE `updatevote` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(24) NOT NULL,
  `numberUp` int(10) NOT NULL COMMENT 'ID номера обновление',
  `stats` int(1) NOT NULL DEFAULT '-1' COMMENT 'Без голоса -1 | Отлично 0 | Хорошо 1 | Плохо 2',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Как добавить новое обновление
Всё очень просто
  • Открываем свою базу данных.
  • Находим таблицу update.
  • И создаем в ней новую запись
Ниже показан скриншот, что за что отвечает.
Основные поля для заполнения отмечены красным цветом.

Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!


Важно!
Для переноса текста на другую строчку используйте точку в конце предложения или символ ^ для переноса текста.
Только таким способом можно перейти на строчку ниже.

Как работает статистика
Оценка
Игрок может оценить обновление один раз за один вариант.
Если игрок желает изменить свою оценку, он может её изменить за любой другой вариант.

Просмотры
Просмотры обновлений учитываются один раз.

Что такое 'скип'
Скип это когда игроку приходит уведомление об обновлении и он отказывается его просматривать.

Готово!

Готовый GameMode для теста:
Таблица:

Автор: Bren
 
Последнее редактирование:
Сверху Снизу