#include "SunClientPrecompiledHeader.h" #include "PVPScene.h" #include "NPC.h" #include "ObjectManager.h" #include "hero.h" #include "NPCInfoParser.h" #include "BattleLobby.h" #include "LoadScene.h" #include "uiBattleZoneList/uiBattleZoneList.h" #include "uiBattleZoneCreate/uiBattleZoneCreate.h" #include "ChatDialog.h" #include "UserSlot.h" #include "ProjectileManagerEx.h" #include "PVPManager.h" #include "HeroActionInput.h" #include "BattleScene.h" #include "interfacemanager.h" #include "globalfunc.h" #include "uiBattleScoreMan\uiBattleScoreMan.h" //---------------------------------------------------------------------------- /** */ void PVPScene::ParsePacket( MSG_BASE * pMsg ) { switch ( pMsg->m_byCategory ) { case CG_SYNC: { OnRecvCG_SYNC( pMsg ); } break; case CG_STATUS: { OnRecvCG_STATUS( pMsg ); } break; case CG_PVP: { OnRecvCG_PVP( pMsg ); } break; default: { BattleScene::ParsePacket( pMsg ); } break; } } //---------------------------------------------------------------------------- /** @Remark - !! ´Ü, PVP ÁøÇàÁß¿¡ À¯Àú°¡ µé¾î¿Ã ¼ö ¾ø´Ù. ±âȹÆÀ°ú ³íÀÇµÈ ³»¿ë. */ void PVPScene::OnRecvCG_SYNC( MSG_BASE * pMsg ) { BattleScene::OnRecvCG_SYNC( pMsg ); TCHAR szMessage[INTERFACE_STRING_LENGTH], szText[INTERFACE_STRING_LENGTH]; switch ( pMsg->m_byProtocol ) { case CG_SYNC_PLAYER_ENTER_ACK: { MSG_CG_SYNC_PLAYER_ENTER_ACK * pRecvMsg = (MSG_CG_SYNC_PLAYER_ENTER_ACK *)pMsg; pRecvMsg->Decode(); initPVP(); // À¯Àú¿¡°Ô¼­ PVP Áغñ âÀ» ¶ç¿öÁØ´Ù. // CenterShowMessageBox ±¸Çö // ¾Æ¹« Ű³ª ´­·¯ÁÖ¼¼¿ä.\n // PVP_PRESS_KEY_LEAVE_TIME / 1000 (%d)ÃÊ µ¿¾È ÀÔ·ÂÀÌ ¾øÀ¸¸é ¸¶À»·Î µ¹¾Æ°¡°Ô µË´Ï´Ù. // ¹«Àû ¸ðµå ÄÑÁÜ. if ( g_pHero ) g_pHero->SetInvincible(TRUE); g_HeroInput.SetCannotAttack(TRUE); // ¾Æ¹«Å°³ª ´­·¯¶û. m_bCheckPressAnyKey = TRUE; m_pPressAnykeyDelay->SetTimer(PVP_PRESS_KEY_LEAVE_TIME); // Àӽ÷ΠäÆÃ¿¡´Ù°¡ Ç¥½ÃÇϴ°ÍÀÓ. // ¾Æ¹« Ű³ª ´­·¯ÁÖ¼¼¿ä. const int c_iPressAnyKey = 5606; g_InterfaceManager.GetInterfaceString( c_iPressAnyKey, szMessage, INTERFACE_STRING_LENGTH ); g_InterfaceManager.ShowCenterMessageBox( szMessage, 10000, NULL, FALSE ); DWORD dwTime = PVP_PRESS_KEY_LEAVE_TIME; dwTime /= SEC_PER_TICK; // %ld ÃÊ µ¿¾È ÀÔ·ÂÀÌ ¾øÀ¸¸é ¸¶À»·Î ÀÚµ¿À¸·Î µ¹¾Æ°¡°Ô µË´Ï´Ù. const int c_iNotPressKeyReturn = 5608; g_InterfaceManager.GetInterfaceString( c_iNotPressKeyReturn, szText, INTERFACE_STRING_LENGTH ); Sprintf( szMessage, szText, dwTime ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } break; case CG_SYNC_PLAYER_ENTER_BRD: { MSG_CG_SYNC_PLAYER_ENTER_BRD *pRecvPacket = (MSG_CG_SYNC_PLAYER_ENTER_BRD *)pMsg; PLAYER_RENDER_INFO_EX *pRenderInfo = (PLAYER_RENDER_INFO_EX*)( (BYTE*)(pRecvPacket) + sizeof(MSG_CG_SYNC_PLAYER_ENTER_BRD) ); PLAYER_RENDER_INFO_EX output; // ÃʱâÈ­ ÇÊ¿ä ¾øÀ½. int nSize = PLAYER_RENDER_INFO_EX::ConvertForRecv(pRenderInfo, &output); Player* pPlayer = (Player *)g_ObjectManager.GetObject( output.player_key ); if( !pPlayer ) return; if (g_pHero && g_pHero->GetObjectKey() == output.player_key) { pPlayer->SetInvincible(TRUE); g_HeroInput.SetCannotAttack(TRUE); return; } if(m_PVPManager.CheckLeaveUser(output.player_key)) { pPlayer->SetInvincible(TRUE); } } break; case CG_SYNC_PLAYER_LEAVE_BRD: { MSG_CG_SYNC_PLAYER_LEAVE_BRD * pRecvMsg = (MSG_CG_SYNC_PLAYER_LEAVE_BRD * )pMsg; for (int i = 0; i < pRecvMsg->m_byCount; ++i) { DWORD dwObjectKey = pRecvMsg->m_PlayerKey[i]; this->m_PVPManager.Remove( dwObjectKey ); m_PVPManager.InsertLeaveUser(dwObjectKey); } this->updatePVPInfo(); } break; case CG_SYNC_ALLPLAYERS_CMD: { MSG_CG_SYNC_ALLPLAYERS_CMD * pRecvPacket = (MSG_CG_SYNC_ALLPLAYERS_CMD *)pMsg; // µé¾î¿Í ÀÖ´ø³ðµé ¸ðµÎ ¹«Àû ¸ðµå BYTE * pPacket = ( (BYTE*)(pRecvPacket) + sizeof(MSG_CG_SYNC_ALLPLAYERS_CMD) ); PLAYER_RENDER_INFO_EX * pRenderInfo = NULL; ETC_STATE_TOTAL_INFO *pShield = NULL; VENDOR_RENDER_INFO * pVendorInfo = NULL; uiBattleScoreMan* battle_score_manager_ptr = static_cast(g_InterfaceManager.GetUserInterfaceManager(UIMAN_BATTLE_SCORE)); for (int i = 0; i < pRecvPacket->m_byCount; i++) { pRenderInfo = (PLAYER_RENDER_INFO_EX *)pPacket; PLAYER_RENDER_INFO_EX output; // ÃʱâÈ­ ÇÊ¿ä ¾øÀ½. int nSize = PLAYER_RENDER_INFO_EX::ConvertForRecv(pRenderInfo, &output); pShield = (ETC_STATE_TOTAL_INFO*)( (BYTE*)(pPacket) + nSize ); pVendorInfo = (VENDOR_RENDER_INFO *)( (BYTE*)(pShield) + pShield->GetSize() ); if (g_pHero) { if (g_pHero->GetObjectKey() == output.player_key) { assert(!"Hero°¡ ALLPLAYER_CMD¿¡ ¿Ô´Ù!"); pPacket += GetPlayerSize(pPacket,nSize); continue; } } // ¹«Àû ¸ðµå ÄÑÁÜ. Player * pPlayer = (Player *)g_ObjectManager.GetObject( output.player_key ); if (pPlayer) { if(m_PVPManager.CheckLeaveUser(output.player_key)) { pPlayer->SetInvincible(TRUE); } } pPlayer->SetMarketTitle(pVendorInfo->m_tszVendorTitle, pVendorInfo->m_byTitleLength); pPacket += GetPlayerSize(pPacket,nSize); } this->updatePVPInfo(); } break; } } //---------------------------------------------------------------------------- /** */ void PVPScene::OnRecvCG_STATUS( MSG_BASE * pMsg ) { BattleScene::OnRecvCG_STATUS( pMsg ); switch ( pMsg->m_byProtocol ) { case CG_STATUS_RESURRECTION_BRD: { MSG_CG_STATUS_RESURRECTION_BRD * pRecvMsg = (MSG_CG_STATUS_RESURRECTION_BRD *)pMsg; // ¿©±â¼± ¹«Àû Ç÷¹±×¸¦ ¼ÂÇØÁØ´Ù. Player * pPlayer = (Player * )g_ObjectManager.GetObject( pRecvMsg->m_dwObjectKey ); if ( !pPlayer ) { return; } // ¹«Àû¸ðµå pPlayer->SetInvincible( TRUE ); m_PVPManager.SetUserState(pRecvMsg->m_dwObjectKey,TRUE); if (g_pHero && (g_pHero->GetObjectKey() == pRecvMsg->m_dwObjectKey)) { g_HeroInput.SetCannotAttack( TRUE ); } } break; case CG_STATUS_DEAD_BRD : { MSG_CG_STATUS_DEAD_BRD *pRecvPacket = (MSG_CG_STATUS_DEAD_BRD *)pMsg; DWORD dwKey = pRecvPacket->m_dwObjectKey; // ´©±¸ WzVector deadPos = pRecvPacket->m_wvCurPos; EXPTYPE exp = pRecvPacket->m_i64Exp; Player * pPlayer = (Player *)g_ObjectManager.GetObject(dwKey); if( pPlayer ) { // ¹«Àû ¸ðµå pPlayer->SetInvincible( TRUE ); pPlayer->SetExp( exp ); if (g_pHero && pPlayer == g_pHero) { g_HeroInput.SetCannotAttack( TRUE ); // ³»°¡ Á×¾úÀ»¶§ PVP ÀÎÆ÷ âÀ» ¿­¾îÁØ´Ù. showPVPInfoDialog(); } } m_PVPManager.SetUserState(dwKey,TRUE); } break; default: break; } } //---------------------------------------------------------------------------- /** */ void PVPScene::OnRecvCG_PVP( MSG_BASE * pMsg ) { TCHAR szMessage[INTERFACE_STRING_LENGTH], szText[INTERFACE_STRING_LENGTH]; switch ( pMsg->m_byProtocol ) { case CG_PVP_INFO_CMD: { MSG_CG_PVP_INFO_CMD * pRecvMsg = (MSG_CG_PVP_INFO_CMD *)pMsg; if ( g_pHero ) g_pHero->SetTeam(pRecvMsg->m_Team); for ( int i = 0; i < pRecvMsg->m_Count; ++i ) { GlobalFunc::DebugOutputMsg( eOUTPUT_MSG_OUPUT_DEBUG, _T("[PVP << CG_PVP_INFO_CMD] : %ld Team\n"), pRecvMsg->m_Team ); // µî·ÏÇϰí this->m_PVPManager.Add( pRecvMsg->m_Info[i].m_dwPlayerKey ); // ÆÀÁ¤º¸ ¼Â PVPPlayerInfo PVPInfo; PVPInfo.iTeam = pRecvMsg->m_Info[i].m_Team; this->m_PVPManager.ModifyPVPInfo( pRecvMsg->m_Info[i].m_dwPlayerKey, &PVPInfo); // ÆÀÀü Check if ( PVPInfo.iTeam > 0 ) { m_PVPManager.SetTeamPlay(TRUE); } Player * pPlayer = (Player * )g_ObjectManager.GetObject( pRecvMsg->m_Info[i].m_dwPlayerKey ); if ( !pPlayer ) { assert(0); continue; } pPlayer->SetTeam( pRecvMsg->m_Info[i].m_Team ); GlobalFunc::DebugOutputMsg( eOUTPUT_MSG_OUPUT_DEBUG, _T("[PVP << MSG_CG_PVP_INFO_CMD] : %d Key, %d Team\n" ), pPlayer->GetObjectKey(), pPlayer->GetTeam()); } } break; case CG_PVP_INFO_BRD: { MSG_CG_PVP_INFO_BRD * pRecvMsg = (MSG_CG_PVP_INFO_BRD *)pMsg; GlobalFunc::DebugOutputMsg( eOUTPUT_MSG_OUPUT_DEBUG, _T("[PVP << MSG_CG_PVP_INFO_BRD] : %ld User Key \n") , pRecvMsg->m_dwPlayerKey); // ÆÀÁ¤º¸ ¼Â PVPPlayerInfo PVPInfo; BOOL bGetPVPInfo = this->m_PVPManager.GetPVPInfo( pRecvMsg->m_dwPlayerKey, &PVPInfo); if (!bGetPVPInfo) { // ¿©±ä ³ªÁß¿¡ µé¾î¿À´Â ³à¼®ÀϰŴÙ. this->m_PVPManager.Add(pRecvMsg->m_dwPlayerKey); } PVPInfo.iTeam = pRecvMsg->m_Team; this->m_PVPManager.ModifyPVPInfo( pRecvMsg->m_dwPlayerKey, &PVPInfo); Player * pPlayer = (Player * )g_ObjectManager.GetObject( pRecvMsg->m_dwPlayerKey ); if ( !pPlayer ) { GlobalFunc::DebugOutputMsg( eOUTPUT_MSG_OUPUT_DEBUG, _T("[PVP << MSG_CG_PVP_INFO_BRD:error] : %ld Key Ç÷¹À̾ ¾ø´Ù\n"), pRecvMsg->m_dwPlayerKey); return; } pPlayer->SetTeam( pRecvMsg->m_Team ); } break; case CG_PVP_PRESS_KEY_ACK: { MSG_CG_PVP_PRESS_KEY_ACK * pRecvMsg = (MSG_CG_PVP_PRESS_KEY_ACK *)pMsg; BIT_REMOVE(this->m_packetStatus, PVP_PACKET_STATUS_PRESS_KEY); m_bCheckPressAnyKey = FALSE; // ´ëÀü ÁغñÁß... const int c_iReadyPVP = 5612; g_InterfaceManager.GetInterfaceString( c_iReadyPVP, szMessage, INTERFACE_STRING_LENGTH ); g_InterfaceManager.ShowCenterMessageBox( szMessage, 10000, NULL, FALSE ); } break; case CG_PVP_PRESS_KEY_NAK: { MSG_CG_PVP_PRESS_KEY_NAK * pRecvMsg = (MSG_CG_PVP_PRESS_KEY_NAK *)pMsg; pRecvMsg->m_byErrorCode; BIT_REMOVE(this->m_packetStatus, PVP_PACKET_STATUS_PRESS_KEY); } break; case CG_PVP_MATCHLESS_MODE_START_CMD: // Àڽſ¡°Ô¸¸ ¿À´Â ÆÐŶ { MSG_CG_PVP_MATCHLESS_MODE_START_CMD * pRecvMsg = (MSG_CG_PVP_MATCHLESS_MODE_START_CMD *)pMsg; GlobalFunc::DebugOutputMsg( eOUTPUT_MSG_OUPUT_DEBUG, _T("[PVP << CG_PVP_MATCHLESS_MODE_START_CMD] : ƯÁ¤ ½Ã°£ ÈÄ ´ëÀüÀÌ ½ÃÀ۵ȴÙ.\n") ); if(g_pHero) g_pHero->SetInvincible( TRUE ); g_HeroInput.SetCannotAttack( TRUE ); //PVP_MATCHLESSS_DELAY_TIME m_pStartMatchDelay->SetTimer( PVP_MATCHLESSS_DELAY_TIME ); // TODO : ÀÌ»Ú°Ô È­¸é¿¡ º¸¿©ÁÖ´Â°Í Ã³¸®ÇؾßÇÑ´Ù. DWORD dwDelayTick = PVP_MATCHLESSS_DELAY_TIME; dwDelayTick /= SEC_PER_TICK; // %ld ÃÊ ÈÄ¿¡ ´ëÀüÀÌ ½ÃÀ۵˴ϴÙ. const int c_iStartPVP = 5609; g_InterfaceManager.GetInterfaceString( c_iStartPVP, szText, INTERFACE_STRING_LENGTH ); Sprintf( szMessage, szText, dwDelayTick); updatePVPInfo(); GlobalFunc::OutputMsg_Notice( eOUTPUT_MSG_CENTER_SHOW, szMessage ); GlobalFunc::OutputMsg_Notice( eOUTPUT_MSG_CHAT, szMessage ); } break; case CG_PVP_MATCH_MODE_FIRST_START_CMD: // óÀ½ ½ÃÀÛÇÒ¶§ ¿À´Â ÆÐŶ { MSG_CG_PVP_MATCH_MODE_FIRST_START_CMD * pRecvMsg = (MSG_CG_PVP_MATCH_MODE_FIRST_START_CMD *)pMsg; GlobalFunc::DebugOutputMsg( eOUTPUT_MSG_OUPUT_DEBUG, _T("[PVP << CG_PVP_MATCH_MODE_FIRST_START_CMD]\n") ); // ¹«Àû ¸ðµå ÇØÁ¦ this->UnInvincibleToAllUser(); m_PVPManager.SetAllUserState(FALSE); g_HeroInput.SetCannotAttack(FALSE); g_HeroInput.SetAutoAttack(FALSE); // ´ëÀü ½ÃÀÛ!!! const int c_iLetsPVP = 5613; g_InterfaceManager.GetInterfaceString( c_iLetsPVP, szMessage, INTERFACE_STRING_LENGTH ); g_InterfaceManager.ShowCenterMessageBox( szMessage, 10000, NULL, FALSE ); } break; case CG_PVP_MATCH_MODE_START_CMD: { MSG_CG_PVP_MATCH_MODE_START_CMD * pRecvMsg = (MSG_CG_PVP_MATCH_MODE_START_CMD *)pMsg; GlobalFunc::DebugOutputMsg( eOUTPUT_MSG_OUPUT_DEBUG, _T("[PVP << CG_PVP_MATCH_MODE_FIRST_START_CMD]\n") ); assert(g_pHero); if (g_pHero) { g_pHero->SetInvincible(FALSE); } g_HeroInput.SetCannotAttack(FALSE); g_HeroInput.SetAutoAttack(FALSE); // TODO : ÀÌ»Ú°Ô È­¸é¿¡ º¸¿©ÁÖ´Â°Í Ã³¸®ÇؾßÇÑ´Ù. // ´ëÀü ½ÃÀÛ!!! const int c_iLetsPVP = 5613; g_InterfaceManager.GetInterfaceString( c_iLetsPVP, szMessage, INTERFACE_STRING_LENGTH ); g_InterfaceManager.ShowCenterMessageBox( szMessage, 10000, NULL, FALSE ); } break; case CG_PVP_MATCH_MODE_START_BRD: // ³ª¸¦ Á¦¿ÜÇÑ { MSG_CG_PVP_MATCH_MODE_START_BRD * pRecvMsg = (MSG_CG_PVP_MATCH_MODE_START_BRD * )pMsg; Player * pPlayer = (Player *)g_ObjectManager.GetObject( pRecvMsg->m_dwPlayerKey ); if (pPlayer) { pPlayer->SetInvincible(FALSE); // %s ´ÔÀÌ ´ëÀü °¡´É »óÅÂÀÔ´Ï´Ù. const int c_iNameCanPVP = 5607; g_InterfaceManager.GetInterfaceString( c_iNameCanPVP, szText, INTERFACE_STRING_LENGTH ); Sprintf( szMessage, szText, pPlayer->GetName() ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); GlobalFunc::DebugOutputMsg( eOUTPUT_MSG_OUPUT_DEBUG, _T("[PVP << MSG_CG_PVP_MATCH_MODE_START_BRD] : %s\n"), szMessage ); } m_PVPManager.SetUserState(pRecvMsg->m_dwPlayerKey,FALSE); } break; // ÇöÀç´Â ³»Á¡¼ö¸¸ ¹Þ´Â´Ù.( ±âȹÀû ³íÀÇ ÇÊ¿ä ) case CG_PVP_SCORE_CMD: { MSG_CG_PVP_SCORE_CMD * pRecvMsg = (MSG_CG_PVP_SCORE_CMD *)pMsg; if ( g_pHero ) { PVPPlayerInfo TempPVPInfo; TempPVPInfo.Score = pRecvMsg->m_Score; this->m_PVPManager.ModifyPVPInfo(g_pHero->GetObjectKey(), &TempPVPInfo); // %ld ÀÇ Á¡¼ö¸¦ ȹµæ ÇÏ¿´½À´Ï´Ù. const int c_iGetPVPScore = 5610; g_InterfaceManager.GetInterfaceString( c_iGetPVPScore, szText, INTERFACE_STRING_LENGTH ); Sprintf(szMessage, szText, pRecvMsg->m_Score); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); } this->updatePVPInfo(); } break; case CG_PVP_RESULT_BRD: { MSG_CG_PVP_RESULT_BRD * pRecvMsg = (MSG_CG_PVP_RESULT_BRD *)pMsg; PVPPlayerInfo TempPVPInfo; GlobalFunc::DebugOutputMsg( eOUTPUT_MSG_OUPUT_DEBUG, _T("[PVP << MSG_CG_PVP_RESULT_BRD] : KillerKey(%ld), DierKey(%ld)\n"), pRecvMsg->m_KillerKey, pRecvMsg->m_DierKey); // Á×ÀΠȽ¼ö °è»ê Object * pKillObject = g_ObjectManager.GetObject( pRecvMsg->m_KillerKey ); assert(pKillObject); if ( pKillObject ) { if (g_pHero && (g_pHero->GetObjectKey() == pRecvMsg->m_KillerKey)) { if ( g_HeroInput.GetCurrentTarget() == pRecvMsg->m_DierKey ) { // »ó´ë¹æÀÌ ±ú¾î³µÀ»¶§ ¹Ù·Î ¿ÀÅä ¾îÅØµÈ »óŶó¸é ¿ÀÅä ¾îÅØ Ç®¾îÁØ´Ù. g_HeroInput.SetAutoAttack(FALSE); } } TempPVPInfo.KillCount++; this->m_PVPManager.ModifyPVPInfo( pRecvMsg->m_KillerKey, &TempPVPInfo); } else { assert( pKillObject ); } // Á×Àº Ƚ¼ö °è»ê Object * pDeadObject = g_ObjectManager.GetObject( pRecvMsg->m_DierKey ); assert(pDeadObject); if ( pDeadObject ) { TempPVPInfo.Init(); TempPVPInfo.DeadCount++; this->m_PVPManager.ModifyPVPInfo(pRecvMsg->m_DierKey, &TempPVPInfo); if (pDeadObject->GetObjectKey() == g_pHero->GetObjectKey()) { this->showPVPInfoDialog(); } } else { assert( pDeadObject ); } if (pKillObject && pDeadObject) { // [%s]´Ô²²¼­ [%s]´Ô ¿¡°Ô¼­ ų¼ö¸¦ ȹµæ Çß½À´Ï´Ù. const int c_iGetPVPKillNumber = 5614; g_InterfaceManager.GetInterfaceString( c_iGetPVPKillNumber, szText, INTERFACE_STRING_LENGTH ); Sprintf(szMessage, szText, pKillObject->GetName(), pDeadObject->GetName() ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT,szMessage); } updatePVPInfo(); } break; case CG_PVP_END_BRD:// PVP ³¡³µ´Ù. { MSG_CG_PVP_END_BRD * pRecvMsg = (MSG_CG_PVP_END_BRD *)pMsg; updatePVPInfo(); // Á¡¼ö °Ô½ÃÆÇÀ» º¸¿©ÁÖÀÚ. this->showPVPInfoDialog(); // ¸ðµç ´ëÀü À¯ÀúµéÀ» ´ëÀü ºÒ´É »óÅ·Π¸¸µé¾î ³õ´Â´Ù. this->InvincibleToAllUser(); // ´ëÀü Á¾·á!!! const int c_iEndPVP = 5614; g_InterfaceManager.GetInterfaceString( c_iEndPVP, szMessage, INTERFACE_STRING_LENGTH ); g_InterfaceManager.ShowCenterMessageBox( szMessage, 10000, NULL, FALSE ); // 5ÃÊ ÈÄ ¸¶À»·Î µ¹¾Æ°¡°Ô ÇØµÎÀÚ. #ifdef _GS_GSP_TEAM_PVP_MSG m_PVPManager.ShowWinTeamMessage(); #endif//_GS_GSP_TEAM_PVP_MSG } break; } }