傳奇原始碼分析-客戶端(遊戲邏輯處理源分析二)

hejishan發表於2008-06-10
 
 
5.接受登入成功後,接收GameSrv伺服器傳送的訊息:
接收GameGate傳送的訊息:CClientSocket::OnSocketMessage的FD_READ事件中,PacketQ.PushQ((BYTE*)pszPacket);把接收到的訊息,壓入PacketQ佇列中。處理PacketQ佇列資料是由CGameProcess::Load()時呼叫OnTimer在CGameProcess::OnTimer中處理的,   
處理過程為:
OnMessageReceive;
ProcessPacket();
  ProcessDefaultPacket();
 
OnMessageReceive函式;  
1.     判斷是否收到心跳資料包,傳送'*',傳送心跳資料包。
2.     呼叫OnSocketMessageRecieve函式。這個函式裡面詳細處理了客戶端的遊戲執行邏輯。如果是‘+’開頭(資料包)則呼叫OnProcPacketNotEncode處理這種型別資料包。否則得到_TDEFAULTMESSAGE資料包,進行遊戲邏輯處理。
OnProcPacketNotEncode說明:
   收到GameSrv伺服器的相應訊息:
     "GOOD":可以執行動作。 m_bMotionLock為假。
     "FAIL":不允許執行動作。人物被拉回移動前位置。
     "LNG"
     "ULNG"
     "WID"
     "UWID"
     "FIR"
     "UFIR"
     "PWR"
3.     CGameProcess::OnSocketMessageRecieve(char *pszMsg)函式。處理遊戲相關的訊息。
   SM_SENDNOTICE: 伺服器提示資訊:
SM_NEWMAP: 使用者登入後,伺服器傳送的初始化地圖訊息。
SM_LOGON: 使用者登入訊息(伺服器處理後返回結果)。使用者登入成功後,在本地建立遊戲物件,併傳送訊息,請求返回使用者物品清單(魔法,等級,物品等)。
SM_MAPDESCRIPTION: 得到伺服器傳送的地圖的描述資訊。
SM_ABILITY:伺服器傳送的本玩家金錢,職業資訊。
SM_WINEXP
SM_SUBABILITY : 伺服器傳送的玩家技能(魔法,殺傷力,速度,毒藥,中毒恢復,生命恢復,符咒恢復)
SM_ SM_SENDMYMAGIC: 使用者魔法列表資訊。
SM_MAGIC_LVEXP: 魔法等級列表。
    SM_BAGITEMS使用者物品清單 (玩家CM_QUERYBAGITEMS訊息)
SM_SENDUSEITEMS:使用者裝備清單
SM_ADDITEM: 揀東西
SM_DELITEM: 丟棄物品。
等等。
 
4.     部分資料未處理,加入m_xWaitPacketQueue佇列中由ProcessPacket處理。
 
    新登入遊戲玩家:在OnSocketMessageRecieve函式中依次收到的訊息為:
1. GameSrv 伺服器ProcessLogin執行緒返回GameGate伺服器後返回的:
   AddProcess(this, RM_LOGON, 0, 0, 0, 0, NULL);加入登入訊息。
SM_NEWMAP, SM_LOGON, SM_USERNAME, SM_MAPDESCRIPTION訊息
    AddProcess(this, RM_ABILITY, 0, 0, 0, 0, NULL); 等級
      SM_ABILITY
AddProcess(this, RM_SUBABILITY, 0, 0, 0, 0, NULL);
 SM_SUBABILITY
AddProcess(this, RM_DAYCHANGING, 0, 0, 0, 0, NULL); 校時
 SM_DAYCHANGING
AddProcess(this, RM_SENDUSEITEMS, 0, 0, 0, 0, NULL); 裝備
 SM_SENDUSEITEMS
AddProcess(this, RM_SENDMYMAGIC, 0, 0, 0, 0, NULL); 魔法
     SM_SENDMYMAGIC
    
     客戶端收到訊息後相應的處理:
SM_NEWMAP 接受地圖訊息 OnSvrMsgNewMap
     初始化玩家座標,m_xMyHero.m_wPosX = ptdm->wParam;
                     m_xMyHero.m_wPosY = ptdm->wTag;
載入地圖檔案    m_xMap.LoadMapData(szMapName);
設定場景。 m_xLightFog.ChangeLightColor(dwFogColor);
 
SM_LOGON 返回登入訊息 OnSvrMsgLogon
          m_xMyHero.Create初始化玩家資訊(頭髮,武器,載入圖片等),設定玩家
地圖m_xMyHero.SetMapHandler(&m_xMap),建立使用者魔法。加入m_xMagicList列表,pxMagic->CreateMagic, m_xMagicList.AddNode(pxMagic);並向伺服器傳送CM_QUERYBAGITEMS訊息(使用者物品清單,血,氣,衣服,兵器等)。
SM_USERNAME           獲取玩家的遊戲角色名字。
SM_MAPDESCRIPTION     地圖對應的名字。
SM_BAGITEMS           使用者物品清單 (玩家CM_QUERYBAGITEMS訊息)
SM_CHARSTATUSCHANGED   通知玩家狀態改變訊息(攻擊力,狀態)。
SM_ABILITY       玩家金錢,職業
SM_SUBABILITY    玩家技能(魔法,殺傷力,速度,毒藥,中毒恢復,生命恢復,符
咒恢復)
SM_DAYCHANGING  返回遊戲狀態。(Day, Fog)讓客戶端隨著伺服器的時間,載入不同場景。
SM_SENDUSEITEMS 使用者裝備清單
SM_SENDMYMAGIC   使用者魔法列表資訊。
 
總結:
客戶端連線到GameGate遊戲閘道器伺服器,並通過GameSrv伺服器驗證之後,就會收到GameSrv伺服器發來的訊息。主要是地圖訊息,登入訊息,玩家的裝備,技能,魔法,個人設定等等。GameSrv把地圖分成若干塊,把該玩家加入其中一塊,並加入這一塊的使用者物件列表中,設定其狀態為OS_MOVINGOBJECT。客戶端載入地圖,設定場景,設定自己的玩家狀態(此時還沒有怪物和其它玩家,所以玩家還需要接收其它遊戲玩家和怪物的清單列表)。
 
 


相關文章