#include "stdafx.h" #ifdef _NA_008543_20151027_ONE_DAYS_GUILD_MISSION /*-------------------------------------------------------------------------------------------------- -- Include Defined --------------------------------------------------------------------------------------------------*/ #include "OneDaysGuildMissionManager.h" #include "OneDaysGuildMissionRoom.h" #include "ChaosZoneInfoParser.h" #include #include #include #include #include "ServerOptionParserEx.h" #include "AgentServer.h" #include "MapInfoParser.h" void OneDaysGuildMissionManager::Init() { OneDaysGuildMission_mapcode_ = ChaosZoneInfoParser::Instance()->GetOneDaysGuildmissionMapCode(); #if defined(_KOREA) // Solarauth·Î ½ºÅ©¸³Æ®¸¦ ·ÎµåÇÒ °æ¿ì´Â Init()½Ã ¸Ê Äڵ尡 0ÀÏ ¼ö ÀÖ´Ù.(½ºÅ©¸³Æ® ·Îµå°¡ ¼­¹ö°¡ ¿Ã¶ó°£µÚ ÀÌ·ç¿öÁø´Ù.) if (0 == OneDaysGuildMission_mapcode_) { SUNLOG(eCRITICAL_LOG, "OneDaysGuildMission Mapcode Error! Check 'ChaosZoneInfo.txt'"); } #endif room_map_.clear(); } void OneDaysGuildMissionManager::DestroyRoom(KEYTYPE zone_key) { ONEDAYSGUILDMISSION_ROOM_MAP::iterator itr = room_map_.find(zone_key); if(itr != room_map_.end()) { OneDaysGuildMissionRoom* room = itr->second; if(room) { room_map_.erase(itr); SAFE_DELETE(room); } } } void OneDaysGuildMissionManager::DestroyRoom( GUILDGUID guild_guid ) { KEYTYPE zone_key = GetZoneKeyUsingGuildGuid(guild_guid); if(zone_key != 0) { DestroyRoom(zone_key); } } void OneDaysGuildMissionManager::Update() { ONEDAYSGUILDMISSION_ROOM_MAP::iterator itr = room_map_.begin(); for (itr; itr != room_map_.end(); ++itr) { OneDaysGuildMissionRoom* room = itr->second; if(room) { ZoneInterface* dungeon = g_ZoneManager.FindZone(room->GetZoneKey()); if (NULL == dungeon) { DestroyRoom(room->GetZoneKey()); return; } } } } bool OneDaysGuildMissionManager::AllPlayerLeaveRoom(const ZONEKEY zone_key) { if (zone_key == 0) { //zone_key°¡ 0ÀÏ °æ¿ì µé¾î¿À´Â ÇÔ¼ö´Â ¿©±â°¡ ¾Æ´Ï´Ù return false; } ONEDAYSGUILDMISSION_ROOM_MAP::iterator itr = room_map_.find(zone_key); if (itr != room_map_.end()) { OneDaysGuildMissionRoom* room = itr->second; if(room) { room->KickAllUsers(); } } return true; } bool OneDaysGuildMissionManager::LeaveRoom(const ZONEKEY zone_key, User* const user) { if (zone_key == 0) { //zone_key°¡ 0ÀÏ °æ¿ì µé¾î¿À´Â ÇÔ¼ö´Â ¿©±â°¡ ¾Æ´Ï´Ù return false; } ONEDAYSGUILDMISSION_ROOM_MAP::iterator itr = room_map_.find(zone_key); if (itr != room_map_.end()) { OneDaysGuildMissionRoom* room = itr->second; if(room) { room->_KickUser(user); INT CurrentPlayerCnt = 0; room->GetCurrentPlayerCnt(CurrentPlayerCnt); if(CurrentPlayerCnt <= 0) { DestroyRoom(zone_key); } } } return true; } MAPCODE OneDaysGuildMissionManager::GetOneDaysGuildMissionMapCode() { #if defined(_KOREA) #else // Solarauth·Î ½ºÅ©¸³Æ®¸¦ ·ÎµåÇÒ °æ¿ì ¹ß»ýÇÒ ¼ö ÀÖ´Ù(Init() ½ÃÁ¡¿¡¼­ ·Îµå¸¦ ¸øÇÔÀ¸·Î ¿©±â¼­ ´Ù½Ã ·Îµå). ÇØ´ç ¸ÊÄڵ带 ´Ù½Ã Àд ·çƾÀ» Ãß°¡ if(0 == OneDaysGuildMission_mapcode_) { OneDaysGuildMission_mapcode_ = ChaosZoneInfoParser::Instance()->GetOneDaysGuildmissionMapCode(); } #endif return OneDaysGuildMission_mapcode_; } RC::eONEDAYSGUILDMISSION_RESULT OneDaysGuildMissionManager::CreateOneDaysGuildMissionRoom(User* user, BOOL is_gm_cmd /*= FALSE*/) { // À¯Àú°¡ »ý¼º °¡´ÉÇÑ »óÅÂÀÎÁö °Ë»ç RC::eONEDAYSGUILDMISSION_RESULT check_result = UserCanCreateARoom(user, is_gm_cmd); if(check_result != RC::RC_ONEDAYSGUILDMISSION_SUCCESS) { return check_result; } // ¸ÊÄÚµå const MAPCODE map_code = GetOneDaysGuildMissionMapCode(); user->BeginTransaction(TR_CREATE_INSTANCE_DUNGEON); // Instance Dungeon »ý¼º InstanceDungeon* dungeon = NULL; const RC::eROOM_RESULT result = g_ZoneManager.CreateInstanceDungeon(user->GetZoneKey(), user, map_code, (InstanceDungeon*&)dungeon, INDUN_KIND_CHAOS_ZONE, FALSE); if(dungeon == NULL || result != RC::RC_ROOM_SUCCESS) { //instance_dungeon»ý¼º½ÇÆÐ user->EndTransaction(); return RC::RC_ONEDAYSGUILDMISSION_ROOM_CREATE_FAILED; } dungeon->SetRoomState(eROOMSTATE_GENERNAL); const sMAPINFO* map_info = MapInfoParser::Instance()->FindMapInfo(map_code); if (map_info == NULL) { user->EndTransaction(); return RC::RC_ONEDAYSGUILDMISSION_FAILED; } // OneDaysGuildMissionRoom »ý¼º KEYTYPE room_key = dungeon->GetKey(); OneDaysGuildMissionRoom* new_room = new OneDaysGuildMissionRoom(room_key, user->GetSelectedCharGuildGuid(), map_info->byMaxUserNum); if(!new_room) { user->EndTransaction(); return RC::RC_ONEDAYSGUILDMISSION_FAILED; } //Map¿¡ Room µî·Ï room_map_[room_key] = new_room; user->EndTransaction(); return RC::RC_ONEDAYSGUILDMISSION_SUCCESS; } RC::eONEDAYSGUILDMISSION_RESULT OneDaysGuildMissionManager::UserCanCreateARoom( User* user, BOOL is_gm_cmd /*= FALSE*/ ) { //// GM¸í·É¿¡ ÀÇÇÑ »ý¼ºÀÌ ¾Æ´Ò °æ¿ì Ãß°¡ °Ë»ç //if(is_gm_cmd == FALSE) //{ // // ¹æÀÔÀå Á¶°Ç: 1. ÀοøÀÌ ´Ù á´Â°¡, 2. ´Ù ãÀ» °æ¿ì ÀçÁ¢¼Ó ¸®½ºÆ® »ó¿¡ ³»°¡ Àִ°¡? // // // ÇØ´ç Á¶°Ç¿¡ ¸Â´ÂÀ¯Àú°¡ ¾Æ´Ï¸é ¸®ÅÏ ½Ã۰í Ŭ¶óÀÌ¾ðÆ®¿¡°Ô ¸øµé¾î °¡´Â ÀÌÀ¯¸¦ ¾Ë¸®ÀÚ!! //} // ¹æÀ» »ý¼ºÇÏ·Á´Â À¯Àú°¡ ±æµå¿¡ °¡ÀÔµÈ »óÅÂÀÎÁö üũ if(user->GetSelectedCharGuildGuid() == 0) { return RC::RC_ONEDAYSGUILDMISSION_NOT_GUILD_USER; } RC::eONEDAYSGUILDMISSION_RESULT result = _CheckUserProcessOneDaysGuildMission(user); if(result != RC::RC_ONEDAYSGUILDMISSION_SUCCESS) { return result; } // ÇØ´ç ±æµåÀÇ ¹æ »ý¼º ¿©ºÎ È®ÀÎ OneDaysGuildMissionRoom* room = FindRoomUsingGuildGuid(user->GetSelectedCharGuildGuid()); if(room != NULL) { //SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"] OneDaysGuildMissionRoom is ALREADY Exist! [guild:%d]", user->GetSelectedCharGuildGuid()); return RC::RC_ONEDAYSGUILDMISSION_ALEADY_CREATED; } return RC::RC_ONEDAYSGUILDMISSION_SUCCESS; } RC::eONEDAYSGUILDMISSION_RESULT OneDaysGuildMissionManager::CanAUserEntersTheRoom( User* user, BOOL is_gm_cmd /*= FALSE*/ ) { // ·ë Á¸Àç À¯¹« È®ÀÎ OneDaysGuildMissionRoom* room = FindRoomUsingGuildGuid(user->GetSelectedCharGuildGuid()); if(room == NULL) { //SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"] OneDaysGuildMissionRoom is NULL! [guild:%d]", user->GetSelectedCharGuildGuid()); return RC::RC_ONEDAYSGUILDMISSION_ROOM_NOT_EXIST; } // ÀÌ¹Ì ÀÔÀåÇÑ Ç÷¹À̾îÀΰ¡? if(room->FindUser(user->GetPlayerKey()) != NULL) { return RC::RC_ONEDAYSGUILDMISSION_ALREADY_ENTERED; } // Ç÷¹ÀÌ¾î ¼ýÀÚ°¡ Á¦ÇÑ Àοøº¸´Ù ³Ñ´Â´Ù¸é ·ë »ý¼ºÀ» ¸·ÀÚ... if(room->IsMaxStandByMemberCnt()) { // Á¦ÇÑÀοøÀÌ ³ÑÀº »óÅ¿¡¼­ ¸¸¾à ½ºÅÙ¹ÙÀÌ À¯Àú ¸ñ·Ï»ó¿¡ ÀÖÀ¸¸é ÀÔÀå Çã¿ë if(!room->IsStandByMember(user->GetSelectedCharGuid())) { return RC::RC_ONEDAYSGUILDMISSION_OVER_MAX_LIMIT_ENTERED_CNT; } } // GM¸í·É¿¡ ÀÇÇÑ »ý¼ºÀÌ ¾Æ´Ò °æ¿ì Ãß°¡ °Ë»ç if(is_gm_cmd == FALSE) { // ¹æÀÔÀå Á¶°Ç: 1. ÀοøÀÌ ´Ù á´Â°¡, 2. ´Ù ãÀ» °æ¿ì ÀçÁ¢¼Ó ¸®½ºÆ® »ó¿¡ ³»°¡ Àִ°¡? // ÇØ´ç Á¶°Ç¿¡ ¸Â´ÂÀ¯Àú°¡ ¾Æ´Ï¸é ¸®ÅÏ ½Ã۰í Ŭ¶óÀÌ¾ðÆ®¿¡°Ô ¸øµé¾î °¡´Â ÀÌÀ¯¸¦ ¾Ë¸®ÀÚ!! } RC::eONEDAYSGUILDMISSION_RESULT result = _CheckUserProcessOneDaysGuildMission(user); if(result != RC::RC_ONEDAYSGUILDMISSION_SUCCESS) { return result; } return RC::RC_ONEDAYSGUILDMISSION_SUCCESS; } RC::eONEDAYSGUILDMISSION_RESULT OneDaysGuildMissionManager::_CheckUserProcessOneDaysGuildMission( User* user ) { // Á¡·ÉÀü ä³Î¿¡¼­¸¸ °¡´É AgentServer* pAgentServer = AgentServer::GetInstance(); SERVER_KEY rKey(pAgentServer->GetKey()); SERVER_COMMON_OPTION& server_option = ServerOptionParserEx::Instance()->GetServerOption(); if( rKey.GetChannelID() != server_option.m_byDominationChannel ) { return RC::RC_ONEDAYSGUILDMISSION_NOT_DOMINATION_CHANNEL; } // ´Ù¸¥ÇൿÁßÀ̸é (°Å·¡/»óÁ¡) ½ÇÆÐ if(user->GetBehaveState() != PLAYER_BEHAVE_IDLE_STATE) { return RC::RC_ONEDAYSGUILDMISSION_FAIL_TRANSACTION; } // ÀüÀå ¿¹¾à»óÅ ȮÀÎ BattleGroundManager* const battle_ground_manager = BattleGroundManager::Instance(); if(battle_ground_manager) { if (battle_ground_manager->IsValidReservationMember(user->GetUserKey())) { return RC::RC_ONEDAYSGUILDMISSION_BATTLEGROUND_RESERVATION_STATE; } } // Æ®·£Àè¼Ç»óÅ if(user->IsBeginTransaction()) { return RC::RC_ONEDAYSGUILDMISSION_FAIL_TRANSACTION; } return RC::RC_ONEDAYSGUILDMISSION_SUCCESS; } OneDaysGuildMissionRoom* OneDaysGuildMissionManager::FindRoomUsingGuildGuid( GUILDGUID guild_guid ) { ONEDAYSGUILDMISSION_ROOM_MAP::iterator itr = room_map_.begin(); for (itr; itr != room_map_.end(); ++itr) { OneDaysGuildMissionRoom* target = itr->second; if(target == NULL) { continue; } if(guild_guid == target->GetGuildGuid()) { return target; } } return NULL; } OneDaysGuildMissionRoom* OneDaysGuildMissionManager::FindRoomUsingRoomKey( KEYTYPE room_key ) { ONEDAYSGUILDMISSION_ROOM_MAP::iterator itr = room_map_.find(room_key); if(itr != room_map_.end()) { return itr->second; } return NULL; } KEYTYPE OneDaysGuildMissionManager::GetZoneKeyUsingGuildGuid( GUILDGUID guild_guid ) { OneDaysGuildMissionRoom* room = FindRoomUsingGuildGuid(guild_guid); if(room == NULL) { return 0; } return room->GetZoneKey(); } BOOL OneDaysGuildMissionManager::GetEnterPlayerList_CharGuid( GUILDGUID guild_guid, CHARGUID* list OUT, INT* player_count OUT) { OneDaysGuildMissionRoom* room = FindRoomUsingGuildGuid(guild_guid); if(room == NULL) { return FALSE; } *player_count = room->GetPlayerList_CharGuid(list); return TRUE; } BOOL OneDaysGuildMissionManager::GetStandByUserList_CharGuid(GUILDGUID guild_guid, CHARGUID* list OUT, INT* player_count OUT) { OneDaysGuildMissionRoom* room = FindRoomUsingGuildGuid(guild_guid); if(room == NULL) { return FALSE; } *player_count = room->Getstand_by_user_list_CharGuid(list); return TRUE; } BOOL OneDaysGuildMissionManager::MoveToOneDaysGuildMissionRoom(User* user, BOOL is_gm_cmd /*= FALSE*/) { GUILDGUID user_guild_guid = user->GetSelectedCharGuildGuid(); if(user_guild_guid == 0) { return FALSE; } RC::eONEDAYSGUILDMISSION_RESULT enter_result = CanAUserEntersTheRoom(user, is_gm_cmd); if(enter_result != RC::RC_ONEDAYSGUILDMISSION_SUCCESS) { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"][GM]OneDaysGuildMission Enter Failed!"); return FALSE; } KEYTYPE zone_key = GetZoneKeyUsingGuildGuid(user_guild_guid); // À̵¿ÇÏ·Á´Â °÷ÀÇ instance_dungeon InstanceDungeon* const target_dungeon = \ static_cast(g_ZoneManager.FindZone(zone_key)); if(target_dungeon == NULL) { return FALSE; } //ÇöÀç À§Ä¡ÇÑ Zone ZoneInterface* current_zone = g_ZoneManager.FindZone(user->GetZoneKey()); if(current_zone == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__ " : OneDaysGuildMissionRoom Not found zone : %d", user->GetUserGUID()); return FALSE; } user->BeginTransaction(TR_LEAVE_FIELD_FOR_INSTANCE); user->SetTRRoomKey(zone_key); CheckMoveZonePolicy* const check_move_zone_policy = MoveZonePolicy::AlignInfo(user, user->GetZoneType(), target_dungeon->GetType(), user->GetZoneKey(), target_dungeon->GetKey()); RoomArgument argument(eZONEPUBLIC_PUBLIC, NULL); RC::eROOM_RESULT rt = g_ZoneManager.MoveZone(check_move_zone_policy, RoomArgument::GetEmpty()); if (rt != RC::RC_ROOM_SUCCESS) { user->EndTransaction(); SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"] OneDaysGuildMission Zone Move Failed!"); return FALSE; } return TRUE; } void OneDaysGuildMissionManager::ProcessPacket_CG( User* user, MSG_BASE* packet, WORD size ) { handler_cg_onedaysguildmission_.OnCG_ProcessPacket(user, packet, size); } void OneDaysGuildMissionManager::ProcessPacket_AG( GameServerSession* server_session, MSG_BASE* packet, WORD size ) { handler_ag_onedaysguildmission_.OnAG_ProcessPacket(server_session, packet, size); } #endif //(_NA_008543_20151027_ONE_DAYS_GUILD_MISSION)