<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ## 游戲場景服務器概況 ![sSw1IJ.png](https://s3.ax1x.com/2021/01/02/sSw1IJ.png) >指令對應的處理handle的文件:SSBattleMgr.cpp ## 創建戰場 * 指令: eMsgToSSFromCS_CreateBattle * GC服務器發往SS fromCS 收到中心服務器CS創建站場的指令,在函數`INT32 CSSBattleMgr::OnMsgFromCS_CreateBattle(const char* pData, int n32DataLength)`中創建站場成功后,加入到戰場管理器中: ``` m_cAllBattleMap[pBattle->GetBattleID()] = pBattle; ``` 發送創建結果給CS服務器 ``` CSSWorkThreadMgr::GetInstance().PostMsgToCS(sMsg, sMsg.mgsid()); ``` 發送可以進入戰場的消息給客戶端 ``` CSSWorkThreadMgr::GetInstance().PostMsgToGCLIULU((*iter)->GetUserNetInfo(), sMsgBattle, sMsgBattle.msgid()); ``` ## 英雄移動 * 指令:eMsgToGSToSSFromGC_AskMoveDir,eMsgToGSToSSFromGC_AskStopMove * GSToSS: 客戶端發往SS,fromGC 收到客戶端發來的移動信息, `GCToSS::MoveDir`, 轉化為服務器能識別的參數 `CVector3D`, 開始計算客戶端移動的位置 ```C++ CVector3D pcDir(pMoveDir->dir().x(), 0, pMoveDir->dir().z()); m_pMsgBattle->AskMoveDir(m_pMsgUser, pcDir); ``` 開始按照方向移動: ```C++ bool CSSMoveMgr::AskStartMoveDir(ISSMoveObject* pMObject, ColVector dir) { ... //計算下一個100毫秒后的位置 pMObject->CalculateStepMoveTarget(now + 100); //檢查是否會直接撞墻 if(FALSE == TestNextStepMove(pMObject)){ if(FALSE == TryTurnDir(pMObject)){ pMObject->Stop(now,FALSE); return FALSE; } } pMObject->OnStartMove(pMObject->GetDir()); } ``` ``` INT32 CSSGameUnit::BeginAction_Move(const CVector3D &crsDir, bool bIfNotifyGC){} ``` 同步移動狀態到客戶端 ``` pcCurBattle->SyncState(this); ... SendMsgToAllWatcher(*sMsg, msgid, pcGO); ... CSSWorkThreadMgr::GetInstance().PostMsgToGCLIULU(watcherArray[i]->GetUserNetInfo(), sMsg, n32MsgID); ``` ``` INT32 CSSBattle::SyncState(CSSGameUnit *pcGO, bool spot){} void CSSBattle::SendMsgToAllWatcher(google::protobuf::Message& sMsg, int n32MsgID, CSSGameUnit* pGU){} ``` ## 英雄技能 * 指令:eMsgToGSToSSFromGC_AskBuyGoods * GSToSS:客戶端發往SS,fromGC SS服務器接收到請求釋放技能的指令`eMsgToGSToSSFromGC_AskBuyGoods`, 轉化數據為`GCToSS::UseSkill`格式 : ``` boost::shared_ptr<GCToSS::UseSkill> pUseSkill = ParseProtoMsgWithNewMemory<GCToSS::UseSkill>(pData, n32DataLength); INT32 nret = m_pMsgBattle->AskUseSkill(m_pMsgUser, pUseSkill->skillid()); ``` 請求釋放技能: ``` INT32 CSSAI_Hero::AskUseSkill(UINT32 un32SkillID) {} //檢查是否是不能操作狀態 //檢查是否被沉默了 //檢查是否在吸附中,如果是,不能使用技能 //獲取并檢查技能是否存在 //檢查技能是否符合可用條件 //檢查是否是正在運行的技能 ``` 開始使用技能 ``` pSkill->Start(); ``` 準備技能的配置 ``` void CSSSkill::MakeSkillEffect(TIME_MILSEC tUTCMilsec){ ... pcCurBattle->GetEffectMgr()->AddEffectsFromCfg((SSNextSkillEffectCfg*)cpsCfg->asSkillModelList, pcMasterGU.get(), pcTarGU.get(), cPos, pcMasterGU->GetCurDir(), this, tUTCMilsec); } ``` 從配置中添加技能 ``` INT32 CSSEffectMgr::AddEffectsFromCfg(SSNextSkillEffectCfg* pEffectCfg, CSSGameUnit* pMaster, CSSGameUnit* pTarget, CVector3D cPos, CVector3D cDir , CSSSkill* pSkill, TIME_MILSEC beginTime, CSSGameUnit* pStartSkillGU){ ... AddEffect(pEffect); } ``` 添加效果到管理器中 ``` INT32 CSSEffectMgr::AddEffect(CSSSkillEffect* pEffect) { ... //嘗試使用效果的啟動方法。如果啟動成功,將其加入正在運行的技能列表中 if(eNormal == pEffect->Begin()){ //if (FALSE == pEffect->m_pCfg->bIsCanMove){ pEffect->AddSelfToUsingList(); //} m_UpdateEffectMap[pEffect->m_un32UniqueID] = pEffect; } //如果效果啟動失敗,檢查其是否會開始計算技能CD,然后結束技能。 else{ pEffect->CheckCooldown(); pEffect->End(); DestroyAFreeSkillEffect(pEffect); return eEC_AddEffectFailed; } ... } //正在運行的效果列表 m_UpdateEffectMap ``` 對應的技能在如下圖所示的文件中 ![spS5KH.png](https://s3.ax1x.com/2021/01/02/spS5KH.png) * SSSkillEffect_Buf.cpp: 附加的buff技能 * SSSkillEffect_Fly.cpp: 飛行技能 * ... ## 裝備買賣 * 買裝備指令:eMsgToGSToSSFromGC_AskBuyGoods * 賣商品指令:eMsgToGSToSSFromGC_AskSellGoods * 釋放裝備技能:eMsgToGSToSSFromGC_AskUseGoods * GSToSS: 客戶端發往SS,fromGC ### 商品配置 目錄: * 商品組合:CSBattleMgr/CombineCfg.xml * 商品描述:CSBattleMgr/ItemCfg.xml 商品配置描述: | attributeKeyList / attributeValList | 描述 | | --- | --- | | 5 / 10 | +10 物理攻擊 | | 6 / 35 | +35點魔法攻擊 | | 7 / 20 | +20 點物理防御 | | 8 / 25 | +25點魔法防御 | | 9 / 60 | +60點移動速度 | | 10 / 200 | +200生命值 | | 11 / 200 | +200生命值 | | 12 / 150 | +150魔法值 | | 13 / 2000 | +2點/秒生命回復 | * `attributeKeyLi`: 占位 * `attributeValList`: 值 * `n32CPCost`: 金幣 舉例 ``` <info un32GoodsID="30038"> <sNameID>spe_item_HP</sNameID> <sNameCh>神果</sNameCh> <un8TypeID>3</un8TypeID> <attributeKeyList>6</attributeKeyList> <attributeValList>65</attributeValList> <attributePerList>0</attributePerList> <un8UseTimes>0</un8UseTimes> <bDestroyAfterUsed>0</bDestroyAfterUsed> <un32SkillID>0</un32SkillID> <un32PassSkillID>0</un32PassSkillID> <bIsCanDeathToBuy>1</bIsCanDeathToBuy> <bUsedAfterBuyed>0</bUsedAfterBuyed> <sIcon>Dicon038</sIcon> <un32CdTime>0</un32CdTime> <bUniqueID>0</bUniqueID> <un8OverlapTimes>1</un8OverlapTimes> <un8CPCostType>1</un8CPCostType> <n32CPCost>800</n32CPCost> <n32CombineCPCost>200</n32CombineCPCost> <un8FunctionType>0</un8FunctionType> <un32UniqueTypeID>0</un32UniqueTypeID> <sDescribe>+65點魔法攻擊</sDescribe> <un32UseSoundID>0</un32UseSoundID> </info> ``` 神果+65點魔法攻擊, 售價是800金幣。 ## 整個服務器的心跳 心跳的作用: * 檢查掉線時間。如果玩家掉線超過30秒,則將其AI替換為機器人AI * 技能心跳 * 移動心跳 * NPC和hero的心跳 ``` void CSSBattle::DoPlayHeartBeat(TIME_MILSEC tUTCMilsec, TIME_TICK tTickSpan){ ... //移動心跳 m_pMoveMgr->OnHeartBeat(tUTCMilsec, tTickSpan); for (GameObjectMap::iterator iterObj = m_cGameObjectMap.begin(); iterObj != m_cGameObjectMap.end(); ++iterObj){ //NPC和hero的心跳 iterObj->second->OnHeartBeat(tUTCMilsec, tTickSpan); } ... //技能心跳 m_pEffectMgr->OnHeartBeat(tUTCMilsec, tTickSpan); m_pPassiveSkillMgr->OnHeartBeat(tUTCMilsec, tTickSpan); m_pSightMgr->OnHeartBeat(tUTCMilsec, tTickSpan); ... } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看