mirror of
https://github.com/mangosfour/server.git
synced 2025-12-17 16:37:00 +00:00
Rebase resync
This commit is contained in:
parent
a0797532e8
commit
1997c1e903
3106 changed files with 11118 additions and 627576 deletions
|
|
@ -1,4 +1,4 @@
|
|||
/*
|
||||
/**
|
||||
* This code is part of MaNGOS. Contributor & Copyright details are in AUTHORS/THANKS.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
|
@ -40,7 +40,7 @@ void WorldSession::HandleBattlemasterHelloOpcode(WorldPacket& recv_data)
|
|||
ObjectGuid guid;
|
||||
recv_data >> guid;
|
||||
|
||||
DEBUG_LOG("WORLD: Recvd CMSG_BATTLEMASTER_HELLO Message from %s", guid.GetString().c_str());
|
||||
DEBUG_LOG("WORLD: Received opcode CMSG_BATTLEMASTER_HELLO from %s", guid.GetString().c_str());
|
||||
|
||||
Creature* pCreature = GetPlayer()->GetMap()->GetCreature(guid);
|
||||
|
||||
|
|
@ -92,7 +92,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recv_data)
|
|||
recv_data.ReadGuidBytes<2, 6, 4, 3, 7, 0, 5, 1>(guid);
|
||||
|
||||
bgTypeId_ = guid.GetCounter();
|
||||
DEBUG_LOG("WORLD: Recvd CMSG_BATTLEMASTER_JOIN Message from %s, typeid: %u, asGroup: %u, bg guid: %u",
|
||||
DEBUG_LOG("WORLD: Received opcode CMSG_BATTLEMASTER_JOIN from %s, typeid: %u, asGroup: %u, bg guid: %s",
|
||||
_player->GetGuidStr().c_str(), bgTypeId_, joinAsGroup, guid.GetString().c_str());
|
||||
|
||||
if (!sBattlemasterListStore.LookupEntry(bgTypeId_))
|
||||
|
|
@ -126,7 +126,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recv_data)
|
|||
if (!bracketEntry)
|
||||
return;
|
||||
|
||||
GroupJoinBattlegroundResult err;
|
||||
GroupJoinBattlegroundResult err = ERR_BATTLEGROUND_NONE;
|
||||
|
||||
// check queue conditions
|
||||
if (!joinAsGroup)
|
||||
|
|
@ -135,7 +135,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recv_data)
|
|||
if (!_player->CanJoinToBattleground())
|
||||
{
|
||||
WorldPacket data;
|
||||
sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&data, ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS);
|
||||
sBattleGroundMgr.BuildBattleGroundStatusFailedPacket(&data, bg, _player, 0, ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS);
|
||||
_player->GetSession()->SendPacket(&data);
|
||||
return;
|
||||
}
|
||||
|
|
@ -163,17 +163,20 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recv_data)
|
|||
|
||||
// _player->GetGroup() was already checked, grp is already initialized
|
||||
BattleGroundQueue& bgQueue = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId];
|
||||
if (joinAsGroup)
|
||||
if (err)
|
||||
{
|
||||
WorldPacket data;
|
||||
sBattleGroundMgr.BuildBattleGroundStatusFailedPacket(&data, bg, _player, 0, err);
|
||||
SendPacket(&data);
|
||||
}
|
||||
else if (joinAsGroup)
|
||||
{
|
||||
GroupQueueInfo* ginfo = NULL;
|
||||
uint32 avgTime = 0;
|
||||
|
||||
if (err > 0)
|
||||
{
|
||||
DEBUG_LOG("Battleground: the following players are joining as group:");
|
||||
ginfo = bgQueue.AddGroup(_player, grp, bgTypeId, bracketEntry, ARENA_TYPE_NONE, false, isPremade, 0);
|
||||
avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId());
|
||||
}
|
||||
DEBUG_LOG("Battleground: the following players are joining as group:");
|
||||
ginfo = bgQueue.AddGroup(_player, grp, bgTypeId, bracketEntry, ARENA_TYPE_NONE, false, isPremade, 0);
|
||||
avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId());
|
||||
|
||||
for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
|
||||
{
|
||||
|
|
@ -181,22 +184,12 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recv_data)
|
|||
if (!member)
|
||||
continue; // this should never happen
|
||||
|
||||
WorldPacket data;
|
||||
|
||||
if (err <= 0)
|
||||
{
|
||||
sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&data, err);
|
||||
member->GetSession()->SendPacket(&data);
|
||||
continue;
|
||||
}
|
||||
|
||||
// add to queue
|
||||
uint32 queueSlot = member->AddBattleGroundQueueId(bgQueueTypeId);
|
||||
|
||||
// send status packet (in queue)
|
||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, ginfo->arenaType);
|
||||
member->GetSession()->SendPacket(&data);
|
||||
sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&data, err);
|
||||
WorldPacket data;
|
||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, member, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, ginfo->arenaType);
|
||||
member->GetSession()->SendPacket(&data);
|
||||
DEBUG_LOG("Battleground: player joined queue for bg queue type %u bg type %u: GUID %u, NAME %s", bgQueueTypeId, bgTypeId, member->GetGUIDLow(), member->GetName());
|
||||
}
|
||||
|
|
@ -211,7 +204,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recv_data)
|
|||
|
||||
WorldPacket data;
|
||||
// send status packet (in queue)
|
||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, ginfo->arenaType);
|
||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, _player, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, ginfo->arenaType);
|
||||
SendPacket(&data);
|
||||
DEBUG_LOG("Battleground: player joined queue for bg queue type %u bg type %u: GUID %u, NAME %s", bgQueueTypeId, bgTypeId, _player->GetGUIDLow(), _player->GetName());
|
||||
}
|
||||
|
|
@ -221,87 +214,72 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recv_data)
|
|||
void WorldSession::HandleBattleGroundPlayerPositionsOpcode(WorldPacket& /*recv_data*/)
|
||||
{
|
||||
// empty opcode
|
||||
DEBUG_LOG("WORLD: Recvd MSG_BATTLEGROUND_PLAYER_POSITIONS Message");
|
||||
DEBUG_LOG("WORLD: Received opcode CMSG_BATTLEGROUND_PLAYER_POSITIONS");
|
||||
|
||||
BattleGround* bg = _player->GetBattleGround();
|
||||
if (!bg) // can't be received if player not in battleground
|
||||
return;
|
||||
|
||||
Player* flagCarrierA = NULL;
|
||||
Player* flagCarrierH = NULL;
|
||||
uint32 flagCarrierCountA = 0; // obsolete
|
||||
uint32 flagCarrierCountH = 0;
|
||||
|
||||
switch (bg->GetTypeID())
|
||||
{
|
||||
case BATTLEGROUND_WS:
|
||||
{
|
||||
uint32 flagCarrierCount = 0;
|
||||
if (flagCarrierA = sObjectMgr.GetPlayer(((BattleGroundWS*)bg)->GetAllianceFlagCarrierGuid()))
|
||||
++flagCarrierCountH;
|
||||
|
||||
Player* flagCarrierAlliance = sObjectMgr.GetPlayer(((BattleGroundWS*)bg)->GetAllianceFlagCarrierGuid());
|
||||
if (flagCarrierAlliance)
|
||||
++flagCarrierCount;
|
||||
|
||||
Player* flagCarrierHorde = sObjectMgr.GetPlayer(((BattleGroundWS*)bg)->GetHordeFlagCarrierGuid());
|
||||
if (flagCarrierHorde)
|
||||
++flagCarrierCount;
|
||||
|
||||
WorldPacket data(MSG_BATTLEGROUND_PLAYER_POSITIONS, 4 + 4 + 16 * flagCarrierCount);
|
||||
data << uint32(0);
|
||||
data << uint32(flagCarrierCount);
|
||||
|
||||
if (flagCarrierAlliance)
|
||||
{
|
||||
data << flagCarrierAlliance->GetObjectGuid();
|
||||
data << float(flagCarrierAlliance->GetPositionX());
|
||||
data << float(flagCarrierAlliance->GetPositionY());
|
||||
}
|
||||
if (flagCarrierHorde)
|
||||
{
|
||||
data << flagCarrierHorde->GetObjectGuid();
|
||||
data << float(flagCarrierHorde->GetPositionX());
|
||||
data << float(flagCarrierHorde->GetPositionY());
|
||||
}
|
||||
|
||||
SendPacket(&data);
|
||||
if (flagCarrierH = sObjectMgr.GetPlayer(((BattleGroundWS*)bg)->GetHordeFlagCarrierGuid()))
|
||||
++flagCarrierCountH;
|
||||
break;
|
||||
}
|
||||
case BATTLEGROUND_EY:
|
||||
{
|
||||
uint32 flagCarrierCount = 0;
|
||||
|
||||
Player* flagCarrier = sObjectMgr.GetPlayer(((BattleGroundEY*)bg)->GetFlagCarrierGuid());
|
||||
if (flagCarrier)
|
||||
flagCarrierCount = 1;
|
||||
|
||||
WorldPacket data(MSG_BATTLEGROUND_PLAYER_POSITIONS, 4 + 4 + 16 * flagCarrierCount);
|
||||
data << uint32(0);
|
||||
data << uint32(flagCarrierCount);
|
||||
|
||||
if (flagCarrier)
|
||||
{
|
||||
data << flagCarrier->GetObjectGuid();
|
||||
data << float(flagCarrier->GetPositionX());
|
||||
data << float(flagCarrier->GetPositionY());
|
||||
}
|
||||
|
||||
SendPacket(&data);
|
||||
if (flagCarrierH = sObjectMgr.GetPlayer(((BattleGroundEY*)bg)->GetFlagCarrierGuid()))
|
||||
++flagCarrierCountH;
|
||||
break;
|
||||
}
|
||||
case BATTLEGROUND_AB:
|
||||
case BATTLEGROUND_AV:
|
||||
{
|
||||
// for other BG types - send default
|
||||
WorldPacket data(MSG_BATTLEGROUND_PLAYER_POSITIONS, 4 + 4);
|
||||
data << uint32(0);
|
||||
data << uint32(0);
|
||||
SendPacket(&data);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
// maybe it is sent also in arena - do nothing
|
||||
break;
|
||||
}
|
||||
|
||||
WorldPacket data(SMSG_BATTLEGROUND_PLAYER_POSITIONS, (3 + 1) * 2 + (8 + 4 + 4) * 2);
|
||||
data.WriteBits(flagCarrierCountA, 22);
|
||||
data.WriteBits(flagCarrierCountH, 22);
|
||||
if (flagCarrierA)
|
||||
data.WriteGuidMask<6, 5, 4, 7, 2, 1, 0, 3>(flagCarrierA->GetObjectGuid());
|
||||
if (flagCarrierH)
|
||||
data.WriteGuidMask<6, 5, 4, 7, 2, 1, 0, 3>(flagCarrierH->GetObjectGuid());
|
||||
|
||||
if (flagCarrierA)
|
||||
{
|
||||
data.WriteGuidBytes<2, 1>(flagCarrierA->GetObjectGuid());
|
||||
data << float(flagCarrierA->GetPositionY());
|
||||
data.WriteGuidBytes<5, 4, 7, 0, 6, 3>(flagCarrierA->GetObjectGuid());
|
||||
data << float(flagCarrierA->GetPositionX());
|
||||
}
|
||||
if (flagCarrierH)
|
||||
{
|
||||
data.WriteGuidBytes<2, 1>(flagCarrierH->GetObjectGuid());
|
||||
data << float(flagCarrierH->GetPositionY());
|
||||
data.WriteGuidBytes<5, 4, 7, 0, 6, 3>(flagCarrierH->GetObjectGuid());
|
||||
data << float(flagCarrierH->GetPositionX());
|
||||
}
|
||||
|
||||
SendPacket(&data);
|
||||
}
|
||||
|
||||
void WorldSession::HandlePVPLogDataOpcode(WorldPacket& /*recv_data*/)
|
||||
{
|
||||
DEBUG_LOG("WORLD: Recvd MSG_PVP_LOG_DATA Message");
|
||||
DEBUG_LOG("WORLD: Received opcode CMSG_PVP_LOG_DATA");
|
||||
|
||||
BattleGround* bg = _player->GetBattleGround();
|
||||
if (!bg)
|
||||
|
|
@ -315,12 +293,12 @@ void WorldSession::HandlePVPLogDataOpcode(WorldPacket& /*recv_data*/)
|
|||
sBattleGroundMgr.BuildPvpLogDataPacket(&data, bg);
|
||||
SendPacket(&data);
|
||||
|
||||
DEBUG_LOG("WORLD: Sent MSG_PVP_LOG_DATA Message");
|
||||
DEBUG_LOG("WORLD: Sent SMSG_PVP_LOG_DATA Message");
|
||||
}
|
||||
|
||||
void WorldSession::HandleBattlefieldListOpcode(WorldPacket& recv_data)
|
||||
{
|
||||
DEBUG_LOG("WORLD: Recvd CMSG_BATTLEFIELD_LIST Message");
|
||||
DEBUG_LOG("WORLD: Received opcode CMSG_BATTLEFIELD_LIST");
|
||||
|
||||
uint32 bgTypeId;
|
||||
recv_data >> bgTypeId; // id from DBC
|
||||
|
|
@ -339,27 +317,28 @@ void WorldSession::HandleBattlefieldListOpcode(WorldPacket& recv_data)
|
|||
|
||||
void WorldSession::HandleBattleFieldPortOpcode(WorldPacket& recv_data)
|
||||
{
|
||||
DEBUG_LOG("WORLD: Recvd CMSG_BATTLEFIELD_PORT Message");
|
||||
DEBUG_LOG("WORLD: Received opcode CMSG_BATTLEFIELD_PORT");
|
||||
|
||||
uint8 type; // arenatype if arena
|
||||
uint8 unk2; // unk, can be 0x0 (may be if was invited?) and 0x1
|
||||
uint32 bgTypeId_; // type id from dbc
|
||||
uint16 unk; // 0x1F90 constant?
|
||||
uint32 time;
|
||||
uint32 queueSlot;
|
||||
uint32 unk; // unk
|
||||
uint8 action; // enter battle 0x1, leave queue 0x0
|
||||
ObjectGuid guid; // player guid
|
||||
|
||||
recv_data >> type >> unk2 >> bgTypeId_ >> unk >> action;
|
||||
recv_data >> time >> queueSlot >> unk;
|
||||
|
||||
if (!sBattlemasterListStore.LookupEntry(bgTypeId_))
|
||||
{
|
||||
sLog.outError("BattlegroundHandler: invalid bgtype (%u) received.", bgTypeId_);
|
||||
return;
|
||||
}
|
||||
recv_data.ReadGuidMask<0, 1, 5, 6, 7, 4, 3, 2>(guid);
|
||||
action = recv_data.ReadBit() ? 1 : 0;
|
||||
recv_data.ReadGuidBytes<1, 3, 5, 7, 0, 2, 6, 4>(guid);
|
||||
|
||||
if (type && !IsArenaTypeValid(ArenaType(type)))
|
||||
{
|
||||
sLog.outError("BattlegroundHandler: Invalid CMSG_BATTLEFIELD_PORT received from player (%u), arena type wrong: %u.", _player->GetGUIDLow(), type);
|
||||
return;
|
||||
}
|
||||
DEBUG_LOG("WORLD: Recvd CMSG_BATTLEFIELD_PORT Message, time %u queueSlot %u unk %u action %u guid %s",
|
||||
time, queueSlot, unk, action, guid.GetString().c_str());
|
||||
|
||||
//if (type && !IsArenaTypeValid(ArenaType(type)))
|
||||
//{
|
||||
// sLog.outError("BattlegroundHandler: Invalid CMSG_BATTLEFIELD_PORT received from player (%u), arena type wrong: %u.", _player->GetGUIDLow(), type);
|
||||
// return;
|
||||
//}
|
||||
|
||||
if (!_player->InBattleGroundQueue())
|
||||
{
|
||||
|
|
@ -367,9 +346,14 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket& recv_data)
|
|||
return;
|
||||
}
|
||||
|
||||
BattleGroundQueueTypeId bgQueueTypeId = _player->GetBattleGroundQueueTypeId(queueSlot);
|
||||
if (bgQueueTypeId == BATTLEGROUND_QUEUE_NONE)
|
||||
{
|
||||
sLog.outError("BattlegroundHandler: invalid queueSlot (%u) received.", queueSlot);
|
||||
return;
|
||||
}
|
||||
|
||||
// get GroupQueueInfo from BattleGroundQueue
|
||||
BattleGroundTypeId bgTypeId = BattleGroundTypeId(bgTypeId_);
|
||||
BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(bgTypeId, ArenaType(type));
|
||||
BattleGroundQueue& bgQueue = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId];
|
||||
// we must use temporary variable, because GroupQueueInfo pointer can be deleted in BattleGroundQueue::RemovePlayer() function
|
||||
GroupQueueInfo ginfo;
|
||||
|
|
@ -385,17 +369,22 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket& recv_data)
|
|||
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);
|
||||
|
||||
// bg template might and must be used in case of leaving queue, when instance is not created yet
|
||||
if (!bg && action == 0)
|
||||
bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId);
|
||||
if (!bg)
|
||||
{
|
||||
sLog.outError("BattlegroundHandler: bg_template not found for type id %u.", bgTypeId);
|
||||
sLog.outError("BattlegroundHandler: bg_template not found for instance id %u type id %u.", ginfo.IsInvitedToBGInstanceGUID, bgTypeId);
|
||||
return;
|
||||
}
|
||||
|
||||
// get real bg type
|
||||
bgTypeId = bg->GetTypeID();
|
||||
// expected bracket entry
|
||||
PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(bg->GetMapId(), _player->getLevel());
|
||||
if (!bracketEntry)
|
||||
|
|
@ -409,7 +398,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket& recv_data)
|
|||
{
|
||||
// send bg command result to show nice message
|
||||
WorldPacket data2;
|
||||
sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&data2, ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS);
|
||||
sBattleGroundMgr.BuildBattleGroundStatusFailedPacket(&data2, bg, _player, queueSlot, ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS);
|
||||
_player->GetSession()->SendPacket(&data2);
|
||||
action = 0;
|
||||
DEBUG_LOG("Battleground: player %s (%u) has a deserter debuff, do not port him to battleground!", _player->GetName(), _player->GetGUIDLow());
|
||||
|
|
@ -422,7 +411,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket& recv_data)
|
|||
action = 0;
|
||||
}
|
||||
}
|
||||
uint32 queueSlot = _player->GetBattleGroundQueueIndex(bgQueueTypeId);
|
||||
|
||||
WorldPacket data;
|
||||
switch (action)
|
||||
{
|
||||
|
|
@ -446,7 +435,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket& recv_data)
|
|||
_player->m_taxi.ClearTaxiDestinations();
|
||||
}
|
||||
|
||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_IN_PROGRESS, 0, bg->GetStartTime(), bg->GetArenaType());
|
||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, _player, queueSlot, STATUS_IN_PROGRESS, bg->GetEndTime(), bg->GetStartTime(), bg->GetArenaType());
|
||||
_player->GetSession()->SendPacket(&data);
|
||||
// remove battleground queue status from BGmgr
|
||||
bgQueue.RemovePlayer(_player->GetObjectGuid(), false);
|
||||
|
|
@ -478,7 +467,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket& recv_data)
|
|||
}
|
||||
}
|
||||
_player->RemoveBattleGroundQueueId(bgQueueTypeId); // must be called this way, because if you move this call to queue->removeplayer, it causes bugs
|
||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_NONE, 0, 0, ARENA_TYPE_NONE);
|
||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, _player, queueSlot, STATUS_NONE, 0, 0, ARENA_TYPE_NONE);
|
||||
bgQueue.RemovePlayer(_player->GetObjectGuid(), true);
|
||||
// player left queue, we should update it - do not update Arena Queue
|
||||
if (ginfo.arenaType == ARENA_TYPE_NONE)
|
||||
|
|
@ -494,15 +483,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket& recv_data)
|
|||
|
||||
void WorldSession::HandleLeaveBattlefieldOpcode(WorldPacket& recv_data)
|
||||
{
|
||||
DEBUG_LOG("WORLD: Recvd CMSG_LEAVE_BATTLEFIELD Message");
|
||||
|
||||
recv_data.read_skip<uint8>(); // unk1
|
||||
recv_data.read_skip<uint8>(); // unk2
|
||||
recv_data.read_skip<uint32>(); // BattleGroundTypeId
|
||||
recv_data.read_skip<uint16>(); // unk3
|
||||
|
||||
// if(bgTypeId >= MAX_BATTLEGROUND_TYPES) // cheating? but not important in this case
|
||||
// return;
|
||||
DEBUG_LOG("WORLD: Received opcode CMSG_LEAVE_BATTLEFIELD");
|
||||
|
||||
// not allow leave battleground in combat
|
||||
if (_player->isInCombat())
|
||||
|
|
@ -516,7 +497,7 @@ void WorldSession::HandleLeaveBattlefieldOpcode(WorldPacket& recv_data)
|
|||
void WorldSession::HandleBattlefieldStatusOpcode(WorldPacket& /*recv_data*/)
|
||||
{
|
||||
// empty opcode
|
||||
DEBUG_LOG("WORLD: Battleground status");
|
||||
DEBUG_LOG("WORLD: CMSG_BATTLEFIELD_STATUS");
|
||||
|
||||
WorldPacket data;
|
||||
// we must update all queues here
|
||||
|
|
@ -538,7 +519,7 @@ void WorldSession::HandleBattlefieldStatusOpcode(WorldPacket& /*recv_data*/)
|
|||
{
|
||||
// this line is checked, i only don't know if GetStartTime is changing itself after bg end!
|
||||
// send status in BattleGround
|
||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, i, STATUS_IN_PROGRESS, bg->GetEndTime(), bg->GetStartTime(), arenaType);
|
||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, _player, i, STATUS_IN_PROGRESS, bg->GetEndTime(), 0, arenaType);
|
||||
SendPacket(&data);
|
||||
continue;
|
||||
}
|
||||
|
|
@ -556,7 +537,7 @@ void WorldSession::HandleBattlefieldStatusOpcode(WorldPacket& /*recv_data*/)
|
|||
continue;
|
||||
uint32 remainingTime = WorldTimer::getMSTimeDiff(WorldTimer::getMSTime(), ginfo.RemoveInviteTime);
|
||||
// send status invited to BattleGround
|
||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, i, STATUS_WAIT_JOIN, remainingTime, 0, arenaType);
|
||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, _player, i, STATUS_WAIT_JOIN, remainingTime, 0, arenaType);
|
||||
SendPacket(&data);
|
||||
}
|
||||
else
|
||||
|
|
@ -572,7 +553,7 @@ void WorldSession::HandleBattlefieldStatusOpcode(WorldPacket& /*recv_data*/)
|
|||
|
||||
uint32 avgTime = bgQueue.GetAverageQueueWaitTime(&ginfo, bracketEntry->GetBracketId());
|
||||
// send status in BattleGround Queue
|
||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, i, STATUS_WAIT_QUEUE, avgTime, WorldTimer::getMSTimeDiff(ginfo.JoinTime, WorldTimer::getMSTime()), arenaType);
|
||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, _player, i, STATUS_WAIT_QUEUE, avgTime, WorldTimer::getMSTimeDiff(ginfo.JoinTime, WorldTimer::getMSTime()), arenaType);
|
||||
SendPacket(&data);
|
||||
}
|
||||
}
|
||||
|
|
@ -625,41 +606,21 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket& recv_data)
|
|||
DEBUG_LOG("WORLD: CMSG_BATTLEMASTER_JOIN_ARENA");
|
||||
// recv_data.hexlike();
|
||||
|
||||
ObjectGuid guid; // arena Battlemaster guid
|
||||
uint8 arenaslot; // 2v2, 3v3 or 5v5
|
||||
uint8 asGroup; // asGroup
|
||||
uint8 isRated; // isRated
|
||||
|
||||
recv_data >> guid >> arenaslot >> asGroup >> isRated;
|
||||
recv_data >> 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;
|
||||
|
||||
ArenaType arenatype;
|
||||
ArenaType arenatype = ArenaTeam::GetTypeBySlot(arenaslot);
|
||||
uint32 arenaRating = 0;
|
||||
|
||||
switch (arenaslot)
|
||||
if (!IsArenaTypeValid(arenatype))
|
||||
{
|
||||
case 0:
|
||||
arenatype = ARENA_TYPE_2v2;
|
||||
break;
|
||||
case 1:
|
||||
arenatype = ARENA_TYPE_3v3;
|
||||
break;
|
||||
case 2:
|
||||
arenatype = ARENA_TYPE_5v5;
|
||||
break;
|
||||
default:
|
||||
sLog.outError("Unknown arena slot %u at HandleBattlemasterJoinArena()", arenaslot);
|
||||
return;
|
||||
sLog.outError("Unknown arena slot %u at HandleBattlemasterJoinArena()", arenaslot);
|
||||
return;
|
||||
}
|
||||
|
||||
// check existence
|
||||
|
|
@ -676,126 +637,82 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket& recv_data)
|
|||
if (!bracketEntry)
|
||||
return;
|
||||
|
||||
GroupJoinBattlegroundResult err;
|
||||
Group* grp = _player->GetGroup();
|
||||
// no group found, error
|
||||
if (!grp)
|
||||
return;
|
||||
if (grp->GetLeaderGuid() != _player->GetObjectGuid())
|
||||
return;
|
||||
|
||||
Group* grp = NULL;
|
||||
|
||||
// check queue conditions
|
||||
if (!asGroup)
|
||||
uint32 ateamId = _player->GetArenaTeamId(arenaslot);
|
||||
// check real arena team existence only here (if it was moved to group->CanJoin .. () then we would have to get it twice)
|
||||
ArenaTeam* at = sObjectMgr.GetArenaTeamById(ateamId);
|
||||
if (!at)
|
||||
{
|
||||
// you can't join in this way by client
|
||||
if (isRated)
|
||||
return;
|
||||
|
||||
// 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;
|
||||
_player->GetSession()->SendNotInArenaTeamPacket(arenatype);
|
||||
return;
|
||||
}
|
||||
else
|
||||
// get the team rating for queue
|
||||
arenaRating = at->GetRating();
|
||||
// the arena team id must match for everyone in the group
|
||||
// get the personal ratings for queue
|
||||
uint32 avg_pers_rating = 0;
|
||||
|
||||
for (Group::member_citerator citr = grp->GetMemberSlots().begin(); citr != grp->GetMemberSlots().end(); ++citr)
|
||||
{
|
||||
grp = _player->GetGroup();
|
||||
// no group found, error
|
||||
if (!grp)
|
||||
ArenaTeamMember const* at_member = at->GetMember(citr->guid);
|
||||
if (!at_member) // group member joining to arena must be in leader arena team
|
||||
return;
|
||||
if (grp->GetLeaderGuid() != _player->GetObjectGuid())
|
||||
return;
|
||||
// may be Group::CanJoinBattleGroundQueue should be moved to player class...
|
||||
err = grp->CanJoinBattleGroundQueue(bg, bgQueueTypeId, arenatype, arenatype, (bool)isRated, arenaslot);
|
||||
|
||||
// calc avg personal rating
|
||||
avg_pers_rating += at_member->personal_rating;
|
||||
}
|
||||
|
||||
uint32 ateamId = 0;
|
||||
avg_pers_rating /= grp->GetMembersCount();
|
||||
|
||||
if (isRated)
|
||||
{
|
||||
ateamId = _player->GetArenaTeamId(arenaslot);
|
||||
// check real arena team existence only here (if it was moved to group->CanJoin .. () then we would have to get it twice)
|
||||
ArenaTeam* at = sObjectMgr.GetArenaTeamById(ateamId);
|
||||
if (!at)
|
||||
{
|
||||
_player->GetSession()->SendNotInArenaTeamPacket(arenatype);
|
||||
return;
|
||||
}
|
||||
// get the team rating for queue
|
||||
arenaRating = at->GetRating();
|
||||
// the arena team id must match for everyone in the group
|
||||
// get the personal ratings for queue
|
||||
uint32 avg_pers_rating = 0;
|
||||
|
||||
for (Group::member_citerator citr = grp->GetMemberSlots().begin(); citr != grp->GetMemberSlots().end(); ++citr)
|
||||
{
|
||||
ArenaTeamMember const* at_member = at->GetMember(citr->guid);
|
||||
if (!at_member) // group member joining to arena must be in leader arena team
|
||||
return;
|
||||
|
||||
// calc avg personal rating
|
||||
avg_pers_rating += at_member->personal_rating;
|
||||
}
|
||||
|
||||
avg_pers_rating /= grp->GetMembersCount();
|
||||
|
||||
// if avg personal rating is more than 150 points below the teams rating, the team will be queued against an opponent matching or similar to the average personal rating
|
||||
if (avg_pers_rating + 150 < arenaRating)
|
||||
arenaRating = avg_pers_rating;
|
||||
}
|
||||
// if avg personal rating is more than 150 points below the teams rating, the team will be queued against an opponent matching or similar to the average personal rating
|
||||
if (avg_pers_rating + 150 < arenaRating)
|
||||
arenaRating = avg_pers_rating;
|
||||
|
||||
BattleGroundQueue& bgQueue = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId];
|
||||
if (asGroup)
|
||||
uint32 avgTime = 0;
|
||||
|
||||
// may be Group::CanJoinBattleGroundQueue should be moved to player class...
|
||||
GroupJoinBattlegroundResult err = grp->CanJoinBattleGroundQueue(bg, bgQueueTypeId, arenatype, arenatype, true, arenaslot);
|
||||
if (!err)
|
||||
{
|
||||
uint32 avgTime = 0;
|
||||
DEBUG_LOG("Battleground: arena join as group start");
|
||||
DEBUG_LOG("Battleground: arena team id %u, leader %s queued with rating %u for type %u", _player->GetArenaTeamId(arenaslot), _player->GetName(), arenaRating, arenatype);
|
||||
|
||||
if (err > 0)
|
||||
{
|
||||
DEBUG_LOG("Battleground: arena join as group start");
|
||||
if (isRated)
|
||||
DEBUG_LOG("Battleground: arena team id %u, leader %s queued with rating %u for type %u", _player->GetArenaTeamId(arenaslot), _player->GetName(), arenaRating, arenatype);
|
||||
|
||||
GroupQueueInfo* ginfo = bgQueue.AddGroup(_player, grp, bgTypeId, bracketEntry, arenatype, isRated, false, arenaRating, ateamId);
|
||||
avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId());
|
||||
}
|
||||
|
||||
for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
|
||||
{
|
||||
Player* member = itr->getSource();
|
||||
if (!member)
|
||||
continue;
|
||||
|
||||
WorldPacket data;
|
||||
|
||||
if (err <= 0)
|
||||
{
|
||||
sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&data, err);
|
||||
member->GetSession()->SendPacket(&data);
|
||||
continue;
|
||||
}
|
||||
|
||||
// add to queue
|
||||
uint32 queueSlot = member->AddBattleGroundQueueId(bgQueueTypeId);
|
||||
|
||||
// send status packet (in queue)
|
||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, arenatype);
|
||||
member->GetSession()->SendPacket(&data);
|
||||
sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&data, err);
|
||||
member->GetSession()->SendPacket(&data);
|
||||
DEBUG_LOG("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());
|
||||
}
|
||||
DEBUG_LOG("Battleground: arena join as group end");
|
||||
GroupQueueInfo* ginfo = bgQueue.AddGroup(_player, grp, bgTypeId, bracketEntry, arenatype, true, false, arenaRating, ateamId);
|
||||
avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId());
|
||||
}
|
||||
else
|
||||
|
||||
for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
|
||||
{
|
||||
GroupQueueInfo* ginfo = bgQueue.AddGroup(_player, NULL, bgTypeId, bracketEntry, arenatype, isRated, false, arenaRating, ateamId);
|
||||
uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId());
|
||||
uint32 queueSlot = _player->AddBattleGroundQueueId(bgQueueTypeId);
|
||||
Player* member = itr->getSource();
|
||||
if (!member)
|
||||
continue;
|
||||
|
||||
WorldPacket data;
|
||||
|
||||
if (err)
|
||||
{
|
||||
sBattleGroundMgr.BuildBattleGroundStatusFailedPacket(&data, bg, member, 0, err);
|
||||
member->GetSession()->SendPacket(&data);
|
||||
continue;
|
||||
}
|
||||
|
||||
// add to queue
|
||||
uint32 queueSlot = member->AddBattleGroundQueueId(bgQueueTypeId);
|
||||
|
||||
// send status packet (in queue)
|
||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, arenatype);
|
||||
SendPacket(&data);
|
||||
DEBUG_LOG("Battleground: player joined queue for arena, skirmish, bg queue type %u bg type %u: GUID %u, NAME %s", bgQueueTypeId, bgTypeId, _player->GetGUIDLow(), _player->GetName());
|
||||
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, member, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, arenatype);
|
||||
member->GetSession()->SendPacket(&data);
|
||||
DEBUG_LOG("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());
|
||||
}
|
||||
DEBUG_LOG("Battleground: arena join as group end");
|
||||
|
||||
sBattleGroundMgr.ScheduleQueueUpdate(arenaRating, arenatype, bgQueueTypeId, bgTypeId, bracketEntry->GetBracketId());
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue