fix: correct checks for quest replay #2798

Merged
Sainan merged 3 commits from AMelonInsideLemon/SpaceNinjaServer:fix-replay into main 2025-09-21 02:53:06 -07:00
3 changed files with 11 additions and 11 deletions

View File

@ -10,7 +10,8 @@ export const giveKeyChainTriggeredItemsController: RequestHandler = async (req,
const keyChainInfo = getJSONfromString<IKeyChainRequest>((req.body as string).toString()); const keyChainInfo = getJSONfromString<IKeyChainRequest>((req.body as string).toString());
const inventory = await getInventory(accountId); const inventory = await getInventory(accountId);
const inventoryChanges = await giveKeyChainItem(inventory, keyChainInfo); const questKey = inventory.QuestKeys.find(qk => qk.ItemType === keyChainInfo.KeyChain)!;
const inventoryChanges = await giveKeyChainItem(inventory, keyChainInfo, questKey);
await inventory.save(); await inventory.save();
res.send(inventoryChanges); res.send(inventoryChanges);

View File

@ -9,7 +9,8 @@ export const giveKeyChainTriggeredMessageController: RequestHandler = async (req
const keyChainInfo = JSON.parse((req.body as Buffer).toString()) as IKeyChainRequest; const keyChainInfo = JSON.parse((req.body as Buffer).toString()) as IKeyChainRequest;
const inventory = await getInventory(accountId, "QuestKeys accountOwnerId"); const inventory = await getInventory(accountId, "QuestKeys accountOwnerId");
await giveKeyChainMessage(inventory, keyChainInfo); const questKey = inventory.QuestKeys.find(qk => qk.ItemType === keyChainInfo.KeyChain)!;
await giveKeyChainMessage(inventory, keyChainInfo, questKey);
await inventory.save(); await inventory.save();
res.send(1); res.send(1);

View File

@ -159,7 +159,7 @@ export const completeQuest = async (inventory: TInventoryDatabaseDocument, quest
for (let i = 0; i < chainStageTotal; i++) { for (let i = 0; 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;
await giveKeyChainStageTriggered(inventory, { KeyChain: questKey, ChainStage: i }); await giveKeyChainStageTriggered(inventory, { KeyChain: questKey, ChainStage: i });
await giveKeyChainMissionReward(inventory, { KeyChain: questKey, ChainStage: i }); await giveKeyChainMissionReward(inventory, { KeyChain: questKey, ChainStage: i });
@ -298,11 +298,11 @@ const handleQuestCompletion = async (
export const giveKeyChainItem = async ( export const giveKeyChainItem = async (
inventory: TInventoryDatabaseDocument, inventory: TInventoryDatabaseDocument,
keyChainInfo: IKeyChainRequest, keyChainInfo: IKeyChainRequest,
isRerun: boolean = false questKey: IQuestKeyDatabase
): Promise<IInventoryChanges> => { ): Promise<IInventoryChanges> => {
let inventoryChanges: IInventoryChanges = {}; let inventoryChanges: IInventoryChanges = {};
if (!isRerun) { if (questKey.Progress![keyChainInfo.ChainStage].i) {
Sainan marked this conversation as resolved Outdated

Can't we use stage i to track items were already given?

Can't we use stage `i` to track items were already given?
inventoryChanges = await addKeyChainItems(inventory, keyChainInfo); inventoryChanges = await addKeyChainItems(inventory, keyChainInfo);
if (isEmptyObject(inventoryChanges)) { if (isEmptyObject(inventoryChanges)) {
@ -327,11 +327,11 @@ export const giveKeyChainItem = async (
export const giveKeyChainMessage = async ( export const giveKeyChainMessage = async (
inventory: TInventoryDatabaseDocument, inventory: TInventoryDatabaseDocument,
keyChainInfo: IKeyChainRequest, keyChainInfo: IKeyChainRequest,
isRerun: boolean = false questKey: IQuestKeyDatabase
): Promise<void> => { ): Promise<void> => {
const keyChainMessage = getKeyChainMessage(keyChainInfo); const keyChainMessage = getKeyChainMessage(keyChainInfo);
if (!isRerun) { if (questKey.Progress![0].c > 0) {
keyChainMessage.att = []; keyChainMessage.att = [];
keyChainMessage.countedAtt = []; keyChainMessage.countedAtt = [];
} }
@ -391,14 +391,12 @@ 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) {
const run = questKey.Progress?.[0]?.c ?? 0;
if (chainStages[keyChainInfo.ChainStage].itemsToGiveWhenTriggered.length > 0) { if (chainStages[keyChainInfo.ChainStage].itemsToGiveWhenTriggered.length > 0) {
await giveKeyChainItem(inventory, keyChainInfo, run > 0); await giveKeyChainItem(inventory, keyChainInfo, questKey);
} }
if (chainStages[keyChainInfo.ChainStage].messageToSendWhenTriggered) { if (chainStages[keyChainInfo.ChainStage].messageToSendWhenTriggered) {
await giveKeyChainMessage(inventory, keyChainInfo, run > 0); await giveKeyChainMessage(inventory, keyChainInfo, questKey);
} }
} }
}; };