返回提交历史
Modified
src/controllers/custom/manageQuestsController.ts
+11
-7
Modified
src/services/inventoryService.ts
+3
-2
Modified
src/services/itemDataService.ts
+11
-2
Modified
src/services/missionInventoryUpdateService.ts
+1
-1
Modified
src/services/questService.ts
+9
-6
Added
static/fixed_responses/vorsPrizePreU40Rewards.json
+165
-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
代码差异
6 个文件
+200
-18
@@ -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
}
@@ -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) {
@@ -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
@@ -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(
@@ -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/")) {
@@ -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
}