225 lines
5.7 KiB
C++
225 lines
5.7 KiB
C++
|
|
#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
|