void LFGMgr::SendLFGReward(Player* player) { LFGDungeonEntry const* dungeon = *player->GetLFGState()->GetDungeons()->begin(); if (!dungeon || dungeon->type != LFG_TYPE_RANDOM_DUNGEON) { DEBUG_LOG("LFGMgr::RewardDungeonDoneFor: %u dungeon is not random", player->GetObjectGuid().GetCounter()); return; } // Update achievements // if (dungeon->difficulty == DUNGEON_DIFFICULTY_HEROIC) // player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS, 1); LFGReward const* reward = GetRandomDungeonReward(dungeon, player); if (!reward) return; uint8 index = 0; Quest const* qReward = sObjectMgr.GetQuestTemplate(reward->reward[index].questId); if (!qReward) return; // if we can take the quest, means that we haven't done this kind of "run", IE: First Heroic Random of Day. if (player->CanRewardQuest(qReward,false)) player->RewardQuest(qReward,0,NULL,false); else { index = 1; qReward = sObjectMgr.GetQuestTemplate(reward->reward[index].questId); if (!qReward) return; // we give reward without informing client (retail does this) player->RewardQuest(qReward,0,NULL,false); } // Give rewards DEBUG_LOG("LFGMgr::RewardDungeonDoneFor: %u done dungeon %u, %s previously done.", player->GetObjectGuid().GetCounter(), dungeon->ID, index > 0 ? " " : " not"); player->GetSession()->SendLfgPlayerReward(dungeon, reward, qReward, index == 0); }
/// <summary> /// Build Reward packet structure for a given dungeon /// </summary> /// <param name="data">WorldPacket</param> /// <param name="dungeon">Dungeon entry</param> /// <param name="plr">Player</param> void LFGMgr::BuildRewardBlock(WorldPacket &data, uint32 dungeon, Player *plr) { bool done = plr->m_lookingForGroup.isDungeonDone(dungeon); LfgReward *reward = GetRandomDungeonReward(dungeon, done, plr->getLevel()); if (!reward) return; data << uint8(done); if (data.GetOpcode() == SMSG_LFG_PLAYER_REWARD) data << uint32(reward->strangers); data << uint32(reward->baseMoney); data << uint32(reward->baseXP); data << uint32(reward->variableMoney); data << uint32(reward->variableXP); data << uint8(reward->itemId != 0); if (reward->itemId) { data << uint32(reward->itemId); data << uint32(reward->displayId); data << uint32(reward->stackCount); } }