返回提交历史
Modified
package-lock.json
+4
-4
Modified
package.json
+1
-1
Modified
src/services/inventoryService.ts
+9
-10
Modified
src/services/loginService.ts
+1
-1
Modified
src/services/missionInventoryUpdateService.ts
+69
-1
Modified
src/types/worldStateTypes.ts
+1
-0
XFEstudio/XFESpaceNinjaServer
feat: rewards for overriden enemy caches (#2919)
Closes #2913 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2919 Reviewed-by: Sainan <63328889+sainan@users.noreply.github.com> Co-authored-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Co-committed-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>
2322a994
代码差异
6 个文件
+85
-17
@@ -18,7 +18,7 @@
18
18
"morgan": "^1.10.0",
19
19
"ncp": "^2.0.0",
20
20
"undici": "^7.10.0",
21
"warframe-public-export-plus": "^0.5.91",
21
"warframe-public-export-plus": "^0.5.92",
22
22
"warframe-riven-info": "^0.1.2",
23
23
"winston": "^3.17.0",
24
24
"winston-daily-rotate-file": "^5.0.0",
@@ -5534,9 +5534,9 @@
5534
5534
}
5535
5535
},
5536
5536
"node_modules/warframe-public-export-plus": {
5537
"version": "0.5.91",
5538
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.91.tgz",
5539
"integrity": "sha512-xp8rq/dvFC6+urb6vVFRtAmm1v0iE/ZALI3uVGBpblsVB/PWmGxjBBp8l00dCZs67JsqEKcrCcogKwtKTwDc1w=="
5537
"version": "0.5.92",
5538
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.92.tgz",
5539
"integrity": "sha512-5O5VtyVXxKtl5QdpzoVyKov5GX6t3z/U5tqPq73kjoSyA5NQT2V9sWsZK4ASyY8Edv9hNsdwlZdsdP8QmYbubg=="
5540
5540
},
5541
5541
"node_modules/warframe-riven-info": {
5542
5542
"version": "0.1.2",
@@ -36,7 +36,7 @@
36
36
"morgan": "^1.10.0",
37
37
"ncp": "^2.0.0",
38
38
"undici": "^7.10.0",
39
"warframe-public-export-plus": "^0.5.91",
39
"warframe-public-export-plus": "^0.5.92",
40
40
"warframe-riven-info": "^0.1.2",
41
41
"winston": "^3.17.0",
42
42
"winston-daily-rotate-file": "^5.0.0",
@@ -117,6 +117,7 @@ export const createInventory = async (
117
117
inventory.PlayedParkourTutorial = true;
118
118
await addStartingGear(inventory);
119
119
await completeQuest(inventory, "/Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain");
120
await completeQuest(inventory, "/Lotus/Types/Keys/ModQuest/ModQuestKeyChain");
120
121
121
122
const completedMissions = ["SolNode27", "SolNode89", "SolNode63", "SolNode85", "SolNode15", "SolNode79"];
122
123
@@ -134,16 +135,6 @@ export const createInventory = async (
134
135
}
135
136
};
136
137
137
//TODO: RawUpgrades might need to return a LastAdded
138
const awakeningRewards = [
139
"/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem1",
140
"/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem2",
141
"/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem3",
142
"/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem4",
143
"/Lotus/Types/Restoratives/LisetAutoHack",
144
"/Lotus/Upgrades/Mods/Warframe/AvatarShieldMaxMod"
145
];
146
147
138
export const addStartingGear = async (
148
139
inventory: TInventoryDatabaseDocument,
149
140
startingGear?: TPartialStartingGear
@@ -196,6 +187,14 @@ export const addStartingGear = async (
196
187
inventory.RegularCredits = 3000;
197
188
inventoryChanges.RegularCredits = 3000;
198
189
190
const awakeningRewards = [
191
"/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem1",
192
"/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem2",
193
"/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem3",
194
"/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem4",
195
"/Lotus/Types/Restoratives/LisetAutoHack"
196
];
197
199
198
for (const item of awakeningRewards) {
200
199
const inventoryDelta = await addItem(inventory, item);
201
200
combineInventoryChanges(inventoryChanges, inventoryDelta);
@@ -65,7 +65,7 @@ export const createPersonalRooms = async (accountId: Types.ObjectId, shipId: Typ
65
65
activeShipId: shipId
66
66
});
67
67
if (config.skipTutorial) {
68
// unlocked during Vor's Prize
68
// unlocked during Vor's Prize and The Teacher quests
69
69
const defaultFeatures = [
70
70
"/Lotus/Types/Items/ShipFeatureItems/MercuryNavigationFeatureItem",
71
71
"/Lotus/Types/Items/ShipFeatureItems/ArsenalFeatureItem",
@@ -8,6 +8,7 @@ import {
8
8
ExportAnimals,
9
9
ExportEnemies,
10
10
ExportFusionBundles,
11
ExportKeys,
11
12
ExportRegions,
12
13
ExportRelics,
13
14
ExportRewards
@@ -1141,6 +1142,7 @@ export const addMissionRewards = async (
1141
1142
const MissionRewards: IMissionReward[] = getRandomMissionDrops(
1142
1143
inventory,
1143
1144
rewardInfo,
1145
levelKeyName,
1144
1146
missions,
1145
1147
wagerTier,
1146
1148
firstCompletion
@@ -1756,6 +1758,7 @@ function getLevelCreditRewards(node: IRegion): number {
1756
1758
function getRandomMissionDrops(
1757
1759
inventory: TInventoryDatabaseDocument,
1758
1760
RewardInfo: IRewardInfo,
1761
levelKeyName: string | undefined,
1759
1762
mission: IMission | undefined,
1760
1763
tierOverride: number | undefined,
1761
1764
firstCompletion: boolean
@@ -2193,7 +2196,7 @@ function getRandomMissionDrops(
2193
2196
}
2194
2197
}
2195
2198
2196
if (region.cacheRewardManifest && RewardInfo.EnemyCachesFound) {
2199
if (region.cacheRewardManifest && RewardInfo.EnemyCachesFound && !RewardInfo.goalId) {
2197
2200
const deck = ExportRewards[region.cacheRewardManifest];
2198
2201
for (let rotation = 0; rotation != RewardInfo.EnemyCachesFound; ++rotation) {
2199
2202
const drop = getRandomRewardByChance(deck[rotation]);
@@ -2259,6 +2262,71 @@ function getRandomMissionDrops(
2259
2262
}
2260
2263
}
2261
2264
2265
if (RewardInfo.EnemyCachesFound) {
2266
if (RewardInfo.goalId) {
2267
const goal = getWorldState().Goals.find(x => x._id.$oid == RewardInfo.goalId);
2268
if (goal) {
2269
let currentMissionKey: string | undefined;
2270
if (RewardInfo.node == goal.Node) {
2271
currentMissionKey = goal.MissionKeyName;
2272
} else if (goal.ConcurrentNodes && goal.ConcurrentMissionKeyNames) {
2273
for (let i = 0; i < goal.ConcurrentNodes.length; i++) {
2274
if (RewardInfo.node == goal.ConcurrentNodes[i]) {
2275
currentMissionKey = goal.ConcurrentMissionKeyNames[i];
2276
break;
2277
}
2278
}
2279
}
2280
if (currentMissionKey) {
2281
const keyMeta = ExportKeys[currentMissionKey];
2282
if (keyMeta.cacheRewardManifest) {
2283
const deck = ExportRewards[keyMeta.cacheRewardManifest];
2284
for (let rotation = 0; rotation != RewardInfo.EnemyCachesFound; ++rotation) {
2285
const drop = getRandomRewardByChance(deck[rotation]);
2286
if (drop) {
2287
drops.push({
2288
StoreItem: drop.type,
2289
ItemCount: drop.itemCount,
2290
FromEnemyCache: true
2291
});
2292
}
2293
}
2294
}
2295
}
2296
}
2297
} else if (RewardInfo.alertId) {
2298
const alert = getWorldState().Alerts.find(x => x._id.$oid == RewardInfo.alertId);
2299
if (alert && alert.MissionInfo.enemyCacheOverride) {
2300
const deck = ExportRewards[alert.MissionInfo.enemyCacheOverride];
2301
for (let rotation = 0; rotation != RewardInfo.EnemyCachesFound; ++rotation) {
2302
const drop = getRandomRewardByChance(deck[rotation]);
2303
if (drop) {
2304
drops.push({
2305
StoreItem: drop.type,
2306
ItemCount: drop.itemCount,
2307
FromEnemyCache: true
2308
});
2309
}
2310
}
2311
}
2312
} else if (levelKeyName) {
2313
const keyMeta = ExportKeys[levelKeyName];
2314
if (keyMeta.cacheRewardManifest) {
2315
const deck = ExportRewards[keyMeta.cacheRewardManifest];
2316
for (let rotation = 0; rotation != RewardInfo.EnemyCachesFound; ++rotation) {
2317
const drop = getRandomRewardByChance(deck[rotation]);
2318
if (drop) {
2319
drops.push({
2320
StoreItem: drop.type,
2321
ItemCount: drop.itemCount,
2322
FromEnemyCache: true
2323
});
2324
}
2325
}
2326
}
2327
}
2328
}
2329
2262
2330
if (inventory.missionsCanGiveAllRelics) {
2263
2331
for (const drop of drops) {
2264
2332
const itemType = fromStoreItem(drop.StoreItem);
@@ -58,6 +58,7 @@ export interface IAlertMissionInfo {
58
58
maxEnemyLevel?: number;
59
59
maxWaveNum?: number;
60
60
descText?: string;
61
enemyCacheOverride?: string;
61
62
62
63
maxRotations?: number; // SNS specific field
63
64
}