返回提交历史
Modified
src/controllers/api/inventoryController.ts
+1
-0
Modified
src/controllers/api/tauntHistoryController.ts
+1
-8
Modified
src/controllers/api/upgradesController.ts
+19
-134
Modified
src/models/inventoryModels/inventoryModel.ts
+17
-3
Modified
src/types/inventoryTypes/inventoryTypes.ts
+4
-1
Modified
src/types/requestTypes.ts
+44
-7
Modified
static/fixed_responses/postTutorialInventory.json
+715
-26
XFEstudio/SpaceNinjaServer
w.i.p mods
e8240870
代码差异
7 个文件
+801
-179
@@ -4,6 +4,7 @@ import { toInventoryResponse } from "@/src/helpers/inventoryHelpers";
4
4
import { Inventory } from "@/src/models/inventoryModels/inventoryModel";
5
5
import { config } from "@/src/services/configService";
6
6
import { IInventoryDatabase } from "@/src/types/inventoryTypes/inventoryTypes";
7
//import new_inventory from "@/static/fixed_responses/postTutorialInventory.json";
7
8
8
9
// eslint-disable-next-line @typescript-eslint/no-misused-promises
9
10
const inventoryController: RequestHandler = async (request, response) => {
@@ -2,7 +2,6 @@ import { RequestHandler } from "express";
2
2
import { getAccountIdForRequest } from "@/src/services/loginService";
3
3
import { getInventory } from "@/src/services/inventoryService";
4
4
import { ITaunt } from "@/src/types/inventoryTypes/inventoryTypes";
5
import { logger } from "@/src/utils/logger";
6
5
7
6
// eslint-disable-next-line @typescript-eslint/no-misused-promises
8
7
export const tauntHistoryController: RequestHandler = async (req, res) => {
@@ -10,14 +9,8 @@ export const tauntHistoryController: RequestHandler = async (req, res) => {
10
9
const inventory = await getInventory(accountId);
11
10
if (req.body !== undefined) {
12
11
const clientTaunt = JSON.parse(String(req.body)) as ITaunt;
13
logger.debug(`updating taunt ${clientTaunt.node} to state ${clientTaunt.state}`);
14
12
inventory.TauntHistory ??= [];
15
const taunt = inventory.TauntHistory.find(x => x.node == clientTaunt.node);
16
if (taunt) {
17
taunt.state = clientTaunt.state;
18
} else {
19
inventory.TauntHistory.push(clientTaunt);
20
}
13
inventory.TauntHistory.push(clientTaunt);
21
14
await inventory.save();
22
15
res.end();
23
16
} else {
@@ -1,149 +1,34 @@
1
1
import { RequestHandler } from "express";
2
2
import { IUpgradesRequest } from "@/src/types/requestTypes";
3
import {
4
ArtifactPolarity,
5
IEquipmentDatabase,
6
EquipmentFeatures
7
} from "@/src/types/inventoryTypes/commonInventoryTypes";
8
import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
9
3
import { getAccountIdForRequest } from "@/src/services/loginService";
10
import { addMiscItems, getInventory, updateCurrency } from "@/src/services/inventoryService";
4
import { getInventory } from "@/src/services/inventoryService";
11
5
12
6
// eslint-disable-next-line @typescript-eslint/no-misused-promises
13
7
export const upgradesController: RequestHandler = async (req, res) => {
14
8
const accountId = await getAccountIdForRequest(req);
15
9
const payload = JSON.parse(String(req.body)) as IUpgradesRequest;
16
10
const inventory = await getInventory(accountId);
17
const InventoryChanges: any = {};
18
for (const operation of payload.Operations) {
19
if (
20
operation.UpgradeRequirement == "/Lotus/Types/Items/MiscItems/ModSlotUnlocker" ||
21
operation.UpgradeRequirement == "/Lotus/Types/Items/MiscItems/CustomizationSlotUnlocker"
22
) {
23
await updateCurrency(10, true, accountId);
24
} else {
25
addMiscItems(inventory, [
26
{
27
ItemType: operation.UpgradeRequirement,
28
ItemCount: -1
29
} satisfies IMiscItem
30
]);
11
console.log(req.body);
12
for (const item of payload.UpgradesToAttach) {
13
for (const upgrade of inventory.Upgrades) {
14
if (upgrade._id?.toString() == item.ItemId.$id) {
15
upgrade.UpgradeFingerprint = item.UpgradeFingerprint;
16
upgrade.Slot = item.Slot;
17
upgrade.ParentId = payload.Weapon.ItemId;
18
}
31
19
}
20
}
32
21
33
switch (operation.UpgradeRequirement) {
34
case "/Lotus/Types/Items/MiscItems/OrokinReactor":
35
case "/Lotus/Types/Items/MiscItems/OrokinCatalyst":
36
for (const item of inventory[payload.ItemCategory]) {
37
if (item._id.toString() == payload.ItemId.$id) {
38
item.Features ??= 0;
39
item.Features |= EquipmentFeatures.DOUBLE_CAPACITY;
40
break;
41
}
42
}
43
break;
44
case "/Lotus/Types/Items/MiscItems/UtilityUnlocker":
45
case "/Lotus/Types/Items/MiscItems/WeaponUtilityUnlocker":
46
for (const item of inventory[payload.ItemCategory]) {
47
if (item._id.toString() == payload.ItemId.$id) {
48
item.Features ??= 0;
49
item.Features |= EquipmentFeatures.UTILITY_SLOT;
50
break;
51
}
52
}
53
break;
54
case "/Lotus/Types/Items/MiscItems/HeavyWeaponCatalyst":
55
console.assert(payload.ItemCategory == "SpaceGuns");
56
for (const item of inventory[payload.ItemCategory]) {
57
if (item._id.toString() == payload.ItemId.$id) {
58
item.Features ??= 0;
59
item.Features |= EquipmentFeatures.GRAVIMAG_INSTALLED;
60
break;
61
}
62
}
63
break;
64
case "/Lotus/Types/Items/MiscItems/WeaponPrimaryArcaneUnlocker":
65
case "/Lotus/Types/Items/MiscItems/WeaponSecondaryArcaneUnlocker":
66
case "/Lotus/Types/Items/MiscItems/WeaponMeleeArcaneUnlocker":
67
case "/Lotus/Types/Items/MiscItems/WeaponAmpArcaneUnlocker":
68
for (const item of inventory[payload.ItemCategory]) {
69
if (item._id.toString() == payload.ItemId.$id) {
70
item.Features ??= 0;
71
item.Features |= EquipmentFeatures.ARCANE_SLOT;
72
break;
73
}
74
}
75
break;
76
case "/Lotus/Types/Items/MiscItems/Forma":
77
case "/Lotus/Types/Items/MiscItems/FormaUmbra":
78
case "/Lotus/Types/Items/MiscItems/FormaAura":
79
case "/Lotus/Types/Items/MiscItems/FormaStance":
80
for (const item of inventory[payload.ItemCategory]) {
81
if (item._id.toString() == payload.ItemId.$id) {
82
item.XP = 0;
83
setSlotPolarity(item, operation.PolarizeSlot, operation.PolarizeValue);
84
item.Polarized ??= 0;
85
item.Polarized += 1;
86
break;
87
}
88
}
89
break;
90
case "/Lotus/Types/Items/MiscItems/ModSlotUnlocker":
91
for (const item of inventory[payload.ItemCategory]) {
92
if (item._id.toString() == payload.ItemId.$id) {
93
item.ModSlotPurchases ??= 0;
94
item.ModSlotPurchases += 1;
95
InventoryChanges[payload.ItemCategory] = {
96
ItemId: {
97
$id: payload.ItemId.$id
98
},
99
ModSlotPurchases: item.ModSlotPurchases
100
};
101
break;
102
}
103
}
104
break;
105
case "/Lotus/Types/Items/MiscItems/CustomizationSlotUnlocker":
106
for (const item of inventory[payload.ItemCategory]) {
107
if (item._id.toString() == payload.ItemId.$id) {
108
item.CustomizationSlotPurchases ??= 0;
109
item.CustomizationSlotPurchases += 1;
110
InventoryChanges[payload.ItemCategory] = {
111
ItemId: {
112
$id: payload.ItemId.$id
113
},
114
CustomizationSlotPurchases: item.CustomizationSlotPurchases
115
};
116
break;
117
}
118
}
119
break;
120
case "":
121
console.assert(operation.OperationType == "UOT_SWAP_POLARITY");
122
for (const item of inventory[payload.ItemCategory]) {
123
if (item._id.toString() == payload.ItemId.$id) {
124
for (let i = 0; i != operation.PolarityRemap.length; ++i) {
125
if (operation.PolarityRemap[i].Slot != i) {
126
setSlotPolarity(item, i, operation.PolarityRemap[i].Value);
127
}
128
}
129
break;
130
}
131
}
132
break;
133
default:
134
throw new Error("Unsupported upgrade: " + operation.UpgradeRequirement);
22
for (const item of payload.UpgradesToDetach) {
23
for (const upgrade of inventory.Upgrades) {
24
if (upgrade._id?.toString() == item.ItemId.$id) {
25
upgrade.UpgradeFingerprint = undefined;
26
upgrade.Slot = undefined;
27
upgrade.ParentId = undefined;
28
}
135
29
}
136
30
}
137
await inventory.save();
138
res.json({ InventoryChanges });
139
};
140
31
141
const setSlotPolarity = (item: IEquipmentDatabase, slot: number, polarity: ArtifactPolarity): void => {
142
item.Polarity ??= [];
143
const entry = item.Polarity.find(entry => entry.Slot == slot);
144
if (entry) {
145
entry.Value = polarity;
146
} else {
147
item.Polarity.push({ Slot: slot, Value: polarity });
148
}
32
await inventory.save();
33
res.json({});
149
34
};
@@ -24,7 +24,8 @@ import {
24
24
IQuestKeyResponse,
25
25
IWeaponSkinDatabase,
26
26
IPeriodicMissionCompletionDatabase,
27
IPeriodicMissionCompletionResponse
27
IPeriodicMissionCompletionResponse,
28
ITaunt
28
29
} from "../../types/inventoryTypes/inventoryTypes";
29
30
import { IOid } from "../../types/commonTypes";
30
31
import {
@@ -237,10 +238,14 @@ RawUpgrades.set("toJSON", {
237
238
});
238
239
239
240
//TODO: find out what this is
240
const upgradesSchema = new Schema(
241
const upgradesSchema = new Schema<ICrewShipSalvagedWeaponSkin>(
241
242
{
242
243
UpgradeFingerprint: String,
243
ItemType: String
244
ItemType: String,
245
Slot: Number,
246
ParentId: {
247
$id: String
248
}
244
249
},
245
250
{ id: false }
246
251
);
@@ -458,6 +463,13 @@ periodicMissionCompletionsSchema.set("toJSON", {
458
463
}
459
464
});
460
465
466
const tauntSchema = new Schema<ITaunt>(
467
{
468
node: String
469
},
470
{ _id: false }
471
);
472
461
473
const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
462
474
{
463
475
accountOwnerId: Schema.Types.ObjectId,
@@ -528,6 +540,8 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
528
540
//Crafting Blueprint(Item Name + CompletionDate)
529
541
PendingRecipes: [pendingRecipeSchema],
530
542
543
TauntHistory: { type: [tauntSchema], default: undefined },
544
531
545
//Skins for Suits, Weapons etc.
532
546
WeaponSkins: [weaponSkinsSchema],
533
547
@@ -111,6 +111,7 @@ export type TSolarMapRegion =
111
111
export interface IPendingRecipeResponse extends Omit<IPendingRecipe, "CompletionDate"> {
112
112
CompletionDate: IMongoDate;
113
113
}
114
114
115
export interface IInventoryResponse {
115
116
Horses: IEquipmentDatabase[];
116
117
DrifterMelee: IEquipmentDatabase[];
@@ -395,6 +396,9 @@ export interface ICrewShipSalvagedWeaponSkin {
395
396
ItemType: string;
396
397
UpgradeFingerprint?: string;
397
398
ItemId?: IOid;
399
ParentId?: IOid;
400
Slot?: number;
401
_pid?: Types.ObjectId;
398
402
_id?: Types.ObjectId;
399
403
}
400
404
@@ -872,7 +876,6 @@ export interface INotePacks {
872
876
873
877
export interface ITaunt {
874
878
node: string;
875
state: "TS_UNLOCKED" | "TS_COMPLETED";
876
879
}
877
880
878
881
export interface IWeaponSkinDatabase {
@@ -1,5 +1,5 @@
1
1
import { IOid } from "./commonTypes";
2
import { ArtifactPolarity, IPolarity, IEquipmentClient } from "@/src/types/inventoryTypes/commonInventoryTypes";
2
import { IEquipmentClient } from "@/src/types/inventoryTypes/commonInventoryTypes";
3
3
import {
4
4
IBooster,
5
5
IChallengeProgress,
@@ -99,6 +99,26 @@ export interface IUpdateGlyphRequest {
99
99
AvatarImage: string;
100
100
}
101
101
102
export interface IUpgradesRequest {
103
Category: TEquipmentKey;
104
Weapon: IWeapon;
105
UpgradesToAttach: IUpgradesToAttach[];
106
UpgradesToDetach: IUpgradesToDetach[];
107
Cost: number;
108
UpgradeReq: string;
109
}
110
111
export interface IWeapon {
112
ItemType: string;
113
ItemId: IOid;
114
XP: number;
115
UpgradeVer: number;
116
UnlockLevel: number;
117
ExtraCapacity: number;
118
ExtraRemaining: number;
119
}
120
121
/*
102
122
export interface IUpgradesRequest {
103
123
ItemCategory: TEquipmentKey;
104
124
ItemId: IOid;
@@ -106,11 +126,28 @@ export interface IUpgradesRequest {
106
126
UpgradeVersion: number;
107
127
Operations: IUpgradeOperation[];
108
128
}
129
*/
130
131
export interface IUpgradesToAttach {
132
ItemType: string;
133
ItemId: IOid;
134
UpgradeFingerprint: string;
135
Slot: number;
136
ParentId: IOid;
137
}
109
138
110
export interface IUpgradeOperation {
111
OperationType: string;
112
UpgradeRequirement: string; // uniqueName of item being consumed
113
PolarizeSlot: number;
114
PolarizeValue: ArtifactPolarity;
115
PolarityRemap: IPolarity[];
139
export interface IUpgradesToDetach {
140
ItemType: string;
141
ItemId: IOid;
142
UpgradeFingerprint: string;
143
Slot: number;
144
ParentId: IOid;
116
145
}
146
147
// export interface IUpgradeOperation {
148
// OperationType: string;
149
// UpgradeRequirement: string; // uniqueName of item being consumed
150
// PolarizeSlot: number;
151
// PolarizeValue: ArtifactPolarity;
152
// PolarityRemap: IPolarity[];
153
// }