From 90da0e532606cd475b42ed18827dbb7b808dfba4 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Sun, 5 Oct 2025 17:50:35 +0200 Subject: [PATCH 1/7] fix: avoid pushing to quest progress in updateQuestStage --- src/services/questService.ts | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/services/questService.ts b/src/services/questService.ts index 02bf81b7..90b81ff7 100644 --- a/src/services/questService.ts +++ b/src/services/questService.ts @@ -68,22 +68,22 @@ export const updateQuestStage = ( throw new Error(`Progress should always exist when giving keychain triggered items or messages`); } - const questStage = quest.Progress[ChainStage]; + ChainStage -= 1; // They are 1-indexed in the client, but we need 0-indexing - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (!questStage) { - const questStageIndex = - quest.Progress.push({ - c: questStageUpdate.c ?? 0, - i: questStageUpdate.i ?? false, - m: questStageUpdate.m ?? false, - b: questStageUpdate.b ?? [] - }) - 1; - if (questStageIndex !== ChainStage) { - throw new Error(`Quest stage index mismatch: ${questStageIndex} !== ${ChainStage}`); - } - return; + if (ChainStage == quest.Progress.length) { + logger.debug(`pushing to quest progress in updateQuestStage`); + quest.Progress.push({ + c: 0, + i: false, + m: false, + b: [] + }); + } else if (ChainStage >= quest.Progress.length) { + throw new Error( + `Quest stage index mismatch: stage is ${ChainStage} but array size is ${quest.Progress.length}` + ); } + const questStage = quest.Progress[ChainStage]; // guaranteed in-bounds now for (const [key, value] of Object.entries(questStageUpdate) as [keyof IQuestStage, number | boolean | any[]][]) { (questStage[key] as any) = value; -- 2.47.2 From a75e2b4c697ff1b7e91fbf32edfb9cb9506fbf66 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Sun, 5 Oct 2025 17:54:18 +0200 Subject: [PATCH 2/7] fix indexing in giveKeyChainItem --- src/services/questService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/questService.ts b/src/services/questService.ts index 90b81ff7..16af50e6 100644 --- a/src/services/questService.ts +++ b/src/services/questService.ts @@ -302,7 +302,7 @@ export const giveKeyChainItem = async ( ): Promise => { let inventoryChanges: IInventoryChanges = {}; - if (!questKey.Progress?.[keyChainInfo.ChainStage]?.i) { + if (!questKey.Progress?.[keyChainInfo.ChainStage - 1]?.i) { inventoryChanges = await addKeyChainItems(inventory, keyChainInfo); if (isEmptyObject(inventoryChanges)) { -- 2.47.2 From f097b28e68418fab27a69552a69cf9d532750fb2 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Sun, 5 Oct 2025 17:54:40 +0200 Subject: [PATCH 3/7] avoid resending key chain message --- src/services/questService.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/services/questService.ts b/src/services/questService.ts index 16af50e6..d8e2213c 100644 --- a/src/services/questService.ts +++ b/src/services/questService.ts @@ -329,16 +329,18 @@ export const giveKeyChainMessage = async ( keyChainInfo: IKeyChainRequest, questKey: IQuestKeyDatabase ): Promise => { - const keyChainMessage = getKeyChainMessage(keyChainInfo); + if (!questKey.Progress?.[keyChainInfo.ChainStage - 1]?.m) { + const keyChainMessage = getKeyChainMessage(keyChainInfo); - if ((questKey.Progress?.[0]?.c ?? 0) > 0) { - keyChainMessage.att = []; - keyChainMessage.countedAtt = []; + if ((questKey.Progress?.[0]?.c ?? 0) > 0) { + keyChainMessage.att = []; + keyChainMessage.countedAtt = []; + } + + await createMessage(inventory.accountOwnerId, [keyChainMessage]); + + updateQuestStage(inventory, keyChainInfo, { m: true }); } - - await createMessage(inventory.accountOwnerId, [keyChainMessage]); - - updateQuestStage(inventory, keyChainInfo, { m: true }); }; export const giveKeyChainMissionReward = async ( -- 2.47.2 From 42552d0ed14fb3308462403a8102bc3273bd08dd Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Sun, 5 Oct 2025 17:56:13 +0200 Subject: [PATCH 4/7] Revert c6a3e86d2b0cb9745c07e8955881e9c4037b0f7a --- src/controllers/custom/manageQuestsController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/custom/manageQuestsController.ts b/src/controllers/custom/manageQuestsController.ts index 25c80cd0..efd1ec63 100644 --- a/src/controllers/custom/manageQuestsController.ts +++ b/src/controllers/custom/manageQuestsController.ts @@ -115,7 +115,7 @@ export const manageQuestsController: RequestHandler = async (req, res) => { if (stage > 0) { await giveKeyChainStageTriggered(inventory, { KeyChain: questKey.ItemType, - ChainStage: stage - 1 + ChainStage: stage }); } } -- 2.47.2 From 06156bacf006c03849bcb64721d6d9bfb13f5088 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Sun, 5 Oct 2025 18:10:19 +0200 Subject: [PATCH 5/7] fix completeKey --- src/services/itemDataService.ts | 2 +- src/services/questService.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/services/itemDataService.ts b/src/services/itemDataService.ts index 0b33a1a1..8cf18d03 100644 --- a/src/services/itemDataService.ts +++ b/src/services/itemDataService.ts @@ -210,7 +210,7 @@ export const getKeyChainItems = ({ KeyChain, ChainStage }: IKeyChainRequest): st throw new Error(`KeyChain ${KeyChain} does not contain chain stages`); } - const keyChainStage = chainStages[ChainStage]; + const keyChainStage = chainStages[ChainStage - 1]; // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (!keyChainStage) { throw new Error(`KeyChainStage ${ChainStage} not found`); diff --git a/src/services/questService.ts b/src/services/questService.ts index d8e2213c..9a21f991 100644 --- a/src/services/questService.ts +++ b/src/services/questService.ts @@ -157,7 +157,7 @@ export const completeQuest = async (inventory: TInventoryDatabaseDocument, quest existingQuestKey.Progress.push(...missingProgress); } - for (let i = 0; i < chainStageTotal; i++) { + for (let i = 1; i < chainStageTotal; i++) { const stage = existingQuestKey.Progress[i]; if (stage.c <= run) { stage.c = run; @@ -393,11 +393,11 @@ export const giveKeyChainStageTriggered = async ( const questKey = inventory.QuestKeys.find(qk => qk.ItemType === keyChainInfo.KeyChain); if (chainStages && questKey) { - if (chainStages[keyChainInfo.ChainStage].itemsToGiveWhenTriggered.length > 0) { + if (chainStages[keyChainInfo.ChainStage - 1].itemsToGiveWhenTriggered.length > 0) { await giveKeyChainItem(inventory, keyChainInfo, questKey); } - if (chainStages[keyChainInfo.ChainStage].messageToSendWhenTriggered) { + if (chainStages[keyChainInfo.ChainStage - 1].messageToSendWhenTriggered) { await giveKeyChainMessage(inventory, keyChainInfo, questKey); } } -- 2.47.2 From ef1922146ac98c5caea862233f6cf0b41f3f6c33 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Sun, 5 Oct 2025 18:21:48 +0200 Subject: [PATCH 6/7] let webui know when client called updateQuest --- src/controllers/api/updateQuestController.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/controllers/api/updateQuestController.ts b/src/controllers/api/updateQuestController.ts index 0ca4d857..5bae315a 100644 --- a/src/controllers/api/updateQuestController.ts +++ b/src/controllers/api/updateQuestController.ts @@ -5,6 +5,7 @@ import type { IUpdateQuestRequest } from "../../services/questService.ts"; import { updateQuestKey } from "../../services/questService.ts"; import { getInventory } from "../../services/inventoryService.ts"; import type { IInventoryChanges } from "../../types/purchaseTypes.ts"; +import { sendWsBroadcastTo } from "../../services/wsService.ts"; export const updateQuestController: RequestHandler = async (req, res) => { const accountId = parseString(req.query.accountId); @@ -29,4 +30,5 @@ export const updateQuestController: RequestHandler = async (req, res) => { await inventory.save(); res.send(updateQuestResponse); + sendWsBroadcastTo(accountId, { update_inventory: true }); }; -- 2.47.2 From 37c2da0f8e4a08a5f1bbef932041845573920640 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Sun, 5 Oct 2025 18:23:44 +0200 Subject: [PATCH 7/7] handle giveKeyChainTriggeredMessage with ChainStage = 0 --- src/services/questService.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/services/questService.ts b/src/services/questService.ts index 9a21f991..cc9449fd 100644 --- a/src/services/questService.ts +++ b/src/services/questService.ts @@ -83,10 +83,16 @@ export const updateQuestStage = ( `Quest stage index mismatch: stage is ${ChainStage} but array size is ${quest.Progress.length}` ); } - const questStage = quest.Progress[ChainStage]; // guaranteed in-bounds now + // Note that the client may use index 0 as well, e.g. for rising tide's initial inbox message. 'm' is not tracked for it. + if (ChainStage >= 0) { + const questStage = quest.Progress[ChainStage]; // guaranteed in-bounds now - for (const [key, value] of Object.entries(questStageUpdate) as [keyof IQuestStage, number | boolean | any[]][]) { - (questStage[key] as any) = value; + for (const [key, value] of Object.entries(questStageUpdate) as [ + keyof IQuestStage, + number | boolean | any[] + ][]) { + (questStage[key] as any) = value; + } } }; -- 2.47.2