#include "StdAfx.h" #include #include #include "GameDominationManager.h" #include "DominationInfoParser.h" #include "GameDominationField.h" #include "GameZoneManager.h" #include "SkillAttrCalculator.h" #include "Player.h" #include "StatusManager.h" #include "GameGuildManager.h" #include "GameGuild.h" #include "GameGuildMember.h" #include #include #include "GameZoneManager.h" #include "ItemManager.h" #include "ResultCode.h" #include "DominationArea.h" #include "DominationAuction.h" #include "ServerOptionParserEx.h" #ifdef _NA_20101214_CHANGE_AUCTION_ITEM_CHECK_WAY #include "SlotManager.h" #endif #ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION #include "MapInfoParser.h" #endif //_NA_007128_20140326_MONDSCHIEN_DOMINATION #ifdef _NA_007488_20140811_MONDSCHUEN_INITIALIZE_N_REWARD #include "GameInstanceDungeon.h" #endif // _NA_007488_20140811_MONDSCHUEN_INITIALIZE_N_REWARD GameDominationManager::GameDominationManager() :is_initialize_(false) //_NA_20110406_CHANGE_RULE_FOR_DOMINATION_JOIN ,is_init_member_(false) { domination_update_timer_.SetTimer(1000*5); } GameDominationManager::~GameDominationManager() { _DeleteArea(); } void GameDominationManager::_DeleteArea() { AreaInfoMapIterator begin_iterator = area_info_map_.begin(), end_iterator = area_info_map_.end(); for (; begin_iterator != end_iterator; ++begin_iterator) { DominationArea* domination_area = begin_iterator->second; delete domination_area; } area_info_map_.clear(); } void GameDominationManager::SetAuctionData(MAPCODE map_code, const DominationAuctionInfo* auction_info, int data_count) { DominationArea* domination_area = GetAreaInfo(map_code); if (domination_area == NULL) { return; } DominationAuction* auction = domination_area->GetAuction(); if (auction == NULL) { return; } auction->SetInfo(auction_info, data_count); } bool GameDominationManager::UpdateAuctionData(Player* player, MAPCODE map_code, const DominationAuctionInfo& db_auction_info) { if (player == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__":Player not found"); return false; } DominationArea* domination_area = GetAreaInfo(map_code); if (domination_area == NULL) { return false; } DominationAuction* auction = domination_area->GetAuction(); if (auction == NULL) { return false; } eDOMINATION_TENDER_TYPE type = auction->EntryAuction(db_auction_info); if (type == NEW_TENDER_COST) { MONEY money; #ifdef _CH_20100420_CHANGE_DOMINATION_APPLY_WAY money = DominationInfoParser::Instance()->GetAreaLimitMoney(map_code); #else money = db_auction_info.m_ActionInfo.m_TenderCost; #endif player->MinusMoney(money); GAMELOG->LogMoney(MONEY_DOMINATION_ACTIONMONEY_APPLY, player, money); } else if (type == DUP_TENDER_COST) { #ifndef _CH_20100420_CHANGE_DOMINATION_APPLY_WAY GUILDGUID guild_guid = db_auction_info.m_ActionInfo.m_GuilGuid; MONEY existing_money = GetTenderCost(map_code, guild_guid), apply_money = db_auction_info.m_ActionInfo.m_TenderCost; if (existing_money >= apply_money) { SUNLOG(eCRITICAL_LOG, __FUNCTION__":Action money incorrect : %d , %d", map_code, db_auction_info.m_ActionInfo.m_GuilGuid); return false; } //°æ¸Å Â÷¾× = »õ·Î Ãß°¡ÇÒ °æ¸Å ±Ý¾× - ±âÁ¸ °æ¸Å ±Ý¾× player->MinusMoney(apply_money - existing_money); GAMELOG->LogMoney(MONEY_DOMINATION_ACTIONMONEY_APPLY, player, money); #endif } return true; } MONEY GameDominationManager::GetTenderCost(MAPCODE map_code, GUILDGUID guild_guid)const { const DominationArea* domination_area = FindAreaInfo(map_code); if (domination_area == NULL) { // ¸ÊÄÚµå´Â ¿©±â¿¡ ÁøÀÔÀü¿¡ ¹Ýµå½Ã »çÀü°Ë»ç µÇ¾î¾ß ÇÔ¼öÀÇ ³í¸®Àû Àǹ̰¡ Á¤È®ÇØ Áø´Ù. // ¿©±â¿¡ ÁøÀÔÇß´Ù¸é ÁøÀÔ °æ·Î¸¦ °ËÅäÇØ º¸¾Æ¾ß ÇÑ´Ù. SUNLOG(eCRITICAL_LOG, __FUNCTION__"Not found domination area info : %d", map_code); return 0; } const DominationAuction* auction = domination_area->GetAuction(); if (auction == NULL) { return 0; } return auction->GetTenderCost(guild_guid); } MONEY GameDominationManager::GetBestTenderCost(MAPCODE map_code)const { const DominationArea* domination_area = FindAreaInfo(map_code); if (domination_area == NULL) { return 0; } const DominationAuction* auction = domination_area->GetAuction(); if (auction == NULL) { return 0; } return auction->GetBestTenderCost(); } const DominationArea* GameDominationManager::FindAreaInfo(MAPCODE map_code)const { ConstAreaInfoMapIterator find_iterator = area_info_map_.find(map_code); if (find_iterator == area_info_map_.end()) { SUNLOG(eCRITICAL_LOG,__FUNCTION__"Not found domination area info : %d", map_code); return NULL; } return find_iterator->second; } DominationArea* GameDominationManager::GetAreaInfo(MAPCODE map_code) { AreaInfoMapIterator find_iterator = area_info_map_.find(map_code); if (find_iterator == area_info_map_.end()) { assert(!"Not found domination area info"); SUNLOG(eCRITICAL_LOG,__FUNCTION__"Not found domination area info : %d", map_code); return NULL; } return find_iterator->second; } void GameDominationManager::LoadProcess() { if (_IsLoadedScript() == false) { SUNLOG(eCRITICAL_LOG,__FUNCTION__" : Script data is not yet loaded"); return; } if (is_initialize_ == false) { _Initialize(); } (_CheckLoadedStatus()) ? domination_update_timer_.DisableCheckTime() : _RequestAreaInfoLoad(); } void GameDominationManager::_Initialize() { is_initialize_ = true; _CreateArea(); } bool GameDominationManager::_CheckLoadedStatus() { ConstAreaInfoMapIterator begin_iterator = area_info_map_.begin(), end_iterator = area_info_map_.end(); for (; begin_iterator != end_iterator; ++begin_iterator) { const DominationArea& domination_area = *(begin_iterator->second); if (domination_area.IsLoaded() == false) { return false; } } SUNLOG(eCRITICAL_LOG, __FUNCTION__":Complete domination data load"); return true; } void GameDominationManager::_InsertDomiationInfo() { ConstAreaInfoMapIterator begin_iterator = area_info_map_.begin(), end_iterator = area_info_map_.end(); for (; begin_iterator != end_iterator; ++begin_iterator) { const DominationArea& domination_area = *(begin_iterator->second); const DOMINATION_INFO* domination_info = &(domination_area.GetInfo()); MAPCODE map_code = domination_area.GetMapCode(); GameDominationField* domination_field = static_cast(g_GameZoneManager.GetFieldVillageZone(map_code)); if (domination_field == NULL) { SUNLOG(eCRITICAL_LOG,__FUNCTION__"Not found domination field : %d", map_code); continue; } domination_field->InsertDominationInfo(domination_info); } } void GameDominationManager::_RequestAreaInfoLoad()const { ConstAreaInfoMapIterator begin_iterator = area_info_map_.begin(), end_iterator = area_info_map_.end(); for (; begin_iterator != end_iterator; ++begin_iterator) { const DominationArea& domination_area = *(begin_iterator->second); if (domination_area.IsLoaded() == false) { domination_area.DataLoad(); } } } void GameDominationManager::_CreateArea() { const ScriptDataMap& script_infos = DominationInfoParser::Instance()->GetDominationInfoMap(); for (ScriptDataMap::const_iterator it = script_infos.begin(); it != script_infos.end(); ++it) { const MAPCODE map_code = it->first; DominationArea* area = new DominationArea(map_code); area_info_map_[map_code] = area; } } void GameDominationManager::_SetDominationInfo(const DOMINATION_INFO& domination_info) { const MAPCODE map_code = domination_info.m_FieldCode; DominationArea* domination_area = GetAreaInfo(map_code); if (domination_area == NULL) { return; } #ifdef _NA_006826_20130722_DOMINATION_RENEWAL domination_area->SetInfo(domination_info, _GetCurrentDominationEvent(map_code)); #else domination_area->SetInfo(domination_info); #endif //_NA_006826_20130722_DOMINATION_RENEWAL } void GameDominationManager::_UpdateDominationInfo(const DOMINATION_INFO& domination_info) { const MAPCODE map_code = domination_info.m_FieldCode; DominationArea* domination_area = GetAreaInfo(map_code); if (domination_area == NULL) { return; } domination_area->UpdateInfo(domination_info); } bool GameDominationManager::_IsAvailableAuctionArea(MAPCODE map_code)const { ConstAreaInfoMapIterator find_iterator = area_info_map_.find(map_code); if (find_iterator == area_info_map_.end()) { assert(!"Is not auction area"); SUNLOG(eCRITICAL_LOG, __FUNCTION__":Is not auction area : %d", map_code); return false; } return true; } RC::eITEM_RESULT GameDominationManager::RewardItem(Player* player, int amount_cost, SLOTCODE item_code) { if (player == NULL) { assert(!"Player Not Found"); return RC::RC_ITEM_FAILED; } MSG_CG_ITEM_OBTAIN_ITEM_CMD send_msg; RC::eITEM_RESULT result_code = player->GetItemManager()->Obtain(item_code, amount_cost, &send_msg.m_tagInventory); if (result_code != RC::RC_ITEM_SUCCESS) { return result_code; } player->SendPacket(&send_msg, send_msg.GetSize()); return result_code; } //_NA_20110216_INCREASE_DOMINATION_DEFFENSEWALL_POINT bool GameDominationManager::RemovePointItem(Player* player, SLOTCODE item_code) { MSG_CG_ITEM_LOSE_ACK ack_msg; { ItemManager* item_manager = player->GetItemManager(); const POSTYPE item_num = 1; RC::eITEM_RESULT result_value = item_manager->DeleteAllKindOfItem(1, &item_code, &item_num, &(ack_msg.m_ItemInfo)); if (result_value != RC::RC_ITEM_SUCCESS) { return false; } } player->SendPacket( &ack_msg, ack_msg.GetSize() ); return true; } bool GameDominationManager::IncreaseDeffenseWallPoint(Player* player, SLOTCODE item_code, MAPCODE map_code) { DominationArea* domination_area = GetAreaInfo(map_code); if (domination_area == NULL) { return false; } if (player == NULL) { assert(!"Player Not Found"); SUNLOG(eCRITICAL_LOG,"["__FUNCTION__"]Player Not Found"); return false; } //¾ÆÀÌÅÛ À¯È¿¼º °Ë»ç const ItemInfoParser* const item_info_parser = ItemInfoParser::Instance(); const BASE_ITEMINFO* const point_item = item_info_parser->GetItemInfo(item_code); if (point_item->m_wType != eITEMTYPE_DOMINATION_DEFFENSE_POINT && point_item->m_wType != eITEMTYPE_DOMINATION_DEFFENSE_CASH_POINT) { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"]Not same point item type[code:%d]", item_code); return false; } //¾ÆÀÌÅÛ »èÁ¦ if (RemovePointItem(player, item_code) != true) { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"]Fail delete add point item[code:%d]", item_code); return false; } //Æ÷ÀÎÆ® Áõ°¡¹× Á¤º¸ ¾÷µ¥ÀÌÆ® DOMINATION_INFO& domination_info = domination_area->GetInfo(); ++(domination_info.m_TotalPoint); MSG_GZ_DOMINATION_ADD_DEFFENSEWALL_POINT_SYN send_msg; send_msg.m_dwKey = player->GetCharGuid(); send_msg.domination_info_ = domination_info; send_msg.item_code_ = item_code; if (g_pGameServer->SendToServer(GUILD_SERVER, &send_msg, sizeof(send_msg)) == false) { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"]Not connected to guild server"); return false; } return true; } RC::eDOMINATION_RESULT GameDominationManager::CanIncreaseDeffenseWallPoint(Player* player, MAPCODE map_code) { if (player == NULL) { return RC::DOMINATION_RESULT_FAIL; } //Æ®·»Á§¼Ç üũ const DominationArea* domination_area = FindAreaInfo(map_code); if (domination_area == NULL) { return RC::DOMINATION_RESULT_FAIL; } if (domination_area->CanIncreaseDeffenseWall() == false) { return RC::DOMINATION_RESULT_FAIL; } //±æµå À¯È¿¼º GameGuildMember* guild_member = _GetGuildMemberInfo(player); if (guild_member == NULL) { return RC::DOMINATION_RESULT_NOT_GUILDMEMBER; } else if (guild_member->GetDuty() != eGUILD_DUTY_MASTER) { return RC::DOMINATION_RESULT_NOT_GUILDMASTER; } const DOMINATION_INFO* domination_info = GetDominationInfo(map_code); if (domination_info == NULL) { return RC::DOMINATION_RESULT_FAIL; } else if (player->GetGuildGuid() != domination_info->m_inGuildInfo.m_GuildGuid) { return RC::DOMINATION_RESULT_NOT_GUILDMEMBER; } //¹æº® Æ÷ÀÎÆ® À¯È¿¼º int total_point = _GetDefenseWallTotalPoint(map_code); const BYTE max_point = MAX_DOMINATION_DEFENSEWALL_NUM * DOMINATION_DEFFENSWALL_POINT; if (total_point < 0 || total_point >= max_point) { return RC::DOMINATION_RESULT_FAIL; } return RC::DOMINATION_RESULT_SUCCESS; } void GameDominationManager::_InitDefenseWall(MAPCODE map_code) { DominationArea* domination_area = GetAreaInfo(map_code); if (domination_area == NULL) { return; } DOMINATION_INFO& info = domination_area->GetInfo(); info.m_DeffenseWallA = 0; info.m_DeffenseWallB = 0; info.m_DeffenseWallC = 0; info.m_TotalPoint = 5; } RC::eDOMINATION_RESULT GameDominationManager::CanSaveGateState(Player* player, MAPCODE map_code, const BYTE* deffens_wall) { if (player == NULL) { return RC::DOMINATION_RESULT_FAIL; } GameGuildMember* guild_member = _GetGuildMemberInfo(player); if (guild_member == NULL) { //ÇØ´ç Äɸ¯ÅͰ¡ ±æµå¿¡ ¼ÓÇÏ¿© ÀÖ¾î¾ß ÇÑ´Ù. return RC::DOMINATION_RESULT_NOT_GUILDMEMBER; } else if (guild_member->GetDuty() != eGUILD_DUTY_MASTER) { //ÇØ´ç Äɸ¯ÅͰ¡ ±æµå ¸¶½ºÅͰ¡ ¾Æ´Ï´Ù. return RC::DOMINATION_RESULT_NOT_GUILDMASTER; } bool check_defense_wall = CheckDefenseWall(map_code, deffens_wall); if (check_defense_wall == false) { //ÀúÀåÇÏ·Á´Â ¹æº® µ¥ÀÌÅͰ¡ »ç¿ëÇÒ ¼ö ÀÖ´Â ÃÑ Æ÷ÀÎÆ®º¸´Ù ³ô´Ù. return RC::DOMINATION_RESULT_DEFFENSEWALL_OVERPOINT; } const DOMINATION_INFO* domination_info = GetDominationInfo(map_code); if (domination_info == NULL) { return RC::DOMINATION_RESULT_FAIL; } #ifdef _NA_006826_20130722_DOMINATION_RENEWAL #else const DOMINATION_BASIC_GUILD_INFO& guild_info = domination_info->m_inGuildInfo; if (_strnicmp(guild_info.m_tszGuildMaster, player->GetCharName(), _countof(guild_info.m_tszGuildMaster) != 0)) { //ÇØ´ç Áö¿ª ¸¶½ºÅͰ¡ ¾Æ´Ï´Ù. return RC::DOMINATION_RESULT_NOT_GUILDMASTER; } #endif //_NA_006826_20130722_DOMINATION_RENEWAL return RC::DOMINATION_RESULT_SUCCESS; } void GameDominationManager::ResponseAuctionApply(Player* player, MAPCODE map_code)const { MSG_CG_DOMINATION_APPLY_ACK ack_msg; eDOMINATION_EVENT_STATE current_event = _GetCurrentDominationEvent(map_code); if (_IsApplyAuction(player, current_event) == true) { ack_msg.m_ResultCode = RC::DOMINATION_RESULT_SUCCESS; ack_msg.m_CheckBatting = _CanAuctionBatting(player, map_code); ack_msg.m_DataNum = _GetAuctionList(map_code, ack_msg.m_ActionList, _countof(ack_msg.m_ActionList)); } else { ack_msg.m_ResultCode = RC::DOMINATION_RESULT_FAIL; ack_msg.m_DataNum = 0; } player->SendPacket(&ack_msg, ack_msg.GetSize()); } void GameDominationManager::SendDominationNotice(Player* player, MAPCODE map_code) { if (player == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__":Not found player"); return; } const DOMINATION_INFO* domination_info = GetDominationInfo(map_code); if (domination_info == NULL) { return; } //Ŭ¶óÀÌ¾ðÆ® Ãø¿¡¼­ guild_guid °¡ 0ÀÏ °æ¿ì¿¡ µû·Î ó¸® ÇØ¾ß ÇÏ´Â ·ÎÁ÷ÀÌ Á¸Àç MSG_CG_DOMINATION_NOTICE_ACK ack_msg; ack_msg.m_ResultCode = RC::DOMINATION_RESULT_SUCCESS; ack_msg.m_GuildInfo.m_GuildGuid = 0; DOMINATION_GUILD_INFO& guild_info = ack_msg.m_GuildInfo; eDOMINATION_EVENT_STATE current_event = _GetCurrentDominationEvent(map_code); if (current_event > DOMINATION_EVENT_AUCTION_START && current_event < DOMINATION_EVENT_END) { const DOMINATION_BASIC_GUILD_INFO& dis_guild_info = domination_info->m_disGuildInfo; guild_info.m_GuildGuid = dis_guild_info.m_GuildGuid;; guild_info.m_PatternIndex = dis_guild_info.m_PatternIndex; guild_info.m_BackGroundIndex = dis_guild_info.m_BackGroundIndex; _tcsncpy(guild_info.m_tszGuildName, dis_guild_info.m_tszGuildName, _countof(guild_info.m_tszGuildName)); guild_info.m_tszGuildName[_countof(guild_info.m_tszGuildName) - 1] = '\0'; _tcsncpy(guild_info.m_tszGuildMaster, dis_guild_info.m_tszGuildMaster, _countof(guild_info.m_tszGuildMaster)); guild_info.m_tszGuildMaster[_countof(guild_info.m_tszGuildMaster) - 1] = '\0'; #ifdef _NA_006826_20130722_DOMINATION_RENEWAL guild_info.progress_state_ = domination_info->progress_state_; #endif //_NA_006826_20130722_DOMINATION_RENEWAL } CheckNotice(player, map_code, ack_msg); player->SendPacket(&ack_msg, sizeof(ack_msg)); //_NA_20110406_CHANGE_RULE_FOR_DOMINATION_JOIN SendMemberList(player, map_code); } #ifdef _CH_20100420_CHANGE_DOMINATION_APPLY_WAY RC::eDOMINATION_RESULT GameDominationManager::CanEntryAuctionCost(Player* player, MAPCODE map_code, int entry_money, POSTYPE pos) const { if (player == NULL) { return RC::DOMINATION_RESULT_FAIL; } if (player->GetBehave() != PLAYER_BEHAVE_IDLE_STATE) { return RC::DOMINATION_RESULT_FAIL; } #ifdef _NA_20120511_WORK_TO_DOMINATION_ADDITIONAL_REQUEST GameGuild* guild = g_GameGuildManager.FindGuild(player->GetGuildGuid()); if (guild == NULL) { SUNLOG( eFULL_LOG, __FUNCTION__" : Not found guild info for current player : guid = %d", player->GetCharGuid() ); return RC::DOMINATION_RESULT_FAIL; } const sDOMINATION_INFO* const parser_info = DominationInfoParser::Instance()->GetDominationInfo(map_code); if (parser_info == NULL) { SUNLOG( eCRITICAL_LOG, __FUNCTION__" : Not found script data : map code = %d", map_code); return RC::DOMINATION_RESULT_FAIL;; } BYTE check_guild_level = parser_info->m_BattingGuildLevelLimit; if (check_guild_level > guild->GetGuildGrade()) { return RC::DOMINATION_RESULT_AUCTION_LOW_LEVEL; } #endif //ÇöÁö¿ª °æ¸Å µ¥ÀÌÅÍ °¹¼ö °Ë»ç const DominationArea* domination_area = FindAreaInfo(map_code); const DominationAuction* auction = domination_area->GetAuction(); if (auction->CountAuctionList() > MAX_DOMINATION_AUCTION) { return RC::DOMINATION_RESULT_FAIL; } //°æ¸Å Áö¿ª ¸Ê ÄÚµå °Ë»ç if (_IsAvailableAuctionArea(map_code) == false) { return RC::DOMINATION_RESULT_FAIL; } //ÀÔÂû ¾ÆÀÌÅÛ °Ë»ç bool check_token = CheckDominationTokken(player, entry_money, pos, map_code); if (check_token == false) { return RC::DOMINATION_RESULT_FAIL; } //±æµå ¸É¹ö Á¤º¸ GameGuildMember *guild_member = _GetGuildMemberInfo(player); if (guild_member == NULL) { return RC::DOMINATION_RESULT_NOT_GUILDMEMBER; } else if (guild_member->GetDuty() != eGUILD_DUTY_MASTER) { return RC::DOMINATION_RESULT_NOT_GUILDMASTER; } //ÇöÀç À̺¥Æ® eDOMINATION_EVENT_STATE current_event = _GetCurrentDominationEvent(map_code); if (_IsApplyAuction(player, current_event) == FALSE ) { return RC::DOMINATION_RESULT_FAIL; } //±âȹ º¯°æ : ÇÑÁÖ¿¡ ÇÑÁö¿ª ÀÔÂû -> ÇÑÁÖ¿¡ ¿©·¯Áö¿ª ÀÔÂû //ÀÔÂû ³»¿ª °Ë»ç //MAPCODE applied_map_code = _DidApplyGuild(player->GetGuildGuid()); //if (applied_map_code != 0 && applied_map_code != map_code) //{ // return RC::DOMINATION_RESULT_CAN_BETTING_ONLYONE_AREA; //} //Áö¿ª ±âº» ÀÔÂû±Ý MONEY base_cost = DominationInfoParser::Instance()->GetAreaLimitMoney(map_code); if (player->GetMoney() < base_cost ) { //±âÁ¸ ÀÔÂû±ÝÀÌ ÀÖ´Â °æ¿ì¿¡´Â Ãß°¡ ºñ¿ëÀÌ µéÁö ¾Ê´Â´Ù. MONEY tender_cost = GetTenderCost(map_code, player->GetGuildGuid()); if(tender_cost == 0) { return RC::DOMINATION_RESULT_NOT_ENOUGHMONEY; } } return RC::DOMINATION_RESULT_SUCCESS; } #else//_CH_20100420_CHANGE_DOMINATION_APPLY_WAY RC::eDOMINATION_RESULT GameDominationManager::CanEntryAuctionCost(Player* player, MAPCODE map_code, MONEY entry_money) const { if (player == NULL) { return RC::DOMINATION_RESULT_FAIL; } if (player->GetBehave() != PLAYER_BEHAVE_IDLE_STATE) { return RC::DOMINATION_RESULT_FAIL; } //ÇöÁö¿ª °æ¸Å µ¥ÀÌÅÍ °¹¼ö °Ë»ç const DominationArea* domination_area = FindAreaInfo(map_code); const DominationAuction* auction = domination_area->GetAuction(); if (auction->CountAuctionList() > MAX_DOMINATION_AUCTION) { return RC::DOMINATION_RESULT_FAIL; } //°æ¸Å Áö¿ª ¸Ê ÄÚµå °Ë»ç if (_IsAvailableAuctionArea(map_code) == false) { return RC::DOMINATION_RESULT_FAIL; } GameGuildMember* guild_member = _GetGuildMemberInfo(player); if (guild_member == NULL) { //ÇØ´ç Äɸ¯ÅͰ¡ ±æµå¿¡ ¼ÓÇÏ¿© ÀÖ¾î¾ß ÇÑ´Ù. return RC::DOMINATION_RESULT_NOT_GUILDMEMBER; } else if (guild_member->GetDuty() != eGUILD_DUTY_MASTER) { //ÇØ´ç Äɸ¯ÅͰ¡ ±æµå ¸¶½ºÅͰ¡ ¾Æ´Ï´Ù. return RC::DOMINATION_RESULT_NOT_GUILDMASTER; } const MONEY limit_money = DominationInfoParser::Instance()->GetAreaLimitMoney(map_code); if(limit_money > entry_money) { //¹èÆÃÇÑ ÇÏÀÓÀÌ ±âº» °æ¸Å ±Ý¾×º¸´Ù ÀÛ´Ù. return RC::DOMINATION_RESULT_LIMIT_ENOUGHMONEY; } const MONEY best_money = GetTenderCost(map_code); if (best_money >= entry_money) { //¹èÆÃÇÑ ÇÏÀÓÀÌ Áö¿ªº° ÃÖ°í ±Ý¾×º¸´Ù Àû´Ù. return RC::DOMINATION_RESULT_BEST_ENOUGHMONEY; } const eDOMINATION_EVENT_STATE current_event = _GetCurrentDominationEvent(map_code); if (_IsApplyAuction(player, current_event) == FALSE) { //±âŸ ´Ù¸¥ °æ¸Å¿¡ Âü¿©ÇÒ¼ö ¾ø´Â ÀÌÀ¯·Î ½ÇÆÐ Çß´Ù. return RC::DOMINATION_RESULT_FAIL; } MONEY tender_cost = GetTenderCost(map_code, player->GetGuildGuid()); if ((player->GetMoney() + tender_cost) < entry_money) { //¹èÆÃÇÑ ÇÏÀÓÀÌ ¼ÒÁö ±Ý¾×º¸´Ù ¸¹´Ù. return RC::DOMINATION_RESULT_NOT_ENOUGHMONEY; } return RC::DOMINATION_RESULT_SUCCESS; } #endif//_CH_20100420_CHANGE_DOMINATION_APPLY_WAY bool GameDominationManager::CheckDominationTokken(Player* player, int amount_token, POSTYPE pos, MAPCODE map_code) const { const SLOTCODE item_code = DominationInfoParser::Instance()->GetBattingItemCodeByMapCode(map_code); #ifdef _NA_20101214_CHANGE_AUCTION_ITEM_CHECK_WAY ItemManager* const item_manager = player->GetItemManager(); const int amount_of_inven = item_manager->ExistItem(SI_INVENTORY, item_code, amount_token); if (amount_of_inven < amount_token) { SUNLOG( eCRITICAL_LOG, _T("|%s|Amount of inventory is shortage.|number of request = %d, amount of inventory = %d|"), __FUNCTION__, amount_token, amount_of_inven ); return false; } #else//_NA_20101214_CHANGE_AUCTION_ITEM_CHECK_WAY SCSlotContainer * inventory_container = player->GetItemManager()->GetItemSlotContainer(SI_INVENTORY); if (!inventory_container->ValidPos(pos) || inventory_container->IsEmpty(pos) || inventory_container->IsLocked(pos)) { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"]Not available inventory container"); return false; } SCItemSlot& slot_info = (SCItemSlot&)inventory_container->GetSlot(pos); SLOTCODE request_cost_type = slot_info.GetItemInfo()->m_Code; if (request_cost_type != item_code) { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"]Not available token type"); return false; } BYTE user_token_count = slot_info.GetNum(); if (user_token_count != amount_token) { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"]Not available token count"); return false; } #endif//_NA_20101214_CHANGE_AUCTION_ITEM_CHECK_WAY return true; } WORD GameDominationManager::GetAreaCount(const GUILDGUID guild_guid) { AreaInfoMapIterator begin_iterator = area_info_map_.begin(), end_iterator = area_info_map_.end(); WORD number_of_domination_map = 0; for(;begin_iterator != end_iterator; ++begin_iterator) { const DominationArea& domination_area = *(begin_iterator->second); const DOMINATION_INFO& info = domination_area.GetInfo(); if (info.m_inGuildInfo.m_GuildGuid == guild_guid) { ++number_of_domination_map; } } return number_of_domination_map; } //_NA_20100604_BETTER_DOMINATION_MANAGER void GameDominationManager::UpdateGuildInfoByDomination(const GUILDGUID guild_guid, const eDOMINATION_ADD_GUILD_INFO_TYPE type) { if (guild_guid == 0) { return; } MSG_GZ_DOMINATION_UPDATE_GUILDINFO_SYN send_msg; send_msg.guild_guid_ = guild_guid; //-- Á¤º¸ÀÇ Áõ°¡Ä¡´Â ¹«Á¶°Ç 1ÀÌ´Ù. send_msg.domination_join_count_ = !!(type & (1<<0)); send_msg.domination_defense_count_ = !!(type & (1<<1)); send_msg.domination_hunting_count_ = !!(type & (1<<2)); g_pGameServer->SendToServer(GUILD_SERVER, &send_msg, sizeof(send_msg)); } bool GameDominationManager::_IsLoadedScript()const { bool is_loaded = DominationInfoParser::Instance()->IsLoadComplete(); return is_loaded; } bool GameDominationManager::_CanAuctionBatting(Player* player, MAPCODE map_code)const { if (player == NULL) { return false; } eDOMINATION_EVENT_STATE current_event = _GetCurrentDominationEvent(map_code); //°æ¸Å °¡´É¿©ºÎ bool check_auction_event = _IsApplyAuction(player, current_event); if (check_auction_event == false) { SUNLOG(eFULL_LOG, "["__FUNCTION__"]Is not auction event time[event:%d]", current_event); return false; } //±æµå¿øÀÌ¿©¾ß ÇÔ GameGuildMember* game_guild_member = _GetGuildMemberInfo(player); if (game_guild_member == NULL) { SUNLOG(eFULL_LOG, "["__FUNCTION__"]Is not guild member[%s]", player->GetCharName()); return false; } //¸¶½ºÅ͸¸ °¡´É if (game_guild_member->GetDuty() != eGUILD_DUTY_MASTER) { SUNLOG( eFULL_LOG, "["__FUNCTION__"]Is not guild master[%s]",player->GetCharName()); return false; } //Á¡·É±æµå ¸¶½ºÅÍ ºÒ°¡´É const DOMINATION_INFO* current_info = GetDominationInfo(map_code); if (current_info == NULL) { SUNLOG( eFULL_LOG, "["__FUNCTION__"]Not found to domination Info[%d]",map_code ); return false; } const DOMINATION_BASIC_GUILD_INFO& guild_info = current_info->m_inGuildInfo; if (guild_info.m_GuildGuid == player->GetGuildGuid()) { SUNLOG(eFULL_LOG, "["__FUNCTION__"]Same to guild by current area of owner guild[guild:%s]", guild_info.m_tszGuildName); return false; } return true; } void GameDominationManager::_RemoveDisGuildInfo(MAPCODE map_code, bool is_swap) { DominationArea* domination_area = GetAreaInfo(map_code); if (domination_area == NULL) { return; } DOMINATION_INFO& current_info = domination_area->GetInfo(); if (is_swap) { std::swap(current_info.m_inGuildInfo, current_info.m_disGuildInfo); } ZeroMemory(¤t_info.m_disGuildInfo, sizeof(current_info.m_disGuildInfo)); _InitDefenseWall(map_code); } void GameDominationManager::UpdateDominationInfo(const DOMINATION_INFO& domination_info, eDOMINATION_EVENT_TYPE event_type) { const MAPCODE map_code = domination_info.m_FieldCode; const GUILDGUID in_guild = domination_info.m_inGuildInfo.m_GuildGuid; const GUILDGUID dis_guild = domination_info.m_disGuildInfo.m_GuildGuid; switch (event_type) { case DOMINATION_INIT: { #ifdef _NA_007488_20140811_MONDSCHUEN_INITIALIZE_N_REWARD const DOMINATION_INFO* prev_info = GetDominationInfo(map_code); GUILDGUID prev_guild_guid = 0; if (prev_info != NULL) { // ÃʱâÈ­½Ã ÀÎÀå È¿°ú¸¦ ÀçÀû¿ë ÇÑ´Ù. prev_guild_guid = prev_info->m_inGuildInfo.m_GuildGuid; ApplyAllMemberRewardOption(prev_guild_guid, false); _SetDominationInfo(domination_info); _RemoveGuildAreaInfoFromMapCode(map_code); _InsertGuildAreaInfo(map_code, in_guild); ApplyAllMemberRewardOption(prev_guild_guid, true); } else { _SetDominationInfo(domination_info); _RemoveGuildAreaInfoFromMapCode(map_code); _InsertGuildAreaInfo(map_code, in_guild); } #else // _NA_007488_20140811_MONDSCHUEN_INITIALIZE_N_REWARD _SetDominationInfo(domination_info); _InsertGuildAreaInfo(map_code, in_guild); #endif // _NA_007488_20140811_MONDSCHUEN_INITIALIZE_N_REWARD } break; case DOMINATION_DEFFENSEWALL_SET: case DOMINATION_INFO_SET: { _UpdateDominationInfo(domination_info); _InsertGuildAreaInfo(map_code, in_guild); } break; case DOMINATION_SUCCESS_DEFENCE: { #ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION _UpdateDominationInfo(domination_info); eDOMINATION_TYPE domi_type = DominationInfoParser::Instance()->GetDominationTypeFromFieldCode(map_code); //¸óÆ®»þÀÎÀÏ °æ¿ì ±âÁ¸ Á¡·ÉÁö Á¤º¸¸¦ »èÁ¦Çϰí Ãß°¡ÇÑ´Ù. if (domi_type == DOMINATION_TYPE_MONDSCHIEN) { _RemoveGuildAreaInfoFromMapCode(map_code); _InsertGuildAreaInfo(map_code, in_guild); // Á±·ÉÁö Á¤º¸ Ãß°¡ } #endif //_NA_007128_20140326_MONDSCHIEN_DOMINATION _RemoveDisGuildInfo(map_code); // °ø°ÝÃø Á¤º¸ »èÁ¦ #ifdef _NA_006826_20130722_DOMINATION_RENEWAL _ResultNotifyAllUser(map_code, in_guild, 0); // ÇØ´ç Áö¿ª¿¡ ¼ö¼º¼º°øÀ» ¾Ë¸² #else _ResultNotify(map_code, in_guild, dis_guild); #endif //_NA_006826_20130722_DOMINATION_RENEWAL #ifdef _NA_000000_20130429_DOMINATION_PENALTY // °ø¼º±æµå ÆÐ³ÎƼ ¼³Á¤ SERVER_COMMON_OPTION& server_option_info = \ ServerOptionParserEx::Instance()->GetServerOption(); WORD penalty_days = server_option_info.domination_penalty.penalty_days_of_offence_fail; ProcessDominationPenalty(dis_guild, map_code, penalty_days); #endif //_NA_000000_20130429_DOMINATION_PENALTY } break; case DOMINATION_SUCCESS_OFFENCE: { #ifdef _NA_006826_20130722_DOMINATION_RENEWAL _UpdateDominationInfo(domination_info); #endif //_NA_006826_20130722_DOMINATION_RENEWAL _RemoveDisGuildInfo(map_code,true); // °ø°Ý, ¼öºñ º¯°æÈÄ °ø°Ý Ãø »èÁ¦ _InsertGuildAreaInfo(map_code, dis_guild); // Á±·ÉÁö Á¤º¸ Ãß°¡ _RemoveGuildAreaInfo(map_code, in_guild); // Á±·ÉÁö Á¤º¸ »èÁ¦ #ifdef _NA_006826_20130722_DOMINATION_RENEWAL _ResultNotifyAllUser(map_code, dis_guild, in_guild); // ¼­¹ö Àüü¿¡ ¾Ë¸² #else _ResultNotify(map_code, in_guild, dis_guild); // ½Â.ÆÐ ¾Ë¸² #endif // _NA_006826_20130722_DOMINATION_RENEWAL #ifdef _NA_000000_20130429_DOMINATION_PENALTY // ¼ö¼º±æµå ÆÐ³ÎƼ ¼³Á¤ SERVER_COMMON_OPTION& server_option_info = \ ServerOptionParserEx::Instance()->GetServerOption(); WORD penalty_days = server_option_info.domination_penalty.penalty_days_of_defense_fail; ProcessDominationPenalty(in_guild, map_code, penalty_days); #endif //_NA_000000_20130429_DOMINATION_PENALTY } break; case DOMINATION_DISGUILD_SET: { _UpdateDominationInfo(domination_info); _InsertGuildAreaInfo(map_code, in_guild); if(g_pGameServer->GetServerType() == FIELD_SERVER) { _DeleteGuildInfoInAuction(domination_info); //1. ÀÔÂû ¼º°ø ±æµå Á¤º¸ »èÁ¦ #ifndef _NA_20120106_DO_NOT_REWARD_DOMINATION_TOKEN SendRewardMemo(&domination_info, map_code); #endif SendInitActionInfo(map_code); //4. °æ¸Å Á¤º¸ ÃʱâÈ­ ¿äû(G->Z->DB) } } break; #ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION case DOMINATION_TURN_OVER: { _UpdateDominationInfo(domination_info); _RemoveDisGuildInfo(map_code,true); // °ø°Ý, ¼öºñ º¯°æÈÄ °ø°Ý Ãø »èÁ¦ _InsertGuildAreaInfo(map_code, dis_guild); // Á±·ÉÁö Á¤º¸ Ãß°¡ _RemoveGuildAreaInfo(map_code, in_guild); // Á±·ÉÁö Á¤º¸ »èÁ¦ } break; #endif //_NA_007128_20140326_MONDSCHIEN_DOMINATION } GameDominationField* zone = static_cast(g_GameZoneManager.GetFieldVillageZone(map_code)); if (zone == NULL) { SUNLOG(eCRITICAL_LOG,"["__FUNCTION__"]Not found zone[Map:%d]", map_code); return; } zone->SetGuildGuid(in_guild, dis_guild, event_type); zone->SetRewardEventInfo(domination_info.m_rewardEvent); } const DOMINATION_INFO* GameDominationManager::GetDominationInfo(MAPCODE map_code)const { const DominationArea* domination_area = FindAreaInfo(map_code); if (domination_area == NULL) { SUNLOG(eCRITICAL_LOG,__FUNCTION__"Not found domination info in area : %d", map_code); return NULL; } return &(domination_area->GetInfo()); } bool GameDominationManager::RemoveAuctionItem(Player* player, POSTYPE token_pos, int amount_cost, SLOTCODE item_code) const { if (player == NULL) { assert(!"Player Not Found"); SUNLOG(eCRITICAL_LOG,"["__FUNCTION__"]Player Not Found"); return false; } #ifdef _NA_20101214_CHANGE_AUCTION_ITEM_CHECK_WAY enum { kPosTypeMax = UCHAR_MAX }; SLOTCODE item_codes[kPosTypeMax]; ::ZeroMemory(item_codes, sizeof(item_codes)); POSTYPE item_nums[kPosTypeMax]; ::ZeroMemory(item_nums, sizeof(item_nums)); BOOST_STATIC_ASSERT(sizeof(POSTYPE) == sizeof(WORD)); BOOST_STATIC_ASSERT(_countof(item_codes) == _countof(item_nums)); int num_of_kinds = amount_cost / kPosTypeMax; if (num_of_kinds > _countof(item_codes) || num_of_kinds > _countof(item_nums)) { SUNLOG( eCRITICAL_LOG, _T("|%s|number of kinds is overflow.|number of kinds = %d, max kinds = %d|"), __FUNCTION__, num_of_kinds, _countof(item_codes) ); return false; } int remainder = amount_cost % kPosTypeMax; if (remainder != 0) { if (num_of_kinds == kPosTypeMax) { SUNLOG( eCRITICAL_LOG, _T("|%s|number of kinds is overflow.|number of kinds = %d, max kinds = %d|"), __FUNCTION__, num_of_kinds, _countof(item_codes) ); return false; } ++num_of_kinds; } for (int i = 0; i < num_of_kinds; ++i) { item_codes[i] = item_code; if (remainder != 0 && (i == (num_of_kinds - 1))) { item_nums[i] = (POSTYPE)remainder; } else { item_nums[i] = kPosTypeMax; } } MSG_CG_ITEM_LOSE_ACK ack_msg; { ItemManager* item_manager = player->GetItemManager(); RC::eITEM_RESULT result_value = item_manager->DeleteAllKindOfItem(num_of_kinds, item_codes, item_nums, &(ack_msg.m_ItemInfo)); if (result_value != RC::RC_ITEM_SUCCESS) { SUNLOG(eCRITICAL_LOG,"["__FUNCTION__"]Not delete domination item[guid:%d]", player->GetCharGuid()); return false; } } player->SendPacket( &ack_msg, ack_msg.GetSize() ); #else//_NA_20101214_CHANGE_AUCTION_ITEM_CHECK_WAY RC::eITEM_RESULT result = player->GetItemManager()->Delete(token_pos); if (result != RC::RC_ITEM_SUCCESS) { const char* event_string = (result == RC::RC_ITEM_INVALIDSTATE) ? "RC_ITEM_INVALIDSTATE" : (result == RC::RC_ITEM_INVALIDPOS) ? "RC_ITEM_INVALIDPOS" : (result == RC::RC_ITEM_CANNOT_DESTROY_ITEM) ? "RC_ITEM_CANNOT_DESTROY_ITEM" : "UNKNOWN"; SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"] Result Code[%s] Token Position[%d]", event_string, token_pos); return false; } #endif//_NA_20101214_CHANGE_AUCTION_ITEM_CHECK_WAY return true; } bool GameDominationManager::DominationTimerIsExpired() { return !!domination_update_timer_.IsExpired(); } void GameDominationManager::GetInGuildInfo(MAPCODE map_code, DOMINATION_GUILD_INFO& guild_info) { const DOMINATION_INFO* current_info = GetDominationInfo(map_code); //ÇØ´ç ¸ÊÄڵ尡 Á¸Àç ÇÏÁö ¾Ê´Â °æ¿ì( ¾ø´Â Áö¿ªÀ̰ųª DB¿¡ °ªÀÌ Á¸Àç ÇÏÁö ¾ÊÀ» °æ¿ì ) //GuildGuid ¸¦ 0À¸·Î ¸®ÅÏ Á¸Àç ÇÒ °æ¿ì ÀоîµéÀÎ Á¤º¸·Î ±æµå Á¤º¸¸¦ ¼ÂÆÃÇÑ´Ù. if (current_info == NULL) { guild_info.m_GuildGuid = 0; return; } else { guild_info.m_BackGroundIndex = current_info->m_inGuildInfo.m_BackGroundIndex; guild_info.m_GuildGuid = current_info->m_inGuildInfo.m_GuildGuid; guild_info.m_MapCode = current_info->m_FieldCode; guild_info.m_PatternIndex = current_info->m_inGuildInfo.m_PatternIndex; _tcsncpy(guild_info.m_tszGuildMaster, current_info->m_inGuildInfo.m_tszGuildMaster, _countof(guild_info.m_tszGuildMaster)); guild_info.m_tszGuildMaster[_countof(guild_info.m_tszGuildMaster) - 1] = '\0'; _tcsncpy(guild_info.m_tszGuildName, current_info->m_inGuildInfo.m_tszGuildName, _countof(guild_info.m_tszGuildName)); guild_info.m_tszGuildName[_countof(guild_info.m_tszGuildName) - 1] = '\0'; #ifdef _NA_006826_20130722_DOMINATION_RENEWAL guild_info.progress_state_ = current_info->progress_state_; #endif //_NA_006826_20130722_DOMINATION_RENEWAL } } void GameDominationManager::SendUpdateDominationInfo(const DOMINATION_INFO& domination_info, eDOMINATION_EVENT_TYPE event_type)const { MSG_GZ_DOMINATION_UPDATE_INFO_SYN send_msg; { send_msg.m_DominationInfo = domination_info; send_msg.m_eSetType = event_type; #ifdef _NA_006826_20130722_DOMINATION_RENEWAL #ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION switch(event_type) { case DOMINATION_INFO_SET: //±æµå Á¤º¸¸¦ º¯°æÇҽÿ¡´Â Á¡·ÉÀü ÁøÇà »óŰ¡ º¯È­µÇÁö ¾Ê´Â´Ù. break; case DOMINATION_TURN_OVER: //ÅÏ¿À¹ö ½Ã¿¡´Â °ø¼ºÀÌ ´Ù½Ã ½ÃÀÛÇϹǷΠ¾Æ·¡¿Í °°ÀÌ ¼³Á¤ÇÑ´Ù. send_msg.m_DominationInfo.progress_state_ = DOMINATION_PROGRESS_STATE_START; break; default: send_msg.m_DominationInfo.progress_state_ = DOMINATION_PROGRESS_STATE_NONE; break; } #else send_msg.m_DominationInfo.progress_state_ = DOMINATION_PROGRESS_STATE_NONE; #endif //_NA_007128_20140326_MONDSCHIEN_DOMINATION #endif //_NA_006826_20130722_DOMINATION_RENEWAL } g_pGameServer->SendToServer(GUILD_SERVER, &send_msg, sizeof(send_msg)); } void GameDominationManager::SetDominationGuildInfo(MAPCODE map_code, eDOMINATION_EVENT_TYPE event_type, DOMINATION_REWARD_EVENT_INFO reward_event) { DominationArea* domination_area = GetAreaInfo(map_code); if (domination_area == NULL) { return; } DOMINATION_INFO& domination_info = domination_area->GetInfo(); domination_info.m_rewardEvent = reward_event; SendUpdateDominationInfo(domination_info, event_type); } void GameDominationManager::SetDominationGuildInfo(MAPCODE map_code, eDOMINATION_EVENT_TYPE event_type) { DominationArea* domination_area = GetAreaInfo(map_code); if (domination_area == NULL) { return; } DOMINATION_INFO& domination_info = domination_area->GetInfo(); SendUpdateDominationInfo(domination_info, event_type); } #ifdef _NA_006826_20130722_DOMINATION_RENEWAL void GameDominationManager::SetDominationGuildInfo(MAPCODE map_code, eDOMINATION_EVENT_TYPE event_type, DOMINATION_REWARD_EVENT_INFO reward_event, Player* player) { DominationArea* domination_area = GetAreaInfo(map_code); if (domination_area == NULL) { return; } DOMINATION_INFO& domination_info = domination_area->GetInfo(); domination_info.m_rewardEvent = reward_event; if (player != NULL) { GameGuild* dis_guild = g_GameGuildManager.FindGuild(player->GetGuildGuid()); if (dis_guild) { DOMINATION_BASIC_GUILD_INFO& m_disGuildInfo = domination_info.m_disGuildInfo; m_disGuildInfo.m_GuildGuid = dis_guild->GetGuildGuid(); dis_guild->GetGuildMark(m_disGuildInfo.m_BackGroundIndex, m_disGuildInfo.m_PatternIndex); _tcsncpy(m_disGuildInfo.m_tszGuildName, dis_guild->GetGuildName(), MAX_GUILDNAME_LENGTH); GameGuildMember* guild_master = dis_guild->FindMaster(); if (guild_master) { m_disGuildInfo.m_GuildMasterGuid = guild_master->GetCharGuid(); _tcsncpy(m_disGuildInfo.m_tszGuildMaster, guild_master->GetCharName(), MAX_CHARNAME_LENGTH); } else { // Á¡·ÉÀÚ À̸§À» Ç¥½ÃÇØÁÜ m_disGuildInfo.m_GuildMasterGuid = player->GetCharGuid(); _tcsncpy(m_disGuildInfo.m_tszGuildMaster, player->GetCharName(), MAX_CHARNAME_LENGTH); } } } SendUpdateDominationInfo(domination_info, event_type); } #endif // _NA_006826_20130722_DOMINATION_RENEWAL void GameDominationManager::SetDefenseWall(MAPCODE map_code, const BYTE* deffens_wall) { DominationArea* domination_area = GetAreaInfo(map_code); if (domination_area == NULL) { return; } DOMINATION_INFO& domination_info = domination_area->GetInfo(); domination_info.m_DeffenseWallA = deffens_wall[0]; domination_info.m_DeffenseWallB = deffens_wall[1]; domination_info.m_DeffenseWallC = deffens_wall[2]; SendUpdateDominationInfo(domination_info, DOMINATION_INFO_SET); } void GameDominationManager::ChangeGuildMark(GUILDGUID guild_guid, GUILDMARKIDX pattern_index, GUILDMARKIDX background_index ) { AreaInfoMapIterator begin_iterator = area_info_map_.begin(), end_iterator = area_info_map_.end(); for (; begin_iterator != end_iterator; ++begin_iterator) { DominationArea& domination_area = *(begin_iterator->second); if (domination_area.ExistGuild(guild_guid) == true) { domination_area.ChangeGuildMark(guild_guid, pattern_index, background_index); const DOMINATION_INFO& domination_info = domination_area.GetInfo(); SendUpdateDominationInfo(domination_info, DOMINATION_INFO_SET); } } return; } void GameDominationManager::ChangeGuildName(GUILDGUID guild_guid, TCHAR* guild_name) { AreaInfoMapIterator begin_iterator = area_info_map_.begin(), end_iterator = area_info_map_.end(); for (; begin_iterator != end_iterator; ++begin_iterator) { DominationArea& domination_area = *(begin_iterator->second); if (domination_area.ExistGuild(guild_guid) == true) { domination_area.ChangeGuildName(guild_guid, guild_name); const DOMINATION_INFO& domination_info = domination_area.GetInfo(); SendUpdateDominationInfo(domination_info, DOMINATION_INFO_SET); } } return; } void GameDominationManager::ChangeGuildMaster(GUILDGUID guild_guid, TCHAR* master_name) { AreaInfoMapIterator begin_iterator = area_info_map_.begin(), end_iterator = area_info_map_.end(); for (; begin_iterator != end_iterator; ++begin_iterator) { DominationArea& domination_area = *(begin_iterator->second); if (domination_area.ExistGuild(guild_guid) == true) { domination_area.ChangeGuildMaster(guild_guid, master_name); const DOMINATION_INFO& domination_info = domination_area.GetInfo(); SendUpdateDominationInfo(domination_info, DOMINATION_INFO_SET); } } return; } void GameDominationManager::_InsertGuildAreaInfo(const MAPCODE map_code, GUILDGUID win_guild_guid) { AreaInGuildMapPair range = area_in_guild_map.equal_range(win_guild_guid); AreaInGuildMapIterator area_map_iterator = range.first; for(;range.second != area_map_iterator; ++area_map_iterator) { if (map_code == area_map_iterator->second) { return; } } #ifdef _NA_008334_20150608_SONNENSCHEIN GameGuild* guild = g_GameGuildManager.FindGuild(win_guild_guid); if (guild == NULL) { area_in_guild_map.insert(std::make_pair(win_guild_guid, map_code)); } else { guild->ApplyGuildRewardOptionForAllMembers(FALSE); area_in_guild_map.insert(std::make_pair(win_guild_guid, map_code)); //¸óÆ®»þÀÎÁö¿ªÀ̰í, ½ÃÀÛ »óÅ¿¡¼­´Â ¹öÇÁ ºÎ¿©x, Á¡·ÉÁ¤º¸°»½Å x GameDominationField* domi_field = static_cast(g_GameZoneManager.GetFieldVillageZone(map_code)); if (domi_field == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__":Fail get domination field : %d", map_code); return; } if (map_code == DominationInfoParser::Instance()->GetMondScheinMapCode() && domi_field->GetEventState() == DOMINATION_EVENT_START) { return; } else { guild->ApplyGuildRewardOptionForAllMembers(TRUE); SendAreaInfoToGuild(win_guild_guid); } } #else area_in_guild_map.insert(std::make_pair(win_guild_guid, map_code)); #endif //_NA_008334_20150608_SONNENSCHEIN } void GameDominationManager::_RemoveGuildAreaInfo( const MAPCODE map_code, GUILDGUID loser_guild_guid ) { AreaInGuildMapPair range = area_in_guild_map.equal_range(loser_guild_guid); AreaInGuildMapIterator area_map_iterator = range.first; for (; range.second != area_map_iterator; ++area_map_iterator) { const MAPCODE current_map_code = area_map_iterator->second; if (map_code == current_map_code) { #ifdef _NA_008334_20150608_SONNENSCHEIN GameGuild* guild = g_GameGuildManager.FindGuild(loser_guild_guid); if (guild == NULL) { area_in_guild_map.erase(area_map_iterator); } else { guild->ApplyGuildRewardOptionForAllMembers(FALSE); area_in_guild_map.erase(area_map_iterator); //¸óÆ®»þÀÎÁö¿ªÀ̰í, ½ÃÀÛ »óÅ¿¡¼­´Â ¹öÇÁ ºÎ¿©x, Á¡·ÉÁ¤º¸°»½Å x GameDominationField* domi_field = static_cast(g_GameZoneManager.GetFieldVillageZone(map_code)); if (domi_field == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__":Fail get domination field : %d", map_code); return; } if (map_code == DominationInfoParser::Instance()->GetMondScheinMapCode() && domi_field->GetEventState() == DOMINATION_EVENT_START) { return; } else { guild->ApplyGuildRewardOptionForAllMembers(TRUE); SendAreaInfoToGuild(loser_guild_guid); } } #else area_in_guild_map.erase(area_map_iterator); #endif //_NA_008334_20150608_SONNENSCHEIN return; } } } #ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION bool GameDominationManager::_IsAreaInGuild( const GUILDGUID guild_guid ) const { ConstAreaInGuildMapIterator iterater_area_in_guild_map = area_in_guild_map.find(guild_guid); if (iterater_area_in_guild_map != area_in_guild_map.end()) { return true; } return false; } #endif //_NA_007128_20140326_MONDSCHIEN_DOMINATION BYTE GameDominationManager::GetMiniMapInfo(DOMINATION_GUILD_INFO* guild_info, BYTE max_count)const { DominationInfoParser* info = DominationInfoParser::Instance(); ConstAreaInfoMapIterator begin_iterator = area_info_map_.begin(), end_iterator = area_info_map_.end(); BYTE index = 0; for (; index < max_count && begin_iterator != end_iterator; ++begin_iterator, ++index) { const DominationArea& domination_area = *(begin_iterator->second); const DOMINATION_INFO& domination_info = domination_area.GetInfo(); const DOMINATION_BASIC_GUILD_INFO& current_guild = domination_info.m_inGuildInfo; DOMINATION_GUILD_INFO* const dest_it = &guild_info[index]; #ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION //¸ðµç Á¡·ÉÁö´Â ÇØ´ç Çʵå¿Í ¿¬°áµÇ¾î Àִµ¥ ¸óÆ®»þÀÎÀº µ¶¸³ÀûÀ¸·Î Á¸ÀçÇϰí //¹Ì´Ï¸Ê¿¡ Ç¥½ÃµÇ´Â ¿µ¿ªÀÌ ¿¬°áµÈ Çʵå¿Í ´Ù¸£±â ¶§¹®¿¡ ¾Æ·¡¿Í °°ÀÌ ¿¹¿Üó¸®ÇÑ´Ù. const eDOMINATION_TYPE domi_type = \ info->GetDominationTypeFromFieldCode(domination_info.m_FieldCode); switch(domi_type) { case DOMINATION_TYPE_MONDSCHIEN: dest_it->m_MapCode = domination_info.m_FieldCode; break; case DOMINATION_TYPE_NORMAL: dest_it->m_MapCode = info->GetDominationLinkMapCode(domination_info.m_FieldCode); break; } #else dest_it->m_MapCode = info->GetDominationLinkMapCode(domination_info.m_FieldCode); #endif //_NA_007128_20140326_MONDSCHIEN_DOMINATION dest_it->m_BackGroundIndex = current_guild.m_BackGroundIndex; dest_it->m_GuildGuid = current_guild.m_GuildGuid; dest_it->m_PatternIndex = current_guild.m_PatternIndex; _tcsncpy(dest_it->m_tszGuildMaster, current_guild.m_tszGuildMaster, _countof(dest_it->m_tszGuildMaster)); dest_it->m_tszGuildMaster[_countof(dest_it->m_tszGuildMaster) - 1] = '\0'; _tcsncpy(dest_it->m_tszGuildName, current_guild.m_tszGuildName, _countof(dest_it->m_tszGuildName)); dest_it->m_tszGuildName[_countof(dest_it->m_tszGuildName) - 1] = '\0'; #ifdef _NA_006826_20130722_DOMINATION_RENEWAL dest_it->progress_state_ = domination_info.progress_state_; #endif //_NA_006826_20130722_DOMINATION_RENEWAL } return index; } BYTE GameDominationManager::_GetAuctionList(MAPCODE map_code, DOMINATION_ACTION_INFO* OUT auction_list, BYTE max_count)const { const DominationArea* domination_area = FindAreaInfo(map_code); if (domination_area == NULL) { return 0; } const DominationAuction* auction = domination_area->GetAuction(); if (auction == NULL) { return 0; } return auction->GetAuctionList(auction_list, max_count); } BYTE GameDominationManager::GetDefenseWall(MAPCODE map_code, BYTE* deffens_wall) { const DominationArea* domination_area = FindAreaInfo(map_code); if (domination_area == NULL) { return 0; } const DOMINATION_INFO& domination_info = domination_area->GetInfo(); deffens_wall[0] = domination_info.m_DeffenseWallA; deffens_wall[1] = domination_info.m_DeffenseWallB; deffens_wall[2] = domination_info.m_DeffenseWallC; return domination_info.m_TotalPoint; } //_NA_0_20100208_DOMINATION_AREA_INFO void GameDominationManager::SerializeAreaInfo(const GUILDGUID guild_guid, DOMINATION_STATE_TOTAL_INFO& OUT state_total_info) { BYTE& count = state_total_info.m_Count; count = 0; AreaInGuildMapPair range = area_in_guild_map.equal_range(guild_guid); AreaInGuildMapIterator area_map_iterator = range.first; for(;range.second != area_map_iterator; ++area_map_iterator) { DOMINATION_STATE_TOTAL_INFO::SLOT_TYPE& rSlot = state_total_info.m_Slot[count++]; rSlot.m_wDominationCode = area_map_iterator->second; } } void GameDominationManager::SendAreaInfoToPlayer(Player* player, bool reward_flag) { if (player == NULL) { return; } const GUILDGUID guild_guid = player->GetGuildGuid(); if (guild_guid == INVALID_GUILDGUID) { return; } AreaInGuildMapPair range = area_in_guild_map.equal_range(guild_guid); AreaInGuildMapIterator area_map_iterator = range.first; MSG_CG_DOMINATION_AREA_INFO_CMD cmd_msg; //_NA_003457_20111013_EXCEPT_DOMINATION_REWARD cmd_msg.m_dwPlayerKey = player->GetObjectKey(); cmd_msg.m_stateTotalInfo.Clear(); if(reward_flag) SerializeAreaInfo(guild_guid, cmd_msg.m_stateTotalInfo); player->SendPacket(&cmd_msg,cmd_msg.GetSize()); } void GameDominationManager::SendAreaInfoToGuild(GUILDGUID guild_guid) { GameGuild* game_guild = g_GameGuildManager.FindGuild(guild_guid); if (game_guild == NULL) { return; } AreaInGuildMapPair range = area_in_guild_map.equal_range(game_guild->GetGuildGuid()); AreaInGuildMapIterator area_map_iterator = range.first; MSG_CG_DOMINATION_AREA_INFO_CMD cmd_msg; //_NA_0_20100208_DOMINATION_AREA_INFO SerializeAreaInfo(guild_guid, cmd_msg.m_stateTotalInfo); game_guild->SendPacketMemberAround(cmd_msg, INVALID_GUILDGUID); } void GameDominationManager::_ResultNotify(MAPCODE map_code, GUILDGUID win_guild_guid, GUILDGUID lose_guild_guid) { //ÆÐŶÀÇ Áߺ¹Àü´ÞÀ» ¸·±â À§Çؼ­ Çʵ弭¹ö¿¡¼­¸¸ ÆÐŶÀ» º¸³»µµ·Ï ÇÑ´Ù. if (g_pGameServer->GetGuid() != FIELD_SERVER) return; GameGuild* win_guild = g_GameGuildManager.FindGuild(win_guild_guid); GameGuild* lose_guild = g_GameGuildManager.FindGuild(lose_guild_guid); MSG_CG_DOMINATION_RESULT_BRD brd_msg; brd_msg.m_winGuid = win_guild_guid; brd_msg.m_loseGuid = lose_guild_guid; brd_msg.m_mapCode = map_code; if (win_guild != NULL) { win_guild->SendPacketMember(brd_msg); } if (lose_guild != NULL) { lose_guild->SendPacketFieldMember(brd_msg, map_code); } } #ifdef _NA_006826_20130722_DOMINATION_RENEWAL void GameDominationManager::_ResultNotifyAllUser(MAPCODE map_code, GUILDGUID win_guild_guid, GUILDGUID lose_guild_guid) { //ÆÐŶÀÇ Áߺ¹Àü´ÞÀ» ¸·±â À§Çؼ­ Çʵ弭¹ö¿¡¼­¸¸ ÆÐŶÀ» º¸³»µµ·Ï ÇÑ´Ù. if (g_pGameServer->GetGuid() != FIELD_SERVER) return; MSG_AG_ZONE_DOMINATION_NOTIFIER_BRD brd_msg; ZeroMemory(brd_msg.win_guild_name, sizeof(brd_msg.win_guild_name)); brd_msg.map_code = map_code; brd_msg.win_guild_guid = win_guild_guid; brd_msg.lose_guild_guid = lose_guild_guid; // lose_guild °¡ 0ÀÌ¸é ¼ö¼º ¼º°ø GameGuild* const win_guild = g_GameGuildManager.FindGuild(win_guild_guid); if (win_guild) { _tcsncpy(brd_msg.win_guild_name, win_guild->GetGuildName(), MAX_GUILDNAME_LENGTH); } g_pGameServer->SendToServer(AGENT_SERVER, &brd_msg, brd_msg.GetSize()); } #endif // _NA_006826_20130722_DOMINATION_RENEWAL namespace impl { void ApplyRewardOption( Player* const player, const DominationInfoParser::TakenMaps& taken_maps, const bool is_add) { if (player == NULL) { return; } if (taken_maps.size() < 1) { return; } const DominationInfoParser* const parser = DominationInfoParser::Instance(); const DominationInfoParser::SelectedRewardOptions& sel_options = parser->GetRewardOption(taken_maps); if (sel_options.size() < 1) { return; } SkillAttrCalculator attr_calculator(player->GetAttr()); for (DominationInfoParser::SelectedRewardOptions::const_iterator it = sel_options.begin(); it != sel_options.end(); ++it) { const DominationInfoParser::SelectedRewardOption& option = it->second; const AttrOptionInfo* const option_info = option.option_info; if (option_info == NULL) { continue; } if (option_info->m_wOptionKind == 0) { continue; } if (option_info->m_iOptionValue == 0) { continue; } const eATTR_TYPE attr_type = g_ITEM_OPTION[option_info->m_wOptionKind]; if (is_add) { attr_calculator.AddAttr( attr_type, option_info->m_byOptionType, option_info->m_iOptionValue, false); } else { attr_calculator.DelAttr( attr_type, option_info->m_byOptionType, option_info->m_iOptionValue, false); } SUNLOG( eDEV_LOG, _T("|%s|%d|Á¡·ÉÀü º¸»ó ¿É¼ÇÀÌ Àû¿ë µÇ¾ú½À´Ï´Ù.|IsAdd = %d, AttrType = %d, AttrValueType = %d, AttrValue = %d|"), __FUNCTION__, __LINE__, (is_add ? 1 : 0), attr_type, option_info->m_byOptionType, option_info->m_iOptionValue ); } } } // impl void GameDominationManager::ApplyAllRewardOption(Player* const player, const bool is_add) { if (player == NULL) { return; } const GUILDGUID guild_guid = player->GetGuildGuid(); if (guild_guid == INVALID_GUILDGUID) { return; } #ifdef _NA_008334_20150608_SONNENSCHEIN DominationInfoParser::TakenMaps taken_maps; GetGuildTakenMaps(guild_guid, &taken_maps); #else std::pair taken_map_range = area_in_guild_map.equal_range(guild_guid); //_NA_004899_20120530_CHANGE_DOMINATION_REWARD_OPTION DominationInfoParser::TakenMaps taken_maps; { for (AreaInGuildMap::const_iterator it = taken_map_range.first; it != taken_map_range.second; ++it) { const MAPCODE taken_map_code = it->second; taken_maps.push_back(taken_map_code); } } #endif //_NA_008334_20150608_SONNENSCHEIN impl::ApplyRewardOption(player, taken_maps, is_add); } void GameDominationManager::ApplyRewardField( Player* const player, const MAPCODE map_code, const bool is_add) const { if (player == NULL) { return; } const MAPCODE domination_map_code = DominationInfoParser::Instance()->GetDominationFieldCode(map_code); if (domination_map_code == 0) { //gamelulu_dev_note : ÇØ´ç ÇÔ¼ö°¡ ¿¹¿Ü󸮷ΠÀÎÇÑ °á°ú¸¦ ÇϳªÀÇ ·ÎÁ÷À¸·Î ÆÇ´Ü ÇØ¾ß ÇÏ´ÂÁö //¾Æ´Ï¸é ÇØ´ç ÇÔ¼öÀÇ ÇÒÀÏÀ» ÀüºÎ ÇÏÁö ¸øÇßÀ½À¸·Î ½ÇÆÐ·Î ó¸®ÇØ¾ß ÇÏ´ÂÁö¿¡ ´ëÇÑ °á·ÐÀÌ ÇÊ¿ä. return; } const DOMINATION_INFO* const domination_info = GetDominationInfo(domination_map_code); if (domination_info == NULL) { return; } if (domination_info->m_inGuildInfo.m_GuildGuid == player->GetGuildGuid()) { _AcceptRewardField(player, map_code, is_add); } } void GameDominationManager::_AcceptRewardField( Player* const player, const MAPCODE map_code, const bool is_add) const { const GUILDGUID guild_guid = player->GetGuildGuid(); if (guild_guid == INVALID_GUILDGUID) { return; } StatusManager* const status_manager = player->GetStatusManager(); status_manager->ChangeInterState(eCHAR_STATE_NPC_NON_PREEMPTIVE_ATTACK, is_add); int heim_rate = 0; { const sDOMINATION_INFO* const script_info = DominationInfoParser::Instance()->GetDominationInfo(map_code); if (script_info != NULL) { heim_rate = script_info->m_RewardDropHeimRate; } } if (heim_rate == 0) { return; } SkillAttrCalculator attr_calculator(player->GetAttr()); #ifdef _NA000000_VALUE_TYPE_SIMPLIFICATION const int attr_value_type = VALUE_TYPE_VALUE; #else const int attr_value_type = VALUE_TYPE_RATIO_VALUE; #endif if (is_add) { attr_calculator.AddAttr(eATTR_BONUS_MONEY_RATIO, attr_value_type, heim_rate, false); } else { attr_calculator.DelAttr(eATTR_BONUS_MONEY_RATIO, attr_value_type, heim_rate, false); } SUNLOG( eDEV_LOG, _T("|%s|%d|ÇÏÀÓ º¸»ó ¿É¼ÇÀÌ Àû¿ë µÇ¾ú½À´Ï´Ù.|IsAdd = %d, AttrType = %d, AttrValueType = %d, AttrValue = %d|"), __FUNCTION__, __LINE__, (is_add ? 1 : 0), eATTR_BONUS_MONEY_RATIO, attr_value_type, heim_rate ); } GameGuildMember* GameDominationManager::_GetGuildMemberInfo(Player* player)const { if (player == NULL) { SUNLOG( eCRITICAL_LOG, "["__FUNCTION__"]Not found player[%d]", player->GetCharGuid()); return NULL; } GameGuild* guild = g_GameGuildManager.FindGuild(player->GetGuildGuid()); if (guild == NULL) { SUNLOG(eFULL_LOG, "["__FUNCTION__"]Not found guild info for current player[%d]", player->GetCharGuid()); return NULL; } GameGuildMember* guild_member = guild->FindMember(player->GetCharGuid()); if (guild_member == NULL) { SUNLOG(eFULL_LOG, "["__FUNCTION__"]Not found guild member info for current player[%d]", player->GetCharGuid()); return NULL; } return guild_member; } void GameDominationManager::GetCurrentDateTime(TCHAR* OUT result_time, size_t time_length) const { TCHAR time_string[MAX_TIMEDATA_SIZE]; SYSTEMTIME system_time; util::TimeSync::GetLocalTime(&system_time); _sntprintf(time_string, _countof(time_string), "%02d-%02d-%02d %02d:%02d:%02d", system_time.wYear, system_time.wMonth, system_time.wDay, system_time.wHour, system_time.wMinute, system_time.wSecond); time_string[_countof(time_string) - 1] = '\0'; _tcsncpy(result_time, time_string, time_length); result_time[time_length - 1] = '\0'; } bool GameDominationManager::CheckDefenseWall(MAPCODE map_code, const BYTE* deffens_wall) { int total_point = _GetDefenseWallTotalPoint(map_code); if (total_point < 0) { SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"]Fail get to deffens wall point[map:%d]", map_code); return false; } BYTE temp_deffens_wall = 0; for (int i=0; iGetInfo(); return domination_info.m_TotalPoint; } eDOMINATION_EVENT_STATE GameDominationManager::_GetCurrentDominationEvent(MAPCODE map_code)const { MAPCODE current_map_code = DominationInfoParser::Instance()->GetDominationFieldCode(map_code); if (current_map_code == 0) { return DOMINATION_EVENT_MAX; } GameDominationField* domination_field = static_cast(g_GameZoneManager.GetFieldVillageZone(current_map_code)); if (domination_field == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__":Fail get domination field : %d", map_code); return DOMINATION_EVENT_MAX; } return domination_field->GetEventState(); } void GameDominationManager::CheckNotice(Player* player, MAPCODE map_code, MSG_CG_DOMINATION_NOTICE_ACK& msg) { if (player == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__":Player info is null"); return; } eDOMINATION_EVENT_STATE current_event = _GetCurrentDominationEvent(map_code); msg.m_AuctionFlag = _IsApplyAuction(player, current_event); msg.m_EnterFlag = _IsEnterArea(player, current_event); msg.m_ManageFlag = _IsGateManage(player, current_event, map_code); //_NA_20110406_CHANGE_RULE_FOR_DOMINATION_JOIN msg.m_JoinFlag = _IsJoinMember(player, map_code); } bool GameDominationManager::IsDominationArea(MAPCODE map_code)const { ConstAreaInfoMapIterator find_iterator = area_info_map_.find(map_code); if (find_iterator == area_info_map_.end()) { return false; } return true; } //_NA_20110406_CHANGE_RULE_FOR_DOMINATION_JOIN bool GameDominationManager::CanEnterDominationField(Player* player, MAPCODE map_code)const { eDOMINATION_EVENT_STATE current_event = _GetCurrentDominationEvent(map_code); return _IsEnterArea(player, current_event); } bool GameDominationManager::IsDeleteMember(MAPCODE map_code)const { eDOMINATION_EVENT_STATE current_event = _GetCurrentDominationEvent(map_code); bool is_delete = (current_event == DOMINATION_EVENT_START || current_event == DOMINATION_EVENT_WAIT) ? false : true; return is_delete; } bool GameDominationManager::IsJoinMember(CHARGUID char_guid, MAPCODE map_code)const { const DominationArea* domination_area = FindAreaInfo(map_code); const DominationMember* member = domination_area->GetMember(); if (member->FindMember(char_guid) == NULL) { return false; } return true; } void GameDominationManager::InitMemberList() { if (is_init_member_ == true) { return; } AreaInfoMapIterator begin_iterator = area_info_map_.begin(), end_iterator = area_info_map_.end(); for (; begin_iterator != end_iterator; ++begin_iterator) { DominationArea* domination_area = begin_iterator->second; domination_area->GetMember()->ClearMember(); } MSG_GZ_DOMINATION_MEMBERLIST_INIT_CMD send_msg; g_pGameServer->SendToServer(GUILD_SERVER, &send_msg, sizeof(send_msg)); is_init_member_ = true; } void GameDominationManager::DeleteMemberList(MAPCODE map_code) { AreaInfoMapIterator find_iterator = area_info_map_.find(map_code); if (find_iterator == area_info_map_.end()) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found domination info : %d", map_code); return; } DominationArea* domination_area = find_iterator->second; domination_area->GetMember()->ClearMember(); } bool GameDominationManager::MakeMemberInfo(Player* player, MAPCODE map_code, DominationMemberInfo& OUT info)const { if (player == NULL) { return false; } const DominationArea* const domination_area = FindAreaInfo(map_code); if (domination_area == NULL) { return false; } GUILDGUID guild_guid = player->GetGuildGuid(); if (domination_area->IsAttackGuild(guild_guid) == true) { info.guild_type_ = true; } else if (domination_area->IsDeffenseGuild(guild_guid) == true) { info.guild_type_ = false; } else { return false; } info.member_guid_ = player->GetCharGuid(); info.member_level_ = player->GetLevel(); info.member_class_ = player->GetCharType(); _tcsncpy(info.member_name_, player->GetCharName(), _countof(info.member_name_)); info.member_name_[_countof(info.member_name_) - 1] = '\0'; return true; } RC::eDOMINATION_RESULT GameDominationManager::CanJoinMember(Player* player, MAPCODE map_code)const { if (player == NULL) { return RC::DOMINATION_RESULT_NOT_PLAYER; } if (player->GetBehave() != PLAYER_BEHAVE_IDLE_STATE) { return RC::DOMINATION_RESULT_NOT_IDLE_STATE; } GameGuildMember *guild_member = _GetGuildMemberInfo(player); if (guild_member == NULL) { return RC::DOMINATION_RESULT_NOT_GUILDMEMBER; } GUILDGUID guild_guid = player->GetGuildGuid(); const DominationArea* const domination_area = FindAreaInfo(map_code); if (domination_area == NULL) { return RC::DOMINATION_RESULT_NOT_FOUND_AREA; } RC::eDOMINATION_RESULT result_code = domination_area->CanJoinMember(guild_guid, player->GetCharGuid()); if(result_code != RC::DOMINATION_RESULT_SUCCESS) { return result_code; } CHARGUID member_guid = player->GetCharGuid(); MAPCODE joined_map_code = _DidJoinArea(member_guid); if (joined_map_code != 0) { return RC::DOMINATION_RESULT_CAN_JOIN_ONLYONE_AREA; } eDOMINATION_EVENT_STATE current_event = _GetCurrentDominationEvent(map_code); if (current_event != DOMINATION_EVENT_SELECT_ATTACKGUILD_END) { return RC::DOMINATION_RESULT_NOT_FOUND_EVENT; } return RC::DOMINATION_RESULT_SUCCESS; } void GameDominationManager::SendMemberList(Player* player, MAPCODE map_code)const { //¸®½ºÆ®¸¦ º¸¿©ÁÙ Çʿ䰡 ¾øÀ¸¸é ÆÐŶÀ» º¸³»Áö ¾Ê¾Æµµ µÈ´Ù. bool show_flag = _IsShowMemberList(map_code); if (show_flag == false) { return; } const DominationArea* domination_area = FindAreaInfo(map_code); if (domination_area == NULL) { return; } const DominationMember* member = domination_area->GetMember(); if (member == NULL) { return; } MSG_CG_DOMINATION_MEMBERLIST_NTF ntf_msg; ntf_msg.is_delete_member_ = IsDeleteMember(map_code); ntf_msg.map_code_ = map_code; ntf_msg.data_count_ = member->GetMemberList(ntf_msg.member_list_, _countof(ntf_msg.member_list_)); player->SendPacket(&ntf_msg, ntf_msg.GetSize()); } bool GameDominationManager::_IsShowMemberList(MAPCODE map_code)const { eDOMINATION_EVENT_STATE cur_event = _GetCurrentDominationEvent(map_code); //°ø°Ý±æµå ¼±Á¤ - Á¡·ÉÀü Á¾·á ½Ã±îÁö ¸É¹ö ¸®½ºÆ®¸¦ º¸¿©Áà¾ß ÇÑ´Ù. if (cur_event > DOMINATION_EVENT_SELECT_ATTACKGUILD && cur_event < DOMINATION_EVENT_END) { return true; } return false; } bool GameDominationManager::_IsJoinMember(Player* player, MAPCODE map_code)const { if (CanJoinMember(player, map_code) != RC::DOMINATION_RESULT_SUCCESS) { return false; } return true; } MAPCODE GameDominationManager::_DidJoinArea(CHARGUID char_guid)const { ConstAreaInfoMapIterator begin_iterator = area_info_map_.begin(), end_iterator = area_info_map_.end(); for (; begin_iterator != end_iterator; ++begin_iterator) { const DominationArea* domination_area = begin_iterator->second; const DominationMember* member = domination_area->GetMember(); if (member->FindMember(char_guid) != NULL) { return domination_area->GetMapCode(); } } return 0; } bool GameDominationManager::_IsApplyAuction(Player* player, eDOMINATION_EVENT_STATE current_event)const { if (player == NULL) { SUNLOG(eFULL_LOG,"["__FUNCTION__"]player value is null"); return false; } //GUILD ¸É¹ö °Ë»ç GUILDGUID guild_guid = player->GetGuildGuid(); if (guild_guid == INVALID_GUILDGUID) { return false; } //°æ¸Å½ÃÀÛ || Á¡·ÉÀü ³¡ || °æ¸Å ½ÃÀÛ 2 Àϰæ¿ì Ȱ¼ºÈ­ if (current_event == DOMINATION_EVENT_AUCTION_START || current_event == DOMINATION_EVENT_END || current_event == DOMINATION_EVENT_AUCTION_START2) { return true; } return false; } MAPCODE GameDominationManager::_DidApplyGuild(GUILDGUID guild_guid)const { ConstAreaInfoMapIterator begin_iterator = area_info_map_.begin(), end_iterator = area_info_map_.end(); for (; begin_iterator != end_iterator; ++begin_iterator) { const DominationArea* domination_area = begin_iterator->second; const DominationAuction* auction = domination_area->GetAuction(); if (auction->IsApplyToGuild(guild_guid)) { return auction->GetMapCode(); } } return 0; } bool GameDominationManager::_IsEnterArea(Player* player, eDOMINATION_EVENT_STATE current_event)const { if (player == NULL) { SUNLOG(eFULL_LOG,"["__FUNCTION__"]Player value is null"); return false; } GameGuildMember* guild_member = _GetGuildMemberInfo(player); if (guild_member == NULL) { SUNLOG(eFULL_LOG, "["__FUNCTION__"]Player is not guild member"); return false; } GameField* field = player->GetField(); if (field == NULL) { SUNLOG(eFULL_LOG, "["__FUNCTION__"]Not found field"); return false; } MAPCODE map_code = DominationInfoParser::Instance()->GetDominationFieldCode(field->GetFieldCode()); if (map_code == 0) { SUNLOG(eFULL_LOG, "["__FUNCTION__"]Not found mapcode"); return false; } const DOMINATION_INFO* domination_info = GetDominationInfo(map_code); if (domination_info == NULL) { SUNLOG(eFULL_LOG, "["__FUNCTION__"]Not found domination info"); return false; } GUILDGUID guild_guid = player->GetGuildGuid(); #ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION const eDOMINATION_TYPE domination_type = DominationInfoParser::Instance()->GetDominationTypeFromFieldCode(field->GetFieldCode()); switch(domination_type) { case DOMINATION_TYPE_MONDSCHIEN: if (_IsAreaInGuild(guild_guid) == false) //Á¡·ÉÁö°¡ ¾ø´Â ±æµåÀÌ´Ù. { const DominationArea* domination_area = FindAreaInfo(map_code); if (domination_area == NULL) { SUNLOG(eFULL_LOG,"["__FUNCTION__"]Not found DominationArea(map code) = %d", map_code); return false; } if (domination_area->IsPrevInGuild(guild_guid) == false) //Á¡·ÉÁö°¡ ¾ø°í ÀÌÀü ¸óÆ®»þÀÎÀÇ ÁÖÀÎÀÌ ¾Æ´Ï´Ù. { return false; } } break; case DOMINATION_TYPE_NORMAL: default: break; } #endif //_NA_007128_20140326_MONDSCHIEN_DOMINATION //_NA_20110406_CHANGE_RULE_FOR_DOMINATION_JOIN if (current_event == DOMINATION_EVENT_WAIT || current_event == DOMINATION_EVENT_START) { //Á¡·ÉÀü ¸Ê¿¡ ÀÔÀåÇØ¾ßÇÒ ½Ã°£ÀÏ °æ¿ì, °ø¼ö »ó°ü ¾øÀÌ ¸®½ºÆ®¿¡ Á¸ÀçÇØ¾ß ÀÔÀå °¡´É #ifdef _NA_006826_20130722_DOMINATION_RENEWAL return true; #else if (IsJoinMember(player->GetCharGuid(), map_code) == true) { return true; } SUNLOG(eFULL_LOG, "["__FUNCTION__"]Player is not Join member"); return false; #endif // _NA_006826_20130722_DOMINATION_RENEWAL } else if (current_event == DOMINATION_EVENT_SYSTEM_RESET) { //½Ã½ºÅÛ ¸®¼Â ½Ã°£¿¡´Â ¸ðµÎ ÀÔÀå ºÒ°¡ SUNLOG(eFULL_LOG, "["__FUNCTION__"]Reset time"); return false; } else { //Æò»ó½Ã¿¡´Â Á¡·É ±æµå¸¸ ÀÔÀå if (guild_guid == domination_info->m_inGuildInfo.m_GuildGuid) { return true; } SUNLOG(eFULL_LOG, "["__FUNCTION__"]Not Matched Guild"); } SUNLOG(eFULL_LOG, "["__FUNCTION__"]Unknow"); return false; } bool GameDominationManager::_IsGateManage(Player* player, eDOMINATION_EVENT_STATE current_event,MAPCODE map_code) { if (player == NULL) { SUNLOG(eFULL_LOG,"["__FUNCTION__"]Player value is null"); return false; } const DOMINATION_INFO* domination_info = GetDominationInfo(map_code); if (domination_info == NULL) { SUNLOG(eFULL_LOG, "["__FUNCTION__"]Not found domination info"); return false; } GameGuildMember* game_guild_member = _GetGuildMemberInfo(player); if (game_guild_member == NULL) { SUNLOG(eFULL_LOG, "["__FUNCTION__"]Player is not guild member"); return false; } GUILDGUID guild_guid = player->GetGuildGuid(); if (guild_guid == domination_info->m_inGuildInfo.m_GuildGuid) { if (game_guild_member->GetDuty() == eGUILD_DUTY_MASTER) { //--½Ã½ºÅÛ¸®¼Â || Á¡·ÉÀü´ë±â || Á¡·ÉÀü½ÃÀÛ ÀÌ ¾Æ´Ï¸é °ü¸® °¡´É if (current_event != DOMINATION_EVENT_SYSTEM_RESET && current_event != DOMINATION_EVENT_WAIT && current_event != DOMINATION_EVENT_START) { return true; } } } return false; } //°ø°Ý ±æµå °áÁ¤ : °æ¸Å Á¤º¸³» ±æµå Á¤º¸ (copy to) °ø°Ý ±æµå Á¤º¸ void GameDominationManager::SetDominationInfoDisGuild(MAPCODE map_code) { MAPCODE check_map_code = DominationInfoParser::Instance()->GetDominationFieldCode(map_code); if (check_map_code == 0) { return; } DominationArea* domination_area = GetAreaInfo(map_code); if (domination_area == NULL) { return; } DOMINATION_INFO& domination_info = domination_area->GetInfo(); ZeroMemory(&(domination_info.m_disGuildInfo), sizeof(domination_info.m_disGuildInfo)); DominationAuction* auction = domination_area->GetAuction(); if (auction == NULL) { return; } const DominationAuctionInfo* auction_info = auction->SelectAttackGuild(); if (auction_info == NULL) { domination_info.m_disGuildInfo.m_GuildGuid = 0; return; } DOMINATION_BASIC_GUILD_INFO& dis_guild_info = domination_info.m_disGuildInfo; { dis_guild_info.m_GuildGuid = auction_info->m_ActionInfo.m_GuilGuid; dis_guild_info.m_PatternIndex = auction_info->m_PatternIndex; dis_guild_info.m_BackGroundIndex = auction_info->m_BackGroundIndex; dis_guild_info.m_GuildMasterGuid = auction_info->m_MasterGuid; _tcsncpy(dis_guild_info.m_tszGuildName, auction_info->m_ActionInfo.m_tszGuildName, _countof(dis_guild_info.m_tszGuildName)); dis_guild_info.m_tszGuildName[_countof(dis_guild_info.m_tszGuildName) - 1]='\0'; _tcsncpy(dis_guild_info.m_tszGuildMaster, auction_info->m_tszGuildMaster, _countof(dis_guild_info.m_tszGuildMaster)); dis_guild_info.m_tszGuildMaster[_countof(dis_guild_info.m_tszGuildMaster) - 1]='\0'; } #ifdef _CH_20100420_CHANGE_DOMINATION_APPLY_WAY domination_info.m_BestCost = 0; #else sDOMINATION_INFO* parser_info = DominationInfoParser::Instance()->GetDominationInfo(map_code); if (parser_info == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__":Not found data in script : %d", map_code); return; } const float percentage = 100.0f; domination_info.m_BestCost = static_cast((auction_info->m_ActionInfo.m_TenderCost) * (parser_info->m_BattingCharge / percentage)); #endif SendUpdateDominationInfo(domination_info, DOMINATION_DISGUILD_SET); GAMELOG->LogDomination(ACT_DOMINATION_SET_ATTACK_GUILD, domination_info.m_FieldCode); //_NA_20100604_BETTER_DOMINATION_MANAGER UpdateGuildInfoByDomination(domination_info.m_inGuildInfo.m_GuildGuid, DOMINATION_JOIN_COUNT); GameGuild* guild = g_GameGuildManager.FindGuild(auction_info->m_ActionInfo.m_GuilGuid); if (guild == NULL) { SUNLOG(eFULL_LOG, __FUNCTION__":Not found guild info"); return; } MSG_CG_DOMINATION_SELECTED_BRD brd_msg; brd_msg.m_DominationFieldCode = DominationInfoParser::Instance()->GetDominationLinkMapCode(domination_info.m_FieldCode); guild->SendPacketAll(&brd_msg, sizeof(brd_msg)); //_NA_20110406_CHANGE_RULE_FOR_DOMINATION_JOIN is_init_member_ = false; } void GameDominationManager::SendInitActionInfo(MAPCODE map_code) { MSG_GZ_DOMINATION_INIT_ACTIONINFO_SYN send_msg; send_msg.m_MapCode = map_code; g_pGameServer->SendToServer(GUILD_SERVER, &send_msg, sizeof(send_msg)); } void GameDominationManager::_ReturnDominationActionHeim(const DOMINATION_INFO& domination_info) { MSG_GZ_DOMINATION_RETURNHIME_SYN send_msg; send_msg.m_DominationInfo = domination_info; g_pGameServer->SendToServer(GUILD_SERVER, &send_msg, sizeof(send_msg)); } void GameDominationManager::_DeleteGuildInfoInAuction(const DOMINATION_INFO& domination_info) { MAPCODE map_code = domination_info.m_FieldCode; GUILDGUID guild_guid = domination_info.m_disGuildInfo.m_GuildGuid; DominationArea* domination_area = GetAreaInfo(map_code); if (domination_area == NULL) { return; } DominationAuction* auction = domination_area->GetAuction(); if (auction == NULL) { return; } auction->DeleteAuctionInfo(guild_guid); } // implemented by _NA_20100812_INTEGRATE_SYSTEM_MEMO_DOMINATION bool GameDominationManager::SendRewardMemo(const DOMINATION_INFO* domination_info, MAPCODE map_code) { #ifdef _CH_20100420_CHANGE_DOMINATION_APPLY_WAY SLOTCODE reward_item_code = DominationInfoParser::Instance()->GetBattingItemCodeByMapCode(domination_info->m_FieldCode); #else SLOTCODE reward_item_code = 0;//ÇÏÀÓÀÇ ¾ÆÀÌÅÛ ÄÚµå´Â 0 °¹¼ö´Â 0ÀÌ»ó #endif DominationArea* domination_area = GetAreaInfo(map_code); if (domination_area == NULL) { return false; } DominationAuction* auction = domination_area->GetAuction(); if (auction == NULL) { return false; } auction->SendRewardMemo(reward_item_code, SYSMEMO_DOMINATION_RETURN_MONEY_NEW); return true; } void GameDominationManager::ClearAuctionInfo(MAPCODE map_code) { DominationArea* domination_area = GetAreaInfo(map_code); if (domination_area == NULL) { return; } DominationAuction* auction = domination_area->GetAuction(); if (auction == NULL) { return; } auction->ClearAuctionInfo(); } void GameDominationManager::GuildMasterNameChange( \ GUILDGUID guild_guid, CHARGUID char_guid, const TCHAR* character_name) { for (AreaInfoMapIterator it = area_info_map_.begin(); it != area_info_map_.end(); ++it) { DominationArea& domination_area = *(it->second); DOMINATION_INFO& domination_info = domination_area.GetInfo(); if (domination_info.m_inGuildInfo.m_GuildGuid == guild_guid && domination_info.m_inGuildInfo.m_GuildMasterGuid == char_guid) { memset(domination_info.m_inGuildInfo.m_tszGuildMaster, 0, \ sizeof(domination_info.m_inGuildInfo.m_tszGuildMaster)); _tcsncpy(domination_info.m_inGuildInfo.m_tszGuildMaster, \ character_name, MAX_CHARNAME_LENGTH); } if (domination_info.m_disGuildInfo.m_GuildGuid == guild_guid && domination_info.m_disGuildInfo.m_GuildMasterGuid == char_guid) { memset(domination_info.m_disGuildInfo.m_tszGuildMaster, 0, \ sizeof(domination_info.m_disGuildInfo.m_tszGuildMaster)); _tcsncpy(domination_info.m_disGuildInfo.m_tszGuildMaster, \ character_name, MAX_CHARNAME_LENGTH); } } } #ifdef _NA_000000_20130429_DOMINATION_PENALTY void GameDominationManager::ProcessDominationPenalty( \ GUILDGUID guild_guid, MAPCODE map_code, int penalty_days) { GameGuild* guild = g_GameGuildManager.FindGuild(guild_guid); if (guild) { int member_count_in_domination_field = \ guild->GetMemberCountInDominataionFiled(map_code); SERVER_COMMON_OPTION& server_option_info = \ ServerOptionParserEx::Instance()->GetServerOption(); if (member_count_in_domination_field < \ server_option_info.domination_penalty.minimum_participation_members) { CTime current_time = util::TimeSync::_time64(NULL); CTime penalty_time = current_time + CTimeSpan(penalty_days, 0, 0, 0); MSG_GZ_DOMINATION_PENALTY_CMD msg; msg.guild_guid = guild_guid; msg.map_code = map_code; msg.member_count = member_count_in_domination_field; msg.penalty_time = penalty_time; g_pGameServer->SendToServer(GUILD_SERVER, &msg, sizeof(msg)); MSG_CG_DOMINATION_BATTING_HEIM_ACK warning_msg; warning_msg.m_ResultCode = RC::DOMINATION_RESULT_PENALTY_TIME; warning_msg.m_RemainCost = 0; warning_msg.penalty_time = penalty_time.GetTime(); guild->SendPacketAll(&warning_msg, sizeof(warning_msg)); } } } #endif //_NA_000000_20130429_DOMINATION_PENALTY #ifdef _NA_006826_20130722_DOMINATION_RENEWAL bool GameDominationManager::CheckDominationIsProgressing() { for (AreaInfoMapIterator it = area_info_map_.begin(); it != area_info_map_.end(); ++it) { DominationArea& domination_area = *(it->second); eDOMINATION_EVENT_STATE current_event = \ _GetCurrentDominationEvent(domination_area.GetMapCode()); if (current_event == DOMINATION_EVENT_START || current_event == DOMINATION_EVENT_WAIT) { return true; } } return false; } void GameDominationManager::ChangeAreaProgressState( MAPCODE map_code, const eDOMINATION_PROGRESS_STATE area_state ) { AreaInfoMapIterator find_iterator = area_info_map_.find(map_code); if (find_iterator == area_info_map_.end()) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found domination info : %d", map_code); return; } DominationArea* domination_area = find_iterator->second; domination_area->ChangeAreaProgressState(area_state); } void GameDominationManager::ChangeAllAreaProgressState( const eDOMINATION_PROGRESS_STATE area_state ) { for (AreaInfoMapIterator it = area_info_map_.begin(); it != area_info_map_.end(); ++it) { DominationArea& domination_area = *(it->second); domination_area.ChangeAreaProgressState(area_state); } } void GameDominationManager::OnDeadDominationMapNPC( const MAPCODE map_code, const MONSTERCODE monster_code ) { AreaInfoMapIterator find_iterator = area_info_map_.find(map_code); if (find_iterator == area_info_map_.end()) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found domination info : %d", map_code); return; } DominationArea* domination_area = find_iterator->second; // Á¡·ÉÀü ÁøÇàÁßÀÌ ¾Æ´Ò¶§, ¿ÀºêÁ§Æ®ÆÄ±«·Î »óŰ¡ ¹Ù²îÁö ¾Êµµ·Ï ÇÑ´Ù. (GMÅ×½ºÆ®ÀÇ °æ¿ì °¡´ÉÇÑ »óȲ) if ( domination_area->GetAreaProgressState() == DOMINATION_PROGRESS_STATE_NONE ) { return; } eDOMINATION_PROGRESS_STATE change_state = DOMINATION_PROGRESS_STATE_NONE; switch (monster_code) { // ¿Üº®(60003), °³±¸¸Û(60008) ÆÄ±«´çÇÔ case 60003: case 60008: change_state = DOMINATION_PROGRESS_STATE_BREAK_GATE; break; // ÇÇÀÇ °í¸®(60006) ÆÄ±«´çÇÔ case 60006: change_state = DOMINATION_PROGRESS_STATE_BREAK_TEMPLEOFBLOOD; break; // ÇÇÀÇ °áÁ¤Ã¼(60007) ÆÄ±«´çÇÔ case 60007: change_state = DOMINATION_PROGRESS_STATE_BREAK_CRYSTALIZEDBLOOD; break; default: return; } // ÇöÀç ÁøÇà»óÅ´ ´õ ³·Àº ÁøÇà»óÅ´ܰè·Î ³»·Á°¡Áö´Â ¾Ê´Â´Ù if (domination_area->GetAreaProgressState() < change_state) { domination_area->ChangeAreaProgressState(change_state); } } #endif //_NA_006826_20130722_DOMINATION_RENEWAL #ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION void GameDominationManager::SetDominationContinentLordInfo(const sDOMINATION_CONTINENT_LORD_INFO lord_info) { ContinentLordInfos::iterator iter = continent_lord_infos_.find(lord_info.continent_number); if (iter != continent_lord_infos_.end()) { continent_lord_infos_.erase(iter); } continent_lord_infos_.insert(std::make_pair (lord_info.continent_number, lord_info)); } const sDOMINATION_CONTINENT_LORD_INFO* GameDominationManager::GetDominationContinentLordInfo(int continent) const { ContinentLordInfos::const_iterator iter = continent_lord_infos_.find(continent); if (iter != continent_lord_infos_.end()) { return &iter->second; } return NULL; } void GameDominationManager::_RemoveGuildAreaInfoFromMapCode( const MAPCODE map_code ) { AreaInGuildMapIterator area_map_iter = area_in_guild_map.begin(); AreaInGuildMapIterator area_map_iter_end = area_in_guild_map.end(); for (; area_map_iter != area_map_iter_end; ++area_map_iter) { const GUILDGUID current_map_guild = area_map_iter->first; const MAPCODE current_map_code = area_map_iter->second; if (map_code == current_map_code) { area_in_guild_map.erase(area_map_iter); return; } } } #endif //_NA_007128_20140326_MONDSCHIEN_DOMINATION #ifdef _NA_007488_20140811_MONDSCHUEN_INITIALIZE_N_REWARD void GameDominationManager::ApplyAllMemberRewardOption( const GUILDGUID guild_guid, const bool is_add ) { const GameGuild* const guild = g_GameGuildManager.FindGuild(guild_guid); if (guild == NULL) { return; } const GUILDMEMBER_HASH& guild_members = guild->GetMemberHash(); for (GUILDMEMBER_HASH::const_iterator it = guild_members.begin(); it != guild_members.end(); ++it) { const GameGuildMember* const guild_member = it->second; if (guild_member == NULL) { continue; } Player* const player = PlayerManager::Instance()->FindPlayerByCharKey(guild_member->GetCharGuid()); if (player == NULL) { continue; } GameField* field = player->GetField(); if (field == NULL) { continue; } GameZone* zone = field->GetGameZone(); if (zone == NULL) { continue; } eZONETYPE zone_type = zone->GetZoneType(); // ´ÙÀ½ Á¸, Çʵå ŸÀÔµéÀº °ø¼ºÀÎÀå È¿°ú¸¦ Àû¿ë ¹ÞÁö ¾Ê´Â Àå¼ÒÀ̹ǷΠif (zone->GetZoneType() == eZONETYPE_INSTANCE) { GameInstanceDungeon* const pIndun = static_cast(zone); eINSTANCE_DUNGEON_KIND indun_type = pIndun->GetTypeOfIndun(); if(indun_type == INDUN_KIND_SS_QUEST || indun_type == INDUN_KIND_CHAOS_ZONE) { continue; } } if (zone_type == eZONETYPE_DOMINATION_FIELD) { continue; } // È¿°ú ½ÇÁ¦ Àû¿ë ApplyAllRewardOption(player, is_add); // ÀÎÀå Á¤º¸ °»½Å SendAreaInfoToPlayer(player, is_add); // ÀÎÀå ÀÌÆåÆ® °»½Å player->FirstGuildMemberEnter(); } } #endif // _NA_007488_20140811_MONDSCHUEN_INITIALIZE_N_REWARD #ifdef _NA_008334_20150608_SONNENSCHEIN VOID GameDominationManager::GetGuildTakenMaps(GUILDGUID guild_guid, OUT DominationInfoParser::TakenMaps* taken_maps) { //_NA_004899_20120530_CHANGE_DOMINATION_REWARD_OPTION std::pair taken_map_range = area_in_guild_map.equal_range(guild_guid); for (AreaInGuildMap::const_iterator it = taken_map_range.first; it != taken_map_range.second; ++it) { const MAPCODE taken_map_code = it->second; taken_maps->push_back(taken_map_code); } } #endif //_NA_008334_20150608_SONNENSCHEIN