237 lines
7.9 KiB
C++
237 lines
7.9 KiB
C++
|
|
#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();
|
|||
|
|
}
|