返回提交历史
Modified
package-lock.json
+4
-4
Modified
package.json
+1
-1
Modified
src/services/itemDataService.ts
+11
-10
Modified
src/services/missionInventoryUpdateService.ts
+70
-37
Modified
src/services/questService.ts
+19
-9
XFEstudio/XFESpaceNinjaServer
fix: complete junction data and crash in vors prize mission four (#1001)
Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1001 Co-authored-by: OrdisPrime <134585663+OrdisPrime@users.noreply.github.com> Co-committed-by: OrdisPrime <134585663+OrdisPrime@users.noreply.github.com>
045d9334
代码差异
5 个文件
+105
-61
@@ -12,7 +12,7 @@
12
12
"copyfiles": "^2.4.1",
13
13
"express": "^5",
14
14
"mongoose": "^8.9.4",
15
"warframe-public-export-plus": "^0.5.30",
15
"warframe-public-export-plus": "^0.5.35",
16
16
"warframe-riven-info": "^0.1.2",
17
17
"winston": "^3.17.0",
18
18
"winston-daily-rotate-file": "^5.0.0"
@@ -4093,9 +4093,9 @@
4093
4093
}
4094
4094
},
4095
4095
"node_modules/warframe-public-export-plus": {
4096
"version": "0.5.32",
4097
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.32.tgz",
4098
"integrity": "sha512-jO9i2Gzz9DWibiHlEO17D975ajs6KrTay8cS5I0GkUUe1XWVU8mML4b+IYCHzM4FWq1t6p2YPCGznQfknqvorg=="
4096
"version": "0.5.35",
4097
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.35.tgz",
4098
"integrity": "sha512-YLQP1n5sOV+PS5hfC4Kuoapa9gsqOy5Qy/E4EYfRV/xJBruFl3tPhbdbgFn3HhL2OBrgRJ8yzT5bjIvaHKhOCw=="
4099
4099
},
4100
4100
"node_modules/warframe-riven-info": {
4101
4101
"version": "0.1.2",
@@ -17,7 +17,7 @@
17
17
"copyfiles": "^2.4.1",
18
18
"express": "^5",
19
19
"mongoose": "^8.9.4",
20
"warframe-public-export-plus": "^0.5.30",
20
"warframe-public-export-plus": "^0.5.35",
21
21
"warframe-riven-info": "^0.1.2",
22
22
"winston": "^3.17.0",
23
23
"winston-daily-rotate-file": "^5.0.0"
@@ -163,20 +163,21 @@ export const getKeyChainItems = ({ KeyChain, ChainStage }: IKeyChainRequest): st
163
163
};
164
164
165
165
export const getLevelKeyRewards = (levelKey: string) => {
166
const levelKeyData = ExportKeys[levelKey];
167
if (!levelKeyData) {
168
const error = `LevelKey ${levelKey} not found`;
169
logger.error(error);
170
throw new Error(error);
166
if (!ExportKeys[levelKey]) {
167
throw new Error(`LevelKey ${levelKey} not found`);
171
168
}
172
169
173
if (!levelKeyData.rewards) {
174
const error = `LevelKey ${levelKey} does not contain rewards`;
175
logger.error(error);
176
throw new Error(error);
170
const levelKeyRewards = ExportKeys[levelKey]?.missionReward;
171
const levelKeyRewards2 = ExportKeys[levelKey]?.rewards;
172
173
if (!levelKeyRewards && !levelKeyRewards2) {
174
throw new Error(`LevelKey ${levelKey} does not contain either rewards1 or rewards2`);
177
175
}
178
176
179
return levelKeyData.rewards;
177
return {
178
levelKeyRewards,
179
levelKeyRewards2
180
};
180
181
};
181
182
182
183
export const getNode = (nodeName: string): IRegion => {
@@ -1,4 +1,10 @@
1
import { ExportFusionBundles, ExportRegions, ExportRewards, IReward } from "warframe-public-export-plus";
1
import {
2
ExportFusionBundles,
3
ExportRegions,
4
ExportRewards,
5
IMissionReward as IMissionRewardExternal,
6
IReward
7
} from "warframe-public-export-plus";
2
8
import { IMissionInventoryUpdateRequest, IRewardInfo } from "../types/requestTypes";
3
9
import { logger } from "@/src/utils/logger";
4
10
import { IRngResult, getRandomReward } from "@/src/services/rngService";
@@ -25,9 +31,8 @@ import { getLevelKeyRewards, getNode } from "@/src/services/itemDataService";
25
31
import { InventoryDocumentProps, TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
26
32
import { getEntriesUnsafe } from "@/src/utils/ts-utils";
27
33
import { IEquipmentClient } from "@/src/types/inventoryTypes/commonInventoryTypes";
28
import junctionRewards from "@/static/fixed_responses/junctionRewards.json";
29
import { IJunctionRewards } from "@/src/types/commonTypes";
30
34
import { handleStoreItemAcquisition } from "./purchaseService";
35
import { IMissionReward } from "../types/missionTypes";
31
36
32
37
const getRotations = (rotationCount: number): number[] => {
33
38
if (rotationCount === 0) return [0];
@@ -258,31 +263,38 @@ export const addMissionRewards = async (
258
263
if (levelKeyName) {
259
264
const fixedLevelRewards = getLevelKeyRewards(levelKeyName);
260
265
//logger.debug(`fixedLevelRewards ${fixedLevelRewards}`);
261
for (const reward of fixedLevelRewards) {
262
//quest stage completion credit rewards
263
if (reward.rewardType == "RT_CREDITS") {
264
inventory.RegularCredits += reward.amount;
265
missionCompletionCredits += reward.amount;
266
continue;
266
if (fixedLevelRewards.levelKeyRewards) {
267
addFixedLevelRewards(fixedLevelRewards.levelKeyRewards, inventory, MissionRewards);
268
}
269
if (fixedLevelRewards.levelKeyRewards2) {
270
for (const reward of fixedLevelRewards.levelKeyRewards2) {
271
//quest stage completion credit rewards
272
if (reward.rewardType == "RT_CREDITS") {
273
inventory.RegularCredits += reward.amount;
274
missionCompletionCredits += reward.amount;
275
continue;
276
}
277
MissionRewards.push({
278
StoreItem: reward.itemType,
279
ItemCount: reward.rewardType === "RT_RESOURCE" ? reward.amount : 1
280
});
267
281
}
268
MissionRewards.push({
269
StoreItem: reward.itemType,
270
ItemCount: reward.rewardType === "RT_RESOURCE" ? reward.amount : 1
271
});
272
282
}
273
283
}
274
284
275
if (rewardInfo.node in junctionRewards) {
276
const junctionReward = (junctionRewards as IJunctionRewards)[rewardInfo.node];
277
for (const item of junctionReward.items) {
278
MissionRewards.push({
279
StoreItem: item.ItemType,
280
ItemCount: item.ItemCount
281
});
285
if (missions) {
286
const node = getNode(missions.Tag);
287
288
//node based credit rewards for mission completion
289
if (node.missionIndex !== 28) {
290
const levelCreditReward = getLevelCreditRewards(missions?.Tag);
291
missionCompletionCredits += levelCreditReward;
292
inventory.RegularCredits += levelCreditReward;
293
logger.debug(`levelCreditReward ${levelCreditReward}`);
282
294
}
283
if (junctionReward.credits) {
284
inventory.RegularCredits += junctionReward.credits;
285
missionCompletionCredits += junctionReward.credits;
295
296
if (node.missionReward) {
297
missionCompletionCredits += addFixedLevelRewards(node.missionReward, inventory, MissionRewards);
286
298
}
287
299
}
288
300
@@ -294,19 +306,6 @@ export const addMissionRewards = async (
294
306
combineInventoryChanges(inventoryChanges, inventoryChange.InventoryChanges);
295
307
}
296
308
297
//node based credit rewards for mission completion
298
if (missions) {
299
const node = getNode(missions.Tag);
300
301
if (node.missionIndex !== 28) {
302
const levelCreditReward = getLevelCreditRewards(missions?.Tag);
303
missionCompletionCredits += levelCreditReward;
304
inventory.RegularCredits += levelCreditReward;
305
logger.debug(`levelCreditReward ${levelCreditReward}`);
306
}
307
}
308
309
//creditBonus is not correct for mirage mission 3
310
309
const credits = addCredits(inventory, {
311
310
missionCompletionCredits,
312
311
missionDropCredits: creditDrops ?? 0,
@@ -316,7 +315,7 @@ export const addMissionRewards = async (
316
315
return { inventoryChanges, MissionRewards, credits };
317
316
};
318
317
319
//slightly inaccurate compared to official
318
//creditBonus is not entirely accurate.
320
319
//TODO: consider ActiveBoosters
321
320
export const addCredits = (
322
321
inventory: HydratedDocument<IInventoryDatabase>,
@@ -348,6 +347,40 @@ export const addCredits = (
348
347
return { ...finalCredits, DailyMissionBonus: true };
349
348
};
350
349
350
export const addFixedLevelRewards = (
351
rewards: IMissionRewardExternal,
352
inventory: TInventoryDatabaseDocument,
353
MissionRewards: IMissionReward[]
354
) => {
355
let missionBonusCredits = 0;
356
if (rewards.credits) {
357
missionBonusCredits += rewards.credits;
358
inventory.RegularCredits += rewards.credits;
359
}
360
if (rewards.items) {
361
for (const item of rewards.items) {
362
MissionRewards.push({
363
StoreItem: `/Lotus/StoreItems${item.substring("Lotus/".length)}`,
364
ItemCount: 1
365
});
366
}
367
}
368
if (rewards.countedItems) {
369
for (const item of rewards.countedItems) {
370
MissionRewards.push({
371
StoreItem: `/Lotus/StoreItems${item.ItemType.substring("Lotus/".length)}`,
372
ItemCount: item.ItemCount
373
});
374
}
375
}
376
if (rewards.countedStoreItems) {
377
for (const item of rewards.countedStoreItems) {
378
MissionRewards.push(item);
379
}
380
}
381
return missionBonusCredits;
382
};
383
351
384
function getLevelCreditRewards(nodeName: string): number {
352
385
const minEnemyLevel = getNode(nodeName).minEnemyLevel;
353
386
@@ -14,6 +14,7 @@ import {
14
14
import { logger } from "@/src/utils/logger";
15
15
import { HydratedDocument } from "mongoose";
16
16
import { ExportKeys } from "warframe-public-export-plus";
17
import { addFixedLevelRewards } from "./missionInventoryUpdateService";
17
18
18
19
export interface IUpdateQuestRequest {
19
20
QuestKeys: Omit<IQuestKeyDatabase, "CompletionDate">[];
@@ -136,16 +137,25 @@ export const completeQuest = async (inventory: TInventoryDatabaseDocument, quest
136
137
const missionName = chainStages[i].key;
137
138
if (missionName) {
138
139
const fixedLevelRewards = getLevelKeyRewards(missionName);
139
//logger.debug(`fixedLevelRewards ${fixedLevelRewards}`);
140
for (const reward of fixedLevelRewards) {
141
if (reward.rewardType == "RT_CREDITS") {
142
inventory.RegularCredits += reward.amount;
143
continue;
140
//logger.debug(`fixedLevelRewards`, fixedLevelRewards);
141
if (fixedLevelRewards.levelKeyRewards) {
142
const missionRewards: { StoreItem: string; ItemCount: number }[] = [];
143
addFixedLevelRewards(fixedLevelRewards.levelKeyRewards, inventory, missionRewards);
144
145
for (const reward of missionRewards) {
146
await addItem(inventory, reward.StoreItem.replace("StoreItems/", ""), reward.ItemCount);
144
147
}
145
if (reward.rewardType == "RT_RESOURCE") {
146
await addItem(inventory, reward.itemType.replace("StoreItems/", ""), reward.amount);
147
} else {
148
await addItem(inventory, reward.itemType.replace("StoreItems/", ""));
148
} else if (fixedLevelRewards.levelKeyRewards2) {
149
for (const reward of fixedLevelRewards.levelKeyRewards2) {
150
if (reward.rewardType == "RT_CREDITS") {
151
inventory.RegularCredits += reward.amount;
152
continue;
153
}
154
if (reward.rewardType == "RT_RESOURCE") {
155
await addItem(inventory, reward.itemType.replace("StoreItems/", ""), reward.amount);
156
} else {
157
await addItem(inventory, reward.itemType.replace("StoreItems/", ""));
158
}
149
159
}
150
160
}
151
161
}