DragonNest/Server/DNGameServer/DnBuffPropComponent.cpp

237 lines
15 KiB
C++
Raw Normal View History

2024-12-20 16:56:44 +08:00
<EFBFBD><EFBFBD>#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)
{
// <EFBFBD><EFBFBD><EFBFBD> x<EFBFBD>$<EFBFBD><EFBFBD>ǔ<EFBFBD> a<EFBFBD>0<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>P<EFBFBD> <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;
// <EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> a<EFBFBD>0<EFBFBD> ID <EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> L<EFBFBD>̹ Ǩ<EFBFBD>h<EFBFBD>.
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();
// <EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> a<EFBFBD>0<EFBFBD>.
vector<int> vlhNewActors;
set_difference( setScanActor.begin(), setScanActor.end(),
m_setAffectingActors.begin(), m_setAffectingActors.end(),
back_inserter(vlhNewActors) );
// <EFBFBD>e<EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> a<EFBFBD>0<EFBFBD>.
vector<int> vlhOutActors;
set_difference( m_setAffectingActors.begin(), m_setAffectingActors.end(),
setScanActor.begin(), setScanActor.end(),
back_inserter(vlhOutActors) );
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> a<EFBFBD>0<EFBFBD><EFBFBD>Ō<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>.
bool bUpdated = false;
if( false == vlhNewActors.empty() )
{
vector<int>::iterator iter = vlhNewActors.begin();
for( iter; iter != vlhNewActors.end(); ++iter )
{
// <EFBFBD>П<EFBFBD> <EFBFBD>Ѕ<EFBFBD> ļ\<EFBFBD> <EFBFBD>̬<EFBFBD>h<EFBFBD>. <EFBFBD>ɍ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<EFBFBD> <EFBFBD>l<EFBFBD><EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD>e<EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ř<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>.
// npc <EFBFBD><EFBFBD> <EFBFBD>x<EFBFBD>
DnActorHandle hActor = CDnActor::FindActorFromUniqueID( m_pGameRoom, *iter );
if( hActor && hActor->GetActorType() < CDnActorState::Npc )
{
// <EFBFBD><EFBFBD><EFBFBD> a<EFBFBD>0<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> P<EFBFBD> ID ޹<EFBFBD><EFBFBD> `<EFBFBD><EFBFBD><EFBFBD>̹ <EFBFBD>̬<EFBFBD>\<EFBFBD><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;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD><EFBFBD> Add <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ɍ<EFBFBD> l<EFBFBD><EFBFBD><EFBFBD> x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>̬<EFBFBD> <EFBFBD>.
// t<EFBFBD><EFBFBD><EFBFBD> ActorX<EFBFBD> <EFBFBD>ɍ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> l<EFBFBD><EFBFBD><EFBFBD> x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> l<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> 1<EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD>´<EFBFBD>.
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 ) // <EFBFBD><EFBFBD><EFBFBD> a<EFBFBD>0<EFBFBD> ID <EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> D<EFBFBD>в L<EFBFBD>.
{
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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>X<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>0є<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><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 )
{
// <EFBFBD>@<EFBFBD> <EFBFBD>¬<EFBFBD> ɩ<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>¬<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> U<EFBFBD>`<EFBFBD> <EFBFBD><EFBFBD>l<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<EFBFBD> t<EFBFBD><EFBFBD><EFBFBD> CanApplySkillStateEffect <EFBFBD><EFBFBD><EFBFBD> U<EFBFBD>`<EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD><EFBFBD>. 0<EFBFBD>|<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>0<EFBFBD> <EFBFBD> U<EFBFBD>`<EFBFBD> <EFBFBD><EFBFBD>l<EFBFBD> <EFBFBD>t<EFBFBD><EFBFBD><EFBFBD> U<EFBFBD>x<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>p<EFBFBD>|<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> U<EFBFBD>`<EFBFBD> <EFBFBD><EFBFBD>l<EFBFBD> H<EFBFBD>X<EFBFBD>ij]<EFBFBD> h<EFBFBD><EFBFBD> 8֜<EFBFBD> t<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
bool bAllowAddThisSE = true;
bool bCheckCanBegin = true;
if( CDnSkill::CanApply::ApplyDuplicateSameSkill == eResult )
{
map<int, bool>::iterator iter = mapDuplicateResult.find( pStateEffectInfo->nID );
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ŕ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ֬<EFBFBD> a<EFBFBD>0<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> x<EFBFBD>$<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> J<EFBFBD><<EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>‰<EFBFBD>.
if( mapDuplicateResult.end() != iter )
{
// <EFBFBD>@<EFBFBD> <EFBFBD>¬<EFBFBD>X<EFBFBD> U<EFBFBD>`<EFBFBD><EFBFBD>ǔ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ֬<EFBFBD> x<EFBFBD>$<EFBFBD><EFBFBD>Ǵ<EFBFBD><EFBFBD> CanAdd |<EFBFBD> 8֜<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><ǘ<EFBFBD> <EFBFBD><EFBFBD>(ӈ<EFBFBD>L<EFBFBD>.
// t<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>.
if( false == (iter->second) )
bAllowAddThisSE = false;
else
// t<EFBFBD><EFBFBD><EFBFBD> CanAdd |<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> CmdAddStateEffect 8֜<EFBFBD> <EFBFBD><EFBFBD> 0<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD>l<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> J<EFBFBD>ij]<EFBFBD> t<EFBFBD><EFBFBD><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;
}
// <EFBFBD>e<EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> a<EFBFBD>0<EFBFBD><EFBFBD>Ō<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>p<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();
}