diff --git a/test/api/v3/unit/models/group.test.js b/test/api/v3/unit/models/group.test.js index a2db74fcc2..db44574a8b 100644 --- a/test/api/v3/unit/models/group.test.js +++ b/test/api/v3/unit/models/group.test.js @@ -391,6 +391,20 @@ describe('Group Model', () => { expect(party.quest.progress.collect.soapBars).to.eq(5); }); + it('does not drop an item if not need when on a collection quest', async () => { + party.quest.key = 'dilatoryDistress1'; + party.quest.active = false; + await party.startQuest(questLeader); + party.quest.progress.collect.fireCoral = 20; + await party.save(); + + await Group.processQuestProgress(participatingMember, progress); + + party = await Group.findOne({_id: party._id}); + + expect(party.quest.progress.collect.fireCoral).to.eq(20); + }); + it('sends a chat message about progress', async () => { await Group.processQuestProgress(participatingMember, progress); diff --git a/website/server/models/group.js b/website/server/models/group.js index a5db42a748..65b85e4b47 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -874,8 +874,17 @@ schema.methods._processCollectionQuest = async function processCollectionQuest ( let quest = questScrolls[group.quest.key]; let itemsFound = {}; + const possibleItemKeys = Object.keys(quest.collect).filter((key) => { + return group.quest.progress.collect[key] !== quest.collect[key].count; + }); + + const possibleItemsToCollect = possibleItemKeys.reduce((accumulator, current, index) => { + accumulator[possibleItemKeys[index]] = quest.collect[current]; + return accumulator; + }, {}); + _.times(progress.collectedItems, () => { - let item = shared.randomVal(quest.collect, {key: true}); + let item = shared.randomVal(possibleItemsToCollect, {key: true}); if (!itemsFound[item]) { itemsFound[item] = 0;