From 043ffeecef286597e327b39d00775fe16a625a08 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Mon, 23 Jun 2025 22:12:05 +0200 Subject: [PATCH] fix: use shared count for calendar day indecies I'm not sure if this was always this way and I was just really confused when I initially implemented this, or if this was changed in a later version, but at least now it seems to be tracking everything correctly for 38.6.0, just not entirely sure what "ActivatedChallenges" is for. --- .../api/completeCalendarEventController.ts | 33 +++++++++---------- src/services/inventoryService.ts | 15 +++++++++ src/services/missionInventoryUpdateService.ts | 21 ++++++++++-- 3 files changed, 49 insertions(+), 20 deletions(-) diff --git a/src/controllers/api/completeCalendarEventController.ts b/src/controllers/api/completeCalendarEventController.ts index 20c8abb3..d540f306 100644 --- a/src/controllers/api/completeCalendarEventController.ts +++ b/src/controllers/api/completeCalendarEventController.ts @@ -1,4 +1,4 @@ -import { getCalendarProgress, getInventory } from "@/src/services/inventoryService"; +import { checkCalendarChallengeCompletion, getCalendarProgress, getInventory } from "@/src/services/inventoryService"; import { getAccountIdForRequest } from "@/src/services/loginService"; import { handleStoreItemAcquisition } from "@/src/services/purchaseService"; import { getWorldState } from "@/src/services/worldStateService"; @@ -12,27 +12,26 @@ export const completeCalendarEventController: RequestHandler = async (req, res) const calendarProgress = getCalendarProgress(inventory); const currentSeason = getWorldState().KnownCalendarSeasons[0]; let inventoryChanges: IInventoryChanges = {}; - let dayIndex = 0; - for (const day of currentSeason.Days) { + let dayIndex = calendarProgress.SeasonProgress.LastCompletedDayIdx + 1; + for (; dayIndex != currentSeason.Days.length; ++dayIndex) { + const day = currentSeason.Days[dayIndex]; if (day.events.length == 0 || day.events[0].type != "CET_CHALLENGE") { - if (dayIndex == calendarProgress.SeasonProgress.LastCompletedDayIdx) { - if (day.events.length != 0) { - const selection = day.events[parseInt(req.query.CompletedEventIdx as string)]; - if (selection.type == "CET_REWARD") { - inventoryChanges = (await handleStoreItemAcquisition(selection.reward!, inventory)) - .InventoryChanges; - } else if (selection.type == "CET_UPGRADE") { - calendarProgress.YearProgress.Upgrades.push(selection.upgrade!); - } else if (selection.type != "CET_PLOT") { - throw new Error(`unexpected selection type: ${selection.type}`); - } + if (day.events.length != 0) { + const selection = day.events[parseInt(req.query.CompletedEventIdx as string)]; + if (selection.type == "CET_REWARD") { + inventoryChanges = (await handleStoreItemAcquisition(selection.reward!, inventory)) + .InventoryChanges; + } else if (selection.type == "CET_UPGRADE") { + calendarProgress.YearProgress.Upgrades.push(selection.upgrade!); + } else if (selection.type != "CET_PLOT") { + throw new Error(`unexpected selection type: ${selection.type}`); } - break; } - ++dayIndex; + break; } } - calendarProgress.SeasonProgress.LastCompletedDayIdx++; + calendarProgress.SeasonProgress.LastCompletedDayIdx = dayIndex; + checkCalendarChallengeCompletion(calendarProgress, currentSeason); await inventory.save(); res.json({ InventoryChanges: inventoryChanges, diff --git a/src/services/inventoryService.ts b/src/services/inventoryService.ts index a93dbaf6..828bb665 100644 --- a/src/services/inventoryService.ts +++ b/src/services/inventoryService.ts @@ -84,6 +84,7 @@ import { getRandomElement, getRandomInt, getRandomWeightedReward, SRng } from ". import { createMessage } from "./inboxService"; import { getMaxStanding, getMinStanding } from "@/src/helpers/syndicateStandingHelper"; import { getNightwaveSyndicateTag, getWorldState } from "./worldStateService"; +import { ICalendarSeason } from "@/src/types/worldStateTypes"; import { generateNemesisProfile, INemesisProfile } from "../helpers/nemesisHelpers"; import { TAccountDocument } from "./loginService"; import { unixTimesInMs } from "../constants/timeConstants"; @@ -2029,6 +2030,20 @@ export const getCalendarProgress = (inventory: TInventoryDatabaseDocument): ICal return inventory.CalendarProgress; }; +export const checkCalendarChallengeCompletion = ( + calendarProgress: ICalendarProgress, + currentSeason: ICalendarSeason +): void => { + const dayIndex = calendarProgress.SeasonProgress.LastCompletedDayIdx + 1; + if (calendarProgress.SeasonProgress.LastCompletedChallengeDayIdx >= dayIndex) { + const day = currentSeason.Days[dayIndex]; + if (day.events.length != 0 && day.events[0].type == "CET_CHALLENGE") { + //logger.debug(`already completed the challenge, skipping ahead`); + calendarProgress.SeasonProgress.LastCompletedDayIdx++; + } + } +}; + export const giveNemesisWeaponRecipe = ( inventory: TInventoryDatabaseDocument, weaponType: string, diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 7ee1b3c5..21880195 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -33,6 +33,7 @@ import { addSkin, addStanding, applyClientEquipmentUpdates, + checkCalendarChallengeCompletion, combineInventoryChanges, generateRewardSeed, getCalendarProgress, @@ -67,7 +68,15 @@ import { } from "@/src/helpers/nemesisHelpers"; import { Loadout } from "../models/inventoryModels/loadoutModel"; import { ILoadoutConfigDatabase } from "../types/saveLoadoutTypes"; -import { getLiteSortie, getSortie, idToBountyCycle, idToDay, idToWeek, pushClassicBounties } from "./worldStateService"; +import { + getLiteSortie, + getSortie, + getWorldState, + idToBountyCycle, + idToDay, + idToWeek, + pushClassicBounties +} from "./worldStateService"; import { config } from "./configService"; import libraryDailyTasks from "@/static/fixed_responses/libraryDailyTasks.json"; import { ISyndicateMissionInfo } from "../types/worldStateTypes"; @@ -620,12 +629,18 @@ export const addMissionInventoryUpdates = async ( } case "CalendarProgress": { const calendarProgress = getCalendarProgress(inventory); - for (const progress of value) { + const currentSeason = getWorldState().KnownCalendarSeasons[0]; + const index = currentSeason.Days.findIndex( + x => x.events[0].challenge == value[value.length - 1].challenge + ); + calendarProgress.SeasonProgress.LastCompletedChallengeDayIdx = index; + checkCalendarChallengeCompletion(calendarProgress, currentSeason); + /*for (const progress of value) { const challengeName = progress.challenge.substring(progress.challenge.lastIndexOf("/") + 1); calendarProgress.SeasonProgress.LastCompletedDayIdx++; calendarProgress.SeasonProgress.LastCompletedChallengeDayIdx++; calendarProgress.SeasonProgress.ActivatedChallenges.push(challengeName); - } + }*/ break; } case "duviriCaveOffers": {