Exemplo n.º 1
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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);
}
Exemplo n.º 6
0
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);
}
Exemplo n.º 8
0
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;
}
Exemplo n.º 9
0
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);
}