#include #ifdef _NA_007065_20140217_CHAOSZONE_GOLDRUSH #include "World/ChaosZoneSystem/GoldRush.h" #include "World/ChaosZoneSystem/GoldRushTeam.h" #include <../ProgramCommon/BattleGroundInfoParser.h> #include "World/ChaosZoneSystem/GoldRushBattleResult.h" #include <../ProgramCommon/ChaosZoneSystem/PacketStruct_ChaosZoneSystem.h> #include <../Server/Common/PacketStruct_AG_ChaosZoneSystem.h> #include <../ProgramCommon/ChaosZoneSystem/GoldRushInfoParser.h> #include <../ProgramCommon/ChaosZoneSystem/GoldRushMonsterPointParser.h> #include #include #include "StatusManager.h" #include "SkillInfoParser.h" #include "SkillManager.h" #include "AbilityFactory.h" #include "Ability.h" #include "AbilityStatus.h" #include "Monster.h" #include "GMCmdManager.h" void GoldRush::Init( GameInstanceDungeon* const instance_dungeon ) { instance_dugeon_ = instance_dungeon; for (int i = 0; i < kTeamMax; ++i) { goldrush_team_[i] = NULL; } //ÀüÅõ°á°úâ »ý¼º goldrush_battle_result_ = new GoldRushBattleResult(); goldrush_battle_result_->Init(true); goldrush_battle_result_->SetGoldRush(this); // ÀüÀå ½ºÅ©¸³Æ® ¹Ì¸® Àбâ // battlegroundinfo MAPCODE map_code = instance_dugeon_->GetMapCode(); const BattleGroundInfoParser* const battle_ground_Info_parser = BattleGroundInfoParser::Instance(); if (battle_ground_Info_ == NULL) { const BattleGroundInfo* battle_ground_Info = battle_ground_Info_parser->FindData(map_code); if (battle_ground_Info) { battle_ground_Info_ = battle_ground_Info; } } // goldrushinfo const GoldRushInfoParser* const goldrush_info_parser = GoldRushInfoParser::Instance(); if (goldrush_info_ == NULL) { const GoldRushInfo* goldrush_info = goldrush_info_parser->FindData(map_code); if (goldrush_info) { goldrush_info_ = goldrush_info; } else // if (goldrush_info == NULL) { SUNLOG(eCRITICAL_LOG, "[GoldRush::Init()] GoldRushInfo is NULL. MapCode[%d]. ",map_code); } } // goldrushmonsterpoint monsterpoint_parser_ = GoldRushMonsterPointParser::Instance(); is_count_message_ = true; is_lastboss_dead_ = false; } void GoldRush::Update() { switch(goldrush_state_) { case eGOLDRUSH_ENTERWAIT: { //¸ðµç ¸â¹ö ÀÔÀå. if (_IsAllPlayerEntered() == true) { // ÀüÀåÁغñ»óÅ·ΠÀüȯ _StartWait(); break; } // ÀÏÁ¤ ½Ã°£ÀÌ Áö³ªµµ ¾çÆÀ ¸â¹ö°¡ ¸ðµÎ µé¾î ¿ÀÁö ¾ÊÀº °æ¿ì..(µé¾î ¿À´Â Áß°£¿¡ ºñÁ¤»ó Á¢¼ÓÁ¾·á µÈ À¯ÀúµéÀÌ ÀÖÀ» °æ¿ì) if (start_wait_timer_.IsExpiredManual(false) == false) break; // ÀüÀå Áغñ »óÅ·Π°­Á¦ Àüȯ _StartWait(); }break; case eGOLDRUSH_PREPAREWAIT: { if (is_count_message_ && start_wait_timer_.GetRemainedTime() <= 5 * kSecond) { const FIELDCODE field_code = static_cast(instance_dugeon_->GetMapCode()); GameField* const game_field = instance_dugeon_->FindGameField(field_code); if (game_field == NULL) { return; } if (game_field->IsReady() == false) { return; } TRIGGER_SERVER_EVENT trigger_msg; trigger_msg.event_id = 1; game_field->GetTriggerManager()->OnMsg(&trigger_msg); is_count_message_ = false; } // Áغñ½Ã°£ ÈÄ ÀüÀå ½ÃÀÛ. if (start_wait_timer_.IsExpiredManual(false) == false) break; // ÀüÀå ½ÃÀÛ _Start(); }break; case eGOLDRUSH_MATCHED: { for (int i = 0; i < kBlue; ++i) { if (goldrush_team_[i]) { goldrush_team_[i]->Update(); } } // ºÎȰ ½ºÄÉÁÙ¸µ.. if (resurrection_timer_.IsExpired()) { _AllDeathMemberResurrectionAtSafezone(); } // Á¾·áÁ¶°Ç µÇ°Å³ª ½Ã°£ÀÌ ´Ù µÇ¸é °á°úó¸®ÇÑ´Ù.. if (_IsGoldRushEnd()) { goldrush_state_ = eGOLDRUSH_RESULT; } }break; case eGOLDRUSH_RESULT: { // ÀüÀå Á¾·á // º¸»óó¸®.. _Result(); goldrush_state_ = eGOLDRUSH_END; }break; case eGOLDRUSH_END: { // ÀüÀå Á¾·áµÊ }break; } } void GoldRush::Release() { _DestroyTeamAll(); SAFE_RELEASENDELETE(goldrush_battle_result_); } bool GoldRush::EnterPlayer( Player* const player ) { if (player == NULL || player->IsDeleted()) return false; GoldRushTeam* team = _FindReadyTeam(player); if (team == NULL || team->GetTeamKey() == kObserve) { //GM ¿ÉÀú¹ö ¸ðµå GMCmdManager* const gm_manager = GMCmdManager::Instance(); Player* gm_player = gm_manager->GetGMPlayer(player->GetUserGuid()); if (gm_player == NULL) { return false; } team = _FindTeam(kObserve); if (team == NULL) team = _CreateTeam(kObserve); team->AddMember(player); // team_key setting.. ChaosZoneTeam team_key = team->GetTeamKey(); player->SetTeamKey(team_key); _SentToAllTeamInfo(); return true; } team->AddMember(player); // team key setting ChaosZoneTeam team_key = team->GetTeamKey(); player->SetTeamKey(team_key); // ÀüÀå Total List player_hash_.insert(PLAYER_HASH::value_type(player->GetCharGuid(), player)); bool is_abnormal_leave = false; //ºñÁ¤»ó Á¢¼Ó Á¾·áÀÚ if (player->GetStatusManager()->FindStatus(eCHAR_STATE_FUGITIVE) != NULL || //µµ¸ÁÀÚ ¹öÇÁ°¡ ÀÖÀ» °æ¿ì.. goldrush_state_ == eGOLDRUSH_PREPAREWAIT || // Á¸ À̵¿ µµÁß ºñÁ¤»ó Á¾·áµÇ¾î Áغñ½Ã°£¿¡ µé¾î¿ÔÀ» °æ¿ì.. goldrush_state_ == eGOLDRUSH_MATCHED) // Á¸ À̵¿ µµÁß ºñÁ¤»ó Á¾·áµÇ¾î ÀüÀå ½ÃÇÕ Áß¿¡ µé¾î¿ÔÀ» °æ¿ì.. { is_abnormal_leave = true; // »óÅÂÁ¦°Å (µµ¸ÁÀÚ ¹öÇÁ°¡ °É¸° »ç¶÷Àº ¿¹¾àÀÌ ¾ÈµÅ±â ¶§¹®¿¡ ¾îºä¡¿¡ ÇØ´çÇÏÁö ¾ÊÀ½) if (player->GetStatusManager()->FindStatus(eCHAR_STATE_FUGITIVE)) { if (!player->GetStatusManager()->Remove(eCHAR_STATE_FUGITIVE)) { MSG_CG_STATUS_REMOVE_BRD BrdMsg; BrdMsg.m_dwTargetKey = player->GetObjectKey(); BrdMsg.m_dwStatusCode = eCHAR_STATE_FUGITIVE; player->SendPacketAround(&BrdMsg, BrdMsg.GetSize()); } // dis count °¨¼Ò player->GetGoldRushPlayerInfo().DecreaseDisTimes(); } player->GetGoldRushPlayerInfo().SetPlayerState(kPlayerStateMatch); MSG_CG_GOLDRUSH_TIME_INFO_CMD cmd_msg; ;{ cmd_msg.elapsed_time = 1; player->SendPacket(&cmd_msg, sizeof(cmd_msg)); }; _SentToAllTeamInfo(); MSG_CG_GOLDRUSH_ABNORMAL_EXIT_USER_RETURN_SYN brd_msg; ;{ if (goldrush_state_ == eGOLDRUSH_MATCHED) { if (is_lastboss_dead_ == true) { brd_msg.remained_time = extra_timer_.GetRemainedTime(); } else // if (is_lastboss_dead_ == false) { brd_msg.remained_time = limit_timer_.GetRemainedTime(); } } for(int i=0; i < kTeamMax-1; ++i) { brd_msg.team_info[i].team_key = goldrush_team_[i]->GetTeamKey(); brd_msg.team_info[i].total_gold_point = goldrush_team_[i]->GetTotalTeamGoldPoint(); } // º¹±ÍÀ¯Àú¿¡°Ô ÇÊ¿äÇÑ Á¤º¸ Àü¼Û player->SendPacket(&brd_msg,sizeof(brd_msg)); }; } else if (goldrush_state_ == eGOLDRUSH_MATCHED) // ÀüÀå µé¾î¿À±âÀü ºñÁ¤»óÁ¢¼ÛÁ¾·áÀÚ Ã³¸®.. { is_abnormal_leave = true; } TCHAR add_info[MAX_ADDINFO_SIZE] = { 0, }; if (is_abnormal_leave) ::_sntprintf(add_info, MAX_ADDINFO_SIZE, _T("RETURN ABNORMAL EXIT!")); add_info[MAX_ADDINFO_SIZE-1] = _T('\0'); GAMELOG->LogChaosZone(ACT_BATTLE_GROUND_ENTER, player, NULL, add_info); return true; } void GoldRush::LeavePlayer( Player* const player ) { if (player == NULL || player->IsDeleted()) return; ChaosZoneTeam team_key = player->GetTeamKey(); GoldRushTeam* const team = _FindTeam(team_key); if (team == NULL) { return ; } // ºñÁ¤»ó Á¢¼ÓÁ¾·á¸¦ ´ëºñÇØ ³Ö¾îµÐ´Ù. team->SetReadyPlayer(player); team->RemoveMember(player->GetCharGuid()); // ÀüÀå Total List player_hash_.erase(player->GetCharGuid()); ;{ MSG_AG_GOLDRUSH_LEAVE_CMD packet; packet.zone_key = instance_dugeon_->GetKey(); player->SendPacket(&packet, sizeof(packet)); }; //ÆÐ³ÎƼ ºÎ¿© or ·©Å·½Ã½ºÅÛ¿¡ µ¥ÀÌÅͺ¸³»±â ------------------------------------------------------------ // ½ÃÀÛ ´ë±â½Ã°£ ¹× ½ÃÇÕ Áß ³ª°£ À¯Àú ÆÐ³ÎƼ Àû¿ë if (goldrush_state_ == eGOLDRUSH_PREPAREWAIT || goldrush_state_ == eGOLDRUSH_MATCHED) { GoldRushPenalty(player); } #ifdef _NA_008012_20150130_RANKING_SYSTEM //ÀüÀå Á¾·á ½Ã, ·©Å·DBÀÇ ÀüÀå±â·Ï °»½Å(Á¤»óÁ¾·áÀÏ °æ¿ì¸¸) else { const BattleRecorder::Record* player_record = GetGoldRushBattleResult()->GetPlayerBattleResult(player); player->GetRankingSystemCtl()->BattleGroundLeaveRoom(player, player_record, team->GetIsWin()); } #endif // _NA_008012_20150130_RANKING_SYSTEM // PlayerÀÇ ÆÀ Ű ÃʱâÈ­--------------------------------------- GMCmdManager* const gm_manager = GMCmdManager::Instance(); Player* gm_player = gm_manager->GetGMPlayer(player->GetUserGuid()); if (gm_player && gm_player->GetTeamKey() == kObserve) { player->SetTeamKey(kChaosZoneTeamNone); return; } // Ç÷¹ÀÌ¾î ÆÀŰ ÃʱâÈ­ player->SetTeamKey(kChaosZoneTeamNone); //ÀüÀåÀü ¬ º¸³»ÁÖ±â MSG_CG_CHARINFO_CHAOS_ZONE_RECORD_INFOS_CMD cmd_packet; const GoldRushRecordInfos record_infos = player->GetExtraInfoManager().GetGoldRushRecordInfos(); memcpy(cmd_packet.chaos_zone_record_infos.goldrush_record, record_infos.goldrush_record, sizeof(cmd_packet.chaos_zone_record_infos.goldrush_record)); player->SendPacket(&cmd_packet, sizeof(cmd_packet)); GAMELOG->LogChaosZone(ACT_BATTLE_GROUND_LEAVE, player); } void GoldRush::EnterTeam( const ChaosZoneTeam team_key, const BYTE player_count, DWORD* user_key_list ) { GoldRushTeam* const team = _CreateTeam(team_key); team->SetReadyPlayer(player_count, user_key_list); if (goldrush_state_ == eGOLDRUSH_NONE) { start_wait_timer_.SetTimer(battle_ground_Info_->entry_time * kSecond); goldrush_state_ = eGOLDRUSH_ENTERWAIT; } } void GoldRush::DeadCharacter( Character* const dead_character, Character* const kill_character ) { if (dead_character->IsEqualObjectKind(PLAYER_OBJECT) == true) { //1. Ç÷¹À̾ 'Ç÷¹À̾' kill ÇÑ °æ¿ì //2. ¸ó½ºÅͰ¡ 'Ç÷¹À̾' killÇÑ °æ¿ì DeadPlayer(static_cast(dead_character), kill_character); } else if(dead_character->IsEqualObjectKind(MONSTER_OBJECT) == true) { // 1. Ç÷¹À̾ '¸ó½ºÅ͸¦' killÇÑ °æ¿ì DeadMonster(static_cast(dead_character), kill_character); } } eUSER_RELATION_TYPE GoldRush::IsFriendPVP( Player* attacker,Player* target ) { if (goldrush_state_ != eGOLDRUSH_MATCHED) { return USER_RELATION_FRIEND; } if (target->GetGoldRushPlayerInfo().GetPlayerState() != kPlayerStateMatch || attacker->GetGoldRushPlayerInfo().GetPlayerState() != kPlayerStateMatch) { return USER_RELATION_FRIEND; } if (attacker->GetTeamKey() == target->GetTeamKey()) { return USER_RELATION_FRIEND; } return USER_RELATION_ENEMY; } Player* GoldRush::FindGoldRushMember( const CHARGUID CharGuid ) { PLAYER_HASH::iterator itr = player_hash_.find(CharGuid); if (itr == player_hash_.end()) { return NULL; } return itr->second; } RC::eBATTLE_GROUND_RESULT GoldRush::OnInitiateVote( Player* initiate_player, Player* van_payer ) { if (initiate_player->GetTeamKey() != van_payer->GetTeamKey()) { return RC::RC_BATTLE_GROUND_INITIATE_VOTE_DO_NOT_SAME_TEAM; } GoldRushTeam* initiate_vote_team = \ _FindTeam(initiate_player->GetTeamKey()); if (initiate_vote_team == NULL) { return RC::RC_BATTLE_GROUND_INITIATE_VOTE_FAIL; } if (initiate_vote_team->GetIsInitiateVote() == true) { return RC::RC_BATTLE_GROUND_INITIATE_VOTE_FAIL; } if (initiate_vote_team->GetMemberCount() <= 4) { return RC::RC_BATTLE_GROUND_INITIATE_VOTE_DO_NOT_SATISFY_MEMBER_COUNT; } if (initiate_vote_team->IsInitialteTime() == false) { return RC::RC_BATTLE_GROUND_INITIATE_VOTE_DO_NOT_SATISFY_LIMIT_TIME; } if (initiate_vote_team->OnInitiateVote(initiate_player, van_payer) == false) { return RC::RC_BATTLE_GROUND_INITIATE_VOTE_FAIL; } return RC::RC_BATTLE_GROUND_INITIATE_VOTE_SUCCESS; } GoldRushTeam* GoldRush::_FindTeam( const ChaosZoneTeam team_key ) { if (team_key == kChaosZoneTeamNone) { return NULL; } if (goldrush_team_[team_key -1] == NULL) { return NULL; } return goldrush_team_[team_key -1]; } void GoldRush::OnVote( Player* player, bool vote_result ) { GoldRushTeam* vote_team = \ _FindTeam(player->GetTeamKey()); if (vote_team == NULL) { return; } vote_team->OnVote(player->GetCharGuid(), vote_result); } void GoldRush::SendPacketToAll( MSG_BASE_FORWARD* msg, WORD msg_size ) { for (int i = 0; i < kTeamMax; ++i) { if (goldrush_team_[i]) { goldrush_team_[i]->SendPacketToAll(msg, msg_size); } } } void GoldRush::GoldRushPenalty( Player* player ) { if (player == NULL || player->IsDeleted()) return; // dis count Áõ°¡ player->GetGoldRushPlayerInfo().IncreaseDisTimes(); // ÆÐ³ÎƼ Àû¿ë..(µµ¸ÁÀÚ ¹öÇÁ) int skill_code = battle_ground_Info_->exit_condition; SkillInfoParser* const skill_info_parser = SkillInfoParser::Instance(); SkillScriptInfo* const skill_info = skill_info_parser->GetSkillInfo(skill_code); if (skill_info == NULL) { return; } BASE_ABILITYINFO* ability_info = skill_info->GetAbilityInfo(eABILITY_FUGITIVE); if (ability_info == NULL) { return; } // script ½Ã°£ ¼ÂÆÃ.. ability_info->m_iParam[2] = battle_ground_Info_->exit_period * kSecond; AbilityFactory* const ability_factory = AbilityFactory::Instance(); Ability* ability = ability_factory->AllocAbility(eABILITY_FUGITIVE, SKILL_TYPE_ACTIVE); if (ability == NULL) { return; } ability->InitDetailed(static_cast(player), skill_code, NULL, 0, ability_info); AbilityStatus* const ability_status = \ player->GetStatusManager()->AllocAbilityStatus(player,ability); if (ability_status == NULL) { return; } // Ç÷¹À̾ Á׾ »ç¶óÁöÁö ¾Ê´Â´Ù. SkillOption& skill_option = const_cast(ability_status->GetSkillOption()); skill_option.AddOption(SkillOption::eOption_HoldupBuffPostDead); ability_status->SendStatusAddBRD(); ability_factory->FreeAbility(ability); // °ñµåÆ÷ÀÎÆ® ÆÐ³ÎƼ---------------------------------------------------- //ºñÁ¤»ó Á¾·áÀÏ °æ¿ì, ³ª°£ À¯ÀúÀÇ ¼ÒÁö °ñµåÆ÷ÀÎÆ®¸¦ ´Ù¸¥ À¯Àúµé¿¡°Ô ºÐ¹èÇÑ´Ù. ChaosZoneTeam team_key = player->GetTeamKey(); GoldRushTeam* const team = _FindTeam(team_key); WORD gold_point = player->GetGoldRushPlayerInfo().GetGoldPoint(); // ÃʱâÈ­ // BattleResult¿¡¼­ÀÇ °ªÀº LeaveÇÔ¼ö¿¡¼­ Á÷Á¢ ÃʱâÈ­ÇØÁØ´Ù player->GetGoldRushPlayerInfo().SetGoldPoint(0); //ºÐ¹è if (team != NULL) { team->DistributeGoldPoint(gold_point); } ;{ MSG_CG_GOLDRUSH_TEAM_SCORE_INFO_BRD brd_packet; brd_packet.get_goldpoint = gold_point; if (team != NULL) { team->GetTeamMemberInfo(brd_packet.team); } else // if (team == NULL) { brd_packet.team.team_member_count = 0; brd_packet.team.team_key = kChaosZoneTeamNone; brd_packet.team.team_gold_point = 0; } //¶°³­ Ç÷¹À̾îÀÇ Á¤º¸µµ Æ÷ÇÔ½ÃŲ´Ù(°»½Å¸ñÀû) BYTE member_count = brd_packet.team.team_member_count++; brd_packet.team.team_player_info[member_count].gold_grade = player->GetGoldRushPlayerInfo().GetGoldGrade(); _tcsncpy(brd_packet.team.team_player_info[member_count].character_name, player->GetCharName(), MAX_CHARNAME_LENGTH); _SendPacketToAll(&brd_packet, sizeof(brd_packet)); }; #ifdef _JP_007387_20140702_GAMELOG_GOLDRUSH_GOLDPOINT GAMELOG->LogGoldRush(ACT_GOLDRUSH_GOLDPOINT_LOSE, player, gold_point, 0); #endif //_JP_007387_20140702_GAMELOG_GOLDRUSH_GOLDPOINT } void GoldRush::_DestroyTeamAll() { for (int i = 0; i < kTeamMax; ++i) { SAFE_DELETE(goldrush_team_[i]); } } void GoldRush::_SentToAllTeamInfo() { MSG_CG_GOLDRUSH_TEAM_INFO_BRD brd_msg; int member_count = 0; PLAYER_HASH::const_iterator const_itr = player_hash_.begin(); for(; const_itr != player_hash_.end(); ++const_itr) { Player* const player = const_itr->second; if (player == NULL || player->IsDeleted()) continue; // team key brd_msg.member_list[member_count].team_key = \ player->GetTeamKey(); // character name memset(brd_msg.member_list[member_count].character_name, 0, MAX_CHARNAME_LENGTH); _tcsncpy(brd_msg.member_list[member_count].character_name, player->GetCharName(), MAX_CHARNAME_LENGTH); brd_msg.member_list[member_count].character_name[MAX_GUILDNAME_LENGTH] = '\0'; // gold_point brd_msg.member_list[member_count].gold_grade = player->GetGoldRushPlayerInfo().GetGoldGrade(); ++member_count; } brd_msg.member_count = member_count; _SendPacketToAll(&brd_msg, sizeof(brd_msg)); } void GoldRush::_SendPacketToAll( MSG_BASE_FORWARD* msg, WORD msg_size ) { for (int i = 0; i < kTeamMax; ++i) { if (goldrush_team_[i]) { goldrush_team_[i]->SendPacketToAll(msg, msg_size); } } } void GoldRush::_StartWait() { //¸ðµç ¸â¹öµéÀÌ ±âº» °ñµåÆ÷ÀÎÆ®¸¦ Áö±Þ¹Þ´Â´Ù if (goldrush_info_ == NULL) { // ÀÌ ºÎºÐÀ¸·Î µé¾î¿À¸é °ÔÀÓÀ» ÁøÇàÇÒ ¼ö ¾ø´Ù. SUNLOG(eCRITICAL_LOG, "[GoldRush::Init()] GoldRushInfo is NULL."); return; } WORD start_goldpoint = goldrush_info_->start_point; for (int i = 0; i < kTeamMax; ++i) { if (goldrush_team_[i] != NULL) { goldrush_team_[i]->ObtainGoldPoint(start_goldpoint); } } _SentToAllTeamInfo(); _SendTotalTeamPoint(); MSG_CG_GOLDRUSH_TIME_INFO_CMD cmd_msg; ;{ cmd_msg.map_code = instance_dugeon_->GetMapCode(); _SendPacketToAll(&cmd_msg, sizeof(cmd_msg)); }; // 45ÃÊ ´ë±â½Ã°£ Ä«¿îÆ®¸¦ ½ÃÀÛÇÑ´Ù. (ÀüÁ¤ ½ÃÀÛ Áغñ½Ã°£..) start_wait_timer_.SetTimer(battle_ground_Info_->prepare_time * kSecond); // script.. goldrush_state_ = eGOLDRUSH_PREPAREWAIT; } Player* GoldRush::_FindPlayer( const DWORD char_guid ) { for (int i = 0; i < kBlue; ++i) { if (goldrush_team_[i] == NULL) { continue; } Player* player = goldrush_team_[i]->FindMember(char_guid); if (player) { return player; } } return NULL; } bool GoldRush::_IsAllPlayerEntered() { for (int i = 0; i < kBlue; ++i) { if (goldrush_team_[i] == NULL) { return false; } if (goldrush_team_[i]->IsAllPlayerEntered() == false) { return false; } } return true; } void GoldRush::_Start() { // team start for (int i = 0; i < kBlue; ++i) { if (goldrush_team_[i]) { goldrush_team_[i]->Start(); } } const FIELDCODE field_code = static_cast(instance_dugeon_->GetMapCode()); GameField* const game_field = instance_dugeon_->FindGameField(field_code); if (game_field == NULL) return; if (game_field->IsReady() == false) return; TRIGGER_SERVER_EVENT trigger_msg; trigger_msg.event_id = battle_ground_Info_->gate_trigger_id; game_field->GetTriggerManager()->OnMsg(&trigger_msg); //ºÎȰ ŸÀÓ ¼³Á¤..30ÃÊ resurrection_timer_.SetTimer(battle_ground_Info_->resurrection_period * kSecond); // script.. //°ÔÀÓ Ç÷¹À̽𣠼³Á¤ limit_timer_.SetTimer(goldrush_info_->play_time * kSecond); goldrush_state_ = eGOLDRUSH_MATCHED; } void GoldRush::_AllDeathMemberResurrectionAtSafezone() { for (int i = 0; i < kBlue; ++i) { if (goldrush_team_[i]) { goldrush_team_[i]->AllDeathMemberResurrectionAtSafezone(); } } } bool GoldRush::_IsGoldRushEnd() { if ( is_lastboss_dead_ == true ) { if (extra_timer_.IsExpiredManual(false)) { return true; } } else { if (limit_timer_.IsExpiredManual(false)) { return true; } } return false; } void GoldRush::_Result() { // Á×¾îÀÖÀ¸¸é »ì¸®°í °¢ÀÚ ¾ÈÀüÁö´ë·Î À̵¿½ÃŲ´Ù. PLAYER_HASH::const_iterator const_itr = player_hash_.begin(); for(; const_itr != player_hash_.end(); ++const_itr) { Player* const player = const_itr->second; if (player == NULL || player->IsDeleted()) continue; GoldRushTeam* const team = _FindTeam(player->GetTeamKey()); if (team == NULL) { continue; } team->OnMoveToSafezone(player); if (player->IsDead()) { player->OnResurrection( 0, 1.f, 1.f ); } } if (goldrush_team_[kRed-1] == NULL || goldrush_team_[kBlue-1] == NULL) { return; } // ´©°¡ À̰å´Â°¡ ÆÇ´Ü // ÀÌ±ä ÆÀ ½Â¸® üũ const WORD blue_team_goldpoint = goldrush_team_[kBlue-1]->GetTotalTeamGoldPoint(); const WORD red_team_goldpoint = goldrush_team_[kRed-1]->GetTotalTeamGoldPoint(); if (red_team_goldpoint > blue_team_goldpoint) { //Red Team Win goldrush_team_[kBlue-1]->OnResult(eBG_RESULT_LOSE); goldrush_team_[kRed-1]->OnResult(eBG_RESULT_WIN); } else if (red_team_goldpoint < blue_team_goldpoint) { //Blue Team Win goldrush_team_[kBlue-1]->OnResult(eBG_RESULT_WIN); goldrush_team_[kRed-1]->OnResult(eBG_RESULT_LOSE); } else //(red_team_goldpoint == blue_team_goldpoint), ±×¿Ü { //Draw goldrush_team_[kBlue-1]->OnResult(eBG_RESULT_DRAW); goldrush_team_[kRed-1]->OnResult(eBG_RESULT_DRAW); } if (goldrush_team_[kObserve-1] != NULL) { goldrush_team_[kObserve-1]->OnResult(eBG_RESULT_WIN); } } GoldRushTeam* GoldRush::_CreateTeam( const ChaosZoneTeam team_key ) { if (team_key == kChaosZoneTeamNone) { return NULL; } if (goldrush_team_[team_key -1] == NULL) { goldrush_team_[team_key -1] = new GoldRushTeam(this); if (goldrush_team_[team_key -1] == NULL) { return NULL; } goldrush_team_[team_key -1]->SetBattleGroundInfo(battle_ground_Info_); goldrush_team_[team_key -1]->SetTeamKey(team_key); return goldrush_team_[team_key -1]; } return goldrush_team_[team_key -1]; } GoldRushTeam* GoldRush::_FindReadyTeam( Player* const player ) { for (int i = 0; i < kTeamMax; ++i) { if (goldrush_team_[i] && goldrush_team_[i]->IsReadyPlayer(player->GetUserKey()) == true) { return goldrush_team_[i]; } } return NULL; } void GoldRush::DeadPlayer( Player* const dead_player, Character* const kill_character ) { if(dead_player == NULL || dead_player->IsDeleted()) return; //Á×Àº Ç÷¹ÀÌ¾î ºÎȰ GoldRushPlayerInfo& dead_player_info = dead_player->GetGoldRushPlayerInfo(); dead_player_info.SetMoveToSafeZoneTimer(battle_ground_Info_->dead_time * kSecond); dead_player_info.SetPlayerState(kPlayerStateDeath); // Á×Àº Ƚ¼ö Áõ°¡ dead_player_info.IncreaseDeath(); // Á×Àº Ç÷¹ÀÌ¾î ÆÀ ±¸ÇÑ´Ù GoldRushTeam* dead_team = _FindTeam(static_cast(dead_player->GetTeamKey())); // killer°¡ ¾øÀ¸¸é ¸®ÅÏÇÑ´Ù. if (kill_character == NULL || kill_character->IsDeleted()) { // ÀüÀå¿¡¼­ Á×À» ·Î±×±â·Ï (ų·¯°¡ ¾øÀ»°æ¿ì.. Æ®¸®°Å¿¡ ÀÇÇÑ Á×À½..) GAMELOG->LogChaosZone(ACT_BATTLE_GROUND_DEATH, dead_player); return; } // Killer°¡ ÀÖÀ» °æ¿ì WORD steal_gold_point = 0; // »©¾ÑÀº °ñµåÆ÷ÀÎÆ® GoldRushTeam* killer_team = NULL; Player* kill_player = NULL; if (kill_character->IsEqualObjectKind(PLAYER_OBJECT) == true) { // Ç÷¹À̾°Ô Á×¾úÀ» ¶§ÀÇ Ã³¸® kill_player = static_cast(kill_character); kill_player->GetGoldRushPlayerInfo().IncreaseKill(); // °ñµå Æ÷ÀÎÆ® ȹµæ killer_team = _FindTeam(static_cast(kill_player->GetTeamKey())); BYTE goldpoint_steal_ratio = goldrush_info_->steal_point_ratio; //Á×Àº Ç÷¹À̾°Ô¼­ Æ÷ÀÎÆ®¸¦ »¯´Â´Ù steal_gold_point = dead_player_info.LoseGoldPointRatio(goldpoint_steal_ratio); goldrush_battle_result_->DoRecord(static_cast(dead_player), BATTLE_RECORD_GOLDPOINT, static_cast(steal_gold_point) * -1); killer_team->DistributeGoldPoint(steal_gold_point, kill_player->GetCharGuid()); //¾î½Ã½ºÆ® Ƚ¼ö Áõ°¡½ÃŲ´Ù-------------------------------------------------------------- Player* assist_player = NULL; assist_player = dead_player->GetPlayerAssistMeter()->GetBestAssistPlayer(kill_player->GetCharGuid()); if(assist_player != NULL) { goldrush_battle_result_->DoRecord(assist_player, BATTLE_RECORD_ASSIST, 1); assist_player->GetGoldRushPlayerInfo().IncreaseAssistTimes(); } dead_player->GetPlayerAssistMeter()->Clear(); } else if (kill_character->IsEqualObjectKind(SUMMON_OBJECT) == true) { kill_player = _FindPlayer(kill_character->GetPlayerOwner()->GetCharGuid()); } else if (kill_character->IsEqualObjectKind(MONSTER_OBJECT) == true) { // ¸ó½ºÅÍ¿¡°Ô Á×¾úÀ» °æ¿ìÀÇ Ã³¸® BYTE goldpoint_lose_ratio = goldrush_info_->lose_point_ratio; //Á×Àº Ç÷¹À̾ Æ÷ÀÎÆ®¸¦ ÀҴ´٠steal_gold_point = dead_player_info.LoseGoldPointRatio(goldpoint_lose_ratio); goldrush_battle_result_->DoRecord(static_cast(dead_player), BATTLE_RECORD_GOLDPOINT, static_cast(steal_gold_point) * -1); } //°á°úÆÐŶ ;{ MSG_CG_GOLDRUSH_BATTLE_STATE_NOTIFY_BRD brd_msg; if (kill_player != NULL && kill_player->IsDeleted() == false) { // ų·¯°¡ Ç÷¹À̾îÀ̸é brd_msg.is_killer_monster = false; // ¿¬¼Óų if (kill_player->GetGoldRushPlayerInfo().GetSeriesKill() > 1) { brd_msg.is_series_kill = true; brd_msg.series_kill_count = kill_player->GetGoldRushPlayerInfo().GetSeriesKill(); } } else { // ų·¯°¡ ¸ó½ºÅÍ brd_msg.is_killer_monster = true; brd_msg.is_series_kill = false; } // ¿¬¼Óų Â÷´Ü const WORD dead_player_series_kill_count = dead_player->GetGoldRushPlayerInfo().GetSeriesKill(); if (dead_player_series_kill_count > 1) { brd_msg.is_series_kill_block = true; } _tcsncpy(brd_msg.kill_player_name, kill_character->GetCharName(), MAX_CHARNAME_LENGTH); _tcsncpy(brd_msg.dead_player_name, dead_player->GetCharName(), MAX_CHARNAME_LENGTH); // »©¾ÑÀº(»©¾Ñ±ä) °ñµåÆ÷ÀÎÆ® brd_msg.steal_gold = steal_gold_point; if (killer_team != NULL) { // ų·¯ÆÀ Á¤º¸ killer_team->GetTeamMemberInfo(brd_msg.killer_team); } if (dead_team != NULL) { //Á×Àº Ç÷¹ÀÌ¾î ÆÀ Á¤º¸ dead_team->GetTeamMemberInfo(brd_msg.dead_team); } _SendPacketToAll(&brd_msg, sizeof(brd_msg)); }; // ÀüÀå¿¡¼­ Á×Àº ·Î±×±â·Ï GAMELOG->LogChaosZone(ACT_BATTLE_GROUND_DEATH, dead_player, kill_character->GetCharName()); // ÀüÀå¿¡¼­ ų ·Î±×±â·Ï GAMELOG->LogChaosZone(ACT_BATTLE_GROUND_KILL, kill_player, dead_player->GetCharName()); } void GoldRush::DeadMonster(Monster* const dead_monster, Character* const kill_character) { //Á×Àº ¸ó½ºÅͰ¡ º¸½º¸ó½ºÅÍÀ̸é Á¾·áÇ÷¡±× Ȱ¼º if (dead_monster->GetBaseInfo()->m_MonsterCode == goldrush_info_->last_boss_code && is_lastboss_dead_ == false) { is_lastboss_dead_ = true; // Ç÷¹ÀÌŸÀÓ Á¾·á limit_timer_.DisableCheckTime(); // ¿¢½ºÆ®¶óŸÀÓ È°¼ºÈ­ extra_timer_.SetTimer(goldrush_info_->extra_time * kSecond); } // killer°¡ ¾øÀ¸¸é ¸®ÅÏÇÑ´Ù. if (kill_character == NULL || kill_character->IsDeleted()) { // ÀüÀå¿¡¼­ Á×À» ·Î±×±â·Ï (ų·¯°¡ ¾øÀ»°æ¿ì.. Æ®¸®°Å¿¡ ÀÇÇÑ Á×À½..) return; } // Killer°¡ ÀÖÀ» °æ¿ì Player* kill_player = NULL; if (kill_character->IsEqualObjectKind(PLAYER_OBJECT) == true) { kill_player = static_cast(kill_character); } else if (kill_character->IsEqualObjectKind(SUMMON_OBJECT) == true) { kill_player = _FindPlayer(kill_character->GetPlayerOwner()->GetCharGuid()); } if (kill_player == NULL || kill_player->IsDeleted()) return; ChaosZoneTeam killer_team_key = static_cast(kill_player->GetTeamKey()); GoldRushTeam* killer_team = _FindTeam(killer_team_key); // °ñµå Æ÷ÀÎÆ® ȹµæ-- WORD gold_point = 0; BYTE monster_grade = dead_monster->GetBaseInfo()->m_byGrade; MONSTERCODE monster_code = dead_monster->GetBaseInfo()->m_MonsterCode; const GoldRushMonsterPoint* monster_info = monsterpoint_parser_->FindData(monster_code); if (monster_info != NULL) { // GoldRushMonsterPoint¿¡ µî·ÏµÇ¾îÀÖ´Â ¸ó½ºÅ͸é ÇØ´ç °ñµå°ªÀ» °¡Á®¿Â´Ù gold_point = monster_info->monster_goldpoint; } else if (monster_grade >= eNPC_GENERAL && monster_grade <= eNPC_BOSS) { // ½ºÅ©¸³Æ®¿¡ µî·ÏµÇ¾îÀÖÁö ¾ÊÀº ¸ó½ºÅÍ¸é ±âº» µî±Þº° °ñµå°ªÀ» °¡Á®¿Â´Ù gold_point = goldrush_info_->monster_grade_point[monster_grade-1]; } //ÆÀ¿ø °¢ ¸â¹öµé¿¡°Ô °ñµåºÐ¹è killer_team->DistributeGoldPoint(gold_point); //-- ;{ MSG_CG_GOLDRUSH_MONSTERKILL_NOTIFY_BRD brd_msg; _tcsncpy(brd_msg.kill_player_name, kill_player->GetCharName(), MAX_CHARNAME_LENGTH); brd_msg.dead_monster_code = dead_monster->GetBaseInfo()->m_MonsterCode; if (monster_grade == eNPC_BOSS) { brd_msg.is_boss_monster = true; } else { brd_msg.is_boss_monster = false; } // ¸ó½ºÅÍ Ã³Ä¡·Î ȹµæÇÑ °ñµå brd_msg.get_goldpoint = gold_point; // °ñµåÆ÷ÀÎÆ® Á¤º¸ killer_team->GetTeamMemberInfo(brd_msg.killer_team); _SendPacketToAll(&brd_msg, sizeof(brd_msg)); }; #ifdef _JP_007387_20140702_GAMELOG_GOLDRUSH_GOLDPOINT GAMELOG->LogGoldRush(ACT_GOLDRUSH_MONSTERKILL, kill_player, 0,0, dead_monster->GetBaseInfo()->m_MonsterCode); #endif //_JP_007387_20140702_GAMELOG_GOLDRUSH_GOLDPOINT } void GoldRush::_SendTotalTeamPoint() { MSG_CG_GOLDRUSH_TOTAL_TEAM_POINT_BRD brd_packet; // ¿ÉÀú¹öÆÀ Á¦¿Ü for( int i=0; i < kTeamMax-1; ++i) { brd_packet.team_info[i].team_key = goldrush_team_[i]->GetTeamKey(); brd_packet.team_info[i].total_gold_point = goldrush_team_[i]->GetTotalTeamGoldPoint(); } _SendPacketToAll(&brd_packet, sizeof(brd_packet)); } #endif //_NA_007065_20140217_CHAOSZONE_GOLDRUSH