bool ZBrain::FindTarget() { MUID uidTarget = MUID(0,0); float fDist = FLT_MAX; for ( ZCharacterManager::iterator itor = ZGetCharacterManager()->begin(); itor != ZGetCharacterManager()->end(); ++itor) { // 죽은 놈은 관심없다. ZCharacter* pCharacter = (*itor).second; if ( pCharacter->IsDie()) continue; // 제외 목록에 들어간 캐릭터는 건너뜀 if ( ZGetGame()->IsExceptedFromNpcTargetting( pCharacter)) continue; // 거리를 구한다. float dist = MagnitudeSq( pCharacter->GetPosition() - m_pBody->GetPosition()); // 더 가까운 놈이면 이놈을 타겟으로 정한다. if ( dist < fDist) { fDist = dist; uidTarget = pCharacter->GetUID(); } } m_uidTarget = uidTarget; if ( uidTarget == MUID(0,0)) return false; return true; }
void TimeReward_ShowCharEffect(CCUID uidChar) { if (ZGetCharacterManager()) { ZCharacter* pChar = ZGetCharacterManager()->Find(uidChar); if (pChar && pChar->IsVisible()) ZGetEffectManager()->AddTimeRewardEffect(pChar->GetPosition(), pChar); // 이펙트 출력 } }
bool ZRuleDuel::OnCommand(MCommand* pCommand) { if (!ZGetGame()) return false; switch (pCommand->GetID()) { case MC_MATCH_DUEL_QUEUEINFO: { pCommand->GetParameter(&QInfo, 0, MPT_BLOB); if (QInfo.m_bIsRoundEnd) { rvector pos = ZGetGame()->m_pMyCharacter->GetPosition(); rvector dir = ZGetGame()->m_pMyCharacter->m_DirectionLower; if ((QInfo.m_uidChampion == ZGetMyUID()) || (QInfo.m_uidChallenger == ZGetMyUID())) { ZMapSpawnData* pSpawnData = ZGetGame()->GetMapDesc()->GetSpawnManager()->GetData( QInfo.m_uidChampion == ZGetMyUID() ? 0 : 1); ZPostRequestSpawn(ZGetMyUID(), pSpawnData->m_Pos, pSpawnData->m_Dir); ZGetGame()->SetSpawnRequested(true); } else { ZCharacter* cha = ZGetCharacterManager()->Find(QInfo.m_uidChampion); if (cha != NULL) cha->Revival(); cha = ZGetCharacterManager()->Find(QInfo.m_uidChallenger); if (cha != NULL) cha->Revival(); ZGetCombatInterface()->SetObserverMode(true); } } if ((QInfo.m_uidChampion != ZGetGame()->m_pMyCharacter->GetUID()) && (QInfo.m_uidChallenger != ZGetGame()->m_pMyCharacter->GetUID()) && !QInfo.m_bIsRoundEnd) ZGetCombatInterface()->SetObserverMode(true); else { for (int i=0; i<QInfo.m_nQueueLength; i++) { ZCharacter* cha = ZGetCharacterManager()->Find(QInfo.m_WaitQueue[i]); if (cha != NULL) { cha->SetVisible(false); cha->ForceDie(); } } } } break; } return false; }
bool ZSurvival::OnNPCDead(MCommand* pCommand) { MUID uidPlayer, uidNPC; pCommand->GetParameter(&uidPlayer, 0, MPT_UID); pCommand->GetParameter(&uidNPC, 1, MPT_UID); ZActor* pActor = ZGetObjectManager()->GetNPCObject(uidNPC); if (pActor) { pActor->OnDie(); ZGetObjectManager()->Delete(pActor); m_GameInfo.IncreaseNPCKilled(); ZCharacter* pCharacter = ZGetCharacterManager()->Find(uidPlayer); if (pCharacter) { ZModule_QuestStatus* pMod = (ZModule_QuestStatus*)pCharacter->GetModule(ZMID_QUESTSTATUS); if (pMod) { pMod->AddKills(); } } } return true; }
bool ZSurvival::OnQuestPlayerDead(MCommand* pCommand) { MUID uidVictim; pCommand->GetParameter(&uidVictim, 0, MPT_UID); ZCharacter* pVictim = ZGetCharacterManager()->Find(uidVictim); if(pVictim) { if (pVictim != ZGetGame()->m_pMyCharacter) { pVictim->Die(); // 여기서 실제로 죽는다 } pVictim->GetStatus().CheckCrc(); pVictim->GetStatus().Ref().AddDeaths(); if (pVictim->GetStatus().Ref().nLife > 0) pVictim->GetStatus().Ref().nLife--; pVictim->GetStatus().MakeCrc(); } //ZGetGame()->OnPeerDieMessage(pVictim, pAttacker); return true; }
bool ZSurvival::OnSectorBonus(MCommand* pCommand) { MUID uidPlayer; unsigned long int nExpValue = 0; unsigned long int nAddedBP = 0; pCommand->GetParameter(&uidPlayer, 0, MPT_UID); pCommand->GetParameter(&nExpValue, 1, MPT_UINT); pCommand->GetParameter(&nAddedBP, 2, MPT_UINT); int nAddedXP = GetExpFromTransData(nExpValue); int nExpPercent = GetExpPercentFromTransData(nExpValue); if(ZGetCharacterManager()->Find(uidPlayer) == ZGetGame()->m_pMyCharacter) { m_nRewardXP += nAddedXP; m_nRewardBP += nAddedBP; //ZGetScreenEffectManager()->AddExpEffect(nAddedXP); // 획득 경험치 표시 없애기 ZGetMyInfo()->SetLevelPercent(nExpPercent); ZGetScreenEffectManager()->SetGaugeExpFromMyInfo(); } return true; }
bool ZSurvival::OnReadyToNewSector(MCommand* pCommand) { MUID uidPlayer; pCommand->GetParameter(&uidPlayer, 0, MPT_UID); m_CharactersGone.insert(uidPlayer); ZCharacter *pChar = ZGetCharacterManager()->Find(uidPlayer); // 내가 옵저브 하고 있는 캐릭터가 이동하면 다른 캐릭터로 바꾼다 if(ZGetCombatInterface()->GetObserver()->GetTargetCharacter()==pChar) { ZGetCombatInterface()->GetObserver()->ChangeToNextTarget(); } if (uidPlayer == ZGetGameClient()->GetPlayerUID()) { MoveToNextSector(); } else { // 해당 플레이어 이동 ZCharacter *pChar = ZGetCharacterManager()->Find(uidPlayer); if(pChar && m_CharactersGone.find(ZGetGameClient()->GetPlayerUID())!=m_CharactersGone.end()) { // 내가 이미 이동한 경우 해당플레이어를 보이게 만든다 // pChar->SetVisible(true); // 이번에 이동할 캐릭터의 위치 int nPosIndex = ZGetCharacterManager()->GetCharacterIndex(pChar->GetUID(), false); if (nPosIndex < 0) nPosIndex=0; else if (nPosIndex >= MAX_QUSET_PLAYER_COUNT) nPosIndex = MAX_QUSET_PLAYER_COUNT-1; ZMapSpawnData* pSpawnData = ZGetWorld()->GetDesc()->GetSpawnManager()->GetSoloData(nPosIndex); if(pSpawnData) { pChar->SetPosition(pSpawnData->m_Pos); pChar->SetDirection(pSpawnData->m_Dir); ZGetEffectManager()->AddReBirthEffect(pSpawnData->m_Pos); } else { _ASSERT(0); } } } return true; }
void ZVoteInterface::CallVote(const char* pszDiscuss) { if (GetShowTargetList()) return; Clear(); SetDiscuss(pszDiscuss); ShowTargetList(true); // Push Target List for(ZCharacterManager::iterator i=ZGetCharacterManager()->begin(); i!=ZGetCharacterManager()->end();i++) { ZCharacter *pChar = i->second; if(pChar->IsAdminHide()) continue; m_TargetList.push_back(pChar->GetProperty()->GetName()); } }
bool ZSurvival::OnSectorStart(MCommand* pCommand) { char nSectorIndex; unsigned char nRepeatIndex; pCommand->GetParameter(&nSectorIndex, 0, MPT_CHAR); pCommand->GetParameter(&nRepeatIndex, 1, MPT_UCHAR); m_bIsRoundClear = false; ZGetQuest()->GetGameInfo()->ClearNPCKilled(); // 만약 섹터가 틀리면 강제로 이동한다. if (m_GameInfo.GetCurrSectorIndex() != nSectorIndex || m_GameInfo.GetCurrRepeatIndex() != nRepeatIndex) { // 새로운 섹터로 이동 m_GameInfo.OnMovetoNewSector((int)nSectorIndex, nRepeatIndex); MoveToNextSector(); } // 모든 사람들을 보여준다. for(ZCharacterManager::iterator i = ZGetCharacterManager()->begin();i!=ZGetCharacterManager()->end();i++) { i->second->SetVisible(true); } // npc의 타겟팅 후보 제외 목록을 비운다 ZGetGame()->ClearListExceptionFromNpcTargetting(); // 전 화면에서 남아있을 수 있는 탄을 제거한다 ZGetGame()->m_WeaponManager.Clear(); ZGetWorldItemManager()->Reset(); m_CharactersGone.clear(); // admin hide 이면 다시 옵저버를 활성화 MMatchObjCache* pObjCache = ZGetGameClient()->FindObjCache(ZGetMyUID()); if (pObjCache && pObjCache->CheckFlag(MTD_PlayerFlags_AdminHide)) { ZGetGameInterface()->GetCombatInterface()->SetObserverMode(true); } return true; }
void ZSurvival::MoveToNextSector() { ZCharacter *pMyChar = ZGetGame()->m_pMyCharacter; pMyChar->InitStatus(); // 새로운 월드로 이동!! ZGetWorldManager()->SetCurrent(m_GameInfo.GetCurrSectorIndex()); // 이번에 이동할 캐릭터의 위치 int nPosIndex = ZGetCharacterManager()->GetCharacterIndex(pMyChar->GetUID(), false); if (nPosIndex < 0) nPosIndex=0; ZMapSpawnData* pSpawnData = ZGetWorld()->GetDesc()->GetSpawnManager()->GetSoloData(nPosIndex); // 새 좌표로 이동 if (pSpawnData!=NULL && pMyChar!=NULL) { pMyChar->SetPosition(pSpawnData->m_Pos); pMyChar->SetDirection(pSpawnData->m_Dir); ZGetEffectManager()->AddReBirthEffect(pSpawnData->m_Pos); } // 유저 캐릭터를 보여주지 않는다 for(ZCharacterManager::iterator i = ZGetCharacterManager()->begin();i!=ZGetCharacterManager()->end();i++) { i->second->SetVisible(false); } // 현재 npc, 앞으로 생성될 npc, 이펙트, 탄환 전부 숨긴다 (다음 섹터 시작할때까지) ZGetObjectManager()->GetNPCObjectMap()->SetVisibleAll(false); ZGetObjectManager()->GetNPCObjectMap()->ForceInvisibleNewNpc(true); ZGetEffectManager()->EnableDraw(false); ZGetWorldItemManager()->EnableDraw(false); ZGetGame()->m_WeaponManager.EnableRender(false); // ko수 동기화 ZModule_QuestStatus* pMod = (ZModule_QuestStatus*)pMyChar->GetModule(ZMID_QUESTSTATUS); if (pMod) { int nKills = pMod->GetKills(); ZGetScreenEffectManager()->SetKO(nKills); } }
bool ZSurvival::OnRefreshPlayerStatus(MCommand* pCommand) { // 운영자 hide는 제외 bool bAdminHide = false; if (ZGetMyInfo()->IsAdminGrade()) { MMatchObjCache* pCache = ZGetGameClient()->FindObjCache(ZGetMyUID()); if (pCache && pCache->CheckFlag(MTD_PlayerFlags_AdminHide)) bAdminHide = true; } if (!bAdminHide) { // 옵저버이거나 옵저버 예약상태를 푼다. ZGetGame()->ReleaseObserver(); // 죽어있으면 리스폰 if (ZGetGame()->m_pMyCharacter->IsDie()) { ZGetGame()->GetMatch()->RespawnSolo(); } } // 피와 총알을 채운다 for(ZCharacterManager::iterator i = ZGetCharacterManager()->begin();i!=ZGetCharacterManager()->end();i++) { ZCharacter* pCharacter = i->second; if (!pCharacter->IsAdminHide()) pCharacter->InitStatus(); } ZGetGame()->CancelSuicide(); return true; }
bool ZSurvival::OnMovetoPortal(MCommand* pCommand) { char nCurrSectorIndex; unsigned char nCurrRepeatIndex; MUID uidPlayer; pCommand->GetParameter(&nCurrSectorIndex, 0, MPT_CHAR); pCommand->GetParameter(&nCurrRepeatIndex, 1, MPT_UCHAR); pCommand->GetParameter(&uidPlayer, 2, MPT_UID); // 포탈로 이동한 사람이 자신이면 여기서 실제로 다음 섹터로 이동 if (uidPlayer == ZGetGameClient()->GetPlayerUID()) { m_bIsRoundClear = false; ZGetQuest()->GetGameInfo()->ClearNPCKilled(); // 여기서 새로운 섹터로 이동 m_GameInfo.OnMovetoNewSector((int)(nCurrSectorIndex), nCurrRepeatIndex); // 나 새로운 섹터로 왔다고 메시지를 보낸다. ZPostQuestReadyToNewSector(ZGetGameClient()->GetPlayerUID()); // 나를 npc 타겟팅 후보에서 뺀다 ZGetGame()->ExceptCharacterFromNpcTargetting( ZGetGameInterface()->GetMyCharacter()); } else { // 해당 플레이어 이동 ZCharacter *pChar = ZGetCharacterManager()->Find(uidPlayer); if(pChar && m_CharactersGone.find(ZGetGameClient()->GetPlayerUID())==m_CharactersGone.end()) { // 내가 아직 이동하지 않은 경우 해당플레이어를 안보이게 만든다 pChar->SetVisible(false); ZGetEffectManager()->AddReBirthEffect(pChar->GetPosition()); // 해당 플레이어를 npc 타겟팅 후보에서 뺀다 ZGetGame()->ExceptCharacterFromNpcTargetting(pChar); } } // 이 캐릭터를 타겟으로 하는 탄환이 있으면 제거한다 ZGetGame()->m_WeaponManager.DeleteWeaponHasTarget( uidPlayer ); return true; }
void ZEffectBillboardTexAniList::Update(float fElapsed) { ZCharacter* pChar = NULL; for(iterator i=begin();i!=end();) { ZEFFECTBILLBOARDTEXANIITEM *p = (ZEFFECTBILLBOARDTEXANIITEM*)*i; p->fElapsedTime+=fElapsed; if( p->fElapsedTime > p->fLifeTime + p->fAddTime ) { // if( p->fElapsedTime > p->fLifeTime ) { delete p; i=erase(i); continue; } p->normal=-RCameraDirection; p->velocity+=fElapsed*p->accel; p->position+=fElapsed*p->velocity; p->fOpacity = min(1,max(0,(p->fLifeTime - p->fElapsedTime)/m_fVanishTime)); // 캐릭터의 특정 위치를 따라 가야하는 노드라면... pChar = ZGetCharacterManager()->Find(p->CharUID); if( pChar ) { if( p->partstype != eq_parts_pos_info_etc) { if(pChar->m_pVMesh) { p->position = pChar->m_pVMesh->GetBipTypePosition( p->partstype ); } } } // frame animation if( m_bFixFrame==false ) p->frame = m_nMaxFrame * (p->fElapsedTime / p->fLifeTime); i++; } }
bool ZSurvival::OnEntrustNPCControl(MCommand* pCommand) { MUID uidChar, uidNPC; pCommand->GetParameter(&uidChar, 0, MPT_UID); pCommand->GetParameter(&uidNPC, 1, MPT_UID); ZActor* pNPC = ZGetObjectManager()->GetNPCObject(uidNPC); if (pNPC) { // uidChar이 내플레이어 UID이면 해당 NPC는 내가 조종하는 것이다. bool bMyControl = (uidChar == ZGetGameClient()->GetPlayerUID()); pNPC->SetMyControl(bMyControl); ZCharacter *pOwner = ZGetCharacterManager()->Find(uidChar); if(pOwner) pNPC->SetOwner(pOwner->GetUserName()); } return true; }
bool ZSurvival::OnNPCSpawn(MCommand* pCommand) { if (ZGetGame() == NULL) return false; MUID uidChar, uidNPC; unsigned char nNPCType, nPositionIndex; pCommand->GetParameter(&uidChar, 0, MPT_UID); pCommand->GetParameter(&uidNPC, 1, MPT_UID); pCommand->GetParameter(&nNPCType, 2, MPT_UCHAR); pCommand->GetParameter(&nPositionIndex, 3, MPT_UCHAR); MQUEST_NPC NPCType = MQUEST_NPC(nNPCType); ZMapSpawnType nSpawnType = ZMST_NPC_MELEE; ZMapSpawnManager* pMSM = ZGetGame()->GetMapDesc()->GetSpawnManager(); MQuestNPCInfo* pNPCInfo = GetNPCInfo(NPCType); if (pNPCInfo == NULL) return false; switch (pNPCInfo->GetSpawnType()) { case MNST_MELEE: nSpawnType = ZMST_NPC_MELEE; break; case MNST_RANGE: nSpawnType = ZMST_NPC_RANGE; break; case MNST_BOSS: nSpawnType = ZMST_NPC_BOSS; break; default: _ASSERT(0); }; ZMapSpawnData* pSpawnData = pMSM->GetSpawnData(nSpawnType, nPositionIndex); if (pSpawnData == NULL) { // 보스 스폰지점이 없는 맵을 서바이벌맵으로 사용한 경우 그냥 밀리용 지점을 사용하자 if (nSpawnType == ZMST_NPC_BOSS) pSpawnData = pMSM->GetSpawnData(ZMST_NPC_MELEE, nPositionIndex); } rvector NPCPos = rvector(0,0,0); rvector NPCDir = rvector(1,0,0); if (pSpawnData) { NPCPos = pSpawnData->m_Pos; NPCDir = pSpawnData->m_Dir; } // 만약 리소스 로딩을 안했으면 로드 - 이럴일은 테스트빼곤 없어야한다. // if (ZIsLaunchDevelop()) { RMesh* pNPCMesh = ZGetNpcMeshMgr()->Get(pNPCInfo->szMeshName); if (pNPCMesh) { if (!pNPCMesh->m_isMeshLoaded) { ZGetNpcMeshMgr()->Load(pNPCInfo->szMeshName); ZGetNpcMeshMgr()->ReloadAllAnimation(); } } } float fTC = m_GameInfo.GetNPC_TC(); ////////// 하드코딩.. 특정 맵에서 npc 충돌 반지름을 플레이어의 반지름으로 강제한다 ////// bool bForceCollRadius35 = false; if (m_GameInfo.GetMapSectorID(m_GameInfo.GetCurrSectorIndex()) == 207) // Prison_hall2 bForceCollRadius35 = true; ////////////////////////////////////////////////////////////////////////////////////////// ZActor* pNewActor = ZActor::CreateActor(NPCType, fTC, m_GameInfo.GetQuestLevel(), bForceCollRadius35); if (pNewActor) { bool bMyControl = (uidChar == ZGetGameClient()->GetPlayerUID()); pNewActor->SetMyControl(bMyControl); pNewActor->SetUID(uidNPC); pNewActor->SetPosition(NPCPos); pNewActor->SetDirection(NPCDir); ZCharacter *pOwner = ZGetCharacterManager()->Find(uidChar); if(pOwner) pNewActor->SetOwner(pOwner->GetUserName()); if(pNewActor->m_pVMesh) { D3DCOLORVALUE color; color.r = pNPCInfo->vColor.x; color.g = pNPCInfo->vColor.y; color.b = pNPCInfo->vColor.z; color.a = 1.f; pNewActor->m_pVMesh->SetNPCBlendColor(color);//색을 지정한 경우.. } ZGetObjectManager()->Add(pNewActor); ZGetEffectManager()->AddReBirthEffect(NPCPos); if ((pNPCInfo->nGrade == NPC_GRADE_BOSS) || (pNPCInfo->nGrade == NPC_GRADE_LEGENDARY)) { // 만약 보스급 NPC가 스폰하면 자동적으로 boss 등록 m_GameInfo.GetBosses().push_back(uidNPC); // 바운딩볼륨이 큰 보스가 벽 근처에서 스폰될때 바운딩이 벽에 일부 묻힌 채로 스폰될 수가 있다 // 이렇게 되면 간혹 벽 뒤로 이동해버리는 경우가 발생 -> 보이지 않으므로 보스를 죽일 수 없다 -> 게임 진행 막힘 // 보스형 몬스터에 한해서 스폰할때 벽과 충돌체크를 해서 초기위치를 조정한다 if (pNewActor->IsMyControl()) { float radius = bForceCollRadius35 ? 35.f : pNewActor->GetCollRadius(); if (true == ZGetGame()->GetWorld()->GetBsp()->CheckSolid(NPCPos, radius)) { // 맵에 충돌한다면. OutputDebugString("보스몹 스폰지점 충돌검사 실패...\n"); // 가까운 네비게이션 노드의 중앙으로 옮겨버린다 RNavigationMesh* pNavMesh = ZGetGame()->GetWorld()->GetBsp()->GetNavigationMesh(); if (pNavMesh) { RNavigationNode* pNavNode = pNavMesh->FindClosestNode(NPCPos); if (pNavNode) { pNewActor->SetPosition( pNavNode->CenterVertex()); OutputDebugString("스폰위치조정됨!\n"); } } } } } } return true; }
bool ZEffectBillboardTexAniList::Draw() { if(!m_pVB) return false; if( size()==0 ) return true; BeginState(); RSetFog(FALSE); HRESULT hr; DWORD dwRemainNum = (DWORD)size(); iterator itr = begin(); while(dwRemainNum) { if(m_dwBase >= EFFECTBASE_DISCARD_COUNT) m_dwBase = 0; DWORD dwThisNum = min( dwRemainNum , BILLBOARD_FLUSH_COUNT ); dwThisNum = min( dwThisNum , EFFECTBASE_DISCARD_COUNT - m_dwBase ); BYTE *pVertices; if( FAILED( hr = m_pVB->Lock( m_dwBase * sizeof(ZEFFECTCUSTOMVERTEX) * 4, dwThisNum * sizeof(ZEFFECTCUSTOMVERTEX) * 4, (VOID**)&pVertices, m_dwBase ? D3DLOCK_NOOVERWRITE : D3DLOCK_DISCARD ) ) ) { return false; } BYTE *pInd; if( FAILED( hr = m_pIB->Lock( m_dwBase * sizeof(WORD) * 6, dwThisNum * sizeof(WORD) * 6, (VOID**)&pInd, m_dwBase ? D3DLOCK_NOOVERWRITE : D3DLOCK_DISCARD ) ) ) { return false; } int nRenderCnt = 0; ZCharacter* pChar = NULL; for(DWORD j=0;j<dwThisNum;j++) { ZEFFECTBILLBOARDTEXANIITEM *p = (ZEFFECTBILLBOARDTEXANIITEM*)*itr; if(p->fElapsedTime < p->fAddTime ) { itr++; continue; } pChar = ZGetCharacterManager()->Find(p->CharUID); if( pChar ) { if( pChar->m_pVMesh ) { if( pChar->m_pVMesh->m_bIsRender==false) {//부모가 안그려졌으면 skip... itr++; continue; } } } nRenderCnt++; // Transform rmatrix matTranslation; rmatrix matScaling; rmatrix matWorld; rvector dir = p->normal; rvector up=p->up; rvector right; if(IS_EQ(dir.z,1.f)) up=rvector(1,0,0); D3DXVec3Cross(&right, &up, &dir); D3DXVec3Normalize(&right, &right); D3DXVec3Cross(&up, &right, &dir); D3DXVec3Normalize(&up, &up); rmatrix mat; D3DXMatrixIdentity(&mat); mat._11=right.x;mat._12=right.y;mat._13=right.z; mat._21=up.x;mat._22=up.y;mat._23=up.z; mat._31=dir.x;mat._32=dir.y;mat._33=dir.z; rvector pos=p->position; // float fScale=p->fStartSize * p->fOpacity + p->fEndSize * (1.f - p->fOpacity); float fInt = min(1,max(0,(p->fLifeTime - p->fElapsedTime)/p->fLifeTime)); float fScale=p->fStartSize * fInt + p->fEndSize * (1.f - fInt); D3DXMatrixScaling(&matScaling,fScale*m_Scale.x,fScale*m_Scale.y,fScale*m_Scale.z); D3DXMatrixTranslation(&matTranslation, pos.x, pos.y, pos.z); D3DXMatrixMultiply(&matWorld, &matScaling, &mat); D3DXMatrixMultiply(&matWorld, &matWorld, &matTranslation); DWORD color = ((DWORD)(p->fOpacity * 255))<<24 | p->dwColor; static ZEFFECTCUSTOMVERTEX v[] = { {-1, -1, 0, 0xFFFFFFFF, 1, 0}, {-1, 1, 0, 0xFFFFFFFF, 1, 1}, { 1, 1, 0, 0xFFFFFFFF, 0, 1}, { 1, -1, 0, 0xFFFFFFFF, 0, 0}, }; static rvector sv[4] = { rvector(-1,-1,0) , rvector(-1,1,0) , rvector(1,1,0) , rvector(1,-1,0) }; GetFrameUV( min( p->frame,m_nMaxFrame-1) ); v[0].tu = m_fUV[0]; v[0].tv = m_fUV[1]; v[1].tu = m_fUV[2]; v[1].tv = m_fUV[3]; v[2].tu = m_fUV[4]; v[2].tv = m_fUV[5]; v[3].tu = m_fUV[6]; v[3].tv = m_fUV[7]; // 좋은코드는 아니지만 버텍스 카피를 줄이기위해 타입캐스팅했다. D3DXVec3TransformCoord((D3DXVECTOR3*)&v[0].x,sv+0,&matWorld); D3DXVec3TransformCoord((D3DXVECTOR3*)&v[1].x,sv+1,&matWorld); D3DXVec3TransformCoord((D3DXVECTOR3*)&v[2].x,sv+2,&matWorld); D3DXVec3TransformCoord((D3DXVECTOR3*)&v[3].x,sv+3,&matWorld); v[0].color=v[1].color=v[2].color=v[3].color=color; memcpy(pVertices,v,sizeof(ZEFFECTCUSTOMVERTEX)*4); pVertices+=sizeof(ZEFFECTCUSTOMVERTEX)*4; WORD inds[] = { 0,1,2,0,2,3 }; for(int k=0;k<6;k++) { inds[k]+=(m_dwBase+j)*4; } memcpy(pInd,inds,sizeof(inds)); pInd+=sizeof(inds); itr++; } m_pVB->Unlock(); m_pIB->Unlock(); if(FAILED( hr = RGetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,m_dwBase*4,nRenderCnt*4,m_dwBase*6,nRenderCnt*2) )) return false; m_dwBase+=dwThisNum; dwRemainNum-=dwThisNum; } RGetDevice()->SetStreamSource( 0, NULL , 0,0 ); RGetDevice()->SetIndices(NULL); if(ZGetWorld()) { ZGetWorld()->SetFog(true);// 게임 설정에 따라서 } EndState(); return true; }
void ZObserver::OnDraw(MDrawContext* pDC) { if ( g_pGame->IsReplay() && !g_pGame->IsShowReplayInfo()) return; if ( m_pTargetCharacter == NULL) return; if ( ZGetCamera()->GetLookMode() == ZCAMERA_MINIMAP) return; if ( ZGetMyInfo()->IsAdminGrade()) { MFont *pFont=MFontManager::Get("FONTb11b"); if ( pFont == NULL) _ASSERT(0); pDC->SetFont(pFont); MCOLOR backgroundcolor; if ( m_pTargetCharacter->GetTeamID() == MMT_RED) backgroundcolor = MCOLOR(100,0,0, 150); else if ( m_pTargetCharacter->GetTeamID() == MMT_BLUE) backgroundcolor = MCOLOR(0,0,100, 150); else backgroundcolor = MCOLOR(0,0,0, 150); pDC->SetColor(backgroundcolor); pDC->FillRectangle( MGetWorkspaceWidth() / 2 - 170, MGetWorkspaceHeight() * (650.0f/800.0f) - 7, 340, 30); backgroundcolor = MCOLOR( 255,255,255, 255); pDC->SetColor( backgroundcolor); char szName[128]; sprintf_safe( szName, "%s (HP:%d, AP:%d)", m_pTargetCharacter->GetUserName(), m_pTargetCharacter->GetHP(), m_pTargetCharacter->GetAP()); TextRelative(pDC, 0.5f, 650.0f/800.0f, szName, true); } else if ( ZApplication::GetGame()->GetMatch()->GetMatchType() == MMATCH_GAMETYPE_DUEL) { char charName[3][100]; charName[0][0] = charName[1][0] = charName[2][0] = 0; float fMaxHP[ 2]={ 0.0f, 0.0f}, fMaxAP[ 2]={ 0.0f, 0.0f}; int nHP[ 2]={ 0, 0}, nAP[ 2]={ 0, 0}; bool bExistNextChallenger = false; bool bIsChampOserved = false; bool bIsChlngOserved = false; ZRuleDuel* pDuel = (ZRuleDuel*)ZGetGameInterface()->GetGame()->GetMatch()->GetRule(); for (ZCharacterManager::iterator itor = ZGetCharacterManager()->begin(); itor != ZGetCharacterManager()->end(); ++itor) { ZCharacter* pCharacter = (*itor).second; // Champion if (pCharacter->GetUID() == pDuel->QInfo.m_uidChampion) { strcpy_safe(charName[0], pCharacter->GetUserName()); fMaxHP[ 0] = pCharacter->GetProperty()->fMaxHP; fMaxAP[ 0] = pCharacter->GetProperty()->fMaxAP; if ( pCharacter->IsDie()) { nHP[ 0] = 0; nAP[ 0] = 0; } else { nHP[ 0] = pCharacter->GetHP(); nAP[ 0] = pCharacter->GetAP(); } if ( m_pTargetCharacter) { if ( pCharacter->GetUID() == m_pTargetCharacter->GetUID()) bIsChampOserved = true; } } // Challenger else if (pCharacter->GetUID() == pDuel->QInfo.m_uidChallenger) { strcpy_safe(charName[1], pCharacter->GetUserName()); fMaxHP[ 1] = pCharacter->GetProperty()->fMaxHP; fMaxAP[ 1] = pCharacter->GetProperty()->fMaxAP; if ( pCharacter->IsDie()) { nHP[ 1] = 0; nAP[ 1] = 0; } else { nHP[ 1] = pCharacter->GetHP(); nAP[ 1] = pCharacter->GetAP(); } if ( m_pTargetCharacter) { if ( pCharacter->GetUID() == m_pTargetCharacter->GetUID()) bIsChlngOserved = true; } } // Waiting else if (pCharacter->GetUID() == pDuel->QInfo.m_WaitQueue[0]) { strcpy_safe(charName[2], pCharacter->GetUserName()); bExistNextChallenger = true; } } float fRx = (float)MGetWorkspaceWidth() / 800.0f; float fRy = (float)MGetWorkspaceHeight() / 600.0f; int nWidth; float fPosy; float fLength; float fHeight; // HP fPosy = 10.0f*fRy; fLength = 163.0f*fRx; fHeight = 23.0f*fRy; pDC->SetColor( 255, 0, 0, 210); nWidth = (int)( (float)nHP[0] / fMaxHP[0] * fLength); pDC->FillRectangle( (193.0f+163.0f)*fRx-nWidth, fPosy, nWidth, fHeight); nWidth = (int)( (float)nHP[1] / fMaxHP[1] * fLength); pDC->FillRectangle( 444.0f*fRx, fPosy, nWidth, fHeight); // AP pDC->SetColor( 0, 50, 0, 170); pDC->FillRectangle( 218.0f*fRx, 37.0f*fRy, 150.0f*fRx, 5.0f*fRy); pDC->FillRectangle( 432.0f*fRx, 37.0f*fRy, 150.0f*fRx, 5.0f*fRy); pDC->SetColor( 0, 255, 0, 100); nWidth = (int)( (float)nAP[0] / fMaxAP[0] * 150.0f * fRx); pDC->FillRectangle( (218.0f+150.0f)*fRx-nWidth, 37.0f*fRy, nWidth, 5.0f*fRy); nWidth = (int)( (float)nAP[1] / fMaxAP[1] * 150.0f * fRx); pDC->FillRectangle( 432.0f*fRx, 37.0f*fRy, nWidth, 5.0f*fRy); // °ÔÀÌÁö ÇÁ·¹ÀÓ Ãâ·Â MBitmap* pBitmap = MBitmapManager::Get( "duel_score.tga"); if ( pBitmap) { pDC->SetBitmap( pBitmap); pDC->Draw( 167.0f*fRx, 0, 466.0f*fRx, 49.0f*fRx); } // À̸§ Ãâ·Â MFont *pFont = MFontManager::Get("FONTa10_O2Wht"); if ( pFont == NULL) _ASSERT(0); pDC->SetFont( pFont); int nTime = GetGlobalTimeMS() % 200; if ( bIsChampOserved && (nTime < 100)) pDC->SetColor(MCOLOR(0xFFFFFF00)); else pDC->SetColor(MCOLOR(0xFFA0A0A0)); TextRelative(pDC, 0.34f, 0.026f, charName[0], true); if ( bIsChlngOserved && (nTime < 100)) pDC->SetColor(MCOLOR(0xFFFFFF00)); else pDC->SetColor(MCOLOR(0xFFA0A0A0)); TextRelative(pDC, 0.66f, 0.026f, charName[1], true); if ( bExistNextChallenger) { MBitmap* pBitmap = MBitmapManager::Get( "icon_play.tga"); if ( pBitmap) { pDC->SetBitmap( pBitmap); int nIcon = 20.0f*fRx; pDC->Draw( 646.0f*fRx, 0, nIcon, nIcon); pDC->Draw( 640.0f*fRx, 0, nIcon, nIcon); } pDC->SetColor( MCOLOR(0xFF808080)); TextRelative( pDC, 0.83f, 0.01f, charName[ 2], false); } ZGetCombatInterface()->DrawVictory( pDC, 162, 20, pDuel->QInfo.m_nVictory); } else if ( ZApplication::GetGame()->GetMatch()->GetMatchType() != MMATCH_GAMETYPE_DUEL) { char szName[128]; sprintf_safe(szName, "%s (HP:%d, AP:%d)", m_pTargetCharacter->GetUserName(), m_pTargetCharacter->GetHP(), m_pTargetCharacter->GetAP()); if ( m_pTargetCharacter->IsAdmin()) pDC->SetColor(MCOLOR(ZCOLOR_ADMIN_NAME)); else pDC->SetColor(MCOLOR(0xFFFFFFFF)); MFont *pFont = MFontManager::Get( "FONTb11b"); if ( pFont == NULL) _ASSERT(0); pDC->SetFont( pFont); if ( ZApplication::GetGame()->GetMatch()->GetMatchType() == MMATCH_GAMETYPE_DEATHMATCH_TEAM2) TextRelative( pDC, 0.5f, 75.0f/800.0f, szName, true); else TextRelative( pDC, 0.5f, 50.0f/800.0f, szName, true); } // Ä«¸Þ¶ó Ç¥½Ã if ( !ZGetMyInfo()->IsAdminGrade()) { ZCamera *pCamera = ZGetGameInterface()->GetCamera(); const char *szModes[] = { "normal", "user", "free", "minimap" }; // TextRelative(pDC, 0.9f, 50.0f/800.0f, szModes[pCamera->GetLookMode()], true); char szFileName[ 50]; sprintf_safe( szFileName, "camera_%s.tga", szModes[pCamera->GetLookMode()]); pDC->SetBitmap( MBitmapManager::Get( szFileName)); float fGain = (float)MGetWorkspaceWidth() / 800.0f; pDC->Draw( (int)(720.0f * fGain), (int)(7.0f * fGain), (int)(64.0f * fGain), (int)(64.0f * fGain)); } // Admin ¿ÉÁ®¹öÀÏ °æ¿ì¿¡ ³²Àº Àοø¼ö Ç¥½Ã if ( ZGetMyInfo()->IsAdminGrade()) { // Àοø¼ö ±¸Çϱâ int nNumOfTotal=0, nNumOfRedTeam=0, nNumOfBlueTeam=0; ZCharacterManager::iterator itor; ZCharacter* pCharacter; for (itor = ZGetCharacterManager()->begin(); itor != ZGetCharacterManager()->end(); ++itor) { pCharacter = (*itor).second; if ( pCharacter->GetTeamID() == MMT_SPECTATOR) // ¿ÉÀú¹ö´Â –A´Ù continue; if(pCharacter->IsAdminHide()) continue; if ( (pCharacter->GetTeamID()==4) && ( !pCharacter->IsDie())) nNumOfTotal++; else if ( (pCharacter->GetTeamID()==MMT_RED) && ( !pCharacter->IsDie())) nNumOfRedTeam++; else if ( (pCharacter->GetTeamID()==MMT_BLUE) && ( !pCharacter->IsDie())) nNumOfBlueTeam++; } // ÆÀ À̹ÌÁö Ç¥½Ã float sizex = MGetWorkspaceWidth() / 800.f; float sizey = MGetWorkspaceHeight() / 600.f; char szText[128]; // ¹è°æ Ç¥½Ã MCOLOR backgroundcolor; if (ZApplication::GetGame()->GetMatch()->IsTeamPlay()) { backgroundcolor = MCOLOR(100,0,0, 150); pDC->SetColor(backgroundcolor); pDC->FillRectangle( 700 * sizex, 37 * sizey, 85 * sizex, 22 * sizey); backgroundcolor = MCOLOR(0,0,100, 150); pDC->SetColor(backgroundcolor); pDC->FillRectangle( 700 * sizex, 62 * sizey, 85 * sizex, 22 * sizey); // Àοø¼ö Ç¥½Ã backgroundcolor = MCOLOR(255,180,180, 255); pDC->SetColor(backgroundcolor); sprintf_safe( szText, "%s:%d", ZMsg( MSG_WORD_REDTEAM), nNumOfRedTeam); TextRelative( pDC, 0.92f, 40.0f/600.0f, szText, true); backgroundcolor = MCOLOR(180,180,255, 255); pDC->SetColor(backgroundcolor); sprintf_safe( szText, "%s:%d", ZMsg( MSG_WORD_BLUETEAM), nNumOfBlueTeam); TextRelative( pDC, 0.92f, 65.0f/600.0f, szText, true); } } CheckDeadTarget(); }
bool ZGameClient::OnCommand(MCommand* pCommand) { bool ret = MMatchClient::OnCommand(pCommand); switch (pCommand->GetID()) { case MC_MATCH_PING_LIST: { auto Param = pCommand->GetParameter(0); if (Param->GetType() != MPT_BLOB) break; void* Blob = Param->GetPointer(); int Count = MGetBlobArrayCount(Blob); for (int i = 0; i < Count; i++) { auto& Ping = *static_cast<MTD_PingInfo*>(MGetBlobArrayElement(Blob, i)); if (Ping.UID == GetPlayerUID()) { PingToServer = Ping.Ping; continue; } auto Peer = GetPeers()->Find(Ping.UID); if (Peer) Peer->UpdatePing(GetGlobalTimeMS(), Ping.Ping); auto Char = ZGetCharacterManager()->Find(Ping.UID); if (Char) Char->Ping = Ping.Ping; } } break; case MC_MATCH_RESPONSE_LOGIN_FAILED: { char szReason[4096]; if (!pCommand->GetParameter(szReason, 0, MPT_STR, sizeof(szReason))) break; ZGetGameInterface()->ShowErrorMessage(szReason); ZPostDisconnect(); } break; case MC_MATCH_RESPONSE_CREATE_ACCOUNT: { char szMessage[128]; if (!pCommand->GetParameter(szMessage, 0, MPT_STR, sizeof(szMessage))) break; ZGetGameInterface()->ShowErrorMessage(szMessage); } break; case MC_NET_ONDISCONNECT: break; case MC_NET_ONERROR: break; case ZC_CHANGESKIN: { char szSkinName[256]; pCommand->GetParameter(szSkinName, 0, MPT_STR, sizeof(szSkinName)); if (ZApplication::GetGameInterface()->ChangeInterfaceSkin(szSkinName)) { MClient::OutputMessage(MZMOM_LOCALREPLY, "Change Skin To %s", szSkinName); } else { MClient::OutputMessage(MZMOM_LOCALREPLY, "Change Skin Failed"); } } break; case MC_ADMIN_TERMINAL: { #ifndef _PUBLISH char szText[65535]; szText[0] = 0; MUID uidChar; pCommand->GetParameter(&uidChar, 0, MPT_UID); pCommand->GetParameter(szText, 1, MPT_STR, sizeof(szText)); OutputToConsole(szText); #endif } break; case MC_NET_CHECKPING: { MUID uid; if (pCommand->GetParameter(&uid, 0, MPT_UID) == false) break; MCommand* pNew = new MCommand(m_CommandManager.GetCommandDescByID(MC_NET_PING), uid, m_This); pNew->AddParameter(new MCommandParameterUInt(GetGlobalTimeMS())); Post(pNew); return true; } case MC_NET_PING: { unsigned int nTimeStamp; if (pCommand->GetParameter(&nTimeStamp, 0, MPT_UINT) == false) break; MCommand* pNew = new MCommand(m_CommandManager.GetCommandDescByID(MC_NET_PONG), pCommand->m_Sender, m_This); pNew->AddParameter(new MCommandParameterUInt(nTimeStamp)); Post(pNew); return true; } case MC_NET_PONG: { int nTimeStamp; pCommand->GetParameter(&nTimeStamp, 0, MPT_UINT); MClient::OutputMessage(MZMOM_LOCALREPLY, "Ping from (%u:%u) = %d", pCommand->GetSenderUID().High, pCommand->GetSenderUID().Low, GetGlobalTimeMS() - nTimeStamp); } break; case ZC_CON_CONNECT: { char szBuf[256]; sprintf_safe(szBuf, "Net.Connect %s:%d", ZGetConfiguration()->GetServerIP(), ZGetConfiguration()->GetServerPort()); ConsoleInputEvent(szBuf); SetServerAddr(ZGetConfiguration()->GetServerIP(), ZGetConfiguration()->GetServerPort()); } break; case ZC_CON_DISCONNECT: { ConsoleInputEvent("Net.Disconnect"); } break; case ZC_CON_CLEAR: { if (ZGetConsole()) ZGetConsole()->ClearMessage(); } break; case ZC_CON_HIDE: { if (ZGetConsole()) ZGetConsole()->Show(false); } break; case ZC_CON_SIZE: { if (ZGetConsole()) { int iConWidth, iConHeight; pCommand->GetParameter(&iConWidth, 0, MPT_INT); pCommand->GetParameter(&iConHeight, 1, MPT_INT); if ((iConWidth > 30) && (iConHeight > 30)) { MPOINT point = ZGetConsole()->GetPosition(); ZGetConsole()->SetBounds(point.x, point.y, iConWidth, iConHeight); } } } break; case MC_CLOCK_SYNCHRONIZE: { u32 nGlobalClock; pCommand->GetParameter(&nGlobalClock, 0, MPT_UINT); u32 nLocalClock = GetClockCount(); if (nGlobalClock > nLocalClock) m_bIsBigGlobalClock = true; else m_bIsBigGlobalClock = false; m_nClockDistance = ZGetClockDistance(nGlobalClock, nLocalClock); } break; case MC_MATCH_NOTIFY: { unsigned int nMsgID = 0; if (pCommand->GetParameter(&nMsgID, 0, MPT_UINT) == false) break; OnMatchNotify(nMsgID); } break; case MC_MATCH_BRIDGEPEER_ACK: { MUID uidChar; int nCode; pCommand->GetParameter(&uidChar, 0, MPT_UID); pCommand->GetParameter(&nCode, 1, MPT_INT); OnBridgePeerACK(uidChar, nCode); } break; case MC_MATCH_STAGE_RESPONSE_FORCED_ENTRY: { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); if (nResult == MOK) { OnForcedEntryToGame(); } else { ZApplication::GetGameInterface()->ShowMessage("Forced entry rejected"); } } break; case MC_MATCH_STAGE_JOIN: { MUID uidChar, uidStage; unsigned int nRoomNo = 0; char szStageName[256] = ""; pCommand->GetParameter(&uidChar, 0, MPT_UID); pCommand->GetParameter(&uidStage, 1, MPT_UID); pCommand->GetParameter(&nRoomNo, 2, MPT_UINT); pCommand->GetParameter(szStageName, 3, MPT_STR, sizeof(szStageName)); OnStageJoin(uidChar, uidStage, nRoomNo, szStageName); } break; case MC_MATCH_STAGE_LEAVE: { MUID uidChar, uidStage; pCommand->GetParameter(&uidChar, 0, MPT_UID); pCommand->GetParameter(&uidStage, 1, MPT_UID); OnStageLeave(uidChar, uidStage); } break; case MC_MATCH_STAGE_START: { MUID uidChar, uidStage; int nCountdown; pCommand->GetParameter(&uidChar, 0, MPT_UID); pCommand->GetParameter(&uidStage, 1, MPT_UID); pCommand->GetParameter(&nCountdown, 2, MPT_INT); OnStageStart(uidChar, uidStage, nCountdown); } break; case MC_MATCH_STAGE_LAUNCH: { MUID uidStage; char szMapName[_MAX_DIR]; pCommand->GetParameter(&uidStage, 0, MPT_UID); pCommand->GetParameter(szMapName, 1, MPT_STR, sizeof(szMapName)); OnStageLaunch(uidStage, szMapName); } break; case MC_MATCH_STAGE_FINISH_GAME: { MUID uidStage; pCommand->GetParameter(&uidStage, 0, MPT_UID); OnStageFinishGame(uidStage); } break; case MC_MATCH_STAGE_MAP: { MUID uidStage; char szMapName[_MAX_DIR]; pCommand->GetParameter(&uidStage, 0, MPT_UID); pCommand->GetParameter(szMapName, 1, MPT_STR, sizeof(szMapName)); OnStageMap(uidStage, szMapName); } break; case MC_MATCH_STAGE_TEAM: { MUID uidChar, uidStage; unsigned int nTeam; pCommand->GetParameter(&uidChar, 0, MPT_UID); pCommand->GetParameter(&uidStage, 1, MPT_UID); pCommand->GetParameter(&nTeam, 2, MPT_UINT); OnStageTeam(uidChar, uidStage, nTeam); } break; case MC_MATCH_STAGE_PLAYER_STATE: { MUID uidChar, uidStage; int nObjectStageState; pCommand->GetParameter(&uidChar, 0, MPT_UID); pCommand->GetParameter(&uidStage, 1, MPT_UID); pCommand->GetParameter(&nObjectStageState, 2, MPT_INT); OnStagePlayerState(uidChar, uidStage, MMatchObjectStageState(nObjectStageState)); } break; case MC_MATCH_STAGE_MASTER: { MUID uidChar, uidStage; pCommand->GetParameter(&uidStage, 0, MPT_UID); pCommand->GetParameter(&uidChar, 1, MPT_UID); OnStageMaster(uidStage, uidChar); } break; case MC_MATCH_STAGE_CHAT: { MUID uidStage, uidChar; static char szChat[512]; pCommand->GetParameter(&uidChar, 0, MPT_UID); pCommand->GetParameter(&uidStage, 1, MPT_UID); pCommand->GetParameter(szChat, 2, MPT_STR, sizeof(szChat)); OnStageChat(uidChar, uidStage, szChat); } break; case MC_MATCH_STAGE_LIST: { char nPrevStageCount, nNextStageCount; pCommand->GetParameter(&nPrevStageCount, 0, MPT_CHAR); pCommand->GetParameter(&nNextStageCount, 1, MPT_CHAR); MCommandParameter* pParam = pCommand->GetParameter(2); if (pParam->GetType() != MPT_BLOB) break; void* pBlob = pParam->GetPointer(); int nCount = MGetBlobArrayCount(pBlob); OnStageList((int)nPrevStageCount, (int)nNextStageCount, pBlob, nCount); } break; case MC_MATCH_CHANNEL_RESPONSE_PLAYER_LIST: { unsigned char nTotalPlayerCount, nPage; pCommand->GetParameter(&nTotalPlayerCount, 0, MPT_UCHAR); pCommand->GetParameter(&nPage, 1, MPT_UCHAR); MCommandParameter* pParam = pCommand->GetParameter(2); if (pParam->GetType() != MPT_BLOB) break; void* pBlob = pParam->GetPointer(); int nCount = MGetBlobArrayCount(pBlob); OnChannelPlayerList((int)nTotalPlayerCount, (int)nPage, pBlob, nCount); } break; case MC_MATCH_CHANNEL_RESPONSE_ALL_PLAYER_LIST: { MUID uidChannel; pCommand->GetParameter(&uidChannel, 0, MPT_UID); MCommandParameter* pParam = pCommand->GetParameter(1); if (pParam->GetType() != MPT_BLOB) break; void* pBlob = pParam->GetPointer(); int nCount = MGetBlobArrayCount(pBlob); OnChannelAllPlayerList(uidChannel, pBlob, nCount); } break; case MC_MATCH_RESPONSE_FRIENDLIST: { MCommandParameter* pParam = pCommand->GetParameter(0); if (pParam->GetType() != MPT_BLOB) break; void* pBlob = pParam->GetPointer(); int nCount = MGetBlobArrayCount(pBlob); OnResponseFriendList(pBlob, nCount); } break; case MC_MATCH_RESPONSE_STAGESETTING: { MUID uidStage; pCommand->GetParameter(&uidStage, 0, MPT_UID); MCommandParameter* pStageParam = pCommand->GetParameter(1); if (pStageParam->GetType() != MPT_BLOB) break; void* pStageBlob = pStageParam->GetPointer(); int nStageCount = MGetBlobArrayCount(pStageBlob); MCommandParameter* pCharParam = pCommand->GetParameter(2); if (pCharParam->GetType() != MPT_BLOB) break; void* pCharBlob = pCharParam->GetPointer(); int nCharCount = MGetBlobArrayCount(pCharBlob); int nStageState; pCommand->GetParameter(&nStageState, 3, MPT_INT); MUID uidMaster; pCommand->GetParameter(&uidMaster, 4, MPT_UID); OnResponseStageSetting(uidStage, pStageBlob, nStageCount, pCharBlob, nCharCount, static_cast<STAGE_STATE>(nStageState), uidMaster); } break; case MC_MATCH_RESPONSE_PEER_RELAY: { MUID uidPeer; if (pCommand->GetParameter(&uidPeer, 0, MPT_UID) == false) break; OnResponsePeerRelay(uidPeer); } break; case MC_MATCH_LOADING_COMPLETE: { MUID uidChar; int nPercent; if (pCommand->GetParameter(&uidChar, 0, MPT_UID) == false) break; if (pCommand->GetParameter(&nPercent, 1, MPT_INT) == false) break; OnLoadingComplete(uidChar, nPercent); } break; case MC_MATCH_ANNOUNCE: { unsigned int nType; char szMsg[256]; pCommand->GetParameter(&nType, 0, MPT_UINT); pCommand->GetParameter(szMsg, 1, MPT_STR, sizeof(szMsg)); OnAnnounce(nType, szMsg); } break; case MC_MATCH_CHANNEL_RESPONSE_JOIN: { MUID uidChannel; int nChannelType; char szChannelName[256]; pCommand->GetParameter(&uidChannel, 0, MPT_UID); pCommand->GetParameter(&nChannelType, 1, MPT_INT); pCommand->GetParameter(szChannelName, 2, MPT_STR, sizeof(szChannelName)); OnChannelResponseJoin(uidChannel, (MCHANNEL_TYPE)nChannelType, szChannelName); } break; case MC_MATCH_CHANNEL_CHAT: { MUID uidChannel, uidChar; char szChat[512]; char szName[256]; int nGrade; pCommand->GetParameter(&uidChannel, 0, MPT_UID); pCommand->GetParameter(szName, 1, MPT_STR, sizeof(szName)); pCommand->GetParameter(szChat, 2, MPT_STR, sizeof(szChat)); pCommand->GetParameter(&nGrade, 3, MPT_INT); OnChannelChat(uidChannel, szName, szChat, nGrade); } break; case MC_MATCH_CHANNEL_LIST: { MCommandParameter* pParam = pCommand->GetParameter(0); if (pParam->GetType() != MPT_BLOB) break; void* pBlob = pParam->GetPointer(); int nCount = MGetBlobArrayCount(pBlob); OnChannelList(pBlob, nCount); } break; case MC_MATCH_CHANNEL_RESPONSE_RULE: { MUID uidChannel; pCommand->GetParameter(&uidChannel, 0, MPT_UID); char szRuleName[128]; pCommand->GetParameter(szRuleName, 1, MPT_STR, sizeof(szRuleName)); OnChannelResponseRule(uidChannel, szRuleName); } break; case MC_MATCH_RESPONSE_RECOMMANDED_CHANNEL: { MUID uidChannel; pCommand->GetParameter(&uidChannel, 0, MPT_UID); OnResponseRecommandedChannel(uidChannel); } break; case MC_ADMIN_ANNOUNCE: { char szChat[512]; u32 nMsgType = 0; pCommand->GetParameter(szChat, 1, MPT_STR, sizeof(szChat)); pCommand->GetParameter(&nMsgType, 2, MPT_UINT); OnAdminAnnounce(szChat, ZAdminAnnounceType(nMsgType)); } break; case MC_MATCH_GAME_LEVEL_UP: { MUID uidChar; pCommand->GetParameter(&uidChar, 0, MPT_UID); OnGameLevelUp(uidChar); } break; case MC_MATCH_GAME_LEVEL_DOWN: { MUID uidChar; pCommand->GetParameter(&uidChar, 0, MPT_UID); OnGameLevelDown(uidChar); } break; case MC_MATCH_RESPONSE_GAME_INFO: { MUID uidStage; pCommand->GetParameter(&uidStage, 0, MPT_UID); MCommandParameter* pParam = pCommand->GetParameter(1); if (pParam->GetType() != MPT_BLOB) break; void* pGameInfoBlob = pParam->GetPointer(); pParam = pCommand->GetParameter(2); if (pParam->GetType() != MPT_BLOB) break; void* pRuleInfoBlob = pParam->GetPointer(); pParam = pCommand->GetParameter(3); if (pParam->GetType() != MPT_BLOB) break; void* pPlayerInfoBlob = pParam->GetPointer(); OnResponseGameInfo(uidStage, pGameInfoBlob, pRuleInfoBlob, pPlayerInfoBlob); } break; case MC_MATCH_OBTAIN_WORLDITEM: { MUID uidPlayer; int nItemUID; pCommand->GetParameter(&uidPlayer, 0, MPT_UID); pCommand->GetParameter(&nItemUID, 1, MPT_INT); OnObtainWorldItem(uidPlayer, nItemUID); } break; case MC_MATCH_SPAWN_WORLDITEM: { MCommandParameter* pParam = pCommand->GetParameter(0); if (pParam->GetType() != MPT_BLOB) break; void* pSpawnInfoBlob = pParam->GetPointer(); OnSpawnWorldItem(pSpawnInfoBlob); } break; case MC_MATCH_REMOVE_WORLDITEM: { int nItemUID; pCommand->GetParameter(&nItemUID, 0, MPT_INT); OnRemoveWorldItem(nItemUID); } break; case MC_MATCH_USER_WHISPER: { char szSenderName[128] = ""; char szTargetName[128] = ""; char szMessage[1024] = ""; pCommand->GetParameter(szSenderName, 0, MPT_STR, sizeof(szSenderName)); pCommand->GetParameter(szTargetName, 1, MPT_STR, sizeof(szTargetName)); pCommand->GetParameter(szMessage, 2, MPT_STR, sizeof(szMessage)); OnUserWhisper(szSenderName, szTargetName, szMessage); } break; case MC_MATCH_CHATROOM_JOIN: { char szPlayerName[128] = ""; char szChatRoomName[128] = ""; pCommand->GetParameter(szPlayerName, 0, MPT_STR, sizeof(szPlayerName)); pCommand->GetParameter(szChatRoomName, 1, MPT_STR, sizeof(szChatRoomName)); OnChatRoomJoin(szPlayerName, szChatRoomName); } break; case MC_MATCH_CHATROOM_LEAVE: { char szPlayerName[128] = ""; char szChatRoomName[128] = ""; pCommand->GetParameter(szPlayerName, 0, MPT_STR, sizeof(szPlayerName)); pCommand->GetParameter(szChatRoomName, 1, MPT_STR, sizeof(szChatRoomName)); OnChatRoomLeave(szPlayerName, szChatRoomName); } break; case MC_MATCH_CHATROOM_SELECT_WRITE: { char szChatRoomName[128] = ""; pCommand->GetParameter(szChatRoomName, 0, MPT_STR, sizeof(szChatRoomName)); OnChatRoomSelectWrite(szChatRoomName); } break; case MC_MATCH_CHATROOM_INVITE: { char szSenderName[64] = ""; char szTargetName[64] = ""; char szRoomName[128] = ""; pCommand->GetParameter(szSenderName, 0, MPT_STR, sizeof(szSenderName)); pCommand->GetParameter(szTargetName, 1, MPT_STR, sizeof(szTargetName)); pCommand->GetParameter(szRoomName, 2, MPT_STR, sizeof(szRoomName)); OnChatRoomInvite(szSenderName, szRoomName); } break; case MC_MATCH_CHATROOM_CHAT: { char szChatRoomName[128] = ""; char szPlayerName[128] = ""; char szChat[128] = ""; pCommand->GetParameter(szChatRoomName, 0, MPT_STR, sizeof(szChatRoomName)); pCommand->GetParameter(szPlayerName, 1, MPT_STR, sizeof(szPlayerName)); pCommand->GetParameter(szChat, 2, MPT_STR, sizeof(szChat)); OnChatRoomChat(szChatRoomName, szPlayerName, szChat); } break; case ZC_REPORT_119: { OnLocalReport119(); } break; case ZC_MESSAGE: { int nMessageID; pCommand->GetParameter(&nMessageID, 0, MPT_INT); ZGetGameInterface()->ShowMessage(nMessageID); }break; case MC_TEST_PEERTEST_PING: { MUID uidSender = pCommand->GetSenderUID(); char szLog[128]; sprintf_safe(szLog, "PEERTEST_PING: from (%d%d)", uidSender.High, uidSender.Low); ZChatOutput(szLog, ZChat::CMT_SYSTEM); } break; case MC_TEST_PEERTEST_PONG: { } break; case MC_MATCH_CLAN_RESPONSE_CREATE_CLAN: { int nResult, nRequestID; pCommand->GetParameter(&nResult, 0, MPT_INT); pCommand->GetParameter(&nRequestID, 1, MPT_INT); OnResponseCreateClan(nResult, nRequestID); } break; case MC_MATCH_CLAN_RESPONSE_AGREED_CREATE_CLAN: { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); OnResponseAgreedCreateClan(nResult); } break; case MC_MATCH_CLAN_ASK_SPONSOR_AGREEMENT: { int nRequestID; char szClanName[256]; MUID uidMasterObject; char szMasterName[256]; pCommand->GetParameter(&nRequestID, 0, MPT_INT); pCommand->GetParameter(szClanName, 1, MPT_STR, sizeof(szClanName)); pCommand->GetParameter(&uidMasterObject, 2, MPT_UID); pCommand->GetParameter(szMasterName, 3, MPT_STR, sizeof(szMasterName)); OnClanAskSponsorAgreement(nRequestID, szClanName, uidMasterObject, szMasterName); } break; case MC_MATCH_CLAN_ANSWER_SPONSOR_AGREEMENT: { MUID uidClanMaster; int nRequestID; bool bAnswer; char szCharName[256]; pCommand->GetParameter(&nRequestID, 0, MPT_INT); pCommand->GetParameter(&uidClanMaster, 1, MPT_UID); pCommand->GetParameter(szCharName, 2, MPT_STR, sizeof(szCharName)); pCommand->GetParameter(&bAnswer, 3, MPT_BOOL); OnClanAnswerSponsorAgreement(nRequestID, uidClanMaster, szCharName, bAnswer); } break; case MC_MATCH_CLAN_RESPONSE_CLOSE_CLAN: { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); OnClanResponseCloseClan(nResult); } break; case MC_MATCH_CLAN_RESPONSE_JOIN_CLAN: { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); OnClanResponseJoinClan(nResult); } break; case MC_MATCH_CLAN_ASK_JOIN_AGREEMENT: { char szClanName[256], szClanAdmin[256]; MUID uidClanAdmin; pCommand->GetParameter(szClanName, 0, MPT_STR, sizeof(szClanName)); pCommand->GetParameter(&uidClanAdmin, 1, MPT_UID); pCommand->GetParameter(szClanAdmin, 2, MPT_STR, sizeof(szClanAdmin)); OnClanAskJoinAgreement(szClanName, uidClanAdmin, szClanAdmin); } break; case MC_MATCH_CLAN_ANSWER_JOIN_AGREEMENT: { MUID uidClanAdmin; bool bAnswer; char szJoiner[256]; pCommand->GetParameter(&uidClanAdmin, 0, MPT_UID); pCommand->GetParameter(szJoiner, 1, MPT_STR, sizeof(szJoiner)); pCommand->GetParameter(&bAnswer, 2, MPT_BOOL); OnClanAnswerJoinAgreement(uidClanAdmin, szJoiner, bAnswer); } break; case MC_MATCH_CLAN_RESPONSE_AGREED_JOIN_CLAN: { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); OnClanResponseAgreedJoinClan(nResult); } break; case MC_MATCH_CLAN_UPDATE_CHAR_CLANINFO: { MCommandParameter* pParam = pCommand->GetParameter(0); if (pParam->GetType() != MPT_BLOB) break; void* pBlob = pParam->GetPointer(); OnClanUpdateCharClanInfo(pBlob); } break; case MC_MATCH_CLAN_RESPONSE_LEAVE_CLAN: { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); OnClanResponseLeaveClan(nResult); } break; case MC_MATCH_CLAN_MASTER_RESPONSE_CHANGE_GRADE: { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); OnClanResponseChangeGrade(nResult); } break; case MC_MATCH_CLAN_ADMIN_RESPONSE_EXPEL_MEMBER: { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); OnClanResponseExpelMember(nResult); } break; case MC_MATCH_CLAN_MSG: { char szSenderName[256]; char szMsg[512]; pCommand->GetParameter(szSenderName, 0, MPT_STR, sizeof(szSenderName)); pCommand->GetParameter(szMsg, 1, MPT_STR, sizeof(szMsg)); OnClanMsg(szSenderName, szMsg); } break; case MC_MATCH_CLAN_RESPONSE_MEMBER_LIST: { MCommandParameter* pParam = pCommand->GetParameter(0); if (pParam->GetType() != MPT_BLOB) break; void* pBlob = pParam->GetPointer(); OnClanMemberList(pBlob); } break; case MC_MATCH_CLAN_RESPONSE_CLAN_INFO: { MCommandParameter* pParam = pCommand->GetParameter(0); if (pParam->GetType() != MPT_BLOB) break; void* pBlob = pParam->GetPointer(); OnClanResponseClanInfo(pBlob); } break; case MC_MATCH_CLAN_RESPONSE_EMBLEMURL: { int nCLID = 0; int nEmblemChecksum = 0; char szURL[4096] = ""; pCommand->GetParameter(&nCLID, 0, MPT_INT); pCommand->GetParameter(&nEmblemChecksum, 1, MPT_INT); pCommand->GetParameter(szURL, 2, MPT_STR, sizeof(szURL)); OnClanResponseEmblemURL(nCLID, nEmblemChecksum, szURL); } break; case MC_MATCH_CLAN_LOCAL_EMBLEMREADY: { int nCLID = 0; char szURL[4096] = ""; pCommand->GetParameter(&nCLID, 0, MPT_INT); pCommand->GetParameter(szURL, 1, MPT_STR, sizeof(szURL)); OnClanEmblemReady(nCLID, szURL); } break; case MC_MATCH_RESPONSE_RESULT: { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); if (nResult != MOK) { ZApplication::GetGameInterface()->ShowErrorMessage(nResult); } } break; case MC_MATCH_RESPONSE_CHARINFO_DETAIL: { MCommandParameter* pParam = pCommand->GetParameter(0); if (pParam->GetType() != MPT_BLOB) break; void* pBlob = pParam->GetPointer(); OnResponseCharInfoDetail(pBlob); } break; case MC_MATCH_RESPONSE_PROPOSAL: { int nResult, nProposalMode, nRequestID; pCommand->GetParameter(&nResult, 0, MPT_INT); pCommand->GetParameter(&nProposalMode, 1, MPT_INT); pCommand->GetParameter(&nRequestID, 2, MPT_INT); OnResponseProposal(nResult, MMatchProposalMode(nProposalMode), nRequestID); } break; case MC_MATCH_ASK_AGREEMENT: { MUID uidProposer; int nProposalMode, nRequestID; pCommand->GetParameter(&uidProposer, 0, MPT_UID); MCommandParameter* pParam = pCommand->GetParameter(1); void* pMemberNamesBlob = pParam->GetPointer(); pCommand->GetParameter(&nProposalMode, 2, MPT_INT); pCommand->GetParameter(&nRequestID, 3, MPT_INT); OnAskAgreement(uidProposer, pMemberNamesBlob, MMatchProposalMode(nProposalMode), nRequestID); } break; case MC_MATCH_REPLY_AGREEMENT: { MUID uidProposer, uidChar; char szReplierName[256]; int nProposalMode, nRequestID; bool bAgreement; pCommand->GetParameter(&uidProposer, 0, MPT_UID); pCommand->GetParameter(&uidChar, 1, MPT_UID); pCommand->GetParameter(szReplierName, 2, MPT_STR, sizeof(szReplierName)); pCommand->GetParameter(&nProposalMode, 3, MPT_INT); pCommand->GetParameter(&nRequestID, 4, MPT_INT); pCommand->GetParameter(&bAgreement, 5, MPT_BOOL); OnReplyAgreement(uidProposer, uidChar, szReplierName, MMatchProposalMode(nProposalMode), nRequestID, bAgreement); } break; case MC_MATCH_LADDER_SEARCH_RIVAL: { ZGetGameInterface()->OnArrangedTeamGameUI(true); }break; case MC_MATCH_LADDER_CANCEL_CHALLENGE: { ZGetGameInterface()->OnArrangedTeamGameUI(false); char szCharName[MATCHOBJECT_NAME_LENGTH]; pCommand->GetParameter(szCharName, 0, MPT_STR, sizeof(szCharName)); if (szCharName[0] != 0) { char szOutput[256]; ZTransMsg(szOutput, MSG_LADDER_CANCEL, 1, szCharName); ZChatOutput(MCOLOR(ZCOLOR_CHAT_SYSTEM), szOutput); } else { ZChatOutput(MCOLOR(ZCOLOR_CHAT_SYSTEM), ZMsg(MSG_LADDER_FAILED)); } }break; case MC_MATCH_LADDER_RESPONSE_CHALLENGE: { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); OnLadderResponseChallenge(nResult); } break; case MC_MATCH_LADDER_PREPARE: { MUID uidStage; pCommand->GetParameter(&uidStage, 0, MPT_UID); int nTeam; pCommand->GetParameter(&nTeam, 1, MPT_INT); OnLadderPrepare(uidStage, nTeam); }break; case MC_MATCH_LADDER_LAUNCH: { MUID uidStage; pCommand->GetParameter(&uidStage, 0, MPT_UID); char szMapName[128]; pCommand->GetParameter(szMapName, 1, MPT_STR, sizeof(szMapName)); OnLadderLaunch(uidStage, szMapName); }break; case MC_MATCH_CLAN_STANDBY_CLAN_LIST: { int nPrevStageCount, nNextStageCount; pCommand->GetParameter(&nPrevStageCount, 0, MPT_INT); pCommand->GetParameter(&nNextStageCount, 1, MPT_INT); MCommandParameter* pParam = pCommand->GetParameter(2); if (pParam->GetType() != MPT_BLOB) break; void* pBlob = pParam->GetPointer(); OnClanStandbyClanList(nPrevStageCount, nNextStageCount, pBlob); } break; case MC_MATCH_CLAN_MEMBER_CONNECTED: { char szMember[256]; pCommand->GetParameter(szMember, 0, MPT_STR, sizeof(szMember)); OnClanMemberConnected(szMember); } break; case MC_MATCH_NOTIFY_CALLVOTE: { char szDiscuss[128] = ""; char szArg[256] = ""; pCommand->GetParameter(szDiscuss, 0, MPT_STR, sizeof(szDiscuss)); pCommand->GetParameter(szArg, 1, MPT_STR, sizeof(szArg)); OnNotifyCallVote(szDiscuss, szArg); } break; case MC_MATCH_NOTIFY_VOTERESULT: { char szDiscuss[128]; int nResult = 0; pCommand->GetParameter(szDiscuss, 0, MPT_STR, sizeof(szDiscuss)); pCommand->GetParameter(&nResult, 1, MPT_INT); OnNotifyVoteResult(szDiscuss, nResult); } break; case MC_MATCH_VOTE_RESPONSE: { int nMsgCode = 0; pCommand->GetParameter(&nMsgCode, 0, MPT_INT); OnVoteAbort(nMsgCode); } break; case MC_MATCH_BROADCAST_CLAN_RENEW_VICTORIES: { char szWinnerClanName[256], szLoserClanName[256]; int nVictories; pCommand->GetParameter(szWinnerClanName, 0, MPT_STR, sizeof(szWinnerClanName)); pCommand->GetParameter(szLoserClanName, 1, MPT_STR, sizeof(szLoserClanName)); pCommand->GetParameter(&nVictories, 2, MPT_INT); OnBroadcastClanRenewVictories(szWinnerClanName, szLoserClanName, nVictories); } break; case MC_MATCH_BROADCAST_CLAN_INTERRUPT_VICTORIES: { char szWinnerClanName[256], szLoserClanName[256]; int nVictories; pCommand->GetParameter(szWinnerClanName, 0, MPT_STR, sizeof(szWinnerClanName)); pCommand->GetParameter(szLoserClanName, 1, MPT_STR, sizeof(szLoserClanName)); pCommand->GetParameter(&nVictories, 2, MPT_INT); OnBroadcastClanInterruptVictories(szWinnerClanName, szLoserClanName, nVictories); } break; case MC_MATCH_BROADCAST_DUEL_RENEW_VICTORIES: { char szChannelName[256], szChampionName[256]; int nVictories, nRoomNo; pCommand->GetParameter(szChampionName, 0, MPT_STR, sizeof(szChampionName)); pCommand->GetParameter(szChannelName, 1, MPT_STR, sizeof(szChannelName)); pCommand->GetParameter(&nRoomNo, 2, MPT_INT); pCommand->GetParameter(&nVictories, 3, MPT_INT); OnBroadcastDuelRenewVictories(szChampionName, szChannelName, nRoomNo, nVictories); } break; case MC_MATCH_BROADCAST_DUEL_INTERRUPT_VICTORIES: { char szChampionName[256], szInterrupterName[256]; int nVictories; pCommand->GetParameter(szChampionName, 0, MPT_STR, sizeof(szChampionName)); pCommand->GetParameter(szInterrupterName, 1, MPT_STR, sizeof(szInterrupterName)); pCommand->GetParameter(&nVictories, 2, MPT_INT); OnBroadcastDuelInterruptVictories(szChampionName, szInterrupterName, nVictories); } break; case MC_MATCH_RESPONSE_STAGE_FOLLOW: { int nMsgID; pCommand->GetParameter(&nMsgID, 0, MPT_INT); OnFollowResponse(nMsgID); } break; case MC_MATCH_SCHEDULE_ANNOUNCE_SEND: { char cAnnounce[512] = { 0 }; pCommand->GetParameter(cAnnounce, 0, MPT_STR, sizeof(cAnnounce)); ZChatOutput(cAnnounce); } break; case MC_MATCH_EXPIRED_RENT_ITEM: { MCommandParameter* pParam = pCommand->GetParameter(0); if (pParam->GetType() != MPT_BLOB) break; void* pBlob = pParam->GetPointer(); OnExpiredRentItem(pBlob); } break; case MC_MATCH_FIND_HACKING: { } break; case MC_MATCH_ROUTE_UPDATE_STAGE_EQUIP_LOOK: { MUID uidPlayer; int nParts; int nItemID; pCommand->GetParameter(&uidPlayer, 0, MPT_UID); pCommand->GetParameter(&nParts, 1, MPT_INT); pCommand->GetParameter(&nItemID, 2, MPT_INT); OnResponseUpdateStageEquipLook(uidPlayer, nParts, nItemID); } break; default: if (!ret) { } break; } if (m_fnOnCommandCallback) ret = m_fnOnCommandCallback(pCommand); return ret; }
bool ZGameClient::OnCommand(CCCommand* pCommand) { bool ret; ret = CCMatchClient::OnCommand(pCommand); #ifdef _LOG_ENABLE_CLIENT_COMMAND_ char buf[256]; sprintf(buf,"[ID:%d]: %s\n", pCommand->GetID(), pCommand->GetDescription()); OutputDebugString(buf); #endif switch(pCommand->GetID()){ case MC_NET_ONDISCONNECT: { } break; case MC_NET_ONERROR: { } break; case ZC_CHANGESKIN: { char szSkinName[256]; pCommand->GetParameter(szSkinName, 0, MPT_STR, sizeof(szSkinName) ); if(ZApplication::GetGameInterface()->ChangeInterfaceSkin(szSkinName)) { CCClient::OutputMessage(CCZMOM_LOCALREPLY, "Change Skin To %s", szSkinName); } else { CCClient::OutputMessage(CCZMOM_LOCALREPLY, "Change Skin Failed"); } } break; case MC_ADMIN_TERMINAL: { #ifndef _PUBLISH char szText[65535]; szText[0] = 0; CCUID uidChar; pCommand->GetParameter(&uidChar, 0, MPT_UID); pCommand->GetParameter(szText, 1, MPT_STR, sizeof(szText) ); OutputToConsole(szText); #endif } break; case MC_NET_CHECKPING: { CCUID uid; if (pCommand->GetParameter(&uid, 0, MPT_UID)==false) break; CCCommand* pNew = new CCCommand(m_CommandManager.GetCommandDescByID(MC_NET_PING), uid, m_This); pNew->AddParameter(new CCCommandParameterUInt(timeGetTime())); Post(pNew); return true; } case MC_NET_PING: { unsigned int nTimeStamp; if (pCommand->GetParameter(&nTimeStamp, 0, MPT_UINT)==false) break; CCCommand* pNew = new CCCommand(m_CommandManager.GetCommandDescByID(MC_NET_PONG), pCommand->m_Sender, m_This); pNew->AddParameter(new CCCommandParameterUInt(nTimeStamp)); Post(pNew); return true; } case MC_NET_PONG: { int nTimeStamp; pCommand->GetParameter(&nTimeStamp, 0, MPT_UINT); CCClient::OutputMessage(CCZMOM_LOCALREPLY, "Ping from (%u:%u) = %d", pCommand->GetSenderUID().High, pCommand->GetSenderUID().Low, timeGetTime()-nTimeStamp); } break; case MC_UDP_PONG: { unsigned int nIp, nTimeStamp; pCommand->GetParameter(&nIp, 0, MPT_UINT); pCommand->GetParameter(&nTimeStamp, 1, MPT_UINT); ZApplication::GetGameInterface()->SetAgentPing(nIp, nTimeStamp); } break; case MC_HSHIELD_PING: { /* unsigned int nTimeStamp; if(pCommand->GetParameter(&nTimeStamp, 0, MPT_UINT) == false) break; CCCommandParameter* pParam = pCommand->GetParameter(1); if(pParam->GetType() != MPT_BLOB) break; void* pBlob = pParam->GetPointer(); int nCount = CCGetBlobArrayCount(pBlob); unsigned char* pReqMsg = (unsigned char*)CCGetBlobArrayElement(pBlob, 0); DWORD dwRet = _AhnHS_MakeAckMsg(pReqMsg, ZGetMyInfo()->GetSystemInfo()->pbyAckMsg); if(dwRet != ERROR_SUCCESS) cclog("Making Ack Msg Failed. (Error code = %x)\n", dwRet); CCCommand* pNew = new CCCommand(m_CommandManager.GetCommandDescByID(MC_HSHIELD_PONG), pCommand->m_Sender, m_This); pNew->AddParameter(new CCCommandParameterUInt(nTimeStamp)); void* pBlob2 = CCMakeBlobArray(sizeof(unsigned char), SIZEOF_ACKMSG); unsigned char* pCmdBlock = (unsigned char*)CCGetBlobArrayElement(pBlob2, 0); CopyMemory(pCmdBlock, ZGetMyInfo()->GetSystemInfo()->pbyAckMsg, SIZEOF_ACKMSG); pNew->AddParameter(new CCCmdParamBlob(pBlob2, CCGetBlobArraySize(pBlob2))); // CCEraseBlobArray(pBlob); CCEraseBlobArray(pBlob2); Post(pNew); */ return true; } break; case ZC_CON_CONNECT: { char szBuf[256]; sprintf(szBuf, "Net.Connect %s:%d", ZGetConfiguration()->GetServerIP(), ZGetConfiguration()->GetServerPort()); ConsoleInputEvent(szBuf); SetServerAddr(ZGetConfiguration()->GetServerIP(), ZGetConfiguration()->GetServerPort()); } break; case ZC_CON_DISCONNECT: { ConsoleInputEvent("Net.Disconnect"); } break; case ZC_CON_CLEAR: { if (ZGetConsole()) ZGetConsole()->ClearMessage(); } break; case ZC_CON_HIDE: { if (ZGetConsole()) ZGetConsole()->Show(false); } break; case ZC_CON_SIZE: { if (ZGetConsole()) { int iConWidth, iConHeight; pCommand->GetParameter(&iConWidth, 0, MPT_INT); pCommand->GetParameter(&iConHeight, 1, MPT_INT); if ((iConWidth > 30) && (iConHeight > 30)) { sPoint point = ZGetConsole()->GetPosition(); ZGetConsole()->SetBounds(point.x, point.y, iConWidth, iConHeight); } } } break; case MC_CLOCK_SYNCHRONIZE: { unsigned long int nGlobalClock; pCommand->GetParameter(&nGlobalClock, 0, MPT_UINT); unsigned long int nLocalClock = GetClockCount(); if (nGlobalClock > nLocalClock) m_bIsBigGlobalClock = true; else m_bIsBigGlobalClock = false; m_nClockDistance = ZGetClockDistance(nGlobalClock, nLocalClock); } break; #ifdef _DEBUG case ZC_TEST_SETCLIENT1: { char szBuf[256]; sprintf(szBuf, "peer.setport 10000"); ConsoleInputEvent(szBuf); sprintf(szBuf, "peer.addpeer 127.0.0.1 10001"); ConsoleInputEvent(szBuf); CCClient::OutputMessage(CCZMOM_LOCALREPLY, "Done SetClient1"); } break; case ZC_TEST_SETCLIENT2: { char szBuf[256]; sprintf(szBuf, "peer.setport 10001"); ConsoleInputEvent(szBuf); sprintf(szBuf, "peer.addpeer 127.0.0.1 10000"); ConsoleInputEvent(szBuf); CCClient::OutputMessage(CCZMOM_LOCALREPLY, "Done SetClient2"); } break; case ZC_TEST_SETCLIENTALL: { char szMyIP[256]; pCommand->GetParameter(szMyIP, 0, MPT_STR, sizeof(szMyIP) ); char szBuf[256]; char szIPs[][256] = { "192.168.0.100", "192.168.0.111", "192.168.0.10", "192.168.0.11", "192.168.0.16", "192.168.0.20", "192.168.0.25", "192.168.0.30", "192.168.0.32", "192.168.0.200", "192.168.0.15", "192.168.0.17"}; sprintf(szBuf, "peer.setport 10000"); ConsoleInputEvent(szBuf); for (int i = 0; i < 12; i++) { if (!strcmp(szMyIP, szIPs[i])) continue; sprintf(szBuf, "peer.addpeer %s 10000", szIPs[i]); ConsoleInputEvent(szBuf); } CCClient::OutputMessage(CCZMOM_LOCALREPLY, "Done SetClient All"); } break; #endif #ifndef _PUBLISH case ZC_TEST_BIRD1: { OnBirdTest(); } break; #endif case MC_MATCH_NOTIFY: { unsigned int nMsgID = 0; if (pCommand->GetParameter(&nMsgID, 0, MPT_UINT) == false) break; OnMatchNotify(nMsgID); } break; case MC_MATCH_BRIDGEPEER_ACK: { CCUID uidChar; int nCode; pCommand->GetParameter(&uidChar, 0, MPT_UID); pCommand->GetParameter(&nCode, 1, MPT_INT); OnBridgePeerACK(uidChar, nCode); } break; case MC_MATCH_STAGE_RESPONSE_FORCED_ENTRY: // 난입 { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); if (nResult == MOK) { OnForcedEntryToGame(); } else { ZApplication::GetGameInterface()->ShowMessage("난입할 수 없습니다."); } } break; case MC_MATCH_STAGE_JOIN: { CCUID uidChar, uidStage; unsigned int nRoomNo=0; char szStageName[256]=""; pCommand->GetParameter(&uidChar, 0, MPT_UID); pCommand->GetParameter(&uidStage, 1, MPT_UID); pCommand->GetParameter(&nRoomNo, 2, MPT_UINT); pCommand->GetParameter(szStageName, 3, MPT_STR, sizeof(szStageName) ); OnStageJoin(uidChar, uidStage, nRoomNo, szStageName); } break; case MC_MATCH_STAGE_LEAVE: { CCUID uidChar, uidStage; pCommand->GetParameter(&uidChar, 0, MPT_UID); pCommand->GetParameter(&uidStage, 1, MPT_UID); OnStageLeave(uidChar, uidStage); } break; case MC_MATCH_STAGE_START: { CCUID uidChar, uidStage; int nCountdown; pCommand->GetParameter(&uidChar, 0, MPT_UID); pCommand->GetParameter(&uidStage, 1, MPT_UID); pCommand->GetParameter(&nCountdown, 2, MPT_INT); OnStageStart(uidChar, uidStage, nCountdown); } break; case MC_MATCH_STAGE_LAUNCH: { CCUID uidStage; char szMapName[_MAX_DIR]; pCommand->GetParameter(&uidStage, 0, MPT_UID); pCommand->GetParameter(szMapName, 1, MPT_STR, sizeof(szMapName) ); OnStageLaunch(uidStage, szMapName); } break; case MC_MATCH_STAGE_RELAY_LAUNCH : { CCUID uidStage; bool bIsIgnore; char szMapName[_MAX_DIR]; pCommand->GetParameter(&uidStage, 0, MPT_UID); pCommand->GetParameter(szMapName, 1, MPT_STR, sizeof(szMapName) ); pCommand->GetParameter(&bIsIgnore, 2, MPT_BOOL); if( !bIsIgnore ) OnStageLaunch(uidStage, szMapName); else { m_bForcedEntry = true; ZApplication::GetGameInterface()->SerializeStageInterface(); } } break; case MC_MATCH_STAGE_FINISH_GAME: { bool bIsRelayMapUnFinish; CCUID uidStage; pCommand->GetParameter(&uidStage, 0, MPT_UID); pCommand->GetParameter(&bIsRelayMapUnFinish, 1, MPT_BOOL); OnStageFinishGame(uidStage, bIsRelayMapUnFinish); } break; case MC_MATCH_STAGE_MAP: { CCUID uidStage; char szMapName[_MAX_DIR]; pCommand->GetParameter(&uidStage, 0, MPT_UID); pCommand->GetParameter(szMapName, 1, MPT_STR, sizeof(szMapName) ); OnStageMap(uidStage, szMapName); } break; case MC_MATCH_STAGE_RELAY_MAP_INFO_UPDATE: { CCUID uidStage; int nRelayMapType = 0; int nRelayMapRepeatCount = 0; pCommand->GetParameter(&uidStage, 0, MPT_UID); pCommand->GetParameter(&nRelayMapType, 1, MPT_INT ); pCommand->GetParameter(&nRelayMapRepeatCount, 2, MPT_INT ); CCCommandParameter* pParam = pCommand->GetParameter(3); if (pParam->GetType() != MPT_BLOB) break; void* pRelayMapListBlob = pParam->GetPointer(); if( NULL == pRelayMapListBlob ) break; OnStageRelayMapListUpdate(nRelayMapType, nRelayMapRepeatCount, pRelayMapListBlob); } break; case MC_MATCH_STAGE_RELAY_MAP_ELEMENT_UPDATE: { CCUID uidStage; int nRelayMapType = 0; int nRelayMapRepeatCount = 0; pCommand->GetParameter(&uidStage, 0, MPT_UID ); pCommand->GetParameter(&nRelayMapType, 1, MPT_INT ); pCommand->GetParameter(&nRelayMapRepeatCount, 2, MPT_INT ); OnStageRelayMapElementUpdate(nRelayMapType, nRelayMapRepeatCount); } break; case MC_MATCH_STAGE_TEAM: { CCUID uidChar, uidStage; unsigned int nTeam; pCommand->GetParameter(&uidChar, 0, MPT_UID); pCommand->GetParameter(&uidStage, 1, MPT_UID); pCommand->GetParameter(&nTeam, 2, MPT_UINT); OnStageTeam(uidChar, uidStage, nTeam); } break; case MC_MATCH_STAGE_PLAYER_STATE: { CCUID uidChar, uidStage; int nObjectStageState; pCommand->GetParameter(&uidChar, 0, MPT_UID); pCommand->GetParameter(&uidStage, 1, MPT_UID); pCommand->GetParameter(&nObjectStageState, 2, MPT_INT); OnStagePlayerState(uidChar, uidStage, CCMatchObjectStageState(nObjectStageState)); } break; case MC_MATCH_STAGE_MASTER: { CCUID uidChar, uidStage; pCommand->GetParameter(&uidStage, 0, MPT_UID); pCommand->GetParameter(&uidChar, 1, MPT_UID); OnStageMaster(uidStage, uidChar); } break; case MC_MATCH_STAGE_CHAT: { CCUID uidStage, uidChar; static char szChat[512]; pCommand->GetParameter(&uidChar, 0, MPT_UID); pCommand->GetParameter(&uidStage, 1, MPT_UID); pCommand->GetParameter(szChat, 2, MPT_STR, sizeof(szChat) ); //check Chatting Message..jintriple3 줄 바꿈 문자 필터링 CheckMsgAboutChat(szChat); OnStageChat(uidChar, uidStage, szChat); } break; case MC_MATCH_STAGE_LIST: { char nPrevStageCount, nNextStageCount; pCommand->GetParameter(&nPrevStageCount, 0, MPT_CHAR); pCommand->GetParameter(&nNextStageCount, 1, MPT_CHAR); CCCommandParameter* pParam = pCommand->GetParameter(2); if(pParam->GetType()!=MPT_BLOB) break; void* pBlob = pParam->GetPointer(); int nCount = CCGetBlobArrayCount(pBlob); OnStageList((int)nPrevStageCount, (int)nNextStageCount, pBlob, nCount); } break; case MC_MATCH_CHANNEL_RESPONSE_PLAYER_LIST: { unsigned char nTotalPlayerCount, nPage; pCommand->GetParameter(&nTotalPlayerCount, 0, MPT_UCHAR); pCommand->GetParameter(&nPage, 1, MPT_UCHAR); CCCommandParameter* pParam = pCommand->GetParameter(2); if(pParam->GetType()!=MPT_BLOB) break; void* pBlob = pParam->GetPointer(); int nCount = CCGetBlobArrayCount(pBlob); OnChannelPlayerList((int)nTotalPlayerCount, (int)nPage, pBlob, nCount); } break; case MC_MATCH_CHANNEL_RESPONSE_ALL_PLAYER_LIST: { CCUID uidChannel; pCommand->GetParameter(&uidChannel, 0, MPT_UID); CCCommandParameter* pParam = pCommand->GetParameter(1); if(pParam->GetType()!=MPT_BLOB) break; void* pBlob = pParam->GetPointer(); int nCount = CCGetBlobArrayCount(pBlob); OnChannelAllPlayerList(uidChannel, pBlob, nCount); } break; case MC_MATCH_RESPONSE_FRIENDLIST: { CCCommandParameter* pParam = pCommand->GetParameter(0); if(pParam->GetType()!=MPT_BLOB) break; void* pBlob = pParam->GetPointer(); int nCount = CCGetBlobArrayCount(pBlob); OnResponseFriendList(pBlob, nCount); } break; case MC_MATCH_RESPONSE_STAGESETTING: { CCUID uidStage; pCommand->GetParameter(&uidStage, 0, MPT_UID); CCCommandParameter* pStageParam = pCommand->GetParameter(1); if(pStageParam->GetType()!=MPT_BLOB) break; void* pStageBlob = pStageParam->GetPointer(); int nStageCount = CCGetBlobArrayCount(pStageBlob); CCCommandParameter* pCharParam = pCommand->GetParameter(2); if(pCharParam->GetType()!=MPT_BLOB) break; void* pCharBlob = pCharParam->GetPointer(); int nCharCount = CCGetBlobArrayCount(pCharBlob); int nStageState; pCommand->GetParameter(&nStageState, 3, MPT_INT); CCUID uidMaster; pCommand->GetParameter(&uidMaster, 4, MPT_UID); OnResponseStageSetting(uidStage, pStageBlob, nStageCount, pCharBlob, nCharCount, STAGE_STATE(nStageState), uidMaster); ChangeQuestStage(); } break; case MC_MATCH_RESPONSE_PEER_RELAY: { CCUID uidPeer; if (pCommand->GetParameter(&uidPeer, 0, MPT_UID) == false) break; OnResponsePeerRelay(uidPeer); } break; case MC_MATCH_LOADING_COMPLETE: { CCUID uidChar; int nPercent; if (pCommand->GetParameter(&uidChar, 0, MPT_UID) == false) break; if (pCommand->GetParameter(&nPercent, 1, MPT_INT) == false) break; OnLoadingComplete(uidChar, nPercent); } break; case MC_MATCH_ANNOUNCE: { unsigned int nType; char szMsg[256]; pCommand->GetParameter(&nType, 0, MPT_UINT); pCommand->GetParameter(szMsg, 1, MPT_STR, sizeof(szMsg) ); OnAnnounce(nType, szMsg); } break; case MC_MATCH_CHANNEL_RESPONSE_JOIN: { CCUID uidChannel; int nChannelType; char szChannelName[256]; bool bEnableInterface; pCommand->GetParameter(&uidChannel, 0, MPT_UID); pCommand->GetParameter(&nChannelType, 1, MPT_INT); pCommand->GetParameter(szChannelName, 2, MPT_STR, sizeof(szChannelName) ); pCommand->GetParameter(&bEnableInterface, 3, MPT_BOOL); const char* szChannelNameTranslated = ZGetStringResManager()->GetStringFromXml(szChannelName); OnChannelResponseJoin(uidChannel, (CCCHANNEL_TYPE)nChannelType, szChannelNameTranslated, bEnableInterface); } break; case MC_MATCH_CHANNEL_CHAT: { CCUID uidChannel, uidChar; char szChat[512]; char szName[256]; int nGrade; pCommand->GetParameter(&uidChannel, 0, MPT_UID); pCommand->GetParameter(szName, 1, MPT_STR, sizeof(szName) ); pCommand->GetParameter(szChat, 2, MPT_STR, sizeof(szChat) ); pCommand->GetParameter(&nGrade,3, MPT_INT); //jintriple3 줄 바꿈 문자 필터링 //check chatting Message CheckMsgAboutChat(szChat); OnChannelChat(uidChannel, szName, szChat, nGrade); } break; case MC_MATCH_CHANNEL_LIST: { CCCommandParameter* pParam = pCommand->GetParameter(0); if(pParam->GetType()!=MPT_BLOB) break; void* pBlob = pParam->GetPointer(); int nCount = CCGetBlobArrayCount(pBlob); OnChannelList(pBlob, nCount); } break; case MC_MATCH_CHANNEL_RESPONSE_RULE: { CCUID uidChannel; pCommand->GetParameter(&uidChannel, 0, MPT_UID); char szRuleName[128]; pCommand->GetParameter(szRuleName, 1, MPT_STR, sizeof(szRuleName) ); OnChannelResponseRule(uidChannel, szRuleName); } break; case MC_MATCH_RESPONSE_RECOMMANDED_CHANNEL: { CCUID uidChannel; pCommand->GetParameter(&uidChannel, 0, MPT_UID); OnResponseRecommandedChannel(uidChannel); } break; case MC_ADMIN_ANNOUNCE: { char szChat[512]; unsigned long int nMsgType = 0; pCommand->GetParameter(szChat, 1, MPT_STR, sizeof(szChat) ); pCommand->GetParameter(&nMsgType, 2, MPT_UINT); OnAdminAnnounce(ZGetStringResManager()->GetStringFromXml(szChat), ZAdminAnnounceType(nMsgType)); } break; case MC_MATCH_GAME_LEVEL_UP: { CCUID uidChar; pCommand->GetParameter(&uidChar, 0, MPT_UID); OnGameLevelUp(uidChar); } break; case MC_MATCH_GAME_LEVEL_DOWN: { CCUID uidChar; pCommand->GetParameter(&uidChar, 0, MPT_UID); OnGameLevelDown(uidChar); } break; case MC_MATCH_RESPONSE_GAME_INFO: { CCUID uidStage; pCommand->GetParameter(&uidStage, 0, MPT_UID); CCCommandParameter* pParam = pCommand->GetParameter(1); if(pParam->GetType()!=MPT_BLOB) break; void* pGameInfoBlob = pParam->GetPointer(); pParam = pCommand->GetParameter(2); if(pParam->GetType()!=MPT_BLOB) break; void* pRuleInfoBlob = pParam->GetPointer(); pParam = pCommand->GetParameter(3); if(pParam->GetType()!=MPT_BLOB) break; void* pPlayerInfoBlob = pParam->GetPointer(); OnResponseGameInfo(uidStage, pGameInfoBlob, pRuleInfoBlob, pPlayerInfoBlob); } break; case MC_MATCH_OBTAIN_WORLDITEM: { CCUID uidPlayer; int nIteCCUID; pCommand->GetParameter(&uidPlayer, 0, MPT_UID); pCommand->GetParameter(&nIteCCUID, 1, MPT_INT); OnObtainWorldItem(uidPlayer, nIteCCUID); } break; case MC_MATCH_SPAWN_WORLDITEM: { CCCommandParameter* pParam = pCommand->GetParameter(0); if (pParam->GetType()!=MPT_BLOB) break; void* pSpawnInfoBlob = pParam->GetPointer(); OnSpawnWorldItem(pSpawnInfoBlob); } break; case MC_MATCH_REMOVE_WORLDITEM: { int nIteCCUID; pCommand->GetParameter(&nIteCCUID, 0, MPT_INT); OnRemoveWorldItem(nIteCCUID); } break; case MC_MATCH_USER_WHISPER: { char szSenderName[128]=""; char szTargetName[128]=""; char szMessage[1024]=""; pCommand->GetParameter(szSenderName, 0, MPT_STR, sizeof(szSenderName) ); pCommand->GetParameter(szTargetName, 1, MPT_STR, sizeof(szTargetName) ); pCommand->GetParameter(szMessage, 2, MPT_STR, sizeof(szMessage) ); //jintriple3 줄 바꿈 문자 필터링 //check chatting Message CheckMsgAboutChat(szMessage); OnUserWhisper(szSenderName, szTargetName, szMessage); } break; case MC_MATCH_CHATROOM_JOIN: { char szPlayerName[128]=""; char szChatRoomName[128]=""; pCommand->GetParameter(szPlayerName, 0, MPT_STR, sizeof(szPlayerName) ); pCommand->GetParameter(szChatRoomName, 1, MPT_STR, sizeof(szChatRoomName) ); OnChatRoomJoin(szPlayerName, szChatRoomName); } break; case MC_MATCH_CHATROOM_LEAVE: { char szPlayerName[128]=""; char szChatRoomName[128]=""; pCommand->GetParameter(szPlayerName, 0, MPT_STR, sizeof(szPlayerName) ); pCommand->GetParameter(szChatRoomName, 1, MPT_STR, sizeof(szChatRoomName) ); OnChatRoomLeave(szPlayerName, szChatRoomName); } break; case MC_MATCH_CHATROOM_SELECT_WRITE: { char szChatRoomName[128]=""; pCommand->GetParameter(szChatRoomName, 0, MPT_STR, sizeof(szChatRoomName) ); OnChatRoomSelectWrite(szChatRoomName); } break; case MC_MATCH_CHATROOM_INVITE: { char szSenderName[64]=""; char szTargetName[64]=""; char szRoomName[128]=""; pCommand->GetParameter(szSenderName, 0, MPT_STR, sizeof(szSenderName) ); pCommand->GetParameter(szTargetName, 1, MPT_STR, sizeof(szTargetName) ); pCommand->GetParameter(szRoomName, 2, MPT_STR, sizeof(szRoomName) ); OnChatRoomInvite(szSenderName, szRoomName); } break; case MC_MATCH_CHATROOM_CHAT: { char szChatRoomName[128]=""; char szPlayerName[128]=""; char szChat[128]=""; pCommand->GetParameter(szChatRoomName, 0, MPT_STR, sizeof(szChatRoomName) ); pCommand->GetParameter(szPlayerName, 1, MPT_STR, sizeof(szPlayerName) ); pCommand->GetParameter(szChat, 2, MPT_STR, sizeof(szChat) ); //jintriple3 줄 바꿈 문자 필터링 //check chatting Message CheckMsgAboutChat(szChat); OnChatRoomChat(szChatRoomName, szPlayerName, szChat); } break; case ZC_REPORT_119: { OnLocalReport119(); } break; case ZC_MESSAGE: { int iMessageID; pCommand->GetParameter(&iMessageID, 0, MPT_INT); ZGetGameInterface()->ShowMessage(iMessageID); }break; case MC_TEST_PEERTEST_PING: { CCUID uidSender = pCommand->GetSenderUID(); char szLog[128]; sprintf(szLog, "PEERTEST_PING: from (%d%d)", uidSender.High, uidSender.Low); ZChatOutput(szLog, ZChat::CMT_SYSTEM); } break; case MC_TEST_PEERTEST_PONG: { } break; // 클랜관련 case MC_MATCH_CLAN_RESPONSE_CREATE_CLAN: { int nResult, nRequestID; pCommand->GetParameter(&nResult, 0, MPT_INT); pCommand->GetParameter(&nRequestID, 1, MPT_INT); OnResponseCreateClan(nResult, nRequestID); } break; case MC_MATCH_CLAN_RESPONSE_AGREED_CREATE_CLAN: { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); OnResponseAgreedCreateClan(nResult); } break; case MC_MATCH_CLAN_ASK_SPONSOR_AGREEMENT: { int nRequestID; char szClanName[256]; CCUID uidMasterObject; char szMasterName[256]; pCommand->GetParameter(&nRequestID, 0, MPT_INT); pCommand->GetParameter(szClanName, 1, MPT_STR, sizeof(szClanName) ); pCommand->GetParameter(&uidMasterObject, 2, MPT_UID); pCommand->GetParameter(szMasterName, 3, MPT_STR, sizeof(szMasterName) ); OnClanAskSponsorAgreement(nRequestID, szClanName, uidMasterObject, szMasterName); } break; case MC_MATCH_CLAN_ANSWER_SPONSOR_AGREEMENT: { CCUID uidClanMaster; int nRequestID; bool bAnswer; char szCharName[256]; pCommand->GetParameter(&nRequestID, 0, MPT_INT); pCommand->GetParameter(&uidClanMaster, 1, MPT_UID); pCommand->GetParameter(szCharName, 2, MPT_STR, sizeof(szCharName) ); pCommand->GetParameter(&bAnswer, 3, MPT_BOOL); OnClanAnswerSponsorAgreement(nRequestID, uidClanMaster, szCharName, bAnswer); } break; case MC_MATCH_CLAN_RESPONSE_CLOSE_CLAN: { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); OnClanResponseCloseClan(nResult); } break; case MC_MATCH_CLAN_RESPONSE_JOIN_CLAN: { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); OnClanResponseJoinClan(nResult); } break; case MC_MATCH_CLAN_ASK_JOIN_AGREEMENT: { char szClanName[256], szClanAdmin[256]; CCUID uidClanAdmin; pCommand->GetParameter(szClanName, 0, MPT_STR, sizeof(szClanName) ); pCommand->GetParameter(&uidClanAdmin, 1, MPT_UID); pCommand->GetParameter(szClanAdmin, 2, MPT_STR, sizeof(szClanAdmin) ); OnClanAskJoinAgreement(szClanName, uidClanAdmin, szClanAdmin); } break; case MC_MATCH_CLAN_ANSWER_JOIN_AGREEMENT: { CCUID uidClanAdmin; bool bAnswer; char szJoiner[256]; pCommand->GetParameter(&uidClanAdmin, 0, MPT_UID); pCommand->GetParameter(szJoiner, 1, MPT_STR, sizeof(szJoiner) ); pCommand->GetParameter(&bAnswer, 2, MPT_BOOL); OnClanAnswerJoinAgreement(uidClanAdmin, szJoiner, bAnswer); } break; case MC_MATCH_CLAN_RESPONSE_AGREED_JOIN_CLAN: { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); OnClanResponseAgreedJoinClan(nResult); } break; case MC_MATCH_CLAN_UPDATE_CHAR_CLANINFO: { CCCommandParameter* pParam = pCommand->GetParameter(0); if(pParam->GetType()!=MPT_BLOB) break; void* pBlob = pParam->GetPointer(); OnClanUpdateCharClanInfo(pBlob); } break; case MC_MATCH_CLAN_RESPONSE_LEAVE_CLAN: { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); OnClanResponseLeaveClan(nResult); } break; case MC_MATCH_CLAN_MASTER_RESPONSE_CHANGE_GRADE: { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); OnClanResponseChangeGrade(nResult); } break; case MC_MATCH_CLAN_ADMIN_RESPONSE_EXPEL_MEMBER: { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); OnClanResponseExpelMember(nResult); } break; case MC_MATCH_CLAN_MSG: { char szSenderName[256]; char szMsg[512]; pCommand->GetParameter(szSenderName, 0, MPT_STR, sizeof(szSenderName) ); pCommand->GetParameter(szMsg, 1, MPT_STR, sizeof( szMsg) ); //jintriple3 줄 바꿈 문자 필터링 //check chatting Message CheckMsgAboutChat(szMsg); OnClanMsg(szSenderName, szMsg); } break; case MC_MATCH_CLAN_RESPONSE_MEMBER_LIST: { CCCommandParameter* pParam = pCommand->GetParameter(0); if(pParam->GetType()!=MPT_BLOB) break; void* pBlob = pParam->GetPointer(); OnClanMemberList(pBlob); } break; case MC_MATCH_CLAN_RESPONSE_CLAN_INFO: { CCCommandParameter* pParam = pCommand->GetParameter(0); if(pParam->GetType()!=MPT_BLOB) break; void* pBlob = pParam->GetPointer(); OnClanResponseClanInfo(pBlob); } break; case MC_MATCH_CLAN_RESPONSE_EMBLEMURL: { int nCLID=0; int nEmblemChecksum=0; char szURL[4096]=""; pCommand->GetParameter(&nCLID, 0, MPT_INT); pCommand->GetParameter(&nEmblemChecksum, 1, MPT_INT); pCommand->GetParameter(szURL, 2, MPT_STR, sizeof(szURL) ); OnClanResponseEmblemURL(nCLID, nEmblemChecksum, szURL); } break; case MC_MATCH_CLAN_LOCAL_EMBLEMREADY: { int nCLID=0; char szURL[4096]=""; pCommand->GetParameter(&nCLID, 0, MPT_INT); pCommand->GetParameter(szURL, 1, MPT_STR, sizeof(szURL) ); OnClanEmblemReady(nCLID, szURL); } break; case MC_MATCH_RESPONSE_RESULT: { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); if (nResult != MOK) { ZApplication::GetGameInterface()->ShowErrorMessage( nResult ); } } break; case MC_MATCH_RESPONSE_CHARINFO_DETAIL: { CCCommandParameter* pParam = pCommand->GetParameter(0); if (pParam->GetType()!=MPT_BLOB) break; void* pBlob = pParam->GetPointer(); OnResponseCharInfoDetail(pBlob); } break; case MC_MATCH_RESPONSE_PROPOSAL: { int nResult, nProposalMode, nRequestID; pCommand->GetParameter(&nResult, 0, MPT_INT); pCommand->GetParameter(&nProposalMode, 1, MPT_INT); pCommand->GetParameter(&nRequestID, 2, MPT_INT); OnResponseProposal(nResult, CCMatchProposalMode(nProposalMode), nRequestID); } break; case MC_MATCH_ASK_AGREEMENT: { CCUID uidProposer; // char szProposerCharName[256]; int nProposalMode, nRequestID; pCommand->GetParameter(&uidProposer, 0, MPT_UID); // pCommand->GetParameter(szProposerCharName, 1, MPT_STR); CCCommandParameter* pParam = pCommand->GetParameter(1); void* pMemberNamesBlob = pParam->GetPointer(); pCommand->GetParameter(&nProposalMode, 2, MPT_INT); pCommand->GetParameter(&nRequestID, 3, MPT_INT); OnAskAgreement(uidProposer, pMemberNamesBlob, CCMatchProposalMode(nProposalMode), nRequestID); } break; case MC_MATCH_REPLY_AGREEMENT: { CCUID uidProposer, uidChar; char szReplierName[256]; int nProposalMode, nRequestID; bool bAgreement; pCommand->GetParameter(&uidProposer, 0, MPT_UID); pCommand->GetParameter(&uidChar, 1, MPT_UID); pCommand->GetParameter(szReplierName, 2, MPT_STR, sizeof(szReplierName) ); pCommand->GetParameter(&nProposalMode, 3, MPT_INT); pCommand->GetParameter(&nRequestID, 4, MPT_INT); pCommand->GetParameter(&bAgreement, 5, MPT_BOOL); OnReplyAgreement(uidProposer, uidChar, szReplierName, CCMatchProposalMode(nProposalMode), nRequestID, bAgreement); } break; // 레더 커맨드 case MC_MATCH_LADDER_SEARCH_RIVAL: // 검색 시작 { ZGetGameInterface()->OnArrangedTeamGameUI(true); }break; case MC_MATCH_LADDER_CANCEL_CHALLENGE: { ZGetGameInterface()->OnArrangedTeamGameUI(false); char szCharName[MATCHOBJECT_NAME_LENGTH]; pCommand->GetParameter(szCharName, 0, MPT_STR, sizeof(szCharName) ); if(szCharName[0]!=0) { char szOutput[256]; ZTransMsg(szOutput,MSG_LADDER_CANCEL,1,szCharName); ZChatOutput(sColor(ZCOLOR_CHAT_SYSTEM), szOutput); }else // 이름이 없으면 실패한경우다. { ZChatOutput(sColor(ZCOLOR_CHAT_SYSTEM), ZMsg(MSG_LADDER_FAILED) ); } }break; case MC_MATCH_LADDER_RESPONSE_CHALLENGE: { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); OnLadderResponseChallenge(nResult); } break; case MC_MATCH_LADDER_PREPARE: { CCUID uidStage; pCommand->GetParameter(&uidStage, 0, MPT_UID); int nTeam; pCommand->GetParameter(&nTeam, 1, MPT_INT); OnLadderPrepare(uidStage, nTeam); }break; case MC_MATCH_LADDER_LAUNCH: // 게임 시작 { CCUID uidStage; pCommand->GetParameter(&uidStage, 0, MPT_UID); char szMapName[128]; pCommand->GetParameter(szMapName, 1, MPT_STR, sizeof(szMapName) ); OnLadderLaunch(uidStage, szMapName); }break; case MC_MATCH_CLAN_STANDBY_CLAN_LIST: { int nPrevStageCount, nNextStageCount; pCommand->GetParameter(&nPrevStageCount, 0, MPT_INT); pCommand->GetParameter(&nNextStageCount, 1, MPT_INT); CCCommandParameter* pParam = pCommand->GetParameter(2); if(pParam->GetType()!=MPT_BLOB) break; void* pBlob = pParam->GetPointer(); OnClanStandbyClanList(nPrevStageCount, nNextStageCount, pBlob); } break; case MC_MATCH_CLAN_MEMBER_CONNECTED: { char szMember[256]; pCommand->GetParameter(szMember, 0, MPT_STR, sizeof(szMember) ); OnClanMemberConnected(szMember); } break; case MC_MATCH_NOTIFY_CALLVOTE: { char szDiscuss[128] = ""; char szArg[256] = ""; pCommand->GetParameter(szDiscuss, 0, MPT_STR, sizeof(szDiscuss) ); pCommand->GetParameter(szArg, 1, MPT_STR, sizeof(szArg) ); OnNotifyCallVote(szDiscuss, szArg); } break; case MC_MATCH_NOTIFY_VOTERESULT: { char szDiscuss[128]; int nResult = 0; pCommand->GetParameter(szDiscuss, 0, MPT_STR, sizeof(szDiscuss) ); pCommand->GetParameter(&nResult, 1, MPT_INT); OnNotifyVoteResult(szDiscuss, nResult); } break; case MC_MATCH_VOTE_RESPONSE: { int nMsgCode = 0; pCommand->GetParameter( &nMsgCode, 0, MPT_INT ); OnVoteAbort( nMsgCode ); } break; case MC_MATCH_BROADCAST_CLAN_RENEW_VICTORIES: { char szWinnerClanName[256], szLoserClanName[256]; int nVictories; pCommand->GetParameter(szWinnerClanName, 0, MPT_STR, sizeof(szWinnerClanName) ); pCommand->GetParameter(szLoserClanName, 1, MPT_STR, sizeof(szLoserClanName) ); pCommand->GetParameter(&nVictories, 2, MPT_INT); OnBroadcastClanRenewVictories(szWinnerClanName, szLoserClanName, nVictories); } break; case MC_MATCH_BROADCAST_CLAN_INTERRUPT_VICTORIES: { char szWinnerClanName[256], szLoserClanName[256]; int nVictories; pCommand->GetParameter(szWinnerClanName, 0, MPT_STR, sizeof(szWinnerClanName) ); pCommand->GetParameter(szLoserClanName, 1, MPT_STR, sizeof(szLoserClanName) ); pCommand->GetParameter(&nVictories, 2, MPT_INT); OnBroadcastClanInterruptVictories(szWinnerClanName, szLoserClanName, nVictories); } break; case MC_MATCH_BROADCAST_DUEL_RENEW_VICTORIES: { char szChannelName[256], szChampionName[256]; int nVictories, nRoomNo; pCommand->GetParameter(szChampionName, 0, MPT_STR, sizeof(szChampionName) ); pCommand->GetParameter(szChannelName, 1, MPT_STR, sizeof(szChannelName) ); pCommand->GetParameter(&nRoomNo, 2, MPT_INT); pCommand->GetParameter(&nVictories, 3, MPT_INT); OnBroadcastDuelRenewVictories(szChampionName, szChannelName, nRoomNo, nVictories); } break; case MC_MATCH_BROADCAST_DUEL_INTERRUPT_VICTORIES: { char szChampionName[256], szInterrupterName[256]; int nVictories; pCommand->GetParameter(szChampionName, 0, MPT_STR, sizeof(szChampionName) ); pCommand->GetParameter(szInterrupterName, 1, MPT_STR, sizeof(szInterrupterName) ); pCommand->GetParameter(&nVictories, 2, MPT_INT); OnBroadcastDuelInterruptVictories(szChampionName, szInterrupterName, nVictories); } break; case MC_MATCH_RESPONSE_STAGE_FOLLOW: { int nMsgID; pCommand->GetParameter( &nMsgID, 0, MPT_INT ); OnFollowResponse( nMsgID ); } break; case MC_MATCH_SCHEDULE_ANNOUNCE_SEND : { char cAnnounce[ 512 ] = {0}; pCommand->GetParameter( cAnnounce, 0, MPT_STR , sizeof(cAnnounce) ); ZChatOutput( cAnnounce ); } break; case MC_MATCH_EXPIRED_RENT_ITEM: { CCCommandParameter* pParam = pCommand->GetParameter(0); if(pParam->GetType()!=MPT_BLOB) break; void* pBlob = pParam->GetPointer(); OnExpiredRentItem(pBlob); } break; case MC_MATCH_FIND_HACKING: { } break; case MC_MATCH_REWARD_BATTLE_TIME: { CCUID uidOwner; char szRewardName[256], szRewardResetDesc[256]; int nRemainReward; unsigned int nItemId, nItemCnt; unsigned int nRentHourPeriod; pCommand->GetParameter(&uidOwner, 0, MPT_UID); pCommand->GetParameter(szRewardName, 1, MPT_STR, sizeof(szRewardName) ); pCommand->GetParameter(szRewardResetDesc, 2, MPT_STR, sizeof(szRewardResetDesc) ); pCommand->GetParameter(&nItemId, 3, MPT_UINT); pCommand->GetParameter(&nItemCnt, 4, MPT_UINT); pCommand->GetParameter(&nRentHourPeriod, 5, MPT_UINT); pCommand->GetParameter(&nRemainReward, 6, MPT_INT); const char* szCharName = "-"; const char* szItemName = "-"; if (ZGetCharacterManager()) { ZCharacter* pChar = ZGetCharacterManager()->Find(uidOwner); if (pChar) szCharName = pChar->GetUserName(); } CCMatchItemDesc* pItemDesc = CCGetMatchItemDescMgr()->GetItemDesc(nItemId); if (pItemDesc) szItemName = pItemDesc->m_pMItemName->Ref().m_szItemName; else { const ZGambleItemDefine* pGItemDef = ZGetGambleItemDefineMgr().GetGambleItemDefine(nItemId); if (pGItemDef) szItemName = pGItemDef->GetName().c_str(); } // 이 커맨드는 // 1. 보상을 실제로 받은 경우 // 2. 보상을 받을 수 있지만 기회가 남지 않아서 받을 수 없는 경우 // 두 경우 모두 전송받는다. 따라서 상황에 맞게 적절한 처리가 필요하다 bool bRewardReally = (nItemId != 0); bool bMyReward = (ZGetMyUID() == uidOwner); if (bRewardReally) { TimeReward_ShowCharEffect(uidOwner); // 캐릭터 머리 위에 이펙트 출력 TimeReward_ChatOutput_RewardGet(szRewardName, szCharName, szItemName); // '누가 무엇을 받았다' 출력 if (bMyReward) // 나 자신을 위한 커맨드라면 { if (nRemainReward >= 1) TimeReward_ChatOutput_RemainChance(nRemainReward); // 남은 기회를 출력 else if (nRemainReward == 0) TimeReward_ChatOutput_ResetChance(szRewardResetDesc); // 이번에 받은 것이 마지막 기회였다면 재충전 시각 공지 else if (nRemainReward == -1) int a=0;// 이 경우는 별도의 기회 제한이 없는 이벤트를 나타낸다, 특별히 기회에 대한 출력문을 보여주지 않는다 } } else // 조건은 충족했으나 남은 기회가 없어 받지 못한 경우 { if (bMyReward) { TimeReward_ChatOutput_NoChance(szRewardName); // 기회가 없어서 받지 못함을 알려주고 TimeReward_ChatOutput_ResetChance(szRewardResetDesc); // 재충전 시각을 공지 } } } break; // 듀얼 토너먼트 #ifdef _DUELTOURNAMENT case MC_MATCH_DUELTOURNAMENT_RESPONSE_JOINGAME: { int nResult; pCommand->GetParameter(&nResult, 0, MPT_INT); switch (nResult) { case MERR_DT_WRONG_CHANNEL: ZApplication::GetGameInterface()->ShowErrorMessage( nResult ); cclog("Error: Illegal request to join game, This isn't a duel tournament channel.\n"); break; case MERR_DT_CANNOT_CHALLENGE: ZApplication::GetGameInterface()->ShowErrorMessage( nResult ); cclog("Error: failed to challenge a duel tournament game.\n"); break; case MERR_DT_ALREADY_JOIN: ZApplication::GetGameInterface()->ShowErrorMessage( nResult ); cclog("Error: already trying to join a duel tournament game.\n"); break; } } break; case MC_MATCH_DUELTOURNAMENT_PREPARE_MATCH: { CCUID uidStage = CCUID(0,0); int nType; pCommand->GetParameter(&uidStage, 0, MPT_UID); pCommand->GetParameter(&nType, 1, MPT_INT); CCCommandParameter* pParam = pCommand->GetParameter(2); void* pBlobPlayerInfo = pParam->GetPointer(); OnDuelTournamentPrepare((CCDUELTOURNAMENTTYPE)nType, uidStage, pBlobPlayerInfo); } break; case MC_MATCH_DUELTOURNAMENT_LAUNCH_MATCH: { CCUID uidStage; pCommand->GetParameter(&uidStage, 0, MPT_UID); char szMapName[128]; pCommand->GetParameter(szMapName, 1, MPT_STR, sizeof(szMapName) ); ZIDLResource* pResource = ZApplication::GetGameInterface()->GetIDLResource(); CCWidget* pWidget = pResource->FindWidget("DuelTournamentWaitMatchDialog"); if(pWidget!=NULL) pWidget->Show(false); OnDuelTournamentLaunch(uidStage, szMapName); } break; case MC_MATCH_DUELTOURNAMENT_NOT_SERVICE_TIME: { int nOpenStartTime; int nOpenEndTime; pCommand->GetParameter(&nOpenStartTime, 0, MPT_INT); pCommand->GetParameter(&nOpenEndTime, 1, MPT_INT); // 듀얼토너먼트 신청이 서비스 시간에 따라 취소 되었음. ZApplication::GetGameInterface()->OnDuelTournamentGameUI(false); // 참가 신청 박스 닫아준다. const char *strFormat = ZErrStr( MERR_DT_NOT_SERVICE_TIME ); if(strFormat) { char text[1024]; sprintf(text, strFormat, nOpenStartTime, nOpenEndTime); ZApplication::GetGameInterface()->ShowErrorMessage(text, MERR_DT_NOT_SERVICE_TIME); } } break; case MC_MATCH_DUELTOURNAMENT_CHAR_INFO: { pCommand->GetParameter(&m_dtCharInfo.tournamentPoint, 0, MPT_INT); pCommand->GetParameter(&m_dtCharInfo.wins, 1, MPT_INT); pCommand->GetParameter(&m_dtCharInfo.losses, 2, MPT_INT); pCommand->GetParameter(&m_dtCharInfo.ranking, 3, MPT_INT); //pCommand->GetParameter(&rankingFructuation, 4, MPT_INT); pCommand->GetParameter(&m_dtCharInfo.winners, 5, MPT_INT); pCommand->GetParameter(&m_dtCharInfo.lastWeekGrade, 6, MPT_INT); ZGetGameInterface()->UpdateDuelTournamantMyCharInfoUI(); } break; case MC_MATCH_DUELTOURNAMENT_CHAR_INFO_PREVIOUS: { pCommand->GetParameter(&m_dtCharInfoPrev.tournamentPoint, 0, MPT_INT); pCommand->GetParameter(&m_dtCharInfoPrev.wins, 1, MPT_INT); pCommand->GetParameter(&m_dtCharInfoPrev.losses, 2, MPT_INT); pCommand->GetParameter(&m_dtCharInfoPrev.ranking, 3, MPT_INT); pCommand->GetParameter(&m_dtCharInfoPrev.winners, 4, MPT_INT); ZGetGameInterface()->UpdateDuelTournamantMyCharInfoPreviousUI(); } break; #endif //_DUELTOURNAMENT // Gamble 아이템 case MC_MATCH_RESPONSE_GAMBLE: { unsigned int nRecvItem; unsigned int nCnt; unsigned int nTime; pCommand->GetParameter(&nRecvItem, 0, MPT_UINT); pCommand->GetParameter(&nCnt, 1, MPT_UINT); pCommand->GetParameter(&nTime, 2, MPT_UINT); OnRecieveGambleItem( nRecvItem, nCnt, nTime); } break; case MC_QUEST_NPCLIST : { CCCommandParameter* pParam = pCommand->GetParameter( 0 ); if( MPT_BLOB != pParam->GetType() ) { break; } void* pBlobNPCList = pParam->GetPointer(); if( NULL == pBlobNPCList ) { return false; } int gameType; if (!pCommand->GetParameter(&gameType, 1, MPT_INT)) { ASSERT(0); return false; } OnQuestNPCList( pBlobNPCList, (CCMATCH_GAMETYPE)gameType ); } break; case MC_REQUEST_RESOURCE_CRC32 : { DWORD dwKey = 0; pCommand->GetParameter( &dwKey, 0, MPT_UINT ); DWORD dwCrc32, dwXor; ZGetGame()->MakeResourceCRC32(dwKey, dwCrc32, dwXor); ZPostResponseResourceCRC32( dwCrc32, dwXor ); } break; case MC_MATCH_ROUTE_UPDATE_STAGE_EQUIP_LOOK : { CCUID uidPlayer; int nParts; int nItemID; pCommand->GetParameter( &uidPlayer, 0, MPT_UID ); pCommand->GetParameter( &nParts, 1, MPT_INT ); pCommand->GetParameter( &nItemID, 2, MPT_INT ); OnResponseUpdateStageEquipLook( uidPlayer, nParts, nItemID ); } break; case MC_ADMIN_RESPONSE_KICK_PLAYER: { int nResult; pCommand->GetParameter( &nResult, 0, MPT_INT ); OnAdminResponseKickPlayer(nResult); } break; case MC_ADMIN_RESPONSE_BLOCK_PLAYER: { int nResult; pCommand->GetParameter( &nResult, 0, MPT_INT ); OnAdminResponseBlockPlayer(nResult); } break; case MC_ADMIN_RESPONSE_MUTE_PLAYER: { int nResult; pCommand->GetParameter( &nResult, 0, MPT_INT ); OnAdminResponseMutePlayer(nResult); } break; default: if (!ret) { // CCClient::OutputMessage(CCZMOM_LOCALREPLY, "Command(%s) handler not found", pCommand->m_pCommandDesc->GetName()); // return false; } break; } if (m_fnOnCommandCallback) ret = m_fnOnCommandCallback(pCommand); return ret; }
bool ZEffectBillboardTexAniList::Draw() { if(!m_pVB) return false; if( size()==0 ) return true; BeginState(); RSetFog(FALSE); HRESULT hr; DWORD dwRemainNum = (DWORD)size(); iterator itr = begin(); while(dwRemainNum) { if(m_dwBase >= EFFECTBASE_DISCARD_COUNT) m_dwBase = 0; DWORD dwThisNum = min( dwRemainNum , static_cast<DWORD>(BILLBOARD_FLUSH_COUNT) ); dwThisNum = min( dwThisNum , EFFECTBASE_DISCARD_COUNT - m_dwBase ); BYTE *pVertices; if( FAILED( hr = m_pVB->Lock( m_dwBase * sizeof(ZEFFECTCUSTOMVERTEX) * 4, dwThisNum * sizeof(ZEFFECTCUSTOMVERTEX) * 4, (VOID**)&pVertices, m_dwBase ? D3DLOCK_NOOVERWRITE : D3DLOCK_DISCARD ) ) ) { return false; } BYTE *pInd; if( FAILED( hr = m_pIB->Lock( m_dwBase * sizeof(WORD) * 6, dwThisNum * sizeof(WORD) * 6, (VOID**)&pInd, m_dwBase ? D3DLOCK_NOOVERWRITE : D3DLOCK_DISCARD ) ) ) { return false; } int nRenderCnt = 0; ZCharacter* pChar = NULL; for(DWORD j=0;j<dwThisNum;j++) { ZEFFECTBILLBOARDTEXANIITEM *p = (ZEFFECTBILLBOARDTEXANIITEM*)*itr; if(p->fElapsedTime < p->fAddTime ) { itr++; continue; } pChar = ZGetCharacterManager()->Find(p->CharUID); if( pChar ) { if( pChar->m_pVMesh ) { if( pChar->m_pVMesh->m_bIsRender==false) { itr++; continue; } } } nRenderCnt++; // Transform rmatrix matTranslation; rmatrix matScaling; rmatrix matWorld; rvector dir = p->normal; rvector up = p->up; rvector right; if (IS_EQ(dir.z, 1.f)) up = rvector(1, 0, 0); right = Normalized(CrossProduct(up, dir)); up = Normalized(CrossProduct(right, dir)); rmatrix mat; GetIdentityMatrix(mat); mat._11 = right.x; mat._12 = right.y; mat._13 = right.z; mat._21 = up.x; mat._22 = up.y; mat._23 = up.z; mat._31 = dir.x; mat._32 = dir.y; mat._33 = dir.z; rvector pos = p->position; float fInt = min(1.f, max(0.f, (p->fLifeTime - p->fElapsedTime) / p->fLifeTime)); float fScale=p->fStartSize * fInt + p->fEndSize * (1.f - fInt); matScaling = ScalingMatrix(fScale * m_Scale); matTranslation = TranslationMatrix(pos); matWorld = matScaling * mat; matWorld *= matTranslation; DWORD color = ((DWORD)(p->fOpacity * 255))<<24 | p->dwColor; static ZEFFECTCUSTOMVERTEX v[] = { {{-1, -1, 0}, 0xFFFFFFFF, 1, 0 }, {{-1, 1, 0}, 0xFFFFFFFF, 1, 1}, {{ 1, 1, 0}, 0xFFFFFFFF, 0, 1}, {{ 1, -1, 0}, 0xFFFFFFFF, 0, 0}, }; static rvector sv[4] = { rvector(-1,-1,0) , rvector(-1,1,0) , rvector(1,1,0) , rvector(1,-1,0) }; GetFrameUV( min( p->frame,m_nMaxFrame-1) ); v[0].tu = m_fUV[0]; v[0].tv = m_fUV[1]; v[1].tu = m_fUV[2]; v[1].tv = m_fUV[3]; v[2].tu = m_fUV[4]; v[2].tv = m_fUV[5]; v[3].tu = m_fUV[6]; v[3].tv = m_fUV[7]; for (size_t i{}; i < 4; ++i) v[i].pos = TransformCoord(sv[i], matWorld); v[0].color=v[1].color=v[2].color=v[3].color=color; memcpy(pVertices,v,sizeof(ZEFFECTCUSTOMVERTEX)*4); pVertices+=sizeof(ZEFFECTCUSTOMVERTEX)*4; WORD inds[] = { 0,1,2,0,2,3 }; for(int k=0;k<6;k++) { inds[k]+=(m_dwBase+j)*4; } memcpy(pInd,inds,sizeof(inds)); pInd+=sizeof(inds); itr++; } m_pVB->Unlock(); m_pIB->Unlock(); if(FAILED( hr = RGetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,m_dwBase*4,nRenderCnt*4,m_dwBase*6,nRenderCnt*2) )) return false; m_dwBase+=dwThisNum; dwRemainNum-=dwThisNum; } RGetDevice()->SetStreamSource( 0, NULL , 0,0 ); RGetDevice()->SetIndices(NULL); if(ZGetWorld()) { ZGetWorld()->SetFog(true); } EndState(); return true; }
////////////////////////////////////////////////////////////////////////// // satisfyConstraints ////////////////////////////////////////////////////////////////////////// void ZClothEmblem::satisfyConstraints() { sConstraint* c; rvector* x1; rvector* x2; rvector delta; float deltaLegth; float diff; int i,j; // if( mbIsInFrustrum ) { for( i = 0 ; i < m_nCntIter; ++i ) { // 캐릭터와 충돌 체크 for (ZCharacterManager::iterator itor = ZGetCharacterManager()->begin(); itor != ZGetCharacterManager()->end(); ++itor) { ZCharacter* pCharacter = (*itor).second; // 현재 화면에 보이는 캐릭터만 대상으로 체크.. 뷰프러스텀 컬링 if( !isInViewFrustum( pCharacter->GetPosition(), CHARACTER_RADIUS + 10, RGetViewFrustum() ) ) { continue; } if( pCharacter->IsDie() && pCharacter->m_dwStatusBitPackingValue.Ref().m_bBlastDrop && !pCharacter->IsVisible() ) { continue; } for( j = 0 ; j < m_nCntP; ++j ) { rvector pos = pCharacter->GetPosition(); rvector myPos = m_pX[j]; if( pos.z + 190 < myPos.z || pos.z > myPos.z ) { continue; } pos.z = 0; myPos.z = 0; rvector dir = myPos - pos; float lengthsq = D3DXVec3LengthSq( &dir ); if( lengthsq > CHARACTER_RADIUS*CHARACTER_RADIUS ) { continue; } D3DXVec3Normalize( &dir, &dir ); myPos = pos + dir * ( CHARACTER_RADIUS ); m_pX[j].x = myPos.x; m_pX[j].y = myPos.y; //break; } } } // Restriction for( list<sRestriction*>::iterator itor = mRestrictionList.begin(); itor != mRestrictionList.end(); ++itor ) { for( int j = 0 ; j < m_nCntP; ++j ) { float* p = (float*)&m_pX[j]; sRestriction* r = *itor; p += (int)r->axis; // 축결정 if( r->compare == COMPARE_GREATER) { if( *p > r->position ) { *p = r->position; } } else { if( *p < r->position -3) { *p = r->position; } } } } // Relaxation for( j = 0 ; j < m_nCntC; ++j ) { c = &m_pConst[j]; x1 = &m_pX[ c->refA ]; x2 = &m_pX[ c->refB ]; delta = *x2 - *x1; deltaLegth = D3DXVec3Length( &delta ); diff = (float) ( ( deltaLegth - c->restLength ) / (deltaLegth )); *x1 += delta * diff * 0.5; *x2 -= delta * diff * 0.5; } } for( i = 0 ; i < m_nCntP; ++i ) { if( m_pHolds[i] & CLOTH_HOLD ) { m_pX[i] = m_pOldX[i]; } } }