MCommand* MMatchServer::CreateCmdMatchResponseLoginFailed(const MUID& uidComm, const int nResult) { MCommand* pCmd = CreateCommand(MC_MATCH_RESPONSE_LOGIN, uidComm); pCmd->AddParameter(new MCommandParameterInt(nResult)); pCmd->AddParameter(new MCommandParameterString(MGetServerConfig()->GetServerName())); pCmd->AddParameter(new MCommandParameterChar((char)MGetServerConfig()->GetServerMode())); pCmd->AddParameter(new MCommandParameterString("Ana")); pCmd->AddParameter(new MCommandParameterUChar((unsigned char)MMUG_FREE)); pCmd->AddParameter(new MCommandParameterInt((int)MMPG_FREE)); pCmd->AddParameter(new MCommandParameterInt(0)); pCmd->AddParameter(new MCommandParameterUID(MUID(0,0))); pCmd->AddParameter(new MCommandParameterBool((bool)MGetServerConfig()->IsEnabledSurvivalMode())); pCmd->AddParameter(new MCommandParameterBool((bool)MGetServerConfig()->IsEnabledDuelTournament())); // pCmd->AddParameter(new MCommandParameterString("A")); // unsigned char tmp1 = 'A'; // void* pBlob1 = MMakeBlobArray(sizeof(unsigned char), sizeof(unsigned char)); // unsigned char* pCmdBlock1 = (unsigned char*)MGetBlobArrayElement(pBlob1, 0); // CopyMemory(pCmdBlock1, &tmp1, sizeof(unsigned char)); // pCmd->AddParameter(new MCommandParameterBlob(pBlob1, MGetBlobArraySize(pBlob1))); // MEraseBlobArray(pBlob1); unsigned char tmp = 0; void* pBlob = MMakeBlobArray(sizeof(unsigned char), sizeof(unsigned char)); unsigned char* pCmdBlock = (unsigned char*)MGetBlobArrayElement(pBlob, 0); CopyMemory(pCmdBlock, &tmp, sizeof(unsigned char)); pCmd->AddParameter(new MCommandParameterBlob(pBlob, MGetBlobArraySize(pBlob))); MEraseBlobArray(pBlob); return pCmd; }
void MMatchActiveTrapMgr::RouteTrapActivationForForcedEnterd(MMatchActiveTrap* pTrap) { OutputDebugStr("Notify Trap activation to ForcedEnteredPlayer\n"); if (!pTrap || !pTrap->IsActivated()) { _ASSERT(0); return; } if (!m_pStage) return; int numTarget = (int)pTrap->m_vecUidForcedEntered.size(); if (numTarget <= 0) return; void* pTrapArray = MMakeBlobArray(sizeof(MTD_ActivatedTrap), 1); MTD_ActivatedTrap* pNode = (MTD_ActivatedTrap*)MGetBlobArrayElement(pTrapArray, 0); Make_MTDActivatedTrap(pNode, pTrap); MCommand* pCommand = MMatchServer::GetInstance()->CreateCommand(MC_MATCH_NOTIFY_ACTIATED_TRAPITEM_LIST, MUID(0,0)); pCommand->AddParameter(new MCommandParameterBlob(pTrapArray, MGetBlobArraySize(pTrapArray))); MMatchObject* pObj; for (int i=0; i<numTarget; ++i) { pObj = m_pStage->GetObj( pTrap->m_vecUidForcedEntered[i]); if (!pObj) continue; MCommand* pSendCmd = pCommand->Clone(); MMatchServer::GetInstance()->RouteToListener(pObj, pSendCmd); } delete pCommand; MEraseBlobArray(pTrapArray); pTrap->m_vecUidForcedEntered.clear(); }
MCommand* MMatchObjectCacheBuilder::GetResultCmd(MATCHCACHEMODE nMode, MCommandCommunicator* pCmdComm) { MCommand* pCmd = pCmdComm->CreateCommand(MC_MATCH_OBJECT_CACHE, MUID(0,0)); pCmd->AddParameter(new MCmdParamUChar(nMode)); int nCount = (int)m_ObjectCacheList.size(); void* pCacheArray = MMakeBlobArray(sizeof(MMatchObjCache), nCount); int nIndex=0; for (MMatchObjCacheList::iterator itor=m_ObjectCacheList.begin(); itor!=m_ObjectCacheList.end(); itor++) { MMatchObjCache* pTrgCache = (MMatchObjCache*)MGetBlobArrayElement(pCacheArray, nIndex++); MMatchObjCache* pSrcCache = (*itor); pTrgCache->SetInfo(pSrcCache->GetUID(), pSrcCache->GetName(), pSrcCache->GetClanName(), pSrcCache->GetLevel(), pSrcCache->GetUGrade(), pSrcCache->GetPGrade() , pSrcCache->GetRank(), pSrcCache->GetKillCount(), pSrcCache->GetDeathCount(), pSrcCache->GetDTGrade() ); pTrgCache->SetFlags(pSrcCache->GetFlags()); pTrgCache->SetCLID(pSrcCache->GetCLID()); pTrgCache->SetEmblemChecksum(pSrcCache->GetEmblemChecksum()); pTrgCache->AssignCostume(pSrcCache->GetCostume()); } pCmd->AddParameter(new MCmdParamBlob(pCacheArray, MGetBlobArraySize(pCacheArray))); MEraseBlobArray(pCacheArray); return pCmd; }
void MMatchServer::OnAsyncGetAccountItemList( MAsyncJob* pJobResult ) { MAsyncDBJob_GetAccountItemList* pJob = (MAsyncDBJob_GetAccountItemList*)pJobResult; if( MASYNC_RESULT_SUCCEED != pJob->GetResult() ) { mlog("GetAccountItemList Failed\n"); return; } MMatchObject* pObj = GetObject( pJob->GetPlayerUID() ); if( NULL == pObj ) return; if( !pJob->GetExpiredAccountItems().empty() ) { ResponseExpiredItemIDList(pObj, pJob->GetExpiredAccountItems()); } const int nAccountItemCount = pJob->GetAccountItemCount(); if (nAccountItemCount > 0) { MAccountItemNode* accountItems = pJob->GetAccountItemList(); if( NULL == accountItems ) return; MCommand* pNew = CreateCommand(MC_MATCH_RESPONSE_ACCOUNT_ITEMLIST, pObj->GetUID()); // 갖고 있는 아이템 리스트 전송 int nCountableAccountItemCount = 0; for(int i = 0; i < nAccountItemCount; i++ ) { if( accountItems[i].nCount > 0 && accountItems[i].nItemID > 0 ) { nCountableAccountItemCount++; } } void* pItemArray = MMakeBlobArray(sizeof(MTD_AccountItemNode), nCountableAccountItemCount); int nIndex = 0; for (int i = 0; i < nAccountItemCount; i++) { if( accountItems[i].nItemID == 0 ) continue; MTD_AccountItemNode* pItemNode = (MTD_AccountItemNode*)MGetBlobArrayElement(pItemArray, nIndex); _ASSERTE( ((NULL != MGetMatchItemDescMgr()->GetItemDesc(accountItems[i].nItemID)) || (NULL != m_GambleMachine.GetGambleItemByGambleItemID(accountItems[i].nItemID))) && "zitem.xml or GambleItem에 기술되어 있지 않는 아이템입니다." ); if( accountItems[i].nCount > 0 ) { Make_MTDAccountItemNode(pItemNode, accountItems[i].nAIID, accountItems[i].nItemID , accountItems[i].nRentMinutePeriodRemainder, accountItems[i].nCount); nIndex++; if( nIndex == nCountableAccountItemCount ) { break; } } } pNew->AddParameter(new MCommandParameterBlob(pItemArray, MGetBlobArraySize(pItemArray))); MEraseBlobArray(pItemArray); PostSafeQueue( pNew ); } }
bool MMatchClient::MakeTunnelingCommandBlob(MCommand* pWrappingCmd, MCommand* pSrcCmd) { // Create Param : Command Blob //// int nCmdSize = pSrcCmd->GetSize(); if (nCmdSize == 0) { return false; } char* pCmdData = new char[nCmdSize]; int nSize = pSrcCmd->GetData(pCmdData, nCmdSize); if (nSize != nCmdSize) { delete [] pCmdData; return false; } if (!m_PeerPacketCrypter.Encrypt(pCmdData, nSize)) { delete [] pCmdData; return false; } void* pBlob = MMakeBlobArray(nSize, 1); char* pCmdBlock = (char*)MGetBlobArrayElement(pBlob, 0); CopyMemory(pCmdBlock, pCmdData, nSize); pWrappingCmd->AddParameter(new MCmdParamBlob(pBlob, MGetBlobArraySize(pBlob))); MEraseBlobArray(pBlob); delete [] pCmdData; return true; }
void MMatchActiveTrapMgr::RouteAllTraps(MMatchObject* pObj) { // 난입한 유저에게 현재 월드에 발동되어 있는 트랩 아이템들을 알려주기 위한 함수 OutputDebugStr("Trap RouteAllTrap to ForcedEntered\n"); MMatchActiveTrap* pTrap; // 아직 발동되지 않은 트랩(던져서 날아가고 있는 중)은 이후 발동할 때 따로 알려줄 수 있도록 표시해둔다 for (ItorTrap it=m_listTrap.begin(); it!=m_listTrap.end(); ++it) { pTrap = *it; if (!pTrap->IsActivated()) { pTrap->AddForcedEnteredPlayer(pObj->GetUID()); OutputDebugStr("Trap RESERVE To NOTIFY AddForcedEnteredPlayer\n"); } } // 발동되어 있는 트랩은 목록을 보내준다 int num = 0; for (ItorTrap it=m_listTrap.begin(); it!=m_listTrap.end(); ++it) if ((*it)->IsActivated()) ++num; if (num <= 0) return; void* pTrapArray = MMakeBlobArray(sizeof(MTD_ActivatedTrap), num); MTD_ActivatedTrap* pNode; int nIndex = 0; for (ItorTrap it=m_listTrap.begin(); it!=m_listTrap.end(); ++it) { pTrap = *it; if (pTrap->IsActivated()) { pNode = (MTD_ActivatedTrap*)MGetBlobArrayElement(pTrapArray, nIndex++); Make_MTDActivatedTrap(pNode, pTrap); } else { // 아직 발동되지 않은 트랩(던져서 날아가고 있는 중)은 이후 발동할 때 따로 알려줄 수 있도록 표시해둔다 pTrap->AddForcedEnteredPlayer(pObj->GetUID()); OutputDebugStr("Trap RESERVE To NOTIFY AddForcedEnteredPlayer\n"); } } MCommand* pCmd = MMatchServer::GetInstance()->CreateCommand(MC_MATCH_NOTIFY_ACTIATED_TRAPITEM_LIST, MUID(0,0)); pCmd->AddParameter(new MCommandParameterBlob(pTrapArray, MGetBlobArraySize(pTrapArray))); MEraseBlobArray(pTrapArray); MMatchServer::GetInstance()->RouteToListener(pObj, pCmd); }
void MMatchServer::OnAsyncGetAccountCharList(MAsyncJob* pJobResult) { MAsyncDBJob_GetAccountCharList* pJob = (MAsyncDBJob_GetAccountCharList*)pJobResult; if (pJob->GetResult() != MASYNC_RESULT_SUCCEED) { char szTime[128]=""; _strtime(szTime); mlog("[%s] Async DB Query(ResponseAccountCharList) Failed\n", szTime); return; } MMatchObject* pObj = GetObject(pJob->GetUID()); if (pObj == NULL) return; const int nCharCount = pJob->GetCharCount(); const MTD_AccountCharInfo * pCharList = pJob->GetCharList(); MTD_AccountCharInfo* pTransCharInfo = NULL; int nCharMaxLevel = 0; MCommand* pNewCmd = CreateCommand(MC_MATCH_RESPONSE_ACCOUNT_CHARLIST, MUID(0,0)); void* pCharArray = MMakeBlobArray(sizeof(MTD_AccountCharInfo), nCharCount); for (int i = 0; i < nCharCount; i++) { pTransCharInfo = (MTD_AccountCharInfo*)MGetBlobArrayElement(pCharArray, i); memcpy(pTransCharInfo, &pCharList[i], sizeof(MTD_AccountCharInfo)); nCharMaxLevel = max(nCharMaxLevel, pTransCharInfo->nLevel); } pObj->CheckNewbie( nCharMaxLevel ); pNewCmd->AddParameter(new MCommandParameterBlob(pCharArray, MGetBlobArraySize(pCharArray))); MEraseBlobArray(pCharArray); RouteToListener( pObj, pNewCmd ); }
MCommand* MMatchServer::CreateCmdMatchResponseLoginOK(const MUID& uidComm, MUID& uidPlayer, const char* szUserID, MMatchUserGradeID nUGradeID, MMatchPremiumGradeID nPGradeID, int nECoins, // const unsigned char* szRandomValue, const unsigned char* pbyGuidReqMsg) { MCommand* pCmd = CreateCommand(MC_MATCH_RESPONSE_LOGIN, uidComm); pCmd->AddParameter(new MCommandParameterInt(MOK)); pCmd->AddParameter(new MCommandParameterString(MGetServerConfig()->GetServerName())); pCmd->AddParameter(new MCommandParameterChar((char)MGetServerConfig()->GetServerMode())); pCmd->AddParameter(new MCommandParameterString(szUserID)); pCmd->AddParameter(new MCommandParameterUChar((unsigned char)nUGradeID)); pCmd->AddParameter(new MCommandParameterInt((int)nPGradeID)); pCmd->AddParameter(new MCommandParameterInt(nECoins)); pCmd->AddParameter(new MCommandParameterUID(uidPlayer)); pCmd->AddParameter(new MCommandParameterBool((bool)MGetServerConfig()->IsEnabledSurvivalMode())); pCmd->AddParameter(new MCommandParameterBool((bool)MGetServerConfig()->IsEnabledDuelTournament())); // pCmd->AddParameter(new MCommandParameterString(szRandomValue)); // void* pBlob1 = MMakeBlobArray(sizeof(unsigned char), 64); // unsigned char *pCmdBlock1 = (unsigned char*)MGetBlobArrayElement(pBlob1, 0); // CopyMemory(pCmdBlock1, szRandomValue, 64); // pCmd->AddParameter(new MCommandParameterBlob(pBlob1, MGetBlobArraySize(pBlob1))); // MEraseBlobArray(pBlob1); void* pBlob = MMakeBlobArray(sizeof(unsigned char), SIZEOF_GUIDREQMSG); unsigned char* pCmdBlock = (unsigned char*)MGetBlobArrayElement(pBlob, 0); CopyMemory(pCmdBlock, pbyGuidReqMsg, SIZEOF_GUIDREQMSG); pCmd->AddParameter(new MCommandParameterBlob(pBlob, MGetBlobArraySize(pBlob))); MEraseBlobArray(pBlob); return pCmd; }
void ZGameClient::OnClanStandbyClanList(int nPrevStageCount, int nNextStageCount, void* pBlob) { int nCount = MGetBlobArrayCount(pBlob); ZIDLResource* pRes = ZApplication::GetGameInterface()->GetIDLResource(); ZClanListBox* pListBox = (ZClanListBox*)pRes->FindWidget("Lobby_ClanList"); if (!pListBox) return; pListBox->ClearAll(); vector< int > vecClanID; for(int i=0; i<nCount; i++) { MTD_StandbyClanList* pNode = (MTD_StandbyClanList*)MGetBlobArrayElement(pBlob, i); _ASSERT(i<4); pListBox->SetInfo(i,pNode->nCLID,pNode->szClanName,pNode->nPlayers); //ProcessEmblem(pNode->nCLID, pNode->nEmblemChecksum); // Emblem // 클랜 URL이 없으면 Vector에 쌓는다 if (m_EmblemMgr.CheckEmblem(pNode->nCLID, pNode->nEmblemChecksum)) { // Begin Draw } else /*if (pNode->nEmblemChecksum != 0)*/ { vecClanID.push_back( pNode->nCLID ); } } //// Emblem // 클랜 URL이 없는 vector를 서버에 보낸다. if(vecClanID.size() > 0) { void* pBlob = MMakeBlobArray(sizeof(int), (int)vecClanID.size()); /// nOneBlobSize만큼 nBlobCount갯수만큼 배열한 블럭 만들기 int nCount = 0; for(vector<int>::iterator it = vecClanID.begin(); it != vecClanID.end(); it++, nCount++) { int *nClanID = (int*)MGetBlobArrayElement(pBlob, nCount); *nClanID = *it; } ZPostRequestEmblemURL(pBlob); MEraseBlobArray(pBlob); vecClanID.clear(); } ZIDLResource* pResource = ZApplication::GetGameInterface()->GetIDLResource(); MWidget* pBtn = pResource->FindWidget("StageBeforeBtn"); if (nPrevStageCount != -1) { if (nPrevStageCount == 0) { if (pBtn) pBtn->Enable(false); } else { if (pBtn) pBtn->Enable(true); } } pBtn = pResource->FindWidget("StageAfterBtn"); if (nNextStageCount != -1) { if (nNextStageCount == 0) { if (pBtn) pBtn->Enable(false); } else { if (pBtn) pBtn->Enable(true); } } }