WIP: fix: avoid pushing to quest progress in updateQuestStage #2847
@ -5,6 +5,7 @@ import type { IUpdateQuestRequest } from "../../services/questService.ts";
 | 
				
			|||||||
import { updateQuestKey } from "../../services/questService.ts";
 | 
					import { updateQuestKey } from "../../services/questService.ts";
 | 
				
			||||||
import { getInventory } from "../../services/inventoryService.ts";
 | 
					import { getInventory } from "../../services/inventoryService.ts";
 | 
				
			||||||
import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
 | 
					import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
 | 
				
			||||||
 | 
					import { sendWsBroadcastTo } from "../../services/wsService.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const updateQuestController: RequestHandler = async (req, res) => {
 | 
					export const updateQuestController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const accountId = parseString(req.query.accountId);
 | 
					    const accountId = parseString(req.query.accountId);
 | 
				
			||||||
@ -29,4 +30,5 @@ export const updateQuestController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    await inventory.save();
 | 
					    await inventory.save();
 | 
				
			||||||
    res.send(updateQuestResponse);
 | 
					    res.send(updateQuestResponse);
 | 
				
			||||||
 | 
					    sendWsBroadcastTo(accountId, { update_inventory: true });
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -115,7 +115,7 @@ export const manageQuestsController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
                if (stage > 0) {
 | 
					                if (stage > 0) {
 | 
				
			||||||
                    await giveKeyChainStageTriggered(inventory, {
 | 
					                    await giveKeyChainStageTriggered(inventory, {
 | 
				
			||||||
                        KeyChain: questKey.ItemType,
 | 
					                        KeyChain: questKey.ItemType,
 | 
				
			||||||
                        ChainStage: stage - 1
 | 
					                        ChainStage: stage
 | 
				
			||||||
                    });
 | 
					                    });
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
				
			|||||||
@ -210,7 +210,7 @@ export const getKeyChainItems = ({ KeyChain, ChainStage }: IKeyChainRequest): st
 | 
				
			|||||||
        throw new Error(`KeyChain ${KeyChain} does not contain chain stages`);
 | 
					        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
 | 
					    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
 | 
				
			||||||
    if (!keyChainStage) {
 | 
					    if (!keyChainStage) {
 | 
				
			||||||
        throw new Error(`KeyChainStage ${ChainStage} not found`);
 | 
					        throw new Error(`KeyChainStage ${ChainStage} not found`);
 | 
				
			||||||
 | 
				
			|||||||
@ -68,25 +68,31 @@ export const updateQuestStage = (
 | 
				
			|||||||
        throw new Error(`Progress should always exist when giving keychain triggered items or messages`);
 | 
					        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 (ChainStage == quest.Progress.length) {
 | 
				
			||||||
    if (!questStage) {
 | 
					        logger.debug(`pushing to quest progress in updateQuestStage`);
 | 
				
			||||||
        const questStageIndex =
 | 
					        quest.Progress.push({
 | 
				
			||||||
            quest.Progress.push({
 | 
					            c: 0,
 | 
				
			||||||
                c: questStageUpdate.c ?? 0,
 | 
					            i: false,
 | 
				
			||||||
                i: questStageUpdate.i ?? false,
 | 
					            m: false,
 | 
				
			||||||
                m: questStageUpdate.m ?? false,
 | 
					            b: []
 | 
				
			||||||
                b: questStageUpdate.b ?? []
 | 
					        });
 | 
				
			||||||
            }) - 1;
 | 
					    } else if (ChainStage >= quest.Progress.length) {
 | 
				
			||||||
        if (questStageIndex !== ChainStage) {
 | 
					        throw new Error(
 | 
				
			||||||
            throw new Error(`Quest stage index mismatch: ${questStageIndex} !== ${ChainStage}`);
 | 
					            `Quest stage index mismatch: stage is ${ChainStage} but array size is ${quest.Progress.length}`
 | 
				
			||||||
        }
 | 
					        );
 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    // 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[]][]) {
 | 
					        for (const [key, value] of Object.entries(questStageUpdate) as [
 | 
				
			||||||
        (questStage[key] as any) = value;
 | 
					            keyof IQuestStage,
 | 
				
			||||||
 | 
					            number | boolean | any[]
 | 
				
			||||||
 | 
					        ][]) {
 | 
				
			||||||
 | 
					            (questStage[key] as any) = value;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -157,7 +163,7 @@ export const completeQuest = async (inventory: TInventoryDatabaseDocument, quest
 | 
				
			|||||||
        existingQuestKey.Progress.push(...missingProgress);
 | 
					        existingQuestKey.Progress.push(...missingProgress);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (let i = 0; i < chainStageTotal; i++) {
 | 
					    for (let i = 1; i < chainStageTotal; i++) {
 | 
				
			||||||
        const stage = existingQuestKey.Progress[i];
 | 
					        const stage = existingQuestKey.Progress[i];
 | 
				
			||||||
        if (stage.c <= run) {
 | 
					        if (stage.c <= run) {
 | 
				
			||||||
            stage.c = run;
 | 
					            stage.c = run;
 | 
				
			||||||
@ -302,7 +308,7 @@ export const giveKeyChainItem = async (
 | 
				
			|||||||
): Promise<IInventoryChanges> => {
 | 
					): Promise<IInventoryChanges> => {
 | 
				
			||||||
    let inventoryChanges: IInventoryChanges = {};
 | 
					    let inventoryChanges: IInventoryChanges = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!questKey.Progress?.[keyChainInfo.ChainStage]?.i) {
 | 
					    if (!questKey.Progress?.[keyChainInfo.ChainStage - 1]?.i) {
 | 
				
			||||||
        inventoryChanges = await addKeyChainItems(inventory, keyChainInfo);
 | 
					        inventoryChanges = await addKeyChainItems(inventory, keyChainInfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (isEmptyObject(inventoryChanges)) {
 | 
					        if (isEmptyObject(inventoryChanges)) {
 | 
				
			||||||
@ -329,16 +335,18 @@ export const giveKeyChainMessage = async (
 | 
				
			|||||||
    keyChainInfo: IKeyChainRequest,
 | 
					    keyChainInfo: IKeyChainRequest,
 | 
				
			||||||
    questKey: IQuestKeyDatabase
 | 
					    questKey: IQuestKeyDatabase
 | 
				
			||||||
): Promise<void> => {
 | 
					): Promise<void> => {
 | 
				
			||||||
    const keyChainMessage = getKeyChainMessage(keyChainInfo);
 | 
					    if (!questKey.Progress?.[keyChainInfo.ChainStage - 1]?.m) {
 | 
				
			||||||
 | 
					        const keyChainMessage = getKeyChainMessage(keyChainInfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ((questKey.Progress?.[0]?.c ?? 0) > 0) {
 | 
					        if ((questKey.Progress?.[0]?.c ?? 0) > 0) {
 | 
				
			||||||
        keyChainMessage.att = [];
 | 
					            keyChainMessage.att = [];
 | 
				
			||||||
        keyChainMessage.countedAtt = [];
 | 
					            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 (
 | 
					export const giveKeyChainMissionReward = async (
 | 
				
			||||||
@ -391,11 +399,11 @@ export const giveKeyChainStageTriggered = async (
 | 
				
			|||||||
    const questKey = inventory.QuestKeys.find(qk => qk.ItemType === keyChainInfo.KeyChain);
 | 
					    const questKey = inventory.QuestKeys.find(qk => qk.ItemType === keyChainInfo.KeyChain);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (chainStages && questKey) {
 | 
					    if (chainStages && questKey) {
 | 
				
			||||||
        if (chainStages[keyChainInfo.ChainStage].itemsToGiveWhenTriggered.length > 0) {
 | 
					        if (chainStages[keyChainInfo.ChainStage - 1].itemsToGiveWhenTriggered.length > 0) {
 | 
				
			||||||
            await giveKeyChainItem(inventory, keyChainInfo, questKey);
 | 
					            await giveKeyChainItem(inventory, keyChainInfo, questKey);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (chainStages[keyChainInfo.ChainStage].messageToSendWhenTriggered) {
 | 
					        if (chainStages[keyChainInfo.ChainStage - 1].messageToSendWhenTriggered) {
 | 
				
			||||||
            await giveKeyChainMessage(inventory, keyChainInfo, questKey);
 | 
					            await giveKeyChainMessage(inventory, keyChainInfo, questKey);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user