void ZWeaponMgr::DeleteWeaponHasTarget( const MUID& uidTargetChar ) { if(m_list.empty()) return; z_weapon_node node; ZWeapon* pWeapon; ZWeaponMagic* pWeaponMagic; for(node = m_list.begin(); node != m_list.end(); ) { pWeapon = (*node); // 타겟을 가질 수 있는 탄은 현재 마법탄 뿐이다 if (MIsExactlyClass(ZWeaponMagic, pWeapon)) { pWeaponMagic = MDynamicCast(ZWeaponMagic, pWeapon ); if (pWeaponMagic) { if (pWeaponMagic->GetTarget() == uidTargetChar) { delete pWeaponMagic; node=m_list.erase(node); continue; } } } ++node; } }
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; }
ZMovingWeapon* ZWeaponMgr::UpdateWorldItem(int nItemID,rvector& pos) { z_weapon_node node; ZWeapon* pWeapon; ZMovingWeapon* pMWeapon = NULL; ZMovingWeapon* pMWeaponResult = NULL; float _min_weapon = 9999.f; for(node = m_list.begin(); node != m_list.end(); ) { pWeapon = (*node); pMWeapon = MDynamicCast( ZMovingWeapon, pWeapon ); if(pMWeapon) { // pMWeapon->GetItemUID 값이 -1이면 생성만 됐고 아직 서버에서 할당된 값(UID)이 세팅이 안됐기때문에 // 세팅이 안된것들 중에서 가장 가까운 아이템을 찾아 나의것으로 세팅해준다 // 랜덤값을 생성해 서버에 유저ID를 함께보내고 다시 서버로 그값을 받아 매치되는걸 // 월드 아이템으로 세팅해줘야 하지만.......20090218 by kammir if(pMWeapon->GetItemUID() == -1) // if(pMWeapon->m_nWorldItemID == nItemID) { /* if( SamePoint(pMWeapon->m_Position,pos) ) { return pMWeapon; } // 가장 가까운 아이템이 자신의것..나중에 서버 패치시.. ID 등을 줘서 식별.. */ float fLen = Magnitude(pMWeapon->m_Position - pos); if(fLen < 100.f) { if(_min_weapon > fLen) { _min_weapon = fLen; pMWeaponResult = pMWeapon; } } } } ++node; } return pMWeaponResult; }
bool ZEffectBerserkerIconLoop::Draw(unsigned long int nTime) { ZObject* pObj = ZGetObjectManager()->GetObject(m_uid); ZCharacter* pChar = MDynamicCast(ZCharacter, pObj); if( pChar ) { if(!pChar->IsTagger()) return false; if(!pChar->IsRendered()) return true; if( pChar->m_pVMesh ) { m_Pos = pObj->m_pVMesh->GetBipTypePosition(m_type); m_DirOrg = -pChar->m_Direction; ZEffectAniMesh::Draw(nTime); return true; } } return false; }
bool ZEffectShot::Draw(unsigned long int nTime) { if( m_isMovingPos ) { ZObject* pObj = ZGetObjectManager()->GetObject(m_uid); if(pObj) { // if( MIsDerivedFromClass(ZCharacterObject, pObj )==false) return false; // ZCharacterObject* pCObj = (ZCharacterObject*)pObj; ZCharacterObject* pCObj = MDynamicCast(ZCharacterObject, pObj); if(!pCObj) return false; if(!pCObj->IsRendered()) return false; rvector pos; if(m_isLeftWeapon) { if(pCObj->GetWeaponTypePos(weapon_dummy_muzzle_flash,&pos,true) ) { m_Pos = pos; m_Dir = pCObj->m_Direction; Normalize(m_Dir); } } else { if(pCObj->GetWeaponTypePos(weapon_dummy_muzzle_flash,&pos) ) { m_Pos = pos; m_Dir = pCObj->m_Direction; Normalize(m_Dir); } } } } return ZEffectAniMesh::Draw(nTime); }
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 ZCharacterObject::DrawShadow() { __BP(28, "ZCharacter::Draw::Shadow"); if(!m_pshadow) return; //RGetDevice()->SetRenderState( D3DRS_LIGHTING, FALSE ); if(!IsDie()) { float fSize = 100.f;//񃧯.. ZActor* pActor = MDynamicCast(ZActor,this); if(pActor) { fSize = pActor->GetNPCInfo()->fCollRadius * 3.0f; } if(m_pshadow->setMatrix( *this ,fSize )) m_pshadow->draw(); } __EP(28); }
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 ZActor::OnDamaged(ZObject* pAttacker, rvector srcPos, ZDAMAGETYPE damageType, MMatchWeaponType weaponType, float fDamage, float fPiercingRatio, int nMeleeType) { if (!CheckFlag(AF_SOUND_WOUNDED)) { bool bMyKill = false; if (pAttacker) { bMyKill = (pAttacker == g_pGame->m_pMyCharacter); } rvector pos_sound = GetPosition(); pos_sound.z += m_Collision.fHeight - 10.0f; ZApplication::GetSoundEngine()->PlayNPCSound(m_pNPCInfo->nID, NPC_SOUND_WOUND, pos_sound, bMyKill); SetFlag(AF_SOUND_WOUNDED, true); } if ((m_pNPCInfo->nGrade == NPC_GRADE_BOSS) || (m_pNPCInfo->nGrade == NPC_GRADE_LEGENDARY)) { if (ZGetQuest()->GetGameInfo()->GetBoss() == GetUID()) { ZGetScreenEffectManager()->ShockBossGauge(fDamage); } } if ((damageType == ZD_BULLET) || (damageType == ZD_BULLET_HEADSHOT)) { m_nDamageCount++; } if(CheckFlag(AF_MY_CONTROL)) { bool bSkipDamagedAnimation = false; if(m_pNPCInfo->bNeverAttackCancel ) { bSkipDamagedAnimation = ZActorAnimation::IsSkippableDamagedAnimation(GetCurrAni()); } if(bSkipDamagedAnimation==false) { if((damageType==ZD_MELEE) || (damageType==ZD_KATANA_SPLASH)) { ZCharacterObject* pCObj = MDynamicCast(ZCharacterObject, pAttacker); bool bLightningDamage = false; if(pCObj) { ZC_ENCHANT etype = pCObj->GetEnchantType(); if( etype == ZC_ENCHANT_LIGHTNING ) bLightningDamage = true; } if(bLightningDamage && (damageType==ZD_KATANA_SPLASH)) { m_Animation.Input(ZA_EVENT_LIGHTNING_DAMAGED); } else { if(nMeleeType%2) m_Animation.Input(ZA_EVENT_MELEE_DAMAGED1); else m_Animation.Input(ZA_EVENT_MELEE_DAMAGED2); } SetVelocity(0,0,0); } else { if( GetNPCInfo()->bNeverPushed == false) { if (m_nDamageCount >= 5) { m_Animation.Input(ZA_EVENT_RANGE_DAMAGED); m_nDamageCount = 0; } } } } } ZObject::OnDamaged(pAttacker,srcPos,damageType,weaponType,fDamage,fPiercingRatio,nMeleeType); }