0
0
mirror of https://github.com/sp-tarkov/server.git synced 2025-02-13 09:50:43 -05:00

Fix some quests failing twice (chemical part 4), reducing rep twice as much as it should

Quest failure is handled by client now, no need to find and fail quests in server on quest completion

Move `getQuestsFailedByCompletingQuest()` to questHelper
This commit is contained in:
Dev 2024-01-14 12:29:58 +00:00
parent 4efb75ea58
commit 47a84e508b
2 changed files with 31 additions and 34 deletions

View File

@ -495,13 +495,6 @@ export class QuestController
completeQuestResponse,
);
// Check for linked failed + unrestartable quests
const questsToFail = this.getQuestsFailedByCompletingQuest(completedQuestId);
if (questsToFail?.length > 0)
{
this.failQuests(sessionID, pmcData, questsToFail, completeQuestResponse);
}
// Show modal on player screen
this.sendSuccessDialogMessageOnQuestComplete(sessionID, pmcData, completedQuestId, questRewards);
@ -509,7 +502,7 @@ export class QuestController
const questDelta = this.questHelper.getDeltaQuests(beforeQuests, this.getClientQuests(sessionID));
// Check newly available + failed quests for timegates and add them to profile
this.addTimeLockedQuestsToProfile(pmcData, [...questDelta, ...questsToFail], body.qid);
this.addTimeLockedQuestsToProfile(pmcData, [...questDelta], body.qid);
// Inform client of quest changes
completeQuestResponse.profileChanges[sessionID].quests.push(...questDelta);
@ -674,26 +667,6 @@ export class QuestController
}
}
/**
* Return a list of quests that would fail when supplied quest is completed
* @param completedQuestId quest completed id
* @returns array of IQuest objects
*/
protected getQuestsFailedByCompletingQuest(completedQuestId: string): IQuest[]
{
const questsInDb = this.questHelper.getQuestsFromDb();
return questsInDb.filter((quest) =>
{
// No fail conditions, exit early
if (!quest.conditions.Fail || quest.conditions.Fail.length === 0)
{
return false;
}
return quest.conditions.Fail.some((condition) => condition.target?.includes(completedQuestId));
});
}
/**
* Fail the provided quests
* Update quest in profile, otherwise add fresh quest object with failed status
@ -720,15 +693,19 @@ export class QuestController
const isActiveQuestInPlayerProfile = pmcData.Quests.find((y) => y.qid === questToFail._id);
if (isActiveQuestInPlayerProfile)
{
const failBody: IFailQuestRequestData = {
Action: "QuestFail",
qid: questToFail._id,
removeExcessItems: true,
};
this.questHelper.failQuest(pmcData, failBody, sessionID, output);
if (isActiveQuestInPlayerProfile.status !== QuestStatus.Fail)
{
const failBody: IFailQuestRequestData = {
Action: "QuestFail",
qid: questToFail._id,
removeExcessItems: true,
};
this.questHelper.failQuest(pmcData, failBody, sessionID, output);
}
}
else
{
// Failing an entirely new quest that doesnt exist in profile
const statusTimers = {};
statusTimers[QuestStatus.Fail] = this.timeUtil.getTimestamp();
const questData: IQuestStatus = {

View File

@ -1077,4 +1077,24 @@ export class QuestHelper
quests.splice(quests.indexOf(pmcQuestToReplaceStatus, 1));
}
}
/**
* Return a list of quests that would fail when supplied quest is completed
* @param completedQuestId quest completed id
* @returns array of IQuest objects
*/
public getQuestsFailedByCompletingQuest(completedQuestId: string): IQuest[]
{
const questsInDb = this.getQuestsFromDb();
return questsInDb.filter((quest) =>
{
// No fail conditions, exit early
if (!quest.conditions.Fail || quest.conditions.Fail.length === 0)
{
return false;
}
return quest.conditions.Fail.some((condition) => condition.target?.includes(completedQuestId));
});
}
}