返回提交历史
Added
src/controllers/api/evolveWeaponController.ts
+42
-0
Added
src/controllers/api/setWeaponSkillTreeController.ts
+24
-0
Modified
src/controllers/api/upgradesController.ts
+4
-4
Modified
src/models/inventoryModels/inventoryModel.ts
+12
-2
Modified
src/routes/api.ts
+4
-0
Modified
src/services/inventoryService.ts
+16
-0
Modified
src/types/inventoryTypes/commonInventoryTypes.ts
+7
-0
Modified
src/types/inventoryTypes/inventoryTypes.ts
+7
-1
Modified
src/types/requestTypes.ts
+2
-0
XFEstudio/XFESpaceNinjaServer
feat: implement incarnon genesis installation, challenges & skill tree (#333)
f0bb281f
代码差异
9 个文件
+118
-7
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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,
@@ -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);
@@ -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);
@@ -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;
@@ -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
}
@@ -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 {