DragonNest/Server/DNGameServer/DnBuffPropComponent.cpp

237 lines
7.9 KiB
C++
Raw Permalink Normal View History

#include "StdAfx.h"
#include "DnBuffPropComponent.h"
#include "DnActor.h"
#include "SMScanActor.h"
#include "boost/shared_ptr.hpp"
#include "DnMonsterActor.h"
CDnBuffPropComponent::CDnBuffPropComponent(void) : m_iTargetTeamType( -1 ), m_iMyTeam( -1 ), m_pGameRoom(NULL)
{
}
CDnBuffPropComponent::~CDnBuffPropComponent(void)
{
// <20><><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7>ִ<EFBFBD> <20><><EFBFBD>͵<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
set<int>::iterator iter = m_setAffectingActors.begin();
for( iter; iter != m_setAffectingActors.end(); ++iter )
{
DnActorHandle hActor = CDnActor::FindActorFromUniqueID( m_pGameRoom, *iter );
if( hActor )
{
map<int, vector<int> >::iterator iterMap = m_mapAppliedStateEffect.find( hActor->GetUniqueID() );
if( m_mapAppliedStateEffect.end() != iterMap )
{
const vector<int>& vlThisPropSEIDs = iterMap->second;
int iNumIDs = (int)vlThisPropSEIDs.size();
for( int i = 0; i < iNumIDs; ++i )
hActor->CmdRemoveStateEffectFromID( vlThisPropSEIDs.at(i) );
}
}
}
}
void CDnBuffPropComponent::Initialize( CMultiRoom* pRoom, int iTargetTeamType, int iSkillID,
int iSkillLevel, const set<int>* pSetTargetActorIDs/* = NULL*/ )
{
m_SkillComponent.Initialize( iSkillID, iSkillLevel );
m_pGameRoom = pRoom;
m_iTargetTeamType = iTargetTeamType;
// <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ư<><C6AF> <20><><EFBFBD><EFBFBD> ID <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȿ<EFBFBD><C8BF>.
if( pSetTargetActorIDs )
{
_ASSERT( 3 == m_iTargetTeamType );
m_setTargetActorIDs = *pSetTargetActorIDs;
}
}
void CDnBuffPropComponent::OnMessage( const boost::shared_ptr<IStateMessage>& pMessage )
{
const boost::shared_ptr<CSMScanActor> pScanActorMsg = boost::static_pointer_cast<CSMScanActor>(pMessage);
set<int> setScanActor = pScanActorMsg->GetScanActorSet();
// <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>.
vector<int> vlhNewActors;
set_difference( setScanActor.begin(), setScanActor.end(),
m_setAffectingActors.begin(), m_setAffectingActors.end(),
back_inserter(vlhNewActors) );
// <20>ٱ<EFBFBD><D9B1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
vector<int> vlhOutActors;
set_difference( m_setAffectingActors.begin(), m_setAffectingActors.end(),
setScanActor.begin(), setScanActor.end(),
back_inserter(vlhOutActors) );
// <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> ȿ<><C8BF> <20>߰<EFBFBD>.
bool bUpdated = false;
if( false == vlhNewActors.empty() )
{
vector<int>::iterator iter = vlhNewActors.begin();
for( iter; iter != vlhNewActors.end(); ++iter )
{
// Ÿ<><C5B8> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD>. <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>س<EFBFBD><D8B3><EFBFBD> <20>ٱ<EFBFBD><D9B1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEB3AA> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// npc <20><> <20><><EFBFBD><EFBFBD>
DnActorHandle hActor = CDnActor::FindActorFromUniqueID( m_pGameRoom, *iter );
if( hActor && hActor->GetActorType() < CDnActorState::Npc )
{
// Ư<><C6AF> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> ID <20>´<EFBFBD> <20>ֵ鸸 ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
bool bTargetActor = false;
if( 3 == m_iTargetTeamType )
{
if( m_setTargetActorIDs.end() != m_setTargetActorIDs.find(hActor->GetClassID()) )
{
bTargetActor = true;
}
}
else
{
bTargetActor = true;
}
if( false == bTargetActor )
continue;
// <20><><EFBFBD><EFBFBD><EFBFBD>̻<EFBFBD> Add <20>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> ó<><C3B3> <20>ʿ<EFBFBD>.
// <20>ش<EFBFBD> Actor<6F><72> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>̻<EFBFBD> <20>߰<EFBFBD> <20><>Ŵ.
map<int, bool> mapDuplicateResult;
const CDnSkill::SkillInfo& HasSkillInfo = m_SkillComponent.GetSkillInfo();
CDnSkill::CanApply eResult = CDnSkill::CanApplySkillStateEffect( &HasSkillInfo, hActor, HasSkillInfo.iSkillID, HasSkillInfo.iLevel,
HasSkillInfo.iSkillDuplicateMethod,
HasSkillInfo.iDuplicateCount, mapDuplicateResult );
if( CDnSkill::CanApply::Fail != eResult )
{
vector<int> vlAddedSEIDs;
int iNumStateEffect = m_SkillComponent.GetNumStateEffect();
for( int iStateEffect = 0; iStateEffect < iNumStateEffect; ++iStateEffect )
{
int iActorType = hActor->GetActorType();
const CDnSkill::StateEffectStruct* pStateEffectInfo = m_SkillComponent.GetStateEffectInfo( iStateEffect );
bool bCheckTeam = false;
if( 3 != m_iTargetTeamType ) // Ư<><C6AF> <20><><EFBFBD><EFBFBD> ID <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> <20><>.
{
if( -1 != m_iMyTeam )
{
bCheckTeam = (2 == m_iTargetTeamType) || // all
(m_iTargetTeamType == 0 && (m_iMyTeam == hActor->GetTeam()) ) || // friend
(m_iTargetTeamType == 1 && (m_iMyTeam != hActor->GetTeam()) ); // enemy
}
else
{
// #45096 <20>÷<EFBFBD><C3B7>̾ <20><>ȯ<EFBFBD><C8AF> <20><><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD>.
if( hActor->IsMonsterActor() )
{
CDnMonsterActor* pMonsterActor = static_cast<CDnMonsterActor*>(hActor.GetPointer());
DnActorHandle hSummonerPlayer = pMonsterActor->GetSummonerPlayerActor();
if( hSummonerPlayer )
iActorType = hSummonerPlayer->GetActorType();
}
bCheckTeam = (2 == m_iTargetTeamType) || // all
(m_iTargetTeamType == 0 && iActorType <= CDnActorState::Reserved6 || iActorType == CDnActorState::Vehicle ) || // player
(m_iTargetTeamType == 1 && iActorType > CDnActorState::Reserved6 ); // monster
}
}
else
{
bCheckTeam = true;
}
if( bCheckTeam )
{
// <20><><EFBFBD><EFBFBD> <20><>ų <20><>ø<EFBFBD><C3B8> <20><><EFBFBD><20><>ų ȿ<><C8BF> <20>߿<EFBFBD> Ȯ<><C8AE> üũ<C3BC>ϴ<EFBFBD> <20>͵<EFBFBD><CDB5><EFBFBD> <20>̹<EFBFBD> CanApplySkillStateEffect <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>üũ<C3BC>ǰ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>⼱ Ȯ<><C8AE> üũ <20>Ȱ<EFBFBD><C8B0><EFBFBD> Ȯ<><C8AE><EFBFBD>ϰ<EFBFBD> <20>ȰŶ<C8B0><C5B6><EFBFBD> <20>ٽ<EFBFBD> Ȯ<><C8AE> üũ <20><><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>Լ<EFBFBD> ȣ<><C8A3> <20><><EFBFBD>ش<EFBFBD>.
bool bAllowAddThisSE = true;
bool bCheckCanBegin = true;
if( CDnSkill::CanApply::ApplyDuplicateSameSkill == eResult )
{
map<int, bool>::iterator iter = mapDuplicateResult.find( pStateEffectInfo->nID );
// <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>߰<EFBFBD> <20><>ƾ <20><><EFBFBD><EFBFBD>.
if( mapDuplicateResult.end() != iter )
{
// <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> Ȯ<><C8AE><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7>־ CanAdd <20><> ȣ<><C8A3><EFBFBD>غ<EFBFBD><D8BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <20>̷<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
if( false == (iter->second) )
bAllowAddThisSE = false;
else
// <20>̹<EFBFBD> CanAdd <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̹Ƿ<CCB9> CmdAddStateEffect ȣ<><C8A3> <20><> <20><><EFBFBD><EFBFBD> üũ<C3BC><C5A9><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
bCheckCanBegin = false;
}
}
int iID = hActor->CmdAddStateEffect( &m_SkillComponent.GetSkillInfo(), (STATE_BLOW::emBLOW_INDEX)pStateEffectInfo->nID,
-1, pStateEffectInfo->szValue.c_str(), false, bCheckCanBegin );
if( -1 != iID )
vlAddedSEIDs.push_back( iID );
}
}
if( false == vlAddedSEIDs.empty() )
m_mapAppliedStateEffect.insert( make_pair(hActor->GetUniqueID(), vlAddedSEIDs) );
}
}
}
bUpdated = true;
}
// <20>ٱ<EFBFBD><D9B1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> ȿ<><C8BF> <20><><EFBFBD><EFBFBD>.
if( false == vlhOutActors.empty() )
{
vector<int>::iterator iter = vlhOutActors.begin();
for( iter; iter != vlhOutActors.end(); ++iter )
{
DnActorHandle hActor = CDnActor::FindActorFromUniqueID( m_pGameRoom, *iter );
if( hActor && hActor->GetActorType() < CDnActorState::Npc )
{
map<int, vector<int> >::iterator iterMap = m_mapAppliedStateEffect.find( hActor->GetUniqueID() );
if( m_mapAppliedStateEffect.end() != iterMap )
{
const vector<int>& vlThisPropSEIDs = iterMap->second;
int iNumIDs = (int)vlThisPropSEIDs.size();
for( int i = 0; i < iNumIDs; ++i )
hActor->CmdRemoveStateEffectFromID( vlThisPropSEIDs.at(i) );
m_mapAppliedStateEffect.erase( iterMap );
}
}
}
bUpdated = true;
}
if( bUpdated )
m_setAffectingActors = setScanActor;
}
void CDnBuffPropComponent::RemoveAffectedStateEffects( void )
{
set<int>::iterator iter = m_setAffectingActors.begin();
for( iter; iter != m_setAffectingActors.end(); ++iter )
{
map<int, vector<int> >::iterator iterMap = m_mapAppliedStateEffect.find( *iter );
if( m_mapAppliedStateEffect.end() != iterMap )
{
DnActorHandle hActor = CDnActor::FindActorFromUniqueID( m_pGameRoom, *iter );
if( hActor )
{
vector<int>& vlBlowsToRemove = iterMap->second;
for( int i = 0; i < (int)vlBlowsToRemove.size(); ++i )
{
int iBlowID = vlBlowsToRemove.at( i );
hActor->CmdRemoveStateEffectFromID( iBlowID );
}
}
}
}
m_setAffectingActors.clear();
m_mapAppliedStateEffect.clear();
}