DragonNest/GameCommon/DnFrameStopBlow.cpp
2024-12-20 16:56:44 +08:00

222 lines
No EOL
13 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StdAfx.h"
#include "DnFrameStopBlow.h"
#ifdef _GAMESERVER
// #include "DnGameRoom.h"
// #include "DnGameDataManager.h"
// #include "DnUserSession.h"
#include "DnStateBlow.h"
#else
#include "DnEtcObject.h"
#include "DnLocalPlayerActor.h"
#include "DnInterface.h"
#include "navigationmesh.h"
#include "InputWrapper.h"
#endif
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
const LOCAL_TIME SHAKE_TIME = 3000;
CDnFrameStopBlow::CDnFrameStopBlow(DnActorHandle hActor, const char *szValue) : CDnBlow(hActor)
#if defined(PRE_FIX_53274)
#ifndef _GAMESERVER
,m_ComboCalc( CDnComboCalculator::CIRCULAR_CHECK )
#endif
#endif // PRE_FIX_53274
{
m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_146;
#if defined(PRE_FIX_53274)
SetValue(szValue);
m_fValue = (szValue == NULL ? 0.0f : (float)atof(szValue));
m_bPlayerCharacter = false;
#ifndef _GAMESERVER
if (m_fValue != 0)
{
std::vector<BYTE> vlKeysToCheck;
vlKeysToCheck.push_back( g_WrappingKeyData[IW_MOVELEFT] );
vlKeysToCheck.push_back( g_WrappingKeyData[IW_MOVERIGHT] );
vlKeysToCheck.push_back( g_WrappingKeyData[IW_MOVELEFT] );
vlKeysToCheck.push_back( g_WrappingKeyData[IW_MOVERIGHT] );
vlKeysToCheck.push_back( g_WrappingKeyData[IW_MOVELEFT] );
vlKeysToCheck.push_back( g_WrappingKeyData[IW_MOVERIGHT] );
m_ComboCalc.SetKeysToCheck( vlKeysToCheck );
vlKeysToCheck.clear();
vlKeysToCheck.push_back( IW_MOVELEFT ); vlKeysToCheck.push_back( IW_MOVELEFT ); vlKeysToCheck.push_back( IW_MOVELEFT );
vlKeysToCheck.push_back( IW_MOVERIGHT ); vlKeysToCheck.push_back( IW_MOVERIGHT ); vlKeysToCheck.push_back( IW_MOVERIGHT );
vlKeysToCheck.push_back( IW_MOVEBACK ); vlKeysToCheck.push_back( IW_MOVEBACK ); vlKeysToCheck.push_back( IW_MOVEBACK );
vlKeysToCheck.push_back( IW_MOVEFRONT ); vlKeysToCheck.push_back( IW_MOVEFRONT ); vlKeysToCheck.push_back( IW_MOVEFRONT );
m_ComboCalc.SetPadsToCheck( vlKeysToCheck, 3.0f );
m_bPlayerCharacter = dynamic_cast<CDnLocalPlayerActor*>(m_hActor.GetPointer()) ? true : false;
}
#endif // _GAMESERVER
#endif // PRE_FIX_53274
}
CDnFrameStopBlow::~CDnFrameStopBlow(void)
{
}
void CDnFrameStopBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta )
{
//// 곧바로 플레이 스피드 리셋시키고 정지 시킴.
//m_hActor->ResetPlaySpeed();
//m_hActor->SetPlaySpeed( 1000000, 0.0f );
m_hActor->AddedFrameStop();
// #29627 릴리브 사용 가능하게 하기 위해서 hit state 가 아닐 때는 hit state 추가.
if( m_hActor->IsPlayerActor() ) // 플레이어인 경우만.
{
if( false == m_hActor->IsHit() )
{
int nState = m_hActor->GetState();
nState |= CDnActorState::ActorStateEnum::Hit;
m_hActor->SetState( (CDnActorState::ActorStateEnum)nState );
}
}
//////////////////////////////////////////////////////////////////////////
#if defined(PRE_FIX_53274)
#ifndef _GAMESERVER
// 플레이어가 걸렸을 경우에 버튼 연타 UI 보여줌
if( m_fValue != 0.0f && m_bPlayerCharacter )
{
#if defined(PRE_FIX_57706)
if (m_hActor->GetStickAniDlgRefCount() == 0)
{
GetInterface().ShowStickAniDialog( true );
}
m_hActor->AddStickAniDlgRefCount();
#else
GetInterface().ShowStickAniDialog( true );
#endif // PRE_FIX_57706
}
#endif // _GAMESERVER
#endif // PRE_FIX_53274
OutputDebug( "CDnFrameStopBlow::OnBegin, Value:%f \n", m_fValue );
}
#if defined(PRE_FIX_53274)
void CDnFrameStopBlow::Process( LOCAL_TIME LocalTime, float fDelta )
{
__super::Process(LocalTime, fDelta);
#ifndef _GAMESERVER
if (m_fValue != 0.0f)
{
if( CDnLocalPlayerActor::s_hLocalActor == m_hActor )
{
// TODO: 좌우 입력 받을 때 마다 시간 줄여줌. 결과적으로 서버로도 보내줘야 함...
int iNumComboCount = 0;
bool bComboSatisfy = m_ComboCalc.Process( LocalTime, fDelta, &iNumComboCount );
for( int i = 0; i < iNumComboCount; ++i )
m_StateBlow.fDurationTime -= 1.0f;
if( bComboSatisfy )
{
OutputDebug( "[위기탈출] %d 회 콤보 성공, 시간 %2.2f 로 줄어듬 \n", iNumComboCount, m_StateBlow.fDurationTime );
}
}
// 자기 자신의 플레이어 캐릭터만 위기 탈출로 시간을 줄일 수 있으므로 체크해서 서버로 상태효과 끝낸다고 보냄.
if( CDnLocalPlayerActor::s_hLocalActor == m_hActor )
{
if( m_StateBlow.fDurationTime < 0.2f )
{
// 게임서버로 미리 쏴준다.
#if defined(PRE_FIX_57706)
//클라이언트에서 상태효과 종료 조건이 확인 됨.. 일단 서버로 패킷 보내고, 서버에서 브로드캐스팅 해줘서 패킷 받아 제거 되도록 수정함..
//이 클라이언트는 실제 제거는 하지 않고 패킷만 보냄. 시간이 다 되서 자동으로 제거 되거나, 서버에서 패킷 받아서 제거 되도록 한다.
CDnLocalPlayerActor* pLocalPlayerActor = static_cast<CDnLocalPlayerActor*>(m_hActor.GetPointer());
if (pLocalPlayerActor)
pLocalPlayerActor->CmdRemoveStateEffectByServerBlowID(GetServerBlowID());
#else
m_hActor->CmdRemoveStateEffect( m_StateBlow.emBlowIndex, true );
#endif // PRE_FIX_57706
}
}
}
#endif // _GAMESERVER
}
#endif // PRE_FIX_53274
void CDnFrameStopBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta )
{
//m_hActor->ResetPlaySpeed();
m_hActor->RemovedFrameStop();
#if defined(PRE_FIX_53274)
#ifndef _GAMESERVER
// 플레이어가 걸렸을 경우에 버튼 연타 UI 보여줌
if( dynamic_cast<CDnLocalPlayerActor*>(m_hActor.GetPointer()) )
{
#if defined(PRE_FIX_57706)
m_hActor->RemoveStickAniDlgRefCount();
if (m_hActor->GetStickAniDlgRefCount() == 0)
{
GetInterface().ShowStickAniDialog( false );
}
#else
GetInterface().ShowStickAniDialog( false );
#endif // PRE_FIX_57706
}
#endif // _GAMESERVER
#endif // PRE_FIX_53274
#if defined(_GAMESERVER)
if (m_fValue != 0.0f)
{
//같은 스킬로 추가된 상태효과들을 찾아서 같이 제거 하도록 한다.
CDnStateBlow* pStateBlow = m_hActor->GetStateBlow();
int nStateCount = pStateBlow ? pStateBlow->GetNumStateBlow() : 0;
for( int iBlow = 0; iBlow < nStateCount; ++iBlow )
{
DnBlowHandle hExistingBlow = pStateBlow->GetStateBlow( iBlow );
CDnSkill::SkillInfo* pSkillInfo = const_cast<CDnSkill::SkillInfo*>(hExistingBlow->GetParentSkillInfo());
//스킬이 같고, 같은 스킬 사용자일경우..
if (pSkillInfo &&
pSkillInfo->iSkillID == m_ParentSkillInfo.iSkillID &&
pSkillInfo->hSkillUser &&
pSkillInfo->hSkillUser == m_ParentSkillInfo.hSkillUser)
{
hExistingBlow->SetState(STATE_BLOW::STATE_END);
m_hActor->CmdRemoveStateEffectFromID(hExistingBlow->GetBlowID());
}
}
}
#endif // _GAMESERVER
OutputDebug( "CDnFrameStopBlow::OnEnd\n" );
}
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
void CDnFrameStopBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
szNewValue = szOrigValue;
}
void CDnFrameStopBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
szNewValue = szOrigValue;
}
#endif // PRE_ADD_PREFIX_SYSTE_RENEW