DragonNest/GameCommon/DnRecoverHPByAttackBlow.cpp

225 lines
5.7 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include "DnRecoverHPByAttackBlow.h"
#if defined(_GAMESERVER)
#include "DnMonsterActor.h"
#endif // _GAMESERVER
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
CDnRecoverHPByAttackBlow::CDnRecoverHPByAttackBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor )
{
m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_248;
SetValue( szValue );
m_fValue = 0.0f;
m_nLimitHP = -1;
std::string str = szValue;//"ȸ<><C8B8><EFBFBD><EFBFBD><><C8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD>";
std::vector<std::string> tokens;
std::string delimiters = ";";
//1. <20><><EFBFBD><EFBFBD>
TokenizeA(str, tokens, delimiters);
int nTokenSize = (int)tokens.size();
if (nTokenSize >= 1)
{
m_fValue = (float)(atof(tokens[0].c_str()));
if (nTokenSize >= 2)
m_nLimitHP = atoi(tokens[1].c_str());
}
else
{
OutputDebug("%s Invalid Value %s\n", __FUNCTION__, szValue);
}
#if defined(_GAMESERVER)
AddCallBackType(SB_ONTARGETHIT);
#endif // _GAMESERVER
}
CDnRecoverHPByAttackBlow::~CDnRecoverHPByAttackBlow(void)
{
}
void CDnRecoverHPByAttackBlow::OnSetParentSkillInfo()
{
#if defined( _GAMESERVER )
CalcHealValueLimit( m_StateBlow.emBlowIndex, m_fValue );
#endif
}
void CDnRecoverHPByAttackBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta )
{
__super::OnBegin(LocalTime, fDelta);
OutputDebug( "%s\n", __FUNCTION__ );
}
void CDnRecoverHPByAttackBlow::Process( LOCAL_TIME LocalTime, float fDelta )
{
__super::Process( LocalTime, fDelta );
}
void CDnRecoverHPByAttackBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta )
{
__super::OnEnd(LocalTime, fDelta);
#if defined(_GAMESERVER)
//<2F><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD>...
//#60311 <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD>Ž<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
//RemoveStateBlowBySkillID(m_ParentSkillInfo.iSkillID);
#endif // _GAMESERVER
OutputDebug( "%s\n", __FUNCTION__);
}
#if defined(_GAMESERVER)
void CDnRecoverHPByAttackBlow::RemoveStateBlowBySkillID(int nSkillID)
{
DNVector(DnBlowHandle) vlBlowList;
FindSkillBlowList(m_hActor, nSkillID, vlBlowList);
int nBlowCount = (int)vlBlowList.size();
for (int n = 0; n < nBlowCount; ++n)
{
DnBlowHandle hBlow = vlBlowList[n];
if (!hBlow)
continue;
// <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> <20><> <20>ϴ°ɷ<C2B0>..(<28><><EFBFBD><EFBFBD>?<3F><> <20><><EFBFBD>ؼ<EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD>.)
CDnSkill::SkillInfo* pSkillInfo = const_cast<CDnSkill::SkillInfo*>(hBlow->GetParentSkillInfo());
if (!pSkillInfo /*|| !pSkillInfo->hSkillUser*/)
continue;
//<2F>ڽſ<DABD><C5BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>..
m_hActor->CmdRemoveStateEffectFromID(hBlow->GetBlowID());
}
}
void CDnRecoverHPByAttackBlow::FindSkillBlowList(DnActorHandle hActor, int nSkillID, DNVector(DnBlowHandle)& vlBlowList)
{
if (!hActor)
return;
int nStateBlowCount = hActor->GetNumAppliedStateBlow();
for (int i = 0; i < nStateBlowCount; ++i)
{
DnBlowHandle hBlow = hActor->GetAppliedStateBlow(i);
if (!hBlow)
continue;
CDnSkill::SkillInfo* pSkillInfo = const_cast<CDnSkill::SkillInfo*>(hBlow->GetParentSkillInfo());
//<2F><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>dzʶ<C7B3>. (<28><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>..(<28><><EFBFBD><EFBFBD>?<3F><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF>)
if (!pSkillInfo /*|| !pSkillInfo->hSkillUser*/)
continue;
if (pSkillInfo->iSkillID == nSkillID)
vlBlowList.push_back(hBlow);
}
}
void CDnRecoverHPByAttackBlow::OnTargetHit( DnActorHandle hTargetActor )
{
CDnDamageBase::SHitParam *pHitParam = NULL;
#if defined(PRE_FIX_59680)
if (hTargetActor)
{
//<2F><>ȯ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̰<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ͱ<EFBFBD> <20>ְ<EFBFBD>, TransmitDamageBlow(51)<29><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> HitParam<61><6D> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
//RequestDamage
if (hTargetActor->IsMonsterActor())
{
CDnMonsterActor* pMonsterActor = dynamic_cast<CDnMonsterActor*>(hTargetActor.GetPointer());
if (pMonsterActor && pMonsterActor->IsSummonedMonster() && pMonsterActor->IsAppliedThisStateBlow(STATE_BLOW::BLOW_051))
{
hTargetActor = pMonsterActor->GetSummonerPlayerActor();
}
}
if (hTargetActor)
pHitParam = hTargetActor->GetHitParam();
}
#else
if (hTargetActor)
pHitParam = hTargetActor->GetHitParam();
#endif // PRE_FIX_59680
INT64 nRecoverHP = 0;
if (pHitParam)
nRecoverHP = (INT64)(m_fValue * pHitParam->nCalcDamage);
if (m_nLimitHP != -1)
{
//<2F><><EFBFBD>Ѱ<EFBFBD><D1B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> HPȸ<50><C8B8> <20>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
if (m_nLimitHP <= 0)
{
OutputDebug("%s HP ȸ<><C8B8> <20><><EFBFBD><EFBFBD>... [%d] - [%d]\n", __FUNCTION__, m_nLimitHP, nRecoverHP);
return;
}
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> HPȸ<50><C8B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȸ<><C8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ѷ<EFBFBD><D1B7><EFBFBD> <20><><EFBFBD><EFBFBD> ȸ<><C8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŭ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (m_nLimitHP >= nRecoverHP)
m_nLimitHP -= nRecoverHP;
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> HPȸ<50><C8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȸ<><C8B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ѷ<EFBFBD><D1B7><EFBFBD> 0<><30><EFBFBD><EFBFBD>, ȸ<><C8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȸ<><C8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
else
{
nRecoverHP = m_nLimitHP;
m_nLimitHP = 0;
//#60311 <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1>ŭ HPȸ<50><C8B8> <20><> <20><><EFBFBD><EFBFBD> HPȸ<50><C8B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD>, <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>.
//<2F><><EFBFBD><EFBFBD> ȸ<><C8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20><>.. <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD>ŵɶ<C5B5> <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
//SetState(STATE_BLOW::STATE_END);
}
}
if (nRecoverHP != 0)
{
//MaxHP<48><50> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD>..
INT64 nMaxHP = m_hActor->GetMaxHP();
INT64 nCurHP = m_hActor->GetHP();
INT64 nTempHP = nCurHP + nRecoverHP;
//MaxHP<48><50> <20>Ѿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ŭ nRecoverHP<48><50> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if (nTempHP > nMaxHP)
nRecoverHP -= (nTempHP - nMaxHP);
if (nRecoverHP > 0)
{
m_hActor->SetHP( m_hActor->GetHP() + nRecoverHP );
m_hActor->RequestHPMPDelta( CDnState::ElementEnum::ElementEnum_Amount, nRecoverHP, UINT_MAX, false, true );
}
}
}
#endif // _GAMESERVER
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
void CDnRecoverHPByAttackBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
szNewValue = szOrigValue;
}
void CDnRecoverHPByAttackBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
szNewValue = szOrigValue;
}
#endif // PRE_ADD_PREFIX_SYSTE_RENEW