DragonNest/GameCommon/DnRangeMReflectDamageBlow.cpp

169 lines
4.8 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include "DnRangeMReflectDamageBlow.h"
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
#ifdef _GAMESERVER
extern int GetGaussianRandom( int nMin, int nMax, CMultiRoom *pRoom );
#endif
CDnRangeMReflectDamageBlow::CDnRangeMReflectDamageBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor )
#ifdef _GAMESERVER
, m_fReflectRatio( 0.0f )
, m_fReflectRatioMax( 0.0f )
#endif // #ifdef _GAMESERVER
{
m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_114;
AddCallBackType( SB_ONDEFENSEATTACK );
SetValue( szValue );
#ifdef _GAMESERVER
m_fReflectRatio = (float)atof( szValue );
m_fReflectRatioMax = 1.0f;
#endif // #ifdef _GAMESERVER
}
CDnRangeMReflectDamageBlow::~CDnRangeMReflectDamageBlow(void)
{
}
void CDnRangeMReflectDamageBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta )
{
OutputDebug( "CDnRangeMReflectDamageBlow::OnBegin\n" );
}
void CDnRangeMReflectDamageBlow::Process( LOCAL_TIME LocalTime, float fDelta )
{
CDnBlow::Process( LocalTime, fDelta );
}
void CDnRangeMReflectDamageBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta )
{
OutputDebug( "CDnRangeMReflectDamageBlow::OnEnd\n" );
}
#ifdef _GAMESERVER
bool CDnRangeMReflectDamageBlow::OnDefenseAttack( DnActorHandle hActor, CDnState* pAttackerState, CDnDamageBase::SHitParam &HitParam, bool bHitSuccess )
{
if( hActor && pAttackerState &&
CDnActor::PropActor != hActor->GetActorType() &&
CDnDamageBase::DistanceTypeEnum::Range == HitParam.DistanceType &&
1 == HitParam.cAttackType && !hActor->IsDie() )
{
// <20><><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD> <20>߻<EFBFBD>ü<EFBFBD><C3BC> <20><>ų <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> AttackerState <20><> <20>̾Ƽ<CCBE> <20><> <20>Լ<EFBFBD><D4BC><EFBFBD> <20><><EFBFBD>ڷ<EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD>.
//int iMAttackMin = hActor->GetAttackMMin();
//int iMAttackMax = hActor->GetAttackMMax();
int iMAttackMin = pAttackerState->GetAttackMMin();
int iMAttackMax = pAttackerState->GetAttackMMax();
int iReflectDamage = int(GetGaussianRandom( iMAttackMin, iMAttackMax, hActor->GetRoom() ) * m_fReflectRatio * HitParam.fDamage);
// #29810 <20>̽<EFBFBD> <20><><EFBFBD><EFBFBD>.. <20><>Ȯ<EFBFBD><C8AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>н<EFBFBD><D0BD>ϵ<EFBFBD><CFB5><EFBFBD> ó<><C3B3>.
if( iReflectDamage < 0 )
return false;
//////////////////////////////////////////////////////////////////////////
// <20><><EFBFBD>Ӽ<EFBFBD> <20><><EFBFBD>ݷ¸<DDB7>ŭ <20><><EFBFBD><EFBFBD>.
#ifdef PRE_ADD_49660
if( DVINE_PUNISHMENT_SKILL_ID == m_ParentSkillInfo.iSkillID )
{
float fLightElementAttack = m_hActor->GetElementAttack( CDnState::Light );
iReflectDamage += int((float)iReflectDamage * fLightElementAttack);
}
#endif // #ifdef PRE_ADD_49660
#ifdef PRE_FIX_REFLECT_SE_LIMIT
// <20><20><><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD> <20>ִ<EFBFBD>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD>.
CDnState* pState = m_hActor->GetStateStep( 0 );
int iLimit = int((float)pState->GetAttackMMax() * m_fReflectRatioMax);
if( iLimit < iReflectDamage )
iReflectDamage = iLimit;
#endif // #ifdef PRE_FIX_REFLECT_SE_LIMIT
#if defined(PRE_FIX_61382)
DnActorHandle hOwnerActor = CDnActor::GetOwnerActorHandle(hActor);
if (hOwnerActor &&
hOwnerActor->IsDie() == false)
{
hActor->RequestDamageFromStateBlow(GetMySmartPtr(), iReflectDamage);
if (hOwnerActor->IsDie())
hOwnerActor->Die(m_hActor);
}
#else
hActor->RequestDamageFromStateBlow( GetMySmartPtr(), iReflectDamage );
// <20>׾<EFBFBD><D7BE><EFBFBD> üũ
if( hActor->GetHP() <= 0.f )
hActor->Die( m_hActor );
#endif // PRE_FIX_61382
}
return false;
}
#endif
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
void CDnRangeMReflectDamageBlow::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 CDnRangeMReflectDamageBlow::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