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

Префикс к названии игры.

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

  1. Ev1lArthaS Парнишка с небывалым умом

    Сообщения:
    36
    Спасибы:
    3
    Доброго времени суток, возникла идея о добавлении префикса к названии игры, например
    x: !pub go game
    bot: creating public game named 'NOOBHOST' go game , owner X
    и в списке игр игра выглядит так -
    'NOOBHOST' go game
    Чтобы реализовать эту идею изменил строку в команде !PUB
    Код:
    string GameName = Payload;
    
    на
    Код:
    string GameName = " 'NOOBHOST' " + Payload;
    
    Получилось, теперь при создании игр к ним прикрепляется префикс NOOBHOST. Но в GhostOne есть такое чудо как команда !Pub (без значения), в этом случае бот берет название последней игры и добавляет в конец # <число> . Попробовал набрать !pub, вот что вышло в списке игр:
    'NOOBHOST' #1
    'NOOBHOST' #2
    То есть само введеное название исчезло.
    Решил порыться, поискать в чем-же трабла. Нашел: приведенный ниже кусок кода отвечает за команду !Pub (без значения)
    Код:
    if (Payload.empty())
    {
    idx = GameName.length()-1;
    if (idx>=2)
    if (GameName.at(idx-2)=='#')
    idx = idx-1;
    else
    if (GameName.at(idx-1)=='#')
    idx = idx;
    else
    idx = 0;
     
    // idx = 0, no Game Nr found in gamename
    if (idx == 0)
    {
    GameNr = "0";
    GameName = GameName + " #";
    }
    else
    {
    GameNr = GameName.substr(idx,GameName.length()-idx);
    GameName = GameName.substr(0,idx);
    }
    stringstream SS;
    SS << GameNr;
    SS >> Nr;
    Nr ++;
    if (Nr>20)
    Nr = 1;
    GameNr = UTIL_ToString(Nr);
    GameName = GameName + GameNr;
    }
    
    Как видно на последней строчке при рехосте берется название последней игры и номер игры (GameNr), трабла в том что в измененной нами строке
    Код:
    string GameName = " 'NOOBHOST' " + Payload;
    
    Payload не берется в учет при наборе !Pub, поэтому получается что при рехосте префикс 'NOOBHOST' и номер есть, а самого названия нет. Как исправить? Заранее благодарю
    PS Ghost one 1.7.266
  2. Suicider Старожила

    Сообщения:
    673
    Спасибы:
    117
    Сборка бота GHost:
    Ghost++ 17.1 by w3gh
    Дата начала использования бота:
    12.07.2011
    Весь код команды !pub выложи (из bnet.cpp и game.cpp), под соответствующими заглавиями (название исходного кода, откуда взят код команды)
  3. Ev1lArthaS Парнишка с небывалым умом

    Сообщения:
    36
    Спасибы:
    3
    Ghost one 1.7.266; BNET.CPP , строка 3991
    Код:
    
    //
    // !PUB (host public game)
    // !P
    //
    
    if( Command == "pub" || Command == "p" )
    {
    if (!CMDCheck(CMD_host, AdminAccess))
    {
    QueueChatCommand(m_GHost->m_Language->YouDontHaveAccessToThatCommand( ), User, Whisper);
    return;
    }
    
    if (m_GHost->m_LastGameName=="" && Payload.empty())
    {
    QueueChatCommand("No game has been hosted till now, specify a name", User, Whisper);
    return;
    }
    
      string GameName = Payload; //TA SAMAYA STROCHKA
    if (GameName.empty())
    GameName = m_GHost->m_LastGameName; 
    string GameNr = string();
    uint32_t idx = 0;
    uint32_t Nr = 0;
    /*
    if (!GameName.empty() && GameName==m_GHost->m_LastGameName)
    {
    QueueChatCommand("You can't use the same name!", User, Whisper);
    return;
    }
    */
    if (Payload.empty()) 
    {
    idx = GameName.length()-1;
    if (idx>=2)
    if (GameName.at(idx-2)=='#')
    idx = idx-1;
    else
    if (GameName.at(idx-1)=='#')
    idx = idx;
    else
    idx = 0;
    
    // idx = 0, no Game Nr found in gamename
    if (idx == 0)
    {
    GameNr = "0";
    GameName = GameName + " #";
    }
    else
    {
    GameNr = GameName.substr(idx,GameName.length()-idx);
    GameName = GameName.substr(0,idx);
    }
    stringstream SS;
    SS << GameNr;
    SS >> Nr;
    Nr ++;
    if (Nr>20)
    Nr = 1;
    GameNr = UTIL_ToString(Nr);
    GameName = GameName + GameNr;
    }
    m_GHost->m_QuietRehost = false;
    
    // adding the game creator as friend
    bool cf = false;
    if (m_GHost->m_addcreatorasfriendonhost && !IsFriend(User))
    {
    QueueChatCommand( "/f a "+User);
    cf = true;
    }
    
    m_GHost->CreateGame( m_GHost->m_Map, GAME_PUBLIC, false, GameName, User, User, m_Server, Whisper );
    if (m_GHost->m_addcreatorasfriendonhost && !cf && m_GHost->m_CurrentGame)
    m_GHost->m_CurrentGame->m_CreatorAsFriend = false;
    
    }
    
  4. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Я реализовал такую плюшку давненько уже (месяц-два).
    Вывел даже в конфиг:
    bot_pristavka =
    все автохосты создают с ним и даже при ручном пабе тоже. Нужно просто малость вам капнуть и проставить везде переменные.
    Ev1lArthaS нравится это.
  5. Ev1lArthaS Парнишка с небывалым умом

    Сообщения:
    36
    Спасибы:
    3
    Просвети, о великий.
    Какие переменные?
  6. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    В автохосте, при выборке имени игры (у меня из файла берет рандомное название + ставит приставку)
    Это в Ghost.cpp 1 место поищи, щас без исходников я не покажу где.
    В game.cpp в команду !pub встроить, тоже не сложно.
    Вывести переменую в конфиг через ghost.cpp / ghost.h / config.cfg (по аналогии с любой другой переменной)
    Ev1lArthaS нравится это.
  7. Suicider Старожила

    Сообщения:
    673
    Спасибы:
    117
    Сборка бота GHost:
    Ghost++ 17.1 by w3gh
    Дата начала использования бота:
    12.07.2011
    Код:
     
    //
    // !PUB (host public game)
    // !P
    //
     
    if( (Command == "pub" || Command == "p") && !Payload.empty() )
    {
    if (!CMDCheck(CMD_host, AdminAccess))
    {
    QueueChatCommand(m_GHost->m_Language->YouDontHaveAccessToThatCommand( ), User, Whisper);
    return;
    }
     
      string GameName = "Твой префикс " + Payload;
    m_GHost->CreateGame( m_GHost->m_Map, GAME_PUBLIC, false, GameName, User, User, m_Server, Whisper );
     
    }
    
    Написал с головы - сырцов под рукой нет
    Ev1lArthaS и ROB4ik нравится это.
  8. Ev1lArthaS Парнишка с небывалым умом

    Сообщения:
    36
    Спасибы:
    3
    тоже самое, при вводе команды !pub без payload'а в названии созданной игры получаю только перфикс и #2 (номер) , а само название предыдущей игры пропадает.
  9. Suicider Старожила

    Сообщения:
    673
    Спасибы:
    117
    Сборка бота GHost:
    Ghost++ 17.1 by w3gh
    Дата начала использования бота:
    12.07.2011
    Компилировал? Если так же (что не должно быть так), попробуй снова (код исправил)
  10. Ev1lArthaS Парнишка с небывалым умом

    Сообщения:
    36
    Спасибы:
    3
    конечно компилировал, вот скрины результатов:
    [IMG]
    как видно, префикс [TEST] работает если создавать через !паб <название>
    [IMG]
    потом пишем анхост, и пишем !Pub без значения, получаем название игры [TEST] , то есть префикс есть - названия прошлой игры нет, да и номер исчез (о.О)
    [IMG]
  11. Suicider Старожила

    Сообщения:
    673
    Спасибы:
    117
    Сборка бота GHost:
    Ghost++ 17.1 by w3gh
    Дата начала использования бота:
    12.07.2011
    Ммм... Второй вариант кода вставлял? Потому что в команде стоит проверка на пустоту после команды (если после команды !pub пусто, то команда не выполняется)
    Если снова чтот не так... Отпишусь, когда сырцы будут под рукой
    Ev1lArthaS нравится это.
  12. Ev1lArthaS Парнишка с небывалым умом

    Сообщения:
    36
    Спасибы:
    3
    я вставил второй вариант кода без !payload empty.
    Жду ответа, спасибо.
  13. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    if (m_GHost->m_LastGameName=="" && Payload.empty())

    вот это можно просто упростить до

    if(Command == "pub" && !Payload.empty() &&...
    Ev1lArthaS нравится это.
  14. Ev1lArthaS Парнишка с небывалым умом

    Сообщения:
    36
    Спасибы:
    3
    а если скину тебе исходники, поможешь? :)
  15. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Я не из таких))) Была бы команда нужна какая-то это ладно. А чет искать рыться и переделывать ... не, мне просто лень))
  16. Ev1lArthaS Парнишка с небывалым умом

    Сообщения:
    36
    Спасибы:
    3
    сделал как ты сказал, только использовал для этого language.cpp, language.h, language.cfg, и вставил переменные в bnet.cpp, получилось, только одна небольшая проблема, при пабе игры с названием 'gogo' игра хостуется нормально, с префиксом, если после этого использовать комадну !pub <без значения> то игра тоже нормально хостуется, префикс есть и номер игры тоже есть, а вот в третий раз получаю название [PREFIX] gogo #1 #1 ,
    как исправить?
  17. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Это уже что-то со счетчиком
  18. Ev1lArthaS Парнишка с небывалым умом

    Сообщения:
    36
    Спасибы:
    3
    У тебя , при твоем BOT_PRISTAVKA счетчик норм пашет или так-же?
  19. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    у меня нет счетчика... меня бесит +1 +2 / #1 #2
    Ev1lArthaS нравится это.
  20. Suicider Старожила

    Сообщения:
    673
    Спасибы:
    117
    Сборка бота GHost:
    Ghost++ 17.1 by w3gh
    Дата начала использования бота:
    12.07.2011
    Код:
     
    //
    // !PUB (host public game)
    // !P
    //
     
    if( (Command == "pub" || Command == "p") && !Payload.empty() )
    {
    if (!CMDCheck(CMD_host, AdminAccess))
    {
    QueueChatCommand(m_GHost->m_Language->YouDontHaveAccessToThatCommand( ), User, Whisper);
    return;
    }
    if (Payload.lenght() < 2)
    {
    QueueChatCommand("Название игры должно содержать более 1го символа", User, Whisper);
    return;
    }
     
     
      string GameName = "Твой префикс " + Payload;
    m_GHost->CreateGame( m_GHost->m_Map, GAME_PUBLIC, false, GameName, User, User, m_Server, Whisper );
     
    }
    
    Вот Update, попробуй ещё раз... Счетчика вообще нет... Ты скорее всего дефолт команду не закоментировал, вот отсюда и ошибка!
    Ev1lArthaS нравится это.