@@ -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. */ );
}