diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Battlegrounds/ArenaTeam.cpp | 14 | ||||
-rwxr-xr-x | src/server/game/Battlegrounds/ArenaTeam.h | 2 | ||||
-rwxr-xr-x | src/server/game/Battlegrounds/Battleground.cpp | 34 | ||||
-rwxr-xr-x | src/server/game/Battlegrounds/Battleground.h | 5 | ||||
-rwxr-xr-x | src/server/game/Battlegrounds/BattlegroundMgr.cpp | 214 | ||||
-rwxr-xr-x | src/server/game/Battlegrounds/BattlegroundMgr.h | 2 | ||||
-rwxr-xr-x | src/server/game/Battlegrounds/BattlegroundQueue.cpp | 5 | ||||
-rwxr-xr-x | src/server/game/Groups/Group.cpp | 2 | ||||
-rwxr-xr-x | src/server/game/Handlers/ArenaTeamHandler.cpp | 54 | ||||
-rwxr-xr-x | src/server/game/Handlers/BattleGroundHandler.cpp | 187 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 6 | ||||
-rwxr-xr-x | src/server/game/Server/WorldSession.h | 1 |
12 files changed, 279 insertions, 247 deletions
diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp index e7644805a76..4cfe069960d 100755 --- a/src/server/game/Battlegrounds/ArenaTeam.cpp +++ b/src/server/game/Battlegrounds/ArenaTeam.cpp @@ -542,6 +542,20 @@ uint8 ArenaTeam::GetSlotByType(uint32 type) return 0xFF; } +uint8 ArenaTeam::GetTypeBySlot(uint8 slot) +{ + switch (slot) + { + case 0: return ARENA_TEAM_2v2; + case 1: return ARENA_TEAM_3v3; + case 2: return ARENA_TEAM_5v5; + default: + break; + } + sLog->outError(LOG_FILTER_ARENAS, "FATAL: Unknown arena team slot %u for some arena team", slot); + return 0xFF; +} + bool ArenaTeam::IsMember(uint64 guid) const { for (MemberList::const_iterator itr = Members.begin(); itr != Members.end(); ++itr) diff --git a/src/server/game/Battlegrounds/ArenaTeam.h b/src/server/game/Battlegrounds/ArenaTeam.h index 5d8345aec53..405b82c6f4d 100755 --- a/src/server/game/Battlegrounds/ArenaTeam.h +++ b/src/server/game/Battlegrounds/ArenaTeam.h @@ -39,6 +39,7 @@ enum ArenaTeamCommandTypes enum ArenaTeamCommandErrors { + ERR_ARENA_TEAM_CREATED = 0x00, ERR_ARENA_TEAM_INTERNAL = 0x01, ERR_ALREADY_IN_ARENA_TEAM = 0x02, ERR_ALREADY_IN_ARENA_TEAM_S = 0x03, @@ -129,6 +130,7 @@ class ArenaTeam uint32 GetType() const { return Type; } uint8 GetSlot() const { return GetSlotByType(GetType()); } static uint8 GetSlotByType(uint32 type); + static uint8 GetTypeBySlot(uint8 slot); uint64 GetCaptain() const { return CaptainGuid; } std::string const& GetName() const { return TeamName; } const ArenaTeamStats& GetStats() const { return Stats; } diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index eb7ce9a64a4..13d434ff0e9 100755 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -146,6 +146,7 @@ Battleground::Battleground() m_IsArena = false; m_Winner = 2; m_StartTime = 0; + m_CountdownTimer = 0; m_ResetStatTimer = 0; m_ValidStartPositionTimer = 0; m_Events = 0; @@ -298,7 +299,11 @@ void Battleground::Update(uint32 diff) // Update start time and reset stats timer m_StartTime += diff; - m_ResetStatTimer += diff; + if (GetStatus() == STATUS_WAIT_JOIN) + { + m_ResetStatTimer += diff; + m_CountdownTimer += diff; + } PostUpdateImpl(diff); } @@ -462,7 +467,6 @@ inline void Battleground::_ProcessJoin(uint32 diff) ModifyStartDelayTime(diff); // I know it's a too big but it's the value sent in packet, I get it from retail sniff. - // I think it's link to the countdown when bgs start SetRemainingTime(300000); if (m_ResetStatTimer > 5000) @@ -473,6 +477,23 @@ inline void Battleground::_ProcessJoin(uint32 diff) player->ResetAllPowers(); } + // Send packet every 10 seconds until the 2nd field reach 0 + if (m_CountdownTimer >= 10000) + { + uint32 countdownMaxForBGType = isArena() ? ARENA_COUNTDOWN_MAX : BATTLEGROUND_COUNTDOWN_MAX; + + WorldPacket data(SMSG_START_TIMER, 4+4+4); + data << uint32(0); // unk + data << uint32(countdownMaxForBGType - (m_CountdownTimer / 1000)); + data << uint32(countdownMaxForBGType); + + for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) + if (Player* player = ObjectAccessor::FindPlayer(itr->first)) + player->GetSession()->SendPacket(&data); + + m_CountdownTimer = 0; + } + if (!(m_Events & BG_STARTING_EVENT_1)) { m_Events |= BG_STARTING_EVENT_1; @@ -530,7 +551,7 @@ inline void Battleground::_ProcessJoin(uint32 diff) WorldPacket status; BattlegroundQueueTypeId bgQueueTypeId = sBattlegroundMgr->BGQueueTypeId(m_TypeID, GetArenaType()); uint32 queueSlot = player->GetBattlegroundQueueIndex(bgQueueTypeId); - sBattlegroundMgr->BuildBattlegroundStatusPacket(&status, this, player, queueSlot, STATUS_IN_PROGRESS, 0, GetElapsedTime(), GetArenaType()); + sBattlegroundMgr->BuildBattlegroundStatusPacket(&status, this, player, queueSlot, STATUS_IN_PROGRESS, player->GetBattlegroundQueueJoinTime(m_TypeID), GetElapsedTime(), GetArenaType()); player->GetSession()->SendPacket(&status); player->RemoveAurasDueToSpell(SPELL_ARENA_PREPARATION); @@ -778,7 +799,7 @@ void Battleground::EndBattleground(uint32 winner) SetStatus(STATUS_WAIT_LEAVE); //we must set it this way, because end time is sent in packet! - m_EndTime = TIME_AUTOCLOSE_BATTLEGROUND; + SetRemainingTime(TIME_AUTOCLOSE_BATTLEGROUND); // arena rating calculation if (isArena() && isRated()) @@ -1179,7 +1200,7 @@ void Battleground::AddPlayer(Player* player) BattlegroundQueueTypeId bgQueueTypeId = sBattlegroundMgr->BGQueueTypeId(m_TypeID, GetArenaType()); uint32 queueSlot = player->GetBattlegroundQueueIndex(bgQueueTypeId); - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player, queueSlot, STATUS_IN_PROGRESS, player->GetBattlegroundQueueJoinTime(m_TypeID), GetElapsedTime(), GetArenaType(), isArena() ? 0 : 1); + sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player, queueSlot, STATUS_IN_PROGRESS, player->GetBattlegroundQueueJoinTime(m_TypeID), GetElapsedTime(), GetArenaType()); player->GetSession()->SendPacket(&data); player->RemoveAurasByType(SPELL_AURA_MOUNTED); @@ -1212,6 +1233,9 @@ void Battleground::AddPlayer(Player* player) player->ResetAllPowers(); } + // Correctly display EnemyUnitFrame + player->SetByteValue(PLAYER_BYTES_3, 3, player->GetBGTeam()); + WorldPacket data(SMSG_ARENA_OPPONENT_UPDATE, 8); data << uint64(player->GetGUID()); SendPacketToTeam(team, &data, player, false); diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index 3feeea53ad8..7c0ca616214 100755 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -113,7 +113,9 @@ enum BattlegroundTimeIntervals MAX_OFFLINE_TIME = 300, // secs RESPAWN_ONE_DAY = 86400, // secs RESPAWN_IMMEDIATELY = 0, // secs - BUFF_RESPAWN_TIME = 180 // secs + BUFF_RESPAWN_TIME = 180, // secs + BATTLEGROUND_COUNTDOWN_MAX = 120, // secs + ARENA_COUNTDOWN_MAX = 60 // secs }; enum BattlegroundStartTimeIntervals @@ -580,6 +582,7 @@ class Battleground BattlegroundStatus m_Status; uint32 m_ClientInstanceID; // the instance-id which is sent to the client and without any other internal use uint32 m_StartTime; + uint32 m_CountdownTimer; uint32 m_ResetStatTimer; uint32 m_ValidStartPositionTimer; int32 m_EndTime; // it is set to 120000 when bg is ending and it decreases itself diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 8ce212472e4..323bc3fa1d2 100755 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -163,7 +163,7 @@ void BattlegroundMgr::Update(uint32 diff) } } -void BattlegroundMgr::BuildBattlegroundStatusPacket(WorldPacket *data, Battleground *bg, Player * player, uint8 QueueSlot, uint8 StatusID, uint32 Time1, uint32 Time2, uint8 arenatype, uint8 /*uiFrame*/) +void BattlegroundMgr::BuildBattlegroundStatusPacket(WorldPacket *data, Battleground *bg, Player * player, uint8 QueueSlot, uint8 StatusID, uint32 Time1, uint32 Time2, uint8 arenatype) { ObjectGuid playerGuid = player->GetGUID(); ObjectGuid bgGuid; @@ -212,7 +212,7 @@ void BattlegroundMgr::BuildBattlegroundStatusPacket(WorldPacket *data, Battlegro data->WriteBit(bgGuid[3]); data->WriteBit(playerGuid[2]); data->WriteBit(1); // Eligible In Queue - data->WriteBit(0); // Join Failed + data->WriteBit(0); // Join Failed, 1 when it's arena ... data->WriteBit(bgGuid[2]); data->WriteBit(playerGuid[1]); data->WriteBit(bgGuid[0]); @@ -231,7 +231,7 @@ void BattlegroundMgr::BuildBattlegroundStatusPacket(WorldPacket *data, Battlegro data->FlushBits(); data->WriteByteSeq(playerGuid[0]); - *data << uint32(1); // unk, always 1 + *data << uint32(bg->isArena() ? arenatype : 1); // Player count, 1 for bgs, 2-3-5 for arena (2v2, 3v3, 5v5) data->WriteByteSeq(bgGuid[5]); data->WriteByteSeq(playerGuid[3]); *data << uint32(Time1); // Estimated Wait Time @@ -241,7 +241,7 @@ void BattlegroundMgr::BuildBattlegroundStatusPacket(WorldPacket *data, Battlegro *data << uint8(0); // unk data->WriteByteSeq(bgGuid[4]); data->WriteByteSeq(playerGuid[2]); - *data << uint8(0); // Player count in rated mode + *data << uint8(0); // unk data->WriteByteSeq(bgGuid[6]); data->WriteByteSeq(playerGuid[7]); data->WriteByteSeq(bgGuid[3]); @@ -267,9 +267,9 @@ void BattlegroundMgr::BuildBattlegroundStatusPacket(WorldPacket *data, Battlegro *data << uint32(QueueSlot); // Queue slot *data << uint32(Time2); // Join Time *data << uint8(bg->GetMinLevel()); // Min Level - *data << uint32(1); // unk, always 1 + *data << uint32(bg->isArena() ? arenatype : 1); // Player count, 1 for bgs, 2-3-5 for arena (2v2, 3v3, 5v5) *data << uint32(bg->GetMapId()); // Map Id - *data << uint8(0); // Player count in rated mode + *data << uint8(0); // unk data->WriteBit(playerGuid[5]); data->WriteBit(playerGuid[2]); @@ -324,7 +324,7 @@ void BattlegroundMgr::BuildBattlegroundStatusPacket(WorldPacket *data, Battlegro data->WriteBit(bgGuid[3]); data->WriteBit(playerGuid[6]); data->WriteBit(bgGuid[5]); - data->WriteBit(0); // unk, Bit 64 + data->WriteBit(bg->isRated()); // Is Rated data->WriteBit(playerGuid[4]); data->WriteBit(bgGuid[6]); data->WriteBit(bgGuid[4]); @@ -344,26 +344,26 @@ void BattlegroundMgr::BuildBattlegroundStatusPacket(WorldPacket *data, Battlegro data->WriteByteSeq(playerGuid[6]); *data << uint32(Time1); // Join Time - *data << uint8(arenatype); // Teamsize (0 if not arena) + *data << uint8(0); // unk data->WriteByteSeq(playerGuid[4]); data->WriteByteSeq(playerGuid[1]); *data << uint32(QueueSlot); // Queue slot - *data << uint8(0); // Player count in rated mode - *data << uint32(1); // unk, always 1 + *data << uint8(0); // unk + *data << uint32(bg->isArena() ? arenatype : 1); // Player count, 1 for bgs, 2-3-5 for arena (2v2, 3v3, 5v5) *data << uint32(bg->GetMapId()); // Map Id *data << uint8(bg->GetMinLevel()); // Min Level *data << uint32(Time2); // Elapsed Time data->WriteByteSeq(playerGuid[2]); - *data << uint32(getMSTimeDiff(bg->GetRemainingTime(), Time2)); // Remaining Time + *data << uint32(bg->GetRemainingTime()); // Remaining Time data->WriteByteSeq(playerGuid[0]); data->WriteByteSeq(playerGuid[3]); data->WriteByteSeq(playerGuid[2]); - *data << uint32(bg->GetClientInstanceID()); // Client Instance ID + *data << uint32(bg->GetClientInstanceID()); // Client Instance ID or faction ? data->WriteByteSeq(bgGuid[0]); data->WriteByteSeq(playerGuid[7]); @@ -376,6 +376,7 @@ void BattlegroundMgr::BuildBattlegroundStatusPacket(WorldPacket *data, Battlegro void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg) { + ByteBuffer buff; uint8 isRated = (bg->isRated() ? 1 : 0); // type (normal=0/rated=1) -- ATM arena or bg, RBG NYI uint8 isArena = (bg->isArena() ? 1 : 0); // Arena names @@ -385,7 +386,7 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg) if (isArena) { - for (int8 i = 1; i >= 0; --i) + for (int8 i = 0; i < BG_TEAMS_COUNT; ++i) { if (ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(bg->GetArenaTeamIdByIndex(i))) data->WriteBits(at->GetName().length(), 8); @@ -394,61 +395,51 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg) } } - size_t count_pos = data->bitwpos(); - - data->WriteBits(0, 21); // Placeholder - - int32 count = 0; - ByteBuffer buff; - - Battleground::BattlegroundScoreMap::const_iterator itr2 = bg->GetPlayerScoresBegin(); - for (Battleground::BattlegroundScoreMap::const_iterator itr = itr2; itr != bg->GetPlayerScoresEnd();) + data->WriteBits(bg->GetPlayerScoresSize(), 21); + for (Battleground::BattlegroundScoreMap::const_iterator itr = bg->GetPlayerScoresBegin(); itr != bg->GetPlayerScoresEnd(); ++itr) { - itr2 = itr++; - if (!bg->IsPlayerInBattleground(itr2->first)) + if (!bg->IsPlayerInBattleground(itr->first)) { sLog->outError(LOG_FILTER_BATTLEGROUND, "Player " UI64FMTD " has scoreboard entry for battleground %u but is not in battleground!", itr->first, bg->GetTypeID(true)); continue; } - ObjectGuid guid = itr2->first; - Player* player = ObjectAccessor::FindPlayer(itr2->first); - data->WriteBit(0); // Unk 1 - data->WriteBit(0); // Unk 2 - data->WriteBit(guid[2]); - data->WriteBit(!isArena); // Unk 3 -- Prolly if (bg) - data->WriteBit(0); // Unk 4 - data->WriteBit(0); // Unk 5 - data->WriteBit(0); // Unk 6 - data->WriteBit(guid[3]); - data->WriteBit(guid[0]); - data->WriteBit(guid[5]); - data->WriteBit(guid[1]); - data->WriteBit(guid[6]); - data->WriteBit(player->GetBGTeam() == ALLIANCE); - data->WriteBit(guid[7]); - - buff << uint32(itr2->second->HealingDone); // healing done - buff << uint32(itr2->second->DamageDone); // damage done - - if (!isArena) // Unk 3 prolly is (bg) + Player* player = ObjectAccessor::FindPlayer(itr->first); + ObjectGuid playerGUID = itr->first; + + data->WriteBit(0); // Unk 1 + data->WriteBit(0); // Unk 2 + data->WriteBit(playerGUID[2]); + data->WriteBit(!isArena); + data->WriteBit(0); // Unk 4 + data->WriteBit(0); // Unk 5 + data->WriteBit(0); // Unk 6 + data->WriteBit(playerGUID[3]); + data->WriteBit(playerGUID[0]); + data->WriteBit(playerGUID[5]); + data->WriteBit(playerGUID[1]); + data->WriteBit(playerGUID[6]); + data->WriteBit(player->GetTeam() == ALLIANCE); + data->WriteBit(playerGUID[7]); + + buff << uint32(itr->second->HealingDone); // healing done + buff << uint32(itr->second->DamageDone); // damage done + + if (!isArena) { - buff << uint32(itr2->second->BonusHonor / 100); - buff << uint32(itr2->second->Deaths); - buff << uint32(itr2->second->HonorableKills); + buff << uint32(itr->second->BonusHonor / 100); + buff << uint32(itr->second->Deaths); + buff << uint32(itr->second->HonorableKills); } - - buff.WriteByteSeq(guid[4]); - buff << uint32(itr2->second->KillingBlows); - + + buff.WriteByteSeq(playerGUID[4]); + buff << uint32(itr->second->KillingBlows); // if (unk 5) << uint32() unk - - buff.WriteByteSeq(guid[5]); - + buff.WriteByteSeq(playerGUID[5]); // if (unk 6) << uint32() unk // if (unk 2) << uint32() unk + buff.WriteByteSeq(playerGUID[1]); + buff.WriteByteSeq(playerGUID[6]); - buff.WriteByteSeq(guid[1]); - buff.WriteByteSeq(guid[6]); buff << int32(player->GetPrimaryTalentTree(player->GetActiveSpec())); @@ -459,45 +450,45 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg) { case 489: data->WriteBits(0x00000002, 24); - buff << uint32(((BattlegroundWGScore*)itr2->second)->FlagCaptures); // flag captures - buff << uint32(((BattlegroundWGScore*)itr2->second)->FlagReturns); // flag returns + buff << uint32(((BattlegroundWGScore*)itr->second)->FlagCaptures); // flag captures + buff << uint32(((BattlegroundWGScore*)itr->second)->FlagReturns); // flag returns break; case 566: data->WriteBits(0x00000001, 24); - buff << uint32(((BattlegroundEYScore*)itr2->second)->FlagCaptures); // flag captures + buff << uint32(((BattlegroundEYScore*)itr->second)->FlagCaptures); // flag captures break; case 529: data->WriteBits(0x00000002, 24); - buff << uint32(((BattlegroundABScore*)itr2->second)->BasesAssaulted); // bases asssulted - buff << uint32(((BattlegroundABScore*)itr2->second)->BasesDefended); // bases defended + buff << uint32(((BattlegroundABScore*)itr->second)->BasesAssaulted); // bases asssulted + buff << uint32(((BattlegroundABScore*)itr->second)->BasesDefended); // bases defended break; case 30: data->WriteBits(0x00000005, 24); - buff << uint32(((BattlegroundAVScore*)itr2->second)->GraveyardsAssaulted); // GraveyardsAssaulted - buff << uint32(((BattlegroundAVScore*)itr2->second)->GraveyardsDefended); // GraveyardsDefended - buff << uint32(((BattlegroundAVScore*)itr2->second)->TowersAssaulted); // TowersAssaulted - buff << uint32(((BattlegroundAVScore*)itr2->second)->TowersDefended); // TowersDefended - buff << uint32(((BattlegroundAVScore*)itr2->second)->MinesCaptured); // MinesCaptured + buff << uint32(((BattlegroundAVScore*)itr->second)->GraveyardsAssaulted); // GraveyardsAssaulted + buff << uint32(((BattlegroundAVScore*)itr->second)->GraveyardsDefended); // GraveyardsDefended + buff << uint32(((BattlegroundAVScore*)itr->second)->TowersAssaulted); // TowersAssaulted + buff << uint32(((BattlegroundAVScore*)itr->second)->TowersDefended); // TowersDefended + buff << uint32(((BattlegroundAVScore*)itr->second)->MinesCaptured); // MinesCaptured break; case 607: data->WriteBits(0x00000002, 24); - buff << uint32(((BattlegroundSAScore*)itr2->second)->demolishers_destroyed); - buff << uint32(((BattlegroundSAScore*)itr2->second)->gates_destroyed); + buff << uint32(((BattlegroundSAScore*)itr->second)->demolishers_destroyed); + buff << uint32(((BattlegroundSAScore*)itr->second)->gates_destroyed); break; case 628: // IC data->WriteBits(0x00000002, 24); - buff << uint32(((BattlegroundICScore*)itr2->second)->BasesAssaulted); // bases asssulted - buff << uint32(((BattlegroundICScore*)itr2->second)->BasesDefended); // bases defended + buff << uint32(((BattlegroundICScore*)itr->second)->BasesAssaulted); // bases asssulted + buff << uint32(((BattlegroundICScore*)itr->second)->BasesDefended); // bases defended break; case 726: data->WriteBits(0x00000002, 24); - buff << uint32(((BattlegroundTPScore*)itr2->second)->FlagCaptures); // flag captures - buff << uint32(((BattlegroundTPScore*)itr2->second)->FlagReturns); // flag returns + buff << uint32(((BattlegroundTPScore*)itr->second)->FlagCaptures); // flag captures + buff << uint32(((BattlegroundTPScore*)itr->second)->FlagReturns); // flag returns break; case 761: data->WriteBits(0x00000002, 24); - buff << uint32(((BattlegroundBFGScore*)itr2->second)->BasesAssaulted); // bases asssulted - buff << uint32(((BattlegroundBFGScore*)itr2->second)->BasesDefended); // bases defended + buff << uint32(((BattlegroundBFGScore*)itr->second)->BasesAssaulted); // bases asssulted + buff << uint32(((BattlegroundBFGScore*)itr->second)->BasesDefended); // bases defended break; default: data->WriteBits(0, 24); @@ -506,45 +497,45 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg) break; case BATTLEGROUND_AV: data->WriteBits(0x00000005, 24); - buff << uint32(((BattlegroundAVScore*)itr2->second)->GraveyardsAssaulted); // GraveyardsAssaulted - buff << uint32(((BattlegroundAVScore*)itr2->second)->GraveyardsDefended); // GraveyardsDefended - buff << uint32(((BattlegroundAVScore*)itr2->second)->TowersAssaulted); // TowersAssaulted - buff << uint32(((BattlegroundAVScore*)itr2->second)->TowersDefended); // TowersDefended - buff << uint32(((BattlegroundAVScore*)itr2->second)->MinesCaptured); // MinesCaptured + buff << uint32(((BattlegroundAVScore*)itr->second)->GraveyardsAssaulted); // GraveyardsAssaulted + buff << uint32(((BattlegroundAVScore*)itr->second)->GraveyardsDefended); // GraveyardsDefended + buff << uint32(((BattlegroundAVScore*)itr->second)->TowersAssaulted); // TowersAssaulted + buff << uint32(((BattlegroundAVScore*)itr->second)->TowersDefended); // TowersDefended + buff << uint32(((BattlegroundAVScore*)itr->second)->MinesCaptured); // MinesCaptured break; case BATTLEGROUND_WS: data->WriteBits(0x00000002, 24); - buff << uint32(((BattlegroundWGScore*)itr2->second)->FlagCaptures); // flag captures - buff << uint32(((BattlegroundWGScore*)itr2->second)->FlagReturns); // flag returns + buff << uint32(((BattlegroundWGScore*)itr->second)->FlagCaptures); // flag captures + buff << uint32(((BattlegroundWGScore*)itr->second)->FlagReturns); // flag returns break; case BATTLEGROUND_AB: data->WriteBits(0x00000002, 24); - buff << uint32(((BattlegroundABScore*)itr2->second)->BasesAssaulted); // bases asssulted - buff << uint32(((BattlegroundABScore*)itr2->second)->BasesDefended); // bases defended + buff << uint32(((BattlegroundABScore*)itr->second)->BasesAssaulted); // bases asssulted + buff << uint32(((BattlegroundABScore*)itr->second)->BasesDefended); // bases defended break; case BATTLEGROUND_EY: data->WriteBits(0x00000001, 24); - buff << uint32(((BattlegroundEYScore*)itr2->second)->FlagCaptures); // flag captures + buff << uint32(((BattlegroundEYScore*)itr->second)->FlagCaptures); // flag captures break; case BATTLEGROUND_SA: data->WriteBits(0x00000002, 24); - buff << uint32(((BattlegroundSAScore*)itr2->second)->demolishers_destroyed); - buff << uint32(((BattlegroundSAScore*)itr2->second)->gates_destroyed); + buff << uint32(((BattlegroundSAScore*)itr->second)->demolishers_destroyed); + buff << uint32(((BattlegroundSAScore*)itr->second)->gates_destroyed); break; case BATTLEGROUND_IC: data->WriteBits(0x00000002, 24); - buff << uint32(((BattlegroundICScore*)itr2->second)->BasesAssaulted); // bases asssulted - buff << uint32(((BattlegroundICScore*)itr2->second)->BasesDefended); // bases defended + buff << uint32(((BattlegroundICScore*)itr->second)->BasesAssaulted); // bases asssulted + buff << uint32(((BattlegroundICScore*)itr->second)->BasesDefended); // bases defended break; case BATTLEGROUND_TP: data->WriteBits(0x00000002, 24); - buff << uint32(((BattlegroundTPScore*)itr2->second)->FlagCaptures); // flag captures - buff << uint32(((BattlegroundTPScore*)itr2->second)->FlagReturns); // flag returns + buff << uint32(((BattlegroundTPScore*)itr->second)->FlagCaptures); // flag captures + buff << uint32(((BattlegroundTPScore*)itr->second)->FlagReturns); // flag returns break; case BATTLEGROUND_BFG: data->WriteBits(0x00000002, 24); - buff << uint32(((BattlegroundBFGScore*)itr2->second)->BasesAssaulted); // bases asssulted - buff << uint32(((BattlegroundBFGScore*)itr2->second)->BasesDefended); // bases defended + buff << uint32(((BattlegroundBFGScore*)itr->second)->BasesAssaulted); // bases asssulted + buff << uint32(((BattlegroundBFGScore*)itr->second)->BasesDefended); // bases defended break; case BATTLEGROUND_NA: case BATTLEGROUND_BE: @@ -558,27 +549,22 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg) data->WriteBits(0, 24); break; } - data->WriteBit(guid[4]); - buff.WriteByteSeq(guid[0]); - buff.WriteByteSeq(guid[3]); + data->WriteBit(playerGUID[4]); + buff.WriteByteSeq(playerGUID[0]); + buff.WriteByteSeq(playerGUID[3]); // if (unk 4) << uint32() unk - - buff.WriteByteSeq(guid[7]); - buff.WriteByteSeq(guid[2]); - - ++count; + buff.WriteByteSeq(playerGUID[7]); + buff.WriteByteSeq(playerGUID[2]); } data->WriteBit(bg->GetStatus() == STATUS_WAIT_LEAVE); // If Ended - data->FlushBits(); - data->PutBits<int32>(count_pos, count, 21); // Number of Players - if (isRated) // arena TODO : Fix Order on Rated Implementation + if (isRated) // arena { // it seems this must be according to BG_WINNER_A/H and _NOT_ BG_TEAM_A/H - for (int8 i = 1; i >= 0; --i) + for (int8 i = 0; i < BG_TEAMS_COUNT; ++i) { int32 rating_change = bg->GetArenaTeamRatingChangeByIndex(i); @@ -586,31 +572,33 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg) uint32 pointsGained = rating_change > 0 ? rating_change : 0; uint32 MatchmakerRating = bg->GetArenaMatchmakerRatingByIndex(i); + *data << uint32(MatchmakerRating); // Matchmaking Value *data << uint32(pointsLost); // Rating Lost *data << uint32(pointsGained); // Rating gained - *data << uint32(MatchmakerRating); // Matchmaking Value + sLog->outDebug(LOG_FILTER_BATTLEGROUND, "rating change: %d", rating_change); } } + data->FlushBits(); data->append(buff); if (isArena) - for (int8 i = 1; i >= 0; --i) + for (int8 i = 0; i < BG_TEAMS_COUNT; ++i) if (ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(bg->GetArenaTeamIdByIndex(i))) data->WriteString(at->GetName()); - *data << uint8(0); // unk + *data << uint8(bg->GetPlayersCountByTeam(HORDE)); if (bg->GetStatus() == STATUS_WAIT_LEAVE) *data << uint8(bg->GetWinner()); // who win - *data << uint8(0); // unk + *data << uint8(bg->GetPlayersCountByTeam(ALLIANCE)); } -void BattlegroundMgr::BuildStatusFailedPacket(WorldPacket* data, Battleground* bg, Player* pPlayer, uint8 QueueSlot, GroupJoinBattlegroundResult result) +void BattlegroundMgr::BuildStatusFailedPacket(WorldPacket* data, Battleground* bg, Player* player, uint8 QueueSlot, GroupJoinBattlegroundResult result) { - ObjectGuid guidBytes1 = pPlayer ? pPlayer->GetGUID() : 0; // player who caused the error + ObjectGuid guidBytes1 = player->GetGUID(); // player who caused the error ObjectGuid guidBytes2 = bg->GetGUID(); ObjectGuid unkGuid3 = 0; @@ -645,7 +633,7 @@ void BattlegroundMgr::BuildStatusFailedPacket(WorldPacket* data, Battleground* b data->WriteByteSeq(guidBytes2[1]); - *data << uint32(bg->GetStatus()); // Status + *data << uint32(1); // Unk, always 1 *data << uint32(QueueSlot); // Queue slot data->WriteByteSeq(guidBytes1[6]); @@ -674,7 +662,7 @@ void BattlegroundMgr::BuildStatusFailedPacket(WorldPacket* data, Battleground* b data->WriteByteSeq(unkGuid3[2]); - *data << uint32(time(NULL)); // Time + *data << uint32(player->GetBattlegroundQueueJoinTime(bg->GetTypeID())); // Join Time data->WriteByteSeq(unkGuid3[5]); } diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.h b/src/server/game/Battlegrounds/BattlegroundMgr.h index b901b3e5b79..da7839ff1b0 100755 --- a/src/server/game/Battlegrounds/BattlegroundMgr.h +++ b/src/server/game/Battlegrounds/BattlegroundMgr.h @@ -80,7 +80,7 @@ class BattlegroundMgr void BuildStatusFailedPacket(WorldPacket* data, Battleground* bg, Player* pPlayer, uint8 QueueSlot, GroupJoinBattlegroundResult result); void BuildUpdateWorldStatePacket(WorldPacket* data, uint32 field, uint32 value); void BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg); - void BuildBattlegroundStatusPacket(WorldPacket* data, Battleground* bg, Player* player, uint8 queueSlot, uint8 statusId, uint32 time1, uint32 time2, uint8 arenaType, uint8 uiFrame = 1); + void BuildBattlegroundStatusPacket(WorldPacket* data, Battleground* bg, Player* player, uint8 queueSlot, uint8 statusId, uint32 time1, uint32 time2, uint8 arenaType); void BuildPlaySoundPacket(WorldPacket* data, uint32 soundId); void SendAreaSpiritHealerQueryOpcode(Player* player, Battleground* bg, uint64 guid); diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp index fec17b2873e..43865b5ec8e 100755 --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp @@ -392,10 +392,11 @@ void BattlegroundQueue::RemovePlayer(uint64 guid, bool decreaseInvitedCount) Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(group->BgTypeId); BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(group->BgTypeId, group->ArenaType); uint32 queueSlot = plr2->GetBattlegroundQueueIndex(bgQueueTypeId); + plr2->RemoveBattlegroundQueueId(bgQueueTypeId); // must be called this way, because if you move this call to // queue->removeplayer, it causes bugs WorldPacket data; - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, plr2, queueSlot, STATUS_NONE, group->JoinTime, 0, 0); + sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, plr2, queueSlot, STATUS_NONE, plr2->GetBattlegroundQueueJoinTime(group->BgTypeId), 0, 0); plr2->GetSession()->SendPacket(&data); } // then actually delete, this may delete the group as well! @@ -666,7 +667,7 @@ bool BattlegroundQueue::CheckNormalMatch(Battleground* bg_template, Battleground return false; } //allow 1v0 if debug bg - if (sBattlegroundMgr->isTesting() && bg_template->isBattleground() && (m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() || m_SelectionPools[TEAM_HORDE].GetPlayerCount())) + if (sBattlegroundMgr->isTesting() && (m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() || m_SelectionPools[TEAM_HORDE].GetPlayerCount())) return true; //return true if there are enough players in selection pools - enable to work .debug bg command correctly return m_SelectionPools[TEAM_ALLIANCE].GetPlayerCount() >= minPlayers && m_SelectionPools[TEAM_HORDE].GetPlayerCount() >= minPlayers; diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 527b7801a72..a98f7cd8424 100755 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -1877,7 +1877,7 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* if (bgOrTemplate->isArena() && memberscount != MinPlayerCount) return ERR_ARENA_TEAM_PARTY_SIZE; - return GroupJoinBattlegroundResult(bgOrTemplate->GetTypeID()); + return ERR_BATTLEGROUND_NONE; } //=================================================== diff --git a/src/server/game/Handlers/ArenaTeamHandler.cpp b/src/server/game/Handlers/ArenaTeamHandler.cpp index 0790acb4ae6..0d1fa986b87 100755 --- a/src/server/game/Handlers/ArenaTeamHandler.cpp +++ b/src/server/game/Handlers/ArenaTeamHandler.cpp @@ -74,6 +74,54 @@ void WorldSession::HandleArenaTeamRosterOpcode(WorldPacket & recvData) arenaTeam->Roster(this); } +void WorldSession::HandleArenaTeamCreateOpcode(WorldPacket & recvData) +{ + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_ARENA_TEAM_CREATE"); + + uint32 slot, icon, iconcolor, border, bordercolor, background; + std::string name; + + recvData >> slot; + recvData >> iconcolor; + recvData >> bordercolor; + recvData >> icon; + recvData >> background; + recvData >> border; + name = recvData.ReadString(recvData.ReadBits(8)); + + uint8 type = ArenaTeam::GetTypeBySlot(slot); + + if (_player->GetArenaTeamId(slot)) + { + SendArenaTeamCommandResult(ERR_ARENA_TEAM_INVITE_SS, "", _player->GetName(), ERR_ALREADY_IN_ARENA_TEAM_S); + return; + } + + if (sObjectMgr->IsReservedName(name) || !ObjectMgr::IsValidCharterName(name)) + { + SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, name, "", ERR_ARENA_TEAM_NAME_INVALID); + return; + } + + if (sArenaTeamMgr->GetArenaTeamByName(name)) + { + SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, name, "", ERR_ARENA_TEAM_NAME_EXISTS_S); + return; + } + + ArenaTeam* arenaTeam = new ArenaTeam; + if (!arenaTeam->Create(GUID_LOPART(_player->GetGUID()), type, name, background, icon, iconcolor, border, bordercolor)) + { + sLog->outError(LOG_FILTER_ARENAS, "Arena team create failed."); + delete arenaTeam; + return; + } + + sArenaTeamMgr->AddArenaTeam(arenaTeam); + + SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, name, "", ERR_ARENA_TEAM_CREATED); +} + void WorldSession::HandleArenaTeamInviteOpcode(WorldPacket & recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_ARENA_TEAM_INVITE"); @@ -112,6 +160,12 @@ void WorldSession::HandleArenaTeamInviteOpcode(WorldPacket & recvData) return; } + if (arenaTeam->GetCaptain() != _player->GetGUID()) + { + SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_PERMISSIONS); + return; + } + // OK result but don't send invite if (player->GetSocial()->HasIgnore(GetPlayer()->GetGUIDLow())) return; diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 7aabd9d4bdf..a4177b9a081 100755 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -444,7 +444,6 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) return; } - BattlegroundTypeId bgTypeId = BattlegroundMgr::BGTemplateId(bgQueueTypeId); BattlegroundQueue& bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId); //we must use temporary variable, because GroupQueueInfo pointer can be deleted in BattlegroundQueue::RemovePlayer() function @@ -463,7 +462,10 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) return; } - Battleground* bg = sBattlegroundMgr->GetBattleground(ginfo.IsInvitedToBGInstanceGUID, bgTypeId); + BattlegroundTypeId bgTypeId = BattlegroundMgr::BGTemplateId(bgQueueTypeId); + // BGTemplateId returns BATTLEGROUND_AA when it is arena queue. + // Do instance id search as there is no AA bg instances. + Battleground* bg = sBattlegroundMgr->GetBattleground(ginfo.IsInvitedToBGInstanceGUID, bgTypeId == BATTLEGROUND_AA ? BATTLEGROUND_TYPE_NONE : bgTypeId); if (!bg) { if (action) @@ -484,6 +486,9 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) sLog->outDebug(LOG_FILTER_BATTLEGROUND, "CMSG_BATTLEFIELD_PORT %s Slot: %u, Unk: %u, Time: %u, Action: %u.", GetPlayerInfo().c_str(), queueSlot, unk, time, action); + // get real bg type + bgTypeId = bg->GetTypeID(); + // expected bracket entry PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(bg->GetMapId(), _player->getLevel()); if (!bracketEntry) @@ -554,9 +559,6 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) } else // leave queue { - if (bg->isArena() && bg->GetStatus() > STATUS_WAIT_QUEUE) - return; - // if player leaves rated arena match before match start, it is counted as he played but he lost if (ginfo.IsRated && ginfo.IsInvitedToBGInstanceGUID) { @@ -568,14 +570,15 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) at->SaveToDB(); } } - _player->RemoveBattlegroundQueueId(bgQueueTypeId); // must be called this way, because if you move this call to queue->removeplayer, it causes bugs sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, _player, queueSlot, STATUS_NONE, _player->GetBattlegroundQueueJoinTime(bgTypeId), 0, 0); + SendPacket(&data); + _player->RemoveBattlegroundQueueId(bgQueueTypeId); // must be called this way, because if you move this call to queue->removeplayer, it causes bugs bgQueue.RemovePlayer(_player->GetGUID(), true); // player left queue, we should update it - do not update Arena Queue if (!ginfo.ArenaType) sBattlegroundMgr->ScheduleQueueUpdate(ginfo.ArenaMatchmakerRating, ginfo.ArenaType, bgQueueTypeId, bgTypeId, bracketEntry->GetBracketId()); - SendPacket(&data); + sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Battleground: player %s (%u) left queue for bgtype %u, queue type %u.", _player->GetName().c_str(), _player->GetGUIDLow(), bg->GetTypeID(), bgQueueTypeId); } } @@ -662,44 +665,18 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket & recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: CMSG_BATTLEMASTER_JOIN_ARENA"); - uint64 guid; // arena Battlemaster guid uint8 arenaslot; // 2v2, 3v3 or 5v5 - uint8 asGroup; // asGroup - uint8 isRated; // isRated - Group* grp = NULL; - recvData >> guid >> arenaslot >> asGroup >> isRated; + recvData >> arenaslot; // ignore if we already in BG or BG queue if (_player->InBattleground()) return; - Creature* unit = GetPlayer()->GetMap()->GetCreature(guid); - if (!unit) - return; - - if (!unit->isBattleMaster()) // it's not battle master - return; - - uint8 arenatype = 0; uint32 arenaRating = 0; uint32 matchmakerRating = 0; - switch (arenaslot) - { - case 0: - arenatype = ARENA_TYPE_2v2; - break; - case 1: - arenatype = ARENA_TYPE_3v3; - break; - case 2: - arenatype = ARENA_TYPE_5v5; - break; - default: - sLog->outError(LOG_FILTER_NETWORKIO, "Unknown arena slot %u at HandleBattlemasterJoinArena()", arenaslot); - return; - } + uint8 arenatype = ArenaTeam::GetTypeBySlot(arenaslot); //check existance Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(BATTLEGROUND_AA); @@ -723,103 +700,71 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket & recvData) GroupJoinBattlegroundResult err = ERR_BATTLEGROUND_NONE; - if (!asGroup) - { - // check if already in queue - if (_player->GetBattlegroundQueueIndex(bgQueueTypeId) < PLAYER_MAX_BATTLEGROUND_QUEUES) - //player is already in this queue - return; - // check if has free queue slots - if (!_player->HasFreeBattlegroundQueueId()) - return; - } - else + Group* grp = _player->GetGroup(); + // no group found, error + if (!grp) + return; + if (grp->GetLeaderGUID() != _player->GetGUID()) + return; + + uint32 ateamId = _player->GetArenaTeamId(arenaslot); + // check real arenateam existence only here (if it was moved to group->CanJoin .. () then we would ahve to get it twice) + ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(ateamId); + if (!at) { - grp = _player->GetGroup(); - // no group found, error - if (!grp) - return; - if (grp->GetLeaderGUID() != _player->GetGUID()) - return; - err = grp->CanJoinBattlegroundQueue(bg, bgQueueTypeId, arenatype, arenatype, (bool)isRated, arenaslot); + _player->GetSession()->SendNotInArenaTeamPacket(arenatype); + return; } - uint32 ateamId = 0; - - if (isRated) + // get the team rating for queueing + arenaRating = at->GetRating(); + matchmakerRating = at->GetAverageMMR(grp); + // the arenateam id must match for everyone in the group + + if (arenaRating <= 0) + arenaRating = 1; + + BattlegroundQueue &bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId); + + uint32 avgTime = 0; + GroupQueueInfo* ginfo; + + err = grp->CanJoinBattlegroundQueue(bg, bgQueueTypeId, arenatype, arenatype, true, arenaslot); + if (!err) { - ateamId = _player->GetArenaTeamId(arenaslot); - // check real arenateam existence only here (if it was moved to group->CanJoin .. () then we would ahve to get it twice) - ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(ateamId); - if (!at) - { - _player->GetSession()->SendNotInArenaTeamPacket(arenatype); - return; - } - // get the team rating for queueing - arenaRating = at->GetRating(); - matchmakerRating = at->GetAverageMMR(grp); - // the arenateam id must match for everyone in the group - - if (arenaRating <= 0) - arenaRating = 1; + sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Battleground: arena team id %u, leader %s queued with matchmaker rating %u for type %u", _player->GetArenaTeamId(arenaslot), _player->GetName().c_str(), matchmakerRating, arenatype); + + ginfo = bgQueue.AddGroup(_player, grp, bgTypeId, bracketEntry, arenatype, true, false, arenaRating, matchmakerRating, ateamId); + avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId()); } - - BattlegroundQueue &bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId); - if (asGroup) + + for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next()) { - uint32 avgTime = 0; - GroupQueueInfo* ginfo; - - if (!err) - { - sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Battleground: arena join as group start"); - if (isRated) - { - sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Battleground: arena team id %u, leader %s queued with matchmaker rating %u for type %u", _player->GetArenaTeamId(arenaslot), _player->GetName().c_str(), matchmakerRating, arenatype); - bg->SetRated(true); - } - else - bg->SetRated(false); - - ginfo = bgQueue.AddGroup(_player, grp, bgTypeId, bracketEntry, arenatype, isRated, false, arenaRating, matchmakerRating, ateamId); - avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId()); - } - - for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next()) + Player* member = itr->getSource(); + if (!member) + continue; + + if (err) { - Player* member = itr->getSource(); - if (!member) - continue; - - if (err) - { - WorldPacket data; - sBattlegroundMgr->BuildStatusFailedPacket(&data, bg, _player, 0, err); - member->GetSession()->SendPacket(&data); - continue; - } - - // add to queue - uint32 queueSlot = member->AddBattlegroundQueueId(bgQueueTypeId); - - WorldPacket data; // send status packet (in queue) - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, member, queueSlot, STATUS_WAIT_QUEUE, avgTime, ginfo->JoinTime, arenatype); + WorldPacket data; + sBattlegroundMgr->BuildStatusFailedPacket(&data, bg, _player, 0, err); member->GetSession()->SendPacket(&data); - sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Battleground: player joined queue for arena as group bg queue type %u bg type %u: GUID %u, NAME %s", bgQueueTypeId, bgTypeId, member->GetGUIDLow(), member->GetName().c_str()); + continue; } - } - else - { - GroupQueueInfo* ginfo = bgQueue.AddGroup(_player, NULL, bgTypeId, bracketEntry, arenatype, isRated, false, arenaRating, matchmakerRating, ateamId); - uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId()); - uint32 queueSlot = _player->AddBattlegroundQueueId(bgQueueTypeId); - + + // add to queue + uint32 queueSlot = member->AddBattlegroundQueueId(bgQueueTypeId); + + // add joined time data + member->AddBattlegroundQueueJoinTime(bgTypeId, ginfo->JoinTime); + WorldPacket data; // send status packet (in queue) - sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, GetPlayer(), queueSlot, STATUS_WAIT_QUEUE, avgTime, ginfo->JoinTime, arenatype); - SendPacket(&data); - sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Battleground: player joined queue for arena, skirmish, bg queue type %u bg type %u: GUID %u, NAME %s", bgQueueTypeId, bgTypeId, _player->GetGUIDLow(), _player->GetName().c_str()); + sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, bg, member, queueSlot, STATUS_WAIT_QUEUE, avgTime, ginfo->JoinTime, arenatype); + member->GetSession()->SendPacket(&data); + + sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Battleground: player joined queue for arena as group bg queue type %u bg type %u: GUID %u, NAME %s", bgQueueTypeId, bgTypeId, member->GetGUIDLow(), member->GetName().c_str()); } + sBattlegroundMgr->ScheduleQueueUpdate(matchmakerRating, arenatype, bgQueueTypeId, bgTypeId, bracketEntry->GetBracketId()); } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 93efc8d2132..0ecb6529ea8 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -70,7 +70,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAreaSpiritHealerQueryOpcode); DEFINE_OPCODE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUEUE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAreaSpiritHealerQueueOpcode); DEFINE_OPCODE_HANDLER(CMSG_ARENA_TEAM_ACCEPT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleArenaTeamAcceptOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_ARENA_TEAM_CREATE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + DEFINE_OPCODE_HANDLER(CMSG_ARENA_TEAM_CREATE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleArenaTeamCreateOpcode ); DEFINE_OPCODE_HANDLER(CMSG_ARENA_TEAM_DECLINE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleArenaTeamDeclineOpcode ); DEFINE_OPCODE_HANDLER(CMSG_ARENA_TEAM_DISBAND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleArenaTeamDisbandOpcode ); DEFINE_OPCODE_HANDLER(CMSG_ARENA_TEAM_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleArenaTeamInviteOpcode ); @@ -107,7 +107,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(CMSG_BATTLEFIELD_STATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlefieldStatusOpcode ); DEFINE_OPCODE_HANDLER(CMSG_BATTLEGROUND_PLAYER_POSITIONS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBattlegroundPlayerPositionsOpcode); DEFINE_OPCODE_HANDLER(CMSG_BATTLEMASTER_JOIN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlemasterJoinOpcode ); - DEFINE_OPCODE_HANDLER(CMSG_BATTLEMASTER_JOIN_ARENA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlemasterJoinArena ); + DEFINE_OPCODE_HANDLER(CMSG_BATTLEMASTER_JOIN_ARENA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlemasterJoinArena ); DEFINE_OPCODE_HANDLER(CMSG_BATTLEMASTER_JOIN_RATED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER(CMSG_BEGIN_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBeginTradeOpcode ); DEFINE_OPCODE_HANDLER(CMSG_BINDER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBinderActivateOpcode ); @@ -1218,7 +1218,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER(SMSG_STABLE_RESULT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_STANDSTATE_UPDATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_START_MIRROR_TIMER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - DEFINE_OPCODE_HANDLER(SMSG_START_TIMER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_START_TIMER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_STOP_DANCE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_STOP_MIRROR_TIMER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_STREAMING_MOVIE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 0c4220e9ea6..68490e3b4dc 100755 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -865,6 +865,7 @@ class WorldSession void HandleInspectArenaTeamsOpcode(WorldPacket& recvData); void HandleArenaTeamQueryOpcode(WorldPacket& recvData); void HandleArenaTeamRosterOpcode(WorldPacket& recvData); + void HandleArenaTeamCreateOpcode(WorldPacket& recvData); void HandleArenaTeamInviteOpcode(WorldPacket& recvData); void HandleArenaTeamAcceptOpcode(WorldPacket& recvData); void HandleArenaTeamDeclineOpcode(WorldPacket& recvData); |