#include "stdafx.h" #include "GameInstanceDungeon.h" #include "Map.h" #include "GameMissionRoom.h" #include "Trigger.h" #include "TriggerManagerEx.h" #include "Player.h" #include "Monster.h" #include "ChangeMonsterAbility.h" #include "StatusManager.h" #include //_NA_0_20091118_GAMEROOM_BATTLE_RESULT #include "InstanceDungeonBattleResult.h" //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND #include "GameBattleResult.h" #ifdef _NA_007065_20140217_CHAOSZONE_GOLDRUSH #include "World/ChaosZoneSystem/GoldRush.h" #include "World/ChaosZoneSystem/GoldRushBattleResult.h" #endif //_NA_007065_20140217_CHAOSZONE_GOLDRUSH __IMPL_CUSTOMPOOL_PTR(GameInstanceDungeon) GameInstanceDungeon::GameInstanceDungeon(VOID) : chaos_zone_type_(kChaosZoneTypeNone) //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND ,chaos_zone_manager_(NULL) { //_NA_0_20091118_GAMEROOM_BATTLE_RESULT m_pBattleResult = new InstanceDungeonBattleResult; } GameInstanceDungeon::~GameInstanceDungeon(VOID) { //_NA_0_20091118_GAMEROOM_BATTLE_RESULT SAFE_DELETE(m_pBattleResult); } VOID GameInstanceDungeon::OnCreate() { BOOST_STATIC_ASSERT( INDUN_KIND_MAX == 7 ); // Ãß°¡ ŸÀÔ Á¸Àç½Ã ÇÏ´Ü ³»¿ë Ãß°¡ÇÒ °Í ChangeHandler( eZONETYPE_INSTANCE, m_KindOfIndun ); // SSQControlManager¿¡¼­ ÇØ´ç ¸ÊÄÚµå¿Í ۸¦ ¸ÅÇνÃ۱â À§ÇÔ switch( m_KindOfIndun ) { case INDUN_KIND_TOP_OF_TRIAL: case INDUN_KIND_100LEVEL_QUEST: case INDUN_KIND_EXT_03: case INDUN_KIND_EXT_04: case INDUN_KIND_MAYA_SCROLL: break; case INDUN_KIND_SS_QUEST: GameWarControlManager::OnMsg( GameSSQCtrlCmd::Created(), this ); break; //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND case INDUN_KIND_CHAOS_ZONE: chaos_zone_manager_ = new ChaosZoneManager(this); chaos_zone_manager_->Init(chaos_zone_type_); break; } GameRoom::OnCreate(); //_NA_0_20091118_GAMEROOM_BATTLE_RESULT m_pBattleResult->Init(false); } VOID GameInstanceDungeon::OnDestroy() { //_NA_0_20091118_GAMEROOM_BATTLE_RESULT #ifdef _NA_007750_20141113_WZDAT_MODIFY_LOG TCHAR tszAddInfo[MAX_ADDINFO_SIZE + 1] = { 0, }; _snprintf(tszAddInfo, MAX_ADDINFO_SIZE, "MapCode:%d,TotalHeim:%I64u", GetMapCode(), (m_pBattleResult != NULL) ? m_pBattleResult->GetTotalDropHeim() : 0); GAMELOG->LogWzDat(ACT_TOTAL_DROP_HEIM_FROM_MONSTER, tszAddInfo); #endif // _NA_007750_20141113_WZDAT_MODIFY_LOG m_pBattleResult->Release(); BOOST_STATIC_ASSERT( INDUN_KIND_MAX == 7 ); // Ãß°¡ ŸÀÔ Á¸Àç½Ã ÇÏ´Ü ³»¿ë Ãß°¡ÇÒ °Í switch( m_KindOfIndun ) { case INDUN_KIND_TOP_OF_TRIAL: case INDUN_KIND_100LEVEL_QUEST: case INDUN_KIND_EXT_03: case INDUN_KIND_EXT_04: case INDUN_KIND_MAYA_SCROLL: break; case INDUN_KIND_SS_QUEST: GameWarControlManager::OnMsg( GameSSQCtrlCmd::Destroy(), this ); break; //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND case INDUN_KIND_CHAOS_ZONE: SAFE_RELEASENDELETE(chaos_zone_manager_); chaos_zone_type_ = kChaosZoneTypeNone; break; } GameRoom::OnDestroy(); } //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND void GameInstanceDungeon::Update(DWORD dwDeltaTick) { GameRoom::Update(dwDeltaTick); switch (m_KindOfIndun) { case INDUN_KIND_CHAOS_ZONE: if (chaos_zone_manager_) { chaos_zone_manager_->Update(); } break; } } VOID GameInstanceDungeon::Ready( Player* pPlayer, MAPCODE FieldCode, WzID AreaID, WzVector* pwvStartPos ) { pPlayer->SetGameZone( ePRS_BEFORE_ENTER_INSTNACE, this, FieldCode, AreaID, pwvStartPos ); } VOID GameInstanceDungeon::SetZone( Object *pObject, MAPCODE FieldCode, WzID AreaID, WzVector* pwvStartPos ) { pObject->SetGameZone( ePRS_AT_INSTANCE, this, FieldCode, AreaID, pwvStartPos ); } BOOL GameInstanceDungeon::MoveField( Player* pPlayer, MAPCODE FieldCode, WzID AreaID, WzVector* pwvStartPos ) { SetZone( pPlayer, FieldCode, AreaID, pwvStartPos ); if( !GameRoom::MoveField( pPlayer, FieldCode, AreaID, pwvStartPos ) ) { pPlayer->SetGameZone( ePRS_NOT_AT_ZONE, NULL, 0, NULL ); return FALSE; } //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND if (chaos_zone_type_ != kChaosZoneTypeNone) { if (chaos_zone_manager_ && chaos_zone_manager_->EnterPlayer(pPlayer) == false) { pPlayer->SetGameZone( ePRS_NOT_AT_ZONE, NULL, 0, NULL ); return false; } } return TRUE; } BOOL GameInstanceDungeon::Join( Player* pPlayer, MAPCODE FieldCode, WzID AreaID, WzVector* pwvStartPos ) { if( !( pPlayer->GetGameZoneState() & ePRS_BEFORE_ENTER_INSTNACE ) ) { SUNLOG( eCRITICAL_LOG, "[SusunLove] GameInstanceDungeon::Join eRoomState[%d] ZoneType[%d]", pPlayer->GetGameZoneState(), GetZoneType() ); return FALSE; } SetZone( pPlayer, FieldCode, AreaID, pwvStartPos ); #ifdef _NA_008679_20160202_REWORK_BATTLEGROUND // RenderInfo¿¡¼­ °ÝÀüÁöÀÇ °¡¸íÀ» ¸¸µé±â À§ÇØ // TeamÁ¤º¸¸¦ À̰÷¿¡¼­ ¼¼ÆÃÇÑ´Ù // ¹®Á¦°¡ ¸¹Àº ÀÛ¾÷ÀÌÁö¸¸, RenderInfoÀÌÀü¿¡ °¡¸íÀ» ¼¼ÆÃÇÏ·Á¸é À¯ÀÏÇÑ À§Ä¡ if (chaos_zone_type_ == kBattleGround) { ChaosZone* zone = chaos_zone_manager_->GetCurrentZone(); if (zone != NULL) { BattleGround* battle_ground = static_cast(zone); ChaosZoneTeam team_key = battle_ground->GetPlayerTeamKey(pPlayer); pPlayer->SetTeamKey(team_key); pPlayer->GetBattleGroundPlayerInfo().SetTeamKey(team_key); battle_ground->SetTeamFalseOption(pPlayer); } } #endif //_NA_008679_20160202_REWORK_BATTLEGROUND if( !GameRoom::Join( pPlayer, FieldCode, AreaID, pwvStartPos ) ) { pPlayer->SetGameZone( ePRS_NOT_AT_ZONE, NULL, 0, NULL ); // ¹Ì¼ÇÀÇ ¼öÇàÁ¤º¸¸¦ º¸³»ÁØ´Ù!! return FALSE; } //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND if (chaos_zone_type_ != kChaosZoneTypeNone) { if (chaos_zone_manager_ && chaos_zone_manager_->EnterPlayer(pPlayer) == false) { GameRoom::Leave(pPlayer); pPlayer->SetGameZone(ePRS_NOT_AT_ZONE, NULL, 0, NULL); return false; } } return TRUE; } VOID GameInstanceDungeon::LeaveForWarp( Player* pPlayer ) { GameRoom::LeaveForWarp( pPlayer ); //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND if (chaos_zone_type_ != kChaosZoneTypeNone) { if (chaos_zone_manager_) { chaos_zone_manager_->LeavePlayer(pPlayer); } } } VOID GameInstanceDungeon::Leave( Player* pPlayer ) { GameRoom::Leave( pPlayer ); //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND if (chaos_zone_type_ != kChaosZoneTypeNone) { if (chaos_zone_manager_) { chaos_zone_manager_->LeavePlayer(pPlayer); } } } VOID GameInstanceDungeon::OnKillMonster( Monster* pMonster ) { #ifdef _NA_008012_20150130_RANKING_SYSTEM const BOOLEAN bNeedKillEvent = (Policyment.FIELD & Policyment.ENABLE_RANKING) && !(Policyment.FIELD & Policyment.ENABLE_SSQ_CONTROL) ; if( bNeedKillEvent ) m_pRankingSystemCtl->KillMonster( (eNPC_GRADE)pMonster->GetBaseInfo()->m_byGrade, this ); #endif // _NA_008012_20150130_RANKING_SYSTEM } GameBattleResult* GameInstanceDungeon::GetGameBattleResult() const { if (chaos_zone_manager_ && chaos_zone_type_ == kBattleGround) { BattleGround* const battle_ground = \ static_cast(chaos_zone_manager_->GetCurrentZone()); if (battle_ground) return static_cast(battle_ground->GetBattleGroundBattleResult()); } #ifdef _NA_007065_20140217_CHAOSZONE_GOLDRUSH else if (chaos_zone_manager_ && chaos_zone_type_ == eCHAOSZONE_TYPE_GOLDRUSH) { GoldRush* const goldrush = \ static_cast(chaos_zone_manager_->GetCurrentZone()); if (goldrush) return static_cast(goldrush->GetGoldRushBattleResult()); } #endif //_NA_007065_20140217_CHAOSZONE_GOLDRUSH else return m_pBattleResult; return NULL; } #ifdef _NA_008334_20150608_SONNENSCHEIN RC::eSTATUS_RESULT GameInstanceDungeon::ResurrectionAtSafezone( Player* pPlayer ) { if (m_KindOfIndun != INDUN_KIND_CHAOS_ZONE || chaos_zone_manager_ == NULL) { return RC::RC_STATUS_RESURRECTION_FAIL; } return chaos_zone_manager_->ResurrectionAtSafezone(pPlayer); } #endif //_NA_008334_20150608_SONNENSCHEIN