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

Дополнительные команды (Перевод команд на русский)

Тема в разделе 'Кодинг/Собственные решения', создана пользователем MooDBlooD, 12 сен 2010.

  1. MooDBlooD Ньюфаг

    Сообщения:
    56
    Спасибы:
    1
    Собственно проблема в том, что не могу пока-что(так как новичек в С++) воссоздать функцию ввода русского как команду.

    Вот у меня сейчас такая делема.
    Та инструкция по которой менялся вывод строк про МС(Это по теме вывода строк), эта функция делает вывод текста.
    А какйю функцию лучше создать для того чтобы через неё принимался русский текст.
    Просто проблема в том, что я в С++ не очень то шарю, посему и не могу самостоятельно спроэктировать функцию для ввода.
    А как я понимаю функции ввода и вывода не равнозначны, таким образом используя функцию вывода я думаю не получится спроэктировать функцию воосоздания проэкта команды для хоста...
    Проще говоря я не особо понял всю эту тему пока!
    Возьмем к примеру перевод команды ПИНГ!
    Код:
                //
                // !PING
                // !P
                //
    
                if( Command == "ping" || Command == "p" )
                {
                    // kick players with ping higher than payload if payload isn't empty
                    // we only do this if the game hasn't started since we don't want to kick players from a game in progress
    
                    uint32_t Kicked = 0;
                    uint32_t KickPing = 0;
                    string Pings;
                    string CN = string();
    
                    if (!Payload.empty())
                    {
                        CGamePlayer *LastMatch = NULL;
                        uint32_t Matches = GetPlayerFromNamePartial( Payload , &LastMatch );
    
                        if( Matches == 0 )
                            CONSOLE_Print("No matches");
    
                        else if( Matches == 1 )
                        {
                            Pings = LastMatch->GetName( );
                            Pings +=": ";
                            if( LastMatch->GetNumPings( ) > 0 )
                            {
                                Pings += UTIL_ToString( LastMatch->GetPing( m_GHost->m_LCPings ) );
                                Pings += m_GHost->m_Language->Ping();
                            } else
                                Pings += "N/A";
    
                            Pings += " (";
                            CN = LastMatch->GetCountry();
                            Pings += CN;
                            Pings += ")";
                            SendAllChat(Pings);
                            return HideCommand;
                        }
                        else
                            CONSOLE_Print("Found more than one match");
                    }
    
                    if( !m_GameLoading && !m_GameLoaded && !Payload.empty( ) )
                        KickPing = UTIL_ToUInt32( Payload );
    
                    // copy the m_Players vector so we can sort by descending ping so it's easier to find players with high pings
    
                    vector<CGamePlayer *> SortedPlayers = m_Players;
                    sort( SortedPlayers.begin( ), SortedPlayers.end( ), CGamePlayerSortDescByPing( ) );
    
                    for( vector<CGamePlayer *> :: iterator i = SortedPlayers.begin( ); i != SortedPlayers.end( ); i++ )
                    {
                        Pings += (*i)->GetNameTerminated( );
                        Pings += ": ";
    
                        if( (*i)->GetNumPings( ) > 0 )
                        {
                            Pings += UTIL_ToString( (*i)->GetPing( m_GHost->m_LCPings ) );
    
                            if( !m_GameLoading && !m_GameLoaded && !(*i)->GetReserved( ) && KickPing > 0 && (*i)->GetPing( m_GHost->m_LCPings ) > KickPing )
                            {
                                (*i)->SetDeleteMe( true );
                                (*i)->SetLeftReason( "was kicked for excessive ping " + UTIL_ToString( (*i)->GetPing( m_GHost->m_LCPings ) ) + " > " + UTIL_ToString( KickPing ) );
                                (*i)->SetLeftCode( PLAYERLEAVE_LOBBY );
                                OpenSlot( GetSIDFromPID( (*i)->GetPID( ) ), false );
                                Kicked++;
                            }
    
                            Pings += "ms";
                        }
                        else
                            Pings += "N/A";
    
                        if( i != SortedPlayers.end( ) - 1 )
                            Pings += ", ";
                    }
    
                    SendAllChat( Pings );
    
                    m_GHost->UDPChatSend("|lobbyupdate");
    
                    if( Kicked > 0 )
                        SendAllChat( m_GHost->m_Language->KickingPlayersWithPingsGreaterThan( UTIL_ToString( Kicked ), UTIL_ToString( KickPing ) ) );
                    return HideCommand;
                }
    
    Из исходника мы видим что есть 2 команды !ping и !p
    В соответствии с этим мы пытаемся добавить сюда команду !пинг.
    Если я правильно все понял, то функцию нам надо строить в самом начале.
    Таким образом мы забираем только строчку
    Код:
                if( Command == "ping" || Command == "p" )
    Тут нам надо добавить функцию, благодаря которой будет команда работать с русского...
    Код:
                if( Command == "ping" || Command == "p" || Command == "#F#")
    Где "#F#" - это наша функция.
    Теперь звучит вопрос...
    Та-да!
    А как построить функцию ввода человеку, который только несколько дней пытается вникнуть в суть С++?

    P.S. Данный вопрос перенесен из другой темы, где обсуждалось абсолютно другое!
  2. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    Функцию вставлять так:
    В файле например bnet.cpp изменяем паб, опишу как будет.
    В файл language.h добавляем после всех стрингов значение
    Код:
    	string cmdPUB( );
    Потом в language.cpp добавляем в конец
    Код:
    string CLanguage :: cmdPUB( )
    {
    	string Out = m_CFG->GetString( "lang_1010", "lang_1010" );
    	return Out;
    }
    Далее добавляем в файл языка (напр. russian.cfg) в конец
    Код:
    lang_1010 = паб
    И наконец добавляем алиас к комманде, или вовсе заменяем, добавить надо || Command == m_GHost->m_Language->cmdPUB(), чтобы получилось так
    Код:
    if( Command == "pub" || Command == "p" || Command == m_GHost->m_Language->cmdPUB() )
    Где cmdPUB() название ф-ии
  3. Deals Старожила

    Сообщения:
    784
    Спасибы:
    21
    Сборка бота GHost:
    Ghost One 1.7.266
    Skype:
    Мой статус
    А еще проще перевести в UTF-8 написать || Command = "паб" ) и перевести назад в ANSI

    Выйдет: || Command = "паб" )
  4. MooDBlooD Ньюфаг

    Сообщения:
    56
    Спасибы:
    1
    Чего-то у меня как-то нифига не получается...
    Вот что я делаю:
    game.cpp
    Код:
    	//
    	// !START
    	//
    
    	if( (Command == "start" || Command == m_GHost->m_Language->cmdstart() ) && !m_CountDownStarted && m_GHost->m_AutoHostAllowStart && m_AutoStartPlayers>0 )
    
    language.cpp
    Код:
    string CLanguage :: cmdstart( )
    {
       string Out = m_CFG->GetString( "lang_1103", "lang_1103" );
       return Out;
    }
    
    language.h
    Код:
    	string cmdstart( );
    
    language.cfg
    Код:
    lang_1103 = старт
    
    bnet.cpp(врриант 1)
    Код:
    				//
    				// !START
    				//
    
    				if( Command == "start" || Command == m_GHost->m_Language->cmdstart()  && m_GHost->m_CurrentGame && !m_GHost->m_CurrentGame->GetCountDownStarted( ) && m_GHost->m_CurrentGame->GetNumPlayers( ) > 0 )
    
    bnet.cpp(врриант 2)
    Код:
    				//
    				// !START
    				//
    
    				if( (Command == "start" || Command == m_GHost->m_Language->cmdstart() ) && m_GHost->m_CurrentGame && !m_GHost->m_CurrentGame->GetCountDownStarted( ) && m_GHost->m_CurrentGame->GetNumPlayers( ) > 0 )
    
    Собственно 1 варриант это просто добавление функции, а второй - это добавление функции с занесением команд в скобки!
    Пробовал в игре писать !старт, и ничего.
    Команда !start работает при всех раскладах...
    Может функция не подходит для ввода и нужно искать другую?
  5. Deals Старожила

    Сообщения:
    784
    Спасибы:
    21
    Сборка бота GHost:
    Ghost One 1.7.266
    Skype:
    Мой статус
    Попробуй как я написал.
  6. JiLiZART Администрация

    Сообщения:
    815
    Спасибы:
    35
    Сборка бота GHost:
    Ghost++ 17.1
    Дата начала использования бота:
    12.12.04
    а можно глупый вопрос? ты пересобрал бота после внесения изменений?
  7. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    В скобки заносить ничего не надо, я тебе дал рабочий код с моих ихсодников, скомпилируй и будет работать!
    Ему надо как я понял динамически изменяющуюся комманду, а эта меняться будет только после перекомпиляции.
  8. MooDBlooD Ньюфаг

    Сообщения:
    56
    Спасибы:
    1
    Ну смотри... Я всё это проделал, а команда !старт не работает.
    Вставлял функцию как в bnet.cpp, так и в game.cpp
    Я сам не понимаю проблемы! =(
    Сейчас я конечно уже не стану копаться в исходниках, так как на данный момент напрягать рефлекторно-мыслительные части мозга очень сильно ломает... А вот после сна (погружение в который предполагается в ближайшие 2-3 часа) я думаю ещё немного поламаю голову над этим моментом...
    И всё же... по команде старт, как мне быть, если в 1 варрианте я сделал всё так как требовалось, но ничего не получилось...
    Посмотри пожалуйста, может я что-то пропустил...
  9. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    Просто сделай каждый шаг точ в точ как я описал, и скомпилируй, получится 100%
  10. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    в случае старта если писать без скобок то когда пишеш "!start" не будет проверяться условие :
    Код:
    m_GHost->m_CurrentGame && !m_GHost->m_CurrentGame->GetCountDownStarted( ) && m_GHost->m_CurrentGame->GetNumPlayers( ) > 0
    зы:если ты всё правельно компилировал мб ты не написал старт в lang_1103 ? или написал не в той кодировке..
    попробуй написать в lang_1103 например : "start12" и скомпилировать 2 вариант.
  11. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    А, я просто вначале неправильно понял, если есть условия && то надо комманды брать в скобки, я перевёл старт, всё работает.
  12. MooDBlooD Ньюфаг

    Сообщения:
    56
    Спасибы:
    1
    Так мне всётаки какой файл менять на предмет построения функции?
    game.cpp или bnet.cpp?
  13. MooDBlooD Ньюфаг

    Сообщения:
    56
    Спасибы:
    1
    Короче паб нормально выводится.
    Подставляю функцию в bnet.cpp с командой старт, и ничего не происходит.
    Может всётаки уточнить по этой функции определение, ведь делаю всё как написано.
    Так как подставляем функцию команды в ту строчку, где уже есть исполняющая функция, то по этому команды закрываю в скобки!
  14. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    Я описывал про game.cpp
  15. Deals Старожила

    Сообщения:
    784
    Спасибы:
    21
    Сборка бота GHost:
    Ghost One 1.7.266
    Skype:
    Мой статус
    А вот я насколько понял что автор ищет функцию которая может принимать русские комманды.
    Как по мне проще ее перевести UTF-8 -> ANSI.
  16. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    Если хочешь перевести и забить то проще, а так она будет динамически изменяемой, в чём её плюс. Впринципе можно применить оба варианта сразу, дав комманде динамическую переменную откуда она берёт комманду, а в анси оставить постоянную.
  17. MooDBlooD Ньюфаг

    Сообщения:
    56
    Спасибы:
    1
    Дак в том то и шутка, что команды в bnet.cpp тоже меняют некоторые моменты...
    А в game.cpp я добавлял команду. Только тоже не хотела работать. Сейчас заного прописал функцию в game.cpp. Позже при возможности прокомпилирую и отпишусь.
    Если не получится и в этот раз, то попробую изменить функцию... Может прокатит!
  18. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    То что я тебе написал рабочее на 100%, делай шаг за шагом
  19. MooDBlooD Ньюфаг

    Сообщения:
    56
    Спасибы:
    1
    Ндя... чет у меня руки кривоватые какие то...
    Вроде всё делал так как надо, а не заработало с первого раза...
    Щас вроде всё норм! =)
  20. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    Бывает =)