예제 #1
0
void CActorInstance::OnShootDamage()
{
	if (IsStun())
	{
		Die();
	}
	else
	{
		__Shake(100);

		if (!isLock() && !__IsKnockDownMotion() && !__IsStandUpMotion())
		{
			if (InterceptOnceMotion(CRaceMotionData::NAME_DAMAGE))
				PushLoopMotion(CRaceMotionData::NAME_WAIT);
		}
	}
}
예제 #2
0
DWORD CActorInstance::__SetMotion(const SSetMotionData& c_rkSetMotData, DWORD dwRandMotKey)
{
	DWORD dwMotKey = dwRandMotKey;

	if (dwMotKey == 0)
		dwMotKey = GetRandomMotionKey(c_rkSetMotData.dwMotKey);

	UINT uNextMot = GET_MOTION_INDEX(c_rkSetMotData.dwMotKey);

	if (IsDead())
	{
		if (uNextMot!=CRaceMotionData::NAME_DAMAGE_FLYING && uNextMot!=CRaceMotionData::NAME_DAMAGE_FLYING_BACK && uNextMot!=CRaceMotionData::NAME_DEAD && uNextMot!=CRaceMotionData::NAME_DEAD_BACK)
			return 0;
	}
	if (IsUsingSkill())
	{
		__OnStop();
	}

	if (__IsStandUpMotion())
	{
		__OnStop();
	}


	if (__IsMoveMotion())
	{
		if (uNextMot==CRaceMotionData::NAME_DAMAGE || uNextMot==CRaceMotionData::NAME_DAMAGE_BACK || uNextMot==CRaceMotionData::NAME_DAMAGE_FLYING || uNextMot==CRaceMotionData::NAME_DAMAGE_FLYING_BACK)
		{
			if (!m_isMain)
			{
				Logn(0, "주인공이 아니라면 이동중이라 데미지 동작을 취하지 않음");
				return false;
			}
		}

		if (uNextMot!=CRaceMotionData::NAME_RUN &&
			uNextMot!=CRaceMotionData::NAME_WALK &&
			!__IsMovingSkill(c_rkSetMotData.uSkill))
		{
			__OnStop();
		}
	}
	else
	{
		if (uNextMot==CRaceMotionData::NAME_RUN || __IsMovingSkill(c_rkSetMotData.uSkill))
		{
			__OnMove();
		}
	}


	// NOTE : 스킬 사용중 사라지는 문제를 위한 안전 장치 - [levites]
	if (__IsHiding())
	{
		__ShowEvent();
	}


	if (-1 != m_iFishingEffectID)
	{
		CEffectManager& rkEftMgr=CEffectManager::Instance();
 		rkEftMgr.DeactiveEffectInstance(m_iFishingEffectID);

		m_iFishingEffectID = -1;
	}

	if (m_pkHorse)
	{
		WORD wMotionIndex = GET_MOTION_INDEX(dwMotKey);
		WORD wMotionSubIndex = GET_MOTION_SUB_INDEX(dwMotKey);
		DWORD dwChildMotKey = MAKE_RANDOM_MOTION_KEY(m_pkHorse->m_wcurMotionMode, wMotionIndex, wMotionSubIndex);

		if (CRaceMotionData::NAME_DEAD == wMotionIndex)
			CGraphicThingInstance::ChangeMotion(dwMotKey, c_rkSetMotData.iLoopCount, c_rkSetMotData.fSpeedRatio);
		else
			CGraphicThingInstance::SetMotion(dwMotKey, c_rkSetMotData.fBlendTime, c_rkSetMotData.iLoopCount, c_rkSetMotData.fSpeedRatio);

		m_pkHorse->SetMotion(dwChildMotKey, c_rkSetMotData.fBlendTime, c_rkSetMotData.iLoopCount, c_rkSetMotData.fSpeedRatio);
		m_pkHorse->__BindMotionData(dwChildMotKey);

		if (c_rkSetMotData.iLoopCount)
			m_pkHorse->m_kCurMotNode.iMotionType = MOTION_TYPE_ONCE; // 무조건 이전 모션 타입으로 설정되고 있었음
		else
			m_pkHorse->m_kCurMotNode.iMotionType = MOTION_TYPE_LOOP;

		m_pkHorse->m_kCurMotNode.dwFrameCount	= m_pkHorse->GetMotionDuration(dwChildMotKey) / (1.0f / g_fGameFPS);
		m_pkHorse->m_kCurMotNode.dwcurFrame		= 0;
		m_pkHorse->m_kCurMotNode.dwMotionKey	= dwChildMotKey;
	}
	else
	{
		CGraphicThingInstance::SetMotion(dwMotKey, c_rkSetMotData.fBlendTime, c_rkSetMotData.iLoopCount, c_rkSetMotData.fSpeedRatio);
	}
	
	__HideWeaponTrace();

	if (__BindMotionData(dwMotKey))
	{
		int iLoopCount = __GetLoopCount();
		SetMotionLoopCount(iLoopCount);

		if (__CanAttack())
		{
			// 여기서 공격 모션일 경우의 처리를 합니다 - [levites]
			__ShowWeaponTrace();

			m_HitDataMap.clear();
			//PreAttack();
		}

		if (__IsComboAttacking())
		{
			if (!__CanNextComboAttack())
			{
				// 2004.11.19.myevan.동물 변신시 이부분에서 바로 리셋되어 다음동작 안나온다
				m_dwcurComboIndex = 0; // 콤보 리셋 - [levites]

				// NOTE : ClearCombo() 를 수행해서는 안된다.
				//        콤보 다음에 스킬을 이어서 사용할 경우 m_pkCurRaceMotionData까지 초기화 되어 버린다.
				//Tracef("MotionData에 콤보 데이타가 들어 있지 않습니다.\n");
			}
		}
	}

	return dwMotKey;
}