1. 程式人生 > >傳奇源碼分析-客戶端(遊戲邏輯處理源分析二)

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

ltp 網關 message 魔法 tco 獲取 creat proc 分數

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。客戶端加載地圖,設置場景,設置自己的玩家狀態(此時還沒有怪物和其它玩家,所以玩家還需要接收其它遊戲玩家和怪物的清單列表)。


此文章來自網絡,如有版權沖突請和我聯系 [email protected]


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