#include "StdAfx.h" #include ".\gamezonemanager.h" #include ".\GameVillage.h" #include ".\GameHuntingRoom.h" #include ".\GameLobbyRoom.h" #include ".\GameMissionRoom.h" #include ".\GamePVPRoom.h" #include ".\GameCHuntingRoom.h" #include ".\GameHuntingField.h" #include ".\GameInstanceDungeon.h" #include ".\GameDominationField.h" #include "Map.h" #include #include "Player.h" //_NA_0_20091118_GAMEROOM_BATTLE_RESULT #include "GameBattleResult.h" //_NA_001990_ACSYSTEM_ADD #include "AchievementManager.h" #ifdef _NA_008069_20150210_ADD_SPA_SYSTEM #include "GameSpaField.h" #endif //_NA_008069_20150210_ADD_SPA_SYSTEM #include "GameZone.h" #ifdef _NA_008334_20150608_SONNENSCHEIN #include "GameGuild.h" #endif //_NA_008334_20150608_SONNENSCHEIN namespace { __inline GameZone * Alloc( eZONETYPE zoneType ) { GameZone * pZone = NULL; switch( zoneType ) { case eZONETYPE_VILLAGE: pZone = GameVillage::ALLOC(); break; case eZONETYPE_LOBBY: pZone = GameLobbyRoom::ALLOC(); break; case eZONETYPE_HUNTING: pZone = GameHuntingRoom::ALLOC(); break; case eZONETYPE_MISSION: pZone = GameMissionRoom::ALLOC(); break; case eZONETYPE_PVP: pZone = GamePVPRoom::ALLOC(); break; case eZONETYPE_CHUNTING: pZone = GameCHuntingRoom::ALLOC(); break; case eZONETYPE_FIELD: pZone = GameHuntingField::ALLOC(); break; case eZONETYPE_DOMINATION_FIELD: pZone = GameDominationField::ALLOC(); break; #ifdef _NA_008069_20150210_ADD_SPA_SYSTEM case eZONETYPE_SPA_FIELD: pZone = GameSpaField::ALLOC(); break; #endif //_NA_008069_20150210_ADD_SPA_SYSTEM case eZONETYPE_INSTANCE: pZone = GameInstanceDungeon::ALLOC(); break; } return pZone; } __inline void Free( GameZone * pZone ) { ASSERT( pZone ); switch( pZone->GetZoneType() ) { case eZONETYPE_VILLAGE: GameVillage::FREE((GameVillage*)pZone); return ; case eZONETYPE_LOBBY: GameLobbyRoom::FREE((GameLobbyRoom*)pZone ); return ; case eZONETYPE_HUNTING: GameHuntingRoom::FREE((GameHuntingRoom*)pZone); return ; case eZONETYPE_MISSION: GameMissionRoom::FREE((GameMissionRoom*)pZone); return ; case eZONETYPE_PVP: GamePVPRoom::FREE((GamePVPRoom*)pZone); return ; case eZONETYPE_CHUNTING: GameCHuntingRoom::FREE((GameCHuntingRoom*)pZone); return; case eZONETYPE_FIELD: GameHuntingField::FREE((GameHuntingField*)pZone); return ; case eZONETYPE_DOMINATION_FIELD: GameDominationField::FREE((GameDominationField*)pZone); return ; #ifdef _NA_008069_20150210_ADD_SPA_SYSTEM case eZONETYPE_SPA_FIELD: GameSpaField::FREE((GameSpaField*)pZone); return; #endif //_NA_008069_20150210_ADD_SPA_SYSTEM case eZONETYPE_INSTANCE: GameInstanceDungeon::FREE((GameInstanceDungeon*)pZone); return ; } } } class GameZoneManager::ZonePool { public: util::CMemoryPoolFactory m_pool1; util::CMemoryPoolFactory m_pool2; util::CMemoryPoolFactory m_pool3; util::CMemoryPoolFactory m_pool4; util::CMemoryPoolFactory m_pool5; util::CMemoryPoolFactory m_pool6; util::CMemoryPoolFactory m_pool7; util::CMemoryPoolFactory m_pool8; util::CMemoryPoolFactory m_pool9; #ifdef _NA_008069_20150210_ADD_SPA_SYSTEM util::CMemoryPoolFactory m_pool10; #endif //_NA_008069_20150210_ADD_SPA_SYSTEM explicit ZonePool(){} void SetPool(DWORD poolSize) { __UNUSED(poolSize); m_pool1.Initialize( 0, 5, "GameVillage"); m_pool2.Initialize( 5, 5, "GameLobbyRoom"); m_pool3.Initialize( 0, 1, "GameHuntingRoom"); // not used m_pool4.Initialize( 0, 20, "GameMissionRoom"); m_pool5.Initialize( 0, 5, "GamePVPRoom"); m_pool6.Initialize( 0, 5, "GameCHuntingRoom"); m_pool7.Initialize(40, 5, "GameHuntingField"); m_pool8.Initialize( 0, 10, "GameInstanceDungeon"); m_pool9.Initialize( 0, 5, "GameDominationField"); #ifdef _NA_008069_20150210_ADD_SPA_SYSTEM m_pool10.Initialize(0, 1, "GameSpaField"); #endif //_NA_008069_20150210_ADD_SPA_SYSTEM } ~ZonePool(){} }; GameZoneManager::ZonePool GameZoneManager::s_pool; void GameZoneManager::ReservedZonePool( DWORD poolSize ) { s_pool.SetPool(poolSize); GameVillage::SetPool(&s_pool.m_pool1); GameLobbyRoom::SetPool(&s_pool.m_pool2); GameHuntingRoom::SetPool(&s_pool.m_pool3); GameMissionRoom::SetPool(&s_pool.m_pool4); GamePVPRoom::SetPool(&s_pool.m_pool5); GameCHuntingRoom::SetPool(&s_pool.m_pool6); GameHuntingField::SetPool(&s_pool.m_pool7); GameInstanceDungeon::SetPool(&s_pool.m_pool8); GameDominationField::SetPool(&s_pool.m_pool9); #ifdef _NA_008069_20150210_ADD_SPA_SYSTEM GameSpaField::SetPool(&s_pool.m_pool10); #endif //_NA_008069_20150210_ADD_SPA_SYSTEM } //--------------------------------------------------------------------------------------- // ±¸ÇöºÎ //--------------------------------------------------------------------------------------- GameZoneManager g_GameZoneManager; GameZoneManager::GameZoneManager(void) { m_pZoneHash = new GAMEZONE_HASH; } GameZoneManager::~GameZoneManager(void) { Release(); SAFE_DELETE(m_pZoneHash); } VOID GameZoneManager::Release() { DestroyZoneAll(); } VOID GameZoneManager::DestroyZoneAll() { if( m_pZoneHash ) { GAMEZONE_HASH::iterator it = m_pZoneHash->begin(), end = m_pZoneHash->end(); while( it != end ) { _DestroyZone(it++); } m_pZoneHash->clear(); } } VOID GameZoneManager::_AddZone( GameZone * pZone ) { GAMEZONE_HASH::iterator it = m_pZoneHash->find( pZone->GetKey() ); if( it == m_pZoneHash->end() ) { m_pZoneHash->insert( GAMEZONE_PAIR(pZone->GetKey(), pZone) ); return; } ASSERT( !"ÀÌ¹Ì °°Àº ŰÀÇ Á¸ÀÌ Á¸ÀçÇÑ´Ù:_AddZone()" && pZone->GetKey() ); } VOID GameZoneManager::_RemoveZone( ZONEKEY Key ) { GAMEZONE_HASH::iterator it = m_pZoneHash->find( Key ); if( it != m_pZoneHash->end() ) { m_pZoneHash->erase( it ); return; } ASSERT( !"ƯÁ¤ ŰÀÇ Á¸ÀÌ Á¸ÀçÇÏÁö ¾Ê´Â´Ù:_RemoveZone()" && Key ); } GameZone * GameZoneManager::GetZone( ZONEKEY Key ) { GAMEZONE_HASH::iterator it = m_pZoneHash->find( Key ); if( it != m_pZoneHash->end() ) { return (it->second); } ASSERT( !"ƯÁ¤ ŰÀÇ Á¸ÀÌ Á¸ÀçÇÏÁö ¾Ê´Â´Ù:GetZone()" && Key ); return NULL; } VOID GameZoneManager::DestroyZone( ZONEKEY Key ) { GAMEZONE_HASH::iterator it = m_pZoneHash->find(Key); _DestroyZone( it ); } VOID GameZoneManager::_DestroyZone( GAMEZONE_HASH::iterator it ) { if( it == m_pZoneHash->end() ) { SUNLOG( eCRITICAL_LOG, "[GameZoneManager::DestroyZone] Zone is NULL"); return; } GameZone *pZone = it->second; ZONEPOOL_HASH::iterator it2 = m_ZonePoolHash.find(pZone); if( it2 == m_ZonePoolHash.end() ) { SUNLOG( eCRITICAL_LOG, "[SusunLove] GameZoneManager::_DestroyZone ZoneType[%d]", pZone->GetZoneType() ); return; } else { m_ZonePoolHash.erase(it2); } pZone->Release(); m_pZoneHash->erase(it); Free( pZone ); } void GameZoneManager::Update(DWORD delta_tick) { GAMEZONE_HASH::const_iterator it = m_pZoneHash->begin(), end = m_pZoneHash->end(); for (; it != end; ++it) { GameZone* game_zone = it->second; game_zone->Update(delta_tick); } } VOID GameZoneManager::ReadyPlayer( ZONEKEY Key, Player * pPlayer, MAPCODE FieldCode, WzID AreaID, WzVector * pwvStartPos ) { GameZone * pZone = GetZone( Key ); if(!pZone) return; pZone->Ready( pPlayer, FieldCode, AreaID, pwvStartPos ); } BOOL GameZoneManager::JoinPlayer( ZONEKEY Key, Player * pPlayer, MAPCODE FieldCode, WzID AreaID, WzVector * pwvStartPos ) { GameZone * pZone = GetZone( Key ); if(!pZone) return FALSE; // (WAVERIX)(080604)(BUG-FIX) - ó¸® ¼ø¼­ º¯°æ( ÈÄó¸®->Àüó¸® ) // Á׾ Á¸¿¡ µé¾î¿À´Â °æ¿ì »ì·ÁÁØ´Ù. if( pPlayer->GetHP() == 0 ) pPlayer->SetHP( 1 ); if( !pZone->Join( pPlayer, FieldCode, AreaID, pwvStartPos ) ) return FALSE; // CHANGES: f110103.2L if (ns_object::PlayerZoneTransaction* transaction_info = pPlayer->GetZoneTransactionInfo()) { transaction_info->EndTransaction(); } //_NA_0_20091118_GAMEROOM_BATTLE_RESULT GameBattleResult* battle_result = pZone->GetGameBattleResult(); if (battle_result) { battle_result->Enter(pPlayer); //_NA_001990_ACSYSTEM_ADD if( AchievementManager* pACManager = pPlayer->GetACManager() ) { pACManager->ProcessBattleEnter(pZone->GetMapCode()); } } //_NA_003457_20111013_EXCEPT_DOMINATION_REWARD if (pZone->GetZoneType() == eZONETYPE_INSTANCE) { GameInstanceDungeon* const pIndun = static_cast(pZone); if(pIndun->GetTypeOfIndun() == INDUN_KIND_SS_QUEST) { #ifdef _NA_008334_20150608_SONNENSCHEIN GameGuild* player_guild = pPlayer->GetGuild(); if (player_guild != NULL) { player_guild->ApplyGuildRewardOption(pPlayer, FALSE); } #else GameDominationManager::Instance()->ApplyAllRewardOption(pPlayer, FALSE); #endif //_NA_008334_20150608_SONNENSCHEIN GameDominationManager::Instance()->SendAreaInfoToPlayer(pPlayer, FALSE); } } return TRUE; } VOID GameZoneManager::WarpPlayer( ZONEKEY Key, Player * pPlayer, MAPCODE FieldCode, WzID AreaID, WzVector * pwvStartPos ) { GameZone * pZone = GetZone( Key ); if(!pZone) return; pZone->MoveField( pPlayer, FieldCode, AreaID, pwvStartPos ); } VOID GameZoneManager::LeavePlayer( ZONEKEY Key, Player * pPlayer ) { GameZone * pZone = GetZone( Key ); if(!pZone) return; //_NA_0_20091118_GAMEROOM_BATTLE_RESULT GameBattleResult* battle_result = pZone->GetGameBattleResult(); if (battle_result) { battle_result->Leave(pPlayer, false); } //_NA_003457_20111013_EXCEPT_DOMINATION_REWARD if (pZone->GetZoneType() == eZONETYPE_INSTANCE) { GameInstanceDungeon* const pIndun = static_cast(pZone); if(pIndun->GetTypeOfIndun() == INDUN_KIND_SS_QUEST) { #ifdef _NA_008334_20150608_SONNENSCHEIN GameGuild* player_guild = pPlayer->GetGuild(); if (player_guild != NULL) { player_guild->ApplyGuildRewardOption(pPlayer); } #else GameDominationManager::Instance()->ApplyAllRewardOption(pPlayer, TRUE); #endif //_NA_008334_20150608_SONNENSCHEIN GameDominationManager::Instance()->SendAreaInfoToPlayer(pPlayer, TRUE); } } pZone->Leave( pPlayer ); } // (f100623.1L) change an interface to support a multi-checksum checker bool GameZoneManager::FieldVersionCheck(ZONEKEY zone_key, FIELDCODE field_code, EngineFileChecksum* stored_checksums, const EngineFileChecksum& inputed_checksums) const { GameZone* game_zone = const_cast(this)->GetZone(zone_key); if (game_zone == NULL) { return false; } return game_zone->CheckMapVersion(field_code, stored_checksums, inputed_checksums); } /* BOOL GameZoneManager::FieldVersionCheck( ZONEKEY Key, MAPCODE FieldCode, DWORD checksum, DWORD * OUT pCurCheckSum ) { GameZone * pZone = GetZone( Key ); if(!pZone) return FALSE; return pZone->CheckMapVersion( FieldCode, checksum, pCurCheckSum ); } */ GameZone* GameZoneManager::CreateZone(eZONETYPE zoneType, ZONEKEY zoneKey, MAPCODE mapCode, eZONE_RULESET::eRules rules) { GameZone* pZone = Alloc(zoneType); if(NULL == pZone) return NULL; pZone->Init(zoneKey, mapCode, rules); //< Init() ¾È¿¡¼­ ·ÎµåµÈ ¸®¼Ò½º¸¦ ¿¬°áÇÑ´Ù. _AddZone(pZone); m_ZonePoolHash[pZone] = pZone; return pZone; } GameZone * GameZoneManager::GetFieldVillageZone( MAPCODE MapCode ) { GAMEZONE_HASH::iterator it = m_pZoneHash->begin(), end = m_pZoneHash->end(); for( ; it != end ; ++it ) { GameZone *pZone = it->second; if( pZone->GetMapCode() != MapCode ) continue; if( pZone->GetZoneType() == eZONETYPE_VILLAGE || pZone->GetZoneType() == eZONETYPE_DOMINATION_FIELD || pZone->GetZoneType() == eZONETYPE_FIELD || pZone->GetZoneType() == eZONETYPE_SPA_FIELD) //_NA_008069_20150210_ADD_SPA_SYSTEM return pZone; } return NULL; } VOID GameZoneManager::Display( BOOL bLog ) { DWORD village = 0; DWORD lobby = 0; DWORD mission = 0; DWORD hunting = 0; DWORD pvp = 0; DWORD competition = 0; DWORD MonsterNum = 0; DWORD DeadMonsterNum = 0; DWORD tmpNum = 0; DWORD field = 0; DWORD domination = 0; DWORD Instance = 0; DWORD battle_ground = 0; //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND DWORD goldrush = 0; //_NA_007065_20140217_CHAOSZONE_GOLDRUSH DWORD spa_field=0; //_NA_008069_20150210_ADD_SPA_SYSTEM GameZone * pZone = NULL; GAMEZONE_HASH::iterator it = m_pZoneHash->begin(), end = m_pZoneHash->end(); for( ; it != end ; ++it ) { pZone = it->second; switch(pZone->GetZoneType()) { case eZONETYPE_VILLAGE: ++village; break; case eZONETYPE_LOBBY: ++lobby; break; case eZONETYPE_MISSION: ++mission; break; case eZONETYPE_HUNTING: ++hunting; break; case eZONETYPE_PVP: ++pvp; break; case eZONETYPE_CHUNTING: ++competition; break; case eZONETYPE_FIELD: ++field; break; case eZONETYPE_DOMINATION_FIELD: ++domination; break; case eZONETYPE_SPA_FIELD: //_NA_008069_20150210_ADD_SPA_SYSTEM ++spa_field; break; case eZONETYPE_INSTANCE: { GameInstanceDungeon* const instance_dungeon = \ static_cast(pZone); if (instance_dungeon->GetChaosZoneManager()) { ChaosZoneType chaos_zone_type = \ instance_dungeon->GetChaosZoneManager()->GetChaosZoneType(); switch(chaos_zone_type) { case kBattleGround: //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND ++battle_ground; break; case eCHAOSZONE_TYPE_GOLDRUSH: //_NA_007065_20140217_CHAOSZONE_GOLDRUSH ++goldrush; break; default: ++Instance; break; } } else { ++Instance; } } break; } MonsterNum += pZone->GetTotalMonsterNum(tmpNum); DeadMonsterNum += tmpNum; } //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND //_NA_007065_20140217_CHAOSZONE_GOLDRUSH //_NA_008069_20150210_ADD_SPA_SYSTEM if( bLog ) { SUNLOG( eCRITICAL_LOG, "Village(%u+%u+%u) Lobby(%u) Mission(%u) Hunting(%u) PVP(%u) \ Competition(%u) Instance(%u) BattleGround(%u) GoldRush(%u) SpaField(%u) Monster(%u,%u)", village, field, domination, lobby, mission, hunting, pvp, competition, Instance, battle_ground, goldrush, spa_field, MonsterNum, DeadMonsterNum ); } else { DISPMSG( "Village(%u+%u+%u) Lobby(%u) Mission(%u) Hunting(%u) PVP(%u) Competition(%u) \ Instance(%u) BattleGround(%u) GoldRush(%u) SpaField(%u) Monster(%u,%u)\n", village, field, domination, lobby, mission, hunting, pvp, competition, Instance, battle_ground, goldrush, spa_field, MonsterNum, DeadMonsterNum ); } } VOID GameZoneManager::DisplayPoolInfo() { //GameVillage::DisplayerPoolInfo(); //DISPMSG( " VillagePool\n" ); //GameLobbyRoom::DisplayerPoolInfo(); //DISPMSG( " LobbyPool\n" ); //GameMissionRoom::DisplayerPoolInfo(); //DISPMSG( " MissionPool\n" ); //GameHuntingRoom::DisplayerPoolInfo(); //DISPMSG( " HuntingPool\n" ); //GamePVPRoom::DisplayerPoolInfo(); //DISPMSG( " PVPPool\n" ); //GameCHuntingRoom::DisplayerPoolInfo(); //DISPMSG( " CHuntingPool\n" ); //GameHuntingField::DisplayerPoolInfo(); //DISPMSG( " HuntingField\n" ); }