void BattleGround::EndBattleGround(uint32 winner) { WorldPacket data; Player *Source = NULL; const char *winmsg = ""; if(winner == ALLIANCE) { winmsg = GetMangosString(LANG_BG_A_WINS); PlaySoundToAll(SOUND_ALLIANCE_WINS); // alliance wins sound SetWinner(WINNER_ALLIANCE); } else { winmsg = GetMangosString(LANG_BG_H_WINS); PlaySoundToAll(SOUND_HORDE_WINS); // horde wins sound SetWinner(WINNER_HORDE); } SetStatus(STATUS_WAIT_LEAVE); m_EndTime = 0; for(std::map<uint64, BattleGroundPlayer>::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) { Player *plr = objmgr.GetPlayer(itr->first); if(!plr) { sLog.outError("BattleGround: Player " I64FMTD " not found!", itr->first); continue; } if(!plr->isAlive()) { plr->ResurrectPlayer(1.0f); plr->SpawnCorpseBones(); } if(plr->GetTeam() == winner) { if(!Source) Source = plr; RewardMark(plr,ITEM_WINNER_COUNT); UpdatePlayerScore(plr, SCORE_BONUS_HONOR, 20); RewardQuest(plr); } else { RewardMark(plr,ITEM_LOSER_COUNT); } plr->CombatStopWithPets(true); BlockMovement(plr); sBattleGroundMgr.BuildPvpLogDataPacket(&data, this); plr->GetSession()->SendPacket(&data); sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, this, plr->GetTeam(), plr->GetBattleGroundQueueIndex(m_TypeID), STATUS_IN_PROGRESS, TIME_TO_AUTOREMOVE, GetStartTime()); plr->GetSession()->SendPacket(&data); } if(Source) { ChatHandler(Source).FillMessageData(&data, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, Source->GetGUID(), winmsg); SendPacketToAll(&data); } }
void BattleGround::EndBattleGround(uint32 winner) { this->RemoveFromBGFreeSlotQueue(); uint32 almost_winning_team = HORDE; uint32 loser_rating = 0; uint32 winner_rating = 0; WorldPacket data; Player *Source = NULL; const char *winmsg = ""; if(winner == ALLIANCE) { winmsg = GetTrinityString(LANG_BG_A_WINS); PlaySoundToAll(SOUND_ALLIANCE_WINS); // alliance wins sound SetWinner(WINNER_ALLIANCE); } else if(winner == HORDE) { winmsg = GetTrinityString(LANG_BG_H_WINS); PlaySoundToAll(SOUND_HORDE_WINS); // horde wins sound SetWinner(WINNER_HORDE); } else { SetWinner(3); } SetStatus(STATUS_WAIT_LEAVE); m_EndTime = 0; for(std::map<uint64, BattleGroundPlayer>::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) { Player *plr = objmgr.GetPlayer(itr->first); if(!plr) { sLog.outError("BattleGround: Player " I64FMTD " not found!", itr->first); continue; } // should remove spirit of redemption if(plr->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION)) plr->RemoveSpellsCausingAura(SPELL_AURA_MOD_SHAPESHIFT); if(!plr->isAlive()) { plr->ResurrectPlayer(1.0f); plr->SpawnCorpseBones(); } uint32 team = itr->second.Team; if(!team) team = plr->GetTeam(); if(team == winner) { if(!Source) Source = plr; RewardMark(plr,ITEM_WINNER_COUNT); UpdatePlayerScore(plr, SCORE_BONUS_HONOR, 20); RewardQuest(plr); } else if(winner !=0) { RewardMark(plr,ITEM_LOSER_COUNT); } else if(winner == 0) { if(sWorld.getConfig(CONFIG_PREMATURE_BG_REWARD)) // We're feeling generous, giving rewards to people who not earned them ;) { //nested ifs for the win! its boring writing that, forgive me my unfunniness if(almost_winning_team == team) //player's team had more points RewardMark(plr,ITEM_WINNER_COUNT); else RewardMark(plr,ITEM_LOSER_COUNT); // if scores were the same, each team gets 1 mark. } } plr->CombatStopWithPets(true); BlockMovement(plr); sBattleGroundMgr.BuildPvpLogDataPacket(&data, this); plr->GetSession()->SendPacket(&data); uint32 bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(GetTypeID()); sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, this, plr->GetTeam(), plr->GetBattleGroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, TIME_TO_AUTOREMOVE, GetStartTime()); plr->GetSession()->SendPacket(&data); } // inform invited players about the removal sBattleGroundMgr.m_BattleGroundQueues[sBattleGroundMgr.BGQueueTypeId(GetTypeID())].BGEndedRemoveInvites(this); if(Source) { ChatHandler(Source).FillMessageData(&data, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, Source->GetGUID(), winmsg); SendPacketToAll(&data); } }