forked from OpenWF/SpaceNinjaServer
		
	fix: free slot when selling or otherwise getting rid of items (#1169)
Reviewed-on: OpenWF/SpaceNinjaServer#1169
This commit is contained in:
		
							parent
							
								
									6490fadcae
								
							
						
					
					
						commit
						a029c288b7
					
				@ -7,10 +7,17 @@ import { getRecipe } from "@/src/services/itemDataService";
 | 
				
			|||||||
import { IOid } from "@/src/types/commonTypes";
 | 
					import { IOid } from "@/src/types/commonTypes";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					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 { IInventoryChanges } from "@/src/types/purchaseTypes";
 | 
				
			||||||
import { IEquipmentClient } from "@/src/types/inventoryTypes/commonInventoryTypes";
 | 
					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 {
 | 
					export interface IClaimCompletedRecipeRequest {
 | 
				
			||||||
    RecipeIds: IOid[];
 | 
					    RecipeIds: IOid[];
 | 
				
			||||||
@ -53,6 +60,7 @@ export const claimCompletedRecipeController: RequestHandler = async (req, res) =
 | 
				
			|||||||
                    inventoryChanges[category].push(inventory[category][index].toJSON<IEquipmentClient>());
 | 
					                    inventoryChanges[category].push(inventory[category][index].toJSON<IEquipmentClient>());
 | 
				
			||||||
                    nonMiscItemIngredients.add(item.ItemType);
 | 
					                    nonMiscItemIngredients.add(item.ItemType);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    occupySlot(inventory, InventorySlot.WEAPONS, false);
 | 
				
			||||||
                    inventoryChanges.WeaponBin ??= { Slots: 0 };
 | 
					                    inventoryChanges.WeaponBin ??= { Slots: 0 };
 | 
				
			||||||
                    inventoryChanges.WeaponBin.Slots -= 1;
 | 
					                    inventoryChanges.WeaponBin.Slots -= 1;
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
 | 
				
			|||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import { RequestHandler } from "express";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
				
			||||||
import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
					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 { IOid } from "@/src/types/commonTypes";
 | 
				
			||||||
import {
 | 
					import {
 | 
				
			||||||
    IConsumedSuit,
 | 
					    IConsumedSuit,
 | 
				
			||||||
@ -10,6 +10,7 @@ import {
 | 
				
			|||||||
    IInfestedFoundryDatabase,
 | 
					    IInfestedFoundryDatabase,
 | 
				
			||||||
    IInventoryClient,
 | 
					    IInventoryClient,
 | 
				
			||||||
    IMiscItem,
 | 
					    IMiscItem,
 | 
				
			||||||
 | 
					    InventorySlot,
 | 
				
			||||||
    ITypeCount
 | 
					    ITypeCount
 | 
				
			||||||
} from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					} from "@/src/types/inventoryTypes/inventoryTypes";
 | 
				
			||||||
import { ExportMisc, ExportRecipes } from "warframe-public-export-plus";
 | 
					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);
 | 
					            const recipeChanges = addInfestedFoundryXP(inventory.InfestedFoundry!, 1600_00);
 | 
				
			||||||
            addRecipes(inventory, recipeChanges);
 | 
					            addRecipes(inventory, recipeChanges);
 | 
				
			||||||
 | 
					            freeUpSlot(inventory, InventorySlot.SUITS);
 | 
				
			||||||
            await inventory.save();
 | 
					            await inventory.save();
 | 
				
			||||||
            const infestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry!;
 | 
					            const infestedFoundry = inventory.toJSON<IInventoryClient>().InfestedFoundry!;
 | 
				
			||||||
            applyCheatsToInfestedFoundry(infestedFoundry);
 | 
					            applyCheatsToInfestedFoundry(infestedFoundry);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,14 @@
 | 
				
			|||||||
import { RequestHandler } from "express";
 | 
					import { RequestHandler } from "express";
 | 
				
			||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
 | 
					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) => {
 | 
					export const sellController: RequestHandler = async (req, res) => {
 | 
				
			||||||
    const payload = JSON.parse(String(req.body)) as ISellRequest;
 | 
					    const payload = JSON.parse(String(req.body)) as ISellRequest;
 | 
				
			||||||
@ -34,56 +42,67 @@ export const sellController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
    if (payload.Items.Suits) {
 | 
					    if (payload.Items.Suits) {
 | 
				
			||||||
        payload.Items.Suits.forEach(sellItem => {
 | 
					        payload.Items.Suits.forEach(sellItem => {
 | 
				
			||||||
            inventory.Suits.pull({ _id: sellItem.String });
 | 
					            inventory.Suits.pull({ _id: sellItem.String });
 | 
				
			||||||
 | 
					            freeUpSlot(inventory, InventorySlot.SUITS);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (payload.Items.LongGuns) {
 | 
					    if (payload.Items.LongGuns) {
 | 
				
			||||||
        payload.Items.LongGuns.forEach(sellItem => {
 | 
					        payload.Items.LongGuns.forEach(sellItem => {
 | 
				
			||||||
            inventory.LongGuns.pull({ _id: sellItem.String });
 | 
					            inventory.LongGuns.pull({ _id: sellItem.String });
 | 
				
			||||||
 | 
					            freeUpSlot(inventory, InventorySlot.WEAPONS);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (payload.Items.Pistols) {
 | 
					    if (payload.Items.Pistols) {
 | 
				
			||||||
        payload.Items.Pistols.forEach(sellItem => {
 | 
					        payload.Items.Pistols.forEach(sellItem => {
 | 
				
			||||||
            inventory.Pistols.pull({ _id: sellItem.String });
 | 
					            inventory.Pistols.pull({ _id: sellItem.String });
 | 
				
			||||||
 | 
					            freeUpSlot(inventory, InventorySlot.WEAPONS);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (payload.Items.Melee) {
 | 
					    if (payload.Items.Melee) {
 | 
				
			||||||
        payload.Items.Melee.forEach(sellItem => {
 | 
					        payload.Items.Melee.forEach(sellItem => {
 | 
				
			||||||
            inventory.Melee.pull({ _id: sellItem.String });
 | 
					            inventory.Melee.pull({ _id: sellItem.String });
 | 
				
			||||||
 | 
					            freeUpSlot(inventory, InventorySlot.WEAPONS);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (payload.Items.SpaceSuits) {
 | 
					    if (payload.Items.SpaceSuits) {
 | 
				
			||||||
        payload.Items.SpaceSuits.forEach(sellItem => {
 | 
					        payload.Items.SpaceSuits.forEach(sellItem => {
 | 
				
			||||||
            inventory.SpaceSuits.pull({ _id: sellItem.String });
 | 
					            inventory.SpaceSuits.pull({ _id: sellItem.String });
 | 
				
			||||||
 | 
					            freeUpSlot(inventory, InventorySlot.SPACESUITS);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (payload.Items.SpaceGuns) {
 | 
					    if (payload.Items.SpaceGuns) {
 | 
				
			||||||
        payload.Items.SpaceGuns.forEach(sellItem => {
 | 
					        payload.Items.SpaceGuns.forEach(sellItem => {
 | 
				
			||||||
            inventory.SpaceGuns.pull({ _id: sellItem.String });
 | 
					            inventory.SpaceGuns.pull({ _id: sellItem.String });
 | 
				
			||||||
 | 
					            freeUpSlot(inventory, InventorySlot.SPACEWEAPONS);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (payload.Items.SpaceMelee) {
 | 
					    if (payload.Items.SpaceMelee) {
 | 
				
			||||||
        payload.Items.SpaceMelee.forEach(sellItem => {
 | 
					        payload.Items.SpaceMelee.forEach(sellItem => {
 | 
				
			||||||
            inventory.SpaceMelee.pull({ _id: sellItem.String });
 | 
					            inventory.SpaceMelee.pull({ _id: sellItem.String });
 | 
				
			||||||
 | 
					            freeUpSlot(inventory, InventorySlot.SPACEWEAPONS);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (payload.Items.Sentinels) {
 | 
					    if (payload.Items.Sentinels) {
 | 
				
			||||||
        payload.Items.Sentinels.forEach(sellItem => {
 | 
					        payload.Items.Sentinels.forEach(sellItem => {
 | 
				
			||||||
            inventory.Sentinels.pull({ _id: sellItem.String });
 | 
					            inventory.Sentinels.pull({ _id: sellItem.String });
 | 
				
			||||||
 | 
					            freeUpSlot(inventory, InventorySlot.SENTINELS);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (payload.Items.SentinelWeapons) {
 | 
					    if (payload.Items.SentinelWeapons) {
 | 
				
			||||||
        payload.Items.SentinelWeapons.forEach(sellItem => {
 | 
					        payload.Items.SentinelWeapons.forEach(sellItem => {
 | 
				
			||||||
            inventory.SentinelWeapons.pull({ _id: sellItem.String });
 | 
					            inventory.SentinelWeapons.pull({ _id: sellItem.String });
 | 
				
			||||||
 | 
					            freeUpSlot(inventory, InventorySlot.SENTINELS);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (payload.Items.OperatorAmps) {
 | 
					    if (payload.Items.OperatorAmps) {
 | 
				
			||||||
        payload.Items.OperatorAmps.forEach(sellItem => {
 | 
					        payload.Items.OperatorAmps.forEach(sellItem => {
 | 
				
			||||||
            inventory.OperatorAmps.pull({ _id: sellItem.String });
 | 
					            inventory.OperatorAmps.pull({ _id: sellItem.String });
 | 
				
			||||||
 | 
					            freeUpSlot(inventory, InventorySlot.AMPS);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (payload.Items.Hoverboards) {
 | 
					    if (payload.Items.Hoverboards) {
 | 
				
			||||||
        payload.Items.Hoverboards.forEach(sellItem => {
 | 
					        payload.Items.Hoverboards.forEach(sellItem => {
 | 
				
			||||||
            inventory.Hoverboards.pull({ _id: sellItem.String });
 | 
					            inventory.Hoverboards.pull({ _id: sellItem.String });
 | 
				
			||||||
 | 
					            freeUpSlot(inventory, InventorySlot.SPACESUITS);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (payload.Items.Drones) {
 | 
					    if (payload.Items.Drones) {
 | 
				
			||||||
 | 
				
			|||||||
@ -3,10 +3,10 @@ import { getJSONfromString } from "@/src/helpers/stringHelpers";
 | 
				
			|||||||
import { logger } from "@/src/utils/logger";
 | 
					import { logger } from "@/src/utils/logger";
 | 
				
			||||||
import { RequestHandler } from "express";
 | 
					import { RequestHandler } from "express";
 | 
				
			||||||
import { getRecipe } from "@/src/services/itemDataService";
 | 
					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 { unixTimesInMs } from "@/src/constants/timeConstants";
 | 
				
			||||||
import { Types } from "mongoose";
 | 
					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 { toOid } from "@/src/helpers/inventoryHelpers";
 | 
				
			||||||
import { ExportWeapons } from "warframe-public-export-plus";
 | 
					import { ExportWeapons } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -53,6 +53,7 @@ export const startRecipeController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
            pr[category] ??= [];
 | 
					            pr[category] ??= [];
 | 
				
			||||||
            pr[category].push(inventory[category][equipmentIndex]);
 | 
					            pr[category].push(inventory[category][equipmentIndex]);
 | 
				
			||||||
            inventory[category].splice(equipmentIndex, 1);
 | 
					            inventory[category].splice(equipmentIndex, 1);
 | 
				
			||||||
 | 
					            freeUpSlot(inventory, InventorySlot.WEAPONS);
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            addMiscItems(inventory, [
 | 
					            addMiscItems(inventory, [
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 | 
				
			|||||||
@ -172,7 +172,7 @@ export const getInventory = async (
 | 
				
			|||||||
    return inventory;
 | 
					    return inventory;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const occupySlot = (
 | 
					export const occupySlot = (
 | 
				
			||||||
    inventory: TInventoryDatabaseDocument,
 | 
					    inventory: TInventoryDatabaseDocument,
 | 
				
			||||||
    bin: InventorySlot,
 | 
					    bin: InventorySlot,
 | 
				
			||||||
    premiumPurchase: boolean
 | 
					    premiumPurchase: boolean
 | 
				
			||||||
@ -193,6 +193,11 @@ const occupySlot = (
 | 
				
			|||||||
    return inventoryChanges;
 | 
					    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 (
 | 
					export const addItem = async (
 | 
				
			||||||
    inventory: TInventoryDatabaseDocument,
 | 
					    inventory: TInventoryDatabaseDocument,
 | 
				
			||||||
    typeName: string,
 | 
					    typeName: string,
 | 
				
			||||||
 | 
				
			|||||||
@ -452,9 +452,11 @@ export enum InventorySlot {
 | 
				
			|||||||
    SUITS = "SuitBin",
 | 
					    SUITS = "SuitBin",
 | 
				
			||||||
    WEAPONS = "WeaponBin",
 | 
					    WEAPONS = "WeaponBin",
 | 
				
			||||||
    SPACESUITS = "SpaceSuitBin",
 | 
					    SPACESUITS = "SpaceSuitBin",
 | 
				
			||||||
 | 
					    SPACEWEAPONS = "SpaceWeaponBin",
 | 
				
			||||||
    MECHSUITS = "MechBin",
 | 
					    MECHSUITS = "MechBin",
 | 
				
			||||||
    PVE_LOADOUTS = "PveBonusLoadoutBin",
 | 
					    PVE_LOADOUTS = "PveBonusLoadoutBin",
 | 
				
			||||||
    SENTINELS = "SentinelBin",
 | 
					    SENTINELS = "SentinelBin",
 | 
				
			||||||
 | 
					    AMPS = "OperatorAmpBin",
 | 
				
			||||||
    RJ_COMPONENT_AND_ARMAMENTS = "CrewShipSalvageBin"
 | 
					    RJ_COMPONENT_AND_ARMAMENTS = "CrewShipSalvageBin"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user