DragonNest/GameCommon/DnComboDamageLimitBlow.cpp

183 lines
5.1 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include "DnComboDamageLimitBlow.h"
#include "DnProjectile.h"
#if !defined( USE_BOOST_MEMPOOL )
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
#endif // #if !defined( USE_BOOST_MEMPOOL )
/*
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ش<EFBFBD> <EFBFBD><EFBFBD>ų <EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Hit<EFBFBD>ñ׳ο<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>߰<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ϰ<EFBFBD>
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> hit<EFBFBD>ñ׳ο<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> szSkipStateBlows<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȿ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <EFBFBD>ٽ<EFBFBD> <EFBFBD>߰<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ؾ<EFBFBD> <EFBFBD>Ѵ<EFBFBD>..
*/
CDnComboDamageLimitBlow::CDnComboDamageLimitBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor )
{
m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_242;
SetValue( szValue );
m_fValue = 0.0f;
std::string str = szValue;//"<22><><EFBFBD><EFBFBD> Hit<69><74>;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ(0.1 => 10%)";
std::vector<std::string> tokens;
std::string delimiters = ";";
//1. <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
TokenizeA(str, tokens, delimiters);
if (2 == tokens.size())
{
m_nHitLimitCount = atoi( tokens[0].c_str() );
m_fDamageRate = (float)atof(tokens[1].c_str());
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>? <20><><EFBFBD><EFBFBD>..
if (m_nHitLimitCount == 0)
{
m_nHitLimitCount = -1;
m_fDamageRate = -1.0f;
}
}
else
{
//<2F><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20>Ѵ<EFBFBD>.
m_nHitLimitCount = -1;
m_fDamageRate = -1.0f;
OutputDebug("%s Invalid Value!!!!\n", __FUNCTION__);
}
m_bActivated = false;
m_SkillStartTime = 0;
#if defined(_GAMESERVER)
AddCallBackType(SB_ONCALCDAMAGE);
#endif // _GAMESERVER
}
CDnComboDamageLimitBlow::~CDnComboDamageLimitBlow(void)
{
}
void CDnComboDamageLimitBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta )
{
OutputDebug( "%s\n", __FUNCTION__);
}
void CDnComboDamageLimitBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta )
{
OutputDebug( "%s <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> %d\n", __FUNCTION__, m_SkillStartTime);
}
void CDnComboDamageLimitBlow::Process( LOCAL_TIME LocalTime, float fDelta )
{
__super::Process(LocalTime, fDelta);
#if defined(_GAMESERVER)
if (m_ParentSkillInfo.hSkillUser)
{
//<2F><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
DnSkillHandle hSkill = m_ParentSkillInfo.hSkillUser->FindSkill(m_ParentSkillInfo.iSkillID);
if (hSkill && hSkill->IsFinished() && hSkill->GetProjectileCount(m_SkillStartTime) == 0)
{
#ifdef PRE_FIX_REMOVE_STATE_EFFECT_PACKET
#else
m_hActor->SendRemoveStateEffectFromID(GetBlowID());
#endif
m_StateBlow.fDurationTime = 0.0f;
SetState(STATE_BLOW::STATE_END);
}
}
#endif // _GAMESERVER
}
#if defined(_GAMESERVER)
float CDnComboDamageLimitBlow::OnCalcDamage( float fOriginalDamage, CDnDamageBase::SHitParam& HitParam )
{
float fDamage = 0.0f;
//<2F>߻<EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD> <20><>Ʈ <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>...
LOCAL_TIME projectileSkillStartTime = 0;
CDnProjectile* pProjectile = NULL;
if (HitParam.bFromProjectile && HitParam.hWeapon)
pProjectile = static_cast<CDnProjectile*>( HitParam.hWeapon.GetPointer() );
//<2F>߻<EFBFBD>ü<EFBFBD><C3BC> <20><>ų <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD>ƾ<EFBFBD> <20>Ѵ<EFBFBD>..
if (pProjectile)
projectileSkillStartTime = pProjectile->GetSkillStartTime();
//<2F><>ų <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD> <20><><EFBFBD><EFBFBD> Hitter<65><72> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>Ѵ<EFBFBD>..
bool bSameHitter = false;
if (m_ParentSkillInfo.hSkillUser && HitParam.hHitter &&
m_ParentSkillInfo.hSkillUser == HitParam.hHitter &&
m_SkillStartTime == projectileSkillStartTime)
bSameHitter = true;
// m_bActivated<65><64> Ȱ<><C8B0>ȭ <20>Ǿ<EFBFBD> <20>ְ<EFBFBD>, <20><><EFBFBD><EFBFBD> Hitter<65><72> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (m_bActivated == true && bSameHitter)
{
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 100, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0.3(30%)<29>ΰ<EFBFBD><CEB0><EFBFBD>
//100 - (1.0 - 0.3) = 70
//-70<37><30>ŭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 30<33><30>ŭ<EFBFBD><C5AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
fDamage = -(fOriginalDamage * (1.0f - m_fDamageRate));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD> <20>Ȱ<EFBFBD><C8B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20><>.
if (m_nHitLimitCount == -1 && m_fDamageRate == -1.0f)
fDamage = 0.0f;
}
return fDamage;
}
void CDnComboDamageLimitBlow::UpdateHitCount(CDnSkill::SkillInfo* pSkillInfo, CDnDamageBase::SHitParam& HitParam)
{
if (pSkillInfo)
{
//<2F>߻<EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD> <20><>Ʈ <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>...
LOCAL_TIME projectileSkillStartTime = 0;
CDnProjectile* pProjectile = NULL;
if (HitParam.bFromProjectile && HitParam.hWeapon)
pProjectile = static_cast<CDnProjectile*>( HitParam.hWeapon.GetPointer() );
//<2F>߻<EFBFBD>ü<EFBFBD><C3BC> <20><>ų <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD>ƾ<EFBFBD> <20>Ѵ<EFBFBD>..
if (pProjectile)
projectileSkillStartTime = pProjectile->GetSkillStartTime();
//<2F><>ų <20><><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>츸 HitCount<6E><74><EFBFBD><EFBFBD>
if (pSkillInfo->hSkillUser && pSkillInfo->hSkillUser == m_ParentSkillInfo.hSkillUser &&
pSkillInfo->iSkillID == m_ParentSkillInfo.iSkillID &&
pSkillInfo->iLevel == m_ParentSkillInfo.iLevel &&
m_SkillStartTime == projectileSkillStartTime)
{
if (m_bActivated == false && m_nHitLimitCount >= 0)
{
m_nHitLimitCount--;
if (m_nHitLimitCount <= 0)
{
m_bActivated = true;
m_nHitLimitCount = 0;
}
}
}
}
}
#endif // _GAMESERVER
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
void CDnComboDamageLimitBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
szNewValue = szOrigValue;
}
void CDnComboDamageLimitBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
szNewValue = szOrigValue;
}
#endif // PRE_ADD_PREFIX_SYSTE_RENEW