void ZCharacterObject::DrawEnchantSub(ZC_ENCHANT etype,rvector& pos) { if(etype==ZC_ENCHANT_FIRE) ZGetEffectManager()->AddTrackFire( pos ); else if(etype==ZC_ENCHANT_COLD) ZGetEffectManager()->AddTrackCold( pos ); else if(etype==ZC_ENCHANT_POISON) ZGetEffectManager()->AddTrackPoison( pos ); // else if(etype==ZC_ENCHANT_LIGHTNING) }
bool ZSurvival::OnQuestCombatState(MCommand* pCommand) { char nState; pCommand->GetParameter(&nState, 0, MPT_CHAR); MQuestCombatState nCombatState = MQuestCombatState(nState); m_QuestCombatState = nCombatState; // 보관.. switch (nCombatState) { case MQUEST_COMBAT_PREPARE: { } break; case MQUEST_COMBAT_PLAY: { ZGetObjectManager()->GetNPCObjectMap()->ForceInvisibleNewNpc(false); ZGetEffectManager()->Clear(); ZGetEffectManager()->EnableDraw(true); ZGetGame()->m_WeaponManager.EnableRender(true); ZGetWorldItemManager()->EnableDraw(true); } break; case MQUEST_COMBAT_COMPLETED: { // 서바이벌이므로 마지막 섹터라도 포탈을 찍어야 한다. 그러나 마지막 반복의 막판이라면 포탈을 없게한다 if (!m_GameInfo.IsLastSectorInSurvival()) { if (ZGetGame()) { rvector portal_pos; int nCurrSectorIndex = m_GameInfo.GetCurrSectorIndex(); int nLinkIndex = m_GameInfo.GetMapSectorLink(nCurrSectorIndex); portal_pos = ZGetGame()->GetMapDesc()->GetQuestSectorLink(nLinkIndex); ZGetWorldItemManager()->AddQuestPortal(portal_pos); m_GameInfo.SetPortalPos(portal_pos); ZChatOutput(MCOLOR(ZCOLOR_CHAT_SYSTEM_GAME), ZMsg(MSG_GAME_OPEN_PORTAL)); m_tRemainedTime = timeGetTime() + PORTAL_MOVING_TIME; m_bIsRoundClear = true; } } } break; }; return true; }
void ZCharacterObject::EnChantWeaponEffect(ZC_ENCHANT etype,int nLevel) { float fSwordSize = m_pVMesh->GetWeaponSize(); fSwordSize -= 35.f;//¼ÕÀâÀÌ Å©±â Á¤µµ¸¦ »©ÁØ´Ù... ZEffectWeaponEnchant* pEWE = NULL; if( etype != ZC_ENCHANT_NONE ) pEWE = ZGetEffectManager()->GetWeaponEnchant( etype ); if(pEWE) { //Ç¥ÁØ »çÀÌÁî´Â īŸ³ª... 105 Á¤µµ.. float fSIze = fSwordSize / 100.f; float fVolSize = 1.f; if(nLevel==0) fVolSize = 0.6f; else if(nLevel==1) fVolSize = 0.75f; else if(nLevel==2) fVolSize = 1.0f; else fVolSize = 1.25f; rvector vScale = rvector(0.7f*fSIze*fVolSize,0.7f*fSIze*fVolSize,1.1f*fSIze);// ¹«±âÀÇ Å©±â¿¡ µû¶ó¼.. pEWE->SetUid( m_UID ); pEWE->SetAlignType(1); pEWE->SetScale(vScale); pEWE->Draw(timeGetTime()); } }
void TimeReward_ShowCharEffect(CCUID uidChar) { if (ZGetCharacterManager()) { ZCharacter* pChar = ZGetCharacterManager()->Find(uidChar); if (pChar && pChar->IsVisible()) ZGetEffectManager()->AddTimeRewardEffect(pChar->GetPosition(), pChar); // 이펙트 출력 } }
void ZSurvival::OnGameDestroy() { if (!ZGetGameTypeManager()->IsQuestDerived(ZGetGameClient()->GetMatchStageSetting()->GetGameType())) return; Destroy(); ZGetEffectManager()->EnableDraw(true); ZGetGame()->m_WeaponManager.EnableRender(true); ZGetWorldItemManager()->EnableDraw(true); }
bool ZModule_PoisonDamage::Update(float fElapsed) { ZObject* pObj = MDynamicCast(ZObject, m_pContainer); if (!pObj) _ASSERT(0); else { // ������ ���� DAMAGE_DELAY if(ZGetGame()->GetTime()>m_fNextDamageTime) { m_fNextDamageTime+=DAMAGE_DELAY; // ������ �ް� �ִ� ����Ʈ ������ ������ ���������� ���� ���¿����� ���δ�.. if(pObj->IsDie()) { if( pObj->m_pVMesh->GetVisibility() < 0.5f ) {//����Ʈ�� Life Ÿ�ӵ� �����ϱ�... m_bOnDamage = false; return false; } } else //�����������.. { // ������� ������Ʈ�� ���⼭ �����Ϸ��������� ����� ������ �ȵ� �ϴ� �ּ�ó���Ѵ� // 5 * (1.f-fPR) �̺κж����� zitem.xml���� damage="1"�κκ��� damage="6"�� �ϴ� ���� //float fPR = 0; //float fDamage = 5 * (1.f-fPR) + (float)m_nDamage; pObj->OnDamaged(m_pOwner, pObj->GetPosition(), ZD_LIGHTNING, MWT_NONE, m_fDamage, 1); /*ZModule_HPAP *pModule = (ZModule_HPAP*)m_pContainer->GetModule(ZMID_HPAP); if(pModule) { pModule->OnDamage(m_pOwner,m_fDamage,1); // pObj->OnScream(); }*/ } } if(ZGetGame()->GetTime()>m_fNextEffectTime) { if(!pObj->IsDie()) { int nEffectLevel = GetEffectLevel()+1; m_fNextEffectTime+=EFFECT_DELAY * nEffectLevel; ZGetEffectManager()->AddEnchantPoison2( pObj ); } } } if(m_fNextDamageTime-m_fBeginTime>m_fDuration) { m_bOnDamage = false; return false; } return true; }
////////////////////////////////////////////////////////////////////////// // draw ////////////////////////////////////////////////////////////////////////// void ZShadow::draw(bool bForced) { if( (bLFShadow==false) && ((bRFShadow==false))) return; float blend_factor = ( mfDistance )/ VALID_SHADOW_BOUNDARY_SQUARE; if( blend_factor >= 1 ) blend_factor = 0; else if( mfDistance <= 0 ) blend_factor = 1; else blend_factor = 1 - blend_factor; DWORD _color = ((DWORD)(blend_factor * 255))<<24 | 0xffffff; if(bLFShadow) ZGetEffectManager()->AddShadowEffect(mWorldMatLF,_color); if(bRFShadow) ZGetEffectManager()->AddShadowEffect(mWorldMatRF,_color); }
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::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 ZMapDesc::DrawSmokeST(ZMapSmokeST* pDummy) { if(!pDummy) return; float f = pDummy->m_nDelay / 1000.f; float _time = GetThisTime(); if( _time > pDummy->m_fToggleSaveTime + pDummy->m_fToggleTime ) { pDummy->m_bToggle = !pDummy->m_bToggle; pDummy->m_fToggleSaveTime = _time; pDummy->m_fToggleTime = pDummy->m_fToggleMinTime + (pDummy->m_fToggleMinTime * (rand()%3)); } if( pDummy->m_fToggleMinTime < 0.01f) // 아주 작으면 계속 출력.. pDummy->m_bToggle = false; if( pDummy->m_bToggle ) { return; } if( _time > pDummy->m_fDrawBackupTime + f) { rvector addpos = rvector(0,0,0); float fLife = pDummy->m_fLife + (rand()%2); float fStartScale = pDummy->m_fSize + (rand()%30); float fEndScale = pDummy->m_fSize + (rand()%200); ZGetEffectManager()->AddMapSmokeSTEffect( pDummy->m_vPos + addpos , // target pDummy->m_vSteamDir, // dir pDummy->m_vDir * pDummy->m_fPower, // acc 바람방향.. pDummy->m_vSteamDir * 200.f,//pDummy->m_fPower, // acc2 더미방향.. pDummy->m_dwColor, // pDummy->m_nDelay, // 갱신 주기에 써야한다. fLife , fStartScale , fEndScale ); pDummy->m_fDrawBackupTime = _time; } }
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 ZWeaponMgr::AddMagic(ZSkill* pSkill, const rvector &pos, const rvector &dir,ZObject* pOwner) { ZWeaponMagic* pWeapon = new ZWeaponMagic; RMeshMgr* pMeshMgr = ZGetEffectManager()->GetEffectMeshMgr(); if(!pMeshMgr) return; ZSkillDesc* pDesc = pSkill->GetDesc(); RMesh* pMesh = pMeshMgr->Get( pDesc->szTrailEffect ); float fMagicScale = pDesc->fTrailEffectScale; if(!pMesh) return; pWeapon->Create(pMesh,pSkill,pos,dir,fMagicScale,pOwner); Add(pWeapon); }
bool ZModule_HealOverTime::Update(float fElapsed) { ZCharacter* pChar = MDynamicCast(ZCharacter, m_pContainer); if (!pChar) _ASSERT(0); else { if(ZGetGame()->GetTime() > m_fNextHealTime.Ref()) { m_fNextHealTime.Set_CheckCrc(m_fNextHealTime.Ref()+1.f); // 1초마다 힐을 받는다 m_numHealDone.Set_CheckCrc(m_numHealDone.Ref()+1); if(pChar->IsDie()) { m_bOnHeal.Set_CheckCrc(false); } else { switch (m_type.Ref()) { case MMDT_HEAL: pChar->SetHP( min( pChar->GetHP() + m_fHeal.Ref(), pChar->GetMaxHP() ) ); break; case MMDT_REPAIR: pChar->SetAP( min( pChar->GetAP() + m_fHeal.Ref(), pChar->GetMaxAP() ) ); break; default: _ASSERT(0); } ZGetEffectManager()->AddPotionEffect( pChar->GetPosition(), pChar, m_nEffectId ); } } } if(m_numHealDone.Ref() == m_numHealDesire.Ref()) { m_bOnHeal.Set_CheckCrc(false); return false; } return true; }
void ZMapDesc::DrawSmokeSS(ZMapSmokeSS* pDummy) { if(!pDummy) return; float f = pDummy->m_nDelay / 1000.f; float _time = GetThisTime(); if( _time > pDummy->m_fDrawBackupTime + f) // if( _time > pDummy->m_fDrawBackupTime + 0.6f) { rvector addpos = rvector(0,0,0); if( rand()%2 ) addpos.x = rand()%100; else addpos.x = -rand()%100; if( rand()%2 ) addpos.y = rand()%100; else addpos.y = -rand()%100; // float fLife = 6.f + (rand()%5); float fLife = pDummy->m_fLife + (rand()%5); float fStartScale = pDummy->m_fSize + (rand()%50); float fEndScale = pDummy->m_fSize * 10 + (rand()%300); ZGetEffectManager()->AddMapSmokeSSEffect( pDummy->m_vPos + addpos , // target rvector(0,0,500), // dir pDummy->m_vDir*pDummy->m_fPower, // acc pDummy->m_dwColor, // pDummy->m_nDelay, // 갱신 주기에 써야한다. fLife , fStartScale , fEndScale ); pDummy->m_fDrawBackupTime = _time; } }
bool ZEffectAniMesh::Draw(unsigned long int nTime) { if(m_VMesh.m_pMesh==NULL) return false; AniFrameInfo* pInfo = m_VMesh.GetFrameInfo(ani_mode_lower); if(pInfo->m_pAniSet==NULL)// m_VMesh.m_pAniSet[0]==NULL return false; if(nTime < m_nStartTime + m_nStartAddTime) { return true; } // 그리기가 연기 된경우 지금 상태의 캐릭터 데이터를 참조.. if( m_bDelay && !m_isCheck ) { ZObject* pObj = ZGetObjectManager()->GetObject(m_uid); ZCharacterObject* pCObj = MDynamicCast(ZCharacterObject, pObj); if(pCObj) { if(!pCObj->IsRendered()) return false; rvector _vp = pCObj->GetPosition(); rvector _vdir = pCObj->m_Direction; _vdir.z = 0; Normalize(_vdir); /* int cm = g_pGame->SelectSlashEffectMotion(pObj);//남녀 칼 휘두르는 방향 if(cm==SEM_ManSlash5) { _vdir.z = 0.f; _vp += _vdir * 120.f; _vp.z -= 100.f; } else if(cm==SEM_WomanSlash5) { _vdir.z = 0.f; _vp += _vdir * 200.f; _vp.z -= 80.f; } */ m_Pos = _vp; m_Dir = _vdir; } m_isCheck = true; } DWORD dwDiff = nTime - m_nStartTime; // float fSec = (float)dwDiff/1000.0f; // float fOpacity = (SC_LIFETIME-dwDiff)/(float)SC_LIFETIME; rvector Dir; rvector Up=m_Up; if (m_nAlignType == 0) { Dir = -RCameraDirection; } else if( m_nAlignType == 1 ) { Dir = m_DirOrg; } else if( m_nAlignType == 2 ) { Dir = rvector( 0,1,0 ); Up = rvector( 0,0,1 ); } CheckCross(Dir,Up); rmatrix World; MakeWorldMatrix(&World, m_Pos, Dir, Up); rmatrix Rotation; D3DXMatrixRotationZ(&Rotation,m_fRotateAngleZ); World = Rotation * World; D3DXMatrixRotationY(&Rotation,m_fRotateAngleY); World = Rotation * World; m_VMesh.SetScale(m_Scale); m_VMesh.SetWorldMatrix(World); m_VMesh.Frame(); // 시간은 흘러 가야 한다~ if(m_bRender) { m_VMesh.Render(); m_bisRendered = m_VMesh.m_bIsRender; } else m_bisRendered = false; if( m_nAutoAddEffect != ZEffectAutoAddType_None ) { rvector vPos; RMeshNode* pNode = NULL; if(m_nAutoAddEffect == ZEffectAutoAddType_Methor ) { pNode = m_VMesh.m_pMesh->GetMeshData("methor"); vPos.x = pNode->m_mat_result._41; vPos.y = pNode->m_mat_result._42; vPos.z = pNode->m_mat_result._43; // static rmatrix _mrot = RGetRotY(180) * RGetRotX(90); static rmatrix _mrot = RGetRotX(90); vPos = vPos * _mrot; vPos += m_Pos; if(m_vBackupPos != vPos) { ZGetEffectManager()->AddTrackMethor(vPos); m_vBackupPos = vPos; } } } if( m_nLifeTime != -1 && m_bLoopType ) {// 소멸 시간이 정해져 있고..에니메이션이 루프 타잎인 경우.. if(m_VMesh.isOncePlayDone()) if(nTime > m_nStartTime + m_nLifeTime) { return false; } } else { if(m_VMesh.isOncePlayDone()) { return false; } } return true; }
void ZInterfaceBackground::OnUpdate(float fElapsed) { ZGetEffectManager()->Update( fElapsed); ZGetScreenEffectManager()->UpdateEffects(); }
void ZActor::UpdateHeight(float fDelta) { if (GetDistToFloor() > 10.f || GetVelocity().z > 0.1f) { SetFlag(AF_LAND, false); }else { if(!CheckFlag(AF_LAND)) { SetFlag(AF_LAND, true); m_Animation.Input(ZA_EVENT_REACH_GROUND); } } if(!CheckFlag(AF_LAND)) m_pModule_Movable->UpdateGravity(fDelta); bool bJumpUp=(GetVelocity().z>0.0f); bool bJumpDown = false; if(m_pModule_Movable->isLanding()) { SetFlag(AF_LAND, true); m_Animation.Input(ZA_EVENT_REACH_GROUND); SetVelocity(0,0,0); if(m_Position.z + 100.f < m_pModule_Movable->GetFallHeight()) { float fSpeed=fabs(GetVelocity().z); RBspObject* r_map = ZGetGame()->GetWorld()->GetBsp(); rvector vPos = m_Position; rvector vDir = rvector(0.f,0.f,-1.f); vPos.z += 50.f; RBSPPICKINFO pInfo; if(r_map->Pick(vPos,vDir,&pInfo)) { vPos = pInfo.PickPos; vDir.x = pInfo.pInfo->plane.a; vDir.y = pInfo.pInfo->plane.b; vDir.z = pInfo.pInfo->plane.c; ZGetEffectManager()->AddLandingEffect(vPos,vDir); } } } rvector diff=fDelta*GetVelocity(); bool bUp = (diff.z>0.01f); bool bDownward= (diff.z<0.01f); if(GetDistToFloor()<0 || (bDownward && m_pModule_Movable->GetLastMove().z>=0)) { if(GetVelocity().z<1.f && GetDistToFloor()<1.f) { if(GetVelocity().z<0) SetVelocity(GetVelocity().x,GetVelocity().y,0); } } if(GetDistToFloor()<0 && !IsDie()) { float fAdjust=400.f*fDelta; rvector diff=rvector(0,0,min(-GetDistToFloor(),fAdjust)); Move(diff); } }
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 ZGameInput::OnDebugEvent(MEvent* pEvent) { #ifdef _PUBLISH return false; #endif static bool bMusicMute = false; switch(pEvent->nMessage){ case MWM_KEYDOWN: { switch (pEvent->nKey) { case VK_END: { ZGetGameInterface()->m_bTeenVersion = !ZGetGameInterface()->m_bTeenVersion; } return true; case VK_INSERT: { g_debug_render_mode++; if(g_debug_render_mode > 3) g_debug_render_mode = 0; } return true; case VK_DELETE: { g_bVertex_Soft = !g_bVertex_Soft; } return true; //--------------------------------------------------------------------------------------------------- // VK_F1 부터 VK_F8 까지는 새로운 키맵핑을 위해, Ctrl을 눌렀을 때 동작하도록 수정! // Added By 홍기주 case VK_F1: { if( pEvent->bCtrl ) { ZGetGame()->m_pMyCharacter->SetVisible( !ZGetGame()->m_pMyCharacter->IsVisible() ); } return false; } case VK_F2: { if( pEvent->bCtrl ) { ZGetGameInterface()->ShowInterface( !ZGetGameInterface()->IsShowInterface() ); } return false; } case VK_F3: { if( pEvent->bCtrl ) { if (ZIsLaunchDevelop()) { ZApplication::GetGameInterface()->GetScreenDebugger()->SwitchDebugInfo(); return true; } } return false; } case VK_F4: { if( pEvent->bCtrl ) { ZGetGame()->m_bShowWireframe=!ZGetGame()->m_bShowWireframe; return true; } return false; } case VK_F5: { if( pEvent->bCtrl ) { m_bCTOff = !m_bCTOff; RMesh::SetTextureRenderOnOff(m_bCTOff); return true; } return false; } case VK_F6: { if( pEvent->bCtrl ) { g_debug_rot =!g_debug_rot; return true; } return false; } case VK_F7: { if( pEvent->bCtrl ) { // 프로파일링 시작/끝 extern bool g_bProfile; if(g_bProfile) { ZPOSTCMD0(ZC_END_PROFILE); ZChatOutput("Profile saved."); } else { ZPOSTCMD0(ZC_BEGIN_PROFILE); ZChatOutput("Profile started."); } return true; } return false; } case VK_F8: { if( pEvent->bCtrl ) { RSolidBspNode::m_bTracePath = !RSolidBspNode::m_bTracePath; } return false; } case VK_F9: { static int nIndex = 0; nIndex++; if (nIndex >= 2) nIndex = 0; if (nIndex == 0) { ZGetGameInterface()->m_bViewUI = true; ZGetGameInterface()->GetGame()->m_pMyCharacter->SetVisible(true); } else if (nIndex == 1) { ZGetGameInterface()->m_bViewUI = false; ZGetGame()->m_pMyCharacter->SetVisible(false); ZGetGameInterface()->GetCombatInterface()->ShowCrossHair(false); } } return false; case 'U': { ZC_ENCHANT zctype; // int Module = 20; if(ZGetGame() && ZGetGame()->m_pMyCharacter ) { zctype = ZGetGame()->m_pMyCharacter->GetEnchantType(); // if(zctype==ZC_ENCHANT_FIRE) Module = ZMID_FIREDAMAGE; // else if(zctype==ZC_ENCHANT_COLD) Module = ZMID_COLDDAMAGE; // else if(zctype==ZC_ENCHANT_LIGHTNING) Module = ZMID_LIGHTNINGDAMAGE; // else if(zctype==ZC_ENCHANT_POISON) Module = ZMID_POISONDAMAGE; if(zctype==ZC_ENCHANT_FIRE) { ZModule_FireDamage *pModule = (ZModule_FireDamage*)ZGetGame()->m_pMyCharacter->GetModule(ZMID_FIREDAMAGE); pModule->BeginDamage(ZGetGame()->m_pMyCharacter,5,10); } else if(zctype==ZC_ENCHANT_COLD) { ZModule_ColdDamage *pModule = (ZModule_ColdDamage*)ZGetGame()->m_pMyCharacter->GetModule(ZMID_COLDDAMAGE); pModule->BeginDamage(10,50); } else if(zctype==ZC_ENCHANT_LIGHTNING) { ZModule_LightningDamage *pModule = (ZModule_LightningDamage*)ZGetGame()->m_pMyCharacter->GetModule(ZMID_LIGHTNINGDAMAGE); pModule->BeginDamage(ZGetGame()->m_pMyCharacter,5,10); } else if(zctype==ZC_ENCHANT_POISON) { ZModule_PoisonDamage *pModule = (ZModule_PoisonDamage*)ZGetGame()->m_pMyCharacter->GetModule(ZMID_POISONDAMAGE); pModule->BeginDamage(ZGetGame()->m_pMyCharacter,5,10); } } //g_pGame->m_pMyCharacter->ShotBlocked(); // ZApplication::GetSoundEngine()->StopMusic(); //ZApplication::GetSoundEngine()->load_preset(); }break; case 'M': { if (ZApplication::GetInstance()->GetLaunchMode()==ZApplication::ZLAUNCH_MODE_STANDALONE_GAME) { // 혼자테스트할때 되살아나기 if (ZGetGame()->GetMatch()->IsTeamPlay()) { ZCharacter* pCharacter = ZGetGame()->m_pMyCharacter; pCharacter->InitStatus(); rvector pos=rvector(0,0,0), dir=rvector(0,1,0); static int nTeamIndex = 0; static int nSpawnIndex = 0; ZMapSpawnData* pSpawnData = ZGetGame()->GetMapDesc()->GetSpawnManager()->GetTeamData(nTeamIndex, nSpawnIndex); if (pSpawnData != NULL) { pos = pSpawnData->m_Pos; dir = pSpawnData->m_Dir; } pCharacter->SetPosition(pos); pCharacter->SetDirection(dir); nSpawnIndex++; if (nSpawnIndex >= 16) { nSpawnIndex = 0; nTeamIndex++; if (nTeamIndex >= 2) nTeamIndex=0; } } else { if(ZGetGame()->m_CharacterManager.size()==1) ZGetGameInterface()->RespawnMyCharacter(); } } }break; case 'C' : { // ZModule_Skills *pmod = (ZModule_Skills *)g_pGame->m_pMyCharacter->GetModule(ZMID_SKILLS); // pmod->Excute(0,MUID(0,0),rvector(0,0,0)); // g_pGame->UpdateCombo(true); }break; #ifdef _DEBUG case 'G' : { // MNewMemories::Dump(); // g_pGame->m_pMyCharacter->m_bGuardTest=!g_pGame->m_pMyCharacter->m_bGuardTest; }break; #endif // 테스트용.. case 'I' : ZGetGame()->m_pMyCharacter->AddIcon(rand()%5); return true; // 테스트^^ case 'F' : DumpFontTexture(); return true; // case 'F' : // { // static bool toggle = false; // if(toggle) // ZGetInput()->SetDeviceForcesXY(1,1); // else // ZGetInput()->SetDeviceForcesXY(0,0); // toggle=!toggle; // return true; // } case 'L' : { // rvector pos = g_pGame->m_pMyCharacter->GetPosition(); // pos.x += 1000.0f; // ZApplication::GetSoundEngine()->PlayNPCSound(NPC_GOBLIN, NPC_SOUND_WOUND, pos, true); ZApplication::GetGameInterface()->FinishGame(); // ZGetScreenEffectManager()->AddScreenEffect("teamredwin"); /* g_pGame->m_pMyCharacter->m_Position = rvector( 2712.99805 , -1691.46191 , 2649.13403 ); g_pGame->m_pMyCharacter->Move(rvector( 2.561 , -7.040 , -6.471 )); */ /* g_pGame->m_pMyCharacter->m_Position = rvector( 2713.05347 , -1691.56250 , 2929.06738 ); g_pGame->m_pMyCharacter->Move(rvector( 0.00000000 , 0.00000000 , -2.07031250 )); */ /* g_pGame->m_pMyCharacter->m_Position = rvector( 1648.73877 ,8691.30176 ,1501.03381 -120); g_pGame->m_pMyCharacter->Move(rvector( -0.134,0.004, -0.986 )); g_pGame->m_pMyCharacter->m_Velocity = rvector( -450,0,0); ZPostLocalMessage(MSG_HACKING_DETECTED); ZGetEffectManager()->AddShotgunEffect(rvector(0,0,100),rvector(0,0,100),rvector(0,1,0),g_pGame->m_pMyCharacter); */ }break; case 'K': { // rvector pos = g_pGame->m_pMyCharacter->GetPosition(); // pos.x += 1000.0f; // ZApplication::GetSoundEngine()->PlayNPCSound(NPC_GOBLIN, NPC_SOUND_WOUND, pos, false); // ZGetGameInterface()->GetCamera()->Shock(2000.f, .5f, rvector(0.0f, 0.0f, -1.0f)); ZGetScreenEffectManager()->ShockBossGauge(35.0f); static int n = 0; n++; ZGetScreenEffectManager()->AddKO(n); // g_pGame->m_pMyCharacter->OnBlast(rvector(1,0,0)); // ZGetGameInterface()->GetCamera()->Shock(500.f, .5f, rvector(0.0f, 0.0f, -1.0f)); }break; case 'B': { // test ZCombatInterface* pCombatInterface = ZGetGameInterface()->GetCombatInterface(); pCombatInterface->SetObserverMode(!pCombatInterface->GetObserver()->IsVisible()); } return true; case 'N': { ZCombatInterface* pCombatInterface = ZGetGameInterface()->GetCombatInterface(); if(pCombatInterface->GetObserverMode()) pCombatInterface->GetObserver()->ChangeToNextTarget(); } return true; case 'P': { // test // g_pGame->m_pMyCharacter->OnKnockback(rvector(1.0f, 0.0f, 0.0f),200.f); ZGetEffectManager()->AddMethorEffect(rvector(0,0,0) , 1 ); } return true; case 'O': { if (ZApplication::GetInstance()->GetLaunchMode()==ZApplication::ZLAUNCH_MODE_STANDALONE_AI) { ZGetObjectManager()->ClearNPC(); // npc 생성 test MUID uidNPC = MUID(0,0); uidNPC.High = rand() % RAND_MAX; uidNPC.Low = rand() % RAND_MAX; int nNPCType = rand() % NPC_GOBLIN_KING+1; nNPCType = NPC_GOBLIN_GUNNER; rvector ranpos = rvector(0, 0, 0); MQuestNPCInfo* pNPCInfo = NULL; if(ZGetQuest()) pNPCInfo = ZGetQuest()->GetNPCInfo(MQUEST_NPC(nNPCType)); ZActor* pNewActor = ZActor::CreateActor(MQUEST_NPC(nNPCType), 1.0f, 0); if (pNewActor) { pNewActor->SetUID(uidNPC); pNewActor->SetPosition(ranpos); pNewActor->SetMyControl(true); if(pNewActor->m_pVMesh && pNPCInfo) { 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(ranpos); } } } return true; /* case VK_HOME: if(ZGetGameInterface()->GetGame()) { RFrameTime* ft = &ZGetGameInterface()->GetGame()->m_pMyCharacter->m_pVMesh->m_FrameTime; if( ft->m_bActive ) { ft->Stop(); } else { ft->Start(20,300); } } return true; */ // 앞으로는 NUMPAD는 매크로로 사용될 것이다. 하하! // 그러므로, NUMPAD1~NUMPAD9는 Return false로 수정! case VK_NUMPAD0: ZGetGameInterface()->TestToggleCharacter();return true; case VK_NUMPAD1: ZGetGameInterface()->TestChangeParts(0); return false; case VK_NUMPAD2: ZGetGameInterface()->TestChangeParts(1); return false; case VK_NUMPAD3: ZGetGameInterface()->TestChangeParts(2); return false; case VK_NUMPAD4: ZGetGameInterface()->TestChangeParts(3); return false; case VK_NUMPAD5: ZGetGameInterface()->TestChangeParts(4); return false; case VK_NUMPAD6: ZGetGameInterface()->TestChangeParts(5); return false; case VK_NUMPAD7: ZGetGameInterface()->TestChangeWeapon(); return false; case VK_NUMPAD9: bMusicMute = !bMusicMute; ZGetSoundEngine()->SetMusicMute(bMusicMute); return false; /* 이게 뭐꼬 ? -_- case VK_OEM_3: // ` { ZGetGameInterface()->SetCursorEnable( !ZGetGameInterface()->IsCursorEnable()); } return true; */ #ifdef USING_VERTEX_SHADER case 'V': { //RShaderMgr::shader_enabled = !RShaderMgr::shader_enabled; RShaderMgr::mbUsingShader = !RShaderMgr::mbUsingShader; } return false; #endif } } break; } // switch return false; }