#include "stdafx.h" #include #include #include #include "Ability.h" #include "FearStatus.h" #include "AIParamParser.h" #include "StatusManager.h" #include "MoveStateControl.h" VOID FearStatus::Start() { m_UpdateTick.SetTimer(0, true, false); // ¹Ù·Î È£Ãâ const Character* const attacker = GetAttacker(); if (attacker == NULL) { return; } Character* const owner = GetOwner(); if (owner == NULL) { return; } // µµ¸Á°¡´Â »óÅ·Π¸¸µç´Ù. DWORD attacker_object_key = attacker->GetObjectKey(); #ifdef _NA_007667_20141001_WITCHBLADE_SKILL if (attacker->IsEqualObjectKind(SUMMON_OBJECT) == true) { attacker_object_key = attacker->GetSummonerKey(); } #endif //_NA_007667_20141001_WITCHBLADE_SKILL AI_MSG_RUNAWAY ai_msg; ai_msg.dwTargetKey = attacker_object_key; ai_msg.dwRunAwayTime = GetApplicationTime(); ai_msg.wStateID = GetStateID(); #ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE ai_msg.abilityID = GetAbilityID(); #endif // _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE owner->SendAIMessage(&ai_msg, sizeof(ai_msg)); if (owner->IsEqualObjectKind(PLAYER_OBJECT)) { m_bTouchedSomething = FALSE; m_vTargetPos = *attacker->GetPosPtr(); } // Player & Monster Common StatusManager* const status_manager = owner->GetStatusManager(); (status_manager->AnimationDelay).SetAnimationDelay(this, GetApplicationTime()); } VOID FearStatus::End() { m_UpdateTick.Stop(); Character* const owner = GetOwner(); if (owner != NULL) { owner->StopMoving(); //´Ù¸¥ Ç÷¹À̾îµé¿¡°Ô ºê·Îµå ij½ºÆÃ(Àڽŵµ Æ÷ÇÔ) MSGSUB_SYNC_STOP_BRD msg; msg.m_dwObjectKey = owner->GetObjectKey(); msg.m_wvCurPos = *owner->GetPosPtr(); owner->SendPacketAroundForSync( &msg ); } AbilityStatus::End(); } BOOL FearStatus::Update( DWORD curTime ) { if( m_UpdateTick.IsExpired() ) { m_UpdateTick.SetTimer(UPDATE_INTERVAL, true, false); // delayed update Character* const owner = GetOwner(); if (owner != NULL) { if (owner->IsEqualObjectKind(PLAYER_OBJECT)) { #ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE // ¸ÅȤÀº Ÿ°ÙÀ» µû¶ó°¡¾ß ÇϹǷΠÀ̵¿Áß¿¡ ´Ù½Ã RunAway¸¦ È£ÃâÇÑ´Ù if (!owner->IsMoving() || (GetAbilityID() == eABILITY_CHARMED)) #else // _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE if (!owner->IsMoving()) #endif // _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE { RunAway(); } } } } return AbilityStatus::Update( curTime ); } VOID FearStatus::RunAway() { Character* const owner = GetOwner(); if (owner == NULL) { return; } StatusManager* const pStatusManager = owner->GetStatusManager(); // (WAVERIX)(080610)(NOTE) // - Çö ½ÃÁ¡ FindPath¸¦ È£ÃâÇÏ´Â ÇØ´ç ÇÔ¼ö¿¡¼­ ó¸®ÇÏ´Â °ÍÀº ÁÂÇ¥µî¿¡ °ü·ÃµÈ °Í¸¸ À־ »ó´Ü¿¡¼­ ½ºÅµ½ÃŲ´Ù. // - ¸¸¾à ÁÂÇ¥ ¼³Á¤ÀÌ ¾Æ´Ñ ´Ù¸¥ ³»¿ëÀÌ µé¾î°¡´Â °æ¿ì´Â »óȲÀ» µûÁ®¼­ ó¸®ÇØ¾ß ÇÒ °ÍÀÌ´Ù. if( pStatusManager->AnimationDelay.NeedSkipProcessByAnimationDelay( this ) ) return; // À̵¿ÇÒ °Å¸®¸¦ ±¸ÇÑ´Ù. AI_COMMON_INFO& stAICommonInfo = AIParamParser::Instance()->GetCommonInfo(); float MOVE_DISTANCE = (float)dRandom( stAICommonInfo.m_fMIN_MOVE_DISTANCE, stAICommonInfo.m_fMAX_MOVE_DISTANCE ); #ifdef _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE if (GetAbilityID() == eABILITY_CHARMED) // ¸ÅȤ { const Character* const attacker = GetAttacker(); if (attacker == NULL) { return; } if (owner->IsEqualObjectKind(PLAYER_OBJECT)) // Ÿ°Ù À§Ä¡ °»½Å { m_bTouchedSomething = FALSE; m_vTargetPos = *attacker->GetPosPtr(); } MOVE_DISTANCE *= -1; // ¹æÇâ ¼³Á¤ } #endif // _NA_007514_20140828_NEW_CHARACTER_WITCHBLADE WzVector wvCurPos, wvDestPos, wvMovement; owner->GetPos( &wvCurPos ); GameField *pField = owner->GetField(); if( !pField ) return; // ÀÌÀü ±æÃ£±â¿¡¼­ ¹«¾ð°¡¿¡ ´êÀº °æ¿ì 60µµ ȸÀü½Ã۰í, ±×·¸Áö ¾Ê´Ù¸é ·£´ýÇÑ ¹æÇâÀ¸·Î Æ÷ÀÎÆÃ if( m_bTouchedSomething ) { m_bTouchedSomething = FALSE; wvMovement = m_wvRotatedVector; } else { VectorNormalize( &wvMovement, &( wvCurPos - m_vTargetPos ) ); wvMovement.x *= MOVE_DISTANCE; wvMovement.y *= MOVE_DISTANCE; } wvMovement.z = 2.f; wvDestPos = wvCurPos + wvMovement; MoveStateControl* const pMoveStateControl = static_cast(owner)->GetMoveStateControl(); float fMoveSpeed = pMoveStateControl->GetMoveSpeed(); pMoveStateControl->SetMoveState( CMS_RUN ); if( !pField->FindPath( owner, &wvDestPos, (eCHAR_STATE_TYPE)GetStateID() ) ) { // Àå¾Ö¹°¿¡ ´ê¾Ò´Ù´Â Ç¥½Ã¸¦ Çϰí Áö±Ý °¡·Á´Â ¹æÇâ¿¡¼­ 60µµ ȸÀü½ÃŲ º¤Å͸¦ ±¸ÇصдÙ. m_bTouchedSomething = TRUE; WzVector wvDistanceWantToMove; wvDistanceWantToMove = wvDestPos - wvCurPos; const FLOAT cosVal = g_SinTable.FCOS(stAICommonInfo.m_wSEARCH_ROTATE_ANGLE); const FLOAT sinVal = g_SinTable.FSIN(stAICommonInfo.m_wSEARCH_ROTATE_ANGLE); m_wvRotatedVector.x = wvDistanceWantToMove.x * cosVal + wvDistanceWantToMove.y * sinVal; m_wvRotatedVector.y = -wvDistanceWantToMove.x * sinVal + wvDistanceWantToMove.y * cosVal; m_wvRotatedVector.z = 0.0f; return; } { MSGSUB_SYNC_MOVE_BRD msg; msg.m_dwObjectKey = owner->GetObjectKey(); msg.m_byState = CMS_RUN; //ij¸¯ÅÍÀÇ °æ¿ì´Â ¹«Á¶°Ç ¶Ù±â¸¸ Á¸Àç!!(¸ó½ºÅÍ¿Í °°ÀÌ ¾²´Â ÆÐŶÀ̹ǷΠ°ªÀº ³Ö¾îÁÜ) msg.m_ForcedMove = TRUE; msg.m_wvCurPos = wvCurPos; msg.m_wvDestPos = wvDestPos; owner->SendPacketAroundForSync( &msg ); }; }