DragonNest/GameCommon/DnUsingSkillWhenDieBlow.cpp

176 lines
4.9 KiB
C++
Raw Permalink Normal View History

#include "StdAfx.h"
#include "DnUsingSkillWhenDieBlow.h"
#include "DnMonsterActor.h"
#include "DnInvincibleBlow.h"
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
CDnUsingSkillWhenDieBlow::CDnUsingSkillWhenDieBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor ),
m_bUsedDieSkill( false ),
m_bDead( false )
{
m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_137;
SetValue( szValue );
m_fValue = (float)atof( szValue );
}
CDnUsingSkillWhenDieBlow::~CDnUsingSkillWhenDieBlow( void )
{
}
#ifdef _GAMESERVER
bool CDnUsingSkillWhenDieBlow::CanBegin( void )
{
bool bResult = true;
// <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴٸ<CAB4> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
DnSkillHandle hSkill = m_hActor->FindSkill( (int)m_fValue );
if( !hSkill )
{
OutputDebug( "CDnUsingSkillWhenDieBlow::CanBegin - Don't have skill\n" );
bResult = false;
}
return bResult;
}
#endif
void CDnUsingSkillWhenDieBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta )
{
_ASSERT( m_hActor->IsMonsterActor() && "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>鼭 Ư<><C6AF> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>." );
if( false == m_hActor->IsMonsterActor() )
SetState( STATE_BLOW::STATE_END );
// hp <20><> 0 <20><><EFBFBD><EFBFBD> <20>ƴ<EFBFBD><C6B4><EFBFBD> <20>Ǵ<EFBFBD><C7B4>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// CDnActor::Die() ȣ<><C8A3><EFBFBD><EFBFBD> <20><> hp 1 <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD> <20>Լ<EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20>׶<EFBFBD> <20><><EFBFBD>δ<EFBFBD>..
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD>..
OutputDebug( "CDnUsingSkillWhenDieBlow::OnBegin\n");
}
void CDnUsingSkillWhenDieBlow::OnDie( void )
{
// <20><><EFBFBD><EFBFBD> Ŭ<><C5AC> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD>..
m_hActor->SetHP( 1 );
m_bDead = true;
// <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> hp <20><> 1<><31> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ai <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
#ifdef _GAMESERVER
CDnMonsterActor* pMonsterActor = static_cast<CDnMonsterActor*>(m_hActor.GetPointer());
pMonsterActor->SetAIState( MAAiReceiver::Disable );
m_hActor->CmdAddStateEffect( NULL, STATE_BLOW::BLOW_069, 0, "10", false , false);
m_hActor->CmdAddStateEffect( NULL, STATE_BLOW::BLOW_099, -1, "", false, false );
#endif
}
void CDnUsingSkillWhenDieBlow::Process( LOCAL_TIME LocalTime, float fDelta )
{
CDnBlow::Process( LocalTime, fDelta );
#ifdef _GAMESERVER
if( m_bDead )
{
#endif
if( false == m_bUsedDieSkill )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>Ѵ<EFBFBD>.
// <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Stand <20>׼<EFBFBD><D7BC><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
DnSkillHandle hSkill = m_hActor->GetProcessSkill();
if( hSkill &&
(hSkill->GetClassID() == (int)m_fValue) )
{
m_bUsedDieSkill = true;
}
#ifdef _GAMESERVER
else
{
// <20><><EFBFBD>߿<EFBFBD><DFBF><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD><D8B3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// <20>Ƹ<EFBFBD><C6B8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD> <20><>.
if( strstr( m_hActor->GetCurrentAction(), "Stand") )
{
m_hActor->UseSkill( (int)m_fValue, false );
//#44884 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DieSkill <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>ȭ <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD>
//Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> üũ<C3BC><C5A9> <20><><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><20>߻<EFBFBD><DFBB><EFBFBD>.
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>ȭ <20><>Ŷ <20><><EFBFBD><EFBFBD>..
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> ShowStateEffect <20>Լ<EFBFBD><D4BC><EFBFBD> <20>̿<EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD>..
BYTE pBuffer[128];
CPacketCompressStream Stream( pBuffer, 128 );
DWORD dwUniqueID = m_hActor ? m_hActor->GetUniqueID() : -1;
STATE_BLOW::emBLOW_INDEX blowIndex = STATE_BLOW::BLOW_137;
bool bShowEffect = true;
Stream.Write( &dwUniqueID, sizeof(dwUniqueID) );
Stream.Write( &blowIndex, sizeof(blowIndex));
Stream.Write( &bShowEffect, sizeof(bShowEffect));
m_hActor->Send(eActor::SC_SHOW_STATE_EFFECT, &Stream);
}
else if( !m_hActor->IsAir() )
{
m_hActor->CmdAction("Stand");
}
}
#endif
}
if( m_bUsedDieSkill )
{
// HP <20><> 0 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>״<EFBFBD> <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><>ü <20><><EFBFBD><EFBFBD>.
// HP <20><> 0 <20><> <20>Ǹ<EFBFBD>, ProcessDie <20><><EFBFBD><EFBFBD> destroy <20><> <20><><EFBFBD>õȴ<C3B5>.
if( false == m_hActor->IsProcessSkill() )
{
m_hActor->SetActionQueue( "Die" );
m_hActor->SetHP( 0 );
#if defined(PRE_FIX_44884)
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E2BFA1> OnDie<69><65> ȣ<><C8A3> <20>Ѵ<EFBFBD>..
//Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ CDnActor::OnDie<69><65> protected<65><64> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20>־
//<2F><> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ͷ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20>ؼ<EFBFBD> OnDieȣ<65><C8A3> <20>Ѵ<EFBFBD>.
CDnMonsterActor* pMonsterActor = static_cast<CDnMonsterActor*>(m_hActor.GetPointer());
if (pMonsterActor)
pMonsterActor->OnDie(m_FinalHitterActor);
SetState(STATE_BLOW::STATE_END);
#endif // PRE_FIX_44884
#ifndef _GAMESERVER
m_hActor->SetDieDelta( 3.0f );
#endif
}
}
#ifdef _GAMESERVER
}
#endif
}
void CDnUsingSkillWhenDieBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta )
{
OutputDebug( "CDnUsingSkillWhenDieBlow::OnEnd\n");
}
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
void CDnUsingSkillWhenDieBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
szNewValue = szOrigValue;
}
void CDnUsingSkillWhenDieBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
szNewValue = szOrigValue;
}
#endif // PRE_ADD_PREFIX_SYSTE_RENEW