Fix quest statusTimers ending up with named keys (!254)

- Don't depend on status being non-numeric to fix statusTimers
- Cleaner tracking of fix counts in `updateProfileQuestDataValues`
- Better number checking for quest status, since `0` is a valid status, but fails the `!Number()` check
- Cleanup of quest status setting in `processAlteredQuests`

Co-authored-by: DrakiaXYZ <565558+TheDgtl@users.noreply.github.com>
Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/254
Co-authored-by: DrakiaXYZ <drakiaxyz@noreply.dev.sp-tarkov.com>
Co-committed-by: DrakiaXYZ <drakiaxyz@noreply.dev.sp-tarkov.com>
This commit is contained in:
DrakiaXYZ 2024-03-09 08:49:26 +00:00 committed by chomp
parent 75a8007842
commit f95ed922a4
3 changed files with 26 additions and 23 deletions

View File

@ -433,7 +433,7 @@ export class InraidController
pmcQuest.statusTimers = quest.statusTimers;
for (const statusTimerKey in quest.statusTimers)
{
if (!Number(statusTimerKey))
if (Number.isNaN(parseInt(statusTimerKey)))
{
quest.statusTimers[QuestStatus[statusTimerKey]] = quest.statusTimers[statusTimerKey];
delete quest.statusTimers[statusTimerKey];

View File

@ -467,8 +467,8 @@ export class InRaidHelper
// Set quest as AvailableAfter and set timer
const timestamp = this.timeUtil.getTimestamp() + afsRequirement.availableAfter;
lockedQuest.availableAfter = timestamp;
lockedQuest.statusTimers.AvailableAfter = timestamp;
lockedQuest.status = 9;
lockedQuest.statusTimers[QuestStatus.AvailableAfter] = this.timeUtil.getTimestamp();
lockedQuest.status = QuestStatus.AvailableAfter;
}
}
}

View File

@ -544,7 +544,8 @@ export class ProfileFixerService
return;
}
const fixes = new Map<any, number>();
const fixes: Record<any, number> = {};
const timerFixes: Record<string, number> = {};
const questsToDelete: IQuestStatus[] = [];
const fullProfile = this.profileHelper.getFullProfile(profile.sessionId);
const isDevProfile = fullProfile?.info.edition.toLowerCase() === "spt developer";
@ -559,28 +560,23 @@ export class ProfileFixerService
continue;
}
if (quest.status && !Number(quest.status))
if (quest.status && Number.isNaN(parseInt(<string><unknown>quest.status)))
{
if (fixes.has(quest.status))
{
fixes.set(quest.status, fixes.get(quest.status) + 1);
}
else
{
fixes.set(quest.status, 1);
}
fixes[quest.status] = (fixes[quest.status] ?? 0) + 1;
const newQuestStatus = QuestStatus[quest.status];
quest.status = <QuestStatus><unknown>newQuestStatus;
}
for (const statusTimer in quest.statusTimers)
for (const statusTimer in quest.statusTimers)
{
if (Number.isNaN(parseInt(statusTimer)))
{
if (!Number(statusTimer))
{
const newKey = QuestStatus[statusTimer];
quest.statusTimers[newKey] = quest.statusTimers[statusTimer];
delete quest.statusTimers[statusTimer];
}
timerFixes[statusTimer] = (timerFixes[statusTimer] ?? 0) + 1;
const newKey = QuestStatus[statusTimer];
quest.statusTimers[newKey] = quest.statusTimers[statusTimer];
delete quest.statusTimers[statusTimer];
}
}
}
@ -590,11 +586,18 @@ export class ProfileFixerService
profile.Quests.splice(profile.Quests.indexOf(questToDelete), 1);
}
if (fixes.size > 0)
if (Object.keys(fixes).length > 0)
{
this.logger.debug(
`Updated quests values: ${
Array.from(fixes.entries()).map(([k, v]) => `(${k}: ${v} times)`).join(", ")
`Updated quests values: ${Object.entries(fixes).map(([k, v]) => `(${k}: ${v} times)`).join(", ")}`,
);
}
if (Object.keys(timerFixes).length > 0)
{
this.logger.debug(
`Updated statusTimers values: ${
Object.entries(timerFixes).map(([k, v]) => `(${k}: ${v} times)`).join(", ")
}`,
);
}