DragonNest/GameCommon/DnPoisonExplosionBlow.cpp

254 lines
7.5 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include "DnPoisonExplosionBlow.h"
#include "DnMonsterActor.h"
#include "EtActionSignal.h"
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
#define POISON_EXPLOSION_ACTION_NAME "Hit_Poison"
CDnPoisonExplosionBlow::CDnPoisonExplosionBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor ),
m_pActionElement( NULL ),
m_fFrame( 0.0f )
#ifdef _GAMESERVER
,m_iOriAttackMMin( 0 ),
m_iOriAttackMMax( 0 )
#endif
{
m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_115;
SetValue( szValue );
m_fValue = (float)atof(szValue);
m_pActionElement = m_hActor->GetElement( POISON_EXPLOSION_ACTION_NAME );
_ASSERT( m_pActionElement && "<EFBFBD>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<><C3A3> <20><> <20><><EFBFBD><EFBFBD>." );
m_ActionDurationTime = 0;
if (m_pActionElement)
{
m_ActionDurationTime = m_pActionElement->dwLength;
m_vlpSignalList = m_pActionElement->pVecSignalList;
}
}
CDnPoisonExplosionBlow::~CDnPoisonExplosionBlow(void)
{
}
bool CDnPoisonExplosionBlow::CanBegin( void )
{
// <20>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7>ִ<EFBFBD> <20><><EFBFBD>°<EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD> <20><><EFBFBD>۵<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
bool bCanBegin = m_hActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_044 ) ||
m_hActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_136 ); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. (#27838);
if( false == bCanBegin )
OutputDebug( "CDnPoisonExplosionBlow::CanBegin - <20>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD>.\n" );
// <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ߵ<EFBFBD><DFB5><EFBFBD>Ű<EFBFBD><C5B0> <20>ʴ´<CAB4>.
if( NULL == m_pActionElement )
{
bCanBegin = false;
OutputDebug( "CDnPoisonExplosionBlow::CanBegin - <20>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD>.\n" );
}
return bCanBegin;
}
void CDnPoisonExplosionBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta )
{
// <20>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD>
#ifdef _GAMESERVER
if( m_hActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_044 ) )
m_hActor->CmdRemoveStateEffect( STATE_BLOW::BLOW_044 );
if( m_hActor->IsAppliedThisStateBlow( STATE_BLOW::BLOW_136 ) )
m_hActor->CmdRemoveStateEffect( STATE_BLOW::BLOW_136 );
#endif
// <20><> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD> <20><><EFBFBD>ӽð<D3BD> <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC>Ŵ.
#ifdef _GAMESERVER
_ASSERT( m_ParentSkillInfo.hSkillUser );
if( !m_ParentSkillInfo.hSkillUser )
{
g_Log.Log( LogType::_ERROR, L"CDnPoisonExplosionBlow::OnBegin - <20>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD>Ͱ<EFBFBD> <20><>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ʾƼ<CABE> <20>ߵ<EFBFBD> <20><><EFBFBD><EFBFBD>..\n" );
SetState( STATE_BLOW::STATE_END );
return;
}
m_iOriAttackMMin = m_hActor->GetAttackMMin();
m_iOriAttackMMax = m_hActor->GetAttackMMax();
m_hActor->SetAttackMMin( m_ParentSkillInfo.hSkillUser->GetAttackMMin() );
m_hActor->SetAttackMMax( m_ParentSkillInfo.hSkillUser->GetAttackMMax() );
// <20><><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD> Ŭ<>󿡼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ǥ<>ø<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if( m_hActor && CDnActorState::Reserved6 < m_hActor->GetActorType() )
static_cast<CDnMonsterActor*>(m_hActor.GetPointer())->SlaveOf( m_ParentSkillInfo.hSkillUser->GetUniqueID() );
#endif
// <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
float fFPS = 60.0f;
//m_StateBlow.fDurationTime = (float)m_pActionElement->dwLength / fFPS;
m_StateBlow.fDurationTime = m_ActionDurationTime != 0 ? (float)m_ActionDurationTime / fFPS : 0.0f;
// <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( "CDnPoisonExplosionBlow::OnBegin\n" );
}
void CDnPoisonExplosionBlow::Process( LOCAL_TIME LocalTime, float fDelta )
{
CDnBlow::Process( LocalTime, fDelta );
}
void CDnPoisonExplosionBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta )
{
#ifdef _GAMESERVER
m_hActor->SetAttackMMin( m_iOriAttackMMin );
m_hActor->SetAttackMMax( m_iOriAttackMMax );
// <20><><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD> Ŭ<>󿡼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ǥ<>ø<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
//if( CDnActorState::Reserved6 < m_hActor->GetActorType() )
if( m_hActor && m_hActor->IsMonsterActor() )
{
DWORD dwInvalidMasterActorID = UINT_MAX;
static_cast<CDnMonsterActor*>(m_hActor.GetPointer())->SlaveOf( dwInvalidMasterActorID );
}
#endif
m_hActor->RemoveStateBlowSignal(this->GetMySmartPtr());
OutputDebug( "CDnPoisonExplosionBlow::OnEnd\n" );
}
//#ifdef _GAMESERVER
//
//#endif
void CDnPoisonExplosionBlow::SignalProcess( LOCAL_TIME LocalTime, float fDelta )
{
// <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20>ñ׳ε鸸 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
float fFPS = 60.0f;
float fPrevFrame = m_fFrame;
m_fFrame += (fDelta * fFPS);
//if(m_pActionElement->dwLength < (DWORD)m_fFrame )
if (m_ActionDurationTime < (DWORD)m_fFrame)
{
m_fFrame = 1.0f;
fPrevFrame = -0.1f;
// <20>׼<EFBFBD><D7BC><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ߴٸ<DFB4> <20><> <20>̻<EFBFBD> <20>ñ׳<C3B1> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ŭ <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
return;
}
if( 0.0f == fPrevFrame )
fPrevFrame = -(m_fFrame * 0.1f);
CEtActionSignal *pSignal = NULL;
#if defined(PRE_FIX_55378)
m_hActor->SetChargerAction(POISON_EXPLOSION_ACTION_NAME);
#endif // PRE_FIX_55378
#if defined(PRE_FIX_62309)
#if defined(_GAMESERVER)
//#62309
//<2F>ñ׳<C3B1> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> <20><><EFBFBD>鼭 OnSignal<61><6C> Hit<69><74> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
//<2F>ñ׳<C3B1> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>, Hit<69>ñ׳<C3B1> ó<><C3B3><EFBFBD>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>..
m_hActor->PushForceHitElement(m_ParentSkillInfo.eSkillElement);
#endif // _GAMESERVER
#endif // PRE_FIX_62309
//for( DWORD i=0; i < m_pActionElement->pVecSignalList.size(); i++ )
for( DWORD i=0; i < m_vlpSignalList.size(); i++ )
{
//pSignal = m_pActionElement->pVecSignalList[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_hActor->OnSignal( (SignalTypeEnum)pSignal->GetSignalIndex(), pSignal->GetData(), LocalTime,
StartTime, EndTime, pSignal->GetSignalListArrayIndex() );
}
}
#if defined(PRE_FIX_62309)
#if defined(_GAMESERVER)
m_hActor->PopForceHitElement();
#endif // _GAMESERVER
#endif // PRE_FIX_62309
#if defined(PRE_FIX_55378)
m_hActor->SetChargerAction(NULL);
#endif // PRE_FIX_55378
}
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
void CDnPoisonExplosionBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
//<2F>ʿ<EFBFBD><CABF><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
float fValue[2];
//////////////////////////////////////////////////////////////////////////
//ù<><C3B9>° <20><>
fValue[0] = (float)atof( szOrigValue );
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//<2F>ι<EFBFBD>°
fValue[1] = (float)atof( szAddValue );
//////////////////////////////////////////////////////////////////////////
//<2F><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
float fResultValue = fValue[0] + fValue[1];
sprintf_s(szBuff, "%f", fResultValue);
szNewValue = szBuff;
}
void CDnPoisonExplosionBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
//<2F>ʿ<EFBFBD><CABF><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
float fValue[2];
//////////////////////////////////////////////////////////////////////////
//ù<><C3B9>° <20><>
fValue[0] = (float)atof( szOrigValue );
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//<2F>ι<EFBFBD>°
fValue[1] = (float)atof( szAddValue );
//////////////////////////////////////////////////////////////////////////
//<2F><> <20><><EFBFBD><EFBFBD>
float fResultValue = fValue[0] - fValue[1];
sprintf_s(szBuff, "%f", fResultValue);
szNewValue = szBuff;
}
#endif // PRE_ADD_PREFIX_SYSTE_RENEW