/// <summary> /// Build and Send LFG lock player info and reward /// </summary> /// <param name="plr">Player</param> void LFGMgr::SendLfgPlayerInfo(Player *plr) { uint32 rsize = 0; uint32 lsize = 0; LfgDungeonSet *randomlist = GetRandomDungeons(plr->getLevel(), plr->GetSession()->Expansion()); LfgLockStatusSet *lockSet = GetPlayerLockStatusDungeons(plr, m_DungeonsMap[LFG_ALL_DUNGEONS]); 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 * (4 + 4)); if (!randomlist) { data << uint8(0); } else { data << uint8(randomlist->size()); // Random Dungeon count for (LfgDungeonSet::iterator it = randomlist->begin(); it != randomlist->end(); ++it) { data << uint32(*it); // Entry BuildRewardBlock(data, *it, plr); } randomlist->clear(); delete randomlist; } BuildPlayerLockDungeonBlock(data, lockSet); plr->GetSession()->SendPacket(&data); }
void WorldSession::HandleLfgJoinOpcode(WorldPacket &recv_data) { if (!sWorld.getBoolConfig(CONFIG_DUNGEON_FINDER_ENABLE)) { recv_data.rpos(recv_data.wpos()); sLog.outDebug("CMSG_LFG_JOIN [" UI64FMTD "] Dungeon finder disabled", GetPlayer()->GetGUID()); return; } if (sLFGMgr.isJoining(GetPlayer()->GetGUID())) { recv_data.rpos(recv_data.wpos()); sLog.outDebug("CMSG_LFG_JOIN [" UI64FMTD "] already Joining. Ignoring", GetPlayer()->GetGUID()); return; } uint8 numDungeons; uint32 dungeon; uint32 roles; std::string comment; LfgDungeonSet newDungeons; recv_data >> roles; recv_data.read_skip<uint8>(); // unk - always 0 recv_data.read_skip<uint8>(); // unk - always 0 recv_data >> numDungeons; if (!numDungeons) { sLog.outDebug("CMSG_LFG_JOIN [" UI64FMTD "] no dungeons selected", GetPlayer()->GetGUID()); recv_data.rpos(recv_data.wpos()); return; } for (int8 i = 0 ; i < numDungeons; ++i) { recv_data >> dungeon; newDungeons.insert((dungeon & 0x00FFFFFF)); // remove the type from the dungeon entry } recv_data >> numDungeons; // unk - always 3 for (int8 i = 0 ; i < numDungeons; ++i) recv_data.read_skip<uint8>(); // unk - always 0 recv_data >> comment; LfgDungeonSet* dungeons = GetPlayer()->GetLfgDungeons(); Group* grp = GetPlayer()->GetGroup(); bool isRandomDungeon = dungeons->size() == 1 && sLFGMgr.isRandomDungeon(*dungeons->begin()); bool isCurrentDungeon = newDungeons.size() == 1 && grp && grp->isLFGGroup() && grp->GetLfgDungeonEntry() == (*newDungeons.begin()); if (!isRandomDungeon || !isCurrentDungeon) // is not offer to continue - clear old dungeons and use new dungeons { dungeons->clear(); for (LfgDungeonSet::const_iterator it = newDungeons.begin(); it != newDungeons.end(); ++it) dungeons->insert(*it); } GetPlayer()->SetLfgRoles(uint8(roles)); GetPlayer()->SetLfgComment(comment); sLog.outDebug("CMSG_LFG_JOIN [" UI64FMTD "] as group: %u - Dungeons: %u", GetPlayer()->GetGUID(), grp ? 1 : 0, uint8(newDungeons.size())); newDungeons.clear(); sLFGMgr.Join(GetPlayer()); }
void WorldSession::HandleLfgPlayerLockInfoRequestOpcode(WorldPacket &/*recv_data*/) { sLog.outDebug("CMSG_LFD_PLAYER_LOCK_INFO_REQUEST [" UI64FMTD "]", GetPlayer()->GetGUID()); uint32 rsize = 0; uint32 lsize = 0; 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 [" UI64FMTD "]", GetPlayer()->GetGUID()); 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; uint8 done; data << uint8(randomlist->size()); // Random Dungeon count for (LfgDungeonSet::iterator it = randomlist->begin(); it != randomlist->end(); ++it) { data << uint32(*it); // Entry reward = sLFGMgr.GetRandomDungeonReward(*it, GetPlayer()->getLevel()); qRew = NULL; if (reward) { qRew = sObjectMgr.GetQuestTemplate(reward->reward[0].questId); if (qRew) { done = !GetPlayer()->CanRewardQuest(qRew,false); if (done) qRew = sObjectMgr.GetQuestTemplate(reward->reward[1].questId); } } if (qRew) { data << uint8(done); data << uint32(qRew->GetRewOrReqMoney()); data << uint32(qRew->XPValue(GetPlayer())); data << uint32(reward->reward[done].variableMoney); data << uint32(reward->reward[done].variableXP); data << uint8(qRew->GetRewItemsCount()); if (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 << uint8(0); data << uint32(0); data << uint32(0); data << uint32(0); data << uint32(0); data << uint8(0); } } randomlist->clear(); delete randomlist; } BuildPlayerLockDungeonBlock(data, lockSet); SendPacket(&data); }