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

Создаём комманду для старта по голосованию.

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

  1. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    Итак начнём. Сразу говорю что описанный ниже способ протестирован и 100% работает на Ghost One 1.7.256

    Нам понадобится всего 3 файла: game.cpp, game_base.h, gameplayer.h

    Сначала идём в файл game.cpp

    Находим
    Код:
    /*********************
    	* NON ADMIN COMMANDS *
    	*********************/
    И ниже вставляем код:
    Код:
    			//
    			// !VSTART
    			//
    
    			if( Command == "vstart" && !player->GetStartVote( ) && !m_CountDownStarted && !m_GameLoaded)
    			{
    
    				ReCalculateTeams();
    				if (m_Team1<1 || m_Team2<1)
    				{
    					SendAllChat("Невозможно стартовать игру с пустой коммандой противника!");
    					return HideCommand;
    				}
    
    				if (m_StartVotePlayer.empty())
    				{
    					for( vector<CGamePlayer *> :: iterator i = m_Players.begin( ); i != m_Players.end( ); i++ )
    						(*i)->SetStartVote( false );
    					m_StartVotePlayer = player->GetName();
    					m_StartedStartVoteTime = GetTime();
    				}
    				player->SetStartVote( true );
    				uint32_t VotesNeeded = (uint32_t)ceil ( GetNumHumanPlayers( )  * (float)100 );
    				if (VotesNeeded>GetNumHumanPlayers())
    					VotesNeeded = GetNumHumanPlayers();
    				uint32_t Votes = 0;
    
    				for( vector<CGamePlayer *> :: iterator i = m_Players.begin( ); i != m_Players.end( ); i++ )
    				{
    					if( (*i)->GetStartVote( ) )
    						Votes++;
    				}
    
    				if( Votes >= VotesNeeded )
    				{
    					SendAllChat("Игра начнётся через 10 секунд!");
    						if( Votes >= VotesNeeded )
    							StartCountDown( true );
    						else
    						{
    							if( GetTicks( ) - m_LastPlayerLeaveTicks >= 2000 )
    								StartCountDown( false );
    							else
    								SendAllChat( m_GHost->m_Language->CountDownAbortedSomeoneLeftRecently( ) );
    						}
    
    					m_StartVotePlayer.clear( );
    					m_StartedStartVoteTime = 0;
    				}
    				else
    					SendAllChat( User+" проголосовал за немедленное начало старта [" + UTIL_ToString( Votes )+"/"+ UTIL_ToString(VotesNeeded)+"] "+string( 1, m_GHost->m_CommandTrigger )+"vstart для согласия старта");
    			}
    
    Далее идём в файл game_base.h

    Ищем:
    Код:
    	string m_RmkVotePlayer;							// the player who started the rmk vote
    Ниже вставляем:
    Код:
    	string m_StartVotePlayer;							// the player who started the start vote	ADDED 
    Ищем:
    Код:
    	uint32_t m_StartedRmkVoteTime;					// GetTime when the rmk vote was started
    Ниже вставляем:
    Код:
    	uint32_t m_StartedStartVoteTime;					// GetTime when the start vote was started	ADDED
    И наконец идём в последний файл gameplayer.h

    Ищем:
    Код:
    	bool m_RmkVote;								// if the player voted to rmk or not
    Ниже вставляем:
    Код:
    	bool m_StartVote;								// if the player voted to start or not	ADDED
    Ищем:
    Код:
    	bool GetRmkVote( )							{ return m_RmkVote; }
    Ниже вставляем:
    Код:
    	bool GetStartVote( )							{ return m_StartVote; }	//ADDED 
    Ищем:
    Код:
    	void SetRmkVote( bool nRmkVote )										{ m_RmkVote = nRmkVote; }
    Ниже вставляем:
    Код:
    	void SetStartVote( bool nStartVote )										{ m_StartVote = nStartVote; }	//ADDED 
    Вот собственно и всё, компилим и наслаждаемся, тестировал не долго, набрал 2 комманды в доте по 3 человека и все написали !vstart и игра стартовала.

    P.s. тестил не много, если будут какие проблемы - пишите сюда, будем решать.
    Doterok нравится это.
  2. MooDBlooD Ньюфаг

    Сообщения:
    56
    Спасибы:
    1
    Прости, я заметил в коде символы в неправильной кодировке.
    У меня есть предпочтение фразы вывести в language.cfg
    Не мог бы ты перевести на русский то, что там написано?
    Собственно строки:
    Код:
                {
                   SendAllChat("Невозможно стартовать игру с пустой коммандой противника!");
                   return HideCommand;
                }
    Код:
                {
                   SendAllChat("Игра начнётся через 10 секунд!");
                      if( Votes >= VotesNeeded )
    Код:
                   SendAllChat( User+" проголосовал за немедленное начало старта [" + UTIL_ToString( Votes )+"/"+ UTIL_ToString(VotesNeeded)+"] "+string( 1, m_GHost->m_CommandTrigger )+"vstart для согласия старта");
  3. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    Кодировка наоборот правильная, скомпилишь будет выводится по русски.
    Лучше оставь как есть в 1 посте, так будет лучше именно в этой комманде.
    Вот перевод на рус:
    Код:
    			//
    			// !VSTART
    			//
    
    			if( Command == "vstart" && !player->GetStartVote( ) && !m_CountDownStarted && !m_GameLoaded)
    			{
    
    				ReCalculateTeams();
    				if (m_Team1<1 || m_Team2<1)
    				{
    					SendAllChat("Невозможно стартовать игру с пустой коммандой противника!");
    					return HideCommand;
    				}
    
    				if (m_StartVotePlayer.empty())
    				{
    					for( vector<CGamePlayer *> :: iterator i = m_Players.begin( ); i != m_Players.end( ); i++ )
    						(*i)->SetStartVote( false );
    					m_StartVotePlayer = player->GetName();
    					m_StartedStartVoteTime = GetTime();
    				}
    				player->SetStartVote( true );
    				uint32_t VotesNeeded = (uint32_t)ceil( ( GetNumHumanPlayers( ) - 1 ) * (float)100 );
    				if (VotesNeeded>GetNumHumanPlayers())
    					VotesNeeded = GetNumHumanPlayers();
    				uint32_t Votes = 0;
    
    				for( vector<CGamePlayer *> :: iterator i = m_Players.begin( ); i != m_Players.end( ); i++ )
    				{
    					if( (*i)->GetStartVote( ) )
    						Votes++;
    				}
    
    				if( Votes >= VotesNeeded )
    				{
    					SendAllChat("Игра начнётся через 10 секунд!");
    						if( Votes >= VotesNeeded )
    							StartCountDown( true );
    						else
    						{
    							if( GetTicks( ) - m_LastPlayerLeaveTicks >= 2000 )
    								StartCountDown( false );
    							else
    								SendAllChat( m_GHost->m_Language->CountDownAbortedSomeoneLeftRecently( ) );
    						}
    
    					m_StartVotePlayer.clear( );
    					m_StartedStartVoteTime = 0;
    				}
    				else
    					SendAllChat( User+" проголосовал за немедленное начало старта [" + UTIL_ToString( Votes )+"/"+ UTIL_ToString(VotesNeeded)+"] "+string( 1, m_GHost->m_CommandTrigger )+"vstart для согласия старта");
    			}
    
  4. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    хех =) правельная не правельная хД
    кодировка не читабельна это да..
    но если у меня компилятор поддерживает утф? он будет выводить эти крякозябры...
  5. MooDBlooD Ньюфаг

    Сообщения:
    56
    Спасибы:
    1
    Не, я просто вместо руских предложений внесу изменения путем внедрения команды.
    Пусть это будет и немногим долще, и процесс работы более ёмкий, зато у меня все эти значения в последствии смогут меяться на уровне редактирования конфига!
    Уже усвоил, что это проще всего! =)
  6. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    Да, я это всегда говорил =))
    Приятно, что уже есть последователи мои в этой идее =)
  7. D-MiLIR Ньюфаг

    Сообщения:
    109
    Спасибы:
    0
    Меня интересует текст который бот будет писать в лоббе, а то на форуме иероглифы. Пример SendAllChat("Невозможно стартовать РёРіСЂСѓ СЃ пустой коммандой противника!");
  8. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    Выше я уже писал всё что будет бот писать, конкретно это
    Код:
    SendAllChat("Невозможно стартовать игру с пустой коммандой противника!");
  9. D-MiLIR Ньюфаг

    Сообщения:
    109
    Спасибы:
    0
    Странно у меня почему то не работает o_O
  10. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    в чём именно проблема?
    Ты хоть компилировал? xD
  11. D-MiLIR Ньюфаг

    Сообщения:
    109
    Спасибы:
    0
    Вот лог компиляции
    Код:
    1>------ Построение начато: проект: ghost, Конфигурация: Release MySQL Win32 ------
    1>Компиляция...
    1>game.cpp
    1>.\game.cpp(5728) : warning C4566: символ, представленный универсальным именем символа  "\uFEFF", невозможно представить в текущей кодовой странице (1251)
    1>Компоновка...
    1>Создание кода
    1>Создание кода завершено
    1>Внедрение манифеста...
    1>Журнал построения был сохранен в "file://c:\Documents and Settings\MoZG\Мои документы\ReceivedFiles\NightBoT\GHostOne_v1.7.266\GHostOne_v1.7.266\GHostOne\ghost\Release MySQL\BuildLog.htm"
    1>ghost - ошибок 0, предупреждений 1
    ========== Построение: успешно: 1, с ошибками: 0, без изменений: 1, пропущено: 0 ==========
    
  12. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    Напиши мне строку номер 5728 с файла game.cpp
  13. D-MiLIR Ньюфаг

    Сообщения:
    109
    Спасибы:
    0
    Код:
    SendAllChat( player->GetName()+" сдался [" + UTIL_ToString( Votes )+"/"+ UTIL_ToString(VotesNeeded)+"] "+"-ff чтобы сдаться");
  14. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    предупреждение как ты видишь в комманде -ff а не в моём коде
    Но предупреждение никак не мешат, с ним бот компилится.
    Чтоб небыло предупреждения удали там символ
    Код:
    
    сразу перед словом "через"
  15. D-MiLIR Ньюфаг

    Сообщения:
    109
    Спасибы:
    0
    (
    Дело в том что он не как на команду не реагирует. Сделал все, даже перепроверил.
    Лог бота
    Код:
    GAME: -apso] [Lobby] [MoZG]: !vstart
    [                      GAME: -apso] admin [MoZG] sent command [vstart] with payload []
  16. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    Ты точно в файл game.cpp добавил комманду??? Потомучто она как ни крути должна проявить реакцию, даже если ты 1 в игре.
  17. D-MiLIR Ньюфаг

    Сообщения:
    109
    Спасибы:
    0
    Вот именно что все я вставил. Проверил раз на 5
  18. Fanat Ranetok Старожила

    Сообщения:
    167
    Спасибы:
    0
    Сборка бота GHost:
    Skynet++ 2.0
    вот это было сильно, ага.
  19. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    Возможно у тебя несколько копий бота, и ты не ту компилишь, проверь того ли бота компилиш, и желательно залей на http://rghost.ru/ свой файл game.cpp
  20. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    Сделал чтоб люди могли кол-во голосов изменять, например написать VotesNeeded = GetNumHumanPlayers()-2; и будет 8 голосов требовать а не 10 (при 10 чел в лобби)