mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
Core/Arenas: Fix arena system, you can now enter in arenas and fight !
Countdown in preparation time are also displayed EnnemyUnitFrame while fighting works too N.B: There might be some little typos to fix.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
//===================================================
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
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)
|
||||
{
|
||||
// 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
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
uint32 ateamId = 0;
|
||||
|
||||
if (isRated)
|
||||
{
|
||||
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;
|
||||
_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;
|
||||
|
||||
BattlegroundQueue &bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId);
|
||||
if (asGroup)
|
||||
|
||||
uint32 avgTime = 0;
|
||||
GroupQueueInfo* ginfo;
|
||||
|
||||
err = grp->CanJoinBattlegroundQueue(bg, bgQueueTypeId, arenatype, arenatype, true, arenaslot);
|
||||
if (!err)
|
||||
{
|
||||
uint32 avgTime = 0;
|
||||
GroupQueueInfo* ginfo;
|
||||
|
||||
if (!err)
|
||||
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());
|
||||
}
|
||||
|
||||
for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
|
||||
{
|
||||
Player* member = itr->getSource();
|
||||
if (!member)
|
||||
continue;
|
||||
|
||||
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)
|
||||
{
|
||||
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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user