返回提交历史
Modified
src/controllers/api/sellController.ts
+90
-18
XFEstudio/SpaceNinjaServer
feat: more comprehensive handling of railjack items in sellController (#1687)
Closes #1675 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1687 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
8a1603a6
代码差异
1 个文件
+90
-18
@@ -7,16 +7,18 @@ import {
7
7
addMiscItems,
8
8
addConsumables,
9
9
freeUpSlot,
10
combineInventoryChanges
10
combineInventoryChanges,
11
addCrewShipRawSalvage
11
12
} from "@/src/services/inventoryService";
12
13
import { InventorySlot } from "@/src/types/inventoryTypes/inventoryTypes";
13
14
import { ExportDojoRecipes } from "warframe-public-export-plus";
14
15
import { IInventoryChanges } from "@/src/types/purchaseTypes";
16
import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
15
17
16
18
export const sellController: RequestHandler = async (req, res) => {
17
19
const payload = JSON.parse(String(req.body)) as ISellRequest;
18
20
const accountId = await getAccountIdForRequest(req);
19
const requiredFields = new Set();
21
const requiredFields = new Set<keyof TInventoryDatabaseDocument>();
20
22
if (payload.SellCurrency == "SC_RegularCredits") {
21
23
requiredFields.add("RegularCredits");
22
24
} else if (payload.SellCurrency == "SC_FusionPoints") {
@@ -25,7 +27,7 @@ export const sellController: RequestHandler = async (req, res) => {
25
27
requiredFields.add("MiscItems");
26
28
}
27
29
for (const key of Object.keys(payload.Items)) {
28
requiredFields.add(key);
30
requiredFields.add(key as keyof TInventoryDatabaseDocument);
29
31
}
30
32
if (requiredFields.has("Upgrades")) {
31
33
requiredFields.add("RawUpgrades");
@@ -51,8 +53,15 @@ export const sellController: RequestHandler = async (req, res) => {
51
53
if (payload.Items.Hoverboards) {
52
54
requiredFields.add(InventorySlot.SPACESUITS);
53
55
}
54
if (payload.Items.CrewShipWeapons) {
56
if (payload.Items.CrewShipWeapons || payload.Items.CrewShipWeaponSkins) {
55
57
requiredFields.add(InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
58
requiredFields.add("CrewShipRawSalvage");
59
if (payload.Items.CrewShipWeapons) {
60
requiredFields.add("CrewShipSalvagedWeapons");
61
}
62
if (payload.Items.CrewShipWeaponSkins) {
63
requiredFields.add("CrewShipSalvagedWeaponSkins");
64
}
56
65
}
57
66
const inventory = await getInventory(accountId, Array.from(requiredFields).join(" "));
58
67
@@ -76,7 +85,7 @@ export const sellController: RequestHandler = async (req, res) => {
76
85
}
77
86
]);
78
87
} else if (payload.SellCurrency == "SC_Resources") {
79
// Will add appropriate MiscItems from CrewShipWeapons
88
// Will add appropriate MiscItems from CrewShipWeapons or CrewShipWeaponSkins
80
89
} else {
81
90
throw new Error("Unknown SellCurrency: " + payload.SellCurrency);
82
91
}
@@ -157,19 +166,51 @@ export const sellController: RequestHandler = async (req, res) => {
157
166
}
158
167
if (payload.Items.CrewShipWeapons) {
159
168
payload.Items.CrewShipWeapons.forEach(sellItem => {
160
const index = inventory.CrewShipWeapons.findIndex(x => x._id.equals(sellItem.String));
161
if (index != -1) {
162
const itemType = inventory.CrewShipWeapons[index].ItemType;
163
const recipe = Object.values(ExportDojoRecipes.fabrications).find(x => x.resultType == itemType)!;
164
const miscItemChanges = recipe.ingredients.map(x => ({
165
ItemType: x.ItemType,
166
ItemCount: Math.trunc(x.ItemCount * 0.8)
167
}));
168
addMiscItems(inventory, miscItemChanges);
169
combineInventoryChanges(inventoryChanges, { MiscItems: miscItemChanges });
170
171
inventory.CrewShipWeapons.splice(index, 1);
172
freeUpSlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
169
if (sellItem.String[0] == "/") {
170
addCrewShipRawSalvage(inventory, [
171
{
172
ItemType: sellItem.String,
173
ItemCount: sellItem.Count * -1
174
}
175
]);
176
} else {
177
const index = inventory.CrewShipWeapons.findIndex(x => x._id.equals(sellItem.String));
178
if (index != -1) {
179
if (payload.SellCurrency == "SC_Resources") {
180
refundPartialBuildCosts(inventory, inventory.CrewShipWeapons[index].ItemType, inventoryChanges);
181
}
182
inventory.CrewShipWeapons.splice(index, 1);
183
freeUpSlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
184
} else {
185
inventory.CrewShipSalvagedWeapons.pull({ _id: sellItem.String });
186
}
187
}
188
});
189
}
190
if (payload.Items.CrewShipWeaponSkins) {
191
payload.Items.CrewShipWeaponSkins.forEach(sellItem => {
192
if (sellItem.String[0] == "/") {
193
addCrewShipRawSalvage(inventory, [
194
{
195
ItemType: sellItem.String,
196
ItemCount: sellItem.Count * -1
197
}
198
]);
199
} else {
200
const index = inventory.CrewShipWeaponSkins.findIndex(x => x._id.equals(sellItem.String));
201
if (index != -1) {
202
if (payload.SellCurrency == "SC_Resources") {
203
refundPartialBuildCosts(
204
inventory,
205
inventory.CrewShipWeaponSkins[index].ItemType,
206
inventoryChanges
207
);
208
}
209
inventory.CrewShipWeaponSkins.splice(index, 1);
210
freeUpSlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
211
} else {
212
inventory.CrewShipSalvagedWeaponSkins.pull({ _id: sellItem.String });
213
}
173
214
}
174
215
});
175
216
}
@@ -243,6 +284,7 @@ interface ISellRequest {
243
284
Hoverboards?: ISellItem[];
244
285
Drones?: ISellItem[];
245
286
CrewShipWeapons?: ISellItem[];
287
CrewShipWeaponSkins?: ISellItem[];
246
288
};
247
289
SellPrice: number;
248
290
SellCurrency:
@@ -259,3 +301,33 @@ interface ISellItem {
259
301
String: string; // oid or uniqueName
260
302
Count: number;
261
303
}
304
305
const refundPartialBuildCosts = (
306
inventory: TInventoryDatabaseDocument,
307
itemType: string,
308
inventoryChanges: IInventoryChanges
309
): void => {
310
// House versions
311
const research = Object.values(ExportDojoRecipes.research).find(x => x.resultType == itemType);
312
if (research) {
313
const miscItemChanges = research.ingredients.map(x => ({
314
ItemType: x.ItemType,
315
ItemCount: Math.trunc(x.ItemCount * 0.8)
316
}));
317
addMiscItems(inventory, miscItemChanges);
318
combineInventoryChanges(inventoryChanges, { MiscItems: miscItemChanges });
319
return;
320
}
321
322
// Sigma versions
323
const recipe = Object.values(ExportDojoRecipes.fabrications).find(x => x.resultType == itemType);
324
if (recipe) {
325
const miscItemChanges = recipe.ingredients.map(x => ({
326
ItemType: x.ItemType,
327
ItemCount: Math.trunc(x.ItemCount * 0.8)
328
}));
329
addMiscItems(inventory, miscItemChanges);
330
combineInventoryChanges(inventoryChanges, { MiscItems: miscItemChanges });
331
return;
332
}
333
};