DragonNest/GameCommon/DnSleepBlow.cpp

189 lines
4.7 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include "DnSleepBlow.h"
#include "DnCantMoveBlow.h"
#include "DnCantActionBlow.h"
#include "DnMonsterActor.h"
#include "DnTableDB.h"
#if !defined( USE_BOOST_MEMPOOL )
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
#endif // #if !defined( USE_BOOST_MEMPOOL )
const int DEFAULT_SLEEP_PROBABILITY = 10000; // <20><><EFBFBD><20>ɸ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ Ȯ<><C8AE>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*10 <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const LOCAL_TIME ACCEPT_HIT_GAP = 500; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɸ<EFBFBD> <20>Ŀ<EFBFBD> 0.5<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>¾Ƶ<C2BE> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> Ǯ<><C7AE><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20><><EFBFBD>ش<EFBFBD>. <20>ȱ׷<C8B1><D7B7><EFBFBD> <20>ɸ<EFBFBD><C9B8>ڸ<EFBFBD><DAB8><EFBFBD> Ǯ<><C7AE>
#define SLEEP_ACTION_NAME "Sleep"
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3>..
CDnSleepBlow::CDnSleepBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor )
{
m_bAcceptHit = false;
m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_045;
SetValue( szValue );
m_fValue = (float)atof(szValue);
m_StartTime = 0;
AddCallBackType( SB_ONDEFENSEATTACK );
m_pCantMoveBlow = new CDnCantMoveBlow( hActor, NULL );
m_pCantActionBlow = new CDnCantActionBlow( hActor, NULL );
if (m_pCantMoveBlow)
m_pCantMoveBlow->SetPermanent(true);
if (m_pCantActionBlow)
m_pCantActionBlow->SetPermanent(true);
#ifndef _GAMESERVER
m_pCantMoveBlow->UseTableDefinedGraphicEffect( false );
#endif
}
CDnSleepBlow::~CDnSleepBlow(void)
{
SAFE_DELETE( m_pCantMoveBlow );
SAFE_DELETE( m_pCantActionBlow );
}
#ifdef _GAMESERVER
bool CDnSleepBlow::CanBegin( void )
{
float fWeight = 0.0f;
if( m_hActor && m_hActor->IsPlayerActor() )
fWeight = CPlayerWeightTable::GetInstance().GetValue( m_hActor->GetClassID(), CPlayerWeightTable::ElementDefense );
float fAvoidProb = 1.f;
fAvoidProb -= m_hActor->GetElementDefense( CDnState::Dark ) * fWeight;
if( m_fValue > 0.f ) // #83276 <20><><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 100%<25><> <20>ش޶<D8B4><DEB6><EFBFBD> <20><>û
fAvoidProb -= (1.f - m_fValue);
if( _rand(GetRoom()) % 10000 > int(fAvoidProb * 10000.0f) )
return true;
return false;
}
#endif
void CDnSleepBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta )
{
if( !m_hActor )
return;
if( strcmp( m_hActor->GetCurrentAction(), SLEEP_ACTION_NAME ) != 0 )
{
m_hActor->SetActionQueue( SLEEP_ACTION_NAME, 0, 0.0f, 0.0f, false );
CEtActionBase::ActionElementStruct* pElement = m_hActor->GetElement( SLEEP_ACTION_NAME );
if( pElement )
{
if( m_hActor->CDnActionBase::GetFPS() > 0.0f )
m_StateBlow.fDurationTime += (pElement->dwLength / m_hActor->CDnActionBase::GetFPS());
}
else
{
SetState( STATE_BLOW::STATE_END );
}
}
m_hActor->SetDownRemainDelta( m_StateBlow.fDurationTime );
#ifndef _GAMESERVER
_AttachGraphicEffect();
#endif
m_pCantMoveBlow->OnBegin( LocalTime, fDelta );
m_pCantActionBlow->OnBegin( LocalTime, fDelta );
m_bAcceptHit = false;
m_StartTime = LocalTime;
}
void CDnSleepBlow::Process( LOCAL_TIME LocalTime, float fDelta )
{
CDnBlow::Process( LocalTime, fDelta );
if( false == m_bAcceptHit )
{
if( LocalTime - m_StartTime > ACCEPT_HIT_GAP )
{
m_bAcceptHit = true;
}
}
}
void CDnSleepBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta )
{
m_pCantMoveBlow->OnEnd( LocalTime, fDelta );
m_pCantActionBlow->OnEnd( LocalTime, fDelta );
m_hActor->SetDownRemainDelta( 0.2f );
#ifndef _GAMESERVER
_DetachGraphicEffect();
#else
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CDnActor::CmdRemoveStateEffect() <20><> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD> <20>ȵǰ<C8B5>
// <20><><EFBFBD>ٷ<EFBFBD> ȣ<><C8A3><EFBFBD>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3> <20>Ǵ<EFBFBD> <20><>Ȳ<EFBFBD><C8B2> <20>߰ߵǾ<DFB5> <20>ƿ<EFBFBD> <20>и<EFBFBD> <20><>Ŵ.
m_hActor->SendRemoveStateEffect( m_StateBlow.emBlowIndex );
#endif
}
#ifdef _GAMESERVER
bool CDnSleepBlow::OnDefenseAttack( DnActorHandle hActor, CDnState* pAttackerState, CDnDamageBase::SHitParam &HitParam, bool bHitSuccess )
{
if( m_bAcceptHit )
{
// <20>Ѵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>!
SetState( STATE_BLOW::STATE_END );
// Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
m_hActor->CmdRemoveStateEffect( m_StateBlow.emBlowIndex, false );
}
return false;
}
#endif
void CDnSleepBlow::OnDuplicate( const STATE_BLOW& StateBlowInfo )
{
// downdelta <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
m_hActor->SetDownRemainDelta( m_StateBlow.fDurationTime );
}
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
void CDnSleepBlow::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];
fValue[0] = (float)atof( szOrigValue );
fValue[1] = (float)atof( szAddValue );
float fResultValue = fValue[0] + fValue[1];
sprintf_s(szBuff, "%f", fResultValue);
szNewValue = szBuff;
}
void CDnSleepBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
float fValue[2];
fValue[0] = (float)atof( szOrigValue );
fValue[1] = (float)atof( szAddValue );
float fResultValue = fValue[0] - fValue[1];
sprintf_s(szBuff, "%f", fResultValue);
szNewValue = szBuff;
}
#endif