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

SpaceNinjaServer

A simple server for a small space ninja game

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

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
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

1 个文件 +90 -18
Modified src/controllers/api/sellController.ts +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 };