fix: free slot when selling or otherwise getting rid of items (#1169)

Reviewed-on: OpenWF/SpaceNinjaServer#1169
This commit is contained in:
Sainan 2025-03-13 04:25:59 -07:00
parent 6490fadcae
commit a029c288b7
6 changed files with 44 additions and 7 deletions

View File

@ -7,10 +7,17 @@ import { getRecipe } from "@/src/services/itemDataService";
import { IOid } from "@/src/types/commonTypes";
import { getJSONfromString } from "@/src/helpers/stringHelpers";
import { getAccountIdForRequest } from "@/src/services/loginService";
import { getInventory, updateCurrency, addItem, addMiscItems, addRecipes } from "@/src/services/inventoryService";
import {
getInventory,
updateCurrency,
addItem,
addMiscItems,
addRecipes,
occupySlot
} from "@/src/services/inventoryService";
import { IInventoryChanges } from "@/src/types/purchaseTypes";
import { IEquipmentClient } from "@/src/types/inventoryTypes/commonInventoryTypes";
import { IMiscItem } from "@/src/types/inventoryTypes/inventoryTypes";
import { IMiscItem, InventorySlot } from "@/src/types/inventoryTypes/inventoryTypes";
export interface IClaimCompletedRecipeRequest {
RecipeIds: IOid[];
@ -53,6 +60,7 @@ export const claimCompletedRecipeController: RequestHandler = async (req, res) =
inventoryChanges[category].push(inventory[category][index].toJSON<IEquipmentClient>());
nonMiscItemIngredients.add(item.ItemType);
occupySlot(inventory, InventorySlot.WEAPONS, false);
inventoryChanges.WeaponBin ??= { Slots: 0 };
inventoryChanges.WeaponBin.Slots -= 1;
});

View File

@ -1,7 +1,7 @@
import { RequestHandler } from "express";
import { getAccountIdForRequest } from "@/src/services/loginService";
import { getJSONfromString } from "@/src/helpers/stringHelpers";
import { getInventory, addMiscItems, updateCurrency, addRecipes } from "@/src/services/inventoryService";
import { getInventory, addMiscItems, updateCurrency, addRecipes, freeUpSlot } from "@/src/services/inventoryService";
import { IOid } from "@/src/types/commonTypes";
import {
IConsumedSuit,
@ -10,6 +10,7 @@ import {
IInfestedFoundryDatabase,
IInventoryClient,
IMiscItem,
InventorySlot,
ITypeCount
} from "@/src/types/inventoryTypes/inventoryTypes";
import { ExportMisc, ExportRecipes } from "warframe-public-export-plus";
@ -264,6 +265,7 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
);
const recipeChanges = addInfestedFoundryXP(inventory.InfestedFoundry!, 1600_00);
addRecipes(inventory, recipeChanges);
freeUpSlot(inventory, InventorySlot.SUITS);
await inventory.save();
const infestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry!;
applyCheatsToInfestedFoundry(infestedFoundry);

View File

@ -1,6 +1,14 @@
import { RequestHandler } from "express";
import { getAccountIdForRequest } from "@/src/services/loginService";
import { getInventory, addMods, addRecipes, addMiscItems, addConsumables } from "@/src/services/inventoryService";
import {
getInventory,
addMods,
addRecipes,
addMiscItems,
addConsumables,
freeUpSlot
} from "@/src/services/inventoryService";
import { InventorySlot } from "@/src/types/inventoryTypes/inventoryTypes";
export const sellController: RequestHandler = async (req, res) => {
const payload = JSON.parse(String(req.body)) as ISellRequest;
@ -34,56 +42,67 @@ export const sellController: RequestHandler = async (req, res) => {
if (payload.Items.Suits) {
payload.Items.Suits.forEach(sellItem => {
inventory.Suits.pull({ _id: sellItem.String });
freeUpSlot(inventory, InventorySlot.SUITS);
});
}
if (payload.Items.LongGuns) {
payload.Items.LongGuns.forEach(sellItem => {
inventory.LongGuns.pull({ _id: sellItem.String });
freeUpSlot(inventory, InventorySlot.WEAPONS);
});
}
if (payload.Items.Pistols) {
payload.Items.Pistols.forEach(sellItem => {
inventory.Pistols.pull({ _id: sellItem.String });
freeUpSlot(inventory, InventorySlot.WEAPONS);
});
}
if (payload.Items.Melee) {
payload.Items.Melee.forEach(sellItem => {
inventory.Melee.pull({ _id: sellItem.String });
freeUpSlot(inventory, InventorySlot.WEAPONS);
});
}
if (payload.Items.SpaceSuits) {
payload.Items.SpaceSuits.forEach(sellItem => {
inventory.SpaceSuits.pull({ _id: sellItem.String });
freeUpSlot(inventory, InventorySlot.SPACESUITS);
});
}
if (payload.Items.SpaceGuns) {
payload.Items.SpaceGuns.forEach(sellItem => {
inventory.SpaceGuns.pull({ _id: sellItem.String });
freeUpSlot(inventory, InventorySlot.SPACEWEAPONS);
});
}
if (payload.Items.SpaceMelee) {
payload.Items.SpaceMelee.forEach(sellItem => {
inventory.SpaceMelee.pull({ _id: sellItem.String });
freeUpSlot(inventory, InventorySlot.SPACEWEAPONS);
});
}
if (payload.Items.Sentinels) {
payload.Items.Sentinels.forEach(sellItem => {
inventory.Sentinels.pull({ _id: sellItem.String });
freeUpSlot(inventory, InventorySlot.SENTINELS);
});
}
if (payload.Items.SentinelWeapons) {
payload.Items.SentinelWeapons.forEach(sellItem => {
inventory.SentinelWeapons.pull({ _id: sellItem.String });
freeUpSlot(inventory, InventorySlot.SENTINELS);
});
}
if (payload.Items.OperatorAmps) {
payload.Items.OperatorAmps.forEach(sellItem => {
inventory.OperatorAmps.pull({ _id: sellItem.String });
freeUpSlot(inventory, InventorySlot.AMPS);
});
}
if (payload.Items.Hoverboards) {
payload.Items.Hoverboards.forEach(sellItem => {
inventory.Hoverboards.pull({ _id: sellItem.String });
freeUpSlot(inventory, InventorySlot.SPACESUITS);
});
}
if (payload.Items.Drones) {

View File

@ -3,10 +3,10 @@ import { getJSONfromString } from "@/src/helpers/stringHelpers";
import { logger } from "@/src/utils/logger";
import { RequestHandler } from "express";
import { getRecipe } from "@/src/services/itemDataService";
import { addMiscItems, getInventory, updateCurrency } from "@/src/services/inventoryService";
import { addMiscItems, freeUpSlot, getInventory, updateCurrency } from "@/src/services/inventoryService";
import { unixTimesInMs } from "@/src/constants/timeConstants";
import { Types } from "mongoose";
import { ISpectreLoadout } from "@/src/types/inventoryTypes/inventoryTypes";
import { InventorySlot, ISpectreLoadout } from "@/src/types/inventoryTypes/inventoryTypes";
import { toOid } from "@/src/helpers/inventoryHelpers";
import { ExportWeapons } from "warframe-public-export-plus";
@ -53,6 +53,7 @@ export const startRecipeController: RequestHandler = async (req, res) => {
pr[category] ??= [];
pr[category].push(inventory[category][equipmentIndex]);
inventory[category].splice(equipmentIndex, 1);
freeUpSlot(inventory, InventorySlot.WEAPONS);
} else {
addMiscItems(inventory, [
{

View File

@ -172,7 +172,7 @@ export const getInventory = async (
return inventory;
};
const occupySlot = (
export const occupySlot = (
inventory: TInventoryDatabaseDocument,
bin: InventorySlot,
premiumPurchase: boolean
@ -193,6 +193,11 @@ const occupySlot = (
return inventoryChanges;
};
export const freeUpSlot = (inventory: TInventoryDatabaseDocument, bin: InventorySlot): void => {
// { count: -1, platinum: 0, Slots: 1 }
updateSlots(inventory, bin, 1, 0);
};
export const addItem = async (
inventory: TInventoryDatabaseDocument,
typeName: string,

View File

@ -452,9 +452,11 @@ export enum InventorySlot {
SUITS = "SuitBin",
WEAPONS = "WeaponBin",
SPACESUITS = "SpaceSuitBin",
SPACEWEAPONS = "SpaceWeaponBin",
MECHSUITS = "MechBin",
PVE_LOADOUTS = "PveBonusLoadoutBin",
SENTINELS = "SentinelBin",
AMPS = "OperatorAmpBin",
RJ_COMPONENT_AND_ARMAMENTS = "CrewShipSalvageBin"
}