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

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
AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>
提交于

代码差异

7 个文件 +92 -52
Modified src/controllers/api/nemesisController.ts +7 -51
@@ -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();
Added src/helpers/nemesisHelpers.ts +32 -0
@@ -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 };
Modified src/models/inventoryModels/inventoryModel.ts +3 -1
@@ -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 );
Modified src/services/missionInventoryUpdateService.ts +45 -0
@@ -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
Modified src/types/inventoryTypes/inventoryTypes.ts +2 -0
@@ -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"> {
Modified src/types/purchaseTypes.ts +2 -0
@@ -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,
Modified src/types/requestTypes.ts +1 -0
@@ -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 };