В теме 9 сообщений

Гость stibs
Новичок

ГОТОВОЕ РЕШЕНИЕ


Всем привет! В одном моде (слитый Sunrise) увидел неплохую системку статистики администрации. Однако, как выяснилось, данная система не была доведена до конца. Т.е. там не было сохранения. Здесь же я его написал. Вы сможете полностью контролировать свою администрацию. Думаю, многим пригодится. В статистику входят: 

  • Статистика онлайна по дня недели (автоматически обнуляется в каждое воскресенье) + норма онлайна, а также общий недельный онлайн. 

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

Давайте начинать!


Для начала нам нужна бд, куда будет сохраняться онлайн администратора. Прикладываю готовую структуру базы данных для данной системы.

Спойлер

CREATE TABLE IF NOT EXISTS `onlineadm`( `nameadm` VARCHAR(24) NOT NULL , `online_monday` INT(11) NOT NULL , `online_tuesday` INT(11) NOT NULL , `online_wednesday` INT(11) NOT NULL , `online_thursday` INT(11) NOT NULL , `online_friday` INT(11) NOT NULL , `online_saturday` INT(11) NOT NULL , `online_sunday` INT(11) NOT NULL ) ENGINE = InnoDB;

 

Далее нам необходимо переместится в мод, и добавляем в OnGameModeInit обнуление онлайна по окончанию недели. 

if(getDayEx()==2) mysql_tquery(dbHandle, "UPDATE `onlineadm` SET `online_monday`='0',`online_tuesday`='0',`online_wednesday`='0',`online_thursday`='0',`online_friday`='0',`online_saturday`='0',`online_sunday`='0'", "", "");

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

Ко всем командам:
 

CMD:checkadmstats(playerid, params[])
{
    //проверку на админа
    if(sscanf(params, "s[24]", params[0])) return SendClientMessage(playerid, -1, "Используйте: /checkadmstats [nick]");
    mysql_format(dbHandle, string, sizeof(string), "SELECT * FROM `onlineadm` WHERE `nameadm`='%s' LIMIT 1", params[0]);
    mysql_tquery(dbHandle, string, "OnCheckStatsAdmin", "is", playerid, params[0]);
    SendClientMessage(playerid, -1, "В базу данных запрос успешно отправлен, ожидайте ответа.");
  
    return true;
}

Далее добавляем сам обработчик mysql запроса - OnCheckStatsAdmin:

Спойлер



forward OnCheckStatsAdmin(playerid, name[]);
public OnCheckStatsAdmin(playerid, name[])
{
    new rows, fields;
    cache_get_data(rows, fields);
    if(!rows)
    return SendClientMessage(playerid, -1, "Игрок с таким ником не найден! Поторите попытку.");
    new string[256],
    string_dialogue[2000],
    check_online_monday,
    check_online_tuesday,
    check_online_wednesday,
    check_online_thursday,
    check_online_friday,
    check_online_saturday,
    check_online_sunday,
    check_online_allday;
  
    check_online_monday = cache_get_row_int(0, 1, dbHandle); // id
    check_online_tuesday = cache_get_row_int(0, 2, dbHandle); // id
    check_online_wednesday = cache_get_row_int(0, 3, dbHandle); // id
    check_online_thursday = cache_get_row_int(0, 4, dbHandle); // id
    check_online_friday = cache_get_row_int(0, 5, dbHandle); // id
    check_online_saturday = cache_get_row_int(0, 6, dbHandle); // id
    check_online_sunday = cache_get_row_int(0, 7, dbHandle); // id
  
    strcat(string_dialogue, "{FF9900}Недельный онлайн\n\n");
    format(string, sizeof(string), "{FFFFFF}Понедельник:\t\t{3399FF}%i мин. (%i час.) {FFFFFF}| Норма онлайна - %s\n", check_online_monday/60, check_online_monday/3600, (check_online_monday/3600>=4)?("{63BD4E}Выполнена"):(check_online_monday/3600>=3)?("{FFCC00}Не выполнена"):("{F04245}Не выполнена"));
    strcat(string_dialogue, string);
    format(string, sizeof(string), "{FFFFFF}Вторник\t\t{3399FF}%i мин. (%i час.) {FFFFFF}| Норма онлайна - %s\n", check_online_tuesday/60, check_online_tuesday/3600,  (check_online_tuesday/3600>=4)?("{63BD4E}Выполнена"):(check_online_tuesday/3600>=3)?("{FFCC00}Не выполнена"):("{F04245}Не выполнена"));
    strcat(string_dialogue, string);
    format(string, sizeof(string), "{FFFFFF}Среда\t\t\t{3399FF}%i мин. (%i час.) {FFFFFF}| Норма онлайна - %s\n", check_online_wednesday/60, check_online_wednesday/3600,  (check_online_wednesday/3600>=4)?("{63BD4E}Выполнена"):(check_online_wednesday/3600>=3)?("{FFCC00}Не выполнена"):("{F04245}Не выполнена"));
    strcat(string_dialogue, string);
    format(string, sizeof(string), "{FFFFFF}Четверг\t\t{3399FF}%i мин. (%i час.) {FFFFFF}| Норма онлайна - %s\n", check_online_thursday/60, check_online_thursday/3600,  (check_online_thursday/3600>=4)?("{63BD4E}Выполнена"):(check_online_thursday/3600>=3)?("{FFCC00}Не выполнена"):("{F04245}Не выполнена"));
    strcat(string_dialogue, string);
    format(string, sizeof(string), "{FFFFFF}Пятница\t\t{3399FF}%i мин. (%i час.) {FFFFFF}| Норма онлайна - %s\n", check_online_friday/60, check_online_friday/3600,  (check_online_friday/3600>=4)?("{63BD4E}Выполнена"):(check_online_friday/3600>=3)?("{FFCC00}Не выполнена"):("{F04245}Не выполнена"));
    strcat(string_dialogue, string);
    format(string, sizeof(string), "{FFFFFF}Суббота\t\t{3399FF}%i мин. (%i час.) {FFFFFF}| Норма онлайна - %s\n", check_online_saturday/60, check_online_saturday/3600,  (check_online_saturday/3600>=4)?("{63BD4E}Выполнена"):(check_online_saturday/3600>=3)?("{FFCC00}Не выполнена"):("{F04245}Не выполнена"));
    strcat(string_dialogue, string);
    format(string, sizeof(string), "{FFFFFF}Воскресенье\t\t{3399FF}%i мин. (%i час.) {FFFFFF}| Норма онлайна - %s\n", check_online_sunday/60, check_online_sunday/3600,  (check_online_sunday/3600>=4)?("{63BD4E}Выполнена"):(check_online_sunday/3600>=3)?("{FFCC00}Не выполнена"):("{F04245}Не выполнена"));
    strcat(string_dialogue, string);
    check_online_allday = check_online_monday + check_online_tuesday + check_online_wednesday + check_online_thursday + check_online_friday + check_online_saturday + check_online_sunday;
    format(string, sizeof(string), "\n{AFAFAF}Общий онлайн(недельный):\t{DD90FF}%i мин. (%i час.) {FFFFFF}| Норма онлайна - %s\n\n", check_online_allday/60, check_online_allday/3600, (check_online_sunday/3600>=28)?("{63BD4E}Выполнена"):(check_online_sunday/3600>=21)?("{FFCC00}Не выполнена"):("{F04245}Не выполнена"));
    strcat(string_dialogue, string);
  
    static const fmt_str[] = "Статистика администратора - %s";
    new str[sizeof(fmt_str) + (-2+24)];
    format(str, sizeof(str), fmt_str, name);
  
    ShowPlayerDialog(playerid, 0, DIALOG_STLYE_MSGBOX, str, string_dialogue, "Закрыть", "");
  
    return true;
}

 

Теперь самое главное, чего у этой системы, собственно и не было - Сохранение. 

Ко всем new:

new OnlineDay[MAX_PLAYERS];

Далее в секундный таймер суем:

if(/*проверка на АФК*/ < 3)
{
    OnlineDay[playerid]++;
} // если нет проверки на афк удалите ее и эти две скобки тоже.

После этого добавляем в OnPlayerDisconnect:

Спойлер

mysql_tquery(dbHandle, "SELECT * FROM `onlineadm`", "OnSaveAdm", "i", playerid);

 

Теперь создадим этот паблик сохранения:
 

Спойлер

forward OnSaveAdm(playerid);
public OnSaveAdm(playerid)
{
    new rows, fields;
    cache_get_data(rows, fields); 
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, sizeof(name));
    new string[120],onlinesum;
    switch(getDayEx())
    {
        case 0:
        {
            onlinesum = cache_get_row_int(0, 6, dbHandle) + OnlineDay[playerid];
            mysql_format(dbHandle, string, sizeof(string), "UPDATE `onlineadm` SET `online_saturday` = '%d' WHERE `nameadm` = '%s'", onlinesum, name);
        }
        case 1:
        {
            onlinesum = cache_get_row_int(0, 7, dbHandle) + OnlineDay[playerid];
            mysql_format(dbHandle, string, sizeof(string), "UPDATE `onlineadm` SET `online_sunday` = '%d' WHERE `nameadm` = '%s'", onlinesum, name);
        }
        case 2:
        {
            onlinesum = cache_get_row_int(0, 1, dbHandle) + OnlineDay[playerid];
            mysql_format(dbHandle, string, sizeof(string), "UPDATE `onlineadm` SET `online_monday` = '%d' WHERE `nameadm` = '%s'", onlinesum, name);
        }
        case 3:
        {
            onlinesum = cache_get_row_int(0, 2, dbHandle) + OnlineDay[playerid];
            mysql_format(dbHandle, string, sizeof(string), "UPDATE `onlineadm` SET `online_tuesday` = '%d' WHERE `nameadm` = '%s'", onlinesum, name);
        }
        case 4:
        {
            onlinesum = cache_get_row_int(0, 3, dbHandle) + OnlineDay[playerid];
            mysql_format(dbHandle, string, sizeof(string), "UPDATE `onlineadm` SET `online_wednesday` = '%d' WHERE `nameadm` = '%s'", onlinesum, name);
        }
        case 5:
        {
            onlinesum = cache_get_row_int(0, 4, dbHandle) + OnlineDay[playerid];
            mysql_format(dbHandle, string, sizeof(string), "UPDATE `onlineadm` SET `online_thursday` = '%d' WHERE `nameadm` = '%s'", onlinesum, name);
        }
        case 6:
        {
            onlinesum = cache_get_row_int(0, 5, dbHandle) + OnlineDay[playerid];
            mysql_format(dbHandle, string, sizeof(string), "UPDATE `onlineadm` SET `online_friday` = '%d' WHERE `nameadm` = '%s'", onlinesum, name);
        }
    }
    mysql_tquery(dbHandle, string, "", ""); // запрос к базе
    return true;
}

 

Переделал систему: @stibs.

Автор первоначальной системы (автор мода Sunrise RP) - Serega_Travakur

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

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


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

Если ошибка : undefined symbol getDayEx(), то вставляем в конец мода:

stock getDayEx()
{
    new w = gettime(), saturday = 1310155200, day_week;
	while(w - saturday > 60 * 60 * 24)
    {
        w -= 60 * 60 * 24;
        day_week ++;
    }
    while(day_week >= 7) day_week -= 7;
	return day_week;
}

 

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


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

автора укажите, кто переделывал есть, а автора нет!

Заметка от Гость , создано

Было вырезано из мода (Sunrise RP), а кто автор мода без понятия. Если знаете, можете указать.

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


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

Как исправить? 

Спойлер

C:\Users\Максим\Desktop\Moд ICE RP\gamemodes\ice.pwn(10431) : error 012: invalid function call, not a valid address
C:\Users\Максим\Desktop\Moд ICE RP\gamemodes\ice.pwn(10431) : error 029: invalid expression, assumed zero
C:\Users\Максим\Desktop\Moд ICE RP\gamemodes\ice.pwn(10431) : warning 215: expression has no effect
C:\Users\Максим\Desktop\Moд ICE RP\gamemodes\ice.pwn(10431) : error 001: expected token: ";", but found ")"
C:\Users\Максим\Desktop\Moд ICE RP\gamemodes\ice.pwn(10431) : fatal error 107: too many error messages on one line

Compilation aborted.

Pawn compiler 3.10.8              Copyright (c) 1997-2006, ITB CompuPhase


4 Errors.
 

 

if(getDayEx()==2) mysql_tquery(dbHandle, "UPDATE `onlineadm` SET `online_monday`='0',`online_tuesday`='0',`online_wednesday`='0',`online_thursday`='0',`online_friday`='0',`online_saturday`='0',`online_sunday`='0'""""");

 

imag1e.png

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


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

получено новое достижение: апнуть тему 5-ти летней давности

Заметка от Cawfee , создано

Устно предупредил – не поняли... В следующий раз поставлю на премодерацию.

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


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

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

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

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

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


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

Войти

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


Войти

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

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

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

    • fert_bern
      От fert_bern
      Здравствуйте! 
       
      Я ищю человека скриптера который научит работать с Pawno 
       
      Надеюсь люди будут кто есть напишите свой вк пожалуйста.
    • OREGON-RPG
      От OREGON-RPG
      **Привет, будущий друг!**
      Мы создаем новый сервер в >> GTA SA-MP (OregoN Role Playing Game) << и ищем таких же увлеченных игроков, как ты!!!

      Здесь ты сможешь: 

      Влиять на развитие сервера – твое мнение важно! 

      Найти друзей и классную компанию.
       
      Стать частью уютного комьюнити, где все друг за друга.

      Сервер еще в разработке – это шанс войти в историю с самого начала! 

       >>> Давай строить этот мир вместе? <<<

       Переходи по ссылке, будь в центре событий и стань частью истории: 

      [ Группа ВКонтакте: vk.com/oregonrpgru ]

      [ Форум: oregon-rpg.ru ]