forked from OpenWF/SpaceNinjaServer
feat: clearing lich infuance (#1270)
Reviewed-on: OpenWF/SpaceNinjaServer#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>
This commit is contained in:
parent
beb02bffb0
commit
c6a2785175
@ -1,17 +1,12 @@
|
|||||||
|
import { getInfNodes } from "@/src/helpers/nemesisHelpers";
|
||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
||||||
import { freeUpSlot, getInventory } from "@/src/services/inventoryService";
|
import { freeUpSlot, getInventory } from "@/src/services/inventoryService";
|
||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||||
import { SRng } from "@/src/services/rngService";
|
import { SRng } from "@/src/services/rngService";
|
||||||
import { IMongoDate, IOid } from "@/src/types/commonTypes";
|
import { IMongoDate, IOid } from "@/src/types/commonTypes";
|
||||||
import {
|
import { IInnateDamageFingerprint, InventorySlot, TEquipmentKey } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||||
IInfNode,
|
|
||||||
IInnateDamageFingerprint,
|
|
||||||
InventorySlot,
|
|
||||||
TEquipmentKey
|
|
||||||
} from "@/src/types/inventoryTypes/inventoryTypes";
|
|
||||||
import { logger } from "@/src/utils/logger";
|
import { logger } from "@/src/utils/logger";
|
||||||
import { RequestHandler } from "express";
|
import { RequestHandler } from "express";
|
||||||
import { ExportRegions } from "warframe-public-export-plus";
|
|
||||||
|
|
||||||
export const nemesisController: RequestHandler = async (req, res) => {
|
export const nemesisController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
@ -55,49 +50,8 @@ export const nemesisController: RequestHandler = async (req, res) => {
|
|||||||
const body = getJSONfromString<INemesisStartRequest>(String(req.body));
|
const body = getJSONfromString<INemesisStartRequest>(String(req.body));
|
||||||
body.target.fp = BigInt(body.target.fp);
|
body.target.fp = BigInt(body.target.fp);
|
||||||
|
|
||||||
let infNodes: IInfNode[];
|
|
||||||
let weaponIdx = -1;
|
let weaponIdx = -1;
|
||||||
if (body.target.Faction == "FC_INFESTATION") {
|
if (body.target.Faction != "FC_INFESTATION") {
|
||||||
infNodes = [
|
|
||||||
{
|
|
||||||
Node: "SolNode852",
|
|
||||||
Influence: 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Node: "SolNode850",
|
|
||||||
Influence: 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Node: "SolNode851",
|
|
||||||
Influence: 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Node: "SolNode853",
|
|
||||||
Influence: 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Node: "SolNode854",
|
|
||||||
Influence: 1
|
|
||||||
}
|
|
||||||
];
|
|
||||||
} else {
|
|
||||||
infNodes = [];
|
|
||||||
for (const [key, value] of Object.entries(ExportRegions)) {
|
|
||||||
if (
|
|
||||||
value.systemIndex == 2 && // earth
|
|
||||||
value.nodeType != 3 && // not hub
|
|
||||||
value.nodeType != 7 && // not junction
|
|
||||||
value.missionIndex && // must have a mission type and not assassination
|
|
||||||
value.missionIndex != 28 && // not open world
|
|
||||||
value.missionIndex != 32 && // not railjack
|
|
||||||
value.missionIndex != 41 && // not saya's visions
|
|
||||||
value.name.indexOf("Archwing") == -1
|
|
||||||
) {
|
|
||||||
//console.log(dict_en[value.name]);
|
|
||||||
infNodes.push({ Node: key, Influence: 1 });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let weapons: readonly string[];
|
let weapons: readonly string[];
|
||||||
if (body.target.manifest == "/Lotus/Types/Game/Nemesis/KuvaLich/KuvaLichManifestVersionSix") {
|
if (body.target.manifest == "/Lotus/Types/Game/Nemesis/KuvaLich/KuvaLichManifestVersionSix") {
|
||||||
weapons = kuvaLichVersionSixWeapons;
|
weapons = kuvaLichVersionSixWeapons;
|
||||||
@ -135,14 +89,16 @@ export const nemesisController: RequestHandler = async (req, res) => {
|
|||||||
k: false,
|
k: false,
|
||||||
Traded: false,
|
Traded: false,
|
||||||
d: new Date(),
|
d: new Date(),
|
||||||
InfNodes: infNodes,
|
InfNodes: getInfNodes(body.target.Faction, 0),
|
||||||
GuessHistory: [],
|
GuessHistory: [],
|
||||||
Hints: [],
|
Hints: [],
|
||||||
HintProgress: 0,
|
HintProgress: 0,
|
||||||
Weakened: body.target.Weakened,
|
Weakened: body.target.Weakened,
|
||||||
PrevOwners: 0,
|
PrevOwners: 0,
|
||||||
HenchmenKilled: 0,
|
HenchmenKilled: 0,
|
||||||
SecondInCommand: body.target.SecondInCommand
|
SecondInCommand: body.target.SecondInCommand,
|
||||||
|
MissionCount: 0,
|
||||||
|
LastEnc: 0
|
||||||
};
|
};
|
||||||
inventory.NemesisAbandonedRewards = []; // unclear if we need to do this since the client also submits this with missionInventoryUpdate
|
inventory.NemesisAbandonedRewards = []; // unclear if we need to do this since the client also submits this with missionInventoryUpdate
|
||||||
await inventory.save();
|
await inventory.save();
|
||||||
|
32
src/helpers/nemesisHelpers.ts
Normal file
32
src/helpers/nemesisHelpers.ts
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import { ExportRegions } from "warframe-public-export-plus";
|
||||||
|
import { IInfNode } from "@/src/types/inventoryTypes/inventoryTypes";
|
||||||
|
|
||||||
|
export const getInfNodes = (faction: string, rank: number): IInfNode[] => {
|
||||||
|
const infNodes = [];
|
||||||
|
const systemIndex = systemIndexes[faction][rank];
|
||||||
|
for (const [key, value] of Object.entries(ExportRegions)) {
|
||||||
|
if (
|
||||||
|
value.systemIndex === systemIndex &&
|
||||||
|
value.nodeType != 3 && // not hub
|
||||||
|
value.nodeType != 7 && // not junction
|
||||||
|
value.missionIndex && // must have a mission type and not assassination
|
||||||
|
value.missionIndex != 28 && // not open world
|
||||||
|
value.missionIndex != 32 && // not railjack
|
||||||
|
value.missionIndex != 41 && // not saya's visions
|
||||||
|
value.missionIndex != 42 && // not face off
|
||||||
|
value.name.indexOf("1999NodeI") == -1 && // not stage defence
|
||||||
|
value.name.indexOf("1999NodeJ") == -1 && // not lich bounty
|
||||||
|
value.name.indexOf("Archwing") == -1
|
||||||
|
) {
|
||||||
|
//console.log(dict_en[value.name]);
|
||||||
|
infNodes.push({ Node: key, Influence: 1 });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return infNodes;
|
||||||
|
};
|
||||||
|
|
||||||
|
const systemIndexes: Record<string, number[]> = {
|
||||||
|
FC_GRINEER: [2, 3, 9, 11, 18],
|
||||||
|
FC_CORPUS: [1, 15, 4, 7, 8],
|
||||||
|
FC_INFESTATION: [23]
|
||||||
|
};
|
@ -1090,7 +1090,9 @@ const nemesisSchema = new Schema<INemesisDatabase>(
|
|||||||
HenchmenKilled: Number,
|
HenchmenKilled: Number,
|
||||||
HintProgress: Number,
|
HintProgress: Number,
|
||||||
Hints: [Number],
|
Hints: [Number],
|
||||||
GuessHistory: [Number]
|
GuessHistory: [Number],
|
||||||
|
MissionCount: Number,
|
||||||
|
LastEnc: Number
|
||||||
},
|
},
|
||||||
{ _id: false }
|
{ _id: false }
|
||||||
);
|
);
|
||||||
|
@ -42,6 +42,7 @@ import { createMessage } from "./inboxService";
|
|||||||
import kuriaMessage50 from "@/static/fixed_responses/kuriaMessages/fiftyPercent.json";
|
import kuriaMessage50 from "@/static/fixed_responses/kuriaMessages/fiftyPercent.json";
|
||||||
import kuriaMessage75 from "@/static/fixed_responses/kuriaMessages/seventyFivePercent.json";
|
import kuriaMessage75 from "@/static/fixed_responses/kuriaMessages/seventyFivePercent.json";
|
||||||
import kuriaMessage100 from "@/static/fixed_responses/kuriaMessages/oneHundredPercent.json";
|
import kuriaMessage100 from "@/static/fixed_responses/kuriaMessages/oneHundredPercent.json";
|
||||||
|
import { getInfNodes } from "@/src/helpers/nemesisHelpers";
|
||||||
|
|
||||||
const getRotations = (rotationCount: number): number[] => {
|
const getRotations = (rotationCount: number): number[] => {
|
||||||
if (rotationCount === 0) return [0];
|
if (rotationCount === 0) return [0];
|
||||||
@ -347,6 +348,7 @@ interface AddMissionRewardsReturnType {
|
|||||||
export const addMissionRewards = async (
|
export const addMissionRewards = async (
|
||||||
inventory: TInventoryDatabaseDocument,
|
inventory: TInventoryDatabaseDocument,
|
||||||
{
|
{
|
||||||
|
Nemesis: nemesis,
|
||||||
RewardInfo: rewardInfo,
|
RewardInfo: rewardInfo,
|
||||||
LevelKeyName: levelKeyName,
|
LevelKeyName: levelKeyName,
|
||||||
Missions: missions,
|
Missions: missions,
|
||||||
@ -462,6 +464,49 @@ export const addMissionRewards = async (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (inventory.Nemesis) {
|
||||||
|
if (
|
||||||
|
nemesis ||
|
||||||
|
(inventory.Nemesis.Faction == "FC_INFESTATION" &&
|
||||||
|
inventory.Nemesis.InfNodes.find(obj => obj.Node == rewardInfo.node))
|
||||||
|
) {
|
||||||
|
inventoryChanges.Nemesis ??= {};
|
||||||
|
const nodeIndex = inventory.Nemesis.InfNodes.findIndex(obj => obj.Node === rewardInfo.node);
|
||||||
|
if (nodeIndex !== -1) inventory.Nemesis.InfNodes.splice(nodeIndex, 1);
|
||||||
|
|
||||||
|
if (inventory.Nemesis.InfNodes.length <= 0) {
|
||||||
|
if (inventory.Nemesis.Faction != "FC_INFESTATION") {
|
||||||
|
inventory.Nemesis.Rank = Math.min(inventory.Nemesis.Rank + 1, 4);
|
||||||
|
inventoryChanges.Nemesis.Rank = inventory.Nemesis.Rank;
|
||||||
|
}
|
||||||
|
inventory.Nemesis.InfNodes = getInfNodes(inventory.Nemesis.Faction, inventory.Nemesis.Rank);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inventory.Nemesis.Faction == "FC_INFESTATION") {
|
||||||
|
inventoryChanges.Nemesis.HenchmenKilled ??= 0;
|
||||||
|
inventoryChanges.Nemesis.MissionCount ??= 0;
|
||||||
|
|
||||||
|
inventory.Nemesis.HenchmenKilled += 5;
|
||||||
|
inventory.Nemesis.MissionCount += 1;
|
||||||
|
|
||||||
|
inventoryChanges.Nemesis.HenchmenKilled += 5;
|
||||||
|
inventoryChanges.Nemesis.MissionCount += 1;
|
||||||
|
|
||||||
|
if (inventory.Nemesis.HenchmenKilled >= 100) {
|
||||||
|
inventory.Nemesis.InfNodes = [
|
||||||
|
{
|
||||||
|
Node: "CrewBattleNode559",
|
||||||
|
Influence: 1
|
||||||
|
}
|
||||||
|
];
|
||||||
|
inventory.Nemesis.Weakened = true;
|
||||||
|
inventoryChanges.Nemesis.Weakened = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inventoryChanges.Nemesis.InfNodes = inventory.Nemesis.InfNodes;
|
||||||
|
}
|
||||||
|
}
|
||||||
return { inventoryChanges, MissionRewards, credits };
|
return { inventoryChanges, MissionRewards, credits };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -814,6 +814,8 @@ export interface INemesisClient extends INemesisBaseClient {
|
|||||||
HintProgress: number;
|
HintProgress: number;
|
||||||
Hints: number[];
|
Hints: number[];
|
||||||
GuessHistory: number[];
|
GuessHistory: number[];
|
||||||
|
MissionCount: number;
|
||||||
|
LastEnc: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface INemesisDatabase extends Omit<INemesisClient, "d"> {
|
export interface INemesisDatabase extends Omit<INemesisClient, "d"> {
|
||||||
|
@ -3,6 +3,7 @@ import {
|
|||||||
IDroneClient,
|
IDroneClient,
|
||||||
IInfestedFoundryClient,
|
IInfestedFoundryClient,
|
||||||
IMiscItem,
|
IMiscItem,
|
||||||
|
INemesisClient,
|
||||||
ITypeCount,
|
ITypeCount,
|
||||||
TEquipmentKey
|
TEquipmentKey
|
||||||
} from "./inventoryTypes/inventoryTypes";
|
} from "./inventoryTypes/inventoryTypes";
|
||||||
@ -41,6 +42,7 @@ export type IInventoryChanges = {
|
|||||||
Drones?: IDroneClient[];
|
Drones?: IDroneClient[];
|
||||||
MiscItems?: IMiscItem[];
|
MiscItems?: IMiscItem[];
|
||||||
EmailItems?: ITypeCount[];
|
EmailItems?: ITypeCount[];
|
||||||
|
Nemesis?: Partial<INemesisClient>;
|
||||||
} & Record<
|
} & Record<
|
||||||
Exclude<
|
Exclude<
|
||||||
string,
|
string,
|
||||||
|
@ -109,6 +109,7 @@ export type IMissionInventoryUpdateRequest = {
|
|||||||
DROP_MOD: number[];
|
DROP_MOD: number[];
|
||||||
}[];
|
}[];
|
||||||
DeathMarks?: string[];
|
DeathMarks?: string[];
|
||||||
|
Nemesis?: number;
|
||||||
} & {
|
} & {
|
||||||
[K in TEquipmentKey]?: IEquipmentClient[];
|
[K in TEquipmentKey]?: IEquipmentClient[];
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user