DragonNest/Server/DNGameServer/RevengeSystem.cpp

109 lines
3.5 KiB
C++
Raw Permalink Normal View History

#include "Stdafx.h"
#if defined(PRE_ADD_REVENGE)
#include "RevengeSystem.h"
#include "DNPvPGameRoom.h"
#include "DNUserSession.h"
#include "PvPGameMode.h"
CRevengeSystem::CRevengeSystem(CPvPGameMode* pGameMode) : m_pGameMode(pGameMode)
{
}
CRevengeSystem::~CRevengeSystem()
{
ResetAllRevengeConditionCount();
SAFE_DELETE_MAP(m_MapRevengeTarget);
}
bool CRevengeSystem::CheckRevenge( CDNUserSession *pGameSession, CDNUserSession *pHitterSession )
{
if( !pGameSession || !pHitterSession )
return false;
if( GetRevengeTargetSessionID(pGameSession->GetSessionID()) <= 0)
{
int nCount = IncreaseRevengeConditionCount(pGameSession->GetSessionID(), pHitterSession->GetSessionID());
if(nCount >= Revenge::RevengeConditionCount)
{
SetRevengeTargetSessionID(pGameSession->GetSessionID(), pHitterSession->GetSessionID());
ResetRevengeConditionCount(pGameSession->GetSessionID());
pGameSession->SendPvPSetRevengeTarget( pGameSession->GetSessionID(), pHitterSession->GetSessionID(), Revenge::TargetReason::SetNewRevengeTarget);
pGameSession->GetEventSystem()->OnEvent( EventSystem::OnSetRevengeTarget );
}
}
if( GetRevengeTargetSessionID(pHitterSession->GetSessionID()) == pGameSession->GetSessionID() )
{
SetRevengeTargetSessionID(pHitterSession->GetSessionID(), 0);
pHitterSession->SendPvPSetRevengeTarget( pHitterSession->GetSessionID(), 0, Revenge::TargetReason::SuccessRevenge );
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŷ <20><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3>Ʈ
static_cast<CDNPvPGameRoom*>(pHitterSession->GetGameRoom())->BroadcastRevengeSuccess( pHitterSession->GetSessionID(), pGameSession->GetSessionID() );
return true;
}
return false;
}
void CRevengeSystem::LeaveUser(UINT nSessionID)
{
CDNUserSession * pLeaveUserSession = m_pGameMode->GetGameRoom()->GetUserSession(nSessionID);
if( pLeaveUserSession && pLeaveUserSession->GetTeam() == PvPCommon::Team::Observer )
return; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
SetRevengeTargetSessionID(nSessionID, 0);
ResetRevengeConditionCount(nSessionID);
ResetRevengeConditionTarget(nSessionID);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
std::map<UINT,UINT>::iterator iter = m_MapRevengeTarget.begin();
for( ; iter != m_MapRevengeTarget.end() ; iter++ )
{
if( iter->second == nSessionID )
{
SetRevengeTargetSessionID(iter->first, 0);
CDNUserSession * pSession= m_pGameMode->GetGameRoom()->GetUserSession(iter->first);
if( pSession )
pSession->SendPvPSetRevengeTarget(iter->first, 0, Revenge::TargetReason::TargetLeaveGame);
}
}
}
int CRevengeSystem::IncreaseRevengeConditionCount(UINT nSessionID, UINT nTargetSessionID)
{
std::map<UINT,int>::iterator iter = m_MapRevengeConditions[nSessionID].find(nTargetSessionID);
if( iter == m_MapRevengeConditions[nSessionID].end() )
m_MapRevengeConditions[nSessionID][nTargetSessionID] = 0;
return ++m_MapRevengeConditions[nSessionID][nTargetSessionID];
}
void CRevengeSystem::ResetRevengeConditionCount(UINT nSessionID)
{
m_MapRevengeConditions[nSessionID].clear();
}
void CRevengeSystem::ResetRevengeConditionTarget(UINT nSessionID)
{
std::map<UINT,std::map<UINT,int>>::iterator iter = m_MapRevengeConditions.begin();
for( ; iter != m_MapRevengeConditions.end(); iter++ )
{
if( iter->second.find(nSessionID) != iter->second.end() )
(iter->second)[nSessionID] = 0;
}
}
void CRevengeSystem::ResetAllRevengeConditionCount()
{
std::map<UINT,std::map<UINT,int>>::iterator iter = m_MapRevengeConditions.begin();
for( ; iter != m_MapRevengeConditions.end(); iter++ )
{
SAFE_DELETE_MAP(iter->second);
}
SAFE_DELETE_MAP(m_MapRevengeConditions);
}
#endif