#include "stdafx.h" #include "DragonLair.h" #include "entity.h" #include "sectree_manager.h" #include "char.h" #include "guild.h" #include "locale_service.h" #include "regen.h" #include "log.h" #include "utils.h" extern int passes_per_sec; struct FWarpToDragronLairWithGuildMembers { DWORD dwGuildID; int mapIndex; int x, y; FWarpToDragronLairWithGuildMembers( DWORD guildID, int map, int X, int Y ) : dwGuildID(guildID), mapIndex(map), x(X), y(Y) { } void operator()(LPENTITY ent) { if (NULL != ent && true == ent->IsType(ENTITY_CHARACTER)) { LPCHARACTER pChar = static_cast(ent); if (true == pChar->IsPC()) { if (NULL != pChar->GetGuild()) { if (dwGuildID == pChar->GetGuild()->GetID()) { pChar->WarpSet(x, y, mapIndex); } } } } } }; struct FWarpToVillage { void operator() (LPENTITY ent) { if (NULL != ent) { LPCHARACTER pChar = static_cast(ent); if (NULL != pChar) { if (true == pChar->IsPC()) { pChar->GoHome(); } } } } }; EVENTINFO(tag_DragonLair_Collapse_EventInfo) { int step; CDragonLair* pLair; int InstanceMapIndex; tag_DragonLair_Collapse_EventInfo() : step( 0 ) , pLair( 0 ) , InstanceMapIndex( 0 ) { } }; EVENTFUNC( DragonLair_Collapse_Event ) { tag_DragonLair_Collapse_EventInfo* pInfo = dynamic_cast(event->info); if ( pInfo == NULL ) { SPDLOG_ERROR("DragonLair_Collapse_Event> Null pointer" ); return 0; } if (0 == pInfo->step) { char buf[512]; snprintf(buf, 512, LC_TEXT("¿ë°¡¸®°¡ %d Ãʸ¸¿¡ Á×¾î½áÈ¿¤Ð¤Ð"), pInfo->pLair->GetEstimatedTime()); SendNoticeMap(buf, pInfo->InstanceMapIndex, true); pInfo->step++; return PASSES_PER_SEC( 30 ); } else if (1 == pInfo->step) { LPSECTREE_MAP pMap = SECTREE_MANAGER::instance().GetMap( pInfo->InstanceMapIndex ); if (NULL != pMap) { FWarpToVillage f; pMap->for_each( f ); } pInfo->step++; return PASSES_PER_SEC( 30 ); } else { SECTREE_MANAGER::instance().DestroyPrivateMap( pInfo->InstanceMapIndex ); M2_DELETE(pInfo->pLair); } return 0; } CDragonLair::CDragonLair(DWORD guildID, int BaseMapID, int PrivateMapID) : GuildID_(guildID), BaseMapIndex_(BaseMapID), PrivateMapIndex_(PrivateMapID) { StartTime_ = get_global_time(); } CDragonLair::~CDragonLair() { } DWORD CDragonLair::GetEstimatedTime() const { return get_global_time() - StartTime_; } void CDragonLair::OnDragonDead(LPCHARACTER pDragon) { SPDLOG_DEBUG("DragonLair: µµ¶ó°ïÀÌ Á×¾î½áÈ¿"); LogManager::instance().DragonSlayLog( GuildID_, pDragon->GetMobTable().dwVnum, StartTime_, get_global_time() ); } CDragonLairManager::CDragonLairManager() { } CDragonLairManager::~CDragonLairManager() { } bool CDragonLairManager::Start(int MapIndexFrom, int BaseMapIndex, DWORD GuildID) { int instanceMapIndex = SECTREE_MANAGER::instance().CreatePrivateMap(BaseMapIndex); if (instanceMapIndex == 0) { SPDLOG_ERROR("CDragonLairManager::Start() : no private map index available"); return false; } LPSECTREE_MAP pMap = SECTREE_MANAGER::instance().GetMap(MapIndexFrom); if (NULL != pMap) { LPSECTREE_MAP pTargetMap = SECTREE_MANAGER::instance().GetMap(BaseMapIndex); if (NULL == pTargetMap) { return false; } const TMapRegion* pRegionInfo = SECTREE_MANAGER::instance().GetMapRegion( pTargetMap->m_setting.iIndex ); if (NULL != pRegionInfo) { FWarpToDragronLairWithGuildMembers f(GuildID, instanceMapIndex, 844000, 1066900); pMap->for_each( f ); LairMap_.insert( std::make_pair(GuildID, M2_NEW CDragonLair(GuildID, BaseMapIndex, instanceMapIndex)) ); std::string strMapBasePath( LocaleService_GetMapPath() ); strMapBasePath += "/" + pRegionInfo->strMapName + "/instance_regen.txt"; regen_do(strMapBasePath.c_str(), instanceMapIndex, pTargetMap->m_setting.iBaseX, pTargetMap->m_setting.iBaseY, NULL, true); return true; } } return false; } void CDragonLairManager::OnDragonDead(LPCHARACTER pDragon, DWORD KillerGuildID) { if (NULL == pDragon) return; if (false == pDragon->IsMonster()) return; std::unordered_map::iterator iter = LairMap_.find( KillerGuildID ); if (LairMap_.end() == iter) { return; } LPSECTREE_MAP pMap = SECTREE_MANAGER::instance().GetMap( pDragon->GetMapIndex() ); if (NULL == iter->second || NULL == pMap) { LairMap_.erase( iter ); return; } iter->second->OnDragonDead( pDragon ); // ¾Öµé ´Ù ÁýÀ¸·Î º¸³»°í ¸Ê ¾ø¾Ö±â tag_DragonLair_Collapse_EventInfo* info; info = AllocEventInfo(); info->step = 0; info->pLair = iter->second; info->InstanceMapIndex = pDragon->GetMapIndex(); event_create(DragonLair_Collapse_Event, info, PASSES_PER_SEC(10)); LairMap_.erase( iter ); }