#include "StdAfx.h" #include "DnDLGameTask.h" #include "DNGameDataManager.h" #include "DnWorld.h" #include "GameSendPacket.h" #include "DnDLPartyTask.h" #include "DnDropItem.h" #include "DNEventSystem.h" #include "DNDLGameRoom.h" #include "DNLogConnection.h" #include "ItemRespawnLogic.h" #include "EtWorldSector.h" #include "EtWorldEventControl.h" #include "DNMasterConnectionManager.h" #include "MasterRewardSystem.h" #if defined(PRE_ADD_STAGECLEAR_TIMECHECK) #include "DNDBConnection.h" #endif // #if defined(PRE_ADD_STAGECLEAR_TIMECHECK) CDnDLGameTask::CDnDLGameTask( CMultiRoom *pRoom ) : CDnGameTask( pRoom ) { m_nGameTaskType = GameTaskType::DarkLair; m_nTotalRound = 0; m_nCurrentRound = 0; #if defined( PRE_ADD_CHALLENGE_DARKLAIR ) m_bChallengeDarkLair = false; #endif // #if defined( PRE_ADD_CHALLENGE_DARKLAIR ) memset( &m_CurrentRankInfo, 0, sizeof(m_CurrentRankInfo) ); m_pItemRespawnLogic = new CDLItemRespawnLogic(static_cast(pRoom)); m_bCheckDungeonClear = false; m_ChallengeResponseEnum = Response_None; #ifdef PRE_MOD_DARKLAIR_RECONNECT m_bBossRound = false; #endif // PRE_MOD_DARKLAIR_RECONNECT } CDnDLGameTask::~CDnDLGameTask() { SAFE_DELETE( m_pItemRespawnLogic ); } void CDnDLGameTask::Process( LOCAL_TIME LocalTime, float fDelta ) { m_pItemRespawnLogic->Process( fDelta ); CDnGameTask::Process( LocalTime, fDelta ); } bool CDnDLGameTask::PostInitializeStage( int nRandomSeed ) { bool bResult = CDnGameTask::PostInitializeStage( nRandomSeed ); if( !bResult ) return false; return true; } void CDnDLGameTask::ResetRound( bool bMakeQueryData ) { const TDLMapData *pData = g_pDataManager->GetDLMapData( m_nMapTableID ); if( pData == NULL ) return; m_nCurrentRound = 0; m_nTotalRound = pData->nTotalRound; #if defined( PRE_ADD_CHALLENGE_DARKLAIR ) m_bChallengeDarkLair = pData->bChallengeDarkLair; #endif // #if defined( PRE_ADD_CHALLENGE_DARKLAIR ) // ·©Å· Äõ¸® Áغñ if( bMakeQueryData ) { ((CDNDLGameRoom*)GetRoom())->MakeRankQueryData(); m_CurrentRankInfo.nRank = -1; m_CurrentRankInfo.nPlayRound = 1; m_CurrentRankInfo.nPlaySec = 0; if( GetRoom()->GetStartMemberCount() == 1 && wcslen( GetRoom()->GetPartyName() ) < 1 && GetRoom()->GetUserData(0) ) { WCHAR wszTempName[256] = {0, }; #if defined(PRE_ADD_MULTILANGUAGE) //ÆÄƼÀ̸§ÂÊÀº ÀÏ´Ü µðÆúÆ® ¾ð¾î·Î swprintf_s( wszTempName, GetEtUIXML().GetUIString( CEtUIXML::idCategory1, 3416, MultiLanguage::eDefaultLanguage ), GetRoom()->GetUserData(0)->GetStatusData()->wszCharacterName ); #else //#if defined(PRE_ADD_MULTILANGUAGE) swprintf_s( wszTempName, GetEtUIXML().GetUIString( CEtUIXML::idCategory1, 3416 ), GetRoom()->GetUserData(0)->GetStatusData()->wszCharacterName ); #endif //#if defined(PRE_ADD_MULTILANGUAGE) _wcscpy(m_CurrentRankInfo.wszPartyName, PARTYNAMELENMAX, wszTempName, (int)wcslen(wszTempName)); } else { // ÆÄƼÀ̸§¿¡ %s %d ÀÌ Æ÷Ç﵃ °æ¿ì invalid param error ¹ß»ýÇÏ¿© wcscpy ·Î ´ëü. _wcscpy( m_CurrentRankInfo.wszPartyName, _countof(m_CurrentRankInfo.wszPartyName), GetRoom()->GetPartyName(), (int)wcslen(GetRoom()->GetPartyName()) ); //swprintf_s( m_CurrentRankInfo.wszPartyName, GetRoom()->GetPartyName() ); } m_CurrentRankInfo.cPartyUserCount = (char)GetRoom()->GetUserCount(); for( int i=0; iGetLevel(); m_CurrentRankInfo.Info[i].nJobIndex = pSession->GetUserJob(); swprintf_s( m_CurrentRankInfo.Info[i].wszCharacterName, pSession->GetCharacterName() ); } } } void CDnDLGameTask::SetStartRound( int iRound ) { m_nCurrentRound = iRound; m_nTotalRound += iRound; } #ifdef PRE_MOD_DARKLAIR_RECONNECT void CDnDLGameTask::UpdateRound( int iNextTotalRound, bool bBossRound ) #else // PRE_MOD_DARKLAIR_RECONNECT void CDnDLGameTask::UpdateRound( int iNextTotalRound ) #endif // PRE_MOD_DARKLAIR_RECONNECT { m_nCurrentRound++; m_nTotalRound += iNextTotalRound; #ifdef PRE_MOD_DARKLAIR_RECONNECT m_bBossRound = bBossRound; #endif // PRE_MOD_DARKLAIR_RECONNECT if( m_nCurrentRound > m_nTotalRound #if defined( PRE_ADD_CHALLENGE_DARKLAIR ) && false == m_bChallengeDarkLair #endif // #if defined( PRE_ADD_CHALLENGE_DARKLAIR ) ) m_nCurrentRound = m_nTotalRound; else { for( DWORD i=0; iGetEventSystem()->OnEvent( EventSystem::OnDarklairClearRound); } } } bool CDnDLGameTask::InitializeStage( int nCurrentMapIndex, int nGateIndex, TDUNGEONDIFFICULTY StageDifficulty, int nRandomSeed, bool bContinueStage, bool bDirectConnect, int nGateSelect ) { EWorldEnum::MapTypeEnum PrevMapType = CDnWorld::GetInstance(GetRoom()).GetMapType(); bool bResult = CDnGameTask::InitializeStage( nCurrentMapIndex, nGateIndex, StageDifficulty, nRandomSeed, bContinueStage, bDirectConnect, nGateSelect ); if( !bResult ) return false; EWorldEnum::MapTypeEnum CurMapType = CDnWorld::GetInstance(GetRoom()).GetMapType(); switch( CurMapType ) { case EWorldEnum::MapTypeDungeon: switch( PrevMapType ) { case EWorldEnum::MapTypeDungeon: break; case EWorldEnum::MapTypeWorldMap: ResetRound( true ); break; } break; case EWorldEnum::MapTypeWorldMap: { ResetRound( false ); ClearChallengeResponse(); break; } } for( DWORD i=0; iGetGrid()->GetActiveSectorCount(); i++ ) { CEtWorldSector* pSector = m_pWorld->GetGrid()->GetActiveSector(i); CEtWorldEventControl* pControl = pSector->GetControlFromUniqueID( ETE_PvPRespawnItemArea ); if( !pControl ) continue; for( DWORD j=0; jGetAreaCount(); j++ ) { CEtWorldEventArea* pArea = pControl->GetAreaFromIndex(j); if( pArea ) m_pItemRespawnLogic->AddItemRespawnArea( pArea ); } } m_bCheckDungeonClear = false; return true; } bool CDnDLGameTask::InitializeNextStage( const char *szGridName, int nMapTableID, TDUNGEONDIFFICULTY StageDifficulty, int nStartPositionIndex ) { if( m_pItemRespawnLogic ) m_pItemRespawnLogic->Reset(); #if defined( PRE_ADD_CHALLENGE_DARKLAIR ) const TDLMapData *pData = g_pDataManager->GetDLMapData( nMapTableID ); if( pData ) { m_bChallengeDarkLair = pData->bChallengeDarkLair; } #if defined( PRE_FIX_73930 ) EWorldEnum::MapTypeEnum CurMapType = CDnWorld::GetInstance(GetRoom()).GetMapType(); if( CurMapType == EWorldEnum::MapTypeWorldMap ) m_bChallengeDarkLair = false; #endif // #if defined( PRE_FIX_73930 ) #endif // #if defined( PRE_ADD_CHALLENGE_DARKLAIR ) return CDnGameTask::InitializeNextStage( szGridName, nMapTableID, StageDifficulty, nStartPositionIndex ); } void CDnDLGameTask::RequestDungeonClear( bool bClear, DnActorHandle hIgnoreActor, bool bIgnoreRewardItem ) { if( CDnWorld::GetInstance(GetRoom()).GetMapType() != EWorldEnum::MapTypeDungeon ) return; #ifdef PRE_FIX_73312 if( m_DungeonClearState != DCS_None ) return; #endif #if defined (_FINAL_BUILD) if( !m_bEnteredDungeon ) { for( DWORD i=0; iSendChat( CHATTYPE_SYSTEM, (int)szTemp.size() * sizeof(WCHAR), L"", (WCHAR*)szTemp.c_str() ); } return; } #endif m_bIgnoreDungeonClearRewardItem = bIgnoreRewardItem; GetRoom()->AddDungeonPlayTime( timeGetTime() - m_dwStageCreateTime ); DNTableFileFormat *pMapSox = GetDNTable( CDnTableDB::TMAP ); // ÀÏ´Ü °¢ ¸É¹öµéÀÇ ¼öÄ¡µé °¡Áö±¸¿À±¸. char cStartingMemberCount = GetRoom()->m_iPartMemberCnt; char cCount = 0; TDLDungeonClearInfo Info[PARTYMAX]; int nGuildPoint[PARTYMAX]; CDNGameRoom::PartyStruct *pPartyStruct[PARTYMAX] = { 0, }; memset( Info, 0, sizeof(Info) ); memset( nGuildPoint, 0, sizeof(nGuildPoint) ); for( DWORD i=0; ipSession->GetActorHandle(); if( !hActor ) continue; if( hActor == hIgnoreActor ) continue; Info[cCount].nSessionID = pStruct->pSession->GetSessionID(); pPartyStruct[cCount] = pStruct; cCount++; ((CDNDLGameRoom*)GetRoom())->SetUpdateRankData( pStruct->pSession ); } #if defined( PRE_SKIP_REWARDBOX ) m_nRewardBoxUserCount = cCount; #endif for( char i=0; ipSession || !pPartyStruct[i]->pSession->GetActorHandle() ) continue; #if defined( PRE_ADD_DUNGEONCLEARINFO ) CDNGameRoom::PartyFirstStruct* PartyFirst = GetRoom()->GetFirstPartyData( pPartyStruct[i]->pSession->GetCharacterDBID() ); if( !PartyFirst ) { // ±¸Á¶»ó ¾ø´Â°æ¿ì´Â ¹ö±×ÀÓ g_Log.Log(LogType::_ERROR, 0, 0, 0, 0, L"[CDnDLGameTask::RequestDungeonClear] PartyFirst error!!\r\n"); continue; } #endif if( pPartyStruct[i]->pSession->GetActorHandle() == hIgnoreActor ) continue; CDnPlayerActor *pPlayer = static_cast(pPartyStruct[i]->pSession->GetActorHandle().GetPointer()); int nDungeonClearID = pMapSox->GetFieldFromLablePtr( m_nMapTableID, "_ClearDungeonTableID_Nightmare" )->GetInteger(); TDLClearDataItem *pClearData = g_pDataManager->GetDLClearData( nDungeonClearID, pPlayer->GetLevel(), m_nCurrentRound ); if( !pClearData ) continue; nGuildPoint[i] = pClearData->nRewardGP; Info[i].nExperience = pClearData->nRewardExperience; Info[i].nExperience += pPlayer->GetCompleteExperience(); //ä³Î°ü·Ã Ãß°¡ CheckMerit(pPlayer, GlobalEnum::MERIT_BONUS_COMPLETEEXP, Info[i].nExperience, Info[i].nMeritBonusExperience); GetRoom()->GetEventExpWhenStageClear(pPartyStruct[i]->pSession, Info[i].nExperience, Info[i].cBonusCount, Info[i].EventClearBonus); Info[i].nPromotionExperience = (int)(((float)Info[i].nExperience * (float)((float)(pPartyStruct[i]->pSession->GetPromotionValue(PROMOTIONTYPE_STAGECLEAR))/100)) + 0.5f); Info[i].cMaxLevelCharCount = pPartyStruct[i]->pSession->GetMaxLevelCharacterCount(); int nBonusExperience = 0; for( int v=0; vGetMasterRewardSystem() ) { float fRate = GetRoom()->GetMasterRewardSystem()->GetExpRewardRate( pPlayer->GetUserSession() ); if( fRate > 0.f ) { float fBonusExp = Info[i].nExperience*fRate; int iMasterAddExp = GetRoom()->GetMasterRewardSystem()->GetMasterSystemAddExp(pPlayer->GetUserSession(), static_cast(Info[i].nExperience), true); Info[i].nExperience += iMasterAddExp; //±×³É ȹµæ °æÇèÄ¡¿¡ Ãß°¡.. #if defined( _WORK ) WCHAR wszBuf[MAX_PATH]; wsprintf( wszBuf, L"[»çÁ¦½Ã½ºÅÛ] ½ºÅ×ÀÌÁö Ŭ¸®¾î Ãß°¡ °æÇèÄ¡ %d, ½º½Â:%d", static_cast(fBonusExp), iMasterAddExp ); if( pPlayer->GetUserSession() ) pPlayer->GetUserSession()->SendDebugChat( wszBuf ); #endif // #if defined( _WORK ) } } if( pPlayer->GetUserSession()->GetPeriodExpItemRate() > 0 ) { int nAddItemExp = static_cast(pClearData->nRewardExperience* (float)(pPlayer->GetUserSession()->GetPeriodExpItemRate()/100.0f)); Info[i].nExperience += nAddItemExp; //±×³É ȹµæ °æÇèÄ¡¿¡ Ãß°¡.. #if defined( _WORK ) WCHAR wszBuf[MAX_PATH]; wsprintf( wszBuf, L"[°æÇèÄ¡Ãß°¡¾ÆÀÌÅÛ] Ãß°¡ °æÇèÄ¡ %d", nAddItemExp ); pPlayer->GetUserSession()->SendDebugChat( wszBuf ); #endif // #if defined( _WORK ) } pPlayer->UpdateMaxLevelGainExperience( Info[i].nExperience + Info[i].nMeritBonusExperience + nBonusExperience + Info[i].nPromotionExperience ); int nLevelLimit = (int)CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::PlayerLevelLimit ); #if !defined(PRE_USA_FATIGUE) if( pPlayer->GetLevel() >= nLevelLimit ) { Info[i].cClearRewardType = 1; Info[i].nRewardGold = (int)( pPlayer->GetMaxLevelGainExperience() * CGlobalWeightTable::GetInstance().GetValue( CGlobalWeightTable::MaxLevelExpTransGoldValue ) ); } #endif // º¸»ó ¾ÆÀÌÅÛ °ü·Ã ±âÁذªµé ¼³Á¤ DNVector(TreasureBoxLevelStruct) VecTreasureList; int nTotalTreasureOffset = 0; for( int j=0; j<4; j++ ) { int nProb = pClearData->cTreasureBoxRatio[j]; if( nProb <= 0 ) continue; nTotalTreasureOffset += nProb; TreasureBoxLevelStruct Struct; Struct.cTreasureLevel = (char)j; Struct.nOffset = nTotalTreasureOffset; VecTreasureList.push_back( Struct ); } // º¸»ó ¾ÆÀÌÅÛ int nRewardItemCount = pClearData->nShowBoxCount; Info[i].cShowBoxCount = pClearData->nShowBoxCount; Info[i].cSelectBoxCount = pClearData->nSelectBoxCount; /* int nRewardItemCount = 4; Info[i].cShowBoxCount = 4; Info[i].cSelectBoxCount = 2; */ if( !VecTreasureList.empty() ) { for( int k=0; knRewardItemID[cTreasureBoxType]; #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) && defined(_WORK) //ġƮ ÄÚµå(Å×½ºÆ® Àü¿ë) if(pPartyStruct[i]->pSession->GetBoxNumber() > 0) nDropItemTableID = pPartyStruct[i]->pSession->GetBoxNumber(); #endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) && defined(_WORK) DNVector(CDnItem::DropItemStruct) VecItemResult; CDnDropItem::CalcDropItemList( GetRoom(), nDropItemTableID, VecItemResult, false ); int nResultItemID = 0; int nResultItemCount = 0; #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) int nResultItemEnchantID = 0; #endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) for( DWORD j=0; jGetUserSession()->GetFCMState() != FCMSTATE_NONE){ nResultItemID = 0; nResultItemCount = 0; } #endif // _CH #if defined( PRE_ADD_DUNGEONCLEARINFO ) PartyFirst->ClearInfo.cRewardItemType[k] = cTreasureBoxType; PartyFirst->ClearInfo.RewardItem[k].nItemID = nResultItemID; #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) pPartyStruct[i]->pSession->GetItem()->MakeItemStruct( nResultItemID, PartyFirst->ClearInfo.RewardItem[k], 0, nResultItemEnchantID ); #else // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) pPartyStruct[i]->pSession->GetItem()->MakeItemStruct( nResultItemID, PartyFirst->ClearInfo.RewardItem[k] ); #endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) PartyFirst->ClearInfo.RewardItem[k].wCount = nResultItemCount; #else // Ŭ¸®¾î ÀÎÆ÷ÂÊ¿¡µµ ¼³Á¤ÇØÁØ´Ù. pPartyStruct[i]->ClearInfo.cRewardItemType[k] = cTreasureBoxType; pPartyStruct[i]->ClearInfo.RewardItem[k].nItemID = nResultItemID; #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) pPartyStruct[i]->pSession->GetItem()->MakeItemStruct( nResultItemID, pPartyStruct[i]->ClearInfo.RewardItem[k], 0, nResultItemEnchantID ); #else // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) pPartyStruct[i]->pSession->GetItem()->MakeItemStruct( nResultItemID, pPartyStruct[i]->ClearInfo.RewardItem[k] ); #endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) pPartyStruct[i]->ClearInfo.RewardItem[k].wCount = nResultItemCount; #endif } } #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) && defined(_WORK) pPartyStruct[i]->pSession->SetBoxNumber(0); #endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) && defined(_WORK) #if defined( PRE_ADD_DUNGEONCLEARINFO ) PartyFirst->ClearInfo.cSelectRewardItem = 0; PartyFirst->ClearInfo.cSelectRemainCount = pClearData->nSelectBoxCount; #else pPartyStruct[i]->ClearInfo.cSelectRewardItem = 0; pPartyStruct[i]->ClearInfo.cSelectRemainCount = pClearData->nSelectBoxCount; #endif pPlayer->GetUserSession()->GetQuest()->OnStageClear(m_nMapTableID); } #if defined(PRE_ADD_STAGECLEAR_TIMECHECK) bool CheckAbuseClearTime = false; if( CheckDungeonClearAbuseTime(GetRoom()->GetDungeonPlayTime(), m_nMapTableID) ) CheckAbuseClearTime = true; #endif // #if defined(PRE_ADD_STAGECLEAR_TIMECHECK) // ´øÀü Ŭ¸®¾î â º¸³»ÁÖ±¸. for( DWORD i=0; iGetActorHandle() == hIgnoreActor ) continue; SendGameDLDungeonClear( GetUserData(i), m_nCurrentRound, GetRoom()->GetDungeonPlayTime(), bClear, cCount, Info ); #if defined(PRE_ADD_STAGECLEAR_TIMECHECK) if( CheckAbuseClearTime ) { g_Log.Log(LogType::_HACK, GetUserData(i), L"AbuseCount[StageClearTime] MapID[%d] Time[%d]\r\n", m_nMapTableID, GetRoom()->GetDungeonPlayTime()); GetUserData(i)->GetDBConnection()->QueryAddAbuseMonitor(GetUserData(i), StageClearCheckTime::AbuseCount, 0); } #endif // #if defined(PRE_ADD_STAGECLEAR_TIMECHECK) } // »óŹٲã³ëÄÚ. ChangeDungeonClearState( DCS_ClearResultStay ); // ·©Å· Äõ¸® ³¯·Á³í´Ù. ((CDNDLGameRoom*)GetRoom())->RequestRankQueryData(); // °æÇèÄ¡, ¾ÆÀÌÅÛ, µ· µîµî ÁØ´Ù. for( char i=0; i(hActor.GetPointer()); int iMasterExpBonus = 0; TExpData ExpData; ExpData.set( (float)(Info[i].nExperience + Info[i].nMeritBonusExperience + Info[i].nPromotionExperience + iMasterExpBonus) ); pPlayer->CmdAddExperience( ExpData, DBDNWorldDef::CharacterExpChangeCode::Dungeon, pPlayer->GetUserSession()->GetPartyID() ); if( Info[i].cClearRewardType == 1 ) { pPlayer->CmdAddCoin( Info[i].nRewardGold, DBDNWorldDef::CoinChangeCode::MaxLevelExperienceTransGold, 0 ); } if (0 < nGuildPoint[i]) { pPlayer->GetUserSession()->AddGuildPoint(GUILDPOINTTYPE_STAGE, nGuildPoint[i]); } CDNUserSession *pSession = pPlayer->GetUserSession(); if( bClear ) { EWorldEnum::MapSubTypeEnum MapSubType = (EWorldEnum::MapSubTypeEnum)pMapSox->GetFieldFromLablePtr( m_nMapTableID, "_MapSubType" )->GetInteger(); EWorldEnum::MapSubTypeEnum TempSubType = CDnWorld::GetInstance(GetRoom()).GetMapSubType(); if (MapSubType != TempSubType) g_Log.Log(LogType::_GUILDWAR, L"CDnDLGameTask - OnDungeonClear MapID:%d MapSubType:%d != TempSubType:%d Level:%d \n", m_nMapTableID, MapSubType, TempSubType, GetStageDifficulty() ); pSession->GetEventSystem()->OnEvent( EventSystem::OnDungeonClear, 1, EventSystem::MapSubType, MapSubType); pSession->IncreaseDungeonClearCount(); pSession->GetEventSystem()->OnEvent( EventSystem::OnCountingDungeonClear ); } } for( DWORD i=0; iGetActorHandle(); if( hActor && hActor->IsMove() && !hActor->IsDie() ) hActor->CmdStop( "Stand" ); } RequestDungeonClearBase(); } void CDnDLGameTask::MakeHistoryInfo( TDLRankHistoryPartyInfo *pInfo, SDarkLairHistory *pHistory ) { pInfo->cPartyUserCount = pHistory->cPartyUserCount; pInfo->nPlaySec = pHistory->uiPlaySec; pInfo->nPlayRound = pHistory->unPlayRound; _wcscpy( pInfo->wszPartyName, _countof(pInfo->wszPartyName), pHistory->wszPartyName, (int)wcslen(pHistory->wszPartyName) ); for( int i=0; icPartyUserCount; i++ ) { pInfo->Info[i].nLevel = pHistory->sUserData[i].unLevel; pInfo->Info[i].nJobIndex = pHistory->sUserData[i].iJobIndex; swprintf_s( pInfo->Info[i].wszCharacterName, pHistory->sUserData[i].wszCharacterName ); } } void CDnDLGameTask::MakeHistoryInfo( TDLRankHistoryPartyInfo *pInfo, SDarkLairBestHistory *pHistory ) { MakeHistoryInfo( pInfo, (SDarkLairHistory*)pHistory ); pInfo->nRank = pHistory->iRank; } void CDnDLGameTask::ChangeDungeonClearState( DungeonClearStateEnum State ) { m_DungeonClearState = State; switch( m_DungeonClearState ) { case DCS_RequestDungeonClear: m_DungeonClearState = DCS_ClearResultStay; m_fDungeonClearDelta = 0.f; break; case DSC_RequestRankResult: { m_DungeonClearState = DSC_RankResultStay; m_fDungeonClearDelta = 0.f; TAUpdateDarkLairResult *pResult = ((CDNDLGameRoom*)GetRoom())->GetRankQueryResultInfo(); if(!pResult) break; //¿©±â¼­ break µÉ °æ¿ì °á°úâ¿¡ ·©Å· Á¤º¸°¡ Ç¥½ÃµÇÁö ¾Ê°í ´ÙÀ½ ½ºÅÜÀ¸·Î ³Ñ¾î°©´Ï´Ù. m_CurrentRankInfo.nRank = pResult->iRank; m_CurrentRankInfo.nPlaySec = GetRoom()->GetDungeonPlayTime() / 1000; m_CurrentRankInfo.nPlayRound = m_nCurrentRound; TDLRankHistoryPartyInfo UserTopScore; TDLRankHistoryPartyInfo HistoryScore[5]; memset( &UserTopScore, 0, sizeof(UserTopScore) ); UserTopScore.nRank = m_CurrentRankInfo.nRank; UserTopScore.nPlayRound = m_CurrentRankInfo.nPlayRound; UserTopScore.nPlaySec = m_CurrentRankInfo.nPlaySec; UserTopScore.cPartyUserCount = m_CurrentRankInfo.cPartyUserCount; memcpy( UserTopScore.Info, m_CurrentRankInfo.Info, sizeof(TDLRankHistoryMemberInfo) * UserTopScore.cPartyUserCount ); _wcscpy( UserTopScore.wszPartyName, _countof(UserTopScore.wszPartyName), m_CurrentRankInfo.wszPartyName, (int)wcslen(m_CurrentRankInfo.wszPartyName) ); for( int i=0; i<5; i++ ) { HistoryScore[i].nRank = i + 1; MakeHistoryInfo( &HistoryScore[i], &pResult->sHistoryTop[i] ); } for( DWORD i=0; icPartyUserCount; j++ ) { if( pResult->sBestUserData[j].i64CharacterDBID == GetUserData(i)->GetCharacterDBID() ) { MakeHistoryInfo( &UserTopScore, &pResult->sBestUserData[j] ); break; } } SendGameDLRankResult( GetUserData(i), &m_CurrentRankInfo, &UserTopScore, HistoryScore ); } ((CDNDLGameRoom*)GetRoom())->FlushRankQueryResultInfo(); } break; case DCS_RequestSelectRewardItem: m_DungeonClearState = DCS_SelectRewardItemStay; m_fDungeonClearDelta = 0.f; for( DWORD i=0; iGetFirstPartyData( pStruct->pSession->GetCharacterDBID() ); if( !PartyFirst ) { // ±¸Á¶»ó ¾ø´Â°æ¿ì´Â ¹ö±×ÀÓ g_Log.Log(LogType::_ERROR, 0, 0, 0, 0, L"[CDnDLGameTask::ChangeDungeonClearState] PartyFirst error!!\r\n"); continue; } Info[cCount].nSessionID = pStruct->pSession->GetSessionID(); memcpy( Info[cCount].cRewardItemType, PartyFirst->ClearInfo.cRewardItemType, sizeof(PartyFirst->ClearInfo.cRewardItemType) ); #if !defined( PRE_ADD_NAMEDITEM_SYSTEM ) for( int j=0; j<4; j++ ) { Info[cCount].nRewardItemID[j] = PartyFirst->ClearInfo.RewardItem[j].nItemID; Info[cCount].nRewardItemRandomSeed[j] = PartyFirst->ClearInfo.RewardItem[j].nRandomSeed; Info[cCount].cRewardItemOption[j] = PartyFirst->ClearInfo.RewardItem[j].cOption; Info[cCount].wRewardItemCount[j] = PartyFirst->ClearInfo.RewardItem[j].wCount; Info[cCount].cRewardItemSoulBound[j] = PartyFirst->ClearInfo.RewardItem[j].bSoulbound; } #endif // ¾ÆÁ÷ ÀüºÎ ¼±ÅÃÇÏÁö ¾ÊÀº À¯Àú´Â ¼­¹öÂÊ¿¡¼­ ¾Ë·ÁÁÖµµ·Ï ¼öÁ¤ÇÕ´Ï´Ù. if( PartyFirst->ClearInfo.cSelectRemainCount > 0 ) { for( int j=0; j<4; j++ ) { if( !PartyFirst->ClearInfo.IsFlag(j) ) { PartyFirst->ClearInfo.SetFlag( j, true ); PartyFirst->ClearInfo.cSelectRemainCount--; #if defined( PRE_ADD_NAMEDITEM_SYSTEM ) CheckSelectNamedItem( pStruct->pSession, PartyFirst->ClearInfo.RewardItem[j], j ); #endif if( PartyFirst->ClearInfo.cSelectRemainCount == 0 ) break; } } // ´Ù¸¥ ³ðµéÇÑÅ×µµ º¸³»Áà¾ß ÇÕ´Ï´Ù. ¼±ÅÃÀ» ÇÏÁö ¾Ê¾ÒÀ»°æ¿ì¿¡´Â.. for( DWORD j=0; jpSession->GetSessionID(), PartyFirst->ClearInfo.cSelectRewardItem ); } } cCount++; } #else for( DWORD i=0; ipSession->GetSessionID(); memcpy( Info[cCount].cRewardItemType, pStruct->ClearInfo.cRewardItemType, sizeof(pStruct->ClearInfo.cRewardItemType) ); #if !defined( PRE_ADD_NAMEDITEM_SYSTEM ) for( int j=0; j<4; j++ ) { Info[cCount].nRewardItemID[j] = pStruct->ClearInfo.RewardItem[j].nItemID; Info[cCount].nRewardItemRandomSeed[j] = pStruct->ClearInfo.RewardItem[j].nRandomSeed; Info[cCount].cRewardItemOption[j] = pStruct->ClearInfo.RewardItem[j].cOption; Info[cCount].wRewardItemCount[j] = pStruct->ClearInfo.RewardItem[j].wCount; Info[cCount].cRewardItemSoulBound[j] = pStruct->ClearInfo.RewardItem[j].bSoulbound; } #endif // ¾ÆÁ÷ ÀüºÎ ¼±ÅÃÇÏÁö ¾ÊÀº À¯Àú´Â ¼­¹öÂÊ¿¡¼­ ¾Ë·ÁÁÖµµ·Ï ¼öÁ¤ÇÕ´Ï´Ù. if( pStruct->ClearInfo.cSelectRemainCount > 0 ) { for( int j=0; j<4; j++ ) { if( !pStruct->ClearInfo.IsFlag(j) ) { pStruct->ClearInfo.SetFlag( j, true ); pStruct->ClearInfo.cSelectRemainCount--; #if defined( PRE_ADD_NAMEDITEM_SYSTEM ) CheckSelectNamedItem( pStruct->pSession, pStruct->ClearInfo.RewardItem[j], j ); #endif if( pStruct->ClearInfo.cSelectRemainCount == 0 ) break; } } // ´Ù¸¥ ³ðµéÇÑÅ×µµ º¸³»Áà¾ß ÇÕ´Ï´Ù. ¼±ÅÃÀ» ÇÏÁö ¾Ê¾ÒÀ»°æ¿ì¿¡´Â.. for( DWORD j=0; jpSession->GetSessionID(), pStruct->ClearInfo.cSelectRewardItem ); } } cCount++; } #endif #if defined( PRE_ADD_NAMEDITEM_SYSTEM ) for( DWORD i=0; iGetFirstPartyData( pStruct->pSession->GetCharacterDBID() ); if( !PartyFirst ) { // ±¸Á¶»ó ¾ø´Â°æ¿ì´Â ¹ö±×ÀÓ g_Log.Log(LogType::_ERROR, 0, 0, 0, 0, L"[CDnDLGameTask::ChangeDungeonClearState] PartyFirst error!!\r\n"); continue; } Info[cCount].nSessionID = pStruct->pSession->GetSessionID(); Info[cCount].cIndex = PartyFirst->ClearInfo.cSelectRewardItem; for( int j=0; j<4; j++ ) { #if defined( PRE_ADD_NAMEDITEM_SYSTEM ) if( PartyFirst->ClearInfo.RewardItem[j].nItemID > 0 ) { TItemData *pItemData = g_pDataManager->GetItemData( PartyFirst->ClearInfo.RewardItem[j].nItemID ); if(pItemData) { if(pItemData->cRank == ITEMRANK_SSS ) { if( PartyFirst->ClearInfo.bNamedGiveResult[j] == false ) { SwapNamedItemToNormalItem( pStruct->pSession, PartyFirst->ClearInfo.RewardItem[j] ); } } } } #endif // #if defined( PRE_ADD_NAMEDITEM_SYSTEM ) if( !PartyFirst->ClearInfo.IsFlag(j) ) continue; if( PartyFirst->ClearInfo.RewardItem[j].nItemID > 0 ) { pStruct->pSession->GetItem()->CreateInvenWholeItem( PartyFirst->ClearInfo.RewardItem[j], DBDNWorldDef::AddMaterializedItem::DungeonReward, pStruct->pSession->GetPartyID() ); } } #if defined( PRE_ADD_NAMEDITEM_SYSTEM ) ItemInfo[cCount].nSessionID = pStruct->pSession->GetSessionID(); for( int j=0; j<4; j++ ) { ItemInfo[cCount].nRewardItemID[j] = PartyFirst->ClearInfo.RewardItem[j].nItemID; ItemInfo[cCount].nRewardItemRandomSeed[j] = PartyFirst->ClearInfo.RewardItem[j].nRandomSeed; ItemInfo[cCount].cRewardItemOption[j] = PartyFirst->ClearInfo.RewardItem[j].cOption; ItemInfo[cCount].wRewardItemCount[j] = PartyFirst->ClearInfo.RewardItem[j].wCount; ItemInfo[cCount].cRewardItemSoulBound[j] = PartyFirst->ClearInfo.RewardItem[j].bSoulbound; #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) ItemInfo[cCount].cRewardItemLevel[j] = PartyFirst->ClearInfo.RewardItem[j].cLevel; ItemInfo[cCount].cRewardItemPotential[j] = PartyFirst->ClearInfo.RewardItem[j].cPotential; #endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) } #endif // #if defined( PRE_ADD_NAMEDITEM_SYSTEM ) #else // #if defined( PRE_ADD_DUNGEONCLEARINFO ) Info[cCount].nSessionID = pStruct->pSession->GetSessionID(); Info[cCount].cIndex = pStruct->ClearInfo.cSelectRewardItem; for( int j=0; j<4; j++ ) { #if defined( PRE_ADD_NAMEDITEM_SYSTEM ) if( pStruct->ClearInfo.RewardItem[j].nItemID > 0 ) { TItemData *pItemData = g_pDataManager->GetItemData( pStruct->ClearInfo.RewardItem[j].nItemID ); if (pItemData) { if (pItemData->cRank == ITEMRANK_SSS) { if( pStruct->ClearInfo.bNamedGiveResult[j] == false ) { SwapNamedItemToNormalItem( pStruct->pSession, pStruct->ClearInfo.RewardItem[j] ); } } } } #endif // #if defined( PRE_ADD_NAMEDITEM_SYSTEM ) if( !pStruct->ClearInfo.IsFlag(j) ) continue; if( pStruct->ClearInfo.RewardItem[j].nItemID > 0 ) { pStruct->pSession->GetItem()->CreateInvenWholeItem( pStruct->ClearInfo.RewardItem[j], DBDNWorldDef::AddMaterializedItem::DungeonReward, pStruct->pSession->GetPartyID() ); } } #if defined( PRE_ADD_NAMEDITEM_SYSTEM ) ItemInfo[cCount].nSessionID = pStruct->pSession->GetSessionID(); for( int j=0; j<4; j++ ) { ItemInfo[cCount].nRewardItemID[j] = pStruct->ClearInfo.RewardItem[j].nItemID; ItemInfo[cCount].nRewardItemRandomSeed[j] = pStruct->ClearInfo.RewardItem[j].nRandomSeed; ItemInfo[cCount].cRewardItemOption[j] = pStruct->ClearInfo.RewardItem[j].cOption; ItemInfo[cCount].wRewardItemCount[j] = pStruct->ClearInfo.RewardItem[j].wCount; ItemInfo[cCount].cRewardItemSoulBound[j] = pStruct->ClearInfo.RewardItem[j].bSoulbound; #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) ItemInfo[cCount].cRewardItemLevel[j] = pStruct->ClearInfo.RewardItem[j].cLevel; ItemInfo[cCount].cRewardItemPotential[j] = pStruct->ClearInfo.RewardItem[j].cPotential; #endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD) } #endif // #if defined( PRE_ADD_NAMEDITEM_SYSTEM ) #endif // #if defined( PRE_ADD_DUNGEONCLEARINFO ) cCount++; } #if defined( PRE_ADD_NAMEDITEM_SYSTEM ) for( DWORD i=0; iOnTriggerEventCallback( "CDnGameTask::ChangeDungeonClearState", m_LocalTime, m_fDelta ); */ for (DWORD i=0; ipSession->bIsGMTrace() ) continue; SendGameWarpDungeonClear(pStruct->pSession); } if (CDnPartyTask::IsActive(GetRoom())) { CDnPartyTask& partyTask = CDnPartyTask::GetInstance(GetRoom()); partyTask.ReleaseSharingReversionItem(); } } break; case DCS_DLRequestChallenge: { for( DWORD i=0; ipSession ) SendGameDLChallengeRequest( pStruct->pSession ); } break; } } } bool CDnDLGameTask::ProcessDungeonClearState( LOCAL_TIME LocalTime, float fDelta ) { if (m_DungeonClearState == DCS_None) return false; if (m_DungeonClearState == DCS_WarpStandBy) { if (m_bDungeonClearQuestComplete && CDnPartyTask::GetInstance(GetRoom()).IsPartySharingReversionItem() == false) { if (m_bDungeonClearSendWarpEnable == false) { CDNUserSession* pLeaderSession = GetPartyLeaderSession(); if (pLeaderSession) { SendGameEnableDungeonClearLeaderWarp(pLeaderSession, true); m_bDungeonClearSendWarpEnable = true; } } } return false; } m_fDungeonClearDelta += fDelta; switch( m_DungeonClearState ) { case DCS_ClearResultStay: if( m_fDungeonClearDelta >= 4.f && ((CDNDLGameRoom*)GetRoom())->IsRecvRankQueryData() ) { ChangeDungeonClearState( DSC_RequestRankResult ); } break; case DSC_RankResultStay: if( m_fDungeonClearDelta >= 5.f ) { if( GetStartFloor() == 0 ) ChangeDungeonClearState( DCS_RequestSelectRewardItem ); else ChangeDungeonClearState( DCS_WarpStandBy ); } break; case DCS_SelectRewardItemStay: #if defined( PRE_SKIP_REWARDBOX ) if( m_fDungeonClearDelta >= 5.f || m_nRewardBoxUserCount == 0) { ChangeDungeonClearState( DCS_RequestRewardItemStay ); } #else if( m_fDungeonClearDelta >= 5.f ) { ChangeDungeonClearState( DCS_RequestRewardItemStay ); } #endif break; case DCS_RewardItemStay: if( m_fDungeonClearDelta >= 5.f ) { ChangeDungeonClearState( DCS_RequestRewardItemResult ); } break; case DCS_RewardItemResultStay: if( m_fDungeonClearDelta >= 5.f ) { ChangeDungeonClearState(DCS_WarpStandBy); } break; } return true; } void CDnDLGameTask::CheckAndRequestDungeonClear( DnActorHandle hActor ) { if( m_bCheckDungeonClear ) return; bool bAllDie = true; bool bAllNoUsableRebirthCoin = true; bool bAllNoCoin = true; for( DWORD i=0; iGetActorHandle(); if( !hLocalActor ) continue; if( hLocalActor == hActor ) continue; if( !hLocalActor->IsDie() ) { bAllDie = false; break; } // ÇØ´ç Á¶°ÇÀº bAllDie °¡ Çʼö Á¶°ÇÀ̹ǷΠbreak ÇÏÁö ¾Ê´Â´Ù. CDNGameRoom::PartyStruct* pStruct = GetRoom()->GetPartyData(pSession); #if defined( PRE_ADD_REBIRTH_EVENT) if( pStruct && (pStruct->nUsableRebirthCoin < 0 || pStruct->nUsableRebirthCoin > 0) ) #else if( pStruct && pStruct->nUsableRebirthCoin > 0 ) #endif { if( pSession->GetTotalRebirthCoin() > 0 ) bAllNoUsableRebirthCoin = false; } if( pSession->GetTotalRebirthCoin() > 0 ) bAllNoCoin = false; } if( bAllDie == false ) return; if( bAllNoCoin == false ) { if( bAllNoUsableRebirthCoin == false ) return; } RequestDungeonClear( false, hActor ); m_bCheckDungeonClear = true; } void CDnDLGameTask::OnGhost( DnActorHandle hActor ) { CheckAndRequestDungeonClear(); } int CDnDLGameTask::OnRecvRoomSelectRewardItem( CDNUserSession * pSession, CSSelectRewardItem *pPacket ) { if( m_DungeonClearState != DCS_SelectRewardItemStay ) return ERROR_NONE; // ÀÌ °æ¿ì°¡ ¾Æ´Ñ°æ¿ì¿¡ µé¾î¿Â°Å¸é ³ª»Û³ðÀÌÁö¸¸ ÀÏ´Ü ¸®ÅÏ None #if defined( PRE_ADD_DUNGEONCLEARINFO ) if(!pSession) return ERROR_NONE; CDNGameRoom::PartyFirstStruct* PartyFirst = GetRoom()->GetFirstPartyData( pSession->GetCharacterDBID() ); if( PartyFirst==NULL || PartyFirst->ClearInfo.cSelectRemainCount == 0) { return ERROR_NONE; } PartyFirst->ClearInfo.SetFlag( pPacket->cItemIndex, true ); PartyFirst->ClearInfo.cSelectRemainCount--; #if defined( PRE_SKIP_REWARDBOX ) if( PartyFirst->ClearInfo.cSelectRemainCount == 0 ) m_nRewardBoxUserCount--; #endif // #if defined( PRE_SKIP_REWARDBOX ) #if defined( PRE_ADD_NAMEDITEM_SYSTEM ) //³×ÀÓµåÅÛÀ» ¼±ÅÃÇÑ °æ¿ì¿¡ µðºñ·Î È®ÀÎ CheckSelectNamedItem( pSession, PartyFirst->ClearInfo.RewardItem[pPacket->cItemIndex], pPacket->cItemIndex ); #endif for( DWORD i=0; iGetSessionID(), PartyFirst->ClearInfo.cSelectRewardItem ); } #else CDNGameRoom::PartyStruct *pStruct = GetPartyData(pSession); if( pStruct==NULL || pStruct->ClearInfo.cSelectRemainCount == 0 ) return ERROR_NONE; pStruct->ClearInfo.SetFlag( pPacket->cItemIndex, true ); pStruct->ClearInfo.cSelectRemainCount--; #if defined( PRE_SKIP_REWARDBOX ) if( pStruct->ClearInfo.cSelectRemainCount == 0 ) m_nRewardBoxUserCount--; #endif // #if defined( PRE_SKIP_REWARDBOX ) #if defined( PRE_ADD_NAMEDITEM_SYSTEM ) //³×ÀÓµåÅÛÀ» ¼±ÅÃÇÑ °æ¿ì¿¡ µðºñ·Î È®ÀÎ CheckSelectNamedItem( pSession, pStruct->ClearInfo.RewardItem[pPacket->cItemIndex], pPacket->cItemIndex ); #endif for( DWORD i=0; iGetSessionID(), pStruct->ClearInfo.cSelectRewardItem ); } #endif return ERROR_NONE; } int CDnDLGameTask::OnRecvRoomDLChallengeResponse( CDNUserSession* pSession, CSDLChallengeResponse* pPacket ) { if( GetDungeonClearState() != DCS_DLRequestChallenge ) return ERROR_NONE; if( GetPartyLeaderSession() != pSession ) return ERROR_NONE; if( pPacket->bAccept ) { static_cast(GetRoom())->UpdateResultRankMapIndex(); m_ChallengeResponseEnum = Response_Challenge; } else m_ChallengeResponseEnum = Response_Deny; ChangeDungeonClearState( CDnGameTask::DCS_None ); for( UINT i=0 ; ibAccept ); } return ERROR_NONE; } int CDnDLGameTask::GetStartFloor() { TQUpdateDarkLairResult* pRankData = static_cast(GetRoom())->GetRankQueryData(); int iMapIndex = pRankData->iMapIndex%DarkLair::TopFloorAbstractMapIndex; const TDLMapData* pDLMapData = g_pDataManager->GetDLMapData( iMapIndex ); if( pDLMapData == NULL ) return 0; return pDLMapData->nFloor; } #if defined(PRE_MOD_DARKLAIR_RECONNECT) bool CDnDLGameTask::OnInitializeBreakIntoActor( CDNUserSession* pSession, const int iVectorIndex ) { if( pSession ) SendGameDLRoundInfo( pSession, m_nCurrentRound, m_nTotalRound, m_bBossRound ); return CDnGameTask::OnInitializeBreakIntoActor( pSession, iVectorIndex ); } #endif // PRE_MOD_DARKLAIR_RECONNECT