#include "SunClientPrecompiledHeader.h" #include "statebase.h" #include "SkillState.h" #include "SkillStateDashStun.h" #include "Hero.h" #include "Character.h" #include "Clone.h" #include "CloneManager.h" #include "GlobalFunc.h" #include "Camera.h" #include "SkillEffectFunc.h" SkillStateDashStun::SkillStateDashStun() : m_bStartMove( FALSE ) , m_dwCloneKey( 0 ) , m_dwCrushTime( 0 ) { } STATECHANGE::TYPE SkillStateDashStun::OnStart(Object* pOwner, DWORD CurTime) { Character* pCharacter = (Character*)pOwner; WzVector StartPosition = pCharacter->GetVisiblePos(); WzVector TargetPosition; if( Character* pTarget = (Character *)pCharacter->GetTargetObject() ) { TargetPosition = pTarget->GetPosition(); } else { TargetPosition = StartPosition; } { pCharacter->SetDirection( TargetPosition ); WzVector vDistance = TargetPosition - StartPosition; float fDistance = VectorLength(&vDistance); if( fDistance < 1.3f ) { TargetPosition = StartPosition; } else { WzVector Direction; VectorNormalize(&Direction,&vDistance); TargetPosition = TargetPosition + (Direction * -1.2f); } // StartSkillMove pCharacter->Move( StartPosition, TargetPosition, CMS_RUN, TRUE, -1, -1 ); } return StateSkill::OnStart( pOwner, CurTime ); } STATEPROCESS::TYPE SkillStateDashStun::OnProcess(Object* pOwner, DWORD CurTime,DWORD dwTick) { EnterProcess(pOwner,CurTime,dwTick); Character* pCharacter = (Character*)pOwner; // À̺¥Æ®Ã¼Å© CheckEvent(); if ( CheckNotProcessedHitEvent(1) == TRUE ) { m_bStartMove = TRUE; m_dwCrushTime = 0; ++m_iHitProcessed; // ÀÜ»ó¿ë Ŭ·Ð »ý¼º m_dwCloneKey = g_CloneManager.CreateClone(pCharacter); if( Clone *pClone = g_CloneManager.GetClone(m_dwCloneKey) ) { pClone->SetPlayAni(FALSE); pClone->SetAlphaBlend(AB_ALPHA); pClone->SetAnimation( pCharacter->GetCurrentAnimation() ); pClone->SetColor(WzColor_RGBA(255,255,255,100)); pClone->SetLifeTime( 2000 ); // pClone->SetAppear( 1000 ); } } if( m_bStartMove == TRUE ) { // ¹«ÁöÇÏ°Ô »¡¸® Áö³ª°¡¸é¼­ #ifdef _NA_008472_20150903_IMPROVED_BALANCE const float SPEED_PER_SECOND = 70.0f * SPEED_MULTIPLIER; #else const float SPEED_PER_SECOND = 20.0f * SPEED_MULTIPLIER; #endif // _NA_008472_20150903_IMPROVED_BALANCE ProcessMove( pCharacter, SPEED_PER_SECOND, dwTick); } if( m_bStartMove == TRUE ) { if( m_dwCloneKey != 0 ) { // Ŭ·ÐÀÌ ÀÖÀ¸¸é À§Ä¡¿Í ¾Ö´Ï¸ÞÀÌ¼Ç ÇÁ·¹ÀÓÀ» Á÷Á¢ ¸ÂÃçÁØ´Ù. if( Clone *pClone = g_CloneManager.GetClone(m_dwCloneKey) ) { WzVector wvPos = pCharacter->GetPosition() - (pCharacter->GetDirection() * 0.3f); pClone->SetPosition( wvPos ); pClone->SetCurrentFrame( pCharacter->GetCurrentFrame() ); } } // ´ë»óÀÇ À§Ä¡¿¡ µµÂø if( FALSE == pCharacter->GetPathExplorer()->IsMoving() ) { if( m_dwCrushTime == 0 ) { // ÃÖÃÊ Ãæµ¹½Ã È÷Æ® ÀÌÆåÆ® _AddHitEffect(pCharacter); // µ¥¹ÌÁö Ç¥½Ã pCharacter->ProcessAttackResult_Group( pCharacter->GetCurrentAttackSerial() ); if( pCharacter == g_pHero ) { // Ä«¸Þ¶ó¸¦ »ì¦ Èçµé¾î ÁØ´Ù g_Camera.SetVibeType(Camera::VIBE_TYPE_VERTICAL); g_Camera.StartVibration(100,0.2f); } m_dwCrushTime = CurTime; } // Ãæµ¹ ÈÄ 0.15ÃÊ µ¿¾È Áö³­ ÈÄ¿¡ if( m_dwCrushTime + 150 < CurTime ) { if( m_dwCloneKey != 0 ) { g_CloneManager.Delete( m_dwCloneKey ); m_dwCloneKey = 0; } // »óŸ¦ Á¾·áÇÑ´Ù. if (pCharacter->ProcessNextAction()) { return STATEPROCESS::SUSPEND; } else { return STATEPROCESS::END; } return STATEPROCESS::END; } } } return LeaveProcess(pOwner,CurTime,dwTick); } void SkillStateDashStun::_AddHitEffect( Character* pCharacter ) { // Ÿ°Ý ÀÌÆåÆ® if( Object* pObject = pCharacter->GetTargetObject() ) { if( pObject->IsKindOfObject(CHARACTER_OBJECT) ) { Character* pTarget = (Character*)pObject; HANDLE hHandle = GlobalFunc::CreateEffectBeUpToOption( StrToWzID("K956"), pCharacter->GetPosition(), pCharacter->GetScale(), pCharacter->GetObjectKey(), pCharacter->GetTargetID() ); if( hHandle != INVALID_HANDLE_VALUE ) { if( CEffectBody* pBody = g_pEffectManager->GetEffectPtrHandle(hHandle) ) { WzVector vRot; vRot.y = 0.0f; vRot.z = pCharacter->GetAngle(); vRot.x = pCharacter->GetAngleX(); WzVector vScale; vScale.x = 1.0f; vScale.y = 1.0f; vScale.z = 1.0f; pBody->SetResultMatrix( pCharacter->GetVisiblePos(), vRot, vScale); } } } } }