183 lines
5.1 KiB
C++
183 lines
5.1 KiB
C++
|
|
#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
|