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

новая команда -ff [-FastFinish]

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

Статус темы:
Закрыта.
  1. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    в brtGhost реализован фф, оттуда стягивай код, себе ставил на one - работает хорошо
  2. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    не очень код...
    во первых расчитан только на доту (на картах без статы не будет пахать, на w3mmd имхо что он вылетет!)
    вот такая проверка....
    Код:
    		if ( !m_Stats )
    		{
    			SendChat(player->GetPID(), m_GHost->m_Language->GetLang("lang_1208"));
    			return HideCommand;
    		}
    потом не понятно зачем идёт проверка двух тим?
    Код:
    		bool end1 = (votes1 == count1); 
    		bool end2 = (votes2 == count2);
    
    		if( end1 || end2 )
    и наконец обявлена переменная
    Код:
    	string teamname = (playerTeam == 0 ? "SENTINEL" : "SCOURGE");
    но при этом она не используеться в этой строке
    Код:
    SendAllChat(m_GHost->m_Language->GetLang("lang_1213", end1 ? "SENTINEL" : "SCOURGE" ));
  3. Ghost_hnt Ньюфаг

    Сообщения:
    48
    Спасибы:
    0
    свой в студию!)
  4. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    Повторю ещё раз что команда сырая(писал буквально вчера)
    в game.h
    строка ~61 после
    Код:
    	bool m_DoAutoWarns;					
    добавь
    Код:
    	bool m_DotaGame;
    в game.cpp
    строка ~88 замени это
    Код:
    	if( m_Map->GetMapType( ) == "w3mmd" )
    		m_Stats = new CStatsW3MMD( this, m_Map->GetMapStatsW3MMDCategory( ) );
    	else if( m_Map->GetMapType( ) == "dota" )
    			m_Stats = new CStatsDOTA( this );
    		else
    		m_Stats = NULL;
    на это
    Код:
    	m_DotaGame = false;
    	if( m_Map->GetMapType( ) == "w3mmd" )
    		m_Stats = new CStatsW3MMD( this, m_Map->GetMapStatsW3MMDCategory( ) );
    	else if( m_Map->GetMapType( ) == "dota" )
    	{
    		m_Stats = new CStatsDOTA( this );
    	m_DotaGame = true;
    	}
    	else
    		m_Stats = NULL;
    строка ~5671
    добавь перед
    Код:
    	//
    	// !YES
    	//
    вот эту команду
    Код:
    if( ( Command == "fastfinish" || Command == "ff" ) && m_GameLoaded )
        {
          
            unsigned char CurentTeam=m_Slots[GetSIDFromPID(player->GetPID())].GetTeam(); 
    		if (CurentTeam>1)
    			return false ;
    		player->SetFFVote(true);
    		uint32_t VotesNeeded= 0;
    		uint32_t Votes = 0;
            for( vector<CGamePlayer *> :: iterator i = m_Players.begin( ); i != m_Players.end( ); i++ )
    		{
    			if( !(*i)->GetLeftMessageSent( ) )
    			if(m_Slots[GetSIDFromPID((*i)->GetPID())].GetTeam() == CurentTeam)
    			{
    				VotesNeeded++;
    				if( (*i)->GetFFVote( ) )
    					Votes++;
    			}
    		}
    			SendAllChat( player->GetName()+" сдался [" + UTIL_ToString( Votes )+"/"+ UTIL_ToString(VotesNeeded)+"] "+"-ff чтобы сдаться");
    			if( Votes >= VotesNeeded )
    				  {
    					if (m_DotaGame )
    					{
    					SendAllChat("Победители The " + (string)(CurentTeam == 0 ? "Scrouge" : "Sentinel") + " игра закончится через 5 секунд.");
    					m_Stats->SetWinner((uint32_t)(CurentTeam == 0 ? 2 : 1));
    					}
    					else SendAllChat("Игра закончится через 5 секунд.");
    					m_GameEndCountDownStarted = true;
    					m_GameEndCountDownCounter = 5;
    					m_GameEndLastCountDownTicks = GetTicks();
    				  }
    			  
        }
    
    В gameplayer.cpp,
    строка~286 после
    Код:
    	m_KickVote = false;
    добавь
    Код:
    	m_FFVote= false;
    строка~355 после
    Код:
    	m_KickVote = false;
    добавь
    Код:
    	m_FFVote= false;
    В gameplayer.h,
    строка ~135, После
    Код:
       bool m_KickVote;                               // if the player voted to kick a player or not
    добавь
    Код:
       bool m_FFVote;                            // Fastfinish
    Строка ~195 после
    Код:
       bool GetKickVote( )                            { return m_KickVote; }
    Добавь
    Код:
       bool GetFFVote( )                         { return m_FFVote; }
    Строка ~238 после
    Код:
       void SetKickVote( bool nKickVote )                                              { m_KickVote = nKickVote; }
    добавь
    Код:
       void SetFFVote( bool nFFVote )                                        { m_FFVote = nFFVote; }
    В stats.cpp,
    в конце добавь
    Код:
    void CStats :: SetWinner( uint32_t n_Winner )
    {
    
    }
    в stats.h,
    после
    virtual void Save( CGHost *GHost, CGHostDB *DB, uint32_t GameID );
    добавь
    Код:
    virtual void SetWinner( uint32_t n_Winner );
    
    в statsdota.cpp,
    в конце добавь
    Код:
    void CStatsDOTA :: SetWinner( uint32_t n_Winner )
    {
        m_Winner = n_Winner;
    }
    в statsdota.h,
    после
    Код:
    virtual void Save( CGHost *GHost, CGHostDB *DB, uint32_t GameID );
    добавь
    Код:
    virtual void SetWinner( uint32_t n_Winner );
    зы:если хоч чтобы команду можно было юзать используя тригер "-" вместо твоего тригера
    то можешь замени в game_base.cpp
    Код:
    if( Message == "?trigger" )
    				SendChat( player, m_GHost->m_Language->CommandTrigger( string( 1, m_GHost->m_CommandTrigger ) ) );
    на
    Код:
    			if( (Message == "-ff" || Message == "-fastfinish" || Message == "-сдаться" || Message == "-сдаюсь")  && m_GameLoaded)
    				EventPlayerBotCommand(player,"ff",string( ));
    else if( Message == "?trigger" )
    				SendChat( player, m_GHost->m_Language->CommandTrigger( string( 1, m_GHost->m_CommandTrigger ) ) );
    помоему всё
    snw и ıIıIİıİIıımusic нравится это.
  5. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    Вот ещё вариант самой комманды + отказывание от фф
    Код:
    	//
    	// !FF
    	//
    
    	else if( Command == "ff" && !player->GetFFVote( ) && m_GameLoaded)
    	{
    		if ( !m_Stats )
    		{
    			SendChat(player->GetPID(), m_GHost->m_Language->GetLang("lang_1208"));
    			return HideCommand;
    		}
    		
    		player->SetFFVote( true );
    		
    		unsigned char playerTeam = m_Slots[GetSIDFromPID(player->GetPID())].GetTeam();
    
    		uint32_t count1 = 0;
    		uint32_t count2 = 0; //count of players in the team.
    		uint32_t votes1 = 0;
    		uint32_t votes2 = 0; //count of votes in the team.
    		string teamname = (playerTeam == 0 ? "SENTINEL" : "SCOURGE");
    		
    		for( vector<CGamePlayer *> :: iterator i = m_Players.begin( ); i != m_Players.end( ); i++ )
    		{
    			if( !(*i)->GetLeftMessageSent( ) )
    			if(m_Slots[GetSIDFromPID((*i)->GetPID())].GetTeam() == (unsigned char)0)
    			{
    				count1++;
    				if( (*i)->GetFFVote( ) )
    					votes1++;
    			}
    			else
    			{
    				count2++;
    				if( (*i)->GetFFVote( ) )
    					votes2++;
    			}
    		}
    		
    		bool end1 = (votes1 == count1); 
    		bool end2 = (votes2 == count2);
    
    		if( end1 || end2 )
    		{
    			if( end1 )
    				m_Stats->SetWinner(2);
    			else
    				m_Stats->SetWinner(1);
    				
    			SendAllChat(m_GHost->m_Language->GetLang("lang_1213", end1 ? "SENTINEL" : "SCOURGE" ));
    
    			SendAllChat(m_GHost->m_Language->GetLang("lang_1053")); // "Game will end in 5 seconds"
    			m_GameEndCountDownStarted = true;
    			m_GameEndCountDownCounter = 5;
    			m_GameEndLastCountDownTicks = GetTicks();
    		}
    		else
    		{
    			SendAllChat( m_GHost->m_Language->GetLang("lang_1211", "$USER$", User, "$TEAMNAME$", teamname, "$VOTES$", UTIL_ToString(playerTeam == 0 ? votes1 : votes2), "$COUNT$", UTIL_ToString(playerTeam == 0 ? count1 : count2)));
    		}
    	
    		SendChat(player->GetPID(), m_GHost->m_Language->GetLang("lang_1210", "$TRIGGER$", string(1, m_GHost->m_CommandTrigger)));
    		return HideCommand;
    	}
    	
    	//
    	// !NOFF
    	//
    
    	else if( Command == "noff" && player->GetFFVote( ) && m_GameLoaded)
    	{
    		player->SetFFVote( false );
    		
    		unsigned char playerTeam = m_Slots[GetSIDFromPID(player->GetPID())].GetTeam();
    		uint32_t count1 = 0, count2 = 0; //count of players in the team.
    		uint32_t votes1 = 0, votes2 = 0; //count of votes in the team.
    		string teamname = (playerTeam == 0 ? "SENTINEL" : "SCOURGE");
    
    
    		for( vector<CGamePlayer *> :: iterator i = m_Players.begin( ); i != m_Players.end( ); i++ )
    		{
    			if( !(*i)->GetLeftMessageSent( ) )
    			if(m_Slots[GetSIDFromPID((*i)->GetPID())].GetTeam() == (unsigned char)0)
    			{
    				count1++;
    				if( (*i)->GetFFVote( ) )
    					votes1++;
    			}else{
    				count2++;
    				if( (*i)->GetFFVote( ) )
    					votes2++;
    			}
    		}
    	
    		SendAllChat( m_GHost->m_Language->GetLang("lang_1212", "$USER$", User, "$TEAMNAME$", teamname, "$VOTES$", UTIL_ToString(playerTeam == 0 ? votes1 : votes2), "$COUNT$", UTIL_ToString(playerTeam == 0 ? count1 : count2)));
    
    		return HideCommand;
    	}
    Только не описываю что ещё куда добавить, просто сам код комманды, если именно он заинтересует - распишу.
    Evolver нравится это.
  6. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    TT
    Тоесть если я предложу врагам сдаться нам, тоесть я пишу !ff, так мне еще и поражение засчитают? Как сделать фф на основе статы игры?
  7. Zarj Старожила

    Сообщения:
    1.007
    Спасибы:
    23
    Сборка бота GHost:
    Ghost One 1.7.266
    Дата начала использования бота:
    01.01.1992
    фф пишет комманда которая хочет сдаться
  8. Ghost_hnt Ньюфаг

    Сообщения:
    48
    Спасибы:
    0
    тебе его и должны засчитать! Не должен засчитаться лив!


    распииши плз! куда что вставлять? это для Гост Оне?
  9. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    Hah Нах мне просто луз засчитать) Я хочу фф чтобы сам определял кто проиграл по сумме килов хотябы)
  10. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    поповоду этого кода я уже оставлял коменты...
    зачем считать по килам? оО
    пример: счёт 21-1 но скроджи снесли все товеры .Замес,счёт 21-6 скроджи несут мид,сенты пишут фф и они выграли?....
  11. Synth (LM) Пантограф!

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

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    ff эта команда за которую должна голосовать тима, тем самым сдаваясь...
    не =)
    пример: играет тима у которой одни маги и вторая тима одни лейты щёт 35 -10 товеры 5 -1
    45 минуа,замес - лейты вытащили,второй замес - опять вин скроджи щёт 36 - 20 товеры 5-2 маги пишут фф и что? они опять выграли....

    такую как ты описывал команду - нужно либо админам дать, либо добавить в !exit nice или же сделать голосование где проголосуют 80% игроков-,если игать не на икапе, то уговорить ~80% тел на "ff" практически не реально.
    Вот и выходит что эта команда практическая бесполезна....
  13. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    Ladno. Ubedil.
  14. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    SendAllChat("Победители The " + (string)(CurentTeam == 0 ? "Scrouge" : "Sentinel") + " игра закончиться через 5 секунд.");


    TT :)
  15. dev Ньюфаг

    Сообщения:
    51
    Спасибы:
    0
    Сборка бота GHost:
    0.0
    fake
    Решили показать на сколько я глуп? :) Хорошо, начинаем диалог.
    1. Наш бот (brtGHost) рассчитан на Доту, добавляем в первую очередь те функции которые нужны нам. W3mmd не используем. Если Вам это нужно, либо ждите когда это когда-нибудь будет, либо тестируйте и делайте сами. У нас это работает на Ура.

    2.
    Читайте выше.

    3.
    Во первых, ни кто не мешает написать .ff как одной так и второй команде. Здесь мы проверяем сдалась ли какая-нибудь команда. Я не думаю что это нужно объяснять, код настолько очевиден.

    4.
    См. код ниже.
    Код:
    SendAllChat( m_GHost->m_Language->GetLang("lang_1211", "$USER$", User, "$TEAMNAME$", teamname, "$VOTES$", UTIL_ToString(playerTeam == 0 ? votes1 : votes2), "$COUNT$", UTIL_ToString(playerTeam == 0 ? count1 : count2)));
    Она ведь и правда нигде не используется?

    Еще какие-то вопросы по поводу нашего "кривого кода" будут?
  16. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    мм я никого не хотел оскорбить...
    лан первое и второе пропустим
    повторю ещё раз зачем идет проверка двух тим
    пример: играют две тимы у скроджей сдалось 3 тела у сентов 4 оставшийся сент пишет фф
    разве от этого изменьтись голоса скроджей? .... я думаю нет
    т.е. вы всеравно узнаете игрок с какой тимы написал "фф",что мешает вам использовать это,и пересчитывать голоса только для этой тимы ?

    Код:
    SendAllChat( m_GHost->m_Language->GetLang("lang_1211", "$USER$", User, "$TEAMNAME$", teamname, "$VOTES$", UTIL_ToString(playerTeam == 0 ? votes1 : votes2), "$COUNT$", UTIL_ToString(playerTeam == 0 ? count1 : count2)));
    ести решил "вступать в диолог", то ответь что мешало использовать эту же переменную тут
    Код:
    SendAllChat(m_GHost->m_Language->GetLang("lang_1213", end1 ? "SENTINEL" : "SCOURGE" ));
    и вопрос был как бЭ в этом....

    зы:побереги свои нервы всеравно я буду отстаивать свое мнение до конца,даже если не прав....
  17. dev Ньюфаг

    Сообщения:
    51
    Спасибы:
    0
    Сборка бота GHost:
    0.0
    Да я спокоен. Ничего личного, просто мне показалось мы тут с таким рвением доказывали что код не правильный и кривой. То что Вы написали, это все мелочи. Почему мы сделали именно так, потому что так сделали :)
    Если ваша претензия с точки зрения оптимизации, я вряд ли думаю что прирост производительности составит хоть 0.01 процент. Т.к мне проще пробежаться по массиву интератором, и считать последовательно память все игроков. Просто так сделали Мы.

    Насчет переменной да, можно было и использовать дальше, но у нас есть есть задачи более глобального масштаба, и задумываясь о мелочах как-то не хочется.
  18. fake Старожила

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

    Сообщения:
    51
    Спасибы:
    0
    Сборка бота GHost:
    0.0
    Спасибо за поддержку, и грамотные замечания. Напишу чуть позже, когда приведу бот в человеческий вид
  20. Hanapi Ньюфаг

    Сообщения:
    9
    Спасибы:
    0
Статус темы:
Закрыта.