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

SpaceNinjaServer

A simple server for a small space ninja game

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

XFEstudio/SpaceNinjaServer

chore: override vor's prize level key rewards for pre-U40 clients (#2975)

Closes #2974 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2975 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>

82fe5980
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

6 个文件 +200 -18
Modified src/controllers/custom/manageQuestsController.ts +11 -7
@@ -37,7 +37,7 @@ export const manageQuestsController: RequestHandler = async (req, res) => {
37 37 switch (operation) {
38 38 case "completeAll": {
39 39 for (const questKey of inventory.QuestKeys) {
40 await completeQuest(inventory, questKey.ItemType);
40 await completeQuest(inventory, questKey.ItemType, undefined);
41 41 }
42 42 break;
43 43 }
@@ -72,7 +72,7 @@ export const manageQuestsController: RequestHandler = async (req, res) => {
72 72 break;
73 73 }
74 74
75 await completeQuest(inventory, questItemType);
75 await completeQuest(inventory, questItemType, undefined);
76 76 }
77 77 break;
78 78 }
@@ -137,7 +137,7 @@ export const manageQuestsController: RequestHandler = async (req, res) => {
137 137
138 138 if (currentStage + 1 == questManifest.chainStages?.length) {
139 139 logger.debug(`Trying to complete last stage with nextStage, calling completeQuest instead`);
140 await completeQuest(inventory, questKey.ItemType, true);
140 await completeQuest(inventory, questKey.ItemType, undefined, true);
141 141 } else {
142 142 if (run > 0) {
143 143 questKey.Progress[currentStage + 1].c = run;
@@ -151,10 +151,14 @@ export const manageQuestsController: RequestHandler = async (req, res) => {
151 151 });
152 152
153 153 if (currentStage > 0) {
154 await giveKeyChainMissionReward(inventory, {
155 KeyChain: questKey.ItemType,
156 ChainStage: currentStage
157 });
154 await giveKeyChainMissionReward(
155 inventory,
156 {
157 KeyChain: questKey.ItemType,
158 ChainStage: currentStage
159 },
160 undefined
161 );
158 162 }
159 163 }
160 164 }
Modified src/services/inventoryService.ts +3 -2
@@ -116,8 +116,8 @@ export const createInventory = async (
116 116 if (config.skipTutorial) {
117 117 inventory.PlayedParkourTutorial = true;
118 118 await addStartingGear(inventory);
119 await completeQuest(inventory, "/Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain");
120 await completeQuest(inventory, "/Lotus/Types/Keys/ModQuest/ModQuestKeyChain");
119 await completeQuest(inventory, "/Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain", undefined);
120 await completeQuest(inventory, "/Lotus/Types/Keys/ModQuest/ModQuestKeyChain", undefined);
121 121
122 122 const completedMissions = ["SolNode27", "SolNode89", "SolNode63", "SolNode85", "SolNode15", "SolNode79"];
123 123
@@ -1569,6 +1569,7 @@ const addCrewShip = async (
1569 1569 const questChanges = await completeQuest(
1570 1570 inventory,
1571 1571 "/Lotus/Types/Keys/RailJackBuildQuest/RailjackBuildQuestKeyChain",
1572 undefined,
1572 1573 false
1573 1574 );
1574 1575 if (questChanges) {
Modified src/services/itemDataService.ts +11 -2
@@ -40,6 +40,8 @@ import {
40 40 } from "warframe-public-export-plus";
41 41 import type { IMessage } from "../models/inboxModel.ts";
42 42 import { logger } from "../utils/logger.ts";
43 import { version_compare } from "../helpers/inventoryHelpers.ts";
44 import vorsPrizePreU40Rewards from "../../static/fixed_responses/vorsPrizePreU40Rewards.json" with { type: "json" };
43 45
44 46 export type WeaponTypeInternal =
45 47 | "LongGuns"
@@ -227,12 +229,13 @@ export const getKeyChainItems = ({ KeyChain, ChainStage }: IKeyChainRequest): st
227 229 };
228 230
229 231 export const getLevelKeyRewards = (
230 levelKey: string
232 levelKey: string,
233 buildLabel: string | undefined
231 234 ): { levelKeyRewards?: IMissionReward; levelKeyRewards2?: TReward[] } => {
232 235 const key = ExportKeys[levelKey] as IKey | undefined;
233 236
234 237 const levelKeyRewards = key?.missionReward;
235 const levelKeyRewards2 = key?.rewards;
238 let levelKeyRewards2 = key?.rewards;
236 239
237 240 if (!levelKeyRewards && !levelKeyRewards2) {
238 241 logger.warn(
@@ -240,6 +243,12 @@ export const getLevelKeyRewards = (
240 243 );
241 244 }
242 245
246 if (buildLabel && version_compare(buildLabel, "2025.10.14.16.10") < 0) {
247 if (levelKey in vorsPrizePreU40Rewards) {
248 levelKeyRewards2 = vorsPrizePreU40Rewards[levelKey as keyof typeof vorsPrizePreU40Rewards] as TReward[];
249 }
250 }
251
243 252 return {
244 253 levelKeyRewards,
245 254 levelKeyRewards2
Modified src/services/missionInventoryUpdateService.ts +1 -1
@@ -1219,7 +1219,7 @@ export const addMissionRewards = async (
1219 1219 }
1220 1220
1221 1221 if (levelKeyName) {
1222 const fixedLevelRewards = getLevelKeyRewards(levelKeyName);
1222 const fixedLevelRewards = getLevelKeyRewards(levelKeyName, account.BuildLabel);
1223 1223 //logger.debug(`fixedLevelRewards ${fixedLevelRewards}`);
1224 1224 if (fixedLevelRewards.levelKeyRewards) {
1225 1225 missionCompletionCredits += addFixedLevelRewards(
Modified src/services/questService.ts +9 -6
@@ -149,6 +149,7 @@ export const addQuestKey = (
149 149 export const completeQuest = async (
150 150 inventory: TInventoryDatabaseDocument,
151 151 questKey: string,
152 buildLabel: string | undefined,
152 153 sendMessages: boolean = false
153 154 ): Promise<void | IQuestKeyClient> => {
154 155 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
@@ -197,8 +198,8 @@ export const completeQuest = async (
197 198 if (stage.c <= run) {
198 199 stage.c = run;
199 200 await giveKeyChainStageTriggered(inventory, { KeyChain: questKey, ChainStage: i }, sendMessages);
200 await giveKeyChainMissionReward(inventory, { KeyChain: questKey, ChainStage: i });
201 await installShipFeatures(inventory, { KeyChain: questKey, ChainStage: i });
201 await giveKeyChainMissionReward(inventory, { KeyChain: questKey, ChainStage: i }, buildLabel);
202 await installShipFeatures(inventory, { KeyChain: questKey, ChainStage: i }, buildLabel);
202 203 }
203 204 }
204 205
@@ -400,7 +401,8 @@ export const giveKeyChainMessage = async (
400 401
401 402 export const giveKeyChainMissionReward = async (
402 403 inventory: TInventoryDatabaseDocument,
403 keyChainInfo: IKeyChainRequest
404 keyChainInfo: IKeyChainRequest,
405 buildLabel: string | undefined
404 406 ): Promise<void> => {
405 407 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
406 408 const chainStages = ExportKeys[keyChainInfo.KeyChain]?.chainStages;
@@ -409,7 +411,7 @@ export const giveKeyChainMissionReward = async (
409 411 const missionName = chainStages[keyChainInfo.ChainStage].key;
410 412 const questKey = inventory.QuestKeys.find(q => q.ItemType === keyChainInfo.KeyChain);
411 413 if (missionName && questKey) {
412 const fixedLevelRewards = getLevelKeyRewards(missionName);
414 const fixedLevelRewards = getLevelKeyRewards(missionName, buildLabel);
413 415 const run = questKey.Progress?.[0]?.c ?? 0;
414 416 if (fixedLevelRewards.levelKeyRewards) {
415 417 const missionRewards: { StoreItem: string; ItemCount: number }[] = [];
@@ -463,7 +465,8 @@ export const giveKeyChainStageTriggered = async (
463 465
464 466 export const installShipFeatures = async (
465 467 inventory: TInventoryDatabaseDocument,
466 keyChainInfo: IKeyChainRequest
468 keyChainInfo: IKeyChainRequest,
469 buildLabel: string | undefined
467 470 ): Promise<void> => {
468 471 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
469 472 const chainStages = ExportKeys[keyChainInfo.KeyChain]?.chainStages;
@@ -478,7 +481,7 @@ export const installShipFeatures = async (
478 481 }
479 482 }
480 483 if (prevStage.key) {
481 const fixedLevelRewards = getLevelKeyRewards(prevStage.key);
484 const fixedLevelRewards = getLevelKeyRewards(prevStage.key, buildLabel);
482 485 if (fixedLevelRewards.levelKeyRewards?.items) {
483 486 for (const item of fixedLevelRewards.levelKeyRewards.items) {
484 487 if (item.startsWith("/Lotus/StoreItems/Types/Items/ShipFeatureItems/")) {
Added static/fixed_responses/vorsPrizePreU40Rewards.json +165 -0
@@ -0,0 +1,165 @@
1 {
2 "/Lotus/Types/Keys/VorsPrize/MissionOne": [
3 {
4 "rewardType": "RT_STORE_ITEM",
5 "itemType": "/Lotus/StoreItems/Types/Items/ShipFeatureItems/SocialMenuFeatureItem"
6 },
7 {
8 "rewardType": "RT_STORE_ITEM",
9 "itemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/WeaponMeleeDamageMod"
10 },
11 {
12 "rewardType": "RT_STORE_ITEM",
13 "itemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/WeaponDamageAmountMod"
14 },
15 {
16 "rewardType": "RT_STORE_ITEM",
17 "itemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/WeaponDamageAmountMod"
18 },
19 {
20 "rewardType": "RT_CREDITS",
21 "amount": 2500
22 }
23 ],
24 "/Lotus/Types/Keys/VorsPrize/MissionTwo": [
25 {
26 "rewardType": "RT_STORE_ITEM",
27 "itemType": "/Lotus/StoreItems/Types/Items/ShipFeatureItems/ModsFeatureItem"
28 },
29 {
30 "rewardType": "RT_STORE_ITEM",
31 "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarHealthMaxMod"
32 },
33 {
34 "rewardType": "RT_STORE_ITEM",
35 "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarShieldMaxMod"
36 },
37 {
38 "rewardType": "RT_STORE_ITEM",
39 "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarAbilityRangeMod"
40 },
41 {
42 "rewardType": "RT_STORE_ITEM",
43 "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarAbilityStrengthMod"
44 },
45 {
46 "rewardType": "RT_STORE_ITEM",
47 "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarAbilityDurationMod"
48 },
49 {
50 "rewardType": "RT_CREDITS",
51 "amount": 2500
52 }
53 ],
54 "/Lotus/Types/Keys/VorsPrize/MissionThree": {
55 "name": "/Lotus/Language/G1Quests/VorsPrize3",
56 "parentName": "/Lotus/Types/Keys/TestKeyA",
57 "codexSecret": true,
58 "rewards": [
59 {
60 "rewardType": "RT_STORE_ITEM",
61 "itemType": "/Lotus/StoreItems/Types/Items/ShipFeatureItems/FoundryFeatureItem"
62 },
63 {
64 "rewardType": "RT_STORE_ITEM",
65 "itemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/WeaponFireRateMod"
66 },
67 {
68 "rewardType": "RT_STORE_ITEM",
69 "itemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/WeaponFactionDamageCorpus"
70 },
71 {
72 "rewardType": "RT_STORE_ITEM",
73 "itemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/WeaponFactionDamageGrineer"
74 },
75 {
76 "rewardType": "RT_STORE_ITEM",
77 "itemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/WeaponFireDamageMod"
78 },
79 {
80 "rewardType": "RT_STORE_ITEM",
81 "itemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/WeaponElectricityDamageMod"
82 },
83 {
84 "rewardType": "RT_CREDITS",
85 "amount": 2500
86 }
87 ]
88 },
89 "/Lotus/Types/Keys/VorsPrize/MissionFour": [
90 {
91 "rewardType": "RT_STORE_ITEM",
92 "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarPickupBonusMod"
93 },
94 {
95 "rewardType": "RT_STORE_ITEM",
96 "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarPowerMaxMod"
97 },
98 {
99 "rewardType": "RT_STORE_ITEM",
100 "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarEnemyRadarMod"
101 },
102 {
103 "rewardType": "RT_CREDITS",
104 "amount": 2500
105 }
106 ],
107 "/Lotus/Types/Keys/VorsPrize/MissionFive": [
108 {
109 "rewardType": "RT_STORE_ITEM",
110 "itemType": "/Lotus/StoreItems/Types/Items/ShipFeatureItems/MercuryNavigationFeatureItem"
111 },
112 {
113 "rewardType": "RT_STORE_ITEM",
114 "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
115 },
116 {
117 "rewardType": "RT_STORE_ITEM",
118 "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
119 },
120 {
121 "rewardType": "RT_STORE_ITEM",
122 "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
123 },
124 {
125 "rewardType": "RT_STORE_ITEM",
126 "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
127 },
128 {
129 "rewardType": "RT_STORE_ITEM",
130 "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
131 },
132 {
133 "rewardType": "RT_STORE_ITEM",
134 "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
135 },
136 {
137 "rewardType": "RT_STORE_ITEM",
138 "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
139 },
140 {
141 "rewardType": "RT_STORE_ITEM",
142 "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
143 },
144 {
145 "rewardType": "RT_STORE_ITEM",
146 "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
147 },
148 {
149 "rewardType": "RT_STORE_ITEM",
150 "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
151 },
152 {
153 "rewardType": "RT_STORE_ITEM",
154 "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
155 },
156 {
157 "rewardType": "RT_STORE_ITEM",
158 "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
159 },
160 {
161 "rewardType": "RT_CREDITS",
162 "amount": 5000
163 }
164 ]
165 }