2024-12-21 10:04:04 +08:00
# 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 ( ) ;
}