Skip to forum content

You are not logged in. Please login or register.


forums.pvpgn.pro → [RU] The Source Code → Делаем команду /stats похожую как на сервере iCCup.

Pages 1

You must login or register to post a reply

RSS topic feed

Posts: 17

1

Topic: Делаем команду /stats похожую как на сервере iCCup.

Всем привет, думаю многие досихпор не нашли полноценного ответа как сделать /stats как в ICCup'e.
Так давайте начнем...
Для начала нужно игрового бота GHost One (Ghost ++, BRT) заставить писать данные статистики в таблицу bnet.
Теперь идем к pvpgn
Открываем проект pvpgn
Открываем заголовочный файл account_wrap.h
ищем код

extern int account_set_ll_ip(t_account * account, char const * ip);

после него вставляем это:

extern int account_get_pts(t_account * account);
extern unsigned int account_get_top(t_account * account);
extern int account_get_wins(t_account * account);
extern int account_get_losses(t_account * account);
extern  int account_get_winspcnt(t_account * account);
extern int account_get_leavescnt(t_account * account);
extern int account_get_leavespcnt(t_account * account);
extern int account_get_kills(t_account * account);
extern int account_get_deaths(t_account * account);
extern  int account_get_assists(t_account * account);
extern char const * account_get_percentsymbols(t_account * account);
extern char const *  account_get_rank(t_account * account);

Теперь идем к account_wrap.cpp (в PRO версии .c)
ищем строрчки

extern int account_set_ll_ip(t_account * account, char const * ip)
{
    return account_set_strattr(account,"BNET\\acct\\lastlogin_ip",ip);
}

/****************************************************************/

и после вставляем это:

extern int account_get_pts(t_account * account)
{
    return account_get_numattr(account, "BNET\\pts");
}
extern char const * account_get_rank(t_account * account)
{
    return account_get_strattr(account, "BNET\\rank");
}
extern char const * account_get_percentsymbols(t_account * account)
{
    return account_get_strattr(account, "BNET\\percentsymbols");
}
extern int account_get_winspcnt(t_account * account)
{
    return account_get_numattr(account, "BNET\\winspcnt");
}
extern int account_get_wins(t_account * account)
{
    return account_get_numattr(account, "BNET\\wins");
}
extern int account_get_losses(t_account * account)
{extern int account_set_ll_ip(t_account * account, char const * ip);
    return account_get_numattr(account, "BNET\\losses");
}
extern int  account_get_leavescnt(t_account * account)
{
    return account_get_numattr(account, "BNET\\leavescount");
}
extern int  account_get_leavespcnt(t_account * account)
{
    return account_get_numattr(account, "BNET\\leavespcnt");
}
extern int   account_get_kills(t_account * account)
{
    return account_get_numattr(account, "BNET\\kills");
}
extern int account_get_deaths(t_account * account)
{
    return account_get_numattr(account, "BNET\\deaths");
}
extern int account_get_assists(t_account * account)
{
    return account_get_numattr(account, "BNET\\assists");
}
extern unsigned int account_get_top(t_account * account)
{
    return account_get_numattr(account, "BNET\\top");
}

Теперь идем к command.cpp (в PRO версии command.c)
ищем

static int _handle_stats_command(t_connection *c, char const *text)

удаляем всё от { до }
и вставляем

static int _handle_stats_command(t_connection * c, char const *text)
{
    text = skip_command(text);

    if (text[0] == '\0')
    {
        t_account * myacc = conn_get_account(c);
        char * dotastats = new char[MAX_MESSAGE_LEN];
        snprintf(dotastats, MAX_MESSAGE_LEN, "%s DotA(5x5) stats", account_get_name(myacc));
        message_send_text(c, message_type_info, c, dotastats);
        snprintf(dotastats, MAX_MESSAGE_LEN, "Score: [%s] %d pts", account_get_rank(myacc), account_get_pts(myacc));
        message_send_text(c, message_type_info, c, dotastats);
        snprintf(dotastats, MAX_MESSAGE_LEN, "Games W/L: %d/%d (Win: %d%s)",
            account_get_wins(myacc), account_get_losses(myacc), account_get_winspcnt(myacc), account_get_percentsymbols(myacc));
        message_send_text(c, message_type_info, c, dotastats);
        snprintf(dotastats, MAX_MESSAGE_LEN, "Hero K/D/A: %d/%d/%d",
            account_get_kills(myacc), account_get_deaths(myacc), account_get_assists(myacc));
        message_send_text(c, message_type_info, c, dotastats);
        snprintf(dotastats, MAX_MESSAGE_LEN, "Leaves: %d(%d%s)",
            account_get_leavescnt(myacc), account_get_leavespcnt(myacc), account_get_percentsymbols(myacc));
        message_send_text(c, message_type_info, c, dotastats);
        delete[]dotastats;
    }
    else
    {
        t_account * myacc;
        if (!(myacc = accountlist_find_account(text)))
        {
            message_send_text(c, message_type_error, c, "Неизвестный пользователь!");
        }
        else
        {
            char * dotastats = new char[MAX_MESSAGE_LEN];
            snprintf(dotastats, MAX_MESSAGE_LEN, "%s DotA(5x5) stats", account_get_name(myacc));
            message_send_text(c, message_type_error, c, dotastats);
            snprintf(dotastats, MAX_MESSAGE_LEN, "Score: [%s] %d pts",
                account_get_rank(myacc), account_get_pts(myacc));
            message_send_text(c, message_type_info, c, dotastats);
            snprintf(dotastats, MAX_MESSAGE_LEN, "Games W/L: %d/%d (Win: %d%s)",
                account_get_wins(myacc), account_get_losses(myacc), account_get_winspcnt(myacc), account_get_percentsymbols(myacc));
            message_send_text(c, message_type_info, c, dotastats);
            snprintf(dotastats, MAX_MESSAGE_LEN, "Hero K/D/A: %d/%d/%d",
                account_get_kills(myacc), account_get_deaths(myacc), account_get_assists(myacc));
            message_send_text(c, message_type_info, c, dotastats);
            snprintf(dotastats, MAX_MESSAGE_LEN, "Leaves: %d(%d%s)",
                account_get_leavescnt(myacc), account_get_leavespcnt(myacc), account_get_percentsymbols(myacc));
            message_send_text(c, message_type_info, c, dotastats);
            delete[]dotastats;
        }
    }

    return 0;
}

И компилируем.
И теперь идем к запросам базы:
Делаем запрос SQL(Спасибо ув. Serc):

ALTER TABLE Перфикс_bnet ADD games INT DEFAULT '0' NOT NULL;
ALTER TABLE Перфикс_bnet ADD wins INT DEFAULT '0' NOT NULL;
ALTER TABLE Перфикс_bnet ADD winspcnt INT DEFAULT '0' NOT NULL;
ALTER TABLE Перфикс_bnet ADD losses INT DEFAULT '0' NOT NULL;
ALTER TABLE Перфикс_bnet ADD winspcnt INT DEFAULT '0' NOT NULL;
ALTER TABLE Перфикс_bnet ADD kills INT DEFAULT '0' NOT NULL;
ALTER TABLE Перфикс_bnet ADD deaths INT DEFAULT '0' NOT NULL;
ALTER TABLE Перфикс_bnet ADD assists INT DEFAULT '0' NOT NULL;
ALTER TABLE Перфикс_bnet ADD pts INT DEFAULT '1000' NOT NULL;
ALTER TABLE Перфикс_bnet ADD rank varchar(32) DEFAULT 'D' NOT NULL;
ALTER TABLE Перфикс_bnet ADD percentsymbols varchar(32) DEFAULT '%' NOT NULL;
ALTER TABLE Перфикс_bnet ADD leavescount INT DEFAULT '0' NOT NULL;
ALTER TABLE Перфикс_bnet ADD leavespcnt INT DEFAULT '0' NOT NULL;

Запускаем сервер и проверяем статистику командой /stats

2

Re: Делаем команду /stats похожую как на сервере iCCup.

а теперь помог бы . при входе в созданную игру сообщение шло от сервера а не от бот

3

Re: Делаем команду /stats похожую как на сервере iCCup.

launcher wrote:

а теперь помог бы . при входе в созданную игру сообщение шло от сервера а не от бот

рисуешь команду /ghost и /pvpgn
и делаешь значение так:
когда игрок отправляет сообщение боту /ghost !pub например
а бот передает результат в /pvpgn а сервер тебе
думаю тебе понятен о чём я

4

Re: Делаем команду /stats похожую как на сервере iCCup.

Gh0ster wrote:
launcher wrote:

а теперь помог бы . при входе в созданную игру сообщение шло от сервера а не от бот

рисуешь команду /ghost и /pvpgn
и делаешь значение так:
когда игрок отправляет сообщение боту /ghost !pub например
а бот передает результат в /pvpgn а сервер тебе
думаю тебе понятен о чём я

да понятен. но помог бы с кодом))

5

Re: Делаем команду /stats похожую как на сервере iCCup.

launcher wrote:

а теперь помог бы . при входе в созданную игру сообщение шло от сервера а не от бот

это уже есть в форуме
https://forums.pvpgn.pro/viewtopic.php?id=1749

6

Re: Делаем команду /stats похожую как на сервере iCCup.

launcher wrote:
Gh0ster wrote:
launcher wrote:

а теперь помог бы . при входе в созданную игру сообщение шло от сервера а не от бот

рисуешь команду /ghost и /pvpgn
и делаешь значение так:
когда игрок отправляет сообщение боту /ghost !pub например
а бот передает результат в /pvpgn а сервер тебе
думаю тебе понятен о чём я

да понятен. но помог бы с кодом))

Хочешь дам легкий вариант?
Дублируешь message_type_gameopt_talk
на blue
и потом условие ставишь вот так примерно:
if(account_get_hostbot(account, NULL) ==1)
{
Выполнение кода и вывод синего текста от бота
}

7

Re: Делаем команду /stats похожую как на сервере iCCup.

ну а как же сделать этот запрос от сервера

8

Re: Делаем команду /stats похожую как на сервере iCCup.

launcher wrote:

ну а как же сделать этот запрос от сервера

ты имел ввиду игрок зашол в игру?
просто убери его из pdf файла в клиенте или в bnproxy
и поставь на сервер свою error, info , emote

9

Re: Делаем команду /stats похожую как на сервере iCCup.

SkyFall wrote:
launcher wrote:

ну а как же сделать этот запрос от сервера

ты имел ввиду игрок зашол в игру?
просто убери его из pdf файла в клиенте или в bnproxy
и поставь на сервер свою error, info , emote

а  я не использую  bnproxy
помоги с кодом что и как реализовать

10

Re: Делаем команду /stats похожую как на сервере iCCup.

launcher wrote:
SkyFall wrote:
launcher wrote:

ну а как же сделать этот запрос от сервера

ты имел ввиду игрок зашол в игру?
просто убери его из pdf файла в клиенте или в bnproxy
и поставь на сервер свою error, info , emote

а  я не использую  bnproxy
помоги с кодом что и как реализовать

а что ты используешь ? у тя в лаунчере есть mpq?

Добавлено: 03.10.2017 17:01

launcher wrote:
SkyFall wrote:
launcher wrote:

ну а как же сделать этот запрос от сервера

ты имел ввиду игрок зашол в игру?
просто убери его из pdf файла в клиенте или в bnproxy
и поставь на сервер свою error, info , emote

а  я не использую  bnproxy
помоги с кодом что и как реализовать

а что ты используешь ? у тя в лаунчере есть mpq?

11

Re: Делаем команду /stats похожую как на сервере iCCup.

SkyFall wrote:
launcher wrote:
SkyFall wrote:

ты имел ввиду игрок зашол в игру?
просто убери его из pdf файла в клиенте или в bnproxy
и поставь на сервер свою error, info , emote

а  я не использую  bnproxy
помоги с кодом что и как реализовать

а что ты используешь ? у тя в лаунчере есть mpq?

Добавлено: 03.10.2017 17:01

launcher wrote:
SkyFall wrote:

ты имел ввиду игрок зашол в игру?
просто убери его из pdf файла в клиенте или в bnproxy
и поставь на сервер свою error, info , emote

а  я не использую  bnproxy
помоги с кодом что и как реализовать

а что ты используешь ? у тя в лаунчере есть mpq?

на сервере есть
а в лаунчере нету

12

Re: Делаем команду /stats похожую как на сервере iCCup.

launcher wrote:
SkyFall wrote:
launcher wrote:

а  я не использую  bnproxy
помоги с кодом что и как реализовать

а что ты используешь ? у тя в лаунчере есть mpq?

Добавлено: 03.10.2017 17:01

launcher wrote:

а  я не использую  bnproxy
помоги с кодом что и как реализовать

а что ты используешь ? у тя в лаунчере есть mpq?

на сервере есть
а в лаунчере нету

на*** тебе лаунчер без mpq ?

13 (edited by Serc 04.10.2017 12:47)

Re: Делаем команду /stats похожую как на сервере iCCup.

launcher wrote:

ну а как же сделать этот запрос от сервера

Эту надпись можно убрать только на стороне клиента - потому как строка встроена в клиент ВК3.
В бнпрокси "патчится" Mpq файл клиента - поэтому можно скрыть/показать вход/выход пользователя в игру.

Вывод: На стороне сервера никак нельзя повлиять на выделенный текст.

14

Re: Делаем команду /stats похожую как на сервере iCCup.

Предложенным способом можно будет чекнуть стату другого игрока?

Добавлено: 17.02.2019 18:42

И второй вопрос с ходу, как добавить свою команду? Что бы их было 2: статс и сд. В этой статье автор заменяет одну на другую, а вот именно для добавления, манипуляций много нужно? В самом файле командс.спп я добавил свою по аналогии с оригинальной, при попытке заюзать ее на канале бнета - пишет "Unknown command".

15

Re: Делаем команду /stats похожую как на сервере iCCup.

Uint32 wrote:

Предложенным способом можно будет чекнуть стату другого игрока?

Добавлено: 17.02.2019 18:42

И второй вопрос с ходу, как добавить свою команду? Что бы их было 2: статс и сд. В этой статье автор заменяет одну на другую, а вот именно для добавления, манипуляций много нужно? В самом файле командс.спп я добавил свою по аналогии с оригинальной, при попытке заюзать ее на канале бнета - пишет "Unknown command".

за шоколадку все можно  wink

16

Re: Делаем команду /stats похожую как на сервере iCCup.

Uint32 wrote:

Предложенным способом можно будет чекнуть стату другого игрока?

Добавлено: 17.02.2019 18:42

И второй вопрос с ходу, как добавить свою команду? Что бы их было 2: статс и сд. В этой статье автор заменяет одну на другую, а вот именно для добавления, манипуляций много нужно? В самом файле командс.спп я добавил свою по аналогии с оригинальной, при попытке заюзать ее на канале бнета - пишет "Unknown command".

Не пересобирал (компилил) проект значит.

17

Re: Делаем команду /stats похожую как на сервере iCCup.

Тема всё ещё жива?:rolleyes:

Posts: 17

Pages 1

You must login or register to post a reply

Who now at forum

Currently view post: 0 guests, 0 registered users

forums.pvpgn.pro → [RU] The Source Code → Делаем команду /stats похожую как на сервере iCCup.