Question

Всем привет, хочу сделать систему итогов по репортам и вопросам хелперов нужно сделать 2 типа (Обычные итоги которые подводиться каждые 2 минуты:

(ИТОГИ: All(Репортов за 2 минуты.): 0 / Ans(Вопросы хелперам): 0 / Неотв(Не отвеченные репорты).: 0 | Ответить(ИДшники тех кто не получил ответ.):

И итоги часа:

(ИТОГИ ЧАСА: Репортов: 0(Репортов за час) / Ответов: 0 (Ответы на репорты за час)/ Неотвечено: 0(Неотвеченные репорты))

 

Share this post


Link to post

28 answers to this question

  • 0

Этот текст просто в чат будет отправляться каждые 2 минуты и час соответственно? 

Share this post


Link to post
  • 0
6 минут назад, DEST сказал:

Этот текст просто в чат будет отправляться каждые 2 минуты и час соответственно? 

Да. И когда пробивает PayDay он будет писать итоги за этот час.

Edited by R0m4ik

Share this post


Link to post
  • 0

Наиболее простое решение завести под это дело переменные-счетчики (один для двухминутного отчета, второй для ежечасного), в месте, где задается вопрос прибавлять его к неотвеченным, и прибавлять единицу к количеству вопросов. В двухминутном таймере выводить текст и обнулять их, с ежечасным таймером аналогично. 

Share this post


Link to post
  • 0

@DEST А как это сделать?

Share this post


Link to post
  • 0

@R0m4ik, ну, хорошо, попробую немного подробнее описать реализацию такой системы.

 

1. Создание счетчиков. Достаточно примитивный этап. Что есть счетчик? Счетчик - обычная переменная, которая хранит значение чего-либо. Поэтому создание счетчиков равносильно созданию обычной переменной. Сколько таких переменных (счетчиков) вам необходимо в данном случае, исходя из ваших задач?

  • Общее количество вопросов
  • Количество проигнорированных вопросов

Ну, и, поскольку вы хотите сохранять идентификаторы игроков, которые не получили ответ на свой вопрос, необходимо создать еще итератор (хранит массив, а также предоставляет функционал для удобной работы с ним). Выглядеть это может примерно так:

new questionsCounIn2Mins; // общее количество вопросов за последние 2 минуты
new ignoredQuestionsCountIn2Mins; // количество проигнорированных вопросов за последние 2 минуты
new Iterator:ignoredPlayers<MAX_PLAYERS>; // список игроков, не получивших ответ на свой вопрос

2. Заполнение значениями. Соответственно, в тех местах, где приходит новый вопрос, необходимо увеличивать значения счетчиков questionsCountIn2Mins и ignoredQuestionsCountIn2Mins, а также заносить идентификатор игрока, задавшего вопрос, в итератор ignoredPlayers.

questionsCounIn2Mins++; // увеличение questionsCountIn2Mins на 1
ignoredQuestionsCountIn2Mins++; // увеличение ignoredQuestionsCountIn2Mins на 1
Iter_Add(ignoredPlayers, playerid); // занесение идентификатора игрока, задавшего вопрос, в массив итератора
// при необходимости playerid поменять на свое значение

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

ignoredQuestionsCountIn2Mins--; // уменьшение значения на 1
Iter_Remove(ignoredPlayers, playerid); // удаление игрока playerid из списка проигнорированных
// при необходимости playerid поменять на свое значение

3. Реализация подсчета значений за час и вывода информации в чат. Для того, чтобы информация выводилась с нужным вам интервалом (раз в 2 минуты и раз в 1 час соответственно), следует использовать таймер, который будет обеспечивать выполнение необходимых нам действий с заданным интервалом. Наверняка в вашем моде уже есть такой таймер (секундный, минутный, или какой-нибудь еще). Используя его, следует, прежде всего, при необходимости, обеспечить выполнение нашего "куска" кода с нужной нам частотой. Что я имею в виду? Есть у вас, например, секундный таймер. Но нам не подходит вариант выводить информацию каждую секунду. Поэтому внутри этого таймера нужно реализовать "вычисление" двух минут и часа. Как вариант, это могло бы выглядеть так (при наличии секундного таймера).

Спойлер

@SecondPlayerTimer(playerid);
@SecondPlayerTimer(playerid) {
    static tick;
    tick++; // каждую секунду значение tick будет увеличиваться на 1

    if (tick % (2*60) == 0 && IsPlayerAdmin(playerid)) { // остаток от деления tick на 120 секунд (= 2 минуты) = 0 (прошло 2 минуты) и игрок - админ?
        new string[144];
        foreach (new i : ignoredPlayers) { // перебираем всех проигнорированных игроков
            strcat(string, valstr(i)); // и заносим их в строку вида 0, 2, 3, 15, ...
            strcat(string, ", ");
        }

        format(string, sizeof string, "Вопросов за 2 минуты: %d, проигнорированных: %d, нужно ответить: %s", questionsCounIn2Mins, ignoredQuestionsCountIn2Mins, string);
        SendClientMessage(playerid, -1, string);

        static questionsCount; // в количество вопросов за час добавляем вопросы за последние 2 минуты
        questionsCount += questionsCounIn2Mins;

        static ignoredQuestionsCount; // в количество проигнорированных вопросов за час добавляем последние за 2 минуты
        ignoredQuestionsCount += ignoredQuestionsCountIn2Mins;

        if (tick % (60*60) == 0) { // остаток от деления tick на 3600 секунд (= 1 час) = 0? (прошел час)

            new answeredQuestionsCount = questionsCount - ignoredQuestionsCount; // всего ответов = всего вопросов - количество проигнорированных

            format(string, sizeof string, "Вопросов за час: %d, не отвечено: %d, отвечено: %d", questionsCount, ignoredQuestionsCount, answeredQuestionsCount);
            SendClientMessage(playerid, -1, string);

            // коль уж час прошел, можем сбросить статистику
            questionsCount = 0;
            ignoredQuestionsCount = 0;
        }

        // сбрасываем статистику за последние 2 минуты
        questionsCounIn2Mins = 0;
        ignoredQuestionsCountIn2Mins = 0;
        Iter_Clear(ignoredPlayers); // очищаем список проигнорированных игроков
    }


}

 

 

Share this post


Link to post
  • 0
51 минуту назад, Cawfee сказал:

@R0m4ik, ну, хорошо, попробую немного подробнее описать реализацию такой системы.

 

1. Создание счетчиков. Достаточно примитивный этап. Что есть счетчик? Счетчик - обычная переменная, которая хранит значение чего-либо. Поэтому создание счетчиков равносильно созданию обычной переменной. Сколько таких переменных (счетчиков) вам необходимо в данном случае, исходя из ваших задач?

  • Общее количество вопросов
  • Количество проигнорированных вопросов

Ну, и, поскольку вы хотите сохранять идентификаторы игроков, которые не получили ответ на свой вопрос, необходимо создать еще итератор (хранит массив, а также предоставляет функционал для удобной работы с ним). Выглядеть это может примерно так:


new questionsCounIn2Mins; // общее количество вопросов за последние 2 минуты
new ignoredQuestionsCountIn2Mins; // количество проигнорированных вопросов за последние 2 минуты
new Iterator:ignoredPlayers<MAX_PLAYERS>; // список игроков, не получивших ответ на свой вопрос

2. Заполнение значениями. Соответственно, в тех местах, где приходит новый вопрос, необходимо увеличивать значения счетчиков questionsCountIn2Mins и ignoredQuestionsCountIn2Mins, а также заносить идентификатор игрока, задавшего вопрос, в итератор ignoredPlayers.


questionsCounIn2Mins++; // увеличение questionsCountIn2Mins на 1
ignoredQuestionsCountIn2Mins++; // увеличение ignoredQuestionsCountIn2Mins на 1
Iter_Add(ignoredPlayers, playerid); // занесение идентификатора игрока, задавшего вопрос, в массив итератора
// при необходимости playerid поменять на свое значение

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


ignoredQuestionsCountIn2Mins--; // уменьшение значения на 1
Iter_Remove(ignoredPlayers, playerid); // удаление игрока playerid из списка проигнорированных
// при необходимости playerid поменять на свое значение

3. Реализация подсчета значений за час и вывода информации в чат. Для того, чтобы информация выводилась с нужным вам интервалом (раз в 2 минуты и раз в 1 час соответственно), следует использовать таймер, который будет обеспечивать выполнение необходимых нам действий с заданным интервалом. Наверняка в вашем моде уже есть такой таймер (секундный, минутный, или какой-нибудь еще). Используя его, следует, прежде всего, при необходимости, обеспечить выполнение нашего "куска" кода с нужной нам частотой. Что я имею в виду? Есть у вас, например, секундный таймер. Но нам не подходит вариант выводить информацию каждую секунду. Поэтому внутри этого таймера нужно реализовать "вычисление" двух минут и часа. Как вариант, это могло бы выглядеть так (при наличии секундного таймера).

  закрыть спойлер


@SecondPlayerTimer(playerid);
@SecondPlayerTimer(playerid) {
    static tick;
    tick++; // каждую секунду значение tick будет увеличиваться на 1

    if (tick % (2*60) == 0 && IsPlayerAdmin(playerid)) { // остаток от деления tick на 120 секунд (= 2 минуты) = 0 (прошло 2 минуты) и игрок - админ?
        new string[144];
        foreach (new i : ignoredPlayers) { // перебираем всех проигнорированных игроков
            strcat(string, valstr(i)); // и заносим их в строку вида 0, 2, 3, 15, ...
            strcat(string, ", ");
        }

        format(string, sizeof string, "Вопросов за 2 минуты: %d, проигнорированных: %d, нужно ответить: %s", questionsCounIn2Mins, ignoredQuestionsCountIn2Mins, string);
        SendClientMessage(playerid, -1, string);

        static questionsCount; // в количество вопросов за час добавляем вопросы за последние 2 минуты
        questionsCount += questionsCounIn2Mins;

        static ignoredQuestionsCount; // в количество проигнорированных вопросов за час добавляем последние за 2 минуты
        ignoredQuestionsCount += ignoredQuestionsCountIn2Mins;

        if (tick % (60*60) == 0) { // остаток от деления tick на 3600 секунд (= 1 час) = 0? (прошел час)

            new answeredQuestionsCount = questionsCount - ignoredQuestionsCount; // всего ответов = всего вопросов - количество проигнорированных

            format(string, sizeof string, "Вопросов за час: %d, не отвечено: %d, отвечено: %d", questionsCount, ignoredQuestionsCount, answeredQuestionsCount);
            SendClientMessage(playerid, -1, string);

            // коль уж час прошел, можем сбросить статистику
            questionsCount = 0;
            ignoredQuestionsCount = 0;
        }

        // сбрасываем статистику за последние 2 минуты
        questionsCounIn2Mins = 0;
        ignoredQuestionsCountIn2Mins = 0;
        Iter_Clear(ignoredPlayers); // очищаем список проигнорированных игроков
    }


}

 

 

C:\Users\Roma\Desktop\REVENT RP BY SOSED\gamemodes\justice.pwn(32526) : warning 202: number of arguments does not match definition
C:\Users\Roma\Desktop\REVENT RP BY SOSED\gamemodes\justice.pwn(32501) : warning 204: symbol is assigned a value that is never used: "string"
C:\Users\Roma\Desktop\REVENT RP BY SOSED\gamemodes\justice.pwn(50573) : error 035: argument type mismatch (argument 1)

 

Edited by R0m4ik

Share this post


Link to post
  • 0
        foreach (new i : ignoredPlayers)
        {
            strcat(string, valstr(i));//проблема тут
            strcat(string, ", ");
        }

 

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

Используйте кнопку "Ответить" вместо "Цитата" для ответа пользователям. Не в первый раз говорю это.

Share this post


Link to post
  • 0

@R0m4ik, вместо этих двух строчек вставьте следующую:

format(string, sizeof string, "%s%d, ", string, i);

 

Share this post


Link to post
  • 0

@Cawfee 20 минут нахожусь на сервере не появляется сообщение о итогах.

Edited by R0m4ik

Share this post


Link to post
  • 0

@R0m4ik, пересматривайте таймер прежде всего: точно ли это секундный таймер.

Share this post


Link to post
  • 0

@Cawfee Скорее всего проблема в этом 

: warning 204: symbol is assigned a value that is never used: "string"

если я переменную убираю появляються ошибки

Share this post


Link to post
  • 0

@R0m4ik, все зависит от того, как вы в итоге вставили это дело в свой мод.

Share this post


Link to post
  • 0

@Cawfee 

Это я добавил к переменным.

new questionsCounIn2Mins;
new ignoredQuestionsCountIn2Mins;
new Iterator:ignoredPlayers<MAX_PLAYERS>;
questionsCounIn2Mins++;
ignoredQuestionsCountIn2Mins++; 
Iter_Add(ignoredPlayers, playerid);

Это там где приходит репорт

ignoredQuestionsCountIn2Mins--;
Iter_Remove(ignoredPlayers, playerid);

Это когда админ ответил игроку в команду /an

 

@SecondPlayerTimer(playerid);
@SecondPlayerTimer(playerid)
{
        static tick;
        tick++; 
        if (tick % (2*60) == 0 && IsPlayerAdmin(playerid))
        {
            new string[144];
            foreach (new i : ignoredPlayers)
            {
            format(string, sizeof string, "%s%d, ", string, i);
        }
        format(string, sizeof string, "ИТОГИ: {009900}All:{FFFFFF} %d {009900}/ Ans: {FFFFFF}0 {009900}/ Неотв.: {ff0000}%d {ffffff} | Ответить:{ffff82} %d", questionsCounIn2Mins, ignoredQuestionsCountIn2Mins, string);
        SendClientMessage(playerid, -1, string);
        static questionsCount;
        questionsCount += questionsCounIn2Mins;
        static ignoredQuestionsCount;
        ignoredQuestionsCount += ignoredQuestionsCountIn2Mins;
        if (tick % (60*60) == 0)
        {
            new answeredQuestionsCount = questionsCount - ignoredQuestionsCount;
            format(string, sizeof string, "ИТОГИ ЧАСА: {009900}Репортов: {ffffff}%d {009900}/ Ответов: {ffffff}%d {009900}/ Неотвечено: {ff0000}%d {ffffff}", questionsCount, answeredQuestionsCount, ignoredQuestionsCount);
            SendClientMessage(playerid, -1, string);
            questionsCount = 0;
            ignoredQuestionsCount = 0;
        }
        questionsCounIn2Mins = 0;
        ignoredQuestionsCountIn2Mins = 0;
        Iter_Clear(ignoredPlayers);
    }


}

Это в конец мода P.S Там где итоги часа мне нужно это именно к PAYDAY добавить

Share this post


Link to post
  • 0

Пишу с запасного т.к забыл пароль от старого аккаунта E-Mail для востановления не помню

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

Обратитесь в техническую поддержку форума по поводу восстановления доступа к утерянному аккаунту.

Share this post


Link to post
  • 0

@Mason, в вашем игровом моде присутствуют индивидуальные секундные таймеры?

Share this post


Link to post
  • 0

@Cawfee Не знаю наверно нет.

Share this post


Link to post
  • 0

@Cawfee Если вы про вот это "SetTimerEx" то да есть.

Share this post


Link to post
  • 0

@Cawfee Допустим я сделал эту систему под себя, и теперь все появляется все работает но что делать если в PayDay я туда итоги часа вставил если я с другом на сервере почему в payday появляется 2 сообщения а когда я один на сервере то 1 сообщение еще вопрос как сделать так чтобы если 1 идшник не получил ответ то в конце писалась точка а если несколько то через запятую и если остался последний идшник то в конце точка, и как сделать так когда админ просто ответил репорт не приходил просто ответил число не отвеченных не уходило в -

Edited by Mason

Share this post


Link to post
  • 0

up

Share this post


Link to post
  • 0

@Cawfee Есть возможность ответить?

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

3.6. Запрещено поднимать (апать) свою тему чаще, чем 1 раз в 24 часа. 

Устное предупреждение.

Share this post


Link to post
  • 0

@Mason, код функции с PayDay приложите.

Share this post


Link to post
  • 0

@Cawfee 

    //ИТОГИ
    new answeredQuestionsCount = questionsCount - ignoredQuestionsCount;
    format(string, sizeof string, "ИТОГИ ЧАСА: {009900}Репортов: {ffffff}%d {009900}/ Ответов: {ffffff}%d {009900}/ Неотвечено: {ff0000}%d {ffffff}", questionsCount, answeredQuestionsCount, ignoredQuestionsCount);
    SendAdminMessage(0xb03131ff, string);
    questionsCount = 0;
    answeredQuestionsCount = 0;
    ignoredQuestionsCount = 0;
    questionsCounIn2Mins = 0;
    ignoredQuestionsCountIn2Mins = 0;
    Iter_Clear(ignoredPlayers);
    //

Это добавил после сообщения о payday.

    //ИТОГИ
    static questionsCount;
    questionsCount += questionsCounIn2Mins;
    static ignoredQuestionsCount;
    ignoredQuestionsCount += ignoredQuestionsCountIn2Mins;
    //

Это до сообщения.

Share this post


Link to post
  • 0

@Mason, у вас функция с PayDay имеет параметр playerid? Или внутри нее стоит цикл, перебирающий всех игроков в сети, чтобы вывести сообщение о PayDay?

Share this post


Link to post
  • 0

@Cawfee Возможно 2 вариант щяс посмотрю.

Share this post


Link to post
  • 0

@Cawfee Я посмотрел, да plyaerid есть.

Share this post


Link to post
This topic is now closed to further replies.
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By zdfgdhdrhrhd
      Доброго времени суток, столкнулся с проблемой при добавлении системы анти-флуда пикапов.
      По сути, она работает нормально, но немного напрягает тот факт, что когда встаешь на любой пикап, он отправляет сообщение по два раза, вместо одного.
      Знающие люди, помогите пожалуйста, заранее огромное спасибо!
      Откуда брал систему (инклуд прикрепил ниже):
      pickup_stop_flood.inc