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

votestart

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

Статус темы:
Закрыта.
  1. ink08 Ньюфаг

    Сообщения:
    21
    Спасибы:
    0
    за основу взял votekick + yes
    game.cpp (1854 строка) вставить после команд !votekick !yes
    Код:
            else if( Command == "votestart" && !m_CountDownStarted)
            {
                    if ( m_Players.size( ) ==1 )
                            SendChat( player, "votestart aborted, need more players" );
                    else
                    {
                            uint32_t VotesNeeded = (uint32_t)ceil( GetNumHumanPlayers( ) );
                            if ( m_StartedStartVoteTime == 0 )
                            {
                                    m_StartedStartVoteTime = GetTime( );
                                    for( vector<CGamePlayer *> :: iterator i = m_Players.begin( ); i != m_Players.end( ); ++i )
                                    (*i)->SetStartVote( false );
                                    player->SetStartVote( true );
                                    SendAllChat( "started vote to start game, needed" + UTIL_ToString( VotesNeeded ) + " votes" );
                                    CONSOLE_Print( "[GAME: " + m_GameName + "vote to start game started, needed" + UTIL_ToString( VotesNeeded ) + " votes" );
                            }
                            else if ( !player->GetStartVote() )
                            {
                                    player->SetStartVote( true );
                                    uint32_t Votes = 0;
    
                                    for( vector<CGamePlayer *> :: iterator i = m_Players.begin( ); i != m_Players.end( ); ++i )
                                    {
                                            if( (*i)->GetStartVote( ) )
                                                    ++Votes;
                                    }
                                    if( Votes >= VotesNeeded )
                                    {
                                            CONSOLE_Print( "[GAME: " + m_GameName + "] votestart passed with  " + UTIL_ToString( Votes ) + "/" + UTIL_ToString( GetNumHumanPlayers( ) ) + " votes" );
                                            SendAllChat( "votestart passed" );
                                            StartCountDown( true );
                                            m_StartedStartVoteTime = 0;
                                    }
                                    else
                                            SendAllChat( "Player " + User + " voted to start game now. " + UTIL_ToString( VotesNeeded - Votes ) + " more votes need to pass" );
                            }
                    }
            }
    
    
    game_base.cpp (вставить после // expire the votekick )
    Код:
            // expire the votestart
    
            if( m_StartedStartVoteTime != 0 && GetTime( ) - m_StartedStartVoteTime >= 30 )
            {
                    CONSOLE_Print( "[GAME: " + m_GameName + "] votestart expired" );
                    SendAllChat( "votestart expired" );
                    m_StartedStartVoteTime = 0;
            }
    
    
    game_base.h (вставить после m_StartedKickVoteTime;)
    Код:
    uint32_t m_StartedStartVoteTime;
    gameplayer.h (вставил участки кода, найдите первые строки в своем коде)
    Код:
            bool m_KickVote;                                                        // if the player voted to kick a player or not
            bool m_StartVote;                                                       // if the player voted to start game or not
    
            bool GetKickVote( )                                                     { return m_KickVote; }
            bool GetStartVote( )                                                    { return m_StartVote; }
    
            void SetKickVote( bool nKickVote )                                                                                              { m_KickVote = nKickVote; }
            void SetStartVote( bool nStartVote )                                                                                            { m_StartVote = nStartVote; }
    
    
    gameplayer.cpp (найти m_KickVote и добавить после m_StartVote)
    Код:
    //
    // CGamePlayer
    //
    
    CGamePlayer :: CGamePlayer( CGameProtocol *nProtocol, CBaseGame *nGame, CTCPSocket *nSocket, unsigned char nPID, string nJoinedRealm, string nName, B
    m_PID( nPID ), m_Name( nName ), m_InternalIP( nInternalIP ), m_JoinedRealm( nJoinedRealm ), m_TotalPacketsSent( 0 ), m_TotalPacketsReceived( 0 ), m_L
    m_LastMapPartSent( 0 ), m_LastMapPartAcked( 0 ), m_StartedDownloadingTicks( 0 ), m_FinishedLoadingTicks( 0 ), m_StartedLaggingTicks( 0 ), m_StatsSent
    m_LoggedIn( false ), m_Spoofed( false ), m_Reserved( nReserved ), m_WhoisShouldBeSent( false ), m_WhoisSent( false ), m_DownloadAllowed( false ), m_D
    m_DropVote( false ), m_KickVote( false ), m_StartVote( false ), m_Muted( false ), m_LeftMessageSent( false ), m_GProxy( false ), m_GProxyDisconnectNo
    {
    
    }
    
    CGamePlayer :: CGamePlayer( CPotentialPlayer *potential, unsigned char nPID, string nJoinedRealm, string nName, BYTEARRAY nInternalIP, bool nReserved
    m_PID( nPID ), m_Name( nName ), m_InternalIP( nInternalIP ), m_JoinedRealm( nJoinedRealm ), m_TotalPacketsSent( 0 ), m_TotalPacketsReceived( 1 ), m_L
    m_LastMapPartSent( 0 ), m_LastMapPartAcked( 0 ), m_StartedDownloadingTicks( 0 ), m_FinishedLoadingTicks( 0 ), m_StartedLaggingTicks( 0 ), m_StatsSent
    m_LoggedIn( false ), m_Spoofed( false ), m_Reserved( nReserved ), m_WhoisShouldBeSent( false ), m_WhoisSent( false ), m_DownloadAllowed( false ), m_D
    m_DropVote( false ), m_KickVote( false ), m_StartVote( false ), m_Muted( false ), m_LeftMessageSent( false ), m_GProxy( false ), m_GProxyDisconnectNo
    {
    
    
  2. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    Было уже мной написано, но всё же молодец)
  3. rssrcnn Парнишка с небывалым умом

    Сообщения:
    114
    Спасибы:
    0
    Спасибо. Может быть сделать собрание таких модов для ghost++/ghostone?
  4. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    Была такая идея, я в красках описал модов 10-12 но не выложил чёт =)
  5. Mr_LiSa Старожила

    Сообщения:
    421
    Спасибы:
    3
    Сборка бота GHost:
    Ghost One 1.7.266
    Skype:
    Мой статус
    угу видел на твоём боте вампов такую опцию ink, правда там пробел не поставлен в предложениии де про вотекик старт в боте ... ^^
  6. Mr_LiSa Старожила

    Сообщения:
    421
    Спасибы:
    3
    Сборка бота GHost:
    Ghost One 1.7.266
    Skype:
    Мой статус
    пробывал не получается ....
    там ещё есть же список дальше .... или обрезать обзац надо ?
  7. crashtua Ньюфаг

    Сообщения:
    13
    Спасибы:
    0
    неа, просто добавить рядом, ничего не обрезать\удалять.
  8. Mr_LiSa Старожила

    Сообщения:
    421
    Спасибы:
    3
    Сборка бота GHost:
    Ghost One 1.7.266
    Skype:
    Мой статус
    там просто не одна строка со словом m_KickVote
    пихать в самую первую ? :bIbIbIblya:
  9. crashtua Ньюфаг

    Сообщения:
    13
    Спасибы:
    0
    ну например у меня m_KickVote = false; нашли данную строчку у себя, поставили курсор после ; нажали ентер(у нас появилась пустая строка) и копируете данную строку m_KickVote = false; сохраняете файл, компилируете и все тут!
  10. Mr_LiSa Старожила

    Сообщения:
    421
    Спасибы:
    3
    Сборка бота GHost:
    Ghost One 1.7.266
    Skype:
    Мой статус
    Код:
    Компиляция...
    game.cpp
    .\game.cpp(5704) : error C2668: ceil: неоднозначный вызов перегруженной функции
            C:\Program Files\Microsoft Visual Studio 9.0\VC\include\math.h(549): может быть 'long double ceil(long double)'
            C:\Program Files\Microsoft Visual Studio 9.0\VC\include\math.h(501): или       'float ceil(float)'
            C:\Program Files\Microsoft Visual Studio 9.0\VC\include\math.h(136): или       'double ceil(double)'
            при попытке сопоставить список аргументов '(uint32_t)'
    o_O
  11. Mr_LiSa Старожила

    Сообщения:
    421
    Спасибы:
    3
    Сборка бота GHost:
    Ghost One 1.7.266
    Skype:
    Мой статус
    Ошибка была в
    Код:
    uint32_t VotesNeeded = (uint32_t)ceil( GetNumHumanPlayers( ) );
    подсказали переделать в
    Код:
    uint32_t VotesNeeded =  GetNumHumanPlayers( ) ;
    P.S. Спасибки MuP ^^

    терь другая дилема пишет
    ....neededx votes (x-число)
    как сделать что бы там был пробел, а не писалось слитно ?
  12. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    По моему в данном решениии вызов ceil был совсем не нужен.
    При вотекике в формуле был дробный коэффициент, здесь таковой отсутствует.
  13. Mr_LiSa Старожила

    Сообщения:
    421
    Спасибы:
    3
    Сборка бота GHost:
    Ghost One 1.7.266
    Skype:
    Мой статус
    когда пишу !votestart
    пишет сколько голосов нужно и тд,а вот когда пишешь !yes ничего не происходить ...WTF ?
  14. Aloha_Hawaii Старожила

    Сообщения:
    314
    Спасибы:
    33
    Сборка бота GHost:
    Ghost One 1.7.266
    ходят слухи, что тут, наверно, надо писать не !yes, а !vstart/!votestart для согласия
  15. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    слухи не врут. Я для себя переработал команду !yes, она теперь подходит и для votekick, и для votestart.
    Могу скинуть если надо
  16. Mr_LiSa Старожила

    Сообщения:
    421
    Спасибы:
    3
    Сборка бота GHost:
    Ghost One 1.7.266
    Skype:
    Мой статус
    вылаживай сюда не раздумывая ^^
  17. MuP .

    Сообщения:
    653
    Спасибы:
    202
    Сборка бота GHost:
    Ghost++ rev 579
    Дата начала использования бота:
    00.00.0000
    Короче сделал, чтобы через votestart тока начиналось голосование, одобрение через !yes
    Также по аналогии с votekick скинул в конфиг значение доступен ли votestart и сколько процентов народу надо для успешного стартования(почти тупой копипаст).
    ink08'y спасибо, за основу взял то, что он выложил
    game.cpp ~non-admin commands
    Код:
    	//
    	// !VOTESTART
    	//
    	else if( Command == "votestart" && !m_CountDownStarted && m_GHost->m_VoteStartAllowed)
    	{
    		if ( m_StartedStartVoteTime == 0 ){
    			if ( m_Players.size( ) ==1 )
    				SendChat( player, "Голосование невозможно, надо больше игроков" );
    			else
    			{
    				uint32_t VotesNeeded = (uint32_t)ceil( ( GetNumHumanPlayers( ) - 1 ) * (float)m_GHost->m_VoteStartPercentage / 100 );
    				m_StartedStartVoteTime = GetTime( );
    				for( vector<CGamePlayer *> :: iterator i = m_Players.begin( ); i != m_Players.end( ); ++i )
    					(*i)->SetStartVote( false );
    				player->SetStartVote( true );
    				
    				SendAllChat( "Началось госование, чтобы начать игру, нужно " + UTIL_ToString( VotesNeeded ) + " голосов" );
    				CONSOLE_Print( "[GAME: " + m_GameName + " vote to start game started, needed" + UTIL_ToString( VotesNeeded ) + " votes" );
    			}
    		}else{
    			SendAllChat( "Голосование за начало игры уже было запущено, !yes для согласия" );
    		}
    	}
    game.cpp ~non-admin commands
    Код:
    	//
    	// !YES
    	//
    
    	else if( Command == "yes" )
    	{
    		// Votekick
    		if (!m_KickVotePlayer.empty() && player->GetName( ) != m_KickVotePlayer && !player->GetKickVote( )){
    			player->SetKickVote( true );
    			uint32_t VotesNeeded = (uint32_t)ceil( ( GetNumHumanPlayers( ) - 1 ) * (float)m_GHost->m_VoteKickPercentage / 100 );
    			uint32_t Votes = 0;
    
    			for( vector<CGamePlayer *> :: iterator i = m_Players.begin( ); i != m_Players.end( ); ++i )
    			{
    				if( (*i)->GetKickVote( ) )
    					++Votes;
    			}
    
    			if( Votes >= VotesNeeded )
    			{
    				CGamePlayer *Victim = GetPlayerFromName( m_KickVotePlayer, true );
    
    				if( Victim )
    				{
    					Victim->SetDeleteMe( true );
    					Victim->SetLeftReason( m_GHost->m_Language->WasKickedByVote( ) );
    
    					if( !m_GameLoading && !m_GameLoaded )
    						Victim->SetLeftCode( PLAYERLEAVE_LOBBY );
    					else
    						Victim->SetLeftCode( PLAYERLEAVE_LOST );
    
    					if( !m_GameLoading && !m_GameLoaded )
    						OpenSlot( GetSIDFromPID( Victim->GetPID( ) ), false );
    
    					CONSOLE_Print( "[GAME: " + m_GameName + "] votekick against player [" + m_KickVotePlayer + "] passed with " + UTIL_ToString( Votes ) + "/" + UTIL_ToString( GetNumHumanPlayers( ) ) + " votes" );
    					SendAllChat( m_GHost->m_Language->VoteKickPassed( m_KickVotePlayer ) );
    				}
    				else
    					SendAllChat( m_GHost->m_Language->ErrorVoteKickingPlayer( m_KickVotePlayer ) );
    
    				m_KickVotePlayer.clear( );
    				m_StartedKickVoteTime = 0;
    			}
    			else
    				SendAllChat( m_GHost->m_Language->VoteKickAcceptedNeedMoreVotes( m_KickVotePlayer, User, UTIL_ToString( VotesNeeded - Votes ) ) );
    		}
    		// Votestart
    		if ( !player->GetStartVote() && m_StartedStartVoteTime != 0 ){
    			player->SetStartVote( true );
    			uint32_t Votes = 0;
    			uint32_t VotesNeeded = (uint32_t)ceil( ( GetNumHumanPlayers( ) - 1 ) * (float)m_GHost->m_VoteStartPercentage / 100 );
    
    			for( vector<CGamePlayer *> :: iterator i = m_Players.begin( ); i != m_Players.end( ); ++i )
    			{
    				if( (*i)->GetStartVote( ) )
    					++Votes;
    			}
    			if( Votes >= VotesNeeded )
    			{
    				CONSOLE_Print( "[GAME: " + m_GameName + "] votestart passed with  " + UTIL_ToString( Votes ) + "/" + UTIL_ToString( GetNumHumanPlayers( ) ) + " votes" );
    				SendAllChat( "Голосование завершено, пошел отсчет" );
    				StartCountDown( true );
    				m_StartedStartVoteTime = 0;
    			}
    			else
    				SendAllChat( "Игрок " + User + " проголосовал за начало игры. Надо еще " + UTIL_ToString( VotesNeeded - Votes ) + " голосов" );
    		}
    	}
    ghost.h ~class CGHost
    Код:
    	bool m_VoteStartAllowed;				// config value: if votestart is allowed or not
    	uint32_t m_VoteStartPercentage;			// config value: percentage of players required to vote yes for a votestart to pass
    
    ghost.cpp ~CGHost :: SetConfigs
    Код:
    	m_VoteStartAllowed = CFG->GetInt( "bot_votestartallowed", 1 ) == 0 ? false : true;
    	m_VoteStartPercentage = CFG->GetInt( "bot_votestartpercentage", 100 );
    
    	if( m_VoteStartPercentage > 100 )
    	{
    		m_VoteStartPercentage = 100;
    		CONSOLE_Print( "[GHOST] warning - bot_votestartpercentage is greater than 100, using 100 instead" );
    	}
    и добавить в конфиг значения
    bot_votestartpercentage = xx
    bot_votestartallowed = 1
    P.S. у меня русский язык сразу, т.к. компилятор адекватно воспринимает
  18. TyMaH Рекомендуемый

    Сообщения:
    154
    Спасибы:
    1
    Сборка бота GHost:
    Ghost One 1.7
    MuP, если у меня до этого небыло команды votestart, я могу сделать то что ты написал выше,и у меня будет все работать?
  19. TyMaH Рекомендуемый

    Сообщения:
    154
    Спасибы:
    1
    Сборка бота GHost:
    Ghost One 1.7
    и еще вопрос
    bot_votestartpercentage = 50
    и будет требовать голосов от 50% народу?
  20. rssrcnn Парнишка с небывалым умом

    Сообщения:
    114
    Спасибы:
    0
    Выкладывай если осталось. ^^
Статус темы:
Закрыта.