DragonNest/GameCommon/DnUsingSkillWhenDieBlow.cpp

176 lines
9.3 KiB
C++
Raw Normal View History

2024-12-20 16:56:44 +08:00
<EFBFBD><EFBFBD>#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;
// <EFBFBD>¬<EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> J<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD>\<EFBFBD> ]<EFBFBD><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() && "<00><><<3C>t<EFBFBD><1C> <00><><15> <00>¬<EFBFBD> <00><><EFBFBD><EFBFBD><58> <00><><EFBFBD>Ш<EFBFBD><D0A8><EFBFBD><EFBFBD><EFBFBD> <00><><EFBFBD><EFBFBD>0<EFBFBD>̹ <00><><EFBFBD>i<EFBFBD>Ȳ<EFBFBD><C8B2>." );
if( false == m_hActor->IsMonsterActor() )
SetState( STATE_BLOW::STATE_END );
// hp <EFBFBD> 0 x<EFBFBD><EFBFBD><EFBFBD> D<EFBFBD>̲<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>@<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// CDnActor::Die() 8֜<EFBFBD> <EFBFBD> L<EFBFBD> hp 1 \<EFBFBD> <EFBFBD><EFBFBD>l<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> h<EFBFBD><EFBFBD> <EFBFBD>̬<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>¨<EFBFBD><EFBFBD><EFBFBD>.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>¬<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD≯<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD>L<EFBFBD> <EFBFBD><EFBFBD>x<EFBFBD><EFBFBD><EFBFBD>..
// <EFBFBD><EFBFBD>@<EFBFBD> <EFBFBD><EFBFBD>Ȁ<EFBFBD>0<EFBFBD> 4<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD> ȩ<EFBFBD>..
OutputDebug( "CDnUsingSkillWhenDieBlow::OnBegin\n");
}
void CDnUsingSkillWhenDieBlow::OnDie( void )
{
// <EFBFBD><EFBFBD><EFBFBD> t<EFBFBD>|<EFBFBD> ٳ|<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>@<EFBFBD> <EFBFBD><EFBFBD>Ȁ<EFBFBD>0<EFBFBD> 4<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD> ȩ<EFBFBD>..
m_hActor->SetHP( 1 );
m_bDead = true;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> hp |<EFBFBD> 1\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>¬<EFBFBD>D<EFBFBD> <EFBFBD>‰<EFBFBD>.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD> ai <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>¨<EFBFBD><EFBFBD><EFBFBD>.
#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 )
{
// <EFBFBD><EFBFBD><<EFBFBD>t<EFBFBD><EFBFBD> <EFBFBD>¬<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŕ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>l<EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>.
// <EFBFBD>¬<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<EFBFBD> Stand a<EFBFBD>X<EFBFBD>|<EFBFBD> L<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>ij]<EFBFBD> 0<EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>.
DnSkillHandle hSkill = m_hActor->GetProcessSkill();
if( hSkill &&
(hSkill->GetClassID() == (int)m_fValue) )
{
m_bUsedDieSkill = true;
}
#ifdef _GAMESERVER
else
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>¬<EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ɣ<EFBFBD> |<EFBFBD><EFBFBD><EFBFBD> l<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ij]<EFBFBD> <EFBFBD>.
// D<EFBFBD>ȹij E<EFBFBD><EFBFBD><EFBFBD> )<EFBFBD><EFBFBD><EFBFBD>`<EFBFBD> <EFBFBD><EFBFBD> L<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>¬<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>|<EFBFBD>`<EFBFBD> <EFBFBD><EFBFBD>.
if( strstr( m_hActor->GetCurrentAction(), "Stand") )
{
m_hActor->UseSkill( (int)m_fValue, false );
//#44884 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD>X<EFBFBD> DieSkill <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>/t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD> ٳ0<EFBFBD>T<EFBFBD> 8<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
//t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>l<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>h<EFBFBD>.
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>¬<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD>\<EFBFBD> ٳ0<EFBFBD>T<EFBFBD> (ӷ<EFBFBD> <EFBFBD><EFBFBD>İ..
//0<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD> ShowStateEffect h<EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD> X<EFBFBD>ij]<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 |<EFBFBD> 0 <<EFBFBD>\<EFBFBD> ̹<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ȕ<EFBFBD> a<EFBFBD>X<EFBFBD> <EFBFBD><EFBFBD>$<EFBFBD>t<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>.
// HP <EFBFBD> 0 t<EFBFBD> <EFBFBD>t<EFBFBD>, ProcessDie <EFBFBD><EFBFBD><EFBFBD> destroy <EFBFBD> K<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( false == m_hActor->IsProcessSkill() )
{
m_hActor->SetActionQueue( "Die" );
m_hActor->SetHP( 0 );
#if defined(PRE_FIX_44884)
//\ͅ<EFBFBD><EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD>0<EFBFBD><EFBFBD><EFBFBD><EFBFBD> OnDie|<EFBFBD> 8֜<EFBFBD> \<EFBFBD><EFBFBD><EFBFBD>..
//t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD> CDnActor::OnDie<EFBFBD> protected\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ǵ<EFBFBD><EFBFBD>
//t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD> a<EFBFBD>0<EFBFBD>̹ ٳ<EFBFBD><EFBFBD> <EFBFBD> $<EFBFBD><EFBFBD>t<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD> a<EFBFBD>0<EFBFBD>\<EFBFBD> <EFBFBD>Τ<EFBFBD><EFBFBD> t<EFBFBD><EFBFBD> OnDie8֜<EFBFBD> \<EFBFBD><EFBFBD><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