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

кол-во занятых слотов в названии

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

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

    Сообщения:
    21
    Спасибы:
    0
    [IMG]
    как сделать такое?
  2. ____ROB____ Старожила

    Сообщения:
    1.008
    Спасибы:
    22
    Сборка бота GHost:
    Ghost One 1.5
    ето с гарены:? :)
  3. ink08 Ньюфаг

    Сообщения:
    21
    Спасибы:
    0
    нет, это bnet , только сегодня такое заметил...
    можете зайти и сами убедиться - wc3.theabyss.ru
  4. MeGaLeX Знакомый модера

    Сообщения:
    62
    Спасибы:
    0
    Ну сама суть в том, что бот высчитывает количество всех слотов и слотов занятых и каждый раз, при входе или выходе игрока, делает рехост с изменением названия игры.
  5. zazulya Ньюфаг

    Сообщения:
    80
    Спасибы:
    0
    а есть такая переменная, которая покажет что игрок вышел, типа joinPlayer?
  6. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    m_FacePalm
  7. zazulya Ньюфаг

    Сообщения:
    80
    Спасибы:
    0
    а поподробнее пожалуйста, если не лень
    я вот начал делать, реализовал рехост, если зашел игрок, вот что-то подобное
    в bnet.cpp в комманду !pub добавил над этими строками
    Код:
    m_GHost->m_QuietRehost = false;
    string gamename = GameName;
    transform( gamename.begin( ), gamename.end( ), gamename.begin( ), (int(*)(int))tolower );
    
    string containstring = m_GHost->m_GameNameContainString;
    transform( containstring.begin( ), containstring.end( ), containstring.begin( ), (int(*)(int))tolower );
    
    вот эти
    Код:
    //real counts of slot by zaza
    int SL_COUNT = 0;
    GameName = GameName +" ["+ UTIL_ToString(SL_COUNT) + "/10]";
    
    и в game_base.cpp над этими строками
    Код:
    // check for multiple ip usage.
    vector<string>IPs;
    добавил вот эти
    Код:
    	if (joinPlayer)
    	{
    		string GameName = m_GameName;
    		string s, GameNr;
    		int SL_COUNT;
    		int idx = GameName.length()-5;
    		if (GameName.substr(idx-1,1) == "[")
    			s = GameName.substr(idx,1);
    		else
    			s = GameName.substr(idx-1,2);
    		SL_COUNT = UTIL_ToInt16(s) + 1;
    		GameNr = UTIL_ToString(SL_COUNT);
    		if (UTIL_ToInt16(s)<10)
    			GameName = GameName.substr(0,idx)+UTIL_ToString(SL_COUNT)+"/10]";
    		else
    			GameName = GameName.substr(0,idx-1)+UTIL_ToString(SL_COUNT)+"/10]";
    
    		CONSOLE_Print( "[GAME: " + m_GameName + "] trying to rehost as public game [" + GameName + "]" );
    		m_GameState = GAME_PUBLIC;
    		m_GameName = GameName;
    		m_GHost->m_HostCounter++;
    		m_GHost->SaveHostCounter();
    		if (m_GHost->m_MaxHostCounter>0)
    			if (m_GHost->m_HostCounter>m_GHost->m_MaxHostCounter)
    				m_GHost->m_HostCounter = 1;
    		m_HostCounter = m_GHost->m_HostCounter;
    		m_GHost->m_QuietRehost = true;
    		m_RefreshError = false;
    		m_Rehost = true;
    		AutoSetHCL();
    		AddGameName(GameName);
    		//				m_GHost->UDPChatSend("|rehost "+GameName);
    
    		//SendAllChat("Rehosting ...");
    		for( vector<CBNET *> :: iterator i = m_GHost->m_BNETs.begin( ); i != m_GHost->m_BNETs.end( ); i++ )
    		{
    			// unqueue any existing game refreshes because we're going to assume the next successful game refresh indicates that the rehost worked
    			// this ignores the fact that it's possible a game refresh was just sent and no response has been received yet
    			// we assume this won't happen very often since the only downside is a potential false positive
    			(*i)->UnqueueGameRefreshes( );
    			(*i)->QueueGameUncreate( );
    			(*i)->QueueEnterChat( );
    			// the game creation message will be sent on the next refresh
    		}
    		m_CreationTime = GetTime( );
    		m_LastRefreshTime = GetTime( );
    	}
    теперь осталось доделать если игрок вышел...
    и еще если большое количество входов/выходов не знаю как поведет себя рехост, наверно надо как то ограничить, вобщем надо тестить
    подскажите как дальше быть...
  8. Apx Ньюфаг

    Сообщения:
    165
    Спасибы:
    0
    zazulya
    fake над тобой издевается. Он имел ввиду смайлик - :facepalm:
  9. ____ROB____ Старожила

    Сообщения:
    1.008
    Спасибы:
    22
    Сборка бота GHost:
    Ghost One 1.5
    [IMG]


    ink08 полностью скрин покажи...
  10. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    юсуп же зайди и погляди
  11. zazulya Ньюфаг

    Сообщения:
    80
    Спасибы:
    0
    вобщем допер куда воткнуть оставшиййся кусок кода -_-
    можно в game_base.cpp в функцию
    Код:
    void CBaseGame :: EventPlayerLeft( CGamePlayer *player, uint32_t reason )
    в самом конце добавить
    Код:
    	//
    	//zaza realslotnumber player leave
    	//
    		if (!m_GameLoading && !m_GameLoaded)
    		{
    		string GameName = m_GameName;
    		string s;//, zGameNr;
    		int SL_COUNT;
    		int idx = GameName.length()-5;
    		if (GameName.substr(idx-1,1) == "[")
    			s = GameName.substr(idx,1);
    		else
    			s = GameName.substr(idx-1,2);
    		SL_COUNT = UTIL_ToInt16(s) - 1;
    		//zGameNr = UTIL_ToString(SL_COUNT);
    		if (UTIL_ToInt16(s)<10)
    			GameName = GameName.substr(0,idx)+UTIL_ToString(SL_COUNT)+"/10]";
    		else
    			GameName = GameName.substr(0,idx-1)+UTIL_ToString(SL_COUNT)+"/10]";
    
    		CONSOLE_Print( "[GAME: " + m_GameName + "] trying to rehost as public game [" + GameName + "]" );
    		m_GameState = GAME_PUBLIC;
    		m_GameName = GameName;
    		m_GHost->m_HostCounter++;
    		m_GHost->SaveHostCounter();
    		if (m_GHost->m_MaxHostCounter>0)
    			if (m_GHost->m_HostCounter>m_GHost->m_MaxHostCounter)
    				m_GHost->m_HostCounter = 1;
    		m_HostCounter = m_GHost->m_HostCounter;
    		m_GHost->m_QuietRehost = true;
    		m_RefreshError = false;
    		m_Rehost = true;
    		AutoSetHCL();
    		AddGameName(GameName);
    		//				m_GHost->UDPChatSend("|rehost "+GameName);
    
    		//SendAllChat("Rehosting ...");
    		for( vector<CBNET *> :: iterator i = m_GHost->m_BNETs.begin( ); i != m_GHost->m_BNETs.end( ); i++ )
    		{
    			// unqueue any existing game refreshes because we're going to assume the next successful game refresh indicates that the rehost worked
    			// this ignores the fact that it's possible a game refresh was just sent and no response has been received yet
    			// we assume this won't happen very often since the only downside is a potential false positive
    			(*i)->UnqueueGameRefreshes( );
    			(*i)->QueueGameUncreate( );
    			(*i)->QueueEnterChat( );
    			// the game creation message will be sent on the next refresh
    		}
    		m_CreationTime = GetTime( );
    		m_LastRefreshTime = GetTime( );
    		}
    сам пару раз проверил, зашел-вышел несколько раз =) работает
    но это канешно просто тупой рехост с изменением имени паба, на айсикапе по-другому сделано, там имя паба + кол-во слотов, и живут они отдельно друг от друга )), заходил лично проверить меняется ли название паба, зашел в игру что-то типа apso gogo rmk [5/10], в правом верхнем углу было написано просто apso gogo rmk ))
    правда толку по-моему мало, смотришь вроде бы [4/10] пытаешься зайти, пишет игра уже началась...

    а свое творение попробую сегодня вечерком посмотрю что с ботом будет, когда народу зайдет человек 5 за раз =) и выйдут, и все это одновременно =))
  12. zazulya Ньюфаг

    Сообщения:
    80
    Спасибы:
    0
    а вот уже косяк =) сидим в четвером, я закрыл остальные слоты, бот вышел, потом следом за ним игрок вышел а рехоста не было, ну и в итоге считать не правильно стало
  13. zazulya Ньюфаг

    Сообщения:
    80
    Спасибы:
    0
    а так вобще то ловко =) не паришься, сидишь ждешь)) хотя кому-то покажется ерундой...
    норм вроде бы работает, только не понятно что было с тем случаем, потому что сейчас такая же ситуация была, бот вышел, за ним игрок вышел, рехост был нормально...
    вобщем еще тестить надо
  14. Apx Ньюфаг

    Сообщения:
    165
    Спасибы:
    0
    Я так понимаю, что это считается как рехост (по сути это он и есть), а значит на пг такие фокусы сразу в бане окажутся.
  15. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Темка норм ,тока у мну такой вопрос:
    как я понял оно пишет сколько людей в лобби / 10 - где 10 как постоянная переменная.
    А если с создал игру и закрыл 4 слота, ибо хочу сыграть в 6-ом, оно ведь будет писать в рехостах всеравно 3/10 а не 3/6 ????
    Если да, то подскажете что в коде прописать вместо "/10" чтобы оно учитывало в рехостах по открытым слотам.
    И вот еще 1 идейка насчет того если много людей заходит сразу чтоб рехосты непутались, то можно ведь поставить к примеру чтобы было так:
    Функция рехоста запускалась бы так, как она стоит сейчас в стандарте на всех ботах, тоесть если в игру некто незаходит за определенное кол-во времени (выставляется в конфиге), то бот делает авторехост, то и в данной функции зделать примерно также: зашол 1 игрок, потом 2, если после 2-го втечении 5 секунд некто незашол оно рехостит 2/10. Или зашло сразу 5 игроков, потом 5 секунд некто незашол и оно рехостит как 5/10. Ну вот както так.
    Спс взаранее.
  16. zazulya Ньюфаг

    Сообщения:
    80
    Спасибы:
    0
    да вобщем немного попользовался и бросил это дело... я там не все учел, например у игрока пинг подскочет и его выкинет, рехоста не будет, а значит и кол-во занятых слотов не правильно будет показывать, или еще например елси использовать команду !open или !close, опять же, игрока выкинет, а рехоста не будет, можно конечно во все эти команды дописать рехост, но как то не то...
  17. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Мне вот что интересно:
    кпримеру в игре 7 человек, 1 кикает из-за пинга, рехоста нету, в игре 6 человек а название 7/10, но если с игры выйдет сам ктото рехост будет с норм посчетом тоесть 5/10 а не 6/10 ??
  18. zazulya Ньюфаг

    Сообщения:
    80
    Спасибы:
    0
    нене, так и будет с ошибкой, 6/10, можно самому рехост сделать правильный =)
    там ведь все очень просто организовано, вышел чел, рехост на -1, зашел - рехост на +1... количество слотов не считается, не проверяется, просто +/- 1
  19. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Не ну смотри в формуле типа Кол-во играков/10, тоесть если даже 1 кикает, а потом 1 выходит поидее должно правильно рехостануть с кол-вом играков/10
  20. zazulya Ньюфаг

    Сообщения:
    80
    Спасибы:
    0
    ты думаешь что это количество игроков взятое где-то еще? что-то типа getnumplayers? нет. это просто переменная, которая считается только в пределах этой процедуры и больше нигде...
    если какая идея возникнет, пиши обязательно =)
Статус темы:
Закрыта.