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:
Tuxity
2012-11-20 10:37:25 +01:00
parent fff684ec78
commit 172c5f0b93
12 changed files with 280 additions and 248 deletions

View File

@@ -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)

View File

@@ -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; }

View File

@@ -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);

View File

@@ -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

View File

@@ -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]);
}

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;
}
//===================================================

View File

@@ -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;

View File

@@ -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());
}

View File

@@ -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 );

View File

@@ -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);