diff --git a/src/controllers/api/entratiLabConquestModeController.ts b/src/controllers/api/entratiLabConquestModeController.ts index e5b6c818..c16595ee 100644 --- a/src/controllers/api/entratiLabConquestModeController.ts +++ b/src/controllers/api/entratiLabConquestModeController.ts @@ -1,6 +1,6 @@ import { toMongoDate } from "@/src/helpers/inventoryHelpers"; import { getJSONfromString } from "@/src/helpers/stringHelpers"; -import { getInventory } from "@/src/services/inventoryService"; +import { getInventory, updateEntratiVault } from "@/src/services/inventoryService"; import { getAccountIdForRequest } from "@/src/services/loginService"; import { RequestHandler } from "express"; @@ -11,26 +11,7 @@ export const entratiLabConquestModeController: RequestHandler = async (req, res) "EntratiVaultCountResetDate EntratiVaultCountLastPeriod EntratiLabConquestUnlocked EchoesHexConquestUnlocked EchoesHexConquestActiveFrameVariants EchoesHexConquestActiveStickers EntratiLabConquestActiveFrameVariants EntratiLabConquestCacheScoreMission EchoesHexConquestCacheScoreMission" ); const body = getJSONfromString(String(req.body)); - if (!inventory.EntratiVaultCountResetDate || Date.now() >= inventory.EntratiVaultCountResetDate.getTime()) { - const EPOCH = 1734307200 * 1000; // Mondays, amirite? - const day = Math.trunc((Date.now() - EPOCH) / 86400000); - const week = Math.trunc(day / 7); - const weekStart = EPOCH + week * 604800000; - const weekEnd = weekStart + 604800000; - inventory.EntratiVaultCountLastPeriod = 0; - inventory.EntratiVaultCountResetDate = new Date(weekEnd); - if (inventory.EntratiLabConquestUnlocked) { - inventory.EntratiLabConquestUnlocked = 0; - inventory.EntratiLabConquestCacheScoreMission = 0; - inventory.EntratiLabConquestActiveFrameVariants = []; - } - if (inventory.EchoesHexConquestUnlocked) { - inventory.EchoesHexConquestUnlocked = 0; - inventory.EchoesHexConquestCacheScoreMission = 0; - inventory.EchoesHexConquestActiveFrameVariants = []; - inventory.EchoesHexConquestActiveStickers = []; - } - } + updateEntratiVault(inventory); if (body.BuyMode) { inventory.EntratiVaultCountLastPeriod! += 2; if (body.IsEchoesDeepArchemedea) { @@ -51,7 +32,7 @@ export const entratiLabConquestModeController: RequestHandler = async (req, res) } await inventory.save(); res.json({ - EntratiVaultCountResetDate: toMongoDate(inventory.EntratiVaultCountResetDate), + EntratiVaultCountResetDate: toMongoDate(inventory.EntratiVaultCountResetDate!), EntratiVaultCountLastPeriod: inventory.EntratiVaultCountLastPeriod, EntratiLabConquestUnlocked: inventory.EntratiLabConquestUnlocked, EntratiLabConquestCacheScoreMission: inventory.EntratiLabConquestCacheScoreMission, diff --git a/src/services/inventoryService.ts b/src/services/inventoryService.ts index c6f16b08..acf7374d 100644 --- a/src/services/inventoryService.ts +++ b/src/services/inventoryService.ts @@ -2449,3 +2449,26 @@ export const giveNemesisPetRecipe = ( export const getEffectiveAvatarImageType = (inventory: TInventoryDatabaseDocument): string => { return inventory.ActiveAvatarImageType ?? "/Lotus/Types/StoreItems/AvatarImages/AvatarImageDefault"; }; + +export const updateEntratiVault = (inventory: TInventoryDatabaseDocument): void => { + if (!inventory.EntratiVaultCountResetDate || Date.now() >= inventory.EntratiVaultCountResetDate.getTime()) { + const EPOCH = 1734307200 * 1000; // Mondays, amirite? + const day = Math.trunc((Date.now() - EPOCH) / 86400000); + const week = Math.trunc(day / 7); + const weekStart = EPOCH + week * 604800000; + const weekEnd = weekStart + 604800000; + inventory.EntratiVaultCountLastPeriod = 0; + inventory.EntratiVaultCountResetDate = new Date(weekEnd); + if (inventory.EntratiLabConquestUnlocked) { + inventory.EntratiLabConquestUnlocked = 0; + inventory.EntratiLabConquestCacheScoreMission = 0; + inventory.EntratiLabConquestActiveFrameVariants = []; + } + if (inventory.EchoesHexConquestUnlocked) { + inventory.EchoesHexConquestUnlocked = 0; + inventory.EchoesHexConquestCacheScoreMission = 0; + inventory.EchoesHexConquestActiveFrameVariants = []; + inventory.EchoesHexConquestActiveStickers = []; + } + } +}; diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 7ae15e01..bccbed42 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -39,6 +39,7 @@ import { giveNemesisPetRecipe, giveNemesisWeaponRecipe, updateCurrency, + updateEntratiVault, updateSyndicate } from "@/src/services/inventoryService"; import { updateQuestKey } from "@/src/services/questService"; @@ -1084,6 +1085,22 @@ const droptableAliases: Record = { "/Lotus/Types/DropTables/WF1999DropTables/LasrianTankHardModeDropTable" }; +const isEligibleForCreditReward = (rewardInfo: IRewardInfo, missions: IMission, node: IRegion): boolean => { + // (E)SO should not give credits for only completing zone 1, in which case it has no rewardQualifications (https://onlyg.it/OpenWF/SpaceNinjaServer/issues/1823) + if (getRotations(rewardInfo).length == 0) { + return missions.Tag == "SolNode720"; // Netracells don't use rewardQualifications but probably should give credits anyway + } + // The rest here might not be needed anymore, but just to be sure we don't give undue credits... + return ( + node.missionIndex != 23 && // junction + node.missionIndex != 28 && // open world + missions.Tag != "SolNode761" && // the index + missions.Tag != "SolNode762" && // the index + missions.Tag != "SolNode763" && // the index + missions.Tag != "CrewBattleNode556" // free flight + ); +}; + //TODO: return type of partial missioninventoryupdate response export const addMissionRewards = async ( account: TAccountDocument, @@ -1176,15 +1193,7 @@ export const addMissionRewards = async ( const node = ExportRegions[missions.Tag]; //node based credit rewards for mission completion - if ( - node.missionIndex != 23 && // junction - node.missionIndex != 28 && // open world - missions.Tag != "SolNode761" && // the index - missions.Tag != "SolNode762" && // the index - missions.Tag != "SolNode763" && // the index - missions.Tag != "CrewBattleNode556" && // free flight - getRotations(rewardInfo).length > 0 // (E)SO should not give credits for only completing zone 1, in which case it has no rewardQualifications (https://onlyg.it/OpenWF/SpaceNinjaServer/issues/1823) - ) { + if (isEligibleForCreditReward(rewardInfo, missions, node)) { const levelCreditReward = getLevelCreditRewards(node); missionCompletionCredits += levelCreditReward; logger.debug(`levelCreditReward ${levelCreditReward}`); @@ -1214,6 +1223,12 @@ export const addMissionRewards = async ( } ]); } + + // Consume netracells search pulse. Moved here to only cover successful completions. Discussed in https://onlyg.it/OpenWF/SpaceNinjaServer/issues/2673 + if (missions.Tag == "SolNode720") { + updateEntratiVault(inventory); + inventory.EntratiVaultCountLastPeriod! += 1; + } } if (rewardInfo.useVaultManifest) {