#include "stdafx.h" #include "PvPCaptainMode.h" #include "DnPlayerActor.h" #include "DNUserSession.h" #include "DNPvPGameRoom.h" #include "TaskManager.h" #include "DnGameTask.h" #include "DnStateBlow.h" #include "DNMissionSystem.h" CPvPCaptainMode::CPvPCaptainMode( CDNGameRoom* pGameRoom, const TPvPGameModeTable* pPvPGameModeTable, const MAGAPVP_GAMEMODE* pPacket ) :CPvPRoundMode( pGameRoom, pPvPGameModeTable, pPacket ) { } CPvPCaptainMode::~CPvPCaptainMode() { } void CPvPCaptainMode::Process( LOCAL_TIME LocalTime, float fDelta ) { _ProcessSelectCaptain(); CPvPRoundMode::Process( LocalTime, fDelta ); // Playing ÁßÀÏ ¶§ ´ëÀå ³ª°¬´ÂÁö °Ë»ç if( bIsPlaying() ) OnCheckFinishRound( PvPCommon::FinishReason::OpponentCaptainGone ); } void CPvPCaptainMode::OnFinishProcessDie( DnActorHandle hActor ) { if( !bIsPlaying() ) return; if( bIsCaptain( hActor ) ) return; if( !bIsPlayingUser( hActor ) ) return; if( hActor ) { // ¸®½ºÆùÀ§Ä¡ ¼³Á¤ _SetRespawnPosition( hActor ); // ºÎȰ½ÃÅ´ UINT uiRespawnHPPercent = GetPvPGameModeTable() ? GetPvPGameModeTable()->uiRespawnHPPercent : 100; UINT uiRespawnMPPercent = GetPvPGameModeTable() ? GetPvPGameModeTable()->uiRespawnMPPercent : 100; UINT uiImmortalTime = GetPvPGameModeTable() ? GetPvPGameModeTable()->uiRespawnNoDamageTimeSec : 5; char szParam[32]; sprintf_s( szParam, "Coin/%d/%d/%d", uiRespawnHPPercent, uiRespawnMPPercent, uiImmortalTime ); hActor->CmdAddStateEffect( NULL, STATE_BLOW::BLOW_057, uiImmortalTime*1000, szParam ); } } void CPvPCaptainMode::OnCheckFinishRound( PvPCommon::FinishReason::eCode Reason ) { UINT uiWinTeam = PvPCommon::Team::Max; switch( Reason ) { case PvPCommon::FinishReason::TimeOver: { if( m_hCaptain[PvPCommon::TeamIndex::A] && m_hCaptain[PvPCommon::TeamIndex::B] ) { if( m_hCaptain[PvPCommon::TeamIndex::A]->GetHPPercent() > m_hCaptain[PvPCommon::TeamIndex::B]->GetHPPercent() ) uiWinTeam = PvPCommon::Team::A; else if( m_hCaptain[PvPCommon::TeamIndex::A]->GetHPPercent() < m_hCaptain[PvPCommon::TeamIndex::B]->GetHPPercent() ) uiWinTeam = PvPCommon::Team::B; CPvPRoundMode::_ProcessFinishRound( uiWinTeam, Reason ); } return; } case PvPCommon::FinishReason::OpponentCaptainGone: { if( m_hCaptain[PvPCommon::TeamIndex::A] && m_hCaptain[PvPCommon::TeamIndex::B] ) return; else if( m_hCaptain[PvPCommon::TeamIndex::A] && !m_hCaptain[PvPCommon::TeamIndex::B] ) uiWinTeam = PvPCommon::Team::A; else if( !m_hCaptain[PvPCommon::TeamIndex::A] && m_hCaptain[PvPCommon::TeamIndex::B] ) uiWinTeam = PvPCommon::Team::B; CPvPRoundMode::_ProcessFinishRound( uiWinTeam, Reason ); return; } case PvPCommon::FinishReason::OpponentCaptainDead: { if( m_hCaptain[PvPCommon::TeamIndex::A] && m_hCaptain[PvPCommon::TeamIndex::A]->IsDie() ) uiWinTeam = PvPCommon::Team::B; else if( m_hCaptain[PvPCommon::TeamIndex::B] && m_hCaptain[PvPCommon::TeamIndex::B]->IsDie() ) uiWinTeam = PvPCommon::Team::A; else return; // ¼ÓµµÁ¶Àý CDnGameTask *pGameTask = (CDnGameTask *)CTaskManager::GetInstance(GetGameRoom()).GetTask( "GameTask" ); if( pGameTask ) pGameTask->RequestChangeGameSpeed( 0.2f, 3000 ); CPvPRoundMode::_ProcessFinishRound( uiWinTeam, Reason ); return; } } CPvPRoundMode::OnCheckFinishRound( Reason ); } void CPvPCaptainMode::OnFinishRound() { for( UINT i=0 ; iIsPlayerActor() ) { CDnPlayerActor* pPlayer = static_cast(hHitter.GetPointer()); if( pPlayer->GetUserSession() ) pPlayer->GetUserSession()->GetEventSystem()->OnEvent( EventSystem::OnPvPKillCaptain ); } OnCheckFinishRound( PvPCommon::FinishReason::OpponentCaptainDead ); } } void CPvPCaptainMode::OnLeaveUser( DnActorHandle hActor ) { CPvPRoundMode::OnLeaveUser( hActor ); if( hActor ) m_mSelectCaptainCount.erase( hActor->GetSessionID() ); OnCheckFinishRound( PvPCommon::FinishReason::OpponentCaptainGone ); } void CPvPCaptainMode::OnSuccessBreakInto( CDNUserSession* pGameSession ) { CPvPRoundMode::OnSuccessBreakInto( pGameSession ); // ³­ÀÔ À¯Àú¿¡°Ô ´ëÀå Á¤º¸ ¾Ë·ÁÁØ´Ù. if( m_hCaptain[PvPCommon::TeamIndex::A] ) pGameSession->SendPvPSelectCaptain( m_hCaptain[PvPCommon::TeamIndex::A]->GetSessionID(), m_hCaptain[PvPCommon::TeamIndex::A]->GetName() ); if( m_hCaptain[PvPCommon::TeamIndex::B] ) pGameSession->SendPvPSelectCaptain( m_hCaptain[PvPCommon::TeamIndex::B]->GetSessionID(), m_hCaptain[PvPCommon::TeamIndex::B]->GetName() ); } void CPvPCaptainMode::_ProcessSelectCaptain() { // Starting ´Ü°è¿¡¼­¸¸ ´ëÀåÀÌ ¼³Á¤µÈ´Ù. if( !bIsStarting() ) return; for( UINT i=0 ; i vResult; _GetCaptainCandidate( static_cast(PvPCommon::Team::A+i), vResult ); if( vResult.empty() ) continue; m_hCaptain[i] = vResult[_rand(GetGameRoom())%vResult.size()]; if( m_hCaptain[i] ) { _AddCaptainBlow( m_hCaptain[i] ); _UpdateSelectCaptainCount( m_hCaptain[i]->GetSessionID() ); _ASSERT( GetGameRoom()->bIsPvPRoom() ); static_cast(GetGameRoom())->SendSelectCaptain( m_hCaptain[i] ); } } } void CPvPCaptainMode::_AddCaptainBlow( DnActorHandle hActor ) { // ´ëÀå¿¡°Ô ´ëÀå Àü¿ë »óÅÂÈ¿°ú¸¦ °É¾îÁØ´Ù. // ¶ó¿îµå°¡ ³¡³ª¸é »óÅÂÈ¿°ú¸¦ ÇØÁ¦ÇØÁֱ⠶§¹®¿¡ ¿©±â¼­´Â ½Ã°£Àº ¹«ÇÑÀ¸·Î °É¾îÁØ´Ù. //hActor->CmdAddStateEffect( NULL, STATE_BLOW::BLOW_002, -1, "1.0", true ); // 2) ¹°¸® °ø°Ý·Â ºñÀ² hActor->CmdAddStateEffect( NULL, STATE_BLOW::BLOW_050, -1, "1.0", true ); // 50) ÆÄÀ̳Πµ¥¹ÌÁö ºñÀ² º¯°æ. //hActor->CmdAddStateEffect( NULL, STATE_BLOW::BLOW_029, -1, "1.0", true ); // 29) ¸¶¹ý °ø°Ý ºñÀ² hActor->CmdAddStateEffect( NULL, STATE_BLOW::BLOW_058, -1, "0.5", true ); // 58) ÃÖ´ë HP ºñÀ² //hActor->CmdAddStateEffect( NULL, STATE_BLOW::BLOW_059, -1, "0.5", true ); // 59) ÃÖ´ë SP ºñÀ² hActor->GetStateBlow()->Process( 0, 0.f ); hActor->CmdRefreshHPSP( hActor->GetMaxHP(), hActor->GetMaxSP() ); } bool CPvPCaptainMode::bIsCaptain( DnActorHandle hActor ) { if( !hActor ) return false; for( UINT i=0 ; i::iterator itor = m_mSelectCaptainCount.find( uiSessionID ); if( itor != m_mSelectCaptainCount.end() ) { ++(*itor).second; } else { m_mSelectCaptainCount.insert( std::make_pair(uiSessionID,1) ); } } UINT CPvPCaptainMode::_GetSelectCaptainCount( UINT uiSessionID ) { std::map::iterator itor = m_mSelectCaptainCount.find( uiSessionID ); if( itor != m_mSelectCaptainCount.end() ) return (*itor).second; return 0; } void CPvPCaptainMode::_GetCaptainCandidate( PvPCommon::Team::eTeam Team, std::vector& vResult ) { UINT uiMinValue = UINT_MAX; std::vector vCandidate; for( UINT i=0 ; iGetUserCount() ; ++i ) { CDNUserSession* pSession = GetGameRoom()->GetUserData(i); if( !pSession || !pSession->GetActorHandle() ) continue; if( pSession->GetTeam() != Team ) continue; if( !bIsPlayingUser( pSession->GetActorHandle() ) ) continue; UINT uiCount = _GetSelectCaptainCount( pSession->GetSessionID() ); if( uiCount < uiMinValue ) uiMinValue = uiCount; vCandidate.push_back( pSession->GetActorHandle() ); } for( UINT i=0 ; iGetSessionID() ) == uiMinValue ) vResult.push_back( vCandidate[i] ); } }