#include "StdAfx.h" #include "CollectionManager.h" #include "CollectionParser.h" #include "QuestManager_Concrete.h" #include #include "LotteryInfoParser.h" #include "ItemManager.h" #include #include "ServerOptionParserEx.h" #include "MovementChecker.h" #include "CollectedList.h" #include #include "CollectionStateInfo.h" #include "Collection.h" #include "ObjectFactory.h" #include "GameDominationField.h" #include "GameGuildManager.h" #include "GameGuild.h" #include #include "StatusManager.h" #include "GameField.h" #include "TriggerManager.h" #include "TriggerManagerEx.h" #include "GameMissionRoom.h" //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND #include #include #include #include #ifdef _NA_008334_20150608_SONNENSCHEIN #include #endif //_NA_008334_20150608_SONNENSCHEIN #ifdef _NA_008543_20151027_ONE_DAYS_GUILD_MISSION #include #endif //(_NA_008543_20151027_ONE_DAYS_GUILD_MISSION) //================================================================================================== // CHANGES: f110527.3L, memory usage optimization struct CollectionManager::CollectionStateInfoManager { static CollectionStateInfo* Create(Collection* collection, CHARGUID collector, WzVector& collector_pos); static void Release(CollectionStateInfo* state_info); }; CollectionStateInfo* CollectionManager::CollectionStateInfoManager::Create( Collection* collection, CHARGUID collector, WzVector& collector_pos) { CollectionStateInfo* state_info = TAllocNew(CollectionStateInfo); if (state_info->Init(collection, collector, collector_pos) == false) { Release(state_info); return NULL; }; collection->SetStateInfo(state_info); return state_info; } void CollectionManager::CollectionStateInfoManager::Release(CollectionStateInfo* state_info) { Collection* collection = state_info->GetCollection(); if (collection) { collection->SetStateInfo(NULL); }; state_info->Release(); TAllocDelete(CollectionStateInfo, state_info); } //================================================================================================== // CollectionManager::CollectionManager(GameField* pField) :m_pField(pField) { m_Hash.Initialize(MAX_FIELD_COLLECTION_NUM); } void CollectionManager::Release() { ACTIVE_COLLECTION_HASH_IT it = m_Hash.begin(), end = m_Hash.end(); while( it != end ) { CollectionStateInfoManager::Release(*it); ++it; } m_Hash.clear(); } //{__NA001283_20090221_COLLECTION_SYNC // º¸»ó // Ŭ¶óÀÇ Ã¤ÁýÀº ½ÃÀÛAni -> äÁýAni -> ¿Ï·áAni ·Î ³ª´¶´Ù. // ¼­¹ö¿Í Ŭ¶ó´Â ½ÃÀ۽ð£Àº µ¿±âÈ­ Çϳª ¿Ï·á ½Ã°£Àº µ¿±âÈ­ ÇÏÁö¾Ê´Â´Ù. // ŸÀֿ̹¡ µû¶ó ¼­¹ö°¡ äÁý ¿Ï·á Çϰí Ŭ¶ó´Â äÁý Ãë¼Ò ÇÏ´Â Çö»óÀÌ ¹ß»ýÇÑ´Ù. // Á¤È®ÇÑ Å¸À̹ÖÀ» À§ÇØ Å¬¶ó°¡ ¿Ï·áAni¿¡ ¼­¹öÂÊÀ¸·Î µ¿±âÈ­ ÆÐŶÀ» º¸³»°í, // ¼­¹ö´Â ÀÌ Å¸Àֿ̹¡ º¸»ó°ú, ¿Ï·á 󸮸¦ ÇÑ´Ù. // ¼­¹öÂÊ ¿Ï·á »óȲÀº Ç÷¹À̾ ÀúÀå, µ¿±âÈ­ ÆÐŶ¿¡ ÀÇÇØ º¸»óÇÑ´Ù. // pCollectionInfo <- ÀúÀåÇØµÎ¾î¾ßÇÒ Á¤º¸ // Ŭ¶ó¿¡¼­´Â ¼º°øÀ̵ç Ãë¼Òµç µÑÁß ÇϳªÀÇ Á¤º¸¸¦ Àü´ÞÇÔÀ» º¸ÀåÇØ¾ß ÇÑ´Ù. // ÇÏÁö¸¸ À̰æ¿ì¿¡µµ µ¿±âÈ­ÀÇ ¹®Á¦´Â ¹ß»ýÇÑ´Ù. // Á¤º¸ÀÇ Àü´ÞÀÌ º¸ÀåµÇ¾îµµ ŸÀ̹ÖÀÌ ´Ê´Â´Ù¸é, ÀÌÈÄ Ã¤Áý¹°ÀÇ Á¤º¸¸¦ Ŭ¶ó¿¡ ÁÙ°ÍÀΰ¡ÀÇ °áÁ¤ // ¿¡ ¿µÇâÀ» ¹ÌÄ£´Ù. // äÁý¹°ÀÇ ±âº» Ȱ¼º µô·¹ÀÌ Å¸ÀÓÀ¸·Î ¹®Á¦ ÇØ°áÀº µÇ³ª, // ·ºÀ̳ª ÀǵµÀûÀÎ °æ¿ì ¾ÆÁ÷ º¸»óÀüÀ̹ǷΠ´À³¦Ç¥°¡ ´Ù½Ã »ý°Ü³­´Ù. RC::eCOLLECT_RESULT CollectionManager::Success(Player* player) { if (player == NULL) { return RC::RC_COLLECT_FAIL; } CollectedList* collect_list = player->GetCollectedList(); DWORD object_key_collected = 0; CollectionInfo* collect_info = collect_list->GetSuccessCollectionInfo(object_key_collected); if (collect_info == NULL) { return RC::RC_COLLECT_NOTEXIST; } WzID collect_id = collect_info->m_CollectionID; //gamelulu_dev_note : °¢ÀÎ ¿ÀºêÁ§Æ®ÀÎ °æ¿ì¿¡¸¸ ¾Æ·¡¿Í °°ÀÌ ¼º°ø ¿©ºÎ¸¦ //¸ÕÀú °Ë»çÇÑ´Ù. °¢ÀÎ Á¶°ÇÀÌ ¸ÂÁö ¾ÊÀ¸¸é °¢ÀÎÀº ½ÇÆÐ·Î ³¡³ª¸ç º¸»ó¶ÇÇÑ ¾ø´Ù. const PairIsStampReturnValue is_stamp = _IsStamp(collect_id); if (is_stamp.first != false) { GameZone* pGameZone = player->GetGameZonePtr(); if (eZONETYPE_DOMINATION_FIELD == pGameZone->GetZoneType()) { GameDominationField* pZone = (GameDominationField*)pGameZone; #ifdef _NA_006826_20130722_DOMINATION_RENEWAL if (pZone->IsSuccessStamp() == false) { return RC::RC_COLLECT_FAIL_STAMP_CONDISION; } pZone->SuccessStamp(player); #else //_NA_20110406_CHANGE_RULE_FOR_DOMINATION_JOIN if (pZone->IsSuccessStamp() == false) { return RC::RC_COLLECT_FAIL_STAMP_CONDISION; } pZone->SuccessStamp(); #endif // _NA_006826_20130722_DOMINATION_RENEWAL GAMELOG->LogDomination(ACT_DOMINATION_STAMP_COMPLETE, player, NULL); } } //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND else if (_IsSealingStrongPoint(collect_id)) { // ÇöÀç Ç÷¹À̾ ¹èƲ±×¶ó¿îµåÁ¸¿¡ À§Ä¡ÇÏ´ÂÁö üũ if (player->IsThereBattleGroundZone() == false) { SUNLOG(eCRITICAL_LOG, TEXT("[%s|%d] player is not in battle ground"), __FUNCTION__, __LINE__); return RC::RC_COLLECT_FAIL; } BattleGround* const battle_ground = static_cast(player->GetCurrentChaosZone()); if (battle_ground) { battle_ground->SuccessSealing(player, collect_id); } } #ifdef _NA_008334_20150608_SONNENSCHEIN else if (_IsSonnenScheinStamp(collect_id) == TRUE) { //SonnenSchein¿¡¼­ÀÇ °¢ÀÎ ¼º°ø ó¸® if (player->GetChaosZoneType() == eCHAOSZONE_TYPE_SONNENSCHEIN) { ChaosZone* zone = player->GetCurrentChaosZone(); if (zone == NULL) { return RC::RC_COLLECT_FAIL; } SonnenSchein* sonnenschein = static_cast(zone); sonnenschein->SuccessStamp(player); } } #endif //_NA_008334_20150608_SONNENSCHEIN #ifdef _NA_008543_20151027_ONE_DAYS_GUILD_MISSION else if (_IsOneDaysGuildmissionStamp(collect_id) == TRUE) { // ÀÏÀϱæµå¹Ì¼Ç °¢ÀÎ ¼º°ø ó¸® if (player->GetChaosZoneType() == eCHAOSZONE_TYPE_ONEDAYSGUILDMISSION) { ChaosZone* zone = player->GetCurrentChaosZone(); if (zone == NULL) { return RC::RC_COLLECT_FAIL; } OneDaysGuildMission* onedaysguildmission = static_cast(zone); onedaysguildmission->SuccessStamp(player); } } #endif //(_NA_008543_20151027_ONE_DAYS_GUILD_MISSION) // äÁý¿¡ ¼º°øÇصµ ¾ÆÀÌÅÛ º¸»ó ÇÏÁö ¾Ê´Â äÁý¹°µµ ÀÖ´Ù.(°¢ÀÎ) if (collect_info->m_ItemCode != 0) { MSG_CG_COLLECT_OBTAIN_CMD obtain_msg; #ifdef _NA_000000_20120416_COLLECT_OBTAIN_QUESTCODE obtain_msg.quest_code_ = collect_info->m_Condition[CollectionInfo::QUEST]; #endif RC::eITEM_RESULT result_code = _RewardItem(player, collect_info, obtain_msg.m_tagInventory); if( result_code != RC::RC_ITEM_SUCCESS ) { if( result_code == RC::RC_ITEM_HAVENOTSPACE ) { return RC::RC_COLLECT_FAIL_HAVENOTSPACE; } else { return RC::RC_COLLECT_FAIL_REWORD_ITEM; } } player->SendPacket( &obtain_msg, obtain_msg.GetSize() ); } //ACó¸® BASE_ITEMINFO* item_info = ItemInfoParser::Instance()->GetItemInfo(collect_info->m_ItemCode); if (item_info) { //C_NA_0_20100520_ACSYSTEM_CHANGED player->GetACManager()->IncConditionValue((int)item_info->m_wACCode, item_info->m_byACReferenceID, collect_info->m_ItemCode); } //acÁ¤º¸ÀÇ °æ¿ì µ¿±âÈ­¸¦ À§ÇØ DBP¿¡ ¹Ù·Î ÀúÀåÇÑ´Ù. player->SerializeInfoToDBProxy(); #ifdef _NA_004777_20120428_ADD_COMPLETE_COLLECTION_TRIGGER //------------------------------------------------------------------------------ // äÁý Æ®¸®°Å üũ // ´ÙÀ½ ¹Ì¼Ç¶§ äÁý Æ÷ÀÎÅͰ¡ º¸¿©¾ß Çϱ⶧¹®¿¡ // ¹Ì¼Ç Æ®¸®°Å¿ë äÁýÀϰæ¿ì¿¡´Â DB ¿¡ ±â·ÏÇÏÁö ¾Ê´Â´Ù. DWORD condition_trigger = collect_info->m_Condition[CollectionInfo::TRIGGER]; if (condition_trigger != 0) // ¹Ì¼Ç³» äÁý¹° { GameField* const field = player->GetField(); if (field != NULL) { TRIGGER_COMPLETE_COLLECTION msg; msg.object_key = object_key_collected; field->GetTriggerManager()->OnMsg(&msg); } // ¹Ì¼Ç ³»ºÎ¿¡¼­´Â ÇѸíÀÌ Ã¤ÁýÀ» ¼º°øÇÏ¸é ³ª¸ÓÁö Àοøµéµµ äÁýÀ» ¼º°øÇѰɷΠ°£ÁÖ.. // äÁýµÈ ¸®½ºÆ®¿¡ äÁý¹° ۰ªÀ» ³Ö¾îÁØ´Ù. const GameField::_PLAYER_HASH& players = field->GetRefPlayerList(); FOREACH_CONTAINER( const GameField::_PLAYER_HASH::value_type& player_pair, players, GameField::_PLAYER_HASH) { Player* const field_player = player_pair.second; if (obj_util::IsValid(field_player, __FUNCTION__, __LINE__) == false) { continue; } CollectedList* const field_player_collect_list = field_player->GetCollectedList(); field_player_collect_list->Add(collect_id); } } else // Çʵå äÁý¹° { collect_list->Add(collect_id); MSG_DG_COLLECT_ADD_SYN msg; msg.m_CollectionID = collect_id; player->SendToGameDBPServer( &msg, sizeof(msg) ); } #else collect_list->Add(collect_id); MSG_DG_COLLECT_ADD_SYN msg; msg.m_CollectionID = collect_id; player->SendToGameDBPServer( &msg, sizeof(msg) ); #endif //_NA_004777_20120428_ADD_COMPLETE_COLLECTION_TRIGGER return RC::RC_COLLECT_SUCCESS; } //}__NA001283_20090221_COLLECTION_SYNC RC::eCOLLECT_RESULT CollectionManager::GmCancel( WzID CollectionID ) { ACTIVE_COLLECTION_HASH_IT it = m_Hash.begin(), end = m_Hash.end(); while( it != end ) { CollectionStateInfo* pState = *it; if( CollectionID != pState->GetCollectionID() ) { ++it; continue; } Player* const pPlayer = PlayerManager::Instance()->FindPlayerByCharKey( pState->GetCollector() ); if( pPlayer ) { Cancel(pPlayer); } else { Collection* pCollection = pState->GetCollection(); if( pCollection ) { m_pField->LeaveField( pCollection ); ObjectFactory::Instance()->FreeObject( pCollection ); } _Respawn(pState); } return RC::RC_COLLECT_SUCCESS; } return RC::RC_COLLECT_FAIL; } VOID CollectionManager::_StartStamp( Player* player, WzID collection_id ) { const CollectionInfo* conllection_info = CollectionParser::Instance()->FindCollectionInfo(collection_id); if (conllection_info != NULL) { StatusManager* status_manager = player->GetStatusManager(); #ifdef _NA_007667_20141001_WITCHBLADE_SKILL status_manager->AllocStampStatus(conllection_info->m_dwCollectingTime); #else //¾ÆÀ̾ð ¹Ùµð, °­Ã¶ »óÅ´ °¢Àνà »ç¶óÁø´Ù. status_manager->Remove(eCHAR_STATE_STEEL); status_manager->Remove(eCHAR_STATE_IMMUNITY_DAMAGE); status_manager->AllocStatus(eCHAR_STATE_STAMP, conllection_info->m_dwCollectingTime); #endif //_NA_007667_20141001_WITCHBLADE_SKILL } MSG_CG_DOMINATION_BEGIN_STAMP_BRD brd_msg; brd_msg.m_nStampID = collection_id; #ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION GameGuild* pRequestGuild = g_GameGuildManager.FindGuild(player->GetGuildGuid()); _tcsncpy(brd_msg.m_stamp_guild_name, pRequestGuild->GetGuildName(), MAX_GUILDNAME_LENGTH); #else _SendStampPacket(brd_msg, player, collection_id); #endif //_NA_20110406_CHANGE_RULE_FOR_DOMINATION_JOIN //°¢ÀÎ ½ÃÀ۽ð£À» ÀúÀåÇÑ´Ù. GameZone* game_zone = player->GetGameZonePtr(); if (game_zone->GetZoneType() == eZONETYPE_DOMINATION_FIELD ) { GameDominationField* zone = static_cast(game_zone); zone->SetStampStartTime(); #ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION zone->SendPacketToAll(&brd_msg, sizeof(brd_msg)); #endif } GAMELOG->LogDomination(ACT_DOMINATION_STAMP_START, player, NULL); } VOID CollectionManager::_CancelStamp(Player* player, WzID collection_id) { MSG_CG_DOMINATION_CANCLE_STAMP_BRD brd_msg; brd_msg.m_nStampID = collection_id; if (player == NULL) { m_pField->SendPacketToAll(&brd_msg, sizeof(brd_msg)); } else { StatusManager* status_manager = player->GetStatusManager(); status_manager->Remove(eCHAR_STATE_STAMP); #ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION m_pField->SendPacketToAll(&brd_msg, sizeof(brd_msg)); #else _SendStampPacket(brd_msg, player, collection_id); #endif } //_NA_20110406_CHANGE_RULE_FOR_DOMINATION_JOIN //°¢ÀÎ ½ÃÀ۽ð£À» ÃʱâÈ­ ÇÑ´Ù. #ifdef _NA_008256_20150428_MODIFY_CANCLE_STAMP_LOGIC GameZone* game_zone = m_pField->GetGameZone(); #else GameZone* game_zone = player->GetGameZonePtr(); #endif // _NA_008256_20150428_MODIFY_CANCLE_STAMP_LOGIC if (game_zone->GetZoneType() == eZONETYPE_DOMINATION_FIELD ) { GameDominationField* zone = static_cast(game_zone); zone->InitStampCheckTime(); } } template VOID CollectionManager::_SendStampPacket(PacketType& BrdMsg, Player* pPlayer, WzID CollectionID) { GameGuild* pRequestGuild = g_GameGuildManager.FindGuild(pPlayer->GetGuildGuid()); GameField* pField = pPlayer->GetField(); if (NULL != pField && NULL != pRequestGuild) { const FIELDCODE fieldCode = pField->GetFieldCode(); pRequestGuild->SendPacketFieldMember(BrdMsg, fieldCode); } } // RC::eCOLLECT_RESULT CollectionManager::Cancel( Player* pPlayer ) { ASSERT(pPlayer); CollectedList* pCollected = pPlayer->GetCollectedList(); DWORD ObjKeyCollection = pCollected->GetObjKeyCollecting(); if( 0 == ObjKeyCollection ) return RC::RC_COLLECT_CHAR_NOTCOLLECTING; CollectionStateInfo* pStateInfo = _FindStateInfo(ObjKeyCollection); if( !pStateInfo ) return RC::RC_COLLECT_NOTCOLLECTING; if( false == pStateInfo->CanCancel(pPlayer->GetCharGuid()) ) return RC::RC_COLLECT_FAIL_CANCEL; const WzID collectionID = pStateInfo->GetCollectionID(); ;{ MSGSUB_COLLECT_CANCEL_BRD msg_brd; msg_brd.object_key = ObjKeyCollection; msg_brd.collection_id = collectionID; msg_brd.collector = pPlayer->GetObjectKey(); pPlayer->SendPacketAroundForSync(&msg_brd); }; //°¢ÀÎ Ãë¼Ò const PairIsStampReturnValue is_stamp = _IsStamp(collectionID); if (is_stamp.first == true) { _CancelStamp(pPlayer, collectionID); } //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND else if (_IsSealingStrongPoint(collectionID)) { _CancelSealing(pPlayer, collectionID); } #ifdef _NA_008334_20150608_SONNENSCHEIN else if (_IsSonnenScheinStamp(collectionID) == TRUE) { _CancelSonnenScheinStamp(pPlayer, collectionID); } #endif //_NA_008334_20150608_SONNENSCHEIN #ifdef _NA_008543_20151027_ONE_DAYS_GUILD_MISSION else if (_IsOneDaysGuildmissionStamp(collectionID) == TRUE) { _CancelOneDaysGuildmissionStamp(pPlayer, collectionID); } #endif //(_NA_008543_20151027_ONE_DAYS_GUILD_MISSION) pStateInfo->Cancel(); pCollected->EndCollecting(); return RC::RC_COLLECT_SUCCESS; } // äÁýÀÚ°¡ ¾ø´Â äÁý¹°ÀÇ Ã¤Áý Ãë¼Ò. RC::eCOLLECT_RESULT CollectionManager::Cancel( CollectionStateInfo* pStateInfo ) { ASSERT(pStateInfo); const WzID collectionID = pStateInfo->GetCollectionID(); ;{ MSGSUB_COLLECT_CANCEL_BRD msg_brd; msg_brd.object_key = pStateInfo->GetObjectKey(); msg_brd.collection_id = collectionID; msg_brd.collector = 0; const Collection* pCollection = pStateInfo->GetCollection(); const SECTOR_IDX sector_idx = pCollection->GetSectorIndex(); m_pField->SendPacketAroundForSync(sector_idx, &msg_brd); }; //°¢ÀÎ Ãë¼Ò const PairIsStampReturnValue is_stamp = _IsStamp(collectionID); if (is_stamp.first == true) { _CancelStamp(NULL, collectionID); } //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND else if (_IsSealingStrongPoint(collectionID)) { _CancelSealing(NULL, collectionID); } #ifdef _NA_008334_20150608_SONNENSCHEIN else if (_IsSonnenScheinStamp(collectionID) == TRUE) { _CancelSonnenScheinStamp(NULL, collectionID); } #endif //_NA_008334_20150608_SONNENSCHEIN #ifdef _NA_008543_20151027_ONE_DAYS_GUILD_MISSION else if (_IsOneDaysGuildmissionStamp(collectionID) == TRUE) { _CancelOneDaysGuildmissionStamp(NULL, collectionID); } #endif //(_NA_008543_20151027_ONE_DAYS_GUILD_MISSION) pStateInfo->Cancel(); return RC::RC_COLLECT_SUCCESS; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // RC::eCOLLECT_RESULT CollectionManager::Collect(DWORD ObjKeyCollection, Player* pPlayer, WzVector& wvClientCurPos) { CollectedList* pCollectedList = pPlayer->GetCollectedList(); if( false != pCollectedList->IsCollecting() ) { //Ŭ¶ó¿¡¼­ ¿¬¼ÓŬ¸¯½Ã µÎ¹ø ¿¬´Þ¾Æ µé¾î¿Ã¼ö ÀÖÀ¸¸ç, //ÀÌ °æ¿ì NAK¸¦ Ŭ¶ó¿¡ º¸³¿À¸·Î Ŭ¶óÃø¿¡¼± äÁýÀÌ Ãë¼ÒµÈ´Ù. //±×·³À¸·Î ¼­¹ö¿¡¼­µµ äÁýÃë¼Ò¸¦ BRDÇÑ´Ù. RC::eCOLLECT_RESULT rc= Cancel(pPlayer); SUNLOG( eDEV_LOG, "[CollectionManager::Collect] äÁýÁß Ã¤Áý½Ãµµ Äɸ¯ÅÍ[%s] äÁý¹°[%d] cancel[%s]", pPlayer->GetCharName(), ObjKeyCollection, RC::RC_COLLECT_SUCCESS != rc?"fail":"success" ); return RC::RC_COLLECT_ALREADY_COLLECTING; } Collection* pCollection = (Collection*)m_pField->FindObject( COLLECTION_OBJECT, ObjKeyCollection ); if( NULL == pCollection ) return RC::RC_COLLECT_NOTEXIST; if( false == IsCollectable(ObjKeyCollection) ) return RC::RC_COLLECT_ALREADY_COLLECTED; //.// RC::eCOLLECT_RESULT rc = RC::RC_COLLECT_FAIL; MAPOBJECT_INFO* pObjInfo = pCollection->GetMapObjectInfo(); rc = _ChkDistance(pPlayer,wvClientCurPos,pObjInfo->wvPos); if( RC::RC_COLLECT_SUCCESS != rc ) return rc; rc = ChkCondision( pPlayer, pObjInfo->CollectionID ); if( RC::RC_COLLECT_SUCCESS != rc ) return rc; if (pPlayer->IsDead()) { const PairIsStampReturnValue is_stamp = _IsStamp(pObjInfo->CollectionID); if (false != is_stamp.first) { return RC::RC_COLLECT_FAIL_STAMP_DEAD_CHAR; } //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND else if (_IsSealingStrongPoint(pObjInfo->CollectionID)) { return RC::RC_COLLECT_FAIL_STAMP_DEAD_CHAR; } #ifdef _NA_008334_20150608_SONNENSCHEIN else if (_IsSonnenScheinStamp(pObjInfo->CollectionID) == TRUE) { return RC::RC_COLLECT_FAIL_STAMP_DEAD_CHAR; } #endif //_NA_008334_20150608_SONNENSCHEIN #ifdef _NA_008543_20151027_ONE_DAYS_GUILD_MISSION else if (_IsOneDaysGuildmissionStamp(pObjInfo->CollectionID) == TRUE) { return RC::RC_COLLECT_FAIL_STAMP_DEAD_CHAR; } #endif //(_NA_008543_20151027_ONE_DAYS_GUILD_MISSION) else return RC::RC_COLLECT_FAIL_REWORD_DEAD_CHAR; } //.// if( false == _Collect(pCollection,pPlayer) ) return RC::RC_COLLECT_FAIL; // º¸»ó °Ë»ç¿ëÀ¸·Î ÇöÀç äÁý ÁßÀΠäÁý¹°À» ³Ö¾îµÐ´Ù. pCollectedList->BeginCollecting(ObjKeyCollection); //.// // ÇÏÀ§ ÆÐŶÀ¸·Î Ŭ¶ó äÁý¸ð¼ÇÀÌ ½ÃÀÛ (ÀڽŰú ÀڽŠÁÖº¯) ;{ MSGSUB_COLLECT_ACTION_BRD msg_brd; msg_brd.object_key = ObjKeyCollection; msg_brd.collection_id = pObjInfo->CollectionID; msg_brd.collector = pPlayer->GetObjectKey(); pPlayer->SendPacketAroundForSync(&msg_brd); }; const PairIsStampReturnValue is_stamp = _IsStamp(pObjInfo->CollectionID); if (is_stamp.first == true) { // °¢ÀÎ ½ÃÀÛÀ» µ¿ÀÏÇÊµå ±æµå¸â¹ö¿¡°Ô º¸³½´Ù. _StartStamp(pPlayer, pObjInfo->CollectionID); } //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND else if (_IsSealingStrongPoint(pObjInfo->CollectionID)) { _StartSealing(pPlayer, pObjInfo->CollectionID); } #ifdef _NA_008334_20150608_SONNENSCHEIN else if (_IsSonnenScheinStamp(pObjInfo->CollectionID) == TRUE) { _StartSonnenScheinStamp(pPlayer, pObjInfo->CollectionID); } #endif //_NA_008334_20150608_SONNENSCHEIN #ifdef _NA_008543_20151027_ONE_DAYS_GUILD_MISSION else if (_IsOneDaysGuildmissionStamp(pObjInfo->CollectionID) == TRUE) { _StartOneDaysGuildmissionStamp(pPlayer, pObjInfo->CollectionID); } #endif //(_NA_008543_20151027_ONE_DAYS_GUILD_MISSION) //äÁý½Ã ÇØÁ¦µÇ´Â »óÅ pPlayer->Player_TransOff(); #ifdef _DEBUG char ch[5] = {0,}; SUNLOG( eDEV_LOG, "[SEND MSG_CG_COLLECT_ACTION_BRD] SENDER_ [%s][%d] _ " "ObjKeyCollection[%d] CollectionID[%s] Collector[%d]", pPlayer->GetCharName(),pPlayer->GetCharGuid(), ObjKeyCollection, WzIDToString(ch,pObjInfo->CollectionID), pPlayer->GetObjectKey() ); #endif return RC::RC_COLLECT_SUCCESS; } bool CollectionManager::_Collect( Collection* pCollection, Player* pPlayer ) { CollectionStateInfo* pStateInfo = _FindStateInfo(pCollection->GetObjectKey()); if( NULL != pStateInfo || NULL != pCollection->GetStateInfo() ) return false; WzVector vServerPos; pPlayer->GetPos( &vServerPos ); pStateInfo = CollectionStateInfoManager::Create(pCollection, pPlayer->GetCharGuid(), vServerPos ); if( NULL == pStateInfo ) return false; if( false == pStateInfo->StartCollect() ) { CollectionStateInfoManager::Release(pStateInfo); return false; } m_Hash.Add(pStateInfo, pCollection->GetObjectKey()); return true; } RC::eCOLLECT_RESULT CollectionManager::_ChkDistance( Player* pPlayer, WzVector& wvClientCurPos, WzVector& wvCollectionPos ) { WzVector vResultCurPos; if( FALSE == pPlayer->CorrectPosition(wvClientCurPos, vResultCurPos) ) return RC::RC_COLLECT_POSITION_INVALID; FLOAT fCurPosDiff = Math_Vector2DLength( vResultCurPos, wvCollectionPos ); if( MAX_COLLECT_DISTANCE_OBJ < fCurPosDiff ) return RC::RC_COLLECT_DISTANCE_INVALID; return RC::RC_COLLECT_SUCCESS; } CollectionManager::PairIsStampReturnValue CollectionManager::_IsStamp(WzID CollectionID) { const CollectionInfo* pCollectInfo = CollectionParser::Instance()->FindCollectionInfo(CollectionID); if( NULL != pCollectInfo ) { const DWORD dwStamp = pCollectInfo->m_Condition[CollectionInfo::STAMP]; const bool is_stamp = CollectionInfo::OBJ_STAMP == dwStamp || CollectionInfo::OBJ_STAMP_USE_GUILD_MASTER == dwStamp; return std::make_pair(is_stamp, dwStamp); } return std::make_pair(false,0); } RC::eCOLLECT_RESULT CollectionManager::ChkCondision( Player* pPlayer, WzID CollectionID ) { const CollectionInfo* pCollectInfo = CollectionParser::Instance()->FindCollectionInfo(CollectionID); if( NULL == pCollectInfo ) { return RC::RC_COLLECT_NOTEXIST; } // 0°ªÀº Á¶°Ç ¾øÀ½ °ª. const QCODE qCode = (QCODE)pCollectInfo->m_Condition[CollectionInfo::QUEST]; const int iACCode = (int)pCollectInfo->m_Condition[CollectionInfo::AC]; const DWORD dwObjID = pCollectInfo->m_Condition[CollectionInfo::MAPOBJID]; const DWORD dwCount = pCollectInfo->m_Condition[CollectionInfo::COUNT]; if( 0 != qCode ) { Quest* pQuest = pPlayer->GetQuestManager()->FindQuest(qCode); if( NULL == pQuest || QS_NORMAL != pQuest->GetQState() ) { return RC::RC_COLLECT_FAIL_QCONDISION; } //------------------------------------------------------------------------------ // ItemManager* item_manager = pPlayer->GetItemManager(); QuestInfo* quest_info = pQuest->GetQuestInfo(); if (quest_info == NULL) { SUNLOG(eCRITICAL_LOG, _T("[%s:%d] cannot find quest info : %d"), __FUNCTION__, __LINE__, qCode); return RC::RC_COLLECT_FAIL_COUNTCONDISION; } QUEST_CONDITION_ITEM_INFO* quest_condition_item_info = \ static_cast( quest_info->FindCompleteCondition(eQUEST_CONDITION_ITEM)); if (quest_condition_item_info == NULL) { SUNLOG(eCRITICAL_LOG, _T("[%s:%d] cannot find quest complete condition item info : %d"), __FUNCTION__, __LINE__, qCode); return RC::RC_COLLECT_FAIL_COUNTCONDISION; } for(int i = 0; i < quest_condition_item_info->GetItemArrayCount(); ++i) { if(quest_condition_item_info->GetItemCode(i) == pCollectInfo->m_ItemCode) { // ÃæºÐÇÑ °³¼öÀÇ ¾ÆÀÌÅÛÀÌ ÀÖ´ÂÁö üũ int item_count = quest_condition_item_info->GetItemNum(i); int exist_count = item_manager->ExistItem(SI_INVENTORY, pCollectInfo->m_ItemCode, item_count); if (exist_count >= item_count) { return RC::RC_COLLECT_FAIL_COUNTCONDISION; } } } // //------------------------------------------------------------------------------ } if( 0 != iACCode ) { AchievementManager* pACMgr = pPlayer->GetACManager(); if( NULL == pACMgr || FALSE == pACMgr->CanCollectTreasureBox(iACCode) ) return RC::RC_COLLECT_FAIL_ACCONDISION; } const PairIsStampReturnValue is_stamp = _IsStamp(CollectionID); if (false != is_stamp.first) { GUILDGUID guildGuid = pPlayer->GetGuildGuid(); if (INVALID_GUILDGUID == guildGuid || ePRS_AT_DOMINATION_FIELD != pPlayer->GetGameZoneState()) return RC::RC_COLLECT_FAIL_STAMP_CONDISION; GameDominationField* pZone = (GameDominationField*)pPlayer->GetGameZonePtr(); #ifdef _NA_006826_20130722_DOMINATION_RENEWAL if (guildGuid == pZone->GetDefenseGuild()) { return RC::RC_COLLECT_FAIL_STAMP_CONDISION; } // Áö¿ªÁ¡·ÉÀü ½Ã°£ÀÌ Á¾·áµÇ±âÀü¿¡ °ø¼ºÃø¿¡¼­ Áö¿ª Á¡·É ÇßÀ» °æ¿ì.. if (pZone->GetOffenseGuild() == 0 && pZone->GetEventState() == DOMINATION_EVENT_END) { return RC::RC_COLLECT_FAIL_STAMP_CONDISION; } const GUILDGUID defense_guild_guild = pZone->GetDefenseGuild(); GameGuild* const defense_game_guild = g_GameGuildManager.FindGuild(defense_guild_guild); if (defense_game_guild) { GuildRelationSystem::GuildRelationEntry* defense_guild_entry = \ defense_game_guild->GetRelationEntry(); if (defense_guild_entry) { eGUILD_RELATION relation = \ defense_guild_entry->GetRelationType(guildGuid); if (relation == eGUILD_RELATION_ALLIENCE) { return RC::RC_COLLECT_FAIL_STAMP_CONDISION; } } } #else if (guildGuid != pZone->GetOffenseGuild()) return RC::RC_COLLECT_FAIL_STAMP_CONDISION; #endif // _NA_006826_20130722_DOMINATION_RENEWAL // ±æµå ¸¶½ºÅ͸¸ °¢ÀÎ °¡´ÉÇÑ °¢Àι° Ãß°¡. [5/13/2010 lst1024] // OBJ_STAMP : °ø°Ý ±æµå¿ø °¢ÀÎ °¡´É // OBJ_STAMP_USE_GUILD_MASTER : °ø°Ý ±æµå ¸¶½ºÅ͸¸ °¡´É if (is_stamp.second == CollectionInfo::OBJ_STAMP_USE_GUILD_MASTER && pPlayer->GetCharInfo()->m_eGuildDuty != eGUILD_DUTY_MASTER) return RC::RC_COLLECT_FAIL_STAMP_CONDISION; } //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND else if (_IsSealingStrongPoint(CollectionID)) { // Ç÷¹À̾ ÇöÀç ¹èÆ²±×¶ó¿îµåÁ¸¿¡ ÀÖ´ÂÁö üũ if (pPlayer->IsThereBattleGroundZone() == false) { SUNLOG(eCRITICAL_LOG, TEXT("[%s|%d] player is not in battle ground"), __FUNCTION__, __LINE__); return RC::RC_COLLECT_FAIL_COUNTCONDISION; } const BattleGround* const battle_ground = \ static_cast(pPlayer->GetCurrentChaosZone()); if (battle_ground == NULL || battle_ground->CanCheckSealing(pPlayer, CollectionID) == false) { return RC::RC_COLLECT_FAIL_COUNTCONDISION; } } #ifdef _NA_008334_20150608_SONNENSCHEIN else if(_IsSonnenScheinStamp(CollectionID) == TRUE) { GUILDGUID guildGuid = pPlayer->GetGuildGuid(); if (INVALID_GUILDGUID == guildGuid) { return RC::RC_COLLECT_FAIL_STAMP_CONDISION; } if (pPlayer->GetChaosZoneType() != eCHAOSZONE_TYPE_SONNENSCHEIN) { SUNLOG(eCRITICAL_LOG, TEXT("[%s|%d] player is not in SonnenSchein"), __FUNCTION__, __LINE__); return RC::RC_COLLECT_FAIL_COUNTCONDISION; } SonnenSchein* sonnenschein = static_cast(pPlayer->GetCurrentChaosZone()); if (sonnenschein == NULL) { return RC::RC_COLLECT_FAIL_COUNTCONDISION; } if (guildGuid != sonnenschein->GetRoomGuildGuid()) { return RC::RC_COLLECT_FAIL_STAMP_CONDISION; } //¼Ò³Ù»þÀÎ ³¡³µ´ÂÁö »óÅÂüũ // Start»óÅ¿¡¼­ °¢Àΰ¡´ÉÇÑ°Ç Á¤»óÀû ÄÉÀ̽º // None»óÅ °¢Àΰ¡´ÉÀº GMÀ¸·Î »ý¼ºµÈ ¼Ò³Ù»þÀÎÀ» À§ÇÑ °Í if (sonnenschein->GetEventState() != SONNENSCHEIN_EVENT_STATE_START && sonnenschein->GetEventState() != SONNENSCHEIN_EVENT_STATE_NONE) { return RC::RC_COLLECT_FAIL_STAMP_CONDISION; } } #endif //_NA_008334_20150608_SONNENSCHEIN #ifdef _NA_008543_20151027_ONE_DAYS_GUILD_MISSION else if(_IsOneDaysGuildmissionStamp(CollectionID) == TRUE) { GUILDGUID guildGuid = pPlayer->GetGuildGuid(); if (INVALID_GUILDGUID == guildGuid) { return RC::RC_COLLECT_FAIL_STAMP_CONDISION; } if (pPlayer->GetChaosZoneType() != eCHAOSZONE_TYPE_ONEDAYSGUILDMISSION) { SUNLOG(eCRITICAL_LOG, TEXT("[%s|%d] player is not in OneDaysGuildMission"), __FUNCTION__, __LINE__); return RC::RC_COLLECT_FAIL_COUNTCONDISION; } OneDaysGuildMission* onedaysguildmission = static_cast(pPlayer->GetCurrentChaosZone()); if (onedaysguildmission == NULL) { return RC::RC_COLLECT_FAIL_COUNTCONDISION; } } #endif //_NA_008543_20151027_ONE_DAYS_GUILD_MISSION else if( 0 != dwCount ) { CollectedList* pCollectedList = pPlayer->GetCollectedList(); if( NULL == pCollectedList || pCollectedList->GetCount(CollectionID) >= dwCount ) return RC::RC_COLLECT_FAIL_COUNTCONDISION; } if (0 != dwObjID) { GameField* pGameField = pPlayer->GetField(); if (NULL == pGameField) return RC::RC_COLLECT_FAIL_OBJECTID_CONDISION; const MapNpc* pMapNpc = pGameField->FindMapNpc(Conv_MapObjectKey(dwObjID)); // ±âȹÀÚÀÇ ½Ç¼ö·Î ¿ÀºêÁ§Æ®ÀÇ ID°¡ À߸ø ±âÀÔµÈ °æ¿ì. if (NULL == pMapNpc) return RC::RC_COLLECT_FAIL_OBJECTID_CONDISION; if (pMapNpc->IsAlive()) return RC::RC_COLLECT_FAIL_OBJECTID_CONDISION; } return RC::RC_COLLECT_SUCCESS; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // º¸»ó½ºÅ©¸³Æ®·ÎÀÇ ¿¬°áÀ» ÃßõÇßÀ¸³ª, // ±âȹÀÚ°¡ º¹±Ç ½ºÅ©¸³Æ®ÀÇ Çü½ÄÀ» äÁý½ºÅ©¸³Æ®°¡ ÀϺΠ°¡Áö´Â Çü½ÄÀ» ¿øÇÔ. RC::eITEM_RESULT CollectionManager::_RewardItem( Player* pPlayer, CollectionInfo* pInfo, INVENTORY_TOTAL_INFO& OUT TotalInfo ) { ItemManager* pMgr = pPlayer->GetItemManager(); MiniSlotInfo slotinfo; slotinfo.Index = pInfo->m_ItemCode; slotinfo.Random = pInfo->m_byScriptType; slotinfo.ItemTypeIndex = pInfo->m_IGType; SCItemSlot *pSlot = pMgr->GetItemFunctionLottery().MakeItemByLotteryInfo( slotinfo, slotinfo.Random, NULL); if( NULL == pSlot || 0 == pSlot->GetNum() ) { SUNLOG( eCRITICAL_LOG, "[CollectionManager::_RewardItem] º¸»ó Á¤º¸°¡ À߸øµÇ¾ú´Ù. [pSlot %s NULL], ItemNum[%d]", pSlot?"!=":"==", pSlot?pSlot->GetNum():-1 ); return RC::RC_ITEM_NOINFO; } RC::eITEM_RESULT rc = RC::RC_ITEM_FAILED; if( FALSE==pSlot->IsOverlap() ) rc = pMgr->Obtain( *pSlot, pSlot->GetNum(), &TotalInfo); else rc = pMgr->Obtain( pSlot->GetItemCode(), pSlot->GetNum(), &TotalInfo); if( RC::RC_ITEM_SUCCESS != rc ) { SUNLOG( eCRITICAL_LOG, "[CollectionManager::_RewardItem][%s]¿¡°Ô º¸»ó¾ÆÀÌÅÛ Áö±Þ ½ÇÆÐÇß´Ù. err[%d] ItemCode[%d] Num[%d] Overlap[%s]", pPlayer->GetCharName(), rc, pSlot->GetItemCode(), pSlot->GetNum(), TRUE==pSlot->IsOverlap()?"true":"false" ); } return rc; } // void CollectionManager::_Collected( CollectionStateInfo* pStateInfo ) { ASSERT(pStateInfo); Player* const pPlayer = PlayerManager::Instance()->FindPlayerByCharKey( pStateInfo->GetCollector() ); S_TRY { if( NULL == pPlayer ) S_THROW(RC::RC_COLLECT_FAIL_REWORD_EXIT_CHAR); //_NA001385_20090924_DOMINATION_STAMP if( pPlayer->IsDead() ) { const WzID collection_id = pStateInfo->GetCollectionID(); const PairIsStampReturnValue is_stamp = _IsStamp(collection_id); if (false != is_stamp.first) { S_THROW(RC::RC_COLLECT_FAIL_STAMP_DEAD_CHAR); } //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND else if (_IsSealingStrongPoint(collection_id)) { S_THROW(RC::RC_COLLECT_FAIL_STAMP_DEAD_CHAR); } else { S_THROW(RC::RC_COLLECT_FAIL_REWORD_DEAD_CHAR); } } CollectedList* pCollectedList = pPlayer->GetCollectedList(); if( pStateInfo->GetObjectKey() != pCollectedList->GetObjKeyCollecting() ) S_THROW(RC::RC_COLLECT_FAIL_REWORD_WRONG_COLLECTOBJKEY); WzVector vServerPos; pPlayer->GetPos( &vServerPos ); FLOAT fCurPosDiff = Math_Vector2DLength( vServerPos, pStateInfo->GetCollectorPos() ); if( MAX_COLLECT_DISTANCE_CHAR < fCurPosDiff ) { SUNLOG( eCRITICAL_LOG, "[CollectionManager::_Collected] [%s]°¡ äÁýº¸»ó À¯È¿ °Å¸®¸¦ ¹þ¾î³µ´Ù. °Å¸®Â÷[%d]", pPlayer->GetCharName(), fCurPosDiff ); S_THROW(RC::RC_COLLECT_FAIL_REWORD_POS); } const MAPOBJECT_INFO* pMapObjectInfo = pStateInfo->GetMapObjectInfo(); fCurPosDiff = Math_Vector2DLength( vServerPos, pMapObjectInfo->wvPos ); if( MAX_COLLECT_DISTANCE_OBJ < fCurPosDiff ) S_THROW(RC::RC_COLLECT_FAIL_REWORD_DISTANCE); } S_CATCH(DWORD, err) { // äÁý½Ã Ŭ¶óÀ̾ðÆ®ÀÇ °­Á¦Á¾·áµîÀÌ ¹ß»ýÇÒ°æ¿ì // Çʵ忡 ´Ù¸¥ Ç÷¹À̾ ¾ø´Ù¸é update´Â ÀÌ·ç¾î ÁöÁö ¾ÊÀ¸¸ç, _Collected()·Î // µé¾î ¿ÀÁö ¾Ê´Â´Ù. // ÀÌ °æ¿ì ´Ù¸¥ Ç÷¹À̾îÀÇ ÁøÀԽà RC_COLLECT_FAIL_REWORD_EXIT_CHAR°¡ // °°Àº Ç÷¹À̾î ÀçÁøÀԽà RC_COLLECT_FAIL_REWORD_WRONG_COLLECTOBJKEYÀÇ ¿¡·¯¸¦ ¹Þ´Â´Ù. // À̰æ¿ì äÁýÀÚ¿Í Ã¤Áý¹°Àº ¼­·Î °ü°è°¡ ¾ø´Â »óÅÂÀÌ´Ù. // ±×·¯¹Ç·Î äÁý¹° ±âÁØÀ¸·Î ÁÖÀ§¿¡ ÀÚ½Å(äÁý¹°)ÀÇ Ãë¼Ò¸¦ ¾Ë¸°´Ù. RC::eCOLLECT_RESULT rc = RC::RC_COLLECT_SUCCESS; switch(err) { case RC::RC_COLLECT_FAIL_REWORD_EXIT_CHAR: case RC::RC_COLLECT_FAIL_REWORD_WRONG_COLLECTOBJKEY: rc = Cancel(pStateInfo); SUNLOG( eCRITICAL_LOG, "[CollectionManager::_Collected] Player°¡ Á¸Àç ÇÏÁö ¾Ê¾Æ äÁý¹° ÁÖº¯¿¡ Ãë¼Ò¸¦ ¾Ë¸°´Ù."); break; default: { rc = Cancel(pPlayer); MSG_CG_COLLECT_ACTION_NAK msgNAK; msgNAK.m_byErrorCode = err; pPlayer->SendPacket(&msgNAK, sizeof(msgNAK)); SUNLOG( eCRITICAL_LOG, "[CollectionManager::_Collected] [%s] ¿¡°Ô ½ÇÆÐ ¸Þ½ÃÁö¸¦ º¸³½´Ù.", pPlayer->GetCharName()); } } SUNLOG( eCRITICAL_LOG, "[CollectionManager::_Collected] äÁýÈÄó¸® ¿¡·¯[%d] cancel[%s]", err, RC::RC_COLLECT_SUCCESS != rc?"fail":"success" ); return; } // äÁýÁ¾·á(¼º°ø) ¾Ë¸² CollectedList* pCollectedList = pPlayer->GetCollectedList(); CollectionInfo* pCollectionInfo = pStateInfo->GetCollectionInfo(); pCollectedList->SetSuccessCollectionInfo(pCollectionInfo); pCollectedList->EndCollecting(); Collection* pCollection = pStateInfo->GetCollection(); if( pCollection ) { m_pField->LeaveField( pCollection ); ObjectFactory::Instance()->FreeObject( pCollection ); } pStateInfo->StartRespawn(); } void CollectionManager::_Respawn( CollectionStateInfo* pStateInfo ) { MAPOBJECT_INFO* pMapInfo = pStateInfo->GetMapObjectInfo(); if( NULL == pMapInfo ) { char ch[5] = {0,}; SUNLOG( eCRITICAL_LOG, "[CollectionManager::_Respawn] pStateInfo Á¤º¸¿¡ ¸ÊÁ¤º¸°¡ ¾ø¾î Ȱ¼ºÈ­ ½Ãų¼ö ¾ø´Ù[%s].", WzIDToString(ch, pStateInfo->GetCollectionID()) ); return; } DWORD ObjKey = pStateInfo->GetObjectKey(); CollectionStateInfoManager::Release(pStateInfo); m_Hash.Remove(ObjKey); m_pField->CreateCollection(pMapInfo); } void CollectionManager::_Cancel( CollectionStateInfo* pStateInfo ) { DWORD ObjKey = pStateInfo->GetObjectKey(); CollectionStateInfoManager::Release(pStateInfo); m_Hash.Remove(ObjKey); } //////////////////////////////////////////////////////////////////////////////////////////////// // void CollectionManager::Update() { BYTE stat = 0; bool delete_iterator = false; ACTIVE_COLLECTION_HASH_IT it = m_Hash.begin(), end = m_Hash.end(); while( it != end ) { CollectionStateInfo* pStateInfo = *it; if( NULL == pStateInfo ) { SUNLOG( eCRITICAL_LOG, "CollectionManager::Update() À߸øµÈ »óÅ Á¤º¸¸¦ Æ÷ÇÔÇϰí ÀÖ´Ù." ); ++it; continue; } delete_iterator = false; if (pStateInfo->update(&stat)) { switch(stat) { // äÁý¿Ï·á case CollectionStateInfo::Collecting: _Collected(pStateInfo); break; // ½ºÆù¿Ï·á case CollectionStateInfo::Respawning: { MAPOBJECT_INFO* pMapInfo = pStateInfo->GetMapObjectInfo(); if (pMapInfo) { CollectionStateInfoManager::Release(pStateInfo); it = m_Hash.erase(it); m_pField->CreateCollection(pMapInfo); delete_iterator = true; } else { char ch[5] = {0,}; SUNLOG( eCRITICAL_LOG, "[CollectionManager::_Respawn] pStateInfo Á¤º¸¿¡ ¸ÊÁ¤º¸°¡ ¾ø¾î Ȱ¼ºÈ­ ½Ãų¼ö ¾ø´Ù[%s].", WzIDToString(ch, pStateInfo->GetCollectionID()) ); } } break; } } if( CollectionStateInfo::cancel == stat ) { CollectionStateInfoManager::Release(pStateInfo); it = m_Hash.erase(it); delete_iterator = true; } if (delete_iterator == false) ++it; } } //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND bool CollectionManager::_IsSealingStrongPoint(WzID collection_id) { const CollectionInfo* const collection_info = CollectionParser::Instance()->FindCollectionInfo(collection_id); if (collection_info == NULL) { return false; } const DWORD stamp = collection_info->m_Condition[CollectionInfo::STAMP]; return (CollectionInfo::OBJ_BATTLE_GROUND_STRONGPOINT == stamp) ? true : false; } void CollectionManager::_StartSealing(Player* player, WzID collection_id) { if (player->IsThereBattleGroundZone() == false) { SUNLOG(eCRITICAL_LOG, TEXT("[%s|%d] player is not in battle ground"), __FUNCTION__, __LINE__); return; } const CollectionInfo* conllection_info = CollectionParser::Instance()->FindCollectionInfo(collection_id); if (conllection_info != NULL) { StatusManager* status_manager = player->GetStatusManager(); #ifdef _NA_007667_20141001_WITCHBLADE_SKILL status_manager->AllocStampStatus(conllection_info->m_dwCollectingTime); #else //¾ÆÀ̾ð ¹Ùµð, °­Ã¶ »óÅ´ °¢Àνà »ç¶óÁø´Ù. status_manager->Remove(eCHAR_STATE_STEEL); status_manager->Remove(eCHAR_STATE_IMMUNITY_DAMAGE); status_manager->AllocStatus(eCHAR_STATE_STAMP, conllection_info->m_dwCollectingTime); #endif //_NA_007667_20141001_WITCHBLADE_SKILL } BattleGround* const battle_ground = static_cast(player->GetCurrentChaosZone()); if (battle_ground == NULL) { return; } if (battle_ground->StartSealing(player, collection_id) == false) { Cancel(player); } } void CollectionManager::_CancelSealing(Player* player, WzID collection_id) { GameInstanceDungeon* const instance_dungeon = static_cast(m_pField->GetGameZone()); if (instance_dungeon == NULL) { return; } ChaosZoneManager* const chaoszone_manager = instance_dungeon->GetChaosZoneManager(); if (chaoszone_manager == NULL || chaoszone_manager->GetChaosZoneType() != kBattleGround) { return; } BattleGround* const battle_ground = static_cast(chaoszone_manager->GetCurrentZone()); if (battle_ground == NULL) { return; } if (player) { StatusManager* status_manager = player->GetStatusManager(); status_manager->Remove(eCHAR_STATE_STAMP); } battle_ground->CancelSealing(player, collection_id); } #ifdef _NA_008334_20150608_SONNENSCHEIN BOOL CollectionManager::_IsSonnenScheinStamp( WzID collection_id ) { const CollectionInfo* pCollectInfo = CollectionParser::Instance()->FindCollectionInfo(collection_id); if( NULL != pCollectInfo ) { const DWORD dwStamp = pCollectInfo->m_Condition[CollectionInfo::STAMP]; const bool is_stamp = (CollectionInfo::OBJ_SONNENSCHEIN_STAMP == dwStamp); return is_stamp; } return FALSE; } VOID CollectionManager::_StartSonnenScheinStamp( Player* player, WzID collection_id ) { //°¢ÀλóŸ¦ °Ç´Ù const CollectionInfo* conllection_info = CollectionParser::Instance()->FindCollectionInfo(collection_id); if (conllection_info != NULL) { StatusManager* status_manager = player->GetStatusManager(); status_manager->AllocStampStatus(conllection_info->m_dwCollectingTime); } MSG_CG_SONNENSCHEIN_BEGIN_STAMP_BRD brd_msg; brd_msg.stamp_id = collection_id; //°¢ÀÎ ½ÃÀ۽ð£À» ÀúÀåÇÑ´Ù. if(player->GetChaosZoneType() == eCHAOSZONE_TYPE_SONNENSCHEIN) { //SonnenSchein¿¡¼­ÀÇ °¢ÀÎ ChaosZone* chaos_zone = player->GetCurrentChaosZone(); if (chaos_zone != NULL) { SonnenSchein* sonnenschein = static_cast(chaos_zone); sonnenschein->SetStampStartTime(); //packet send m_pField->SendPacketToAll(&brd_msg, sizeof(brd_msg)); } } } VOID CollectionManager::_CancelSonnenScheinStamp( Player* player, WzID collection_id ) { MSG_CG_SONNENSCHEIN_CANCEL_STAMP_BRD brd_msg; brd_msg.stamp_id = collection_id; if (player == NULL) { m_pField->SendPacketToAll(&brd_msg, sizeof(brd_msg)); } else { StatusManager* status_manager = player->GetStatusManager(); status_manager->Remove(eCHAR_STATE_STAMP); m_pField->SendPacketToAll(&brd_msg, sizeof(brd_msg)); } //°¢ÀÎ ½ÃÀ۽ð£À» ÃʱâÈ­ ÇÑ´Ù. //Player°¡ NULLÀÏ ¼ö ÀÖ´Â ÇÔ¼öÀ̹ǷΠGameZoneÀ» ÅëÇØ Á÷Á¢ SonnenSchein¿¡ Á¢±ÙÇÑ´Ù GameInstanceDungeon* const instance_dungeon = static_cast(m_pField->GetGameZone()); if (instance_dungeon == NULL) { return; } ChaosZoneManager* const chaoszone_manager = instance_dungeon->GetChaosZoneManager(); if (chaoszone_manager == NULL || chaoszone_manager->GetChaosZoneType() != eCHAOSZONE_TYPE_SONNENSCHEIN) { return; } SonnenSchein* const sonnenschein = static_cast(chaoszone_manager->GetCurrentZone()); if (sonnenschein == NULL) { return; } sonnenschein->InitStampCheckTime(); } #endif //_NA_008334_20150608_SONNENSCHEIN #ifdef _NA_008543_20151027_ONE_DAYS_GUILD_MISSION BOOL CollectionManager::_IsOneDaysGuildmissionStamp( WzID collection_id ) { const CollectionInfo* pCollectInfo = CollectionParser::Instance()->FindCollectionInfo(collection_id); if( NULL != pCollectInfo ) { const DWORD dwStamp = pCollectInfo->m_Condition[CollectionInfo::STAMP]; const bool is_stamp = (CollectionInfo::OBJ_ONEDYSGUILDMISSION_STAMP == dwStamp); return is_stamp; } return FALSE; } VOID CollectionManager::_StartOneDaysGuildmissionStamp( Player* player, WzID collection_id ) { //°¢ÀλóŸ¦ °Ç´Ù const CollectionInfo* conllection_info = CollectionParser::Instance()->FindCollectionInfo(collection_id); if (conllection_info != NULL) { StatusManager* status_manager = player->GetStatusManager(); status_manager->AllocStampStatus(conllection_info->m_dwCollectingTime); } MSG_CG_ONEDAYSGUILDMISSION_BEGIN_STAMP_BRD brd_msg; brd_msg.stamp_id = collection_id; //°¢ÀÎ ½ÃÀ۽ð£À» ÀúÀåÇÑ´Ù. if(player->GetChaosZoneType() == eCHAOSZONE_TYPE_ONEDAYSGUILDMISSION) { // ÀÏÀϱæµå¹Ì¼Ç¿¡¼­ÀÇ °¢ÀÎ ChaosZone* chaos_zone = player->GetCurrentChaosZone(); if (chaos_zone != NULL) { OneDaysGuildMission* Onedaysguildmission = static_cast(chaos_zone); Onedaysguildmission->SetStampStartTime(); //packet send m_pField->SendPacketToAll(&brd_msg, sizeof(brd_msg)); } } } VOID CollectionManager::_CancelOneDaysGuildmissionStamp( Player* player, WzID collection_id ) { MSG_CG_ONEDAYSGUILDMISSION_CANCEL_STAMP_BRD brd_msg; brd_msg.stamp_id = collection_id; if (player == NULL) { m_pField->SendPacketToAll(&brd_msg, sizeof(brd_msg)); } else { StatusManager* status_manager = player->GetStatusManager(); status_manager->Remove(eCHAR_STATE_STAMP); m_pField->SendPacketToAll(&brd_msg, sizeof(brd_msg)); } //°¢ÀÎ ½ÃÀ۽ð£À» ÃʱâÈ­ ÇÑ´Ù. //Player°¡ NULLÀÏ ¼ö ÀÖ´Â ÇÔ¼öÀ̹ǷΠGameZoneÀ» ÅëÇØ Á÷Á¢ oneDaysGuildMission¿¡ Á¢±ÙÇÑ´Ù GameInstanceDungeon* const instance_dungeon = static_cast(m_pField->GetGameZone()); if (instance_dungeon == NULL) { return; } ChaosZoneManager* const chaoszone_manager = instance_dungeon->GetChaosZoneManager(); if (chaoszone_manager == NULL || chaoszone_manager->GetChaosZoneType() != eCHAOSZONE_TYPE_SONNENSCHEIN) { return; } OneDaysGuildMission* const onedaysguildmission = static_cast(chaoszone_manager->GetCurrentZone()); if (onedaysguildmission == NULL) { return; } onedaysguildmission->InitStampCheckTime(); } #endif // (_NA_008543_20151027_ONE_DAYS_GUILD_MISSION) ////////////////////////////////////////////////////////////////////////////////////////////////