青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 12,  comments - 16,  trackbacks - 0

 

一般用Ghost主機(jī)游戲名字XXXXX #2,當(dāng)此我想顯示當(dāng)前加入游戲中的人數(shù),例如Dota,XXXXX #2(2/10),表示當(dāng)前有2個(gè)人加入.

首先對(duì)于戰(zhàn)網(wǎng)PVPGN不支持修改游戲名字,因此我還修改pvpgn,使得支持修改游戲名字,閑話少說,先看一下我的效果。


(在http://cid-4b5bdf2f7fd33dee.office.live.com/browse.aspx/pvpgn,可以下載我win32 x86環(huán)境下編譯好的ghostcb,pvpgn1.99)
下面開始開工了
修改ghost
(1)下載ghost源碼了http://www.codelain.com/forum/index.php?topic=13083.0
(2)bnet.h中,修改函數(shù)QueueGameRefresh,這個(gè)方法用于游戲創(chuàng)建,游戲更新的,我在這方法加入一個(gè)參數(shù),player_num:游戲人數(shù)
void QueueGameRefresh( unsigned char state, string gameName, string hostName, CMap *map, CSaveGame *saveGame, uint32_t upTime, uint32_t hostCounter ,uint32_t player_num=0);
  bnet.cpp修改QueueGameRefresh

 void CBNET :: QueueGameRefresh( unsigned char state, string gameName, string hostName, CMap *map, CSaveGame *saveGame, uint32_t upTime, uint32_t hostCounter ,uint32_t player_num/*=0*/)
{
    
if( hostName.empty( ) )
    
{
        BYTEARRAY UniqueName 
= m_Protocol->GetUniqueName( );
        hostName 
= string( UniqueName.begin( ), UniqueName.end( ) );
    }

    
          
             //moidfy gameName with player_num    
    gameName=gameName+"("+UTIL_ToString(player_num)+"/10)";//在游戲名字中顯示人數(shù)
           //下面的就不用改了

(3)game_base.cpp中,修改函數(shù)   function CBaseGame :: Update( void *fd, void *send_fd )

 for( vector<CBNET *> :: iterator i = m_GHost->m_BNETs.begin( ); i != m_GHost->m_BNETs.end( ); i++ )
        
{
            
// don't queue a game refresh message if the queue contains more than 1 packet because they're very low priority

            
if( (*i)->GetOutPacketsQueued( ) <= 1 )
            
{

                    //add m_players.size() in parmeter list 傳入?yún)?shù)當(dāng)前加入游戲的人數(shù)
                (*i)->QueueGameRefresh( m_GameState, m_GameName, string( ), m_Map, m_SaveGame, GetTime( ) - m_CreationTime, m_HostCounter ,m_Players.size());

                Refreshed 
= true;
            }

        }

4 在game_base.cpp中,函數(shù)CBaseGame :: EventPlayerJoined和函數(shù)CBaseGame :: EventPlayerLeft的末尾添加以下代碼,即當(dāng)有玩家加入或者退出游戲時(shí),更新游戲名字

for( vector<CBNET *> :: iterator i = m_GHost->m_BNETs.begin( ); i != m_GHost->m_BNETs.end( ); i++ )
    
{
        
// don't queue a game refresh message if the queue contains more than 1 packet because they're very low priority

        
if( (*i)->GetOutPacketsQueued( ) <= 1 )
        
{

            (
*i)->QueueGameRefresh( m_GameState, m_GameName, string( ), m_Map, m_SaveGame, GetTime( ) - m_CreationTime, m_HostCounter ,m_Players.size());
        }

    }

ghost就修改好了,下面則是要改pvpgn,支持游戲名字的修改。

(1)還是去下載pvpgn的源碼包
pvpgn-199.r577.tar.gz
http://pvpgn.berlios.de/index.php?page=files
至于pvpgn的編譯,我用的vs平臺(tái),在pvpgn包內(nèi)doc文件夾下有個(gè)編譯方法,還是比較麻煩的,在這里我就不多說了,網(wǎng)上也有文章說編譯1.99的http://yjfyy.spaces.live.com/blog/cns!B6AD95965E3A9326!550.entry()
(2)在game.h里添加一個(gè)修改游戲名字的方法申明,
void game_set_name(t_game * game,const char * name);
如下

    extern t_game_flag game_get_flag(t_game const * game);
extern int game_get_count_by_clienttag(t_clienttag ct);
extern int game_is_ladder(t_game *game);
extern int game_discisloss(t_game *game);
extern int game_set_channel(t_game * game, t_channel * channel);
extern t_channel * game_get_channel(t_game * game);
//add function game_set_name
extern void game_set_name(t_game * game,const char * name);


         添加一個(gè)CRITICAL_SECTION 臨界區(qū)變量(注這個(gè)只是在windows下的,對(duì)于linux可以linux下互斥變量替換),用于多線程game_list的互斥訪問。在這里只是申明,至于定義和初始化,我把它放在winmain.cpp中,這個(gè)在后面我再細(xì)講

#ifndef INCLUDED_GAME_TYPES
#define INCLUDED_GAME_TYPES
//add a CRITICAL_SECTION
#ifdef _USE_SECTION
#include 
<Windows.h>
extern CRITICAL_SECTION  gamelist_section; 
#endif


      (3) game.cpp中,在#inlcude "game.h",前定義_USE_SECTION

#define _USE_SECTION
#include 
"game.h"
#undef  _USE_SECTION

 在這里說明一下,為什么 要用_USE_SECTION。
若直接在game.h不用#ifdef _USE_SECTION,那不就省事了。
事實(shí)上這么弄會(huì)出很多編譯錯(cuò)誤,主要就是 windows.h惹的禍,因?yàn)檫@樣別的地方#include  "game.h",把windows.h也包含去了,會(huì)發(fā)生很多編譯錯(cuò)誤。
      添加 game_set_name函數(shù)的定義
   

extern void game_set_name(t_game * game,const char * name)
{
    EnterCriticalSection(
&gamelist_section);//臨界區(qū),互斥訪問,以免產(chǎn)生讀寫沖突
    
if(stricmp(game->name,name)!=0)
    
{
        
        xfree((
void *)game->name);
        game
->name=xstrdup(name);
    
    }

    LeaveCriticalSection(
&gamelist_section);
}

(4)CRITICAL_SECTION  gamelist_section變量的定義及初始化(注在game.h只是申明,extern)
在winmain.cpp中 添加#include "bnet/game.h"

#define  _USE_SECTION
#include 
"bnetd/game.h"
#ifdef _USE_SECTION
CRITICAL_SECTION  gamelist_section; 
#endif


     
在int CALLBACK WinMain函數(shù)中添加 gamelist_section的初始化

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE reserved, LPSTR lpCmdLine, int nCmdShow)
{
    
    
#ifdef _USE_SECTION
    InitializeCriticalSection(
&gamelist_section);//初始化....
#endif
    
    
int result;
    Console     console;

    
if (cmdline_load(__argc, __argv) != 1{
        
return -1;
    }

(5)準(zhǔn)備工作已經(jīng)做好了,現(xiàn)在就可以更新游戲名字了
static int _client_startgame4(t_connection * c, t_packet const *const packet)這個(gè)方法用于處理游戲建立以及游戲更新,我們就在這個(gè)方法里面更新游戲名字
hanlde_bnet.cpp中static int _client_startgame4(t_connection * c, t_packet const *const packet)函數(shù)加入一行代碼

 

if ((currgame = conn_get_game(c))) {
#ifdef _SLOTS
        
//update the game name  ########加入這行,要使得這個(gè)生效,在編譯宏中加入_SLOTS,或者直接在game.cpp加入一行#define _SLOTS
                        game_set_name(currgame,gamename); 
#endif
        
if ((status & CLIENT_STARTGAME4_STATUSMASK_OPEN_VALID) == status) {
        
if (status & CLIENT_STARTGAME4_STATUS_START)
            game_set_status(currgame, game_status_started);
        
else if (status & CLIENT_STARTGAME4_STATUS_FULL)
            game_set_status(currgame, game_status_full);
        
else
            game_set_status(currgame, game_status_open);
        }
 else {
        eventlog(eventlog_level_error, __FUNCTION__, 
"[%d] unknown startgame4 status %d (clienttag: %s)", conn_get_socket(c), status, clienttag_uint_to_str(conn_get_clienttag(c)));
        }


(6) 至此因該基本完成,不過還有一個(gè)bug,處理pvpgan服務(wù)端與客戶端游戲更新不一致的情況
例如服務(wù)端游戲名字是XXXXX #1(1/10),而客戶端沒有及時(shí)更新游戲列表,XXXXX #1(0/10),此時(shí)客戶端加入游戲時(shí),就會(huì)出錯(cuò). 修改gamelist_find_game方法,修改游戲名字查找游戲方法,我只匹配'('前面的部分,XXXXX #1(1/10)與XXXXX #1(0/10)認(rèn)為是同一個(gè)游戲。
  添加一個(gè)游戲名字匹配的輔助方法,這個(gè)只在game.cpp中添加就可以了,為內(nèi)部函數(shù)。

    bool prefix_string(const char * str,const char * prex)
{
    
int i=0;
    
if(strlen(str)<strlen(prex))
    
{
        
return false;
    }

    
while(prex[i]!=0 && prex[i]!='(')
    
{
        
if(prex[i]!=str[i])
            
return false;
        i
++;
    }

    
return true;

}

  修改gamelist_find_game方法

extern t_game * gamelist_find_game(char const * name, t_clienttag ctag, t_game_type type)
{
    t_elist 
*curr;
    t_game 
*game;
    //臨界區(qū)
    EnterCriticalSection(
&gamelist_section);
    elist_for_each(curr,
&gamelist_head)
    
{
    game 
= elist_entry(curr,t_game,glist_link);
    
if ((type==game_type_all || game->type==type)
        
&& ctag == game->clienttag
        
&& game->name
        
&& 
           //主要修改部分,游戲名字不一致時(shí),只匹配(前面的部分
           (!
strcasecmp(name,game->name) || prefix_string(game->name,name))) 
        
{
            LeaveCriticalSection(
&gamelist_section);
            
return game;
        }

    }
     //退出臨界區(qū)
    LeaveCriticalSection(
&gamelist_section);

    
return NULL;
}

   
  修改 gamelist_find_game_available方法,同上
  
  

extern t_game * gamelist_find_game_available(char const * name, t_clienttag ctag, t_game_type type)
{
    t_elist 
*curr;
    t_game 
*game;
    t_game_status status;
    EnterCriticalSection(
&gamelist_section);
    elist_for_each(curr,
&gamelist_head)
    
{
        game 
= elist_entry(curr,t_game,glist_link);
        status 
= game->status;

        
if ((type==game_type_all || game->type==type) && (ctag == game->clienttag) && (game->name)
            
&& [color=red]
              //主要修改部分
              ((
!strcasecmp(name,game->name) || prefix_string(game->name,name))) [/color] && (game->status != game_status_started) &&
             (game
->status != game_status_done))
        
{
            LeaveCriticalSection(
&gamelist_section);
            
return game;
        }

    }

    LeaveCriticalSection(
&gamelist_section);

    
return NULL;
}


   最后說明一下,pvpgn要使得顯示游戲人數(shù)這一功能生效,需要在譯編譯宏中加入_SLOTS的定義,或者直接在在hanlde_bnet.cpp最前面,加上
#define _SLOTS。
    
   ok,完成


個(gè)人聯(lián)系方式:
email :kuramawzw@163.com
qq:370180103
如有問題請(qǐng)pm我.






 

posted on 2010-07-01 12:56 kuramawzw 閱讀(2211) 評(píng)論(4)  編輯 收藏 引用 所屬分類: 戰(zhàn)網(wǎng) PVPGN & GHOST

FeedBack:
# 這是評(píng)論
2010-07-12 18:54 | winter boots
這個(gè)原來是靠軟件實(shí)現(xiàn)的啊,哪里可以下載到呢?  回復(fù)  更多評(píng)論
  
# re: Ghost自動(dòng)主機(jī)在游戲名字中顯示當(dāng)前加入游戲的人數(shù)!
# re: Ghost自動(dòng)主機(jī)在游戲名字中顯示當(dāng)前加入游戲的人數(shù)!
2010-09-15 11:17 | verlock
請(qǐng)問如何將其移植到linux系統(tǒng),具體怎么修改,謝謝  回復(fù)  更多評(píng)論
  
# re: Ghost自動(dòng)主機(jī)在游戲名字中顯示當(dāng)前加入游戲的人數(shù)![未登錄]
2010-10-11 11:13 | kuramawzw
我使用了windows的臨界區(qū),把臨界區(qū)相關(guān)的代碼改成linux下的mutex之類就可以  回復(fù)  更多評(píng)論
  
<2025年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用鏈接

留言簿(5)

隨筆分類

隨筆檔案

文章檔案

Algorithm

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产一区二区丝袜高跟鞋图片| 欧美精品免费视频| 国产精品免费视频观看| 亚洲精品在线观看免费| 亚洲国产精品电影在线观看| 久久综合狠狠综合久久综合88| 一色屋精品视频在线观看网站| 麻豆91精品91久久久的内涵| 久久综合中文字幕| 日韩午夜视频在线观看| av成人毛片| 国产日韩亚洲欧美| 欧美电影免费观看| 欧美日韩国产在线播放网站| 午夜视频在线观看一区二区三区 | 亚洲自拍另类| 亚洲一区二区三| 国外成人在线| 亚洲国产精品一区二区第一页 | 欧美精品成人| 午夜精品成人在线视频| 久久久精品动漫| 日韩写真视频在线观看| 亚洲专区国产精品| 亚洲福利视频一区二区| 日韩亚洲欧美高清| 激情欧美日韩| 夜夜精品视频一区二区| 国产主播一区二区三区| 亚洲国产成人精品女人久久久 | 亚洲精品偷拍| 亚洲欧美卡通另类91av| 亚洲第一在线视频| 99精品久久免费看蜜臀剧情介绍| 国产综合一区二区| 亚洲精品综合久久中文字幕| 国产亚洲欧美日韩美女| 亚洲精品在线免费| 影音先锋日韩资源| 亚洲综合电影| 一区二区三区精品在线 | 欧美激情精品久久久久| 国产美女精品| 亚洲麻豆视频| 亚洲电影免费观看高清完整版在线观看| 亚洲免费观看在线观看| 欧美在线首页| 亚洲欧美区自拍先锋| 欧美va天堂在线| 久久人人爽人人| 国产欧美精品一区二区色综合 | 午夜精品福利在线观看| 欧美成人a视频| 久久综合婷婷| 国产日韩在线视频| 一区二区三区久久网| 亚洲美女啪啪| 美女亚洲精品| 免费看的黄色欧美网站| 国产自产在线视频一区| 亚洲综合色自拍一区| 亚洲线精品一区二区三区八戒| 欧美国产精品人人做人人爱| 欧美国产日本在线| 亚洲福利精品| 麻豆九一精品爱看视频在线观看免费| 久久免费黄色| 国内一区二区三区在线视频| 午夜日韩在线| 久久精品国产v日韩v亚洲| 国产精品久久久久免费a∨大胸| 99热在这里有精品免费| 亚洲五月婷婷| 国产精品美女久久福利网站| 亚洲天堂成人在线观看| 亚洲欧美日韩一区二区| 国产精品大片| 亚洲欧美久久久| 欧美一区二区在线看| 国产亚洲网站| 久久久亚洲精品一区二区三区| 另类天堂av| 亚洲激情午夜| 欧美三日本三级少妇三2023| 日韩视频永久免费观看| 一区二区三区日韩在线观看| 国产精品欧美久久久久无广告| 亚洲欧美日韩国产综合| 久久久国产精品一区二区三区| 精品电影在线观看| 欧美成人一品| 亚洲一级影院| 久久成人一区| 亚洲国产婷婷综合在线精品 | 亚洲夜晚福利在线观看| 欧美一区二区三区在线| 激情小说另类小说亚洲欧美 | 亚洲成色www8888| 欧美激情一区二区在线 | 亚洲黄色成人| 在线一区二区三区四区| 国产精品一区一区| 噜噜噜噜噜久久久久久91| 亚洲美女视频在线观看| 久久精彩视频| 99精品国产99久久久久久福利| 国产精品高清一区二区三区| 久久精品日韩一区二区三区| 亚洲日本无吗高清不卡| 久久精品国产99精品国产亚洲性色| 亚洲国产精品黑人久久久 | 久久久久免费观看| 日韩午夜在线电影| 久久亚洲影院| 亚洲一区二区三区精品视频| 尤物精品国产第一福利三区 | 久久综合中文字幕| 亚洲一区二区高清视频| 亚洲福利免费| 久久男人av资源网站| 亚洲天堂av高清| 亚洲三级电影全部在线观看高清| 国产欧美日韩综合精品二区| 欧美日韩一区三区四区| 裸体女人亚洲精品一区| 欧美在线播放一区| 亚洲线精品一区二区三区八戒| 欧美激情一区| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美与欧洲交xxxx免费观看 | 亚洲第一页中文字幕| 国产日韩欧美在线视频观看| 欧美日韩一区不卡| 欧美1区免费| 久久亚洲精品中文字幕冲田杏梨| 亚洲综合精品四区| 在线视频欧美日韩| 亚洲精品在线三区| 亚洲福利小视频| 欧美国产日韩精品免费观看| 久久裸体艺术| 久久婷婷丁香| 久久精品欧洲| 久久久噜噜噜久久| 久久久久综合网| 久久婷婷久久| 久久久久一区二区| 久久久噜噜噜久噜久久 | 亚洲国产国产亚洲一二三| 韩国一区二区三区美女美女秀| 国产亚洲福利社区一区| 国产人久久人人人人爽| 国产亚洲成av人在线观看导航| 国产嫩草一区二区三区在线观看| 国产精品午夜春色av| 国产伦精品一区二区三区视频黑人 | 久久动漫亚洲| 久久国产精品久久久久久电车| 久久精品国产久精国产思思| 久久精品在线观看| 欧美成人dvd在线视频| 亚洲国产1区| 99精品国产在热久久| 亚洲一区二区三区在线观看视频| 亚洲欧美区自拍先锋| 久久精品99久久香蕉国产色戒| 久久久噜噜噜久久狠狠50岁| 噜噜爱69成人精品| 欧美日韩在线大尺度| 国产欧美日韩精品一区| 一区二区三区在线不卡| 亚洲人成在线观看| 午夜精品福利在线观看| 另类酷文…触手系列精品集v1小说| 欧美激情亚洲自拍| 亚洲午夜性刺激影院| 久久精品一区四区| 欧美精品一区二区三区很污很色的 | 欧美国产专区| 中日韩视频在线观看| 久久精品1区| 欧美日韩国产在线播放| 国模吧视频一区| 亚洲最新合集| 久久久久久久欧美精品| 亚洲欧洲精品一区二区三区波多野1战4 | 欧美一级大片在线观看| 欧美大秀在线观看| 亚洲一区二区高清| 欧美+日本+国产+在线a∨观看| 国产精品免费网站| 亚洲娇小video精品| 香蕉av777xxx色综合一区| 欧美成人国产| 亚洲欧美日本伦理| 欧美日韩在线视频一区| 亚洲激情二区| 另类图片综合电影| 亚洲欧美日韩视频二区| 欧美视频成人|