#include "StdAfx.h" #include "NewGameParty.h" #include "NewGamePartyManager.h" #include "Player.h" #include "PlayerManager.h" #include "GamePartyOperator.h" #include "GameRoom.h" #include ".\FriendInvitation\GFriendInvitationController.h" //Ä£±¸ ÃÊ´ë À̺¥Æ® //_NA_20110630_BATTLE_ZONE_RENEWAL #include "SlotManager.h" #include "ItemManager.h" #include "BattlezoneMissionTreeParser.h" #include "MapInfoParser.h" #include "MissionManager.h" NewGamePartyManager::NewGamePartyManager() { } NewGamePartyManager::~NewGamePartyManager() { } RC::ePARTY_RESULT NewGamePartyManager::CanRequestParty(DWORD request_member_key, DWORD recv_member_key) { PlayerManager* player_manager = PlayerManager::Instance(); Player* request_player = player_manager->FindPlayerByObjKey(request_member_key); Player* recv_player = player_manager->FindPlayerByObjKey(recv_member_key); if (request_player == NULL || recv_player == NULL) { return RC::RC_PARTY_PLAYER_NOTEXIST_TO_FIELD; } CHARGUID request_guild_guid = request_player->GetGuildGuid(); CHARGUID recv_guild_guid = recv_player->GetGuildGuid(); if (GuildSmallContentEntry::RelationSystem::GetRelationType( request_guild_guid, recv_guild_guid) >= eGUILD_RELATION_BOTH_HOSTILITY) { return RC::RC_PARTY_CANNOT_INVITE_HOSTILITY; } if (IsExistHostilityMember(request_player->GetPartyState().GetPartyKey(), recv_guild_guid)) { return RC::RC_PARTY_CANNOT_INVITE_HOSTILITY; } return RC::RC_PARTY_SUCCESS; } void NewGamePartyManager::Initialize(DWORD partyPoolSize) { party_pool_router_.Register(ePARTY_FIELD); party_pool_router_.Initialize(ePARTY_FIELD, partyPoolSize, partyPoolSize/4); //_NA_20110630_BATTLE_ZONE_RENEWAL party_pool_router_.Register(ePARTY_ROOM); party_pool_router_.Initialize(ePARTY_ROOM, partyPoolSize, partyPoolSize/4); //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND party_pool_router_.Register(ePARTY_INSTANCE); party_pool_router_.Initialize(ePARTY_INSTANCE, partyPoolSize, partyPoolSize/4); m_UpdateTimer.SetTimer(300); //__NA001336_090514_PARTY_NAVI_SUPPORT__ } void NewGamePartyManager::DestroyAllParty() { GameMemberOperator<> Opr; PARTY_MAP::iterator it = party_map_.begin(), end = party_map_.end(); while(it != end) { Opr.Init(eGAMEPARTY_OPERATOR_INIT, 0); NewGameParty* pNewGameParty = static_cast(it->second); pNewGameParty->For_eachMembers(Opr); BaseParty* pBaseParty = it->second; const ePARTY_TYPE party_type = pBaseParty->GetType(); pBaseParty->Release(); party_pool_router_.Free(party_type, pBaseParty); party_map_.erase(it++); } } void NewGamePartyManager::CreateGameParty(WORD partyKey, DWORD masterKey, eITEM_DISTRIBUTION_TYPE type, ePARTY_TYPE partyType) { BaseParty* pBaseParty = BasePartyManager::CreateParty(partyType, partyKey, masterKey); if(!pBaseParty) { SUNLOG(eCRITICAL_LOG, "[CreateGameParty] Can't Create GameParty[%u]", partyKey); return; } pBaseParty->SetDistributionType(type); } void NewGamePartyManager::DestroyGameParty(WORD party_key) { BaseParty* base_party = FindEditableParty(party_key); if (base_party == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found party : %u", party_key); return; } static GameMemberOperator<> Opr; Opr.Init(eGAMEPARTY_OPERATOR_INIT, 0); base_party->For_eachMembers(Opr); BasePartyManager::DestroyParty(party_key); } void NewGamePartyManager::JoinGameParty(WORD party_key, const _PARTY_MEMBER_INFO& join_member_info, bool is_master) { RC::ePARTY_RESULT rcResult = BasePartyManager::JoinParty(party_key, join_member_info); if(rcResult != RC::RC_PARTY_SUCCESS) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Fail join party : %u : %u", party_key, rcResult); return; } Player* player = PlayerManager::Instance()->FindPlayerByObjKey(join_member_info.m_dwMemberKey); if (player) { player->GetPartyState().JoinParty(0, party_key); GFriendInvitationController::Instance()->OnParty_Join(party_key, join_member_info.m_dwMemberKey); } } void NewGamePartyManager::LeaveGameParty(WORD party_key, DWORD member_key) { RC::ePARTY_RESULT result_code = BasePartyManager::LeaveParty(party_key, member_key); if (result_code != RC::RC_PARTY_SUCCESS) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Fail leave party : %u : %u", party_key, result_code); return; } Player* player = PlayerManager::Instance()->FindPlayerByObjKey(member_key); if(player) { GFriendInvitationController::Instance()->OnParty_Leave(party_key, member_key); player->GetPartyState().Init(); } } void NewGamePartyManager::ChangeGameMaster(WORD partyKey, DWORD nextMasterKey) { RC::ePARTY_RESULT rcResult = BasePartyManager::ChangeMaster(partyKey, nextMasterKey); if(rcResult != RC::RC_PARTY_SUCCESS) { SUNLOG(eCRITICAL_LOG, "[ChangeMaster] Fail ChangeMaster[%u]! ErrorCode[%u]", partyKey, rcResult); return; } //{__NA1335_090407_PORTAL_MISSION_ROOM_CONSTRAINTS__ Player* pPlayer = PlayerManager::Instance()->FindPlayerByObjKey(nextMasterKey); GameZone* pGameZone = 0; if(pPlayer == 0 || !(pGameZone = pPlayer->GetGameZonePtr())) return; eZONETYPE zoneType = pGameZone->GetZoneType(); if(zoneType == eZONETYPE_MISSION || zoneType == eZONETYPE_INSTANCE) static_cast(pGameZone)->ChangeMaster(pPlayer->GetUserKey()); //} } void NewGamePartyManager::ChangeItemDistributionType(WORD partyKey, eITEM_DISTRIBUTION_TYPE type) { BaseParty* pBaseParty = FindEditableParty(partyKey); if(!pBaseParty) { SUNLOG(eCRITICAL_LOG, "[ChangeItemDistributionType] Can't Find GameParty[%u]", partyKey); return; } if(type >= eITEM_DISTRIBUTION_MAX) { SUNLOG(eCRITICAL_LOG, "[ChangeItemDistributionType] Invalid DistributionType[%u]", type); return; } pBaseParty->SetDistributionType(type); } void NewGamePartyManager::MemberLevelUp(WORD partyKey, DWORD memberKey) { NewGameParty* pNewGameParty = (NewGameParty*)FindEditableParty(partyKey); if(!pNewGameParty) { if(partyKey) SUNLOG(eCRITICAL_LOG, "[MemberLevelUp] Can't Find GameParty[%u]", partyKey); return; } pNewGameParty->MemberLevelUp(memberKey); } void NewGamePartyManager::GetAreaLivePartyInfo(WORD partyKey, ZONEKEY zoneKey, const WzVector* pNpcPos, BYTE byRadius, OUT WORD& totalNum, OUT LEVELTYPE& totalLevel) { NewGameParty* pNewGameParty = (NewGameParty*)FindEditableParty(partyKey); if(pNewGameParty == 0) return; totalNum = 0; totalLevel = 0; if(pNpcPos == NULL || byRadius == 0) return; static GameMemberOperator<> Opr; Opr.Init(eGAMEPARTY_OPERATOR_AREA_LIVE_PARTYINFO, 0); Opr.SetAreaInfo(zoneKey, pNpcPos, byRadius); pNewGameParty->For_eachMembers(Opr); Opr.GetAreaInfo(totalNum, totalLevel); } void NewGamePartyManager::AddExpToAllMember(WORD partyKey, EXPTYPE Exp) { NewGameParty* pNewGameParty = (NewGameParty*)FindEditableParty(partyKey); if(!pNewGameParty) return; static GameMemberOperator<> Opr; Opr.Init(eGAMEPARTY_OPERATOR_ADD_EXP, 0); Opr.SetExp(Exp); pNewGameParty->For_eachMembers(Opr); } BOOL NewGamePartyManager::IsMaster(Player* pPlayer) { NewGameParty* pNewGameParty = (NewGameParty*)FindEditableParty(pPlayer->GetPartyState().GetPartyKey()); if(!pNewGameParty) return FALSE; return pNewGameParty->GetMasterKey() == pPlayer->GetObjectKey() ? TRUE : FALSE; } Player* NewGamePartyManager::FindMasterPlayer(WORD partyKey) { NewGameParty* pNewGameParty = (NewGameParty*)FindEditableParty(partyKey); if(pNewGameParty == 0) return NULL; Player* pMaster = PlayerManager::Instance()->FindPlayerByObjKey(pNewGameParty->GetMasterKey()); return pMaster; } Player* NewGamePartyManager::FindMemberPlayer(WORD partyKey, DWORD memberKey) { NewGameParty* pNewGameParty = (NewGameParty*)FindEditableParty(partyKey); if(pNewGameParty == 0) return NULL; Player* pMember = PlayerManager::Instance()->FindPlayerByObjKey(memberKey); return pMember; } BYTE NewGamePartyManager::GetDistributionType(WORD partyKey) { NewGameParty* pNewGameParty = (NewGameParty*)FindEditableParty(partyKey); if(pNewGameParty == 0) return NULL; return pNewGameParty->GetDistributionType(); } BOOL NewGamePartyManager::IsExistHostilityMember(WORD party_key, DWORD hostility_guild_guid) { NewGameParty* new_game_party = (NewGameParty*)FindEditableParty(party_key); if (new_game_party == NULL) { return FALSE; } static GameMemberOperator<> Opr; Opr.Init(eGAMEPARTY_OPERATOR_HOSTILITY_CHECK, 0); Opr.SetHostilityGuildGuid(hostility_guild_guid); new_game_party->For_eachMembers(Opr); return Opr.IsExistHostilityMember(); } DWORD NewGamePartyManager::GetDistributionMemberKey(WORD party_key, DWORD defaultOwnerKey, eCHAR_TYPE classType) { NewGameParty* pNewGameParty = (NewGameParty*)FindEditableParty(party_key); if(pNewGameParty == 0) return defaultOwnerKey; eITEM_DISTRIBUTION_TYPE type = (eITEM_DISTRIBUTION_TYPE)pNewGameParty->GetDistributionType(); switch(type) { case eITEM_DISTRIBUTION_DEFAULT: return defaultOwnerKey; case eITEM_DISTRIBUTION_FIFO_PRIORITY: return pNewGameParty->GetFIFOMemberKey(); case eITEM_DISTRIBUTION_MASTER_PRIORITY: return pNewGameParty->GetMasterKey(); case eITEM_DISTRIBUTION_RANDOM: return pNewGameParty->GetRandomMemberKey(); case eITEM_DISTRIBUTION_CLASS_PRIORITY: return pNewGameParty->GetRandomMemberKey(classType); #ifdef _NA_003033_20110831_DICECAST_ITEM_ROUTING case eITEM_DISTRIBUTION_DICE_AND_FIFO: return pNewGameParty->GetFIFOMemberKey(); case eITEM_DISTRIBUTION_DICE_AND_DEFAULT: return defaultOwnerKey; #endif //_NA_003033_20110831_DICECAST_ITEM_ROUTING default: SUNLOG(eCRITICAL_LOG, "[GetDistributionMemberKey] Invalid DistributionType[%u]", type); } return defaultOwnerKey; } DWORD NewGamePartyManager::GetValidReferencePlayerKeyForReturn(WORD party_key) { NewGameParty* pGameParty = (NewGameParty*)FindEditableParty(party_key); if(pGameParty == 0) return FALSE; static GameMemberOperator<> Opr; Opr.Init(eGAMEPARTY_OPERATOR_VALID_PLAYER_INFO_FOR_PARTY_RETURN, 0); pGameParty->For_eachMembers(Opr); DWORD playerKey = Opr.GetFirstValidPlayerForPartyReturn(); return playerKey; } void NewGamePartyManager::GetEnterRoomConditionInfoCollect(GameMemberEnterConditonOperator& oper, Player* pRequester) { const WORD partyKey = pRequester->GetPartyState().GetPartyKey(); BaseParty* pParty = NULL; if(partyKey && (pParty = FindEditableParty(partyKey))) pParty->For_eachMembers(oper); else oper(pRequester, pRequester->GetObjectKey()); } BOOL NewGamePartyManager::SendPacketAllMember(WORD partyKey, MSG_BASE* pMsg, WORD wSize, DWORD exceptKey) { NewGameParty* pNewGameParty = (NewGameParty*)FindEditableParty(partyKey); if(pNewGameParty == 0) return FALSE; static GameMemberOperator<> Opr; Opr.Init(eGAMEPARTY_OPERATOR_SEND, exceptKey); Opr.SetSendPacket(pMsg, wSize); pNewGameParty->For_eachMembers(Opr); return TRUE; } void NewGamePartyManager::Display() { DWORD dwMemberZeroCount = 0; PARTY_MAP::iterator end(party_map_.end()); for(PARTY_MAP::iterator it = party_map_.begin(); it != end; ++it) { NewGameParty* pNewGameParty = (NewGameParty*)it->second; if(!pNewGameParty->GetMemberNum()) ++dwMemberZeroCount; } // ÆÄƼ¿øÀÌ 0ÀÎ ÆÄƼ ¼ö, Àüü ÆÄƼ °³¼ö, ÆÄƼ¿¡ ¼Ò¼ÓµÈ Àüü ¸â¹ö¼ö SUNLOG(eCRITICAL_LOG, "TotPartyNum[%d] MemberZeroPartyNum[%d]", party_map_.size(), dwMemberZeroCount); } void NewGamePartyManager::Update() { BOOLEAN isExpired = !!m_UpdateTimer.IsExpired(); if(isExpired == 0) return; FOREACH_CONTAINER(const PARTY_MAP::value_type& rParty, party_map_, PARTY_MAP) { NewGameParty* pGameParty = static_cast(rParty.second); pGameParty->Update(); } } //_NA_20110630_BATTLE_ZONE_RENEWAL BYTE NewGamePartyManager::GetMemberConditionForEnterRoom(CheckMemberConditionToEnterRoomOperator& oper, WORD check_party_key) { BaseParty* base_party = NULL; if (!check_party_key || !(base_party = FindEditableParty(check_party_key))) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found party : %d", check_party_key); return 0; } base_party->For_eachMembers(oper); return static_cast(base_party->GetMemberNum()); } BYTE NewGamePartyManager::GetMemberConditionForChangeOption(CheckMemberConditionToChangeOptionOperator& oper, WORD change_party_key) { BaseParty* base_party = NULL; if (!change_party_key || !(base_party = FindEditableParty(change_party_key))) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found party : %d", change_party_key); return 0; } base_party->For_eachMembers(oper); return static_cast(base_party->GetMemberNum()); } bool NewGamePartyManager::RemoveMissionItem(Player* master_player, SLOTCODE item_code, BYTE item_num) { if (item_code == 0) { return false; } ItemManager* item_manager = master_player->GetItemManager(); POSTYPE num = static_cast(item_num); SCItemSlot deleted_item_slot; MSG_CG_ITEM_LOSE_ACK ack_msg; { RC::eITEM_RESULT result_value = item_manager->DeleteAllKindOfItem( \ 1, &item_code, &num, &(ack_msg.m_ItemInfo), &deleted_item_slot); if (result_value != RC::RC_ITEM_SUCCESS) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Fail Delete item : %d", master_player->GetCharGuid()); return false; } //¹èƲÁ¸ ¹Ì¼Ç, Àúž, À̺¥Æ® ¹æ »ý¼º½Ã ¼Ò¸ðµÇ´Â ¾ÆÀÌÅÛ ·Î±× GAMELOG->LogItem(ITEM_USE, master_player, &deleted_item_slot, 0, item_num); } master_player->SendPacket(&ack_msg, ack_msg.GetSize()); return true; } RC::ePARTY_RESULT NewGamePartyManager::SetMemberReadyState(Player* player, WORD party_key, bool ready_state) { MissionManager* mission_manager = player->GetMissionManager(); if (mission_manager->EnableWindowOpen() == true) { return RC::RC_PARTY_NOT_MISSION_REWARD; } NewGameParty* party = static_cast(FindEditableParty(party_key)); if (party == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found party : %d", party_key); return RC::RC_PARTY_NOT_EXIST_PARTY; } party->SetMemeberReadyState(player->GetObjectKey(), ready_state); return RC::RC_PARTY_SUCCESS; } void NewGamePartyManager::ResetMemberReadyState(WORD party_key) { NewGameParty* party = static_cast(FindEditableParty(party_key)); if (party == NULL) { SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Not found party : %d", party_key); return; } party->ResetReadyStateAllMember(); return; } //gamelulu's note : ÇöÀç »óȲ¿¡¼­ÀÇ RoomTypeº° ¸ðµç °ÇÀ» ´Ù·ç´Ù º¸´Ï ÀÎÀÚ¼ö°¡ ¸¹¾ÆÁø »óÅÂÀ̸ç //¾ÕÀ¸·Î Ãß°¡ µÉ ¼öµµ ÀÖ´Â ÀÎÀÚ°¡ Á¸ÀçÇÒ °¡´É¼ºµµ ¸¹´Ù. //°¢ RoomTypeº° °´Ã¼¿¡ ¹æÀ» »ý¼º ÇÒ ¼ö ÀÖ´ÂÁö Á¶°Ç äũ¿¡ °üÇÑ ·ÎÁ÷À» Ãß°¡ÇÏ¿© ¾Æ·¡¿Í °°Àº ÇÔ¼ö //»ý¼ºÀ» ¸·´Â ÆíÀÌ ÁÁÀ» °Í °°´Ù. (2011.09.16) RC::ePARTY_RESULT NewGamePartyManager::CheckRoomTerms(Player* player, SLOTCODE item_code, BYTE item_num, PartyZoneType party_room_type, MAPCODE map_code) { BattlezoneMissionTreeParser* const parser = BattlezoneMissionTreeParser::Instance(); //step 1 : ¾ÆÀÌÅÛÀÌ ÇÊ¿äÇÑ ¹Ì¼ÇÀÎÁö üũ if (parser->IsMissionOfRequireItem(map_code, party_room_type) == true) { //step 2 : Àü´ÞµÈ ¾ÆÀÌÅÛÀÌ ÇØ´ç ¹Ì¼Ç¿¡ ÇÊ¿äÇÑ ¾ÆÀÌÅÛÀÎÁö °Ë»ç if (parser->IsMissionItem(map_code, party_room_type, item_code) == false) { return RC::RC_PARTY_INVALID_ITEM; } //stemp 3 : Àü´ÞµÈ ¾ÆÀÌÅÛÀ» À¯Àú°¡ ¼ÒÀ¯Çϰí ÀÖ´ÂÁö °Ë»ç #ifdef _NA_007734_20141027_ADD_ROOMKIND_SPECIALMISSION RC::ePARTY_RESULT result_code = ExistPartyRoomItem(player, item_code, item_num, party_room_type); #else RC::ePARTY_RESULT result_code = ExistPartyRoomItem(player, item_code, item_num); #endif //_NA_007734_20141027_ADD_ROOMKIND_SPECIALMISSION if (result_code != RC::RC_PARTY_SUCCESS) { return result_code; } } switch (parser->GetZoneType(map_code)) { case eZONETYPE_INSTANCE: { const sMAPINFO* const map_info = MapInfoParser::Instance()->FindMapInfo(map_code); if (map_info == NULL) { return RC::RC_PARTY_NOT_INCORRECT_MAPCODE; } const eZONE_RULESET& ruleset = map_info->Ruleset; if (ruleset.rules & ruleset.ZONE_RULE_INDUN_CANT_EQUIP_WEAPON_AND_BLOCK) { const BASE_ITEMINFO* const equip_info = player->GetEquipItemInfo(eEQUIPCONTAINER_WEAPON); if (equip_info != NULL) { return RC::RC_PARTY_ROOM_NEED_UNEQUIP_WEAPON; } } } break; case eZONETYPE_MISSION: { MapInfoParser* const map_info_parser = MapInfoParser::Instance(); nsPartyRoomMission::EnterSynArg arg = { 0, }; arg.map_info_ = map_info_parser->FindMapInfo(map_code); if (arg.map_info_ == NULL) { return RC::RC_PARTY_NOT_INCORRECT_MAPCODE; } const bool is_free_pass = nsPartyRoomMission::IsFreePassLevel(player, &arg); if (is_free_pass == false) { nsPartyRoomMission::QuestOrMissionResult result; if (nsPartyRoomMission::IsMissionOrQuestPass(player, &arg, &result) == false) { if (result.quest_check_skip_ == false && result.is_quest_pass_ == false) { return RC::RC_PARTY_PREVIOUS_QUEST_CLEAR; } else if (result.mission_check_skip_ == false && result.is_mission_pass_ == false) { return RC::RC_PARTY_NEED_CLEAR_PRE_MISSION; } } } } break; case eZONETYPE_PVP: break; case eZONETYPE_FIELD: break; default: SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Invalid party room type : %d", party_room_type); return RC::RC_PARTY_INVALID_ROOMTYPE; } return RC::RC_PARTY_SUCCESS; } RC::ePARTY_RESULT NewGamePartyManager::CheckJoinRoomTerms(Player* player, SLOTCODE item_code, BYTE item_num, eZONETYPE party_room_type, MAPCODE map_code) { //ŸÀÔº° Ãß°¡ Á¶°Ç °Ë»ç switch (party_room_type) { case eZONETYPE_INSTANCE: break; case eZONETYPE_MISSION: { MapInfoParser* const map_info_parser = MapInfoParser::Instance(); nsPartyRoomMission::EnterSynArg arg = { 0, }; arg.map_info_ = map_info_parser->FindMapInfo(map_code); const bool is_free_pass = nsPartyRoomMission::IsFreePassLevel(player, &arg); if (is_free_pass == false) { nsPartyRoomMission::QuestOrMissionResult result; if (nsPartyRoomMission::IsMissionOrQuestPass(player, &arg, &result) == false) { if (result.quest_check_skip_ == false && result.is_quest_pass_ == false) { return RC::RC_PARTY_PREVIOUS_QUEST_CLEAR; } else if (result.mission_check_skip_ == false && result.is_mission_pass_ == false) { return RC::RC_PARTY_NEED_CLEAR_PRE_MISSION; } } } } break; case eZONETYPE_PVP: break; case eZONETYPE_FIELD: break; default: SUNLOG(eCRITICAL_LOG, __FUNCTION__" : Invalid party room type : %d", party_room_type); return RC::RC_PARTY_INVALID_ROOMTYPE; } return RC::RC_PARTY_SUCCESS; } #ifdef _NA_007734_20141027_ADD_ROOMKIND_SPECIALMISSION RC::ePARTY_RESULT NewGamePartyManager::ExistPartyRoomItem(Player* player, SLOTCODE item_code, BYTE item_num, PartyZoneType party_room_type /*= PartyOfMax*/)const { //¾ÆÀÌÅÛ ±¸ÇÑ´Ù BASE_ITEMINFO* item_info = ItemInfoParser::Instance()->GetItemInfo(item_code); if (item_info == NULL) { return RC::RC_PARTY_INVALID_ITEM; } PartyState& party_state = player->GetPartyState(); const BaseParty* const party = FindParty(party_state.GetPartyKey()); if (party != NULL && party_room_type == PartyOfSpecialMission) { //¸ðµç ÆÄƼ¿øµéÀÇ ¾ÆÀÌÅÛÀ» °Ë»ç PlayerManager* player_manager = PlayerManager::Instance(); ItemManager* item_manager = NULL; const BaseParty::MEMBER_MAP& member_map = party->GetMemberList(); BaseParty::MEMBER_MAP::const_iterator itr = member_map.begin(); for( ; itr != member_map.end(); ++itr) { Player* party_member = player_manager->FindPlayerByObjKey(itr->first); if (party_member != NULL) { item_manager = party_member->GetItemManager(); } if (item_manager->ExistItem(SI_INVENTORY, item_code, item_num) < item_num) { return RC::RC_PARTY_NOT_EXIST_ITEM; } } } else { // ´ë»ó Ç÷¹À̾îÀÇ ¾ÆÀÌÅÛÀ» °Ë»ç ItemManager* item_manager = player->GetItemManager(); if (item_manager->ExistItem(SI_INVENTORY, item_code, item_num) < item_num) { return RC::RC_PARTY_NOT_EXIST_ITEM; } } return RC::RC_PARTY_SUCCESS; } #else RC::ePARTY_RESULT NewGamePartyManager::ExistPartyRoomItem(Player* player, SLOTCODE item_code, BYTE item_num)const { ItemManager* item_manager = player->GetItemManager(); BASE_ITEMINFO* item_info = ItemInfoParser::Instance()->GetItemInfo(item_code); if (item_info == NULL) { return RC::RC_PARTY_INVALID_ITEM; } if (item_manager->ExistItem(SI_INVENTORY, item_code, item_num) < item_num) { return RC::RC_PARTY_NOT_EXIST_ITEM; } return RC::RC_PARTY_SUCCESS; } #endif //_NA_007734_20141027_ADD_ROOMKIND_SPECIALMISSION #ifdef _NA_003033_20110831_DICECAST_ITEM_ROUTING DWORD NewGamePartyManager::GetDiceCastDistributionMember(Player* player, WORD party_key, DicecastResultArray& result) { NewGameParty* party = static_cast(FindEditableParty(party_key)); if (party == NULL) return 0; return party->GetDicecastResultKey(player, result); } #endif //_NA_003033_20110831_DICECAST_ITEM_ROUTING #ifdef _NA_0_20111021_EDIT_HEIM_DROP_RATIO_BY_PARTY_USER_COUNT int NewGamePartyManager::FindNearPartyUserCount(Player* player) { int member_count = 1; // ÀÚ±â ÀڽŠÆ÷ÇÔ. WORD party_key = player->GetPartyState().GetPartyKey(); const BaseParty* pParty = FindParty(party_key); if(!pParty) return member_count; DWORD number_of_party_members = pParty->GetMemberNum(); if(number_of_party_members < 1) return member_count; GameZone * game_zone = player->GetGameZonePtr(); if(!game_zone) return member_count; float near_radius = 0.0f; if (game_zone->GetZoneType() == eZONETYPE_MISSION) near_radius = 0.0f; else near_radius = 60.0f; GameField* owner_field = player->GetField(); if (!owner_field) return member_count; // Á¶°Ç¿¡ ¸Â´Â ¸â¹ö¸¦ ã´Â´Ù BaseParty::MEMBER_MAP tempParty = pParty->GetMemberList(); for(BaseParty::MEMBER_MAP::iterator iter = tempParty.begin(); iter != tempParty.end(); ++iter) { const _PARTY_MEMBER_INFO& memberInfo = iter->second; Player *pMember = PlayerManager::Instance()->FindPlayerByObjKey(memberInfo.m_dwMemberKey); if(!pMember) continue; if(pMember->IsDead()) continue; if (player == pMember) continue; GameZone *pZone = pMember->GetGameZonePtr(); if(!pZone) continue; GameField* member_field = pMember->GetField(); if(member_field == NULL) continue; if(owner_field->GetFieldCode() != member_field->GetFieldCode()) continue; if (near_radius != 0.0f) { if(Math_VectorLength(*player->GetPosPtr(), *pMember->GetPosPtr()) > near_radius) continue; } ++member_count; } return member_count; } #endif //_NA_0_20111021_EDIT_HEIM_DROP_RATIO_BY_PARTY_USER_COUNT