DragonNest/GameCommon/DnChargerBlow.cpp

248 lines
7.6 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include "DnChargerBlow.h"
#include "DnActionBase.h"
#include "EtActionSignal.h"
#include "DnProjectile.h"
#include "DnActor.h"
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
CDnChargerBlow::CDnChargerBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor )
//#ifdef _GAMESERVER
,m_pActionElement( NULL ),
m_fFrame( 0.0f ),
m_iAdditionalWeaponLength( 0 )
//#endif
{
m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_062;
// <20><><EFBFBD>ڰ<EFBFBD><DAB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD> <20≯<EFBFBD>
_ASSERT( strlen(szValue) < STATE_BLOW_ARGUMENT_MAX_SIZE );
SetValue( szValue );
//#ifdef _GAMESERVER
// <20><><EFBFBD>Ŀ<EFBFBD> <20><><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>.
m_strChargerActionName = szValue;
//#endif
#if defined(PRE_FIX_65287)
m_fShooterFinalDamageRate = 0.0f;
#endif // PRE_FIX_65287
}
CDnChargerBlow::~CDnChargerBlow(void)
{
}
void CDnChargerBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta )
{
// <20>׼<EFBFBD> <20>޾ƿ<DEBE>.
//#ifdef _GAMESERVER
if( !m_ParentSkillInfo.hSkillUser )
{
SetState( STATE_BLOW::STATE_END );
OutputDebug( "CDnChargerBlow::OnBegin fail!! SkillUser is Invalid!!\n" );
return;
}
m_pActionElement = NULL;
m_pActionElement = m_ParentSkillInfo.hSkillUser->GetElement( m_strChargerActionName.c_str() );
OutputDebug("%s %s", __FUNCTION__, m_strChargerActionName.c_str());
_ASSERT( m_pActionElement && "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<><C3A3> <20><> <20><><EFBFBD><EFBFBD>." );
// <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD> <20>޾ƿ´<C6BF>.
DnSkillHandle hParentSkill = m_ParentSkillInfo.hSkillUser->GetProcessSkill();
if( hParentSkill )
m_iAdditionalWeaponLength = hParentSkill->GetIncreaseRange();
if( m_pActionElement )
{
m_vlpSignalList = m_pActionElement->pVecSignalList;
#ifdef _GAMESERVER
if( m_ParentSkillInfo.hSkillUser )
{
m_pShooterStateSnapshot.reset( new CDnState );
*m_pShooterStateSnapshot= *static_cast<CDnState*>( m_ParentSkillInfo.hSkillUser.GetPointer() );
#if defined(PRE_FIX_65287)
m_fShooterFinalDamageRate = 0.0f;
if (m_ParentSkillInfo.hSkillUser && m_ParentSkillInfo.hSkillUser->IsAppliedThisStateBlow(STATE_BLOW::BLOW_050))
{
DNVector(DnBlowHandle) vlhBlows;
m_ParentSkillInfo.hSkillUser->GatherAppliedStateBlowByBlowIndex( STATE_BLOW::BLOW_050, vlhBlows );
int iNumBlow = (int)vlhBlows.size();
for( int i = 0; i < iNumBlow; ++i )
{
m_fShooterFinalDamageRate += vlhBlows[i]->GetFloatValue();
}
}
#endif // PRE_FIX_65287
}
#endif
// <20>ٷ<EFBFBD> <20><><EFBFBD><20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20>߰<EFBFBD>
if (STATE_BLOW::STATE_BEGIN == GetBlowState())
m_hActor->AddStateBlowSignal(this->GetMySmartPtr());
OutputDebug( "CDnChargerBlow::OnBegin\n" );
}
else
{
SetState( STATE_BLOW::STATE_END );
OutputDebug( "CDnChargerBlow::OnBegin fail!! Can't find Charger action element!!\n" );
}
//#else
// OutputDebug( "CDnChargerBlow::OnBegin\n" );
//#endif
}
void CDnChargerBlow::Process( LOCAL_TIME LocalTime, float fDelta )
{
CDnBlow::Process( LocalTime, fDelta );
}
void CDnChargerBlow::OnProjectileSignal( CDnProjectile* pProjectile )
{
// <20><>ų <20><><EFBFBD>Ÿ<EFBFBD> <20>߰<EFBFBD>.
pProjectile->SetWeaponLength( pProjectile->GetWeaponLength() + m_iAdditionalWeaponLength );
// <20>߻<EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ٴ<EFBFBD> <20><><EFBFBD><EFBFBD> ǥ<><C7A5>.
// <20><> <20><EFBFBD><E0BCAE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD><C7B4><EFBFBD><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> <20>޺<EFBFBD> ī<><C4AB>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ܽ<EFBFBD>Ų<EFBFBD><C5B2>. (#11329)
#ifdef _GAMESERVER
pProjectile->FromCharger();
pProjectile->FromSkill( true );
pProjectile->SetShooterStateSnapshot( m_pShooterStateSnapshot );
pProjectile->SetForceHitElement( m_ParentSkillInfo.eSkillElement );
#if defined(PRE_FIX_65287)
pProjectile->SetShooterFinalDamageRate(m_fShooterFinalDamageRate);
#endif // PRE_FIX_65287
#endif
}
void CDnChargerBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta )
{
m_hActor->RemoveStateBlowSignal(this->GetMySmartPtr());
OutputDebug( "CDnChargerBlow::OnEnd\n" );
}
void CDnChargerBlow::SignalProcess( LOCAL_TIME LocalTime, float fDelta )
{
//#ifdef _GAMESERVER
if( m_ParentSkillInfo.hSkillUser &&
m_hActor )
{
// <20><> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><>ġ<EFBFBD><C4A1> <20>ٲ㼭 <20>ñ׳<C3B1> ó<><C3B3>
if( m_pActionElement )
{
//float fFPS = m_ParentSkillInfo.hSkillUser->CDnActionBase::GetFPS();
float fFPS = 60.0f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD> <20>ñ׳<C3B1><D7B3><EFBFBD> ó<><C3B3> <20>ǵ<EFBFBD><C7B5><EFBFBD> <20>Ѵ<EFBFBD>. #26439
// [2011/03/07 semozz]
// fDelta<74><61> 1/60(0.01666)<29><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// m_fFrame<6D><65><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD> <20>۾<EFBFBD><DBBE><EFBFBD>..
// CheckSignal<61><6C><EFBFBD><EFBFBD> ù<><C3B9>° if<69><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɸ<EFBFBD><C9B8><EFBFBD>, fCur<75><72> 0.0<EFBFBD><EFBFBD> <20>ƴϾ
// ù<><C3B9><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD> <20>ִ<EFBFBD> <20>ñ׳ε<D7B3><CEB5><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>ȵ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
// <20>׷<EFBFBD><D7B7><EFBFBD> frame<6D><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD>, fPrevFrame<6D><65><EFBFBD><EFBFBD> m_fFrame<6D><65><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>..
// cur<75><72> Frame [S, E]<5D><><EFBFBD>̿<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, cur/pre<72>񱳸<EFBFBD> int<6E><74> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> ũ<><C5A9> <20>񱳸<EFBFBD> <20>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> cur<75><72> 0.0<EFBFBD><EFBFBD> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD>..
// cur/pre intij<74><C4B3><EFBFBD><EFBFBD> <20>񱳽<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> 1.0 <20><><EFBFBD>̰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>..
float fPrevFrame = m_fFrame - 1.0f;
//float fPrevFrame = m_fFrame;
//m_fFrame += (fDelta * fFPS);
if( m_pActionElement->dwLength < (DWORD)m_fFrame )
{
m_fFrame = 1.0f;
fPrevFrame = -0.1f;
}
//if( 0.0f == fPrevFrame )
// fPrevFrame = -(m_fFrame * 0.1f);
// <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ͷ<EFBFBD> <20>ٲ㼭 <20>ñ׳ε<D7B3><CEB5><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŵ.
MatrixEx OriginalCross = *(m_ParentSkillInfo.hSkillUser->GetMatEx());
MatrixEx ChargerActorCross = *(m_hActor->GetMatEx());
*(m_ParentSkillInfo.hSkillUser->GetMatEx()) = ChargerActorCross;
m_ParentSkillInfo.hSkillUser->SetOnSignalFromChargerSE( true );
m_ParentSkillInfo.hSkillUser->SetChargerDestActor( m_hActor );
#ifdef _GAMESERVER
m_ParentSkillInfo.hSkillUser->SetChargerBlow( GetMySmartPtr() );
m_ParentSkillInfo.hSkillUser->PushForceHitElement( m_ParentSkillInfo.eSkillElement );
#endif
CEtActionSignal *pSignal = NULL;
#if defined(PRE_FIX_55378)
m_ParentSkillInfo.hSkillUser->SetChargerAction(m_strChargerActionName.c_str());
#endif // PRE_FIX_55378
for( DWORD i=0; i < m_vlpSignalList.size(); i++ )
{
pSignal = m_vlpSignalList[i];
if( pSignal->CheckSignal( fPrevFrame, m_fFrame ) == true )
{
LOCAL_TIME StartTime = LocalTime - (LOCAL_TIME)( 1000.f / fFPS * ( m_fFrame - pSignal->GetStartFrame() ) );
LOCAL_TIME EndTime = LocalTime + (LOCAL_TIME)( 1000.f / fFPS * ( pSignal->GetEndFrame() - m_fFrame ) );
m_ParentSkillInfo.hSkillUser->OnSignal( (SignalTypeEnum)pSignal->GetSignalIndex(), pSignal->GetData(), LocalTime,
StartTime, EndTime, pSignal->GetSignalListArrayIndex() );
}
//////////////////////////////////////////////////////////////////////////
//OutputDebug("%s, Signal start=%d, preFrame=%f, curFrame=%f, end=%d ====> %s\n", __FUNCTION__, pSignal->GetStartFrame(), fPrevFrame, m_fFrame, pSignal->GetEndFrame(), (isCheckSignal ? "true" : "false"));
//////////////////////////////////////////////////////////////////////////
}
#if defined(PRE_FIX_55378)
m_ParentSkillInfo.hSkillUser->SetChargerAction(NULL);
#endif // PRE_FIX_55378
*(m_ParentSkillInfo.hSkillUser->GetMatEx()) = OriginalCross;
m_ParentSkillInfo.hSkillUser->SetOnSignalFromChargerSE( false );
DnActorHandle hNullActor;
m_ParentSkillInfo.hSkillUser->SetChargerDestActor( hNullActor );
#ifdef _GAMESERVER
DnBlowHandle hNullBlow;
m_ParentSkillInfo.hSkillUser->SetChargerBlow( hNullBlow );
m_ParentSkillInfo.hSkillUser->PopForceHitElement();
#endif
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
m_fFrame += (fDelta * fFPS);
}
}
//#endif
}
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
void CDnChargerBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
szNewValue = szOrigValue;
}
void CDnChargerBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
szNewValue = szOrigValue;
}
#endif // PRE_ADD_PREFIX_SYSTE_RENEW