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

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
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • STIMEX
      By STIMEX
      Хочу сделать так чтобы можно было покупать два дома, например купил один дом, поменял слот на второй(пустой) и можно будет купить еще один дом, и переходить между слотов(чтобы например спавниться в том доме на какой слот включен), захотел второй продать, переключил слот и продаешь.