From 052b3106ac7d9b6bb223060aa38dd4e6347a5f7b Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Sat, 13 Sep 2025 16:58:28 +0200 Subject: [PATCH 1/6] fix: factor all conservation rewards by count --- src/services/missionInventoryUpdateService.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 4d2c64ac..d90f87b0 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -527,7 +527,7 @@ export const addMissionInventoryUpdates = async ( addMiscItems(inventory, [ { ItemType: meta.itemReward, - ItemCount: capturedAnimal.NumTags + ItemCount: capturedAnimal.NumTags * capturedAnimal.Count } ]); } @@ -536,7 +536,7 @@ export const addMissionInventoryUpdates = async ( addMiscItems(inventory, [ { ItemType: meta.woundedAnimalReward, - ItemCount: capturedAnimal.NumExtraRewards + ItemCount: capturedAnimal.NumExtraRewards * capturedAnimal.Count } ]); } else { @@ -548,8 +548,9 @@ export const addMissionInventoryUpdates = async ( if (meta.standingReward) { const syndicateTag = inventoryUpdates.Missions!.Tag == "SolNode129" ? "SolarisSyndicate" : "CetusSyndicate"; - logger.debug(`adding ${meta.standingReward} standing to ${syndicateTag} for conservation`); - addStanding(inventory, syndicateTag, meta.standingReward); + const standing = meta.standingReward * capturedAnimal.Count; + logger.debug(`adding ${standing} standing to ${syndicateTag} for conservation`); + addStanding(inventory, syndicateTag, standing); } } else { logger.warn(`ignoring conservation of unknown AnimalType: ${capturedAnimal.AnimalType}`); -- 2.47.2 From d4c7d2f8bcbab07419c6be4264e7f6d856a41f06 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Sat, 13 Sep 2025 16:59:26 +0200 Subject: [PATCH 2/6] fix: factor conservation standing reward by CaptureRating --- src/services/missionInventoryUpdateService.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index d90f87b0..e4f27127 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -548,7 +548,8 @@ export const addMissionInventoryUpdates = async ( if (meta.standingReward) { const syndicateTag = inventoryUpdates.Missions!.Tag == "SolNode129" ? "SolarisSyndicate" : "CetusSyndicate"; - const standing = meta.standingReward * capturedAnimal.Count; + const standing = + [2, 1.5, 1][capturedAnimal.CaptureRating] * meta.standingReward * capturedAnimal.Count; logger.debug(`adding ${standing} standing to ${syndicateTag} for conservation`); addStanding(inventory, syndicateTag, standing); } -- 2.47.2 From be8baf0f9bdc576b7a25975d83cb516ed6323892 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Sat, 13 Sep 2025 17:14:26 +0200 Subject: [PATCH 3/6] increase scope of interstitial requests to send delta only more often --- .../api/missionInventoryUpdateController.ts | 12 ++++++++++-- src/types/requestTypes.ts | 10 +++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/controllers/api/missionInventoryUpdateController.ts b/src/controllers/api/missionInventoryUpdateController.ts index 9902f021..9d1d59f2 100644 --- a/src/controllers/api/missionInventoryUpdateController.ts +++ b/src/controllers/api/missionInventoryUpdateController.ts @@ -111,8 +111,16 @@ export const missionInventoryUpdateController: RequestHandler = async (req, res) AffiliationMods, ConquestCompletedMissionsCount }; - if (missionReport.RJ) { - logger.debug(`railjack interstitial request, sending only deltas`, deltas); + if ( + missionReport.BMI || + missionReport.TNT || + missionReport.SSC || + missionReport.RJ || + missionReport.SS || + missionReport.CMI || + missionReport.EJC + ) { + logger.debug(`interstitial request, sending only deltas`, deltas); res.json(deltas); } else if (missionReport.RewardInfo) { logger.debug(`classic mission completion, sending everything`); diff --git a/src/types/requestTypes.ts b/src/types/requestTypes.ts index c8244b25..43dceb1c 100644 --- a/src/types/requestTypes.ts +++ b/src/types/requestTypes.ts @@ -45,6 +45,15 @@ export type IMissionInventoryUpdateRequest = { EmailItems?: ITypeCount[]; ShipDecorations?: ITypeCount[]; + // flags for interstitial requests + BMI?: boolean; + TNT?: boolean; + SSC?: boolean; + RJ?: boolean; + SS?: boolean; + CMI?: boolean; + EJC?: boolean; + SyndicateId?: string; SortieId?: string; CalendarProgress?: { challenge: string }[]; @@ -149,7 +158,6 @@ export type IMissionInventoryUpdateRequest = { MultiProgress: unknown[]; }[]; InvasionProgress?: IInvasionProgressClient[]; - RJ?: boolean; ConquestMissionsCompleted?: number; duviriSuitSelection?: string; duviriPistolSelection?: string; -- 2.47.2 From 429d1e555e37672012f7cc933145aaed2a67b345 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Sat, 13 Sep 2025 17:30:34 +0200 Subject: [PATCH 4/6] fix: conservation standing changes not showing in progress screen --- .../api/missionInventoryUpdateController.ts | 7 +- src/services/missionInventoryUpdateService.ts | 94 ++++++++++--------- 2 files changed, 56 insertions(+), 45 deletions(-) diff --git a/src/controllers/api/missionInventoryUpdateController.ts b/src/controllers/api/missionInventoryUpdateController.ts index 9d1d59f2..3633e02a 100644 --- a/src/controllers/api/missionInventoryUpdateController.ts +++ b/src/controllers/api/missionInventoryUpdateController.ts @@ -2,7 +2,11 @@ import type { RequestHandler } from "express"; import { getJSONfromString } from "../../helpers/stringHelpers.ts"; import { getAccountForRequest } from "../../services/loginService.ts"; import type { IMissionInventoryUpdateRequest } from "../../types/requestTypes.ts"; -import { addMissionInventoryUpdates, addMissionRewards } from "../../services/missionInventoryUpdateService.ts"; +import { + addMissionInventoryUpdates, + addMissionRewards, + handleConservation +} from "../../services/missionInventoryUpdateService.ts"; import { getInventory } from "../../services/inventoryService.ts"; import { getInventoryResponse } from "./inventoryController.ts"; import { logger } from "../../utils/logger.ts"; @@ -94,6 +98,7 @@ export const missionInventoryUpdateController: RequestHandler = async (req, res) SyndicateXPItemReward, ConquestCompletedMissionsCount } = await addMissionRewards(account, inventory, missionReport, firstCompletion); + handleConservation(inventory, missionReport, AffiliationMods); // Conservation reports have GS_SUCCESS if (missionReport.EndOfMatchUpload) { inventory.RewardSeed = generateRewardSeed(); diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index e4f27127..e8a8a38f 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -517,48 +517,6 @@ export const addMissionInventoryUpdates = async ( } break; } - case "CapturedAnimals": { - for (const capturedAnimal of value) { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - const meta = ExportAnimals[capturedAnimal.AnimalType]?.conservation; - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (meta) { - if (capturedAnimal.NumTags) { - addMiscItems(inventory, [ - { - ItemType: meta.itemReward, - ItemCount: capturedAnimal.NumTags * capturedAnimal.Count - } - ]); - } - if (capturedAnimal.NumExtraRewards) { - if (meta.woundedAnimalReward) { - addMiscItems(inventory, [ - { - ItemType: meta.woundedAnimalReward, - ItemCount: capturedAnimal.NumExtraRewards * capturedAnimal.Count - } - ]); - } else { - logger.warn( - `client attempted to claim unknown extra rewards for conservation of ${capturedAnimal.AnimalType}` - ); - } - } - if (meta.standingReward) { - const syndicateTag = - inventoryUpdates.Missions!.Tag == "SolNode129" ? "SolarisSyndicate" : "CetusSyndicate"; - const standing = - [2, 1.5, 1][capturedAnimal.CaptureRating] * meta.standingReward * capturedAnimal.Count; - logger.debug(`adding ${standing} standing to ${syndicateTag} for conservation`); - addStanding(inventory, syndicateTag, standing); - } - } else { - logger.warn(`ignoring conservation of unknown AnimalType: ${capturedAnimal.AnimalType}`); - } - } - break; - } case "KubrowPetEggs": { for (const egg of value) { inventory.KubrowPetEggs.push({ @@ -963,7 +921,7 @@ interface AddMissionRewardsReturnType { MissionRewards: IMissionReward[]; inventoryChanges?: IInventoryChanges; credits?: IMissionCredits; - AffiliationMods?: IAffiliationMods[]; + AffiliationMods: IAffiliationMods[]; SyndicateXPItemReward?: number; ConquestCompletedMissionsCount?: number; } @@ -1142,7 +1100,7 @@ export const addMissionRewards = async ( if (!rewardInfo) { //TODO: if there is a case where you can have credits collected during a mission but no rewardInfo, add credits needs to be handled earlier logger.debug(`Mission ${missions!.Tag} did not have Reward Info `); - return { MissionRewards: [] }; + return { MissionRewards: [], AffiliationMods: [] }; } //TODO: check double reward merging @@ -2254,6 +2212,54 @@ function getRandomMissionDrops( return drops; } +export const handleConservation = ( + inventory: TInventoryDatabaseDocument, + missionReport: IMissionInventoryUpdateRequest, + AffiliationMods: IAffiliationMods[] +): void => { + if (missionReport.CapturedAnimals) { + for (const capturedAnimal of missionReport.CapturedAnimals) { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + const meta = ExportAnimals[capturedAnimal.AnimalType]?.conservation; + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (meta) { + if (capturedAnimal.NumTags) { + addMiscItems(inventory, [ + { + ItemType: meta.itemReward, + ItemCount: capturedAnimal.NumTags * capturedAnimal.Count + } + ]); + } + if (capturedAnimal.NumExtraRewards) { + if (meta.woundedAnimalReward) { + addMiscItems(inventory, [ + { + ItemType: meta.woundedAnimalReward, + ItemCount: capturedAnimal.NumExtraRewards * capturedAnimal.Count + } + ]); + } else { + logger.warn( + `client attempted to claim unknown extra rewards for conservation of ${capturedAnimal.AnimalType}` + ); + } + } + if (meta.standingReward) { + addStanding( + inventory, + missionReport.Missions!.Tag == "SolNode129" ? "SolarisSyndicate" : "CetusSyndicate", + [2, 1.5, 1][capturedAnimal.CaptureRating] * meta.standingReward * capturedAnimal.Count, + AffiliationMods + ); + } + } else { + logger.warn(`ignoring conservation of unknown AnimalType: ${capturedAnimal.AnimalType}`); + } + } + } +}; + const corruptedMods = [ "/Lotus/StoreItems/Upgrades/Mods/Melee/DualStat/CorruptedHeavyDamageChargeSpeedMod", // Corrupt Charge "/Lotus/StoreItems/Upgrades/Mods/Pistol/DualStat/CorruptedCritDamagePistol", // Hollow Point -- 2.47.2 From 294781ffc31191c115f1cb19876ecac338c6b077 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Sat, 13 Sep 2025 17:32:03 +0200 Subject: [PATCH 5/6] always send back AffiliationMods since we apply it either way --- src/services/missionInventoryUpdateService.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index e8a8a38f..062c0f3e 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -1097,10 +1097,12 @@ export const addMissionRewards = async ( }: IMissionInventoryUpdateRequest, firstCompletion: boolean ): Promise => { + AffiliationMods ??= []; + if (!rewardInfo) { //TODO: if there is a case where you can have credits collected during a mission but no rewardInfo, add credits needs to be handled earlier logger.debug(`Mission ${missions!.Tag} did not have Reward Info `); - return { MissionRewards: [], AffiliationMods: [] }; + return { MissionRewards: [], AffiliationMods }; } //TODO: check double reward merging @@ -1410,8 +1412,6 @@ export const addMissionRewards = async ( } } - AffiliationMods ??= []; - if (rewardInfo.JobStage != undefined && rewardInfo.jobId) { // eslint-disable-next-line @typescript-eslint/no-unused-vars const [jobType, unkIndex, hubNode, syndicateMissionId] = rewardInfo.jobId.split("_"); -- 2.47.2 From d661f0087688390304a7e727164d67a718738e31 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Sat, 13 Sep 2025 17:38:27 +0200 Subject: [PATCH 6/6] note --- src/types/requestTypes.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/types/requestTypes.ts b/src/types/requestTypes.ts index 43dceb1c..0dac8d75 100644 --- a/src/types/requestTypes.ts +++ b/src/types/requestTypes.ts @@ -47,9 +47,9 @@ export type IMissionInventoryUpdateRequest = { // flags for interstitial requests BMI?: boolean; - TNT?: boolean; - SSC?: boolean; - RJ?: boolean; + TNT?: boolean; // Conservation; definitely need to include AffiliationMods in this case, so a normal 'inventory sync' would not work here. + SSC?: boolean; // K-Drive race? + RJ?: boolean; // Railjack. InventoryJson should only be returned when going back to dojo. SS?: boolean; CMI?: boolean; EJC?: boolean; -- 2.47.2