From 8104e2fc27f793382f7b8dba0fe470ff69c83dc5 Mon Sep 17 00:00:00 2001 From: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Date: Fri, 24 Oct 2025 02:45:33 +0200 Subject: [PATCH 1/4] feat: deepmines bounties --- src/services/missionInventoryUpdateService.ts | 60 ++++++++++++------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 336efe87..0696d533 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -243,7 +243,7 @@ export const addMissionInventoryUpdates = async ( } } } - if (inventoryUpdates.MissionStatus == "GS_SUCCESS" && inventoryUpdates.RewardInfo.jobId) { + if (inventoryUpdates.RewardInfo.jobId) { // e.g. for Profit-Taker Phase 1: // JobTier: -6, // jobId: '/Lotus/Types/Gameplay/Venus/Jobs/Heists/HeistProfitTakerBountyOne_-6_SolarisUnitedHub1_663a71c80000000000000025_EudicoHeists', @@ -251,7 +251,10 @@ export const addMissionInventoryUpdates = async ( // eslint-disable-next-line @typescript-eslint/no-unused-vars const [bounty, tier, hub, id, tag] = inventoryUpdates.RewardInfo.jobId.split("_"); - if (tag == "EudicoHeists") { + if ( + (tag == "EudicoHeists" && inventoryUpdates.MissionStatus == "GS_SUCCESS") || + (tag == "NokkoColony" && inventoryUpdates.RewardInfo.JobStage == 4) + ) { inventory.CompletedJobChains ??= []; let chain = inventory.CompletedJobChains.find(x => x.LocationTag == tag); if (!chain) { @@ -1514,7 +1517,7 @@ export const addMissionRewards = async ( syndicateEntry = Goals.find(m => m._id.$oid === syndicateMissionId); if (syndicateEntry) syndicateEntry.Tag = syndicateEntry.JobAffiliationTag!; } - if (syndicateEntry && syndicateEntry.Jobs) { + if (syndicateEntry && syndicateEntry.Jobs && !jobType.startsWith("/Lotus/Types/Gameplay/NokkoColony/Jobs")) { let currentJob = syndicateEntry.Jobs[rewardInfo.JobTier!]; if ( [ @@ -2022,6 +2025,17 @@ function getRandomMissionDrops( xpAmounts: [1000] }; RewardInfo.Q = false; // Just in case + } else if (jobType.startsWith("/Lotus/Types/Gameplay/NokkoColony/Jobs/NokkoJob")) { + job = { + rewards: jobType.replace( + "/Lotus/Types/Gameplay/NokkoColony/Jobs/NokkoJob", + "Lotus/Types/Game/MissionDecks/NokkoColonyRewards/NokkoColonyRewards" + ), + masteryReq: 0, + minEnemyLevel: 30, + maxEnemyLevel: 40, + xpAmounts: [0, 0, 0, 0, 0] + }; } else { const tierMap = { Two: "B", @@ -2065,14 +2079,18 @@ function getRandomMissionDrops( } else if (totalStage == 5 && curentStage == 4) { tableIndex = 2; } - - rotations = [tableIndex]; + if (jobType.startsWith("/Lotus/Types/Gameplay/NokkoColony/Jobs/NokkoJob")) { + if (RewardInfo.JobStage === job.xpAmounts.length - 1) rotations = [0, 1, 2]; + } else { + rotations = [tableIndex]; + } } else { rotations = [0]; } if ( RewardInfo.Q && (RewardInfo.JobStage === job.xpAmounts.length - 1 || jobType.endsWith("VaultBounty")) && + !jobType.startsWith("/Lotus/Types/Gameplay/NokkoColony/Jobs/NokkoJob") && !isEndlessJob ) { rotations.push(ExportRewards[job.rewards].length - 1); @@ -2163,22 +2181,24 @@ function getRandomMissionDrops( logger.warn(`RewardSeed mismatch:`, { client: RewardInfo.rewardSeed, database: inventory.RewardSeed }); } } - const rng = new SRng(BigInt(RewardInfo.rewardSeed ?? generateRewardSeed()) ^ 0xffffffffffffffffn); - rewardManifests.forEach(name => { - const table = ExportRewards[name]; - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (!table) { - logger.error(`unknown droptable: ${name}`); - return; - } - for (const rotation of rotations) { - const rotationRewards = table[rotation]; - const drop = getRandomRewardByChance(rotationRewards, rng); - if (drop) { - drops.push({ StoreItem: drop.type, ItemCount: drop.itemCount }); + if (rotations.length > 1) { + const rng = new SRng(BigInt(RewardInfo.rewardSeed ?? generateRewardSeed()) ^ 0xffffffffffffffffn); + rewardManifests.forEach(name => { + const table = ExportRewards[name]; + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (!table) { + logger.error(`unknown droptable: ${name}`); + return; } - } - }); + for (const rotation of rotations) { + const rotationRewards = table[rotation]; + const drop = getRandomRewardByChance(rotationRewards, rng); + if (drop) { + drops.push({ StoreItem: drop.type, ItemCount: drop.itemCount }); + } + } + }); + } // Railjack Abandoned Cache Rewards, Rotation A (Mandatory Objectives) if (RewardInfo.POICompletions) { -- 2.47.2 From 42c26b0fc90ed30b4544f0ad41dd10b5cb33ddaa Mon Sep 17 00:00:00 2001 From: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Date: Sat, 25 Oct 2025 09:28:07 +0200 Subject: [PATCH 2/4] update pe+ --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7981d879..39d49f9c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "morgan": "^1.10.0", "ncp": "^2.0.0", "undici": "^7.10.0", - "warframe-public-export-plus": "^0.5.92", + "warframe-public-export-plus": "^0.5.93", "warframe-riven-info": "^0.1.2", "winston": "^3.17.0", "winston-daily-rotate-file": "^5.0.0", @@ -5534,9 +5534,9 @@ } }, "node_modules/warframe-public-export-plus": { - "version": "0.5.92", - "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.92.tgz", - "integrity": "sha512-5O5VtyVXxKtl5QdpzoVyKov5GX6t3z/U5tqPq73kjoSyA5NQT2V9sWsZK4ASyY8Edv9hNsdwlZdsdP8QmYbubg==" + "version": "0.5.93", + "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.93.tgz", + "integrity": "sha512-A8LSFJoyg7sU1n4L0zhLK1g0CREh8Fxvk7eXKoT8nMTroQg6YgEw02gK0MUi9U3rWTnlaGTsXZMp/tgC7HWUKw==" }, "node_modules/warframe-riven-info": { "version": "0.1.2", diff --git a/package.json b/package.json index 8e97d778..4520ffdc 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "morgan": "^1.10.0", "ncp": "^2.0.0", "undici": "^7.10.0", - "warframe-public-export-plus": "^0.5.92", + "warframe-public-export-plus": "^0.5.93", "warframe-riven-info": "^0.1.2", "winston": "^3.17.0", "winston-daily-rotate-file": "^5.0.0", -- 2.47.2 From a5403ef1c02234f75dc37455e5065f3ab236f95b Mon Sep 17 00:00:00 2001 From: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Date: Sat, 25 Oct 2025 09:35:55 +0200 Subject: [PATCH 3/4] Update missionInventoryUpdateService.ts --- src/services/missionInventoryUpdateService.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 0696d533..e106cda5 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -2027,10 +2027,12 @@ function getRandomMissionDrops( RewardInfo.Q = false; // Just in case } else if (jobType.startsWith("/Lotus/Types/Gameplay/NokkoColony/Jobs/NokkoJob")) { job = { - rewards: jobType.replace( - "/Lotus/Types/Gameplay/NokkoColony/Jobs/NokkoJob", - "Lotus/Types/Game/MissionDecks/NokkoColonyRewards/NokkoColonyRewards" - ), + rewards: jobType + .replace("SteelPath", "Steel") + .replace( + "/Lotus/Types/Gameplay/NokkoColony/Jobs/NokkoJob", + "Lotus/Types/Game/MissionDecks/NokkoColonyRewards/NokkoColonyRewards" + ), masteryReq: 0, minEnemyLevel: 30, maxEnemyLevel: 40, -- 2.47.2 From 046c7d9cabec03a5db2eb0d9b1ca8f03533b5adf Mon Sep 17 00:00:00 2001 From: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Date: Sat, 25 Oct 2025 10:05:41 +0200 Subject: [PATCH 4/4] avoid unnecessary cucling rewardManifests.forEach --- src/services/missionInventoryUpdateService.ts | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index e106cda5..cb9622ba 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -2082,7 +2082,11 @@ function getRandomMissionDrops( tableIndex = 2; } if (jobType.startsWith("/Lotus/Types/Gameplay/NokkoColony/Jobs/NokkoJob")) { - if (RewardInfo.JobStage === job.xpAmounts.length - 1) rotations = [0, 1, 2]; + if (RewardInfo.JobStage === job.xpAmounts.length - 1) { + rotations = [0, 1, 2]; + } else { + rewardManifests = []; + } } else { rotations = [tableIndex]; } @@ -2183,24 +2187,22 @@ function getRandomMissionDrops( logger.warn(`RewardSeed mismatch:`, { client: RewardInfo.rewardSeed, database: inventory.RewardSeed }); } } - if (rotations.length > 1) { - const rng = new SRng(BigInt(RewardInfo.rewardSeed ?? generateRewardSeed()) ^ 0xffffffffffffffffn); - rewardManifests.forEach(name => { - const table = ExportRewards[name]; - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (!table) { - logger.error(`unknown droptable: ${name}`); - return; + const rng = new SRng(BigInt(RewardInfo.rewardSeed ?? generateRewardSeed()) ^ 0xffffffffffffffffn); + rewardManifests.forEach(name => { + const table = ExportRewards[name]; + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (!table) { + logger.error(`unknown droptable: ${name}`); + return; + } + for (const rotation of rotations) { + const rotationRewards = table[rotation]; + const drop = getRandomRewardByChance(rotationRewards, rng); + if (drop) { + drops.push({ StoreItem: drop.type, ItemCount: drop.itemCount }); } - for (const rotation of rotations) { - const rotationRewards = table[rotation]; - const drop = getRandomRewardByChance(rotationRewards, rng); - if (drop) { - drops.push({ StoreItem: drop.type, ItemCount: drop.itemCount }); - } - } - }); - } + } + }); // Railjack Abandoned Cache Rewards, Rotation A (Mandatory Objectives) if (RewardInfo.POICompletions) { -- 2.47.2