XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFESpaceNinjaServer

fix: handle multiple syndicate title increases at once (#2139)

Only really possible with nightwave afaik. Bug reported via #2138. Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2139 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>

1979b20f
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

1 个文件 +62 -59
Modified src/controllers/api/syndicateSacrificeController.ts +62 -59
@@ -3,7 +3,7 @@ import { RequestHandler } from "express";
3 3 import { getAccountIdForRequest } from "@/src/services/loginService";
4 4 import { ExportSyndicates, ISyndicateSacrifice } from "warframe-public-export-plus";
5 5 import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
6 import { addMiscItems, combineInventoryChanges, getInventory, updateCurrency } from "@/src/services/inventoryService";
6 import { addMiscItem, combineInventoryChanges, getInventory, updateCurrency } from "@/src/services/inventoryService";
7 7 import { IInventoryChanges } from "@/src/types/purchaseTypes";
8 8 import { toStoreItem } from "@/src/services/itemDataService";
9 9 import { logger } from "@/src/utils/logger";
@@ -18,80 +18,83 @@ export const syndicateSacrificeController: RequestHandler = async (request, resp
18 18 syndicate = inventory.Affiliations[inventory.Affiliations.push({ Tag: data.AffiliationTag, Standing: 0 }) - 1];
19 19 }
20 20
21 const level = data.SacrificeLevel - (syndicate.Title ?? 0);
21 const oldLevel = syndicate.Title ?? 0;
22 const levelIncrease = data.SacrificeLevel - oldLevel;
23 if (levelIncrease < 1) {
24 throw new Error(`syndicate sacrifice needs an increase of at least 1`);
25 }
26 if (levelIncrease > 1 && !data.AllowMultiple) {
27 throw new Error(`desired syndicate level is an increase of ${levelIncrease}, max. allowed increase is 1`);
28 }
29
22 30 const res: ISyndicateSacrificeResponse = {
23 31 AffiliationTag: data.AffiliationTag,
24 32 InventoryChanges: {},
25 33 Level: data.SacrificeLevel,
26 LevelIncrease: level <= 0 ? 1 : level,
34 LevelIncrease: levelIncrease,
27 35 NewEpisodeReward: false
28 36 };
29 37
38 // Process sacrifices and rewards for every level we're reaching
30 39 const manifest = ExportSyndicates[data.AffiliationTag];
31 let sacrifice: ISyndicateSacrifice | undefined;
32 let reward: string | undefined;
33 if (data.SacrificeLevel == 0) {
34 sacrifice = manifest.initiationSacrifice;
35 reward = manifest.initiationReward;
36 syndicate.Initiated = true;
37 } else {
38 sacrifice = manifest.titles?.find(x => x.level == data.SacrificeLevel)?.sacrifice;
39 }
40
41 if (sacrifice) {
42 res.InventoryChanges = { ...updateCurrency(inventory, sacrifice.credits, false) };
43
44 const miscItemChanges = sacrifice.items.map(x => ({
45 ItemType: x.ItemType,
46 ItemCount: x.ItemCount * -1
47 }));
48 addMiscItems(inventory, miscItemChanges);
49 res.InventoryChanges.MiscItems = miscItemChanges;
50 }
51
52 syndicate.Title ??= 0;
53 syndicate.Title += 1;
40 for (let level = oldLevel + 1; level <= data.SacrificeLevel; ++level) {
41 let sacrifice: ISyndicateSacrifice | undefined;
42 if (level == 0) {
43 sacrifice = manifest.initiationSacrifice;
44 if (manifest.initiationReward) {
45 combineInventoryChanges(
46 res.InventoryChanges,
47 (await handleStoreItemAcquisition(manifest.initiationReward, inventory)).InventoryChanges
48 );
49 }
50 syndicate.Initiated = true;
51 } else {
52 sacrifice = manifest.titles?.find(x => x.level == level)?.sacrifice;
53 }
54 54
55 if (reward) {
56 combineInventoryChanges(
57 res.InventoryChanges,
58 (await handleStoreItemAcquisition(reward, inventory)).InventoryChanges
59 );
60 }
55 if (sacrifice) {
56 updateCurrency(inventory, sacrifice.credits, false, res.InventoryChanges);
61 57
62 // Quacks like a nightwave syndicate?
63 if (manifest.dailyChallenges) {
64 const title = manifest.titles!.find(x => x.level == syndicate.Title);
65 if (title) {
66 res.NewEpisodeReward = true;
67 let rewardType: string;
68 let rewardCount: number;
69 if (title.storeItemReward) {
70 rewardType = title.storeItemReward;
71 rewardCount = 1;
72 } else {
73 rewardType = toStoreItem(title.reward!.ItemType);
74 rewardCount = title.reward!.ItemCount;
58 for (const item of sacrifice.items) {
59 addMiscItem(inventory, item.ItemType, item.ItemCount * -1, res.InventoryChanges);
75 60 }
76 const rewardInventoryChanges = (await handleStoreItemAcquisition(rewardType, inventory, rewardCount))
77 .InventoryChanges;
78 if (Object.keys(rewardInventoryChanges).length == 0) {
79 logger.debug(`nightwave rank up reward did not seem to get added, giving 50 creds instead`);
80 const nightwaveCredsItemType = manifest.titles![0].reward!.ItemType;
81 rewardInventoryChanges.MiscItems = [{ ItemType: nightwaveCredsItemType, ItemCount: 50 }];
82 addMiscItems(inventory, rewardInventoryChanges.MiscItems);
83 }
84 combineInventoryChanges(res.InventoryChanges, rewardInventoryChanges);
85 61 }
86 } else {
87 if (syndicate.Title > 0 && manifest.favours.find(x => x.rankUpReward && x.requiredLevel == syndicate.Title)) {
88 syndicate.FreeFavorsEarned ??= [];
89 if (!syndicate.FreeFavorsEarned.includes(syndicate.Title)) {
90 syndicate.FreeFavorsEarned.push(syndicate.Title);
62
63 // Quacks like a nightwave syndicate?
64 if (manifest.dailyChallenges) {
65 const title = manifest.titles!.find(x => x.level == level);
66 if (title) {
67 res.NewEpisodeReward = true;
68 let rewardType: string;
69 let rewardCount: number;
70 if (title.storeItemReward) {
71 rewardType = title.storeItemReward;
72 rewardCount = 1;
73 } else {
74 rewardType = toStoreItem(title.reward!.ItemType);
75 rewardCount = title.reward!.ItemCount;
76 }
77 const rewardInventoryChanges = (await handleStoreItemAcquisition(rewardType, inventory, rewardCount))
78 .InventoryChanges;
79 if (Object.keys(rewardInventoryChanges).length == 0) {
80 logger.debug(`nightwave rank up reward did not seem to get added, giving 50 creds instead`);
81 const nightwaveCredsItemType = manifest.titles![0].reward!.ItemType;
82 addMiscItem(inventory, nightwaveCredsItemType, 50, rewardInventoryChanges);
83 }
84 combineInventoryChanges(res.InventoryChanges, rewardInventoryChanges);
85 }
86 } else {
87 if (level > 0 && manifest.favours.find(x => x.rankUpReward && x.requiredLevel == level)) {
88 syndicate.FreeFavorsEarned ??= [];
89 if (!syndicate.FreeFavorsEarned.includes(level)) {
90 syndicate.FreeFavorsEarned.push(level);
91 }
91 92 }
92 93 }
93 94 }
94 95
96 // Commit
97 syndicate.Title = data.SacrificeLevel;
95 98 await inventory.save();
96 99
97 100 response.json(res);