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: 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
OrdisPrime <134585663+OrdisPrime@users.noreply.github.com>
提交于

代码差异

5 个文件 +105 -61
Modified package-lock.json +4 -4
@@ -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",
Modified package.json +1 -1
@@ -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"
Modified src/services/itemDataService.ts +11 -10
@@ -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 => {
Modified src/services/missionInventoryUpdateService.ts +70 -37
@@ -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
Modified src/services/questService.ts +19 -9
@@ -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 }