@@ -38,6 +38,23 @@
// data << uint32(it->second.currentItemLevel); // Current itemLevel
// }
//}

void BuildLfgBlackListBlock(lfg::LfgBlackListMap const& black, Player* player)
{
WorldPackets::LFG::LFGBlackList blackList;

blackList.PlayerGuid = player->GetGUID();
for (lfg::LfgBlackListMap::const_iterator iterator = black.begin(); iterator != black.end(); ++iterator)
{
WorldPackets::LFG::LFGBlackListSlot slot;

slot.Slot = iterator->second.Slot;
slot.Reason = iterator->second.Reason;
slot.SubReason1 = iterator->second.SubReason1;
slot.SubReason2 = iterator->second.SubReason2;
}
}

//
//void BuildPartyLockDungeonBlock(WorldPacket& data, lfg::LfgLockPartyMap const& lockMap)
//{
@@ -49,39 +66,41 @@
// }
//}
//
//void BuildQuestReward(WorldPacket& data, Quest const* quest, Player* player)
//{
// uint8 rewCount = quest->GetRewItemsCount() + quest->GetRewCurrencyCount();
//
// data << uint32(player->GetQuestMoneyReward(quest));
// data << uint32(player->GetQuestXPReward(quest));
// data << uint8(rewCount);
// if (rewCount)
// {
// for (uint8 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
// {
// if (uint32 currencyId = quest->RewardCurrencyId[i])
// {
// data << uint32(currencyId);
// data << uint32(0);
// data << uint32(quest->RewardCurrencyCount[i]);
// data << uint8(1); // Is currency
// }
// }
//
// for (uint8 i = 0; i < QUEST_REWARD_ITEM_COUNT; ++i)
// {
// if (uint32 itemId = quest->RewardItemId[i])
// {
// //ItemTemplate const* item = sObjectMgr->GetItemTemplate(itemId);
// data << uint32(itemId);
// data << uint32(/*item ? item->DisplayInfoID :*/ 0);
// data << uint32(quest->RewardItemCount[i]);
// data << uint8(0); // Is currency
// }
// }
// }
//}

void BuildQuestReward(Quest const* quest, Player* player)
{
WorldPackets::LFG::LfgPlayerQuestReward reward;

uint8 rewCount = quest->GetRewItemsCount() + quest->GetRewCurrencyCount();

reward.RewardMoney = player->GetQuestMoneyReward(quest);
reward.RewardXP = player->GetQuestXPReward(quest);
reward.Mask = rewCount;

if (rewCount)
{
for (uint8 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
{
if (uint32 currencyId = quest->RewardCurrencyId[i])
{
WorldPackets::LFG::LfgPlayerQuestRewardCurrency currency;

currency.CurrencyID = currencyId;
currency.Quantity = quest->RewardCurrencyCount[i];
}
}

for (uint8 i = 0; i < QUEST_REWARD_ITEM_COUNT; ++i)
{
if (uint32 itemId = quest->RewardItemId[i])
{
WorldPackets::LFG::LfgPlayerQuestRewardItem item;
item.ItemID = itemId;
item.Quantity = quest->RewardItemCount[i];
}
}
}
}

void WorldSession::HandleLfgJoinOpcode(WorldPacket& recvData)
{
@@ -127,6 +146,21 @@ void WorldSession::HandleLfgJoinOpcode(WorldPacket& recvData)
sLFGMgr->JoinLfg(GetPlayer(), uint8(roles), newDungeons, comment);
}

// Replace above function

void WorldSession::HandleDfJoinOpcode(WorldPackets::LFG::DfJoin& packet)
{
uint32 roles = 0;
bool group = GetPlayer()->GetGroup();

// Handle

packet.Roles = roles;
packet.QueueAsGroup = group;

// Send lfg join method
}

void WorldSession::HandleLfgLeaveOpcode(WorldPacket& recvData)
{
ObjectGuid leaveGuid;
@@ -234,106 +268,29 @@ void WorldSession::HandleDFGetSystemInfo(WorldPackets::LFG::DfGetSystemInfo& pac

void WorldSession::SendLfgPlayerLockInfo()
{
ObjectGuid guid = GetPlayer()->GetGUID();

// Get Random dungeons that can be done at a certain level and expansion
uint8 level = GetPlayer()->getLevel();
lfg::LfgDungeonSet const& randomDungeons =
sLFGMgr->GetRandomAndSeasonalDungeons(level, GetExpansion());

// Get player locked Dungeons
lfg::LfgLockMap const& lock = sLFGMgr->GetLockedDungeons(guid);
uint32 rsize = uint32(randomDungeons.size());
uint32 lsize = uint32(lock.size());
bool isFirstReward = false;
bool isShortageEligible = false;
lfg::LfgBlackListMap map;

TC_LOG_DEBUG("lfg", "SMSG_LFG_PLAYER_INFO %s", GetPlayerInfo().c_str());
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));

data << uint8(randomDungeons.size()); // Random Dungeon count
for (lfg::LfgDungeonSet::const_iterator it = randomDungeons.begin(); it != randomDungeons.end(); ++it)
{
data << uint32(*it); // Dungeon Entry (id + type)
lfg::LfgReward const* reward = sLFGMgr->GetRandomDungeonReward(*it, level);
Quest const* quest = nullptr;
bool done = false;
if (reward)
{
quest = sObjectMgr->GetQuestTemplate(reward->firstQuest);
if (quest)
{
done = !GetPlayer()->CanRewardQuest(quest, false);
if (done)
quest = sObjectMgr->GetQuestTemplate(reward->otherQuest);
}
}

data << uint8(done);
data << uint32(0); // currencyQuantity
data << uint32(0); // some sort of overall cap/weekly cap
data << uint32(0); // currencyID
data << uint32(0); // tier1Quantity
data << uint32(0); // tier1Limit
data << uint32(0); // overallQuantity
data << uint32(0); // overallLimit
data << uint32(0); // periodPurseQuantity
data << uint32(0); // periodPurseLimit
data << uint32(0); // purseQuantity
data << uint32(0); // purseLimit
data << uint32(0); // some sort of reward for completion
data << uint32(0); // completedEncounters
data << uint8(0); // Call to Arms eligible

for (uint32 i = 0; i < 3; ++i)
{
data << uint32(0); // Call to Arms Role
//if (role)
// BuildQuestReward(data, ctaRoleQuest, GetPlayer());
}
WorldPackets::LFG::LFGPlayerInfo info;

if (quest)
BuildQuestReward(data, quest, GetPlayer());
else
{
data << uint32(0); // Money
data << uint32(0); // XP
data << uint8(0); // Reward count
}
}
// handle

BuildPlayerLockDungeonBlock(data, lock);
SendPacket(&data);
BuildLfgBlackListBlock(map, GetPlayer()); // Obv temp
SendPacket(info.Write());
}

void WorldSession::SendLfgPartyLockInfo()
{
ObjectGuid guid = GetPlayer()->GetGUID();
Group* group = GetPlayer()->GetGroup();
if (!group)
return;
WorldPackets::LFG::LFGPartyInfo partyInfo;
lfg::LfgBlackListMap::const_iterator bl;

// Get the locked dungeons of the other party members
lfg::LfgLockPartyMap lockMap;
for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
{
Player* plrg = itr->GetSource();
if (!plrg)
continue;

ObjectGuid pguid = plrg->GetGUID();
if (pguid == guid)
continue;

lockMap[pguid] = sLFGMgr->GetLockedDungeons(pguid);
}
TC_LOG_DEBUG("lfg", "SMSG_LFG_PARTY_INFO %s", GetPlayerInfo().c_str());

uint32 size = 0;
for (lfg::LfgLockPartyMap::const_iterator it = lockMap.begin(); it != lockMap.end(); ++it)
size += 8 + 4 + uint32(it->second.size()) * (4 + 4 + 4 + 4);
// handle

TC_LOG_DEBUG("lfg", "SMSG_LFG_PARTY_INFO %s", GetPlayerInfo().c_str());
WorldPacket data(SMSG_LFG_PARTY_INFO, 1 + size);
BuildPartyLockDungeonBlock(data, lockMap);
SendPacket(&data);
SendPacket(partyInfo.Write());
}

void WorldSession::HandleDFGetJoinStatus(WorldPacket& /*recvData*/)
@@ -393,42 +350,23 @@ void WorldSession::SendLfgUpdateStatus(lfg::LfgUpdateData const& updateData, boo
TC_LOG_DEBUG("lfg", "SMSG_LFG_UPDATE_STATUS %s updatetype: %u, party %s",
GetPlayerInfo().c_str(), updateData.updateType, party ? "true" : "false");

WorldPacket data(SMSG_LFG_UPDATE_STATUS, 1 + 8 + 3 + 2 + 1 + updateData.comment.length() + 4 + 4 + 1 + 1 + 1 + 4 + size);
data.WriteBit(guid[1]);
data.WriteBit(party);
data.WriteBits(size, 24);
data.WriteBit(guid[6]);
data.WriteBit(size > 0); // Extra info
data.WriteBits(updateData.comment.length(), 9);
data.WriteBit(guid[4]);
data.WriteBit(guid[7]);
data.WriteBit(guid[2]);
data.WriteBit(join); // LFG Join
data.WriteBit(guid[0]);
data.WriteBit(guid[3]);
data.WriteBit(guid[5]);
data.WriteBit(queued); // Join the queue

data << uint8(updateData.updateType); // Lfg Update type
data.WriteString(updateData.comment);
data << uint32(queueId); // Queue Id
data << uint32(joinTime); // Join date
data.WriteByteSeq(guid[6]);
for (uint8 i = 0; i < 3; ++i)
data << uint8(0); // unk - Always 0

data.WriteByteSeq(guid[1]);
data.WriteByteSeq(guid[2]);
data.WriteByteSeq(guid[4]);
data.WriteByteSeq(guid[3]);
data.WriteByteSeq(guid[5]);
data.WriteByteSeq(guid[0]);
data << uint32(3);
data.WriteByteSeq(guid[7]);
for (lfg::LfgDungeonSet::const_iterator it = updateData.dungeons.begin(); it != updateData.dungeons.end(); ++it)
data << uint32(*it);

SendPacket(&data);
WorldPackets::LFG::LFGUpdateStatus updateStatus;

updateStatus.IsParty = party;
updateStatus.Joined = join;
updateStatus.Queued = queued;
updateStatus.SubType = updateData.updateType;
updateStatus.Comment = updateData.comment;

// Needs
// Slots
// SuspendedPlayers
// RideTicket
// Reason
// NotifyUI
// RequestedRoles

SendPacket(updateStatus.Write());
}

void WorldSession::SendLfgRoleCheckUpdate(lfg::LfgRoleCheck const& roleCheck)
@@ -475,7 +413,7 @@ void WorldSession::SendLfgRoleCheckUpdate(lfg::LfgRoleCheck const& roleCheck)
data << uint8(player ? player->getLevel() : 0);// Level
}
}
SendPacket(&data);
SendPacket(/*packet.*/);
}

void WorldSession::HandleLFGJoinResultOpcode(WorldPackets::LFG::LFGJoinResult& packet)
@@ -487,7 +425,7 @@ void WorldSession::HandleLFGJoinResultOpcode(WorldPackets::LFG::LFGJoinResult& p
packet.Result = joinData.result;
packet.ResultDetail = joinData.state;

// Blacklist
BuildLfgBlackListBlock(, 0);
// Ride Ticket

SendPacket(packet.Write());
@@ -523,11 +461,12 @@ void WorldSession::SendLfgPlayerReward(lfg::LfgPlayerRewardData const& rewardDat

uint8 itemNum = rewardData.quest->GetRewItemsCount() + rewardData.quest->GetRewCurrencyCount();

WorldPacket data(SMSG_LFG_PLAYER_REWARD, 4 + 4 + 1 + 4 + 4 + 4 + 4 + 4 + 1 + itemNum * (4 + 4 + 4));
data << uint32(rewardData.rdungeonEntry); // Random Dungeon Finished
data << uint32(rewardData.sdungeonEntry); // Dungeon Finished
BuildQuestReward(data, rewardData.quest, GetPlayer());
SendPacket(&data);
WorldPackets::LFG::LFGPlayerReward reward;

// handle

BuildQuestReward(rewardData.quest, GetPlayer());
SendPacket(/*packet.*/);
}

void WorldSession::SendLfgBootProposalUpdate(lfg::LfgPlayerBoot const& boot)
@@ -563,7 +502,7 @@ void WorldSession::SendLfgBootProposalUpdate(lfg::LfgPlayerBoot const& boot)
data << uint32(secsleft); // Time Left
data << uint32(lfg::LFG_GROUP_KICK_VOTES_NEEDED); // Needed Votes
data << boot.reason.c_str(); // Kick reason
SendPacket(&data);
SendPacket(/*packet.*/);
}

void WorldSession::SendLfgUpdateProposal(lfg::LfgProposal const& proposal)
@@ -600,17 +539,8 @@ void WorldSession::SendLfgUpdateProposal(lfg::LfgProposal const& proposal)
ObjectGuid guid1 = guid;
ObjectGuid guid2 = gguid;

data.WriteBit(guid2[4]);
data.WriteBit(guid1[3]);
data.WriteBit(guid1[7]);
data.WriteBit(guid1[0]);
data.WriteBit(guid2[1]);
data.WriteBit(silent);
data.WriteBit(guid1[4]);
data.WriteBit(guid1[5]);
data.WriteBit(guid2[3]);
data.WriteBits(proposal.players.size(), 23);
data.WriteBit(guid2[7]);

for (lfg::LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
{
@@ -632,46 +562,20 @@ void WorldSession::SendLfgUpdateProposal(lfg::LfgProposal const& proposal)
data.WriteBit(it->first == guid);
}

data.WriteBit(guid2[5]);
data.WriteBit(guid1[6]);
data.WriteBit(guid2[2]);
data.WriteBit(guid2[6]);
data.WriteBit(guid1[2]);
data.WriteBit(guid1[1]);
data.WriteBit(guid2[0]);

data.WriteByteSeq(guid1[5]);
data.WriteByteSeq(guid2[3]);
data.WriteByteSeq(guid2[6]);
data.WriteByteSeq(guid1[6]);
data.WriteByteSeq(guid1[0]);
data.WriteByteSeq(guid2[5]);
data.WriteByteSeq(guid1[1]);

for (lfg::LfgProposalPlayerContainer::const_iterator it = proposal.players.begin(); it != proposal.players.end(); ++it)
{
lfg::LfgProposalPlayer const& player = it->second;
data << uint32(player.role);
}

data.WriteByteSeq(guid2[7]);
data.WriteByteSeq(guid1[4]);
data.WriteByteSeq(guid2[0]);
data.WriteByteSeq(guid2[1]);
data.WriteByteSeq(guid1[2]);
data.WriteByteSeq(guid1[7]);
data.WriteByteSeq(guid2[2]);
data.WriteByteSeq(guid1[3]);
data.WriteByteSeq(guid2[4]);

SendPacket(&data);
SendPacket(/*packet.*/);
}

void WorldSession::SendLfgDisabled()
{
TC_LOG_DEBUG("lfg", "SMSG_LFG_DISABLED %s", GetPlayerInfo().c_str());
WorldPacket data(SMSG_LFG_DISABLED, 0);
SendPacket(&data);
SendPacket(/*packet.*/);
}

void WorldSession::SendLfgOfferContinue(uint32 dungeonEntry)
@@ -680,7 +584,7 @@ void WorldSession::SendLfgOfferContinue(uint32 dungeonEntry)
GetPlayerInfo().c_str(), dungeonEntry);
WorldPacket data(SMSG_LFG_OFFER_CONTINUE, 4);
data << uint32(dungeonEntry);
SendPacket(&data);
SendPacket(/*packet.*/);
}

void WorldSession::SendLfgTeleportError(uint8 err)
@@ -689,5 +593,5 @@ void WorldSession::SendLfgTeleportError(uint8 err)
GetPlayerInfo().c_str(), err);
WorldPacket data(SMSG_LFG_TELEPORT_DENIED, 4);
data << uint32(err); // Error
SendPacket(&data);
SendPacket(/*packet.*/);
}
@@ -329,6 +329,7 @@ namespace WorldPackets
class LFGQueueStatus;

class DfGetSystemInfo;
class DfJoin;
}

namespace Loot
@@ -1473,6 +1474,7 @@ class WorldSession
// new lfg stuff
void HandleLFGJoinResultOpcode(WorldPackets::LFG::LFGJoinResult& packet);
void HandleLFGQueueStatusOpcode(WorldPackets::LFG::LFGQueueStatus& packet);
void HandleDfJoinOpcode(WorldPackets::LFG::DfJoin& packet);

void SendLfgUpdateStatus(lfg::LfgUpdateData const& updateData, bool party);
void SendLfgRoleChosen(ObjectGuid guid, uint8 roles);