mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-13 04:37:36 +01:00
Give MasterClasser Acheivement on completion of any of the series quests, not just the final. (#10086)
* Adding check to give master classer acheivement on any master classer series quest completion fixes #9461 * Fixing concat bug by assigning the variable after concatenation. * Fixing retry query.
This commit is contained in:
@@ -1403,8 +1403,44 @@ describe('Group Model', () => {
|
|||||||
updatedLeader,
|
updatedLeader,
|
||||||
updatedParticipatingMember,
|
updatedParticipatingMember,
|
||||||
] = await Promise.all([
|
] = await Promise.all([
|
||||||
User.findById(questLeader._id),
|
User.findById(questLeader._id).exec(),
|
||||||
User.findById(participatingMember._id),
|
User.findById(participatingMember._id).exec(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
expect(updatedLeader.achievements.lostMasterclasser).to.eql(true);
|
||||||
|
expect(updatedParticipatingMember.achievements.lostMasterclasser).to.not.eql(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('gives out super awesome Masterclasser achievement when quests done out of order', async () => {
|
||||||
|
quest = questScrolls.lostMasterclasser1;
|
||||||
|
party.quest.key = quest.key;
|
||||||
|
|
||||||
|
questLeader.achievements.quests = {
|
||||||
|
mayhemMistiflying1: 1,
|
||||||
|
mayhemMistiflying2: 1,
|
||||||
|
mayhemMistiflying3: 1,
|
||||||
|
stoikalmCalamity1: 1,
|
||||||
|
stoikalmCalamity2: 1,
|
||||||
|
stoikalmCalamity3: 1,
|
||||||
|
taskwoodsTerror1: 1,
|
||||||
|
taskwoodsTerror2: 1,
|
||||||
|
taskwoodsTerror3: 1,
|
||||||
|
dilatoryDistress1: 1,
|
||||||
|
dilatoryDistress2: 1,
|
||||||
|
dilatoryDistress3: 1,
|
||||||
|
lostMasterclasser2: 1,
|
||||||
|
lostMasterclasser3: 1,
|
||||||
|
lostMasterclasser4: 1,
|
||||||
|
};
|
||||||
|
await questLeader.save();
|
||||||
|
await party.finishQuest(quest);
|
||||||
|
|
||||||
|
let [
|
||||||
|
updatedLeader,
|
||||||
|
updatedParticipatingMember,
|
||||||
|
] = await Promise.all([
|
||||||
|
User.findById(questLeader._id).exec(),
|
||||||
|
User.findById(participatingMember._id).exec(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
expect(updatedLeader.achievements.lostMasterclasser).to.eql(true);
|
expect(updatedLeader.achievements.lostMasterclasser).to.eql(true);
|
||||||
|
|||||||
@@ -792,16 +792,15 @@ function _getUserUpdateForQuestReward (itemToAward, allAwardedItems) {
|
|||||||
|
|
||||||
async function _updateUserWithRetries (userId, updates, numTry = 1, query = {}) {
|
async function _updateUserWithRetries (userId, updates, numTry = 1, query = {}) {
|
||||||
query._id = userId;
|
query._id = userId;
|
||||||
return await User.update(query, updates).exec()
|
try {
|
||||||
.then((raw) => {
|
return await User.update(query, updates).exec();
|
||||||
return raw;
|
} catch (err) {
|
||||||
}).catch((err) => {
|
if (numTry < MAX_UPDATE_RETRIES) {
|
||||||
if (numTry < MAX_UPDATE_RETRIES) {
|
return _updateUserWithRetries(userId, updates, ++numTry, query);
|
||||||
return _updateUserWithRetries(userId, updates, ++numTry, query);
|
} else {
|
||||||
} else {
|
throw err;
|
||||||
throw err;
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Participants: Grant rewards & achievements, finish quest.
|
// Participants: Grant rewards & achievements, finish quest.
|
||||||
@@ -851,29 +850,37 @@ schema.methods.finishQuest = async function finishQuest (quest) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (questK === 'lostMasterclasser4') {
|
let masterClasserQuests = [
|
||||||
|
'dilatoryDistress1',
|
||||||
|
'dilatoryDistress2',
|
||||||
|
'dilatoryDistress3',
|
||||||
|
'mayhemMistiflying1',
|
||||||
|
'mayhemMistiflying2',
|
||||||
|
'mayhemMistiflying3',
|
||||||
|
'stoikalmCalamity1',
|
||||||
|
'stoikalmCalamity2',
|
||||||
|
'stoikalmCalamity3',
|
||||||
|
'taskwoodsTerror1',
|
||||||
|
'taskwoodsTerror2',
|
||||||
|
'taskwoodsTerror3',
|
||||||
|
'lostMasterclasser1',
|
||||||
|
'lostMasterclasser2',
|
||||||
|
'lostMasterclasser3',
|
||||||
|
'lostMasterclasser4',
|
||||||
|
];
|
||||||
|
|
||||||
|
if (masterClasserQuests.includes(questK)) {
|
||||||
let lostMasterclasserQuery = {
|
let lostMasterclasserQuery = {
|
||||||
'achievements.lostMasterclasser': {$ne: true},
|
'achievements.lostMasterclasser': {$ne: true},
|
||||||
'achievements.quests.mayhemMistiflying1': {$gt: 0},
|
|
||||||
'achievements.quests.mayhemMistiflying2': {$gt: 0},
|
|
||||||
'achievements.quests.mayhemMistiflying3': {$gt: 0},
|
|
||||||
'achievements.quests.stoikalmCalamity1': {$gt: 0},
|
|
||||||
'achievements.quests.stoikalmCalamity2': {$gt: 0},
|
|
||||||
'achievements.quests.stoikalmCalamity3': {$gt: 0},
|
|
||||||
'achievements.quests.taskwoodsTerror1': {$gt: 0},
|
|
||||||
'achievements.quests.taskwoodsTerror2': {$gt: 0},
|
|
||||||
'achievements.quests.taskwoodsTerror3': {$gt: 0},
|
|
||||||
'achievements.quests.dilatoryDistress1': {$gt: 0},
|
|
||||||
'achievements.quests.dilatoryDistress2': {$gt: 0},
|
|
||||||
'achievements.quests.dilatoryDistress3': {$gt: 0},
|
|
||||||
'achievements.quests.lostMasterclasser1': {$gt: 0},
|
|
||||||
'achievements.quests.lostMasterclasser2': {$gt: 0},
|
|
||||||
'achievements.quests.lostMasterclasser3': {$gt: 0},
|
|
||||||
};
|
};
|
||||||
|
masterClasserQuests.forEach(questName => {
|
||||||
|
lostMasterclasserQuery[`achievements.quests.${questName}`] = {$gt: 0};
|
||||||
|
});
|
||||||
let lostMasterclasserUpdate = {
|
let lostMasterclasserUpdate = {
|
||||||
$set: {'achievements.lostMasterclasser': true},
|
$set: {'achievements.lostMasterclasser': true},
|
||||||
};
|
};
|
||||||
promises.concat(participants.map(userId => {
|
|
||||||
|
promises = promises.concat(participants.map(userId => {
|
||||||
return _updateUserWithRetries(userId, lostMasterclasserUpdate, null, lostMasterclasserQuery);
|
return _updateUserWithRetries(userId, lostMasterclasserUpdate, null, lostMasterclasserQuery);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user