aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game')
-rwxr-xr-xsrc/server/game/Battlegrounds/ArenaTeam.cpp14
-rwxr-xr-xsrc/server/game/Battlegrounds/ArenaTeam.h2
-rwxr-xr-xsrc/server/game/Battlegrounds/Battleground.cpp34
-rwxr-xr-xsrc/server/game/Battlegrounds/Battleground.h5
-rwxr-xr-xsrc/server/game/Battlegrounds/BattlegroundMgr.cpp214
-rwxr-xr-xsrc/server/game/Battlegrounds/BattlegroundMgr.h2
-rwxr-xr-xsrc/server/game/Battlegrounds/BattlegroundQueue.cpp5
-rwxr-xr-xsrc/server/game/Groups/Group.cpp2
-rwxr-xr-xsrc/server/game/Handlers/ArenaTeamHandler.cpp54
-rwxr-xr-xsrc/server/game/Handlers/BattleGroundHandler.cpp187
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp6
-rwxr-xr-xsrc/server/game/Server/WorldSession.h1
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);