1. Соблюдайте Правила форума и проявляйте уважение к другим участникам беседы.

Help добавление новой переменной в формулу подсчета птс

Тема в разделе 'Кодинг/Собственные решения', создана пользователем d.1.s, 7 ноя 2012.

  1. d.1.s Ньюфаг

    Сообщения:
    8
    Спасибы:
    0
    Дата начала использования бота:
    01.08.2010
    возникла необходимость добавлять юзерам бонусные птс.(ранее добавил "-птс за лив", работало как надо)
    сделал следующее:
    1. в бд, в таблицу scores добавил новый столбец `bonus`(в нем планируется хранить те самые бонусные очи, по дефолту ноль)
    2. формула допустим 1000 + bonuspts
    3. сделал изменения в файле ghostdbmysql.cpp, в куске запроса
    Код:
    bool MySQLCalculateScores( void *conn, string *error, uint32_t botid, string formula, string mingames )
    {
        bool Success = false;
     
        string LeavVar = "sum(case when((dg.min*60+dg.sec > gp.left+60*5) and (gp.left > 60*5 ) and (gp.leftreason LIKE 'leave')) then 1 else 0 end) as leaves";
        string Query = "select name,server, (" + formula + ") as totalscore from(select *, [COLOR=#ff0000]bonus as bonuspts[/COLOR], (kills/deaths) as killdeathratio, (totgames-wins) as losses from (select [COLOR=#ff0000]scores.bonus as bonus,[/COLOR] gp.name as name,ga.server as server,gp.gameid as gameid, gp.colour as colour, avg(dp.courierkills) as courierkills, sum(dp.raxkills) as raxkillstotal, sum(dp.towerkills) as towerkillstotal, sum(dp.assists) as assiststotal, sum(dp.courierkills) as courierkillstotal, sum(dp.creepdenies) as creepdeniestotal, sum(dp.creepkills) as creepkillstotal, sum(dp.neutralkills) as neutralkillstotal, sum(dp.deaths) as deathstotal, sum(dp.kills) as killstotal, "+LeavVar+", avg(dp.raxkills) as raxkills,avg(dp.towerkills) as towerkills, avg(dp.assists) as assists, avg(dp.creepdenies) as creepdenies, avg(dp.creepkills) as creepkills,avg(dp.neutralkills) as neutralkills, avg(dp.deaths) as deaths, avg(dp.kills) as kills,  count(*) as totgames, SUM(case when((dg.winner = 1 and dp.newcolour < 6) or (dg.winner = 2 and dp.newcolour > 6)) then 1 else 0 end) as wins from gameplayers as gp , [COLOR=#ff0000]scores[/COLOR], dotagames as dg, games as ga,dotaplayers as dp where dg.winner <> 0 and dp.gameid = gp.gameid and dg.gameid = dp.gameid and dp.gameid = ga.id and gp.gameid = dg.gameid and gp.colour = dp.colour [COLOR=#ff0000]and scores.name = gp.name[/COLOR]";
        Query+=" group by gp.name having totgames >= " + mingames + ") as h) as i ORDER BY totalscore desc, name asc";
        string Query2;
    4. компиляция - все ок.
    5. запускаю бота, даю команду !topc
    он мне ответ:
    и таблица пуста.
    гдето чтото не так... помогите пожалуйста найти что не так и исправить
  2. Suicider Старожила

    Сообщения:
    673
    Спасибы:
    117
    Сборка бота GHost:
    Ghost++ 17.1 by w3gh
    Дата начала использования бота:
    12.07.2011
    1. Взял пример у роста с HCL ?
    5. Проблема то в чем?
    Код:
    [Wed Nov 07 16:13:52 2012] [ BNET: test] Админ [test] использовал команду [topc]
    [Wed Nov 07 16:13:52 2012] [ LOCAL: test] /w test Пересчет новых очков, это может занят некоторое время
    [Wed Nov 07 16:13:52 2012] [ LOCAL: test] /w test Очки 0 игроков были пересчитаны
    Комментарии думаю излишне...
  3. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Да я давал нормальный пример с ливами. С HCL я писал только о выводе инфы в игру и лобби, про занесения нечего недобавлял.
  4. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    Твой комментарий не помог адекватному человку.

    Попробуй выполнить свой запрос прямо в админке или где нибудь еще, короче чтобы увидеть результ выполнения запроса.
  5. d.1.s Ньюфаг

    Сообщения:
    8
    Спасибы:
    0
    Дата начала использования бота:
    01.08.2010
    пример брал из темы с отниманием очей за лив.
    проблема в том что не считает очки!
  6. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    Пока ты не выполнишь мои советы, смысла не вижу продолжать тебе помогать.
  7. d.1.s Ньюфаг

    Сообщения:
    8
    Спасибы:
    0
    Дата начала использования бота:
    01.08.2010
    выполнил запрос через пхпадмин
    в документации чтото про переменные в файле php.ini которого нет...
  8. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    Что ты выполняешь то?

    Код:
    select name,server, (" + formula + ") as totalscore from...........
    
    Это выполняй...
  9. d.1.s Ньюфаг

    Сообщения:
    8
    Спасибы:
    0
    Дата начала использования бота:
    01.08.2010
    подставил свою формулу) убрал ковычки...
  10. d.1.s Ньюфаг

    Сообщения:
    8
    Спасибы:
    0
    Дата начала использования бота:
    01.08.2010
    когда выполняю изначальный вариант, выводит 3 столбца,
    когда модифицированый - эту ошибку
  11. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    А теперь изначальный запрос выложи сюда
    И модифицированный
  12. Doterok Старожила

    Сообщения:
    923
    Спасибы:
    171
    Сборка бота GHost:
    Ghost ++ 17.2
    Дата начала использования бота:
    2011
    d.1.s нравится это.
  13. Doterok Старожила

    Сообщения:
    923
    Спасибы:
    171
    Сборка бота GHost:
    Ghost ++ 17.2
    Дата начала использования бота:
    2011
    а вот ещё и бонусы (с)рост
    Код:
    [FONT=Consolas]if(Command == "addpts" && !Payload.empty() && RootAdminCheck)[/FONT]
    [FONT=Consolas]{
    uint32_t count = 0;
    string name,pts,zapros;
    stringstream SS;
    SS << Payload;
     
    while( !SS.eof( ) )
    {
    if(count == 0)
    SS >> name;
    if(count == 1)
    SS >> pts;
    count++;
    }
     
    if(count < 2)
    {
    SendChatCommand("Вы не ввели имя или количество очков!");
    return;
    }
     
    zapros = "UPDATE gameplayers SET dopsc = dopsc +'" + pts + "' WHERE name = '" + name + "' LIMIT 1";
    m_PairedRunQueries.push_back( PairedRunQuery(User, m_GHost->m_DB->ThreadedRunQuery(zapros)));
    SendChatCommand("Вы добавили [" + pts + "] очков игроку [" +name + "]"); [/FONT]
    [FONT=Consolas]}
    [/FONT]
    Код:
    [FONT=Consolas]if(Command == "delpts" && !Payload.empty() && RootAdminCheck)[/FONT]
    [FONT=Consolas]{
    uint32_t count = 0;
    string name,pts,zapros;
    stringstream SS;
    SS << Payload;
     
    while( !SS.eof( ) )
    {
    if(count == 0)
    SS >> name;
    if(count == 1)
    SS >> pts;
    count++;
    }
     
    if(count < 2)
    {
    SendChatCommand("Вы не ввели имя или количество очков!");
    return;
    }
     
    zapros = "UPDATE gameplayers SET dopsc = dopsc -'" + pts + "' WHERE name = '" + name + "' LIMIT 1";
    m_PairedRunQueries.push_back( PairedRunQuery(User, m_GHost->m_DB->ThreadedRunQuery(zapros)));
    SendChatCommand("Вы удалили [" + pts + "] очков игроку [" +name + "]"); [/FONT]
    [FONT=Consolas]}
    [/FONT]
    Begzod и d.1.s нравится это.
  14. d.1.s Ньюфаг

    Сообщения:
    8
    Спасибы:
    0
    Дата начала использования бота:
    01.08.2010
    изначальный(рабочий)
    Код:
    select name,server, (1000) as totalscore from(select *, (kills/deaths) as killdeathratio, (totgames-wins) as losses from (select  gp.name as name,ga.server as server,gp.gameid as gameid, gp.colour as colour, avg(dp.courierkills) as courierkills, sum(dp.raxkills) as raxkillstotal, sum(dp.towerkills) as towerkillstotal, sum(dp.assists) as assiststotal, sum(dp.courierkills) as courierkillstotal, sum(dp.creepdenies) as creepdeniestotal, sum(dp.creepkills) as creepkillstotal, sum(dp.neutralkills) as neutralkillstotal, sum(dp.deaths) as deathstotal, sum(dp.kills) as killstotal, sum(case when((dg.min*60+dg.sec > gp.left+60*5) and (gp.left > 60*5 ) and (gp.leftreason LIKE 'leave')) then 1 else 0 end) as leaves, avg(dp.raxkills) as raxkills,avg(dp.towerkills) as towerkills, avg(dp.assists) as assists, avg(dp.creepdenies) as creepdenies, avg(dp.creepkills) as creepkills,avg(dp.neutralkills) as neutralkills, avg(dp.deaths) as deaths, avg(dp.kills) as kills,  count(*) as totgames, SUM(case when((dg.winner = 1 and dp.newcolour < 6) or (dg.winner = 2 and dp.newcolour > 6)) then 1 else 0 end) as wins from gameplayers as gp , dotagames as dg, games as ga,dotaplayers as dp where dg.winner <> 0 and dp.gameid = gp.gameid and dg.gameid = dp.gameid and dp.gameid = ga.id and gp.gameid = dg.gameid and gp.colour = dp.colour
    group by gp.name having totgames >= " + mingames + ") as h) as i ORDER BY totalscore desc, name asc
    модифицированный(выдает ошибку)
    Код:
    select name,server, (1000+bonuspts) as totalscore from(select *, bonus as bonuspts, (kills/deaths) as killdeathratio, (totgames-wins) as losses from (select scores.bonus as bonus, gp.name as name,ga.server as server,gp.gameid as gameid, gp.colour as colour, avg(dp.courierkills) as courierkills, sum(dp.raxkills) as raxkillstotal, sum(dp.towerkills) as towerkillstotal, sum(dp.assists) as assiststotal, sum(dp.courierkills) as courierkillstotal, sum(dp.creepdenies) as creepdeniestotal, sum(dp.creepkills) as creepkillstotal, sum(dp.neutralkills) as neutralkillstotal, sum(dp.deaths) as deathstotal, sum(dp.kills) as killstotal, sum(case when((dg.min*60+dg.sec > gp.left+60*5) and (gp.left > 60*5 ) and (gp.leftreason LIKE 'leave')) then 1 else 0 end) as leaves, avg(dp.raxkills) as raxkills,avg(dp.towerkills) as towerkills, avg(dp.assists) as assists, avg(dp.creepdenies) as creepdenies, avg(dp.creepkills) as creepkills,avg(dp.neutralkills) as neutralkills, avg(dp.deaths) as deaths, avg(dp.kills) as kills,  count(*) as totgames, SUM(case when((dg.winner = 1 and dp.newcolour < 6) or (dg.winner = 2 and dp.newcolour > 6)) then 1 else 0 end) as wins from gameplayers as gp , scores, dotagames as dg, games as ga,dotaplayers as dp where dg.winner <> 0 and dp.gameid = gp.gameid and dg.gameid = dp.gameid and dp.gameid = ga.id and gp.gameid = dg.gameid and gp.colour = dp.colour and scores.name = gp.name
    group by gp.name having totgames >= " + mingames + ") as h) as i ORDER BY totalscore desc, name asc
    гм... странное дело... выполнил запрос, он не дал ошибку, выдал все что нужно,
    выполнил его же еще раз, выдал пустой результат, выполнил еще раз - опять ошибка...
  15. d.1.s Ньюфаг

    Сообщения:
    8
    Спасибы:
    0
    Дата начала использования бота:
    01.08.2010
    кажется я понял в чем дело(
    Код:
    bool MySQLCalculateScores( void *conn, string *error, uint32_t botid, string formula, string mingames )
    {
        bool Success = false;
     
        string LeavVar = "sum(case when((dg.min*60+dg.sec > gp.left+60*5) and (gp.left > 60*5 ) and (gp.leftreason LIKE 'leave')) then 1 else 0 end) as leaves";
        string Query = "select name,server, (" + formula + ") as totalscore from(select *, bonus as bonuspts, (kills/deaths) as killdeathratio, (totgames-wins) as losses from (select scores.bonus as bonus, gp.name as name,ga.server as server,gp.gameid as gameid, gp.colour as colour, avg(dp.courierkills) as courierkills, sum(dp.raxkills) as raxkillstotal, sum(dp.towerkills) as towerkillstotal, sum(dp.assists) as assiststotal, sum(dp.courierkills) as courierkillstotal, sum(dp.creepdenies) as creepdeniestotal, sum(dp.creepkills) as creepkillstotal, sum(dp.neutralkills) as neutralkillstotal, sum(dp.deaths) as deathstotal, sum(dp.kills) as killstotal, "+LeavVar+", avg(dp.raxkills) as raxkills,avg(dp.towerkills) as towerkills, avg(dp.assists) as assists, avg(dp.creepdenies) as creepdenies, avg(dp.creepkills) as creepkills,avg(dp.neutralkills) as neutralkills, avg(dp.deaths) as deaths, avg(dp.kills) as kills,  count(*) as totgames, SUM(case when((dg.winner = 1 and dp.newcolour < 6) or (dg.winner = 2 and dp.newcolour > 6)) then 1 else 0 end) as wins from gameplayers as gp , scores, dotagames as dg, games as ga,dotaplayers as dp where dg.winner <> 0 and dp.gameid = gp.gameid and dg.gameid = dp.gameid and dp.gameid = ga.id and gp.gameid = dg.gameid and gp.colour = dp.colour and scores.name = gp.name";
        Query+=" group by gp.name having totgames >= " + mingames + ") as h) as i ORDER BY totalscore desc, name asc";
        string Query2;
        string Query3 = "DELETE from scores";
        string name;
        string server;
        double Score = -100000.0;
     
        vector<string> names;
        vector<double> scores;
        vector<string> servers;
     
        if( mysql_real_query( (MYSQL *)conn, Query3.c_str( ), Query3.size( ) ) != 0 )
            *error = mysql_error( (MYSQL *)conn );
     
        if( mysql_real_query( (MYSQL *)conn, Query.c_str( ), Query.size( ) ) != 0 )
            *error = mysql_error( (MYSQL *)conn );
    у меня столбец бонусов находится в таблице scores которая перед занесением в нее новых значений...чистится...
    и следовательно запрос из пустой таблицы дает пустой результат...
    тут по ходу придется в другой таблице хранить бонусы...
  16. Suicider Старожила

    Сообщения:
    673
    Спасибы:
    117
    Сборка бота GHost:
    Ghost++ 17.1 by w3gh
    Дата начала использования бота:
    12.07.2011
    в gameplayers
  17. Doterok Старожила

    Сообщения:
    923
    Спасибы:
    171
    Сборка бота GHost:
    Ghost ++ 17.2
    Дата начала использования бота:
    2011
    добавь в gameplayers колонку dopsc
    затем в ghostdbmysql
    в
    Код:
    bool MySQLCalculateScores
    После
    Код:
     sum(dp.assists) as assiststotal,
    добавь
    Код:
    sum(gp.dopsc) as dopsc
    ну и пиши в гп бонусы, у меня все отлично берет ещё юзаю роста команды что бы не парится
    зы что бы не было хныков, об авторских правах я изначально пруф давал чел не понял "D
  18. d.1.s Ньюфаг

    Сообщения:
    8
    Спасибы:
    0
    Дата начала использования бота:
    01.08.2010
    с этим я справился, спасибо, все работает.
    не ответил сразу потому что в некоторых случаях бонус не засчитывался...
    щас со всем разобрался: если игра не была закончена чьей либо победой, то бонус не засчитывается.
    по поводу команд:
    зачем создавать 2? можно же так:
    !addpts nick 300
    !addpts nick -200
    ///////////////////////////////////
    спасибо всем кто принял участие в обсуждении и пытался помочь, и особое спасибо кто ткунул носом;)
  19. Suicider Старожила

    Сообщения:
    673
    Спасибы:
    117
    Сборка бота GHost:
    Ghost++ 17.1 by w3gh
    Дата начала использования бота:
    12.07.2011
    А ты сделай чтобы при ливе всей команды, победа засчитывалась противникам -> бонусы теряться не будут
  20. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Не ну теперь, имея кода команд, ты можешь выебнутся и так сказать, только вот до этого, ты просто просил кода, неведая никаких проблем...
    В след раз делай так:
    придумал команду -> открыл компилятор -> создал код -> скомпилировал -> выебуешься :jump:
    А меня как просили, изначально написав, если ты почитаешь темы, создать команду АДДПТС, а потом ДЕЛПТС (вот как попросили, так я их и назвал)
    Begzod и Suicider нравится это.