返回提交历史
Modified
src/controllers/api/nemesisController.ts
+7
-51
Added
src/helpers/nemesisHelpers.ts
+32
-0
Modified
src/models/inventoryModels/inventoryModel.ts
+3
-1
Modified
src/services/missionInventoryUpdateService.ts
+45
-0
Modified
src/types/inventoryTypes/inventoryTypes.ts
+2
-0
Modified
src/types/purchaseTypes.ts
+2
-0
Modified
src/types/requestTypes.ts
+1
-0
XFEstudio/SpaceNinjaServer
feat: clearing lich infuance (#1270)
Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1270 Reviewed-by: Sainan <sainan@calamity.inc> Co-authored-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Co-committed-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>
c6a27851
代码差异
7 个文件
+92
-52
@@ -1,17 +1,12 @@
1
import { getInfNodes } from "@/src/helpers/nemesisHelpers";
1
2
import { getJSONfromString } from "@/src/helpers/stringHelpers";
2
3
import { freeUpSlot, getInventory } from "@/src/services/inventoryService";
3
4
import { getAccountIdForRequest } from "@/src/services/loginService";
4
5
import { SRng } from "@/src/services/rngService";
5
6
import { IMongoDate, IOid } from "@/src/types/commonTypes";
6
import {
7
IInfNode,
8
IInnateDamageFingerprint,
9
InventorySlot,
10
TEquipmentKey
11
} from "@/src/types/inventoryTypes/inventoryTypes";
7
import { IInnateDamageFingerprint, InventorySlot, TEquipmentKey } from "@/src/types/inventoryTypes/inventoryTypes";
12
8
import { logger } from "@/src/utils/logger";
13
9
import { RequestHandler } from "express";
14
import { ExportRegions } from "warframe-public-export-plus";
15
10
16
11
export const nemesisController: RequestHandler = async (req, res) => {
17
12
const accountId = await getAccountIdForRequest(req);
@@ -55,49 +50,8 @@ export const nemesisController: RequestHandler = async (req, res) => {
55
50
const body = getJSONfromString<INemesisStartRequest>(String(req.body));
56
51
body.target.fp = BigInt(body.target.fp);
57
52
58
let infNodes: IInfNode[];
59
53
let weaponIdx = -1;
60
if (body.target.Faction == "FC_INFESTATION") {
61
infNodes = [
62
{
63
Node: "SolNode852",
64
Influence: 1
65
},
66
{
67
Node: "SolNode850",
68
Influence: 1
69
},
70
{
71
Node: "SolNode851",
72
Influence: 1
73
},
74
{
75
Node: "SolNode853",
76
Influence: 1
77
},
78
{
79
Node: "SolNode854",
80
Influence: 1
81
}
82
];
83
} else {
84
infNodes = [];
85
for (const [key, value] of Object.entries(ExportRegions)) {
86
if (
87
value.systemIndex == 2 && // earth
88
value.nodeType != 3 && // not hub
89
value.nodeType != 7 && // not junction
90
value.missionIndex && // must have a mission type and not assassination
91
value.missionIndex != 28 && // not open world
92
value.missionIndex != 32 && // not railjack
93
value.missionIndex != 41 && // not saya's visions
94
value.name.indexOf("Archwing") == -1
95
) {
96
//console.log(dict_en[value.name]);
97
infNodes.push({ Node: key, Influence: 1 });
98
}
99
}
100
54
if (body.target.Faction != "FC_INFESTATION") {
101
55
let weapons: readonly string[];
102
56
if (body.target.manifest == "/Lotus/Types/Game/Nemesis/KuvaLich/KuvaLichManifestVersionSix") {
103
57
weapons = kuvaLichVersionSixWeapons;
@@ -135,14 +89,16 @@ export const nemesisController: RequestHandler = async (req, res) => {
135
89
k: false,
136
90
Traded: false,
137
91
d: new Date(),
138
InfNodes: infNodes,
92
InfNodes: getInfNodes(body.target.Faction, 0),
139
93
GuessHistory: [],
140
94
Hints: [],
141
95
HintProgress: 0,
142
96
Weakened: body.target.Weakened,
143
97
PrevOwners: 0,
144
98
HenchmenKilled: 0,
145
SecondInCommand: body.target.SecondInCommand
99
SecondInCommand: body.target.SecondInCommand,
100
MissionCount: 0,
101
LastEnc: 0
146
102
};
147
103
inventory.NemesisAbandonedRewards = []; // unclear if we need to do this since the client also submits this with missionInventoryUpdate
148
104
await inventory.save();
@@ -0,0 +1,32 @@
1
import { ExportRegions } from "warframe-public-export-plus";
2
import { IInfNode } from "@/src/types/inventoryTypes/inventoryTypes";
3
4
export const getInfNodes = (faction: string, rank: number): IInfNode[] => {
5
const infNodes = [];
6
const systemIndex = systemIndexes[faction][rank];
7
for (const [key, value] of Object.entries(ExportRegions)) {
8
if (
9
value.systemIndex === systemIndex &&
10
value.nodeType != 3 && // not hub
11
value.nodeType != 7 && // not junction
12
value.missionIndex && // must have a mission type and not assassination
13
value.missionIndex != 28 && // not open world
14
value.missionIndex != 32 && // not railjack
15
value.missionIndex != 41 && // not saya's visions
16
value.missionIndex != 42 && // not face off
17
value.name.indexOf("1999NodeI") == -1 && // not stage defence
18
value.name.indexOf("1999NodeJ") == -1 && // not lich bounty
19
value.name.indexOf("Archwing") == -1
20
) {
21
//console.log(dict_en[value.name]);
22
infNodes.push({ Node: key, Influence: 1 });
23
}
24
}
25
return infNodes;
26
};
27
28
const systemIndexes: Record<string, number[]> = {
29
FC_GRINEER: [2, 3, 9, 11, 18],
30
FC_CORPUS: [1, 15, 4, 7, 8],
31
FC_INFESTATION: [23]
32
};
@@ -1090,7 +1090,9 @@ const nemesisSchema = new Schema<INemesisDatabase>(
1090
1090
HenchmenKilled: Number,
1091
1091
HintProgress: Number,
1092
1092
Hints: [Number],
1093
GuessHistory: [Number]
1093
GuessHistory: [Number],
1094
MissionCount: Number,
1095
LastEnc: Number
1094
1096
},
1095
1097
{ _id: false }
1096
1098
);
@@ -42,6 +42,7 @@ import { createMessage } from "./inboxService";
42
42
import kuriaMessage50 from "@/static/fixed_responses/kuriaMessages/fiftyPercent.json";
43
43
import kuriaMessage75 from "@/static/fixed_responses/kuriaMessages/seventyFivePercent.json";
44
44
import kuriaMessage100 from "@/static/fixed_responses/kuriaMessages/oneHundredPercent.json";
45
import { getInfNodes } from "@/src/helpers/nemesisHelpers";
45
46
46
47
const getRotations = (rotationCount: number): number[] => {
47
48
if (rotationCount === 0) return [0];
@@ -347,6 +348,7 @@ interface AddMissionRewardsReturnType {
347
348
export const addMissionRewards = async (
348
349
inventory: TInventoryDatabaseDocument,
349
350
{
351
Nemesis: nemesis,
350
352
RewardInfo: rewardInfo,
351
353
LevelKeyName: levelKeyName,
352
354
Missions: missions,
@@ -462,6 +464,49 @@ export const addMissionRewards = async (
462
464
}
463
465
}
464
466
467
if (inventory.Nemesis) {
468
if (
469
nemesis ||
470
(inventory.Nemesis.Faction == "FC_INFESTATION" &&
471
inventory.Nemesis.InfNodes.find(obj => obj.Node == rewardInfo.node))
472
) {
473
inventoryChanges.Nemesis ??= {};
474
const nodeIndex = inventory.Nemesis.InfNodes.findIndex(obj => obj.Node === rewardInfo.node);
475
if (nodeIndex !== -1) inventory.Nemesis.InfNodes.splice(nodeIndex, 1);
476
477
if (inventory.Nemesis.InfNodes.length <= 0) {
478
if (inventory.Nemesis.Faction != "FC_INFESTATION") {
479
inventory.Nemesis.Rank = Math.min(inventory.Nemesis.Rank + 1, 4);
480
inventoryChanges.Nemesis.Rank = inventory.Nemesis.Rank;
481
}
482
inventory.Nemesis.InfNodes = getInfNodes(inventory.Nemesis.Faction, inventory.Nemesis.Rank);
483
}
484
485
if (inventory.Nemesis.Faction == "FC_INFESTATION") {
486
inventoryChanges.Nemesis.HenchmenKilled ??= 0;
487
inventoryChanges.Nemesis.MissionCount ??= 0;
488
489
inventory.Nemesis.HenchmenKilled += 5;
490
inventory.Nemesis.MissionCount += 1;
491
492
inventoryChanges.Nemesis.HenchmenKilled += 5;
493
inventoryChanges.Nemesis.MissionCount += 1;
494
495
if (inventory.Nemesis.HenchmenKilled >= 100) {
496
inventory.Nemesis.InfNodes = [
497
{
498
Node: "CrewBattleNode559",
499
Influence: 1
500
}
501
];
502
inventory.Nemesis.Weakened = true;
503
inventoryChanges.Nemesis.Weakened = true;
504
}
505
}
506
507
inventoryChanges.Nemesis.InfNodes = inventory.Nemesis.InfNodes;
508
}
509
}
465
510
return { inventoryChanges, MissionRewards, credits };
466
511
};
467
512
@@ -814,6 +814,8 @@ export interface INemesisClient extends INemesisBaseClient {
814
814
HintProgress: number;
815
815
Hints: number[];
816
816
GuessHistory: number[];
817
MissionCount: number;
818
LastEnc: number;
817
819
}
818
820
819
821
export interface INemesisDatabase extends Omit<INemesisClient, "d"> {
@@ -3,6 +3,7 @@ import {
3
3
IDroneClient,
4
4
IInfestedFoundryClient,
5
5
IMiscItem,
6
INemesisClient,
6
7
ITypeCount,
7
8
TEquipmentKey
8
9
} from "./inventoryTypes/inventoryTypes";
@@ -41,6 +42,7 @@ export type IInventoryChanges = {
41
42
Drones?: IDroneClient[];
42
43
MiscItems?: IMiscItem[];
43
44
EmailItems?: ITypeCount[];
45
Nemesis?: Partial<INemesisClient>;
44
46
} & Record<
45
47
Exclude<
46
48
string,
@@ -109,6 +109,7 @@ export type IMissionInventoryUpdateRequest = {
109
109
DROP_MOD: number[];
110
110
}[];
111
111
DeathMarks?: string[];
112
Nemesis?: number;
112
113
} & {
113
114
[K in TEquipmentKey]?: IEquipmentClient[];
114
115
};