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