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

Вывод лвла героев.

Тема в разделе 'Запуск и Поддержка', создана пользователем Guard, 12 ноя 2011.

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

    Сообщения:
    473
    Спасибы:
    47
    Сборка бота GHost:
    Ghost++ RAKAL Edition
    Дата начала использования бота:
    00.00.2009
    Skype:
    Мой статус
    И снова здравствуйте.
    Что и куда нужно вставить, чтобы бот сохранял левелы героев в базу, которые потом можно будет выводить в стату, как на этом сайте.
  2. ____ROB____ Старожила

    Сообщения:
    1.008
    Спасибы:
    22
    Сборка бота GHost:
    Ghost One 1.5
    ууу, мне тоже интересно, но я на 85% уверен что нужно править бота, что бы он вносил инфу об лвл героя.
    пс дай пруф на сайт :spy:
  3. Guard Старожила

    Сообщения:
    473
    Спасибы:
    47
    Сборка бота GHost:
    Ghost++ RAKAL Edition
    Дата начала использования бота:
    00.00.2009
    Skype:
    Мой статус
    Да, по дефолту нету таблицы и значения в боте для лвла.

    Но сама карта отправляет данные, бот просто не "берет"...
  4. ____ROB____ Старожила

    Сообщения:
    1.008
    Спасибы:
    22
    Сборка бота GHost:
    Ghost One 1.5
  5. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    править бота, завтра скажу что именно добавить.
  6. Guard Старожила

    Сообщения:
    473
    Спасибы:
    47
    Сборка бота GHost:
    Ghost++ RAKAL Edition
    Дата начала использования бота:
    00.00.2009
    Skype:
    Мой статус

    тЫк

    Бот Ghost++ .
  7. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    http://www.playdota.com/forums/lofi/t-197390.html
    вот все что посылает карта, по крайней мере до 66доты

    я могу дать код как ловить, а вот с заносом в бд не дам по двум причинам: у мну абсолютно другой бот и качать чистый я не буду, кидать сорс с своего тоже не вариант, и еще в новый засовывать очень муторна около 8 мест менять надо.
  8. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    statsdota.cpp

    Код:
     if( KeyString.size( ) >= 5 && KeyString.substr( 0, 5 ) == "Level" )
    					   {
    						    if( !m_Players[ValueInt] )
                                  m_Players[ValueInt] = new CDBDotAPlayer( );
    
    						   m_Players[ValueInt]->SetLevel(UTIL_ToInt32(KeyString.substr(5,KeyString.size( ))));
    						  CONSOLE_Print( "[STATS] Set level (player nr: "+UTIL_ToString(ValueInt)+"): "+KeyString.substr(5,KeyString.size( )) );
    					
    
    					   }
    +1
  9. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    PS: У кого проблема с отображением асистов после -ff, enda пишите :)
  10. rost Гуру

    Сообщения:
    1.258
    Спасибы:
    150
    Сборка бота GHost:
    LtG
    Дата начала использования бота:
    01.11.2010
    Skype:
    Мой статус
    Хмм... у меня странно както после фф через раз инфу сейвит, есть у кого догадки?
    Раз все норма, раз пусто (итемы пустуют... причем вот что я заметил, так то что итемы у ливнувших в наличии... а из этого следует, что инфу сохраняет в бд, у героев когда они ливнули или дисконт, именно ихние все арты, хотя ясно же что их потом продают... а у доигравших нечего)
  11. ViperNight ▒▒▒▒▒▒▒▒▒

    Сообщения:
    311
    Спасибы:
    154
    Сборка бота GHost:
    GHost++ r597M
    Дата начала использования бота:
    20.01.2007
    Skype:
    Мой статус
    Модился GHost++ r577
    Если ничего не забыл и если аккуратно вставить, по идее должно хорошо работать.

    Для начала хочу сказать несколько слов по поводу данных "тезисов":

    Значения подобные этому - uint32_t nLevel рекомендуется добавлять в определённой последовательности, после предварительно выбранного одного определённого значения, во всех файлах, подлежащих к изменению, например, я вставлял данное дело везде после героя (m_Hero, string nHero и тому подобные), по аналогии с полем в таблице в базе данных.
    В некоторых местах последовательности придерживаться не обязательно, и вставлять отдельные куски кода относительно указанного места, но в некоторых местах последовательность строго обязательно, например, там, где идёт составление запросов, для занесения данных в базу данных.


    Итак, поехали...


    Создаём еще одно поле в таблице dotaplayers в базе данных ghost'a:
    Код:
    ALTER TABLE `dotaplayers` ADD `level` TINYINT( 2 ) UNSIGNED NOT NULL DEFAULT '0' AFTER `hero` ;

    Редактируем файлы:


    ghostdb.cpp

    Найти:
    Код:
    uint32_t CGHostDB :: DotAPlayerAdd(
    дополнить круглые скобки следующим значением:
    Код:
    , uint32_t level
    Найти:
    Код:
    CCallableDotAPlayerAdd *CGHostDB :: ThreadedDotAPlayerAdd(
    дополнить круглые скобки следующим значением:
    Код:
    , uint32_t level
    Найти:
    Код:
    //
    // CDBDotAPlayer
    //
    
    CDBDotAPlayer :: CDBDotAPlayer( ) : m_ID( 0 ), m_GameID( 0 ), m_Colour( 0 )
    дополнить строку следующим значением:
    Код:
    , m_Level( 1 )
    сразу ниже по тексту найти:
    Код:
    CDBDotAPlayer :: CDBDotAPlayer(
    дополнить круглые скобки следующим значением:
    Код:
    , uint32_t nLevel
    тут же, на строку ниже, дополнить строку следующим:
    Код:
    , m_Level( nLevel )

    ghostdb.h

    Найти:
    Код:
    virtual uint32_t DotAPlayerAdd(
    дополнить круглые скобки следующим значением:
    Код:
    , uint32_t level
    Найти:
    Код:
    virtual CCallableDotAPlayerAdd *ThreadedDotAPlayerAdd(
    дополнить круглые скобки следующим значением:
    Код:
    , uint32_t level
    Найти:
    Код:
    class CCallableDotAPlayerAdd : virtual public CBaseCallable
    ниже, в protected добавить:
    Код:
    uint32_t m_Level;
    тут же ниже, в public, в круглые скобки к CCallableDotAPlayerAdd( добавить:
    Код:
    , uint32_t nLevel
    в этой же ^ строке, после CBaseCallable( ) добавить к аналогичным следующее:
    Код:
    , m_Level ( nLevel )
    Найти:
    Код:
    //
    // CDBDotAPlayer
    //
    
    class CDBDotAPlayer
    в private добавить:
    Код:
    uint32_t m_Level;
    в круглые скобки к CDBDotAPlayer(, уже имеющей члены, добавить:
    Код:
    , uint32_t nLevel
    Найти:
    Код:
    string GetHero( )			{ return m_Hero; }
    добавить под ней:
    Код:
    uint32_t GetLevel()			{ return m_Level; }
    Найти:
    Код:
    void SetHero( string nHero )					{ m_Hero = nHero; }
    добавить под ней:
    Код:
    void SetLevel( uint32_t nLevel )				{ m_Level = nLevel; }

    ghostdbmysql.cpp

    Найти:
    Код:
    CCallableDotAPlayerAdd *CGHostDBMySQL :: ThreadedDotAPlayerAdd(
    дополнить круглые скобки следующим значением:
    Код:
    , uint32_t level
    Найти:
    Код:
    CCallableDotAPlayerAdd *Callable = new CMySQLCallableDotAPlayerAdd(
    дополнить круглые скобки следующим значением:
    Код:
    , level
    Найти:
    Код:
    uint32_t MySQLDotAPlayerAdd(
    дополнить круглые скобки следующим значением:
    Код:
    , uint32_t level
    Найти:
    Код:
    string Query = "INSERT INTO dotaplayers (
    в данном ^ запросе найти:
    Код:
    , hero
    после добавить:
    Код:
    , level
    Найти:
    Код:
    "', '" + EscHero + "', "
    после добавить:
    Код:
     + UTIL_ToString( level ) + ", "
    Найти:
    Код:
    , m_Hero
    после добавить:
    Код:
    , m_Level

    ghostdbmysql.h

    Найти:
    Код:
    virtual CCallableDotAPlayerAdd *ThreadedDotAPlayerAdd(
    дополнить круглые скобки следующим значением:
    Код:
    , uint32_t level
    Найти:
    Код:
    uint32_t MySQLDotAPlayerAdd(
    дополнить круглые скобки следующим значением:
    Код:
    , uint32_t level
    Найти:
    Код:
    CMySQLCallableDotAPlayerAdd( uint32_t
    дополнить круглые скобки следующим значением:
    Код:
    , uint32_t nLevel
    Найти:
    Код:
    CCallableDotAPlayerAdd(
    дополнить круглые скобки следующим значением:
    Код:
    , nLevel

    ghostdbsqlite.cpp

    Найти:
    Код:
    uint32_t CGHostDBSQLite :: DotAPlayerAdd(
    дополнить круглые скобки следующим значением:
    Код:
    , uint32_t level
    Найти:
    Код:
    CCallableDotAPlayerAdd *CGHostDBSQLite :: ThreadedDotAPlayerAdd(
    дополнить круглые скобки следующим значением:
    Код:
    , uint32_t level
    Найти:
    Код:
    CCallableDotAPlayerAdd *Callable = new CCallableDotAPlayerAdd(
    дополнить круглые скобки следующим значением:
    Код:
    , level
    Найти:
    Код:
    Callable->SetResult( DotAPlayerAdd(
    дополнить круглые скобки следующим значением:
    Код:
    , level

    ghostdbsqlite.h

    Найти:
    Код:
    virtual uint32_t DotAPlayerAdd(
    дополнить круглые скобки следующим значением:
    Код:
    , uint32_t level
    Найти:
    Код:
    virtual CCallableDotAPlayerAdd *ThreadedDotAPlayerAdd(
    дополнить круглые скобки следующим значением:
    Код:
    , uint32_t level

    statsdota.cpp

    Найти блок кода:
    Код:
    							if( KeyString.size( ) >= 5 && KeyString.substr( 0, 4 ) == "Hero" )
    							{
    								// a hero died
    
    								string VictimColourString = KeyString.substr( 4 );
    								uint32_t VictimColour = UTIL_ToUInt32( VictimColourString );
    								CGamePlayer *Killer = m_Game->GetPlayerFromColour( ValueInt );
    								CGamePlayer *Victim = m_Game->GetPlayerFromColour( VictimColour );
    
    								if( Killer && Victim )
    									CONSOLE_Print( "[STATSDOTA: " + m_Game->GetGameName( ) + "] player [" + Killer->GetName( ) + "] killed player [" + Victim->GetName( ) + "]" );
    								else if( Victim )
    								{
    									if( ValueInt == 0 )
    										CONSOLE_Print( "[STATSDOTA: " + m_Game->GetGameName( ) + "] the Sentinel killed player [" + Victim->GetName( ) + "]" );
    									else if( ValueInt == 6 )
    										CONSOLE_Print( "[STATSDOTA: " + m_Game->GetGameName( ) + "] the Scourge killed player [" + Victim->GetName( ) + "]" );
    								}
    							}

    Вставить после:
    Код:
    							else if( KeyString.size( ) >= 6 && KeyString.substr( 0, 5 ) == "Level" )
    							{
    								string LevelString = KeyString.substr( 5 );
    								uint32_t Level = UTIL_ToUInt32( LevelString );
    								CGamePlayer *Player = m_Game->GetPlayerFromColour( ValueInt );
    
    								if( Player )
    								{
    									if( !m_Players[ValueInt] )
    										m_Players[ValueInt] = new CDBDotAPlayer( );
    
    									m_Players[ValueInt]->SetLevel( Level );
    									CONSOLE_Print( "[STATSDOTA: " + m_Game->GetGameName( ) + "] "+ Player->GetName( ) + " has gained a level " + UTIL_ToString( m_Players[ValueInt]->GetLevel( ) ) );
    								}
    							}

    Найти:
    Код:
    // save the dotaplayers
    затем найти:
    Код:
    , m_Players[i]->GetHero( )
    добавить после:
    Код:
    , m_Players[i]->GetLevel( )


    Upd: Добавил .patch файл.

    Код:
    Index: ghost/ghostdb.cpp
    ===================================================================
    --- ghost/ghostdb.cpp	(revision 577)
    +++ ghost/ghostdb.cpp	(working copy)
    @@ -132,7 +132,7 @@
     	return 0;
     }
     
    -uint32_t CGHostDB :: DotAPlayerAdd( uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills )
    +uint32_t CGHostDB :: DotAPlayerAdd( uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t level, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills )
     {
     	return 0;
     }
    @@ -262,7 +262,7 @@
     	return NULL;
     }
     
    -CCallableDotAPlayerAdd *CGHostDB :: ThreadedDotAPlayerAdd( uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills )
    +CCallableDotAPlayerAdd *CGHostDB :: ThreadedDotAPlayerAdd( uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t level, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills )
     {
     	return NULL;
     }
    @@ -493,13 +493,13 @@
     // CDBDotAPlayer
     //
     
    -CDBDotAPlayer :: CDBDotAPlayer( ) : m_ID( 0 ), m_GameID( 0 ), m_Colour( 0 ), m_Kills( 0 ), m_Deaths( 0 ), m_CreepKills( 0 ), m_CreepDenies( 0 ), m_Assists( 0 ), m_Gold( 0 ), m_NeutralKills( 0 ), m_NewColour( 0 ), m_TowerKills( 0 ), m_RaxKills( 0 ), m_CourierKills( 0 )
    +CDBDotAPlayer :: CDBDotAPlayer( ) : m_ID( 0 ), m_GameID( 0 ), m_Colour( 0 ), m_Kills( 0 ), m_Deaths( 0 ), m_CreepKills( 0 ), m_CreepDenies( 0 ), m_Assists( 0 ), m_Gold( 0 ), m_NeutralKills( 0 ), m_NewColour( 0 ), m_TowerKills( 0 ), m_RaxKills( 0 ), m_CourierKills( 0 ), m_Level( 1 )
     {
     
     }
     
    -CDBDotAPlayer :: CDBDotAPlayer( uint32_t nID, uint32_t nGameID, uint32_t nColour, uint32_t nKills, uint32_t nDeaths, uint32_t nCreepKills, uint32_t nCreepDenies, uint32_t nAssists, uint32_t nGold, uint32_t nNeutralKills, string nItem1, string nItem2, string nItem3, string nItem4, string nItem5, string nItem6, string nHero, uint32_t nNewColour, uint32_t nTowerKills, uint32_t nRaxKills, uint32_t nCourierKills )
    -    : m_ID( nID ), m_GameID( nGameID ), m_Colour( nColour ), m_Kills( nKills ), m_Deaths( nDeaths ), m_CreepKills( nCreepKills ), m_CreepDenies( nCreepDenies ), m_Assists( nAssists ), m_Gold( nGold ), m_NeutralKills( nNeutralKills ), m_Hero( nHero ), m_NewColour( nNewColour ), m_TowerKills( nTowerKills ), m_RaxKills( nRaxKills ), m_CourierKills( nCourierKills )
    +CDBDotAPlayer :: CDBDotAPlayer( uint32_t nID, uint32_t nGameID, uint32_t nColour, uint32_t nKills, uint32_t nDeaths, uint32_t nCreepKills, uint32_t nCreepDenies, uint32_t nAssists, uint32_t nGold, uint32_t nNeutralKills, string nItem1, string nItem2, string nItem3, string nItem4, string nItem5, string nItem6, string nHero, uint32_t nLevel, uint32_t nNewColour, uint32_t nTowerKills, uint32_t nRaxKills, uint32_t nCourierKills )
    +    : m_ID( nID ), m_GameID( nGameID ), m_Colour( nColour ), m_Kills( nKills ), m_Deaths( nDeaths ), m_CreepKills( nCreepKills ), m_CreepDenies( nCreepDenies ), m_Assists( nAssists ), m_Gold( nGold ), m_NeutralKills( nNeutralKills ), m_Hero( nHero ), m_Level( nLevel ), m_NewColour( nNewColour ), m_TowerKills( nTowerKills ), m_RaxKills( nRaxKills ), m_CourierKills( nCourierKills )
     {
     	m_Items[0] = nItem1;
     	m_Items[1] = nItem2;
    Index: ghost/ghostdb.h
    ===================================================================
    --- ghost/ghostdb.h	(revision 577)
    +++ ghost/ghostdb.h	(working copy)
    @@ -90,7 +90,7 @@
     	virtual uint32_t GamePlayerCount( string name );
     	virtual CDBGamePlayerSummary *GamePlayerSummaryCheck( string name );
     	virtual uint32_t DotAGameAdd( uint32_t gameid, uint32_t winner, uint32_t min, uint32_t sec );
    -	virtual uint32_t DotAPlayerAdd( uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills );
    +	virtual uint32_t DotAPlayerAdd( uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t level, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills );
     	virtual uint32_t DotAPlayerCount( string name );
     	virtual CDBDotAPlayerSummary *DotAPlayerSummaryCheck( string name );
     	virtual string FromCheck( uint32_t ip );
    @@ -119,7 +119,7 @@
     	virtual CCallableGamePlayerAdd *ThreadedGamePlayerAdd( uint32_t gameid, string name, string ip, uint32_t spoofed, string spoofedrealm, uint32_t reserved, uint32_t loadingtime, uint32_t left, string leftreason, uint32_t team, uint32_t colour );
     	virtual CCallableGamePlayerSummaryCheck *ThreadedGamePlayerSummaryCheck( string name );
     	virtual CCallableDotAGameAdd *ThreadedDotAGameAdd( uint32_t gameid, uint32_t winner, uint32_t min, uint32_t sec );
    -	virtual CCallableDotAPlayerAdd *ThreadedDotAPlayerAdd( uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills );
    +	virtual CCallableDotAPlayerAdd *ThreadedDotAPlayerAdd( uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t level, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills );
     	virtual CCallableDotAPlayerSummaryCheck *ThreadedDotAPlayerSummaryCheck( string name );
     	virtual CCallableDownloadAdd *ThreadedDownloadAdd( string map, uint32_t mapsize, string name, string ip, uint32_t spoofed, string spoofedrealm, uint32_t downloadtime );
     	virtual CCallableScoreCheck *ThreadedScoreCheck( string category, string name, string server );
    @@ -441,6 +441,7 @@
     	string m_Item5;
     	string m_Item6;
     	string m_Hero;
    +	uint32_t m_Level;
     	uint32_t m_NewColour;
     	uint32_t m_TowerKills;
     	uint32_t m_RaxKills;
    @@ -448,7 +449,7 @@
     	uint32_t m_Result;
     
     public:
    -	CCallableDotAPlayerAdd( uint32_t nGameID, uint32_t nColour, uint32_t nKills, uint32_t nDeaths, uint32_t nCreepKills, uint32_t nCreepDenies, uint32_t nAssists, uint32_t nGold, uint32_t nNeutralKills, string nItem1, string nItem2, string nItem3, string nItem4, string nItem5, string nItem6, string nHero, uint32_t nNewColour, uint32_t nTowerKills, uint32_t nRaxKills, uint32_t nCourierKills ) : CBaseCallable( ), m_GameID( nGameID ), m_Colour( nColour ), m_Kills( nKills ), m_Deaths( nDeaths ), m_CreepKills( nCreepKills ), m_CreepDenies( nCreepDenies ), m_Assists( nAssists ), m_Gold( nGold ), m_NeutralKills( nNeutralKills ), m_Item1( nItem1 ), m_Item2( nItem2 ), m_Item3( nItem3 ), m_Item4( nItem4 ), m_Item5( nItem5 ), m_Item6( nItem6 ), m_Hero( nHero ), m_NewColour( nNewColour ), m_TowerKills( nTowerKills ), m_RaxKills( nRaxKills ), m_CourierKills( nCourierKills ), m_Result( 0 ) { }
    +	CCallableDotAPlayerAdd( uint32_t nGameID, uint32_t nColour, uint32_t nKills, uint32_t nDeaths, uint32_t nCreepKills, uint32_t nCreepDenies, uint32_t nAssists, uint32_t nGold, uint32_t nNeutralKills, string nItem1, string nItem2, string nItem3, string nItem4, string nItem5, string nItem6, string nHero, uint32_t nLevel, uint32_t nNewColour, uint32_t nTowerKills, uint32_t nRaxKills, uint32_t nCourierKills ) : CBaseCallable( ), m_GameID( nGameID ), m_Colour( nColour ), m_Kills( nKills ), m_Deaths( nDeaths ), m_CreepKills( nCreepKills ), m_CreepDenies( nCreepDenies ), m_Assists( nAssists ), m_Gold( nGold ), m_NeutralKills( nNeutralKills ), m_Item1( nItem1 ), m_Item2( nItem2 ), m_Item3( nItem3 ), m_Item4( nItem4 ), m_Item5( nItem5 ), m_Item6( nItem6 ), m_Hero( nHero ), m_Level ( nLevel ), m_NewColour( nNewColour ), m_TowerKills( nTowerKills ), m_RaxKills( nRaxKills ), m_CourierKills( nCourierKills ), m_Result( 0 ) { }
     	virtual ~CCallableDotAPlayerAdd( );
     
     	virtual uint32_t GetResult( )				{ return m_Result; }
    @@ -739,6 +740,7 @@
     	uint32_t m_NeutralKills;
     	string m_Items[6];
     	string m_Hero;
    +	uint32_t m_Level;
     	uint32_t m_NewColour;
     	uint32_t m_TowerKills;
     	uint32_t m_RaxKills;
    @@ -746,7 +748,7 @@
     
     public:
     	CDBDotAPlayer( );
    -	CDBDotAPlayer( uint32_t nID, uint32_t nGameID, uint32_t nColour, uint32_t nKills, uint32_t nDeaths, uint32_t nCreepKills, uint32_t nCreepDenies, uint32_t nAssists, uint32_t nGold, uint32_t nNeutralKills, string nItem1, string nItem2, string nItem3, string nItem4, string nItem5, string nItem6, string nHero, uint32_t nNewColour, uint32_t nTowerKills, uint32_t nRaxKills, uint32_t nCourierKills );
    +	CDBDotAPlayer( uint32_t nID, uint32_t nGameID, uint32_t nColour, uint32_t nKills, uint32_t nDeaths, uint32_t nCreepKills, uint32_t nCreepDenies, uint32_t nAssists, uint32_t nGold, uint32_t nNeutralKills, string nItem1, string nItem2, string nItem3, string nItem4, string nItem5, string nItem6, string nHero, uint32_t nLevel, uint32_t nNewColour, uint32_t nTowerKills, uint32_t nRaxKills, uint32_t nCourierKills );
     	~CDBDotAPlayer( );
     
     	uint32_t GetID( )			{ return m_ID; }
    @@ -761,6 +763,7 @@
     	uint32_t GetNeutralKills( )	{ return m_NeutralKills; }
     	string GetItem( unsigned int i );
     	string GetHero( )			{ return m_Hero; }
    +	uint32_t GetLevel( )		{ return m_Level; }
     	uint32_t GetNewColour( )	{ return m_NewColour; }
     	uint32_t GetTowerKills( )	{ return m_TowerKills; }
     	uint32_t GetRaxKills( )		{ return m_RaxKills; }
    @@ -776,6 +779,7 @@
     	void SetNeutralKills( uint32_t nNeutralKills )	{ m_NeutralKills = nNeutralKills; }
     	void SetItem( unsigned int i, string item );
     	void SetHero( string nHero )					{ m_Hero = nHero; }
    +	void SetLevel( uint32_t nLevel )				{ m_Level = nLevel; }
     	void SetNewColour( uint32_t nNewColour )		{ m_NewColour = nNewColour; }
     	void SetTowerKills( uint32_t nTowerKills )		{ m_TowerKills = nTowerKills; }
     	void SetRaxKills( uint32_t nRaxKills )			{ m_RaxKills = nRaxKills; }
    Index: ghost/ghostdbmysql.cpp
    ===================================================================
    --- ghost/ghostdbmysql.cpp	(revision 577)
    +++ ghost/ghostdbmysql.cpp	(working copy)
    @@ -344,14 +344,14 @@
     	return Callable;
     }
     
    -CCallableDotAPlayerAdd *CGHostDBMySQL :: ThreadedDotAPlayerAdd( uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills )
    +CCallableDotAPlayerAdd *CGHostDBMySQL :: ThreadedDotAPlayerAdd( uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t level, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills )
     {
     	void *Connection = GetIdleConnection( );
     
     	if( !Connection )
                     ++m_NumConnections;
     
    -	CCallableDotAPlayerAdd *Callable = new CMySQLCallableDotAPlayerAdd( gameid, colour, kills, deaths, creepkills, creepdenies, assists, gold, neutralkills, item1, item2, item3, item4, item5, item6, hero, newcolour, towerkills, raxkills, courierkills, Connection, m_BotID, m_Server, m_Database, m_User, m_Password, m_Port );
    +	CCallableDotAPlayerAdd *Callable = new CMySQLCallableDotAPlayerAdd( gameid, colour, kills, deaths, creepkills, creepdenies, assists, gold, neutralkills, item1, item2, item3, item4, item5, item6, hero, level, newcolour, towerkills, raxkills, courierkills, Connection, m_BotID, m_Server, m_Database, m_User, m_Password, m_Port );
     	CreateThread( Callable );
             ++m_OutstandingCallables;
     	return Callable;
    @@ -869,7 +869,7 @@
     	return RowID;
     }
     
    -uint32_t MySQLDotAPlayerAdd( void *conn, string *error, uint32_t botid, uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills )
    +uint32_t MySQLDotAPlayerAdd( void *conn, string *error, uint32_t botid, uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t level, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills )
     {
     	uint32_t RowID = 0;
     	string EscItem1 = MySQLEscapeString( conn, item1 );
    @@ -879,7 +879,7 @@
     	string EscItem5 = MySQLEscapeString( conn, item5 );
     	string EscItem6 = MySQLEscapeString( conn, item6 );
     	string EscHero = MySQLEscapeString( conn, hero );
    -	string Query = "INSERT INTO dotaplayers ( botid, gameid, colour, kills, deaths, creepkills, creepdenies, assists, gold, neutralkills, item1, item2, item3, item4, item5, item6, hero, newcolour, towerkills, raxkills, courierkills ) VALUES ( " + UTIL_ToString( botid ) + ", " + UTIL_ToString( gameid ) + ", " + UTIL_ToString( colour ) + ", " + UTIL_ToString( kills ) + ", " + UTIL_ToString( deaths ) + ", " + UTIL_ToString( creepkills ) + ", " + UTIL_ToString( creepdenies ) + ", " + UTIL_ToString( assists ) + ", " + UTIL_ToString( gold ) + ", " + UTIL_ToString( neutralkills ) + ", '" + EscItem1 + "', '" + EscItem2 + "', '" + EscItem3 + "', '" + EscItem4 + "', '" + EscItem5 + "', '" + EscItem6 + "', '" + EscHero + "', " + UTIL_ToString( newcolour ) + ", " + UTIL_ToString( towerkills ) + ", " + UTIL_ToString( raxkills ) + ", " + UTIL_ToString( courierkills ) + " )";
    +	string Query = "INSERT INTO dotaplayers ( botid, gameid, colour, kills, deaths, creepkills, creepdenies, assists, gold, neutralkills, item1, item2, item3, item4, item5, item6, hero, level, newcolour, towerkills, raxkills, courierkills ) VALUES ( " + UTIL_ToString( botid ) + ", " + UTIL_ToString( gameid ) + ", " + UTIL_ToString( colour ) + ", " + UTIL_ToString( kills ) + ", " + UTIL_ToString( deaths ) + ", " + UTIL_ToString( creepkills ) + ", " + UTIL_ToString( creepdenies ) + ", " + UTIL_ToString( assists ) + ", " + UTIL_ToString( gold ) + ", " + UTIL_ToString( neutralkills ) + ", '" + EscItem1 + "', '" + EscItem2 + "', '" + EscItem3 + "', '" + EscItem4 + "', '" + EscItem5 + "', '" + EscItem6 + "', '" + EscHero + "', " + UTIL_ToString( level ) + ", " + UTIL_ToString( newcolour ) + ", " + UTIL_ToString( towerkills ) + ", " + UTIL_ToString( raxkills ) + ", " + UTIL_ToString( courierkills ) + " )";
     
     	if( mysql_real_query( (MYSQL *)conn, Query.c_str( ), Query.size( ) ) != 0 )
     		*error = mysql_error( (MYSQL *)conn );
    @@ -1326,7 +1326,7 @@
     	Init( );
     
     	if( m_Error.empty( ) )
    -		m_Result = MySQLDotAPlayerAdd( m_Connection, &m_Error, m_SQLBotID, m_GameID, m_Colour, m_Kills, m_Deaths, m_CreepKills, m_CreepDenies, m_Assists, m_Gold, m_NeutralKills, m_Item1, m_Item2, m_Item3, m_Item4, m_Item5, m_Item6, m_Hero, m_NewColour, m_TowerKills, m_RaxKills, m_CourierKills );
    +		m_Result = MySQLDotAPlayerAdd( m_Connection, &m_Error, m_SQLBotID, m_GameID, m_Colour, m_Kills, m_Deaths, m_CreepKills, m_CreepDenies, m_Assists, m_Gold, m_NeutralKills, m_Item1, m_Item2, m_Item3, m_Item4, m_Item5, m_Item6, m_Hero, m_Level, m_NewColour, m_TowerKills, m_RaxKills, m_CourierKills );
     
     	Close( );
     }
    Index: ghost/ghostdbmysql.h
    ===================================================================
    --- ghost/ghostdbmysql.h	(revision 577)
    +++ ghost/ghostdbmysql.h	(working copy)
    @@ -203,7 +203,7 @@
     	virtual CCallableGamePlayerAdd *ThreadedGamePlayerAdd( uint32_t gameid, string name, string ip, uint32_t spoofed, string spoofedrealm, uint32_t reserved, uint32_t loadingtime, uint32_t left, string leftreason, uint32_t team, uint32_t colour );
     	virtual CCallableGamePlayerSummaryCheck *ThreadedGamePlayerSummaryCheck( string name );
     	virtual CCallableDotAGameAdd *ThreadedDotAGameAdd( uint32_t gameid, uint32_t winner, uint32_t min, uint32_t sec );
    -	virtual CCallableDotAPlayerAdd *ThreadedDotAPlayerAdd( uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills );
    +	virtual CCallableDotAPlayerAdd *ThreadedDotAPlayerAdd( uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t level, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills );
     	virtual CCallableDotAPlayerSummaryCheck *ThreadedDotAPlayerSummaryCheck( string name );
     	virtual CCallableDownloadAdd *ThreadedDownloadAdd( string map, uint32_t mapsize, string name, string ip, uint32_t spoofed, string spoofedrealm, uint32_t downloadtime );
     	virtual CCallableScoreCheck *ThreadedScoreCheck( string category, string name, string server );
    @@ -236,7 +236,7 @@
     uint32_t MySQLGamePlayerAdd( void *conn, string *error, uint32_t botid, uint32_t gameid, string name, string ip, uint32_t spoofed, string spoofedrealm, uint32_t reserved, uint32_t loadingtime, uint32_t left, string leftreason, uint32_t team, uint32_t colour );
     CDBGamePlayerSummary *MySQLGamePlayerSummaryCheck( void *conn, string *error, uint32_t botid, string name );
     uint32_t MySQLDotAGameAdd( void *conn, string *error, uint32_t botid, uint32_t gameid, uint32_t winner, uint32_t min, uint32_t sec );
    -uint32_t MySQLDotAPlayerAdd( void *conn, string *error, uint32_t botid, uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills );
    +uint32_t MySQLDotAPlayerAdd( void *conn, string *error, uint32_t botid, uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t level, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills );
     CDBDotAPlayerSummary *MySQLDotAPlayerSummaryCheck( void *conn, string *error, uint32_t botid, string name );
     bool MySQLDownloadAdd( void *conn, string *error, uint32_t botid, string map, uint32_t mapsize, string name, string ip, uint32_t spoofed, string spoofedrealm, uint32_t downloadtime );
     double MySQLScoreCheck( void *conn, string *error, uint32_t botid, string category, string name, string server );
    @@ -427,7 +427,7 @@
     class CMySQLCallableDotAPlayerAdd : public CCallableDotAPlayerAdd, public CMySQLCallable
     {
     public:
    -	CMySQLCallableDotAPlayerAdd( uint32_t nGameID, uint32_t nColour, uint32_t nKills, uint32_t nDeaths, uint32_t nCreepKills, uint32_t nCreepDenies, uint32_t nAssists, uint32_t nGold, uint32_t nNeutralKills, string nItem1, string nItem2, string nItem3, string nItem4, string nItem5, string nItem6, string nHero, uint32_t nNewColour, uint32_t nTowerKills, uint32_t nRaxKills, uint32_t nCourierKills, void *nConnection, uint32_t nSQLBotID, string nSQLServer, string nSQLDatabase, string nSQLUser, string nSQLPassword, uint16_t nSQLPort ) : CBaseCallable( ), CCallableDotAPlayerAdd( nGameID, nColour, nKills, nDeaths, nCreepKills, nCreepDenies, nAssists, nGold, nNeutralKills, nItem1, nItem2, nItem3, nItem4, nItem5, nItem6, nHero, nNewColour, nTowerKills, nRaxKills, nCourierKills ), CMySQLCallable( nConnection, nSQLBotID, nSQLServer, nSQLDatabase, nSQLUser, nSQLPassword, nSQLPort ) { }
    +	CMySQLCallableDotAPlayerAdd( uint32_t nGameID, uint32_t nColour, uint32_t nKills, uint32_t nDeaths, uint32_t nCreepKills, uint32_t nCreepDenies, uint32_t nAssists, uint32_t nGold, uint32_t nNeutralKills, string nItem1, string nItem2, string nItem3, string nItem4, string nItem5, string nItem6, string nHero, uint32_t nLevel, uint32_t nNewColour, uint32_t nTowerKills, uint32_t nRaxKills, uint32_t nCourierKills, void *nConnection, uint32_t nSQLBotID, string nSQLServer, string nSQLDatabase, string nSQLUser, string nSQLPassword, uint16_t nSQLPort ) : CBaseCallable( ), CCallableDotAPlayerAdd( nGameID, nColour, nKills, nDeaths, nCreepKills, nCreepDenies, nAssists, nGold, nNeutralKills, nItem1, nItem2, nItem3, nItem4, nItem5, nItem6, nHero, nLevel, nNewColour, nTowerKills, nRaxKills, nCourierKills ), CMySQLCallable( nConnection, nSQLBotID, nSQLServer, nSQLDatabase, nSQLUser, nSQLPassword, nSQLPort ) { }
     	virtual ~CMySQLCallableDotAPlayerAdd( ) { }
     
     	virtual void operator( )( );
    Index: ghost/ghostdbsqlite.cpp
    ===================================================================
    --- ghost/ghostdbsqlite.cpp	(revision 577)
    +++ ghost/ghostdbsqlite.cpp	(working copy)
    @@ -1047,11 +1047,11 @@
     	return RowID;
     }
     
    -uint32_t CGHostDBSQLite :: DotAPlayerAdd( uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills )
    +uint32_t CGHostDBSQLite :: DotAPlayerAdd( uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t level, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills )
     {
     	uint32_t RowID = 0;
     	sqlite3_stmt *Statement;
    -	m_DB->Prepare( "INSERT INTO dotaplayers ( gameid, colour, kills, deaths, creepkills, creepdenies, assists, gold, neutralkills, item1, item2, item3, item4, item5, item6, hero, newcolour, towerkills, raxkills, courierkills ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )", (void **)&Statement );
    +	m_DB->Prepare( "INSERT INTO dotaplayers ( gameid, colour, kills, deaths, creepkills, creepdenies, assists, gold, neutralkills, item1, item2, item3, item4, item5, item6, hero, level, newcolour, towerkills, raxkills, courierkills ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )", (void **)&Statement );
     
     	if( Statement )
     	{
    @@ -1591,10 +1591,10 @@
     	return Callable;
     }
     
    -CCallableDotAPlayerAdd *CGHostDBSQLite :: ThreadedDotAPlayerAdd( uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills )
    +CCallableDotAPlayerAdd *CGHostDBSQLite :: ThreadedDotAPlayerAdd( uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t level, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills )
     {
    -	CCallableDotAPlayerAdd *Callable = new CCallableDotAPlayerAdd( gameid, colour, kills, deaths, creepkills, creepdenies, assists, gold, neutralkills, item1, item2, item3, item4, item5, item6, hero, newcolour, towerkills, raxkills, courierkills );
    -	Callable->SetResult( DotAPlayerAdd( gameid, colour, kills, deaths, creepkills, creepdenies, assists, gold, neutralkills, item1, item2, item3, item4, item5, item6, hero, newcolour, towerkills, raxkills, courierkills ) );
    +	CCallableDotAPlayerAdd *Callable = new CCallableDotAPlayerAdd( gameid, colour, kills, deaths, creepkills, creepdenies, assists, gold, neutralkills, item1, item2, item3, item4, item5, item6, hero, level, newcolour, towerkills, raxkills, courierkills );
    +	Callable->SetResult( DotAPlayerAdd( gameid, colour, kills, deaths, creepkills, creepdenies, assists, gold, neutralkills, item1, item2, item3, item4, item5, item6, hero, level, newcolour, towerkills, raxkills, courierkills ) );
     	Callable->SetReady( true );
     	return Callable;
     }
    Index: ghost/ghostdbsqlite.h
    ===================================================================
    --- ghost/ghostdbsqlite.h	(revision 577)
    +++ ghost/ghostdbsqlite.h	(working copy)
    @@ -228,7 +228,7 @@
     	virtual uint32_t GamePlayerCount( string name );
     	virtual CDBGamePlayerSummary *GamePlayerSummaryCheck( string name );
     	virtual uint32_t DotAGameAdd( uint32_t gameid, uint32_t winner, uint32_t min, uint32_t sec );
    -	virtual uint32_t DotAPlayerAdd( uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills );
    +	virtual uint32_t DotAPlayerAdd( uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t level, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills );
     	virtual uint32_t DotAPlayerCount( string name );
     	virtual CDBDotAPlayerSummary *DotAPlayerSummaryCheck( string name );
     	virtual string FromCheck( uint32_t ip );
    @@ -258,7 +258,7 @@
     	virtual CCallableGamePlayerAdd *ThreadedGamePlayerAdd( uint32_t gameid, string name, string ip, uint32_t spoofed, string spoofedrealm, uint32_t reserved, uint32_t loadingtime, uint32_t left, string leftreason, uint32_t team, uint32_t colour );
     	virtual CCallableGamePlayerSummaryCheck *ThreadedGamePlayerSummaryCheck( string name );
     	virtual CCallableDotAGameAdd *ThreadedDotAGameAdd( uint32_t gameid, uint32_t winner, uint32_t min, uint32_t sec );
    -	virtual CCallableDotAPlayerAdd *ThreadedDotAPlayerAdd( uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills );
    +	virtual CCallableDotAPlayerAdd *ThreadedDotAPlayerAdd( uint32_t gameid, uint32_t colour, uint32_t kills, uint32_t deaths, uint32_t creepkills, uint32_t creepdenies, uint32_t assists, uint32_t gold, uint32_t neutralkills, string item1, string item2, string item3, string item4, string item5, string item6, string hero, uint32_t level, uint32_t newcolour, uint32_t towerkills, uint32_t raxkills, uint32_t courierkills );
     	virtual CCallableDotAPlayerSummaryCheck *ThreadedDotAPlayerSummaryCheck( string name );
     	virtual CCallableDownloadAdd *ThreadedDownloadAdd( string map, uint32_t mapsize, string name, string ip, uint32_t spoofed, string spoofedrealm, uint32_t downloadtime );
     	virtual CCallableW3MMDPlayerAdd *ThreadedW3MMDPlayerAdd( string category, uint32_t gameid, uint32_t pid, string name, string flag, uint32_t leaver, uint32_t practicing );
    Index: ghost/statsdota.cpp
    ===================================================================
    --- ghost/statsdota.cpp	(revision 577)
    +++ ghost/statsdota.cpp	(working copy)
    @@ -117,6 +117,21 @@
     										CONSOLE_Print( "[STATSDOTA: " + m_Game->GetGameName( ) + "] the Scourge killed player [" + Victim->GetName( ) + "]" );
     								}
     							}
    +							else if( KeyString.size( ) >= 6 && KeyString.substr( 0, 5 ) == "Level" )
    +							{
    +								string LevelString = KeyString.substr( 5 );
    +								uint32_t Level = UTIL_ToUInt32( LevelString );
    +								CGamePlayer *Player = m_Game->GetPlayerFromColour( ValueInt );
    +
    +								if( Player )
    +								{
    +									if( !m_Players[ValueInt] )
    +										m_Players[ValueInt] = new CDBDotAPlayer( );
    +
    +									m_Players[ValueInt]->SetLevel( Level );
    +									CONSOLE_Print( "[STATSDOTA: " + m_Game->GetGameName( ) + "] "+ Player->GetName( ) + " has gained a level " + UTIL_ToString( m_Players[ValueInt]->GetLevel( ) ) );
    +								}
    +							}
     							else if( KeyString.size( ) >= 8 && KeyString.substr( 0, 7 ) == "Courier" )
     							{
     								// a courier died
    @@ -419,7 +434,7 @@
     		{
     			if( m_Players[i] )
     			{
    -				GHost->m_Callables.push_back( DB->ThreadedDotAPlayerAdd( GameID, m_Players[i]->GetColour( ), m_Players[i]->GetKills( ), m_Players[i]->GetDeaths( ), m_Players[i]->GetCreepKills( ), m_Players[i]->GetCreepDenies( ), m_Players[i]->GetAssists( ), m_Players[i]->GetGold( ), m_Players[i]->GetNeutralKills( ), m_Players[i]->GetItem( 0 ), m_Players[i]->GetItem( 1 ), m_Players[i]->GetItem( 2 ), m_Players[i]->GetItem( 3 ), m_Players[i]->GetItem( 4 ), m_Players[i]->GetItem( 5 ), m_Players[i]->GetHero( ), m_Players[i]->GetNewColour( ), m_Players[i]->GetTowerKills( ), m_Players[i]->GetRaxKills( ), m_Players[i]->GetCourierKills( ) ) );
    +				GHost->m_Callables.push_back( DB->ThreadedDotAPlayerAdd( GameID, m_Players[i]->GetColour( ), m_Players[i]->GetKills( ), m_Players[i]->GetDeaths( ), m_Players[i]->GetCreepKills( ), m_Players[i]->GetCreepDenies( ), m_Players[i]->GetAssists( ), m_Players[i]->GetGold( ), m_Players[i]->GetNeutralKills( ), m_Players[i]->GetItem( 0 ), m_Players[i]->GetItem( 1 ), m_Players[i]->GetItem( 2 ), m_Players[i]->GetItem( 3 ), m_Players[i]->GetItem( 4 ), m_Players[i]->GetItem( 5 ), m_Players[i]->GetHero( ), m_Players[i]->GetLevel( ), m_Players[i]->GetNewColour( ), m_Players[i]->GetTowerKills( ), m_Players[i]->GetRaxKills( ), m_Players[i]->GetCourierKills( ) ) );
                                     ++Players;
     			}
     		}
    
    Ev1lArthaS, Inhuman, Doterok и ещё 1-му нравится это.
  12. MySQL123 Guest

    Сообщения:
    117
    Спасибы:
    0
    Вобщем все норм, но как вывести на сайт я не допру?помогите!
  13. MySQL123 Guest

    Сообщения:
    117
    Спасибы:
    0
    Апну тему, действительно оч нада, подскажыте как вывести в game.php, я как не пытался не получилось
  14. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    common.php - изменить запрос, который возвращает инфу о игре:
    function getGameInfo($gid){
    	$sql = "
    	   SELECT winner, dp.gameid, gp.colour, newcolour, original as hero, description, [u][b]kills[/b][/u], deaths, assists, creepkills, creepdenies, neutralkills, towerkills, gold,  raxkills, courierkills
    [b]...[/b]


    Потом в самом game.php:
    [b]...[/b]
    while ($list = $db->fetch_array($result,'assoc')) {
    	    $kills=$list["kills"];
    	   [b] [u]$level=$list["level"];[/u][/b]
    		$deaths=$list["deaths"];
    		$assists=$list["assists"];
    [b]...[/b]
  15. ViperNight ▒▒▒▒▒▒▒▒▒

    Сообщения:
    311
    Спасибы:
    154
    Сборка бота GHost:
    GHost++ r597M
    Дата начала использования бота:
    20.01.2007
    Skype:
    Мой статус
    includes/common.php

    game.php
  16. Deals Старожила

    Сообщения:
    784
    Спасибы:
    21
    Сборка бота GHost:
    Ghost One 1.7.266
    Skype:
    Мой статус
    Код:
    ALTER TABLE `dotaplayers` ADD `level` TINYINT( 2 ) UNSIGNED NOT NULL DEFAULT '1' AFTER `hero` ;
    1 думаю лучше будет.
  17. ViperNight ▒▒▒▒▒▒▒▒▒

    Сообщения:
    311
    Спасибы:
    154
    Сборка бота GHost:
    GHost++ r597M
    Дата начала использования бота:
    20.01.2007
    Skype:
    Мой статус
    Тут можно что угодно вписать, оно будет только использоваться для заполнения поля level:
    1. Для уже имеющихся в базе игр, ещё при отсутствии модификации;
    2. При наличии этого поля в базе и использовании не модифицированного бота.
    Тут и 0 и 1 будет верно.

    Например, если игрок вообще не выбрал героя, то будет 0 (нет героя – нет уровня).
  18. Deals Старожила

    Сообщения:
    784
    Спасибы:
    21
    Сборка бота GHost:
    Ghost One 1.7.266
    Skype:
    Мой статус
    0 - false, 1 - true
    Пожалуй единственное отличие. Ну и не может быть 0 лвл у героя.
    P.S.: Я понимаю что значит
    NOT NULL DEFAULT '1'
  19. Synth (LM) Пантограф!

    Сообщения:
    2.762
    Спасибы:
    172
    Сборка бота GHost:
    My own version of GhostOne
    Дата начала использования бота:
    15.06.2008
    Skype:
    Мой статус
    Лучше ноль: если ноль - герой не пикнут.
  20. ViperNight ▒▒▒▒▒▒▒▒▒

    Сообщения:
    311
    Спасибы:
    154
    Сборка бота GHost:
    GHost++ r597M
    Дата начала использования бота:
    20.01.2007
    Skype:
    Мой статус
    Да тут всё просто, у меня сделано так, что, в статистике 0 уровень при выводе вообще скрывается (в играх, проведённых в каком-то там 2009, бородатом году, когда мода бота для сохранения уровня героя ещё не было). Соответственно, если бы я сделал 1, то тогда появилась бы неувязка с последующими играми, в то время, когда мод на уровни уже был сделан, где герой был реально выбран и сохранился с первым уровнем при занесении в базу.
    Согласись, что лучше вообще ничего не писать напротив уровня героев, чем писать единицы или нули, либо просто сделать replace с нуля на '??' или 'N/A'.