#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(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::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::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>::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>::iterator iter = m_MapRevengeConditions.begin(); for( ; iter != m_MapRevengeConditions.end(); iter++ ) { SAFE_DELETE_MAP(iter->second); } SAFE_DELETE_MAP(m_MapRevengeConditions); } #endif