109 lines
No EOL
7.2 KiB
C++
109 lines
No EOL
7.2 KiB
C++
#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 );
|
||
//성공패킷 브로드캐스트
|
||
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; //옵저버인 경우 그냥 리턴
|
||
|
||
//나가는 유저의 리벤지 컨디션 정보 초기화
|
||
SetRevengeTargetSessionID(nSessionID, 0);
|
||
ResetRevengeConditionCount(nSessionID);
|
||
ResetRevengeConditionTarget(nSessionID);
|
||
|
||
//나가는 유저를 리벤지 타겟으로 하는 유저 초기화
|
||
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 |