DragonNest/GameCommon/DnStealBuffBlow.cpp

387 lines
11 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include "DnStealBuffBlow.h"
#include "DnSkill.h"
#if !defined( USE_BOOST_MEMPOOL )
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
#endif // #if !defined( USE_BOOST_MEMPOOL )
CDnStealBuffBlow::CDnStealBuffBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor )
{
m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_174;
SetValue( szValue );
m_nCount = 0;
m_nNewDelayTime = 0;
m_fScanRange = 0.0f;
std::string str = szValue;//"<22><><EFBFBD><EFBFBD>;<3B><><EFBFBD>ӽð<D3BD>(ms(10000 == 1<><31>))";
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 (3 == tokens.size())
{
m_nCount = atoi( tokens[0].c_str() );
m_nNewDelayTime = atoi( tokens[1].c_str() );
m_fScanRange = (float)atof(tokens[2].c_str());
}
else
OutputDebug("%s Invalid value!!!\n", __FUNCTION__);
}
CDnStealBuffBlow::~CDnStealBuffBlow(void)
{
}
void CDnStealBuffBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta )
{
__super::OnBegin(LocalTime, fDelta);
#if defined(_GAMESERVER)
StealBuffProcess(LocalTime);
#endif // _GAMESERVER
}
void CDnStealBuffBlow::Process( LOCAL_TIME LocalTime, float fDelta )
{
__super::Process(LocalTime, fDelta);
}
void CDnStealBuffBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta )
{
__super::OnEnd(LocalTime, fDelta);
}
#if defined(_GAMESERVER)
void CDnStealBuffBlow::FindSkillBlowList(DnActorHandle hActor, int skillID, DNVector(DnBlowHandle)& vlBlowList)
{
if (!hActor)
return;
int nStateBlowCount = hActor->GetNumAppliedStateBlow();
for (int i = 0; i < nStateBlowCount; ++i)
{
DnBlowHandle hBlow = hActor->GetAppliedStateBlow(i);
//StealBuff<66≯<EFBFBD> <20>dzʶ<C7B3>.
if (!hBlow || STATE_BLOW::BLOW_174 == hBlow->GetBlowIndex())
continue;
//<2F><><EFBFBD><EFBFBD>ȭ <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF>
if (STATE_BLOW::BLOW_073 == hBlow->GetBlowIndex())
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 == skillID)
vlBlowList.push_back(hBlow);
}
}
void CDnStealBuffBlow::StealBuffProcess()
{
if (m_nCount <= 0) return;
if (!m_hActor) return;
if (!m_ParentSkillInfo.hSkillUser)
return;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD> Blow <20><><EFBFBD><EFBFBD>Ʈ
DNVector(DnBlowHandle) vlRemoveBlowList;
typedef std::map<int, int> SKILL_ID_LIST;
SKILL_ID_LIST skillList;
int nLoopCount = m_nCount;
int nStateBlowCount = m_hActor->GetNumAppliedStateBlow();
//1. <20><>ų ID<49><44> <20><><EFBFBD><EFBFBD>
for (int i = 0; i < nStateBlowCount; ++i)
{
DnBlowHandle hBlow = m_hActor->GetAppliedStateBlow(i);
//StealBuff<66≯<EFBFBD> <20>dzʶ<C7B3>.
if (!hBlow || STATE_BLOW::BLOW_174 == hBlow->GetBlowIndex())
continue;
//<2F><><EFBFBD><EFBFBD>ȭ <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF>
if (STATE_BLOW::BLOW_073 == hBlow->GetBlowIndex())
continue;
//<2F><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ų<EFBFBD> buff<66><66> <20>ƴϸ<C6B4> <20>dzʶ<C7B3>.
CDnSkill::SkillInfo* pSkillInfo = const_cast<CDnSkill::SkillInfo*>(hBlow->GetParentSkillInfo());
if (!pSkillInfo || CDnSkill::DurationTypeEnum::Buff != pSkillInfo->eDurationType )
continue;
//<2F><>Ƽ<EFBFBD><C6BC> <20><>ų<EFBFBD><C5B3>..
if (CDnSkill::Active != pSkillInfo->eSkillType)
continue;
skillList.insert(SKILL_ID_LIST::value_type(pSkillInfo->iSkillID, pSkillInfo->iSkillID));
}
//2. <20><>ų<EFBFBD><C5B3> <20>ο<EFBFBD><CEBF><EFBFBD> Blow<6F><77> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD>ο<EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD> blow<6F>ο<EFBFBD>
SKILL_ID_LIST::iterator iter = skillList.begin();
SKILL_ID_LIST::iterator endIter = skillList.end();
for (; iter != endIter; ++iter)
{
if (nLoopCount == 0)
break;
//<2F>ش<EFBFBD> <20><>ų<EFBFBD><C5B3> blow<6F><77><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>´<EFBFBD>..
DNVector(DnBlowHandle) vlSkillBlowList;
FindSkillBlowList(m_hActor, iter->first, vlSkillBlowList);
int nBlowCount = (int)vlSkillBlowList.size();
for (int n = 0; n < nBlowCount; ++n)
{
DnBlowHandle hBlow = vlSkillBlowList[n];
if (!hBlow)
continue;
CDnSkill::SkillInfo* pSkillInfo = const_cast<CDnSkill::SkillInfo*>(hBlow->GetParentSkillInfo());
if (!pSkillInfo || !pSkillInfo->hSkillUser)
continue;
//<2F><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD> <20><>ų <20>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20>´<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>dzʶ<C7B3>
DnSkillHandle hSkill = pSkillInfo->hSkillUser->FindSkill(pSkillInfo->iSkillID);
if (!hSkill)
continue;
//Ư<><C6AF> <20><><EFBFBD><20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (CDnWeapon::EquipTypeEnum_Amount == hSkill->GetNeedEquipType(0) &&
CDnWeapon::EquipTypeEnum_Amount == hSkill->GetNeedEquipType(1))
{
//<2F><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>..
m_ParentSkillInfo.hSkillUser->CmdAddStateEffect(pSkillInfo, hBlow->GetBlowIndex(), m_nNewDelayTime, hBlow->GetValue(), false, false);
}
}
nLoopCount--;
}
}
void CDnStealBuffBlow::StealBuffProcess(LOCAL_TIME LocalTime)
{
DNVector(DnActorHandle) VecList;
m_hActor->ScanActor( m_hActor->GetRoom(), *m_hActor->GetPosition(), m_fScanRange, VecList );
for( DWORD i=0; i<VecList.size(); i++ ) {
if( !VecList[i] || !VecList[i]->IsHittable( m_hActor, LocalTime, NULL ) )
continue;
if (VecList[i]->GetTeam() == m_hActor->GetTeam())
continue;
StealBuffFromActor(VecList[i]);
}
}
void CDnStealBuffBlow::StealBuffFromActor( DnActorHandle hTargetActor )
{
if (m_nCount <= 0) return;
if (!m_hActor) return;
//<2F>鿪 ó<><C3B3>...
if (!hTargetActor || hTargetActor->IsImmuned(m_StateBlow.emBlowIndex)) return;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD> Blow <20><><EFBFBD><EFBFBD>Ʈ
DNVector(DnBlowHandle) vlRemoveBlowList;
typedef std::map<int, int> SKILL_ID_LIST;
SKILL_ID_LIST skillList;
int nLoopCount = m_nCount;
int nStateBlowCount = hTargetActor->GetNumAppliedStateBlow();
//1. <20><>ų ID<49><44> <20><><EFBFBD><EFBFBD>
for (int i = 0; i < nStateBlowCount; ++i)
{
DnBlowHandle hBlow = hTargetActor->GetAppliedStateBlow(i);
//StealBuff<66≯<EFBFBD> <20>dzʶ<C7B3>.
if (!hBlow || STATE_BLOW::BLOW_174 == hBlow->GetBlowIndex())
continue;
//<2F><><EFBFBD><EFBFBD>ȭ <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF>
if (STATE_BLOW::BLOW_073 == hBlow->GetBlowIndex())
continue;
//<2F><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ų<EFBFBD> buff<66><66> <20>ƴϸ<C6B4> <20>dzʶ<C7B3>.
CDnSkill::SkillInfo* pSkillInfo = const_cast<CDnSkill::SkillInfo*>(hBlow->GetParentSkillInfo());
if (!pSkillInfo || CDnSkill::DurationTypeEnum::Buff != pSkillInfo->eDurationType )
continue;
//<2F><>Ƽ<EFBFBD><C6BC> <20><>ų<EFBFBD><C5B3>..
if (CDnSkill::Active != pSkillInfo->eSkillType)
continue;
skillList.insert(SKILL_ID_LIST::value_type(pSkillInfo->iSkillID, pSkillInfo->iSkillID));
}
//2. <20><>ų<EFBFBD><C5B3> <20>ο<EFBFBD><CEBF><EFBFBD> Blow<6F><77> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD>ο<EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD> blow<6F>ο<EFBFBD>
SKILL_ID_LIST::iterator iter = skillList.begin();
SKILL_ID_LIST::iterator endIter = skillList.end();
for (; iter != endIter; ++iter)
{
if (nLoopCount == 0)
break;
//<2F>ش<EFBFBD> <20><>ų<EFBFBD><C5B3> blow<6F><77><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>´<EFBFBD>..
DNVector(DnBlowHandle) vlSkillBlowList;
FindSkillBlowList(hTargetActor, iter->first, vlSkillBlowList);
int nBlowCount = (int)vlSkillBlowList.size();
for (int n = 0; n < nBlowCount; ++n)
{
DnBlowHandle hBlow = vlSkillBlowList[n];
if (!hBlow)
continue;
// [2011/03/30 semozz]
// <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><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (pSkillInfo->hSkillUser)
{
//<2F><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><>ų <20>˻<EFBFBD>..
DnSkillHandle hSkill = pSkillInfo->hSkillUser->FindSkill(pSkillInfo->iSkillID);
//<2F><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>dzʶ<C7B3>..
if (!hSkill)
continue;
//<2F>˻<EFBFBD><CBBB><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ư<><C6AF> <20><><EFBFBD><20>ʿ<EFBFBD><CABF><EFBFBD> <20>ϴ<EFBFBD> <20><>ų<EFBFBD≯<EFBFBD> <20>dz<EFBFBD> <20><>
if (CDnWeapon::EquipTypeEnum_Amount != hSkill->GetNeedEquipType(0) ||
CDnWeapon::EquipTypeEnum_Amount != hSkill->GetNeedEquipType(1))
continue;
}
//<2F>ڽſ<DABD><C5BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>..
m_hActor->ReserveStealMagicBuff(hTargetActor, pSkillInfo, m_nNewDelayTime, hBlow->GetBlowIndex(), hBlow->GetValue());
}
nLoopCount--;
}
}
#endif // _GAMESERVER
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
void CDnStealBuffBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
//<2F>Ľ̿<C4BD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
std::vector<string> vlTokens[2];
string strArgument[2];
//<2F>ʿ<EFBFBD><CABF><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
int nCount[2] = {0, };
int nNewDelayTime[2] = {0, };
float fScanRange[2] = {0.0f, };
//////////////////////////////////////////////////////////////////////////
//ù<><C3B9>° <20><><EFBFBD>ڿ<EFBFBD> <20>Ľ<EFBFBD>.
strArgument[0] = szOrigValue;
TokenizeA( strArgument[0], vlTokens[0], ";" );
if( vlTokens[0].size() == 3 )
{
nCount[0] = atoi( vlTokens[0][0].c_str() );
nNewDelayTime[0] = atoi( vlTokens[0][1].c_str() );
fScanRange[0] = (float)atof( vlTokens[0][2].c_str() );
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//<2F>ι<EFBFBD>° <20><><EFBFBD>ڿ<EFBFBD> <20>Ľ<EFBFBD>
strArgument[1] = szAddValue;
TokenizeA( strArgument[1], vlTokens[1], ";" );
if( vlTokens[1].size() == 3 )
{
nCount[1] = atoi( vlTokens[1][0].c_str() );
nNewDelayTime[1] = atoi( vlTokens[1][1].c_str() );
fScanRange[1] = (float)atof( vlTokens[1][2].c_str() );
}
//////////////////////////////////////////////////////////////////////////
//<2F><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
int nResultCount = nCount[0] + nCount[1];
int nResultDelayTime = max(nNewDelayTime[0], nNewDelayTime[1]);
float fResultScanRange = max(fScanRange[0], fScanRange[1]);
sprintf_s(szBuff, "%d;%d;%f", nResultCount, nResultDelayTime, fResultScanRange);
szNewValue = szBuff;
}
void CDnStealBuffBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
//<2F>Ľ̿<C4BD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
std::vector<string> vlTokens[2];
string strArgument[2];
//<2F>ʿ<EFBFBD><CABF><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
int nCount[2] = {0, };
int nNewDelayTime[2] = {0, };
float fScanRange[2] = {0.0f, };
//////////////////////////////////////////////////////////////////////////
//ù<><C3B9>° <20><><EFBFBD>ڿ<EFBFBD> <20>Ľ<EFBFBD>.
strArgument[0] = szOrigValue;
TokenizeA( strArgument[0], vlTokens[0], ";" );
if( vlTokens[0].size() == 3 )
{
nCount[0] = atoi( vlTokens[0][0].c_str() );
nNewDelayTime[0] = atoi( vlTokens[0][1].c_str() );
fScanRange[0] = (float)atof( vlTokens[0][2].c_str() );
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//<2F>ι<EFBFBD>° <20><><EFBFBD>ڿ<EFBFBD> <20>Ľ<EFBFBD>
strArgument[1] = szAddValue;
TokenizeA( strArgument[1], vlTokens[1], ";" );
if( vlTokens[1].size() == 3 )
{
nCount[1] = atoi( vlTokens[1][0].c_str() );
nNewDelayTime[1] = atoi( vlTokens[1][1].c_str() );
fScanRange[1] = (float)atof( vlTokens[1][2].c_str() );
}
//////////////////////////////////////////////////////////////////////////
//<2F><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
int nResultCount = nCount[0] - nCount[1];
int nResultDelayTime = min(nNewDelayTime[0], nNewDelayTime[1]);
float fResultScanRange = min(fScanRange[0], fScanRange[1]);
sprintf_s(szBuff, "%d;%d;%f", nResultCount, nResultDelayTime, fResultScanRange);
szNewValue = szBuff;
}
#endif // PRE_ADD_PREFIX_SYSTE_RENEW