Files
2022-10-26 12:25:11 +08:00

230 lines
6.5 KiB
C++

#include "Stdafx.h"
#ifdef _NA_008012_20150130_RANKING_SYSTEM
#include "RankingSystemCtl.h"
#include "GameRoom.h"
#include "Player.h"
#include "GameRankingManager.h"
#ifdef _NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR
#include "BattleGroundRankingManager.h"
#endif //_NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR
RankingSystemCtl::RankingSystemCtl()
{
m_pGameRoom = NULL;
#ifdef _NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR
battleground_ranking_manager = NULL;
#endif //_NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR
}
VOID RankingSystemCtl::OnCreate( GameRoom* pGameRoom )
{
ASSERT(!m_pGameRoom);
m_pGameRoom = pGameRoom;
m_RankingType = g_GameRankingMgr.GetRankingType( m_pGameRoom->GetMapCode() );
m_MissionRecordMgr.OnCreate();
m_MissionPointMgr.OnCreate();
#ifdef _NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR
if (m_RankingType >= eRANKING_TYPE_BATTLEGROUND_WIN)
{
battleground_ranking_manager = new BattleGroundRankingManager();
}
#endif //_NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR
}
VOID RankingSystemCtl::OnDestroy()
{
m_MissionRecordMgr.OnDestroy();
m_MissionPointMgr.OnDestroy();
#ifdef _NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR
if(m_RankingType >= eRANKING_TYPE_BATTLEGROUND_WIN)
{
SAFE_DELETE(battleground_ranking_manager);
}
#endif //_NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR
m_pGameRoom = NULL;
m_RankingType = eRANKING_TYPE_NONE;
}
VOID RankingSystemCtl::JoinRoom( Player * pPlayer, MAPCODE MapCode )
{
switch( m_RankingType )
{
case eRANKING_TYPE_TIME_ATTACK:
m_MissionRecordMgr.StartMission( MapCode );
m_MissionRecordMgr.SendElapesedTime( pPlayer );
break;
case eRANKING_TYPE_POINT:
m_MissionPointMgr.JoinPlayer( pPlayer, MapCode );
break;
#ifdef _NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR
case eRANKING_TYPE_BATTLEGROUND_WIN:
case eRANKING_TYPE_BATTLEGROUND_KILL:
case eRANKING_TYPE_BATTLEGROUND_ASSIST:
battleground_ranking_manager->EnterPlayer(pPlayer, MapCode);
break;
#endif //_NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR
}
pPlayer->SetRankingSystemCtl( this );
}
VOID RankingSystemCtl::LeaveRoom( Player * pPlayer)
{
// 전장랭킹의 경우엔 SetRankingSystemCtl을 BattleGroundLeaveRoom에서 해주도록한다.
// 다른 경우엔 LeaveRoom에서 한다
switch( m_RankingType )
{
case eRANKING_TYPE_TIME_ATTACK:
pPlayer->SetRankingSystemCtl( NULL );
break;
case eRANKING_TYPE_POINT:
m_MissionPointMgr.LeavePlayer( pPlayer, m_pGameRoom->GetMapCode() );
pPlayer->SetRankingSystemCtl( NULL );
break;
}
}
#ifdef _NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR
VOID RankingSystemCtl::BattleGroundLeaveRoom( Player * pPlayer, const BattleRecorder::Record* record ,
bool battleground_is_win)
{
switch( m_RankingType )
{
case eRANKING_TYPE_BATTLEGROUND_WIN:
case eRANKING_TYPE_BATTLEGROUND_KILL:
case eRANKING_TYPE_BATTLEGROUND_ASSIST:
battleground_ranking_manager->BattleGround_LeavePlayer(pPlayer, m_pGameRoom->GetMapCode(),
record, battleground_is_win);
break;
}
pPlayer->SetRankingSystemCtl( NULL );
}
#endif //_NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR
//KEYWORD SHOGEN WILL MODIFY
VOID RankingSystemCtl::KillMonster( eNPC_GRADE grade, GameZone * pZone )
{
// (NOTE) 애초 죽일 때마다 이런 식으로 계산해야 하는가? 의미 전~혀 없다.
// - 일단은 한 번이라도 줄이자.
// From. 창현 - 랭킹 or 포인트 매니저도 생성시 둘중 하나만 가져도 된다. 몬스터 테이블도 생성 시 한번만 가지게 하면 된다.
// 왜 이렇게 했는가? 신입에다가 남겨진 문서는 없고 시퀀스 다이어그램 조차 없다. 분석할 시간조차 없다.
// 대부분의 구조가 파악 된다면 2개의 매니저중 하나를 메모리 풀에서 할당하도록 수정하겠다.
const MAPCODE mapCode = m_pGameRoom->GetMapCode();
switch( m_RankingType )
{
case eRANKING_TYPE_TIME_ATTACK:
m_MissionRecordMgr.KillMonster( grade, pZone );
break;
case eRANKING_TYPE_POINT:
m_MissionPointMgr.KillMonster( grade, pZone, g_GameRankingMgr.GetPointRankingIndex( mapCode ) );
break;
}
}
VOID RankingSystemCtl::ClearMission( GameZone * pZone )
{
switch( m_RankingType )
{
case eRANKING_TYPE_TIME_ATTACK:
m_MissionRecordMgr.ClearMission( pZone );
break;
}
}
/*
VOID RankingSystemCtl::SendElapesedTime( Player * pPlayer )
{
//타임어택 적용?
if( m_pGameRoom->GetMAPINFO()->bTimeAttack )
{
m_MissionRecordMgr.SendElapesedTime( pPlayer );
}
}
*/
VOID RankingSystemCtl::UpdateClearTime( Player * pPlayer )
{
switch( m_RankingType )
{
case eRANKING_TYPE_TIME_ATTACK:
m_MissionRecordMgr.UpdateClearTime( pPlayer );
break;
}
}
VOID RankingSystemCtl::UpdateClearTimeParty( GameZone * pZone )
{
switch( m_RankingType )
{
case eRANKING_TYPE_TIME_ATTACK:
m_MissionRecordMgr.UpdateClearTimeParty( pZone );
break;
}
}
#ifdef _NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR
VOID RankingSystemCtl::SetPlayerPoint( USERGUID UserGUID, DWORD Point, RANKINGKEY DBKey, RANKINGTYPE ranking_type /*= 0*/ )
{
switch( ranking_type )
{
case eRANKING_TYPE_POINT:
m_MissionPointMgr.SetPlayerPoint( UserGUID, Point, DBKey );
break;
case eRANKING_TYPE_BATTLEGROUND_WIN:
case eRANKING_TYPE_BATTLEGROUND_KILL:
case eRANKING_TYPE_BATTLEGROUND_ASSIST:
battleground_ranking_manager->SetPlayerPoint(UserGUID, Point, DBKey, ranking_type);
break;
}
}
#else
VOID RankingSystemCtl::SetPlayerPoint( USERGUID UserGUID, DWORD Point, RANKINGKEY DBKey )
{
switch( m_RankingType )
{
case eRANKING_TYPE_POINT:
m_MissionPointMgr.SetPlayerPoint( UserGUID, Point, DBKey );
break;
}
}
#endif //_NA_006801_20130814_RENEWAL_RANKINGSYSTEM_MINOR
// (SpecialCmd) 타락한 사원용 최종 정산 처리 목적
// - 타락한 사원용 처리 방법 (KillMonster는 호출되지 않는다. 최종 계산된 값을 통해 일괄 처리된다.)
VOID
RankingSystemCtl::SetLastSettleAccount(
Player* const pPlayer
, const WORD totalPoint
)
{
sPOLICY_ZONE& rPolicyment = m_pGameRoom->Policyment;
if( !(rPolicyment.FIELD & rPolicyment.ENABLE_SSQ_CONTROL) )
return;
const MAPCODE mapCode = m_pGameRoom->GetMapCode();
switch( m_RankingType )
{
case eRANKING_TYPE_POINT:
m_MissionPointMgr.SetLastSettleAccount(
pPlayer
, mapCode
, g_GameRankingMgr.GetPointRankingIndex( mapCode ), totalPoint
);
break;
}
}
//_NA_001990_ACSYSTEM_ADD
WORD RankingSystemCtl::GetMissionClearTime()
{
return (WORD)(m_MissionRecordMgr.GetMissionClearTime() / 1000);
}
#endif // _NA_008012_20150130_RANKING_SYSTEM