void CActorInstance::OnShootDamage() { if (IsStun()) { Die(); } else { __Shake(100); if (!isLock() && !__IsKnockDownMotion() && !__IsStandUpMotion()) { if (InterceptOnceMotion(CRaceMotionData::NAME_DAMAGE)) PushLoopMotion(CRaceMotionData::NAME_WAIT); } } }
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; }