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 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 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; }
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; }