posts - 12,  comments - 16,  trackbacks - 0
   大家都知道在战网,Ghost自动主机,建立dota游戏的时候,胜负的判断是必须推倒生命之树或者冰封王座,但有的时候对面很早就退了,大家为了战绩也必须慢慢推完,否则没有战绩。
   于是我修改ghost自动主胜负判断,类似VS平台一样.
(http://cid-4b5bdf2f7fd33dee.office.live.com/self.aspx/pvpgn/ghostcb%5E_release%5E_win32%5E_x86.rar,在这可以直接下载我已经修改编译好的)
当没有推完的情况下,判定最后退出游戏的一方为胜.
  首先去http://www.codelain.com/官方下载ghost源码包.(我用的版本ghost17.1cb3.6source.zip:http://www.codelain.com/forum/index.php?topic=13083.0)
  1 在game.cpp 中,修改析构函数CGame :: ~CGame( )(注保存游戏是在析构函数中实现的)
CGame :: ~CGame( )
{
    
if( m_CallableGameAdd && m_CallableGameAdd->GetReady( ) )
    {
        
if( m_CallableGameAdd->GetResult( ) > 0 )
        {
            CONSOLE_Print( 
"[GAME: " + m_GameName + "] saving player/stats data to database" );

            
// store the CDBGamePlayers in the database
            uint32_t max_leave_time=0;//记录玩家最晚退出游戏的时间
            uint32_t winner
=0;
            
bool is_save=true;

            
for( vector<CDBGamePlayer *> :: iterator i = m_DBGamePlayers.begin( ); i != m_DBGamePlayers.end( ); i++ )
            {
                m_GHost
->m_Callables.push_back( m_GHost->m_DB->ThreadedGamePlayerAdd( m_CallableGameAdd->GetResult( ), (*i)->GetName( ), (*i)->GetIP( ), (*i)->GetSpoofed( ), (*i)->GetSpoofedRealm( ), (*i)->GetReserved( ), (*i)->GetLoadingTime( ), (*i)->GetLeft( ), (*i)->GetLeftReason( ), (*i)->GetTeam( ), (*i)->GetColour( ) ) );
                
if((*i)->GetLeft()>max_leave_time)
                {
                    max_leave_time
=(*i)->GetLeft();
                    winner
=(*i)->GetTeam()+1;//最后退出游戏的一方为胜方,1 近卫 2 天灾
                }

            }

            
if( max_leave_time<300)//游戏小于5分钟不记录战绩
            {
                is_save
=false;
                CONSOLE_Print( 
"[GAME: " + m_GameName + "] game end in 5 min,Don't store the stats" );

            }

            
// store the stats in the database

            
if(is_save &&  m_Stats )
            {
                
if(m_Stats->getWinner()<=0)//ok
                {

                    CONSOLE_Print( 
"[GAME: " + m_GameName + "] using winner by judeg last leave" );
                    m_Stats
->setWinner(winner);

                }
else//表示推倒了生命之树或冰封王座,因此不修改
                {
                    CONSOLE_Print( 
"[GAME: " + m_GameName + "] using winner by ghost" );

                }
                m_Stats
->Save( m_GHost, m_GHost->m_DB, m_CallableGameAdd->GetResult( ) );
            }
        }
        
else
            CONSOLE_Print( 
"[GAME: " + m_GameName + "] unable to save player/stats data to database" );

        m_GHost
->m_DB->RecoverCallable( m_CallableGameAdd );
        delete m_CallableGameAdd;
        m_CallableGameAdd 
= NULL;
    }

  2 在stats.h中,CStatsDota的基类添加两个虚函数,用于设置winner。
    virtual uint32_t getWinner()
    
{
        
return 0;
    }

    
virtual void setWinner(uint32_t winner)
    
{

    }

  3. 在statsdota.h实现两个虚函数
  
virtual uint32_t getWinner()
    
{
        
return m_Winner;
    }

    
virtual void setWinner(uint32_t winner)
    
{
        
this->m_Winner=winner;
    }

ok,这样ghost在未推完的情况下也能统计胜负了.
个人联系方式:
kuramawzw@163.com
QQ:370180103
如有问题请pm我。
posted on 2010-07-01 11:01 kuramawzw 阅读(765) 评论(0)  编辑 收藏 引用 所属分类: 战网 PVPGN & GHOST

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2010年7月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(5)

随笔分类

随笔档案

文章档案

Algorithm

搜索

  •  

最新评论

阅读排行榜

评论排行榜