XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFESpaceNinjaServer

feat: implement incarnon genesis installation, challenges & skill tree (#333)

f0bb281f
Sainan <sainan@calamity.gg>
提交于

代码差异

9 个文件 +118 -7
Added src/controllers/api/evolveWeaponController.ts +42 -0
@@ -0,0 +1,42 @@
1 import { RequestHandler } from "express";
2 import { getAccountIdForRequest } from "@/src/services/loginService";
3 import { getInventory } from "@/src/services/inventoryService";
4 import { getJSONfromString } from "@/src/helpers/stringHelpers";
5 import { WeaponTypeInternal } from "@/src/services/itemDataService";
6 import { EquipmentFeatures } from "@/src/types/inventoryTypes/commonInventoryTypes";
7
8 // eslint-disable-next-line @typescript-eslint/no-misused-promises
9 export const evolveWeaponController: RequestHandler = async (req, res) => {
10 const accountId = await getAccountIdForRequest(req);
11 const inventory = await getInventory(accountId);
12 const payload = getJSONfromString(req.body.toString()) as IEvolveWeaponRequest;
13 console.assert(payload.Action == "EWA_INSTALL");
14
15 // TODO: We should remove the Genesis item & its resources, but currently we don't know these "recipes".
16
17 const item = inventory[payload.Category].find(item => item._id.toString() == (req.query.ItemId as string))!;
18 item.Features ??= 0;
19 item.Features |= EquipmentFeatures.INCARNON_GENESIS;
20
21 item.SkillTree = "0";
22
23 inventory.EvolutionProgress ??= [];
24 if (!inventory.EvolutionProgress.find(entry => entry.ItemType == payload.EvoType)) {
25 inventory.EvolutionProgress.push({
26 Progress: 0,
27 Rank: 1,
28 ItemType: payload.EvoType
29 });
30 }
31
32 await inventory.save();
33 res.end();
34 };
35
36 interface IEvolveWeaponRequest {
37 Action: "EWA_INSTALL";
38 Category: WeaponTypeInternal;
39 Recipe: string; // e.g. "/Lotus/Types/Items/MiscItems/IncarnonAdapters/UnlockerBlueprints/DespairIncarnonBlueprint"
40 UninstallRecipe: "";
41 EvoType: string; // e.g. "/Lotus/Weapons/Tenno/ThrowingWeapons/StalkerKunai"
42 }
Added src/controllers/api/setWeaponSkillTreeController.ts +24 -0
@@ -0,0 +1,24 @@
1 import { RequestHandler } from "express";
2 import { getAccountIdForRequest } from "@/src/services/loginService";
3 import { getInventory } from "@/src/services/inventoryService";
4 import { getJSONfromString } from "@/src/helpers/stringHelpers";
5 import { WeaponTypeInternal } from "@/src/services/itemDataService";
6
7 // eslint-disable-next-line @typescript-eslint/no-misused-promises
8 export const setWeaponSkillTreeController: RequestHandler = async (req, res) => {
9 const accountId = await getAccountIdForRequest(req);
10 const inventory = await getInventory(accountId);
11 const payload = getJSONfromString(req.body.toString()) as ISetWeaponSkillTreeRequest;
12
13 const item = inventory[req.query.Category as WeaponTypeInternal].find(
14 item => item._id.toString() == (req.query.ItemId as string)
15 )!;
16 item.SkillTree = payload.SkillTree;
17
18 await inventory.save();
19 res.end();
20 };
21
22 interface ISetWeaponSkillTreeRequest {
23 SkillTree: string;
24 }
Modified src/controllers/api/upgradesController.ts +4 -4
@@ -1,6 +1,6 @@
1 1 import { RequestHandler } from "express";
2 2 import { IUpgradesRequest } from "@/src/types/requestTypes";
3 import { FocusSchool, IEquipmentDatabase } from "@/src/types/inventoryTypes/commonInventoryTypes";
3 import { FocusSchool, IEquipmentDatabase, EquipmentFeatures } from "@/src/types/inventoryTypes/commonInventoryTypes";
4 4 import { IMiscItem, TEquipmentKey } from "@/src/types/inventoryTypes/inventoryTypes";
5 5 import { getAccountIdForRequest } from "@/src/services/loginService";
6 6 import { addMiscItems, getInventory, updateCurrency } from "@/src/services/inventoryService";
@@ -32,7 +32,7 @@ export const upgradesController: RequestHandler = async (req, res) => {
32 32 for (const item of inventory[payload.ItemCategory as TEquipmentKey] as IEquipmentDatabase[]) {
33 33 if (item._id.toString() == payload.ItemId.$oid) {
34 34 item.Features ??= 0;
35 item.Features |= 1;
35 item.Features |= EquipmentFeatures.DOUBLE_CAPACITY;
36 36 break;
37 37 }
38 38 }
@@ -42,7 +42,7 @@ export const upgradesController: RequestHandler = async (req, res) => {
42 42 for (const item of inventory[payload.ItemCategory as TEquipmentKey] as IEquipmentDatabase[]) {
43 43 if (item._id.toString() == payload.ItemId.$oid) {
44 44 item.Features ??= 0;
45 item.Features |= 2;
45 item.Features |= EquipmentFeatures.UTILITY_SLOT;
46 46 break;
47 47 }
48 48 }
@@ -53,7 +53,7 @@ export const upgradesController: RequestHandler = async (req, res) => {
53 53 for (const item of inventory[payload.ItemCategory as TEquipmentKey] as IEquipmentDatabase[]) {
54 54 if (item._id.toString() == payload.ItemId.$oid) {
55 55 item.Features ??= 0;
56 item.Features |= 32;
56 item.Features |= EquipmentFeatures.ARCANE_SLOT;
57 57 break;
58 58 }
59 59 }
Modified src/models/inventoryModels/inventoryModel.ts +12 -2
@@ -35,7 +35,8 @@ import {
35 35 ITauntHistory,
36 36 IPeriodicMissionCompletionDatabase,
37 37 IPeriodicMissionCompletionResponse,
38 ILoreFragmentScan
38 ILoreFragmentScan,
39 IEvolutionProgress
39 40 } from "../../types/inventoryTypes/inventoryTypes";
40 41 import { IOid } from "../../types/commonTypes";
41 42 import {
@@ -562,6 +563,15 @@ const loreFragmentScansSchema = new Schema<ILoreFragmentScan>(
562 563 { _id: false }
563 564 );
564 565
566 const evolutionProgressSchema = new Schema<IEvolutionProgress>(
567 {
568 Progress: Number,
569 Rank: Number,
570 ItemType: String
571 },
572 { _id: false }
573 );
574
565 575 const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
566 576 {
567 577 accountOwnerId: Schema.Types.ObjectId,
@@ -881,7 +891,7 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
881 891
882 892 //Progress+Rank+ItemType(ZarimanPumpShotgun)
883 893 //https://warframe.fandom.com/wiki/Incarnon
884 EvolutionProgress: [Schema.Types.Mixed],
894 EvolutionProgress: { type: [evolutionProgressSchema], default: undefined },
885 895
886 896 //Unknown and system
887 897 DuviriInfo: DuviriInfoSchema,
Modified src/routes/api.ts +4 -0
@@ -7,6 +7,7 @@ import { createGuildController } from "@/src/controllers/api/createGuildControll
7 7 import { deleteSessionController } from "@/src/controllers/api/deleteSessionController";
8 8 import { dojoController } from "@/src/controllers/api/dojoController";
9 9 import { dronesController } from "@/src/controllers/api/dronesController";
10 import { evolveWeaponController } from "@/src/controllers/api/evolveWeaponController";
10 11 import { findSessionsController } from "@/src/controllers/api/findSessionsController";
11 12 import { focusController } from "@/src/controllers/api/focusController";
12 13 import { genericUpdateController } from "@/src/controllers/api/genericUpdateController";
@@ -47,6 +48,7 @@ import { setActiveShipController } from "@/src/controllers/api/setActiveShipCont
47 48 import { setBootLocationController } from "@/src/controllers/api/setBootLocationController";
48 49 import { setShipCustomizationsController } from "@/src/controllers/api/setShipCustomizationsController";
49 50 import { setSupportedSyndicateController } from "@/src/controllers/api/setSupportedSyndicateController";
51 import { setWeaponSkillTreeController } from "../controllers/api/setWeaponSkillTreeController";
50 52 import { shipDecorationsController } from "@/src/controllers/api/shipDecorationsController";
51 53 import { startDojoRecipeController } from "@/src/controllers/api/startDojoRecipeController";
52 54 import { startRecipeController } from "@/src/controllers/api/startRecipeController";
@@ -97,6 +99,7 @@ apiRouter.post("/addFriendImage.php", addFriendImageController);
97 99 apiRouter.post("/artifacts.php", artifactsController);
98 100 apiRouter.post("/claimCompletedRecipe.php", claimCompletedRecipeController);
99 101 apiRouter.post("/createGuild.php", createGuildController);
102 apiRouter.post("/evolveWeapon.php", evolveWeaponController);
100 103 apiRouter.post("/findSessions.php", findSessionsController);
101 104 apiRouter.post("/focus.php", focusController);
102 105 apiRouter.post("/genericUpdate.php", genericUpdateController);
@@ -115,6 +118,7 @@ apiRouter.post("/rerollRandomMod.php", rerollRandomModController);
115 118 apiRouter.post("/saveLoadout.php", saveLoadoutController);
116 119 apiRouter.post("/sell.php", sellController);
117 120 apiRouter.post("/setShipCustomizations.php", setShipCustomizationsController);
121 apiRouter.post("/setWeaponSkillTree.php", setWeaponSkillTreeController);
118 122 apiRouter.post("/shipDecorations.php", shipDecorationsController);
119 123 apiRouter.post("/startDojoRecipe.php", startDojoRecipeController);
120 124 apiRouter.post("/startRecipe.php", startRecipeController);
Modified src/services/inventoryService.ts +16 -0
@@ -629,6 +629,22 @@ export const missionInventoryUpdate = async (data: IMissionInventoryUpdateReques
629 629 // Gear XP
630 630 gearKeys.forEach(key => addGearExpByCategory(inventory, data[key], key));
631 631
632 // Incarnon Challenges
633 if (data.EvolutionProgress) {
634 for (const evoProgress of data.EvolutionProgress) {
635 const entry = inventory.EvolutionProgress
636 ? inventory.EvolutionProgress.find(entry => entry.ItemType == evoProgress.ItemType)
637 : undefined;
638 if (entry) {
639 entry.Progress = evoProgress.Progress;
640 entry.Rank = evoProgress.Rank;
641 } else {
642 inventory.EvolutionProgress ??= [];
643 inventory.EvolutionProgress.push(evoProgress);
644 }
645 }
646 }
647
632 648 // other
633 649 addMods(inventory, RawUpgrades);
634 650 addMiscItems(inventory, MiscItems);
Modified src/types/inventoryTypes/commonInventoryTypes.ts +7 -0
@@ -82,6 +82,13 @@ export interface IEquipmentClient extends Omit<IEquipmentDatabase, "_id"> {
82 82 ItemId: IOid;
83 83 }
84 84
85 export enum EquipmentFeatures {
86 DOUBLE_CAPACITY = 1,
87 UTILITY_SLOT = 2,
88 ARCANE_SLOT = 32,
89 INCARNON_GENESIS = 512
90 }
91
85 92 export interface IEquipmentDatabase {
86 93 ItemType: string;
87 94 ItemName?: string;
Modified src/types/inventoryTypes/inventoryTypes.ts +7 -1
@@ -246,7 +246,7 @@ export interface IInventoryResponse {
246 246 LastInventorySync: IOid;
247 247 NextRefill: IMongoDate;
248 248 ActiveLandscapeTraps: any[];
249 EvolutionProgress: any[];
249 EvolutionProgress?: IEvolutionProgress[];
250 250 RepVotes: any[];
251 251 LeagueTickets: any[];
252 252 Quests: any[];
@@ -867,3 +867,9 @@ export interface IWebFlags {
867 867 Anniversary2021: boolean;
868 868 HitDownloadBtn: IMongoDate;
869 869 }
870
871 export interface IEvolutionProgress {
872 Progress: number;
873 Rank: number;
874 ItemType: string;
875 }
Modified src/types/requestTypes.ts +2 -0
@@ -5,6 +5,7 @@ import {
5 5 IChallengeProgress,
6 6 IConsumable,
7 7 ICrewShipSalvagedWeaponSkin,
8 IEvolutionProgress,
8 9 IMiscItem,
9 10 IMission,
10 11 IRawUpgrade,
@@ -53,6 +54,7 @@ export interface IMissionInventoryUpdateRequest {
53 54 RewardInfo?: IMissionInventoryUpdateRequestRewardInfo;
54 55 FusionPoints?: number;
55 56 Missions?: IMission;
57 EvolutionProgress?: IEvolutionProgress[];
56 58 }
57 59
58 60 export interface IMissionInventoryUpdateRequestRewardInfo {