aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.cpp285
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.h34
-rw-r--r--src/server/game/Server/Protocol/Handlers/LFGHandler.cpp196
-rw-r--r--src/server/game/Server/WorldSession.h8
-rw-r--r--src/server/game/World/World.cpp4
5 files changed, 231 insertions, 296 deletions
diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp
index 1f1ec3f3919..74cba2037df 100644
--- a/src/server/game/DungeonFinding/LFGMgr.cpp
+++ b/src/server/game/DungeonFinding/LFGMgr.cpp
@@ -40,6 +40,7 @@ LFGMgr::LFGMgr()
m_NumWaitTimeDps = 0;
m_update = true;
m_lfgProposalId = 1;
+ GetAllDungeons();
}
LFGMgr::~LFGMgr()
@@ -231,7 +232,7 @@ void LFGMgr::Update(uint32 diff)
for (LfgAnswerMap::const_iterator itVotes = pBoot->votes.begin(); itVotes != pBoot->votes.end(); ++itVotes)
if (Player *plrg = sObjectMgr.GetPlayer(itVotes->first))
if (plrg->GetGUIDLow() != pBoot->victimLowGuid)
- SendLfgBootPlayer(plrg, pBoot);
+ plrg->GetSession()->SendLfgBootPlayer(pBoot);
if (grp)
grp->SetLfgKickActive(false);
delete pBoot;
@@ -272,7 +273,7 @@ void LFGMgr::Update(uint32 diff)
plr->GetSession()->SendLfgUpdateParty(LFG_UPDATETYPE_PROPOSAL_BEGIN);
else
plr->GetSession()->SendLfgUpdatePlayer(LFG_UPDATETYPE_PROPOSAL_BEGIN);
- SendUpdateProposal(plr, m_lfgProposalId, pProposal);
+ plr->GetSession()->SendUpdateProposal(m_lfgProposalId, pProposal);
}
}
@@ -356,15 +357,6 @@ void LFGMgr::Update(uint32 diff)
}
/// <summary>
-/// Initialize Looking For Group
-/// </summary>
-void LFGMgr::InitLFG()
-{
- // Initialize dungeonMap
- GetAllDungeons();
-}
-
-/// <summary>
/// Load achievement <-> encounter associations
/// </summary>
void LFGMgr::LoadDungeonEncounters()
@@ -1208,7 +1200,7 @@ void LFGMgr::UpdateProposal(uint32 proposalId, uint32 lowGuid, uint8 accept)
if (!allAnswered)
{
for (LfgPlayerList::const_iterator it = players.begin(); it != players.end(); ++it)
- SendUpdateProposal(*it, proposalId, pProposal);
+ (*it)->GetSession()->SendUpdateProposal(proposalId, pProposal);
}
else
{
@@ -1226,7 +1218,7 @@ void LFGMgr::UpdateProposal(uint32 proposalId, uint32 lowGuid, uint8 accept)
{
plr = *it;
if (sendUpdate)
- SendUpdateProposal(plr, proposalId, pProposal);
+ plr->GetSession()->SendUpdateProposal(proposalId, pProposal);
plr->SetLfgUpdate(false);
if (plr->GetGroup())
{
@@ -1338,7 +1330,7 @@ void LFGMgr::RemoveProposal(LfgProposalMap::iterator itProposal, LfgUpdateType t
continue;
guid = plr->GetGroup() ? plr->GetGroup()->GetGUID(): plr->GetGUID();
- SendUpdateProposal(plr, itProposal->first, pProposal);
+ plr->GetSession()->SendUpdateProposal(itProposal->first, pProposal);
// Remove members that didn't accept
itQueue = m_QueueInfoMap.find(guid);
if (!it->second->accept)
@@ -1416,7 +1408,7 @@ void LFGMgr::InitBoot(Group *grp, uint32 iLowGuid, uint32 vLowguid, std::string
}
for (PlayerSet::const_iterator it = players.begin(); it != players.end(); ++it)
- SendLfgBootPlayer(*it, pBoot);
+ (*it)->GetSession()->SendLfgBootPlayer(pBoot);
grp->SetLfgKickActive(true);
m_Boots[grp->GetLowGUID()] = pBoot;
@@ -1470,7 +1462,7 @@ void LFGMgr::UpdateBoot(Player *plr, uint8 accept)
for (LfgAnswerMap::const_iterator itVotes = pBoot->votes.begin(); itVotes != pBoot->votes.end(); ++itVotes)
if (Player *plrg = sObjectMgr.GetPlayer(itVotes->first))
if (plrg->GetGUIDLow() != pBoot->victimLowGuid)
- SendLfgBootPlayer(plrg, pBoot);
+ plrg->GetSession()->SendLfgBootPlayer(pBoot);
if (agreeNum == pBoot->votedNeeded) // Vote passed - Kick player
{
@@ -1566,7 +1558,7 @@ void LFGMgr::RewardDungeonDoneFor(const uint32 dungeonId, Player *player)
return;
// Give rewards
- SendLfgPlayerReward(player);
+ player->GetSession()->SendLfgPlayerReward(dungeon->Entry(), group->GetLfgDungeonEntry(false), index, reward, qReward);
if (qReward->GetRewItemsCount() > 0)
{
@@ -1661,257 +1653,6 @@ void LFGMgr::BuildLfgRoleCheck(WorldPacket &data, LfgRoleCheck *pRoleCheck)
}
/// <summary>
-/// Build Proposal Update packet
-/// </summary>
-/// <param name="Player *">Player</param>
-/// <param name="uint32">ProposalID</param>
-/// <param name="LfgProposal *">Internal LFG Proposal</param>
-/// <returns></returns>
-void LFGMgr::SendUpdateProposal(Player *plr, uint32 proposalId, LfgProposal *pProp)
-{
- if (!plr || !pProp)
- return;
-
- uint32 pLogGuid = plr->GetGUIDLow();
- LfgProposalPlayerMap::const_iterator itPlayer = pProp->players.find(pLogGuid);
- if (itPlayer == pProp->players.end()) // Player MUST be in the proposal
- return;
-
- LfgProposalPlayer *ppPlayer = itPlayer->second;
- uint32 pLowGroupGuid = ppPlayer->groupLowGuid;
- uint32 dLowGuid = pProp->groupLowGuid;
- uint32 dungeonId = pProp->dungeonId;
- uint32 isSameDungeon = plr->GetGroup() && plr->GetGroup()->GetLfgDungeonEntry() == dungeonId;
-
- sLog.outDebug("SMSG_LFG_PROPOSAL_UPDATE");
- WorldPacket data(SMSG_LFG_PROPOSAL_UPDATE, 4 + 1 + 4 + 4 + 1 + 1 + pProp->players.size() * (4 + 1 + 1 + 1 + 1 +1));
- if (!dLowGuid && plr->GetLfgDungeons()->size() == 1) // New group - select the dungeon the player selected
- dungeonId = *plr->GetLfgDungeons()->begin();
- if (LFGDungeonEntry const *dungeon = sLFGDungeonStore.LookupEntry(dungeonId))
- dungeonId = dungeon->Entry();
- data << uint32(dungeonId); // Dungeon
- data << uint8(pProp->state); // Result state
- data << uint32(proposalId); // Internal Proposal ID
- data << uint32(0); // Bosses killed - FIXME
- data << uint8(isSameDungeon); // Silent (show client window)
- data << uint8(pProp->players.size()); // Group size
-
- for (itPlayer = pProp->players.begin(); itPlayer != pProp->players.end(); ++itPlayer)
- {
- ppPlayer = itPlayer->second;
- data << uint32(ppPlayer->role); // Role
- data << uint8(itPlayer->first == pLogGuid); // Self player
- if (!ppPlayer->groupLowGuid) // Player not it a group
- {
- data << uint8(0); // Not in dungeon
- data << uint8(0); // Not same group
- }
- else
- {
- data << uint8(ppPlayer->groupLowGuid == dLowGuid); // In dungeon (silent)
- data << uint8(ppPlayer->groupLowGuid == pLowGroupGuid); // Same Group than player
- }
- data << uint8(ppPlayer->accept != -1); // Answered
- data << uint8(ppPlayer->accept == 1); // Accepted
- }
- plr->GetSession()->SendPacket(&data);
-}
-
-/// <summary>
-/// Build and Send LFG lock player info and reward
-/// </summary>
-/// <param name="Player *">Player</param>
-void LFGMgr::SendLfgPlayerInfo(Player *plr)
-{
- uint32 rsize = 0;
- uint32 lsize = 0;
- bool done;
- LfgDungeonSet *randomlist = GetRandomDungeons(plr->getLevel(), plr->GetSession()->Expansion());
- LfgLockStatusSet *lockSet = GetPlayerLockStatusDungeons(plr, GetAllDungeons());
-
- if (randomlist)
- rsize = randomlist->size();
-
- if (lockSet)
- lsize = lockSet->size();
-
- sLog.outDebug("SMSG_LFG_PLAYER_INFO");
- WorldPacket data(SMSG_LFG_PLAYER_INFO, 1 + rsize * (4 + 1 + 4 + 4 + 4 + 4 + 1 + 4 + 4 + 4) + 4 + lsize * (1 + 4 + 4 + 4 + 4 + 1 + 4 + 4 + 4));
- if (!randomlist)
- data << uint8(0);
- else
- {
- LfgReward const* reward = NULL;
- Quest const* qRew = NULL;
-
- data << uint8(randomlist->size()); // Random Dungeon count
- for (LfgDungeonSet::iterator it = randomlist->begin(); it != randomlist->end(); ++it)
- {
- done = plr->isLfgDungeonDone(*it);
- reward = GetRandomDungeonReward(*it, plr->getLevel());
- data << uint32(*it); // Entry
- data << uint8(done);
- if (reward)
- {
- qRew = sObjectMgr.GetQuestTemplate(reward->reward[done].questId);
- data << uint32(qRew ? qRew->GetRewOrReqMoney() : 0);
- data << uint32(qRew ? qRew->XPValue(plr) : 0);
- data << uint32(reward->reward[done].variableMoney);
- data << uint32(reward->reward[done].variableXP);
- data << uint8(qRew ? qRew->GetRewItemsCount() : 0);
- if (qRew && qRew->GetRewItemsCount())
- {
- ItemPrototype const* iProto = NULL;
- for (uint8 i = 0; i < QUEST_REWARDS_COUNT; ++i)
- {
- if (!qRew->RewItemId[i])
- continue;
-
- iProto = ObjectMgr::GetItemPrototype(qRew->RewItemId[i]);
-
- data << uint32(qRew->RewItemId[i]);
- data << uint32(iProto ? iProto->DisplayInfoID : 0);
- data << uint32(qRew->RewItemCount[i]);
- }
- }
- }
- else
- {
- data << uint32(0);
- data << uint32(0);
- data << uint32(0);
- data << uint32(0);
- data << uint8(0);
- }
- }
- randomlist->clear();
- delete randomlist;
- }
- BuildPlayerLockDungeonBlock(data, lockSet);
- plr->GetSession()->SendPacket(&data);
-}
-
-/// <summary>
-/// Build and Send LFG lock party info and reward
-/// </summary>
-/// <param name="Player *">Player</param>
-void LFGMgr::SendLfgPartyInfo(Player *plr)
-{
- if (LfgLockStatusMap *lockMap = GetPartyLockStatusDungeons(plr, GetAllDungeons()))
- {
- uint32 size = 0;
- for (LfgLockStatusMap::const_iterator it = lockMap->begin(); it != lockMap->end(); ++it)
- size += 8 + 4 + it->second->size() * (4 + 4);
- sLog.outDebug("SMSG_LFG_PARTY_INFO");
- WorldPacket data(SMSG_LFG_PARTY_INFO, 1 + size);
- BuildPartyLockDungeonBlock(data, lockMap);
- plr->GetSession()->SendPacket(&data);
- }
-}
-
-/// <summary>
-/// Build and Send LFG boot player info
-/// </summary>
-/// <param name="Player *">Player</param>
-/// <param name="LfgPlayerBoot *">Boot info</param>
-void LFGMgr::SendLfgBootPlayer(Player *plr, LfgPlayerBoot *pBoot)
-{
- sLog.outDebug("SMSG_LFG_BOOT_PLAYER");
-
- int8 playerVote = pBoot->votes[plr->GetGUIDLow()];
- uint8 votesNum = 0;
- uint8 agreeNum = 0;
- uint32 secsleft = uint8((pBoot->cancelTime - time(NULL)) / 1000);
- for (LfgAnswerMap::const_iterator it = pBoot->votes.begin(); it != pBoot->votes.end(); ++it)
- {
- if (it->second != -1)
- {
- ++votesNum;
- if (it->second == 1)
- ++agreeNum;
- }
- }
-
- WorldPacket data(SMSG_LFG_BOOT_PLAYER, 1 + 1 + 1 + 8 + 4 + 4 + 4 + 4 + pBoot->reason.length());
- data << uint8(pBoot->inProgress); // Vote in progress
- data << uint8(playerVote != -1); // Did Vote
- data << uint8(playerVote == 1); // Agree
- data << uint64(MAKE_NEW_GUID(pBoot->victimLowGuid, 0, HIGHGUID_PLAYER)); // Victim GUID
- data << uint32(votesNum); // Total Votes
- data << uint32(agreeNum); // Agree Count
- data << uint32(secsleft); // Time Left
- data << uint32(pBoot->votedNeeded); // Needed Votes
- data << pBoot->reason.c_str(); // Kick reason
- plr->GetSession()->SendPacket(&data);
-}
-
-/// <summary>
-/// Build and Send LFG player reward
-/// </summary>
-/// <param name="Player *">Player</param>
-void LFGMgr::SendLfgPlayerReward(Player *plr)
-{
- uint32 rdungeonId = 0;
- uint32 sdungeonId = 0;
- LFGDungeonEntry const *dungeon = sLFGDungeonStore.LookupEntry(*plr->GetLfgDungeons()->begin());
- if (dungeon)
- rdungeonId = dungeon->Entry();
- if (plr->GetGroup())
- sdungeonId = plr->GetGroup()->GetLfgDungeonEntry(false);
- bool done = plr->isLfgDungeonDone(rdungeonId);
- LfgReward const* reward = GetRandomDungeonReward(rdungeonId, plr->getLevel());
-
- uint8 itemNum = 0;
- Quest const* qRew = NULL;
- if (reward)
- {
- qRew = sObjectMgr.GetQuestTemplate(reward->reward[done].questId);
- if (qRew)
- itemNum = qRew->GetRewItemsCount();
- }
-
- sLog.outDebug("SMSG_LFG_PLAYER_REWARD");
- WorldPacket data(SMSG_LFG_PLAYER_REWARD, 4 + 4 + 1 + 4 + 4 + 4 + 4 + 4 + 1 + itemNum * (4 + 4 + 4));
- data << uint32(rdungeonId); // Random Dungeon Finished
- data << uint32(sdungeonId); // Dungeon Finished
- data << uint8(done);
- data << uint32(reward ? 1 : 0);
- if (reward)
- {
- data << uint32(qRew ? qRew->GetRewOrReqMoney() : 0);
- data << uint32(qRew ? qRew->XPValue(plr) : 0);
- data << uint32(reward->reward[done].variableMoney);
- data << uint32(reward->reward[done].variableXP);
- data << uint8(itemNum);
- if (qRew && itemNum)
- {
- ItemPrototype const* iProto = NULL;
- for (uint8 i = 0; i < QUEST_REWARDS_COUNT; ++i)
- {
- if (!qRew->RewItemId[i])
- continue;
-
- iProto = ObjectMgr::GetItemPrototype(qRew->RewItemId[i]);
-
- data << uint32(qRew->RewItemId[i]);
- data << uint32(iProto ? iProto->DisplayInfoID : 0);
- data << uint32(qRew->RewItemCount[i]);
- }
- }
- }
- else
- {
- data << uint32(0);
- data << uint32(0);
- data << uint32(0);
- data << uint32(0);
- data << uint8(0);
- }
-
- plr->GetSession()->SendPacket(&data);
-}
-
-/// <summary>
/// Build Party Dungeon lock status packet
/// </summary>
/// <param name="WorldPacket &">WorldPacket</param>
@@ -1998,9 +1739,12 @@ LfgLockStatusMap* LFGMgr::GetGroupLockStatusDungeons(PlayerSet *pPlayers, LfgDun
/// <returns>LfgLockStatusMap*</returns>
LfgLockStatusMap* LFGMgr::GetPartyLockStatusDungeons(Player *plr, LfgDungeonSet *dungeons)
{
- if (!plr || !dungeons)
+ if (!plr)
return NULL;
+ if (!dungeons)
+ dungeons = GetAllDungeons();
+
Group *grp = plr->GetGroup();
if (!grp)
return NULL;
@@ -2035,6 +1779,9 @@ LfgLockStatusSet* LFGMgr::GetPlayerLockStatusDungeons(Player *plr, LfgDungeonSet
uint8 expansion = plr->GetSession()->Expansion();
AccessRequirement const* ar;
+ if (!dungeons)
+ dungeons = GetAllDungeons();
+
for (LfgDungeonSet::const_iterator it = dungeons->begin(); it != dungeons->end(); ++it)
{
dungeon = sLFGDungeonStore.LookupEntry(*it);
diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h
index cc932c5817f..73f8aad841e 100644
--- a/src/server/game/DungeonFinding/LFGMgr.h
+++ b/src/server/game/DungeonFinding/LFGMgr.h
@@ -250,7 +250,6 @@ class LFGMgr
LFGMgr();
~LFGMgr();
- void InitLFG();
void Join(Player *plr);
void Leave(Player *plr, Group *grp = NULL);
void OfferContinue(Group *grp);
@@ -260,8 +259,6 @@ class LFGMgr
void UpdateRoleCheck(Group *grp, Player *plr = NULL);
void Update(uint32 diff);
- void SendLfgPlayerInfo(Player *plr);
- void SendLfgPartyInfo(Player *plr);
bool isRandomDungeon(uint32 dungeonId);
void InitBoot(Group *grp, uint32 plowGuid, uint32 vlowGuid, std::string reason);
@@ -275,35 +272,32 @@ class LFGMgr
return itr->second;
return 0;
- }
+ };
- private:
- void Cleaner();
- void AddGuidToNewQueue(uint64 guid);
-
- void SendLfgBootPlayer(Player *plr, LfgPlayerBoot *pBoot);
- void SendUpdateProposal(Player *plr, uint32 proposalId, LfgProposal *pProp);
- void SendLfgPlayerReward(Player *plr);
-
- void BuildLfgRoleCheck(WorldPacket &data, LfgRoleCheck *pRoleCheck);
- void BuildAvailableRandomDungeonList(WorldPacket &data, Player *plr);
+ LfgLockStatusMap* GetPartyLockStatusDungeons(Player *plr, LfgDungeonSet *dungeons = NULL);
+ LfgDungeonSet* GetRandomDungeons(uint8 level, uint8 expansion);
+ LfgLockStatusSet* GetPlayerLockStatusDungeons(Player *plr, LfgDungeonSet *dungeons = NULL);
+ LfgReward const* GetRandomDungeonReward(uint32 dungeon, uint8 level);
void BuildPlayerLockDungeonBlock(WorldPacket &data, LfgLockStatusSet *lockSet);
void BuildPartyLockDungeonBlock(WorldPacket &data, LfgLockStatusMap *lockMap);
- void BuildBootPlayerBlock(WorldPacket &data, LfgPlayerBoot *pBoot, uint32 lowGuid);
+ private:
+ void Cleaner();
+ void AddGuidToNewQueue(uint64 guid);
void AddToQueue(uint64 guid, LfgRolesMap *roles, LfgDungeonSet *dungeons);
bool RemoveFromQueue(uint64 guid);
+ void RemoveProposal(LfgProposalMap::iterator itProposal, LfgUpdateType type);
void FindNewGroups(LfgGuidList &check, LfgGuidList all, LfgProposalList *proposals);
bool CheckGroupRoles(LfgRolesMap &groles, bool removeLeaderFlag = true);
- void RemoveProposal(LfgProposalMap::iterator itProposal, LfgUpdateType type);
+
+ void BuildLfgRoleCheck(WorldPacket &data, LfgRoleCheck *pRoleCheck);
+ void BuildAvailableRandomDungeonList(WorldPacket &data, Player *plr);
+ void BuildBootPlayerBlock(WorldPacket &data, LfgPlayerBoot *pBoot, uint32 lowGuid);
LfgLockStatusMap* GetGroupLockStatusDungeons(PlayerSet *pPlayers, LfgDungeonSet *dungeons);
- LfgLockStatusMap* GetPartyLockStatusDungeons(Player *plr, LfgDungeonSet *dungeons);
- LfgLockStatusSet* GetPlayerLockStatusDungeons(Player *plr, LfgDungeonSet *dungeons);
LfgDungeonSet* GetDungeonsByRandom(uint32 randomdungeon);
- LfgDungeonSet* GetRandomDungeons(uint8 level, uint8 expansion);
+
LfgDungeonSet* GetAllDungeons();
- LfgReward const* GetRandomDungeonReward(uint32 dungeon, uint8 level);
uint8 GetDungeonGroupType(uint32 dungeon);
LfgRewardMap m_RewardMap; // Stores rewards for random dungeons
diff --git a/src/server/game/Server/Protocol/Handlers/LFGHandler.cpp b/src/server/game/Server/Protocol/Handlers/LFGHandler.cpp
index ce980194c56..b0dac726d5e 100644
--- a/src/server/game/Server/Protocol/Handlers/LFGHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/LFGHandler.cpp
@@ -148,13 +148,88 @@ void WorldSession::HandleLfgTeleportOpcode(WorldPacket &recv_data)
void WorldSession::HandleLfgPlayerLockInfoRequestOpcode(WorldPacket &/*recv_data*/)
{
sLog.outDebug("CMSG_LFD_PLAYER_LOCK_INFO_REQUEST");
- sLFGMgr.SendLfgPlayerInfo(GetPlayer());
+ uint32 rsize = 0;
+ uint32 lsize = 0;
+ bool done;
+ LfgDungeonSet *randomlist = sLFGMgr.GetRandomDungeons(GetPlayer()->getLevel(), GetPlayer()->GetSession()->Expansion());
+ LfgLockStatusSet *lockSet = sLFGMgr.GetPlayerLockStatusDungeons(GetPlayer());
+
+ if (randomlist)
+ rsize = randomlist->size();
+
+ if (lockSet)
+ lsize = lockSet->size();
+
+ sLog.outDebug("SMSG_LFG_PLAYER_INFO");
+ WorldPacket data(SMSG_LFG_PLAYER_INFO, 1 + rsize * (4 + 1 + 4 + 4 + 4 + 4 + 1 + 4 + 4 + 4) + 4 + lsize * (1 + 4 + 4 + 4 + 4 + 1 + 4 + 4 + 4));
+ if (!randomlist)
+ data << uint8(0);
+ else
+ {
+ LfgReward const* reward = NULL;
+ Quest const* qRew = NULL;
+
+ data << uint8(randomlist->size()); // Random Dungeon count
+ for (LfgDungeonSet::iterator it = randomlist->begin(); it != randomlist->end(); ++it)
+ {
+ done = GetPlayer()->isLfgDungeonDone(*it);
+ reward = sLFGMgr.GetRandomDungeonReward(*it, GetPlayer()->getLevel());
+ data << uint32(*it); // Entry
+ data << uint8(done);
+ if (reward)
+ {
+ qRew = sObjectMgr.GetQuestTemplate(reward->reward[done].questId);
+ data << uint32(qRew ? qRew->GetRewOrReqMoney() : 0);
+ data << uint32(qRew ? qRew->XPValue(GetPlayer()) : 0);
+ data << uint32(reward->reward[done].variableMoney);
+ data << uint32(reward->reward[done].variableXP);
+ data << uint8(qRew ? qRew->GetRewItemsCount() : 0);
+ if (qRew && qRew->GetRewItemsCount())
+ {
+ ItemPrototype const* iProto = NULL;
+ for (uint8 i = 0; i < QUEST_REWARDS_COUNT; ++i)
+ {
+ if (!qRew->RewItemId[i])
+ continue;
+
+ iProto = ObjectMgr::GetItemPrototype(qRew->RewItemId[i]);
+
+ data << uint32(qRew->RewItemId[i]);
+ data << uint32(iProto ? iProto->DisplayInfoID : 0);
+ data << uint32(qRew->RewItemCount[i]);
+ }
+ }
+ }
+ else
+ {
+ data << uint32(0);
+ data << uint32(0);
+ data << uint32(0);
+ data << uint32(0);
+ data << uint8(0);
+ }
+ }
+ randomlist->clear();
+ delete randomlist;
+ }
+ sLFGMgr.BuildPlayerLockDungeonBlock(data, lockSet);
+ SendPacket(&data);
}
void WorldSession::HandleLfgPartyLockInfoRequestOpcode(WorldPacket &/*recv_data*/)
{
sLog.outDebug("CMSG_LFD_PARTY_LOCK_INFO_REQUEST");
- //sLFGMgr.SendLfgPartyInfo(GetPlayer());
+
+ if (LfgLockStatusMap *lockMap = sLFGMgr.GetPartyLockStatusDungeons(GetPlayer()))
+ {
+ uint32 size = 0;
+ for (LfgLockStatusMap::const_iterator it = lockMap->begin(); it != lockMap->end(); ++it)
+ size += 8 + 4 + it->second->size() * (4 + 4);
+ sLog.outDebug("SMSG_LFG_PARTY_INFO");
+ WorldPacket data(SMSG_LFG_PARTY_INFO, 1 + size);
+ sLFGMgr.BuildPartyLockDungeonBlock(data, lockMap);
+ SendPacket(&data);
+ }
}
void WorldSession::HandleLfrSearchOpcode(WorldPacket &recv_data)
@@ -308,6 +383,123 @@ void WorldSession::SendLfgQueueStatus(uint32 dungeon, int32 waitTime, int32 avgW
SendPacket(&data);
}
+void WorldSession::SendLfgPlayerReward(uint32 rdungeonEntry, uint32 sdungeonEntry, uint8 done, const LfgReward *reward, const Quest *qRew)
+{
+ if (!rdungeonEntry || !sdungeonEntry || !qRew)
+ return;
+
+ uint8 itemNum = qRew ? qRew->GetRewItemsCount() : 0;
+
+ sLog.outDebug("SMSG_LFG_PLAYER_REWARD");
+ WorldPacket data(SMSG_LFG_PLAYER_REWARD, 4 + 4 + 1 + 4 + 4 + 4 + 4 + 4 + 1 + itemNum * (4 + 4 + 4));
+ data << uint32(rdungeonEntry); // Random Dungeon Finished
+ data << uint32(sdungeonEntry); // Dungeon Finished
+ data << uint8(done);
+ data << uint32(1);
+ data << uint32(qRew->GetRewOrReqMoney());
+ data << uint32(qRew->XPValue(GetPlayer()));
+ data << uint32(reward->reward[done].variableMoney);
+ data << uint32(reward->reward[done].variableXP);
+ data << uint8(itemNum);
+ if (itemNum)
+ {
+ ItemPrototype const* iProto = NULL;
+ for (uint8 i = 0; i < QUEST_REWARDS_COUNT; ++i)
+ {
+ if (!qRew->RewItemId[i])
+ continue;
+
+ iProto = ObjectMgr::GetItemPrototype(qRew->RewItemId[i]);
+
+ data << uint32(qRew->RewItemId[i]);
+ data << uint32(iProto ? iProto->DisplayInfoID : 0);
+ data << uint32(qRew->RewItemCount[i]);
+ }
+ }
+ SendPacket(&data);
+}
+
+void WorldSession::SendLfgBootPlayer(LfgPlayerBoot *pBoot)
+{
+ sLog.outDebug("SMSG_LFG_BOOT_PLAYER");
+
+ int8 playerVote = pBoot->votes[GetPlayer()->GetGUIDLow()];
+ uint8 votesNum = 0;
+ uint8 agreeNum = 0;
+ uint32 secsleft = uint8((pBoot->cancelTime - time(NULL)) / 1000);
+ for (LfgAnswerMap::const_iterator it = pBoot->votes.begin(); it != pBoot->votes.end(); ++it)
+ {
+ if (it->second != -1)
+ {
+ ++votesNum;
+ if (it->second == 1)
+ ++agreeNum;
+ }
+ }
+
+ WorldPacket data(SMSG_LFG_BOOT_PLAYER, 1 + 1 + 1 + 8 + 4 + 4 + 4 + 4 + pBoot->reason.length());
+ data << uint8(pBoot->inProgress); // Vote in progress
+ data << uint8(playerVote != -1); // Did Vote
+ data << uint8(playerVote == 1); // Agree
+ data << uint64(MAKE_NEW_GUID(pBoot->victimLowGuid, 0, HIGHGUID_PLAYER)); // Victim GUID
+ data << uint32(votesNum); // Total Votes
+ data << uint32(agreeNum); // Agree Count
+ data << uint32(secsleft); // Time Left
+ data << uint32(pBoot->votedNeeded); // Needed Votes
+ data << pBoot->reason.c_str(); // Kick reason
+ SendPacket(&data);
+}
+
+void WorldSession::SendUpdateProposal(uint32 proposalId, LfgProposal *pProp)
+{
+ if (!pProp)
+ return;
+
+ uint32 pLogGuid = GetPlayer()->GetGUIDLow();
+ LfgProposalPlayerMap::const_iterator itPlayer = pProp->players.find(pLogGuid);
+ if (itPlayer == pProp->players.end()) // Player MUST be in the proposal
+ return;
+
+ LfgProposalPlayer *ppPlayer = itPlayer->second;
+ uint32 pLowGroupGuid = ppPlayer->groupLowGuid;
+ uint32 dLowGuid = pProp->groupLowGuid;
+ uint32 dungeonId = pProp->dungeonId;
+ uint32 isSameDungeon = GetPlayer()->GetGroup() && GetPlayer()->GetGroup()->GetLfgDungeonEntry() == dungeonId;
+
+ sLog.outDebug("SMSG_LFG_PROPOSAL_UPDATE");
+ WorldPacket data(SMSG_LFG_PROPOSAL_UPDATE, 4 + 1 + 4 + 4 + 1 + 1 + pProp->players.size() * (4 + 1 + 1 + 1 + 1 +1));
+ if (!dLowGuid && GetPlayer()->GetLfgDungeons()->size() == 1) // New group - select the dungeon the player selected
+ dungeonId = *GetPlayer()->GetLfgDungeons()->begin();
+ if (LFGDungeonEntry const *dungeon = sLFGDungeonStore.LookupEntry(dungeonId))
+ dungeonId = dungeon->Entry();
+ data << uint32(dungeonId); // Dungeon
+ data << uint8(pProp->state); // Result state
+ data << uint32(proposalId); // Internal Proposal ID
+ data << uint32(0); // Bosses killed - FIXME
+ data << uint8(isSameDungeon); // Silent (show client window)
+ data << uint8(pProp->players.size()); // Group size
+
+ for (itPlayer = pProp->players.begin(); itPlayer != pProp->players.end(); ++itPlayer)
+ {
+ ppPlayer = itPlayer->second;
+ data << uint32(ppPlayer->role); // Role
+ data << uint8(itPlayer->first == pLogGuid); // Self player
+ if (!ppPlayer->groupLowGuid) // Player not it a group
+ {
+ data << uint8(0); // Not in dungeon
+ data << uint8(0); // Not same group
+ }
+ else
+ {
+ data << uint8(ppPlayer->groupLowGuid == dLowGuid); // In dungeon (silent)
+ data << uint8(ppPlayer->groupLowGuid == pLowGroupGuid); // Same Group than player
+ }
+ data << uint8(ppPlayer->accept != -1); // Answered
+ data << uint8(ppPlayer->accept == 1); // Accepted
+ }
+ SendPacket(&data);
+}
+
void WorldSession::SendLfgUpdateSearch(bool update)
{
sLog.outDebug("SMSG_LFG_UPDATE_SEARCH");
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 01ffbe71245..7266a4f3352 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -42,6 +42,7 @@ class Object;
class Player;
class Unit;
class GameObject;
+class Quest;
class WorldPacket;
class WorldSocket;
class QueryResult;
@@ -49,8 +50,10 @@ class LoginQueryHolder;
class CharacterHandler;
class SpellCastTargets;
struct AreaTableEntry;
-
struct GM_Ticket;
+struct LfgPlayerBoot;
+struct LfgProposal;
+struct LfgReward;
enum AccountDataType
{
@@ -722,6 +725,9 @@ class WorldSession
void SendLfgUpdateSearch(bool update);
void SendLfgJoinResult(uint8 checkResult, uint8 checkValue);
void SendLfgQueueStatus(uint32 dungeon, int32 waitTime, int32 avgWaitTime, int32 waitTimeTanks, int32 waitTimeHealer, int32 waitTimeDps, uint32 queuedTime, uint8 tanks, uint8 healers, uint8 dps);
+ void SendLfgPlayerReward(uint32 rdungeonEntry, uint32 sdungeonEntry, uint8 done, const LfgReward *reward, const Quest *qRew);
+ void SendLfgBootPlayer(LfgPlayerBoot *pBoot);
+ void SendUpdateProposal(uint32 proposalId, LfgProposal *pProp);
void SendLfgDisabled();
void SendLfgOfferContinue(uint32 dungeonEntry);
void SendLfgTeleportError(uint8 err);
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 0ee7c5ebe24..1988f667dc6 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1697,10 +1697,6 @@ void World::SetInitialWorldSettings()
sLog.outString("Loading World States..."); // must be loaded before battleground and outdoor PvP
LoadWorldStates();
- ///- Initialize Looking For Group
- sLog.outString("Starting Looking For Group System");
- sLFGMgr.InitLFG();
-
///- Initialize Battlegrounds
sLog.outString("Starting Battleground System");
sBattlegroundMgr.CreateInitialBattlegrounds();