feat: claimingBlueprintRefundsIngredients cheat
This commit is contained in:
		
							parent
							
								
									f9b3fecc10
								
							
						
					
					
						commit
						8fe0013dec
					
				@ -19,6 +19,7 @@
 | 
				
			|||||||
  "infiniteEndo": false,
 | 
					  "infiniteEndo": false,
 | 
				
			||||||
  "infiniteRegalAya": false,
 | 
					  "infiniteRegalAya": false,
 | 
				
			||||||
  "infiniteHelminthMaterials": false,
 | 
					  "infiniteHelminthMaterials": false,
 | 
				
			||||||
 | 
					  "claimingBlueprintRefundsIngredients": false,
 | 
				
			||||||
  "dontSubtractConsumables": false,
 | 
					  "dontSubtractConsumables": false,
 | 
				
			||||||
  "unlockAllShipFeatures": false,
 | 
					  "unlockAllShipFeatures": false,
 | 
				
			||||||
  "unlockAllShipDecorations": false,
 | 
					  "unlockAllShipDecorations": false,
 | 
				
			||||||
 | 
				
			|||||||
@ -17,8 +17,11 @@ import {
 | 
				
			|||||||
} from "@/src/services/inventoryService";
 | 
					} 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 { InventorySlot } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
					import { InventorySlot, IPendingRecipeDatabase } from "@/src/types/inventoryTypes/inventoryTypes";
 | 
				
			||||||
import { toOid2 } from "@/src/helpers/inventoryHelpers";
 | 
					import { toOid2 } from "@/src/helpers/inventoryHelpers";
 | 
				
			||||||
 | 
					import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel";
 | 
				
			||||||
 | 
					import { IRecipe } from "warframe-public-export-plus";
 | 
				
			||||||
 | 
					import { config } from "@/src/services/configService";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface IClaimCompletedRecipeRequest {
 | 
					interface IClaimCompletedRecipeRequest {
 | 
				
			||||||
    RecipeIds: IOid[];
 | 
					    RecipeIds: IOid[];
 | 
				
			||||||
@ -46,34 +49,8 @@ export const claimCompletedRecipeController: RequestHandler = async (req, res) =
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (req.query.cancel) {
 | 
					    if (req.query.cancel) {
 | 
				
			||||||
        const inventoryChanges: IInventoryChanges = {
 | 
					        const inventoryChanges: IInventoryChanges = {};
 | 
				
			||||||
            ...updateCurrency(inventory, recipe.buildPrice * -1, false)
 | 
					        await refundRecipeIngredients(inventory, inventoryChanges, recipe, pendingRecipe);
 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        const equipmentIngredients = new Set();
 | 
					 | 
				
			||||||
        for (const category of ["LongGuns", "Pistols", "Melee"] as const) {
 | 
					 | 
				
			||||||
            if (pendingRecipe[category]) {
 | 
					 | 
				
			||||||
                pendingRecipe[category].forEach(item => {
 | 
					 | 
				
			||||||
                    const index = inventory[category].push(item) - 1;
 | 
					 | 
				
			||||||
                    inventoryChanges[category] ??= [];
 | 
					 | 
				
			||||||
                    inventoryChanges[category].push(inventory[category][index].toJSON<IEquipmentClient>());
 | 
					 | 
				
			||||||
                    equipmentIngredients.add(item.ItemType);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    occupySlot(inventory, InventorySlot.WEAPONS, false);
 | 
					 | 
				
			||||||
                    inventoryChanges.WeaponBin ??= { Slots: 0 };
 | 
					 | 
				
			||||||
                    inventoryChanges.WeaponBin.Slots -= 1;
 | 
					 | 
				
			||||||
                });
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        for (const ingredient of recipe.ingredients) {
 | 
					 | 
				
			||||||
            if (!equipmentIngredients.has(ingredient.ItemType)) {
 | 
					 | 
				
			||||||
                combineInventoryChanges(
 | 
					 | 
				
			||||||
                    inventoryChanges,
 | 
					 | 
				
			||||||
                    await addItem(inventory, ingredient.ItemType, ingredient.ItemCount)
 | 
					 | 
				
			||||||
                );
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        await inventory.save();
 | 
					        await inventory.save();
 | 
				
			||||||
        res.json(inventoryChanges); // Not a bug: In the specific case of cancelling a recipe, InventoryChanges are expected to be the root.
 | 
					        res.json(inventoryChanges); // Not a bug: In the specific case of cancelling a recipe, InventoryChanges are expected to be the root.
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
@ -141,7 +118,43 @@ export const claimCompletedRecipeController: RequestHandler = async (req, res) =
 | 
				
			|||||||
                ))
 | 
					                ))
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        if (config.claimingBlueprintRefundsIngredients) {
 | 
				
			||||||
 | 
					            await refundRecipeIngredients(inventory, InventoryChanges, recipe, pendingRecipe);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        await inventory.save();
 | 
					        await inventory.save();
 | 
				
			||||||
        res.json({ InventoryChanges, BrandedSuits });
 | 
					        res.json({ InventoryChanges, BrandedSuits });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const refundRecipeIngredients = async (
 | 
				
			||||||
 | 
					    inventory: TInventoryDatabaseDocument,
 | 
				
			||||||
 | 
					    inventoryChanges: IInventoryChanges,
 | 
				
			||||||
 | 
					    recipe: IRecipe,
 | 
				
			||||||
 | 
					    pendingRecipe: IPendingRecipeDatabase
 | 
				
			||||||
 | 
					): Promise<void> => {
 | 
				
			||||||
 | 
					    updateCurrency(inventory, recipe.buildPrice * -1, false, inventoryChanges);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const equipmentIngredients = new Set();
 | 
				
			||||||
 | 
					    for (const category of ["LongGuns", "Pistols", "Melee"] as const) {
 | 
				
			||||||
 | 
					        if (pendingRecipe[category]) {
 | 
				
			||||||
 | 
					            pendingRecipe[category].forEach(item => {
 | 
				
			||||||
 | 
					                const index = inventory[category].push(item) - 1;
 | 
				
			||||||
 | 
					                inventoryChanges[category] ??= [];
 | 
				
			||||||
 | 
					                inventoryChanges[category].push(inventory[category][index].toJSON<IEquipmentClient>());
 | 
				
			||||||
 | 
					                equipmentIngredients.add(item.ItemType);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                occupySlot(inventory, InventorySlot.WEAPONS, false);
 | 
				
			||||||
 | 
					                inventoryChanges.WeaponBin ??= { Slots: 0 };
 | 
				
			||||||
 | 
					                inventoryChanges.WeaponBin.Slots -= 1;
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    for (const ingredient of recipe.ingredients) {
 | 
				
			||||||
 | 
					        if (!equipmentIngredients.has(ingredient.ItemType)) {
 | 
				
			||||||
 | 
					            combineInventoryChanges(
 | 
				
			||||||
 | 
					                inventoryChanges,
 | 
				
			||||||
 | 
					                await addItem(inventory, ingredient.ItemType, ingredient.ItemCount)
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -24,6 +24,7 @@ interface IConfig {
 | 
				
			|||||||
    infiniteEndo?: boolean;
 | 
					    infiniteEndo?: boolean;
 | 
				
			||||||
    infiniteRegalAya?: boolean;
 | 
					    infiniteRegalAya?: boolean;
 | 
				
			||||||
    infiniteHelminthMaterials?: boolean;
 | 
					    infiniteHelminthMaterials?: boolean;
 | 
				
			||||||
 | 
					    claimingBlueprintRefundsIngredients?: boolean;
 | 
				
			||||||
    dontSubtractConsumables?: boolean;
 | 
					    dontSubtractConsumables?: boolean;
 | 
				
			||||||
    unlockAllShipFeatures?: boolean;
 | 
					    unlockAllShipFeatures?: boolean;
 | 
				
			||||||
    unlockAllShipDecorations?: boolean;
 | 
					    unlockAllShipDecorations?: boolean;
 | 
				
			||||||
 | 
				
			|||||||
@ -1106,24 +1106,29 @@ const isCurrencyTracked = (usePremium: boolean): boolean => {
 | 
				
			|||||||
export const updateCurrency = (
 | 
					export const updateCurrency = (
 | 
				
			||||||
    inventory: TInventoryDatabaseDocument,
 | 
					    inventory: TInventoryDatabaseDocument,
 | 
				
			||||||
    price: number,
 | 
					    price: number,
 | 
				
			||||||
    usePremium: boolean
 | 
					    usePremium: boolean,
 | 
				
			||||||
 | 
					    inventoryChanges: IInventoryChanges = {}
 | 
				
			||||||
): IInventoryChanges => {
 | 
					): IInventoryChanges => {
 | 
				
			||||||
    const currencyChanges: IInventoryChanges = {};
 | 
					 | 
				
			||||||
    if (price != 0 && isCurrencyTracked(usePremium)) {
 | 
					    if (price != 0 && isCurrencyTracked(usePremium)) {
 | 
				
			||||||
        if (usePremium) {
 | 
					        if (usePremium) {
 | 
				
			||||||
            if (inventory.PremiumCreditsFree > 0) {
 | 
					            if (inventory.PremiumCreditsFree > 0) {
 | 
				
			||||||
                currencyChanges.PremiumCreditsFree = Math.min(price, inventory.PremiumCreditsFree) * -1;
 | 
					                const premiumCreditsFreeDelta = Math.min(price, inventory.PremiumCreditsFree) * -1;
 | 
				
			||||||
                inventory.PremiumCreditsFree += currencyChanges.PremiumCreditsFree;
 | 
					                inventoryChanges.PremiumCreditsFree ??= 0;
 | 
				
			||||||
 | 
					                inventoryChanges.PremiumCreditsFree += premiumCreditsFreeDelta;
 | 
				
			||||||
 | 
					                inventory.PremiumCreditsFree += premiumCreditsFreeDelta;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            currencyChanges.PremiumCredits = -price;
 | 
					            inventoryChanges.PremiumCredits ??= 0;
 | 
				
			||||||
            inventory.PremiumCredits += currencyChanges.PremiumCredits;
 | 
					            inventoryChanges.PremiumCredits -= price;
 | 
				
			||||||
 | 
					            inventory.PremiumCredits -= price;
 | 
				
			||||||
 | 
					            logger.debug(`currency changes `, { PremiumCredits: -price });
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            currencyChanges.RegularCredits = -price;
 | 
					            inventoryChanges.RegularCredits ??= 0;
 | 
				
			||||||
            inventory.RegularCredits += currencyChanges.RegularCredits;
 | 
					            inventoryChanges.RegularCredits -= price;
 | 
				
			||||||
 | 
					            inventory.RegularCredits -= price;
 | 
				
			||||||
 | 
					            logger.debug(`currency changes `, { RegularCredits: -price });
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        logger.debug(`currency changes `, currencyChanges);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return currencyChanges;
 | 
					    return inventoryChanges;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const addFusionPoints = (inventory: TInventoryDatabaseDocument, add: number): number => {
 | 
					export const addFusionPoints = (inventory: TInventoryDatabaseDocument, add: number): number => {
 | 
				
			||||||
 | 
				
			|||||||
@ -590,6 +590,10 @@
 | 
				
			|||||||
                                        <input class="form-check-input" type="checkbox" id="infiniteRegalAya" />
 | 
					                                        <input class="form-check-input" type="checkbox" id="infiniteRegalAya" />
 | 
				
			||||||
                                        <label class="form-check-label" for="infiniteRegalAya" data-loc="cheats_infiniteRegalAya"></label>
 | 
					                                        <label class="form-check-label" for="infiniteRegalAya" data-loc="cheats_infiniteRegalAya"></label>
 | 
				
			||||||
                                    </div>
 | 
					                                    </div>
 | 
				
			||||||
 | 
					                                    <div class="form-check">
 | 
				
			||||||
 | 
					                                        <input class="form-check-input" type="checkbox" id="claimingBlueprintRefundsIngredients" />
 | 
				
			||||||
 | 
					                                        <label class="form-check-label" for="claimingBlueprintRefundsIngredients" data-loc="cheats_claimingBlueprintRefundsIngredients"></label>
 | 
				
			||||||
 | 
					                                    </div>
 | 
				
			||||||
                                    <div class="form-check">
 | 
					                                    <div class="form-check">
 | 
				
			||||||
                                        <input class="form-check-input" type="checkbox" id="infiniteHelminthMaterials" />
 | 
					                                        <input class="form-check-input" type="checkbox" id="infiniteHelminthMaterials" />
 | 
				
			||||||
                                        <label class="form-check-label" for="infiniteHelminthMaterials" data-loc="cheats_infiniteHelminthMaterials"></label>
 | 
					                                        <label class="form-check-label" for="infiniteHelminthMaterials" data-loc="cheats_infiniteHelminthMaterials"></label>
 | 
				
			||||||
 | 
				
			|||||||
@ -131,6 +131,7 @@ dict = {
 | 
				
			|||||||
    cheats_infiniteEndo: `Unendlich Endo`,
 | 
					    cheats_infiniteEndo: `Unendlich Endo`,
 | 
				
			||||||
    cheats_infiniteRegalAya: `Unendlich Reines Aya`,
 | 
					    cheats_infiniteRegalAya: `Unendlich Reines Aya`,
 | 
				
			||||||
    cheats_infiniteHelminthMaterials: `Unendlich Helminth-Materialien`,
 | 
					    cheats_infiniteHelminthMaterials: `Unendlich Helminth-Materialien`,
 | 
				
			||||||
 | 
					    cheats_claimingBlueprintRefundsIngredients: `[UNTRANSLATED] Claiming Blueprint Refunds Ingredients`,
 | 
				
			||||||
    cheats_dontSubtractConsumables: `Verbrauchsgegenstände (Ausrüstung) nicht verbrauchen`,
 | 
					    cheats_dontSubtractConsumables: `Verbrauchsgegenstände (Ausrüstung) nicht verbrauchen`,
 | 
				
			||||||
    cheats_unlockAllShipFeatures: `Alle Schiffs-Funktionen freischalten`,
 | 
					    cheats_unlockAllShipFeatures: `Alle Schiffs-Funktionen freischalten`,
 | 
				
			||||||
    cheats_unlockAllShipDecorations: `Alle Schiffsdekorationen freischalten`,
 | 
					    cheats_unlockAllShipDecorations: `Alle Schiffsdekorationen freischalten`,
 | 
				
			||||||
 | 
				
			|||||||
@ -130,6 +130,7 @@ dict = {
 | 
				
			|||||||
    cheats_infiniteEndo: `Infinite Endo`,
 | 
					    cheats_infiniteEndo: `Infinite Endo`,
 | 
				
			||||||
    cheats_infiniteRegalAya: `Infinite Regal Aya`,
 | 
					    cheats_infiniteRegalAya: `Infinite Regal Aya`,
 | 
				
			||||||
    cheats_infiniteHelminthMaterials: `Infinite Helminth Materials`,
 | 
					    cheats_infiniteHelminthMaterials: `Infinite Helminth Materials`,
 | 
				
			||||||
 | 
					    cheats_claimingBlueprintRefundsIngredients: `Claiming Blueprint Refunds Ingredients`,
 | 
				
			||||||
    cheats_dontSubtractConsumables: `Don't Subtract Consumables`,
 | 
					    cheats_dontSubtractConsumables: `Don't Subtract Consumables`,
 | 
				
			||||||
    cheats_unlockAllShipFeatures: `Unlock All Ship Features`,
 | 
					    cheats_unlockAllShipFeatures: `Unlock All Ship Features`,
 | 
				
			||||||
    cheats_unlockAllShipDecorations: `Unlock All Ship Decorations`,
 | 
					    cheats_unlockAllShipDecorations: `Unlock All Ship Decorations`,
 | 
				
			||||||
 | 
				
			|||||||
@ -131,6 +131,7 @@ dict = {
 | 
				
			|||||||
    cheats_infiniteEndo: `Endo infinito`,
 | 
					    cheats_infiniteEndo: `Endo infinito`,
 | 
				
			||||||
    cheats_infiniteRegalAya: `Aya Real infinita`,
 | 
					    cheats_infiniteRegalAya: `Aya Real infinita`,
 | 
				
			||||||
    cheats_infiniteHelminthMaterials: `Materiales Helminto infinitos`,
 | 
					    cheats_infiniteHelminthMaterials: `Materiales Helminto infinitos`,
 | 
				
			||||||
 | 
					    cheats_claimingBlueprintRefundsIngredients: `[UNTRANSLATED] Claiming Blueprint Refunds Ingredients`,
 | 
				
			||||||
    cheats_dontSubtractConsumables: `No restar consumibles`,
 | 
					    cheats_dontSubtractConsumables: `No restar consumibles`,
 | 
				
			||||||
    cheats_unlockAllShipFeatures: `Desbloquear todas las funciones de nave`,
 | 
					    cheats_unlockAllShipFeatures: `Desbloquear todas las funciones de nave`,
 | 
				
			||||||
    cheats_unlockAllShipDecorations: `Desbloquear todas las decoraciones de nave`,
 | 
					    cheats_unlockAllShipDecorations: `Desbloquear todas las decoraciones de nave`,
 | 
				
			||||||
 | 
				
			|||||||
@ -131,6 +131,7 @@ dict = {
 | 
				
			|||||||
    cheats_infiniteEndo: `Endo infini`,
 | 
					    cheats_infiniteEndo: `Endo infini`,
 | 
				
			||||||
    cheats_infiniteRegalAya: `Aya Raffiné infini`,
 | 
					    cheats_infiniteRegalAya: `Aya Raffiné infini`,
 | 
				
			||||||
    cheats_infiniteHelminthMaterials: `Ressources d'Helminth infinies`,
 | 
					    cheats_infiniteHelminthMaterials: `Ressources d'Helminth infinies`,
 | 
				
			||||||
 | 
					    cheats_claimingBlueprintRefundsIngredients: `[UNTRANSLATED] Claiming Blueprint Refunds Ingredients`,
 | 
				
			||||||
    cheats_dontSubtractConsumables: `[UNTRANSLATED] Don't Subtract Consumables`,
 | 
					    cheats_dontSubtractConsumables: `[UNTRANSLATED] Don't Subtract Consumables`,
 | 
				
			||||||
    cheats_unlockAllShipFeatures: `Débloquer tous les segments du vaisseau`,
 | 
					    cheats_unlockAllShipFeatures: `Débloquer tous les segments du vaisseau`,
 | 
				
			||||||
    cheats_unlockAllShipDecorations: `Débloquer toutes les décorations du vaisseau`,
 | 
					    cheats_unlockAllShipDecorations: `Débloquer toutes les décorations du vaisseau`,
 | 
				
			||||||
 | 
				
			|||||||
@ -131,6 +131,7 @@ dict = {
 | 
				
			|||||||
    cheats_infiniteEndo: `Бесконечное эндо`,
 | 
					    cheats_infiniteEndo: `Бесконечное эндо`,
 | 
				
			||||||
    cheats_infiniteRegalAya: `Бесконечная Королевская Айя`,
 | 
					    cheats_infiniteRegalAya: `Бесконечная Королевская Айя`,
 | 
				
			||||||
    cheats_infiniteHelminthMaterials: `Бесконечные Выделения Гельминта`,
 | 
					    cheats_infiniteHelminthMaterials: `Бесконечные Выделения Гельминта`,
 | 
				
			||||||
 | 
					    cheats_claimingBlueprintRefundsIngredients: `[UNTRANSLATED] Claiming Blueprint Refunds Ingredients`,
 | 
				
			||||||
    cheats_dontSubtractConsumables: `Не уменьшать количество расходников`,
 | 
					    cheats_dontSubtractConsumables: `Не уменьшать количество расходников`,
 | 
				
			||||||
    cheats_unlockAllShipFeatures: `Разблокировать все функции корабля`,
 | 
					    cheats_unlockAllShipFeatures: `Разблокировать все функции корабля`,
 | 
				
			||||||
    cheats_unlockAllShipDecorations: `Разблокировать все украшения корабля`,
 | 
					    cheats_unlockAllShipDecorations: `Разблокировать все украшения корабля`,
 | 
				
			||||||
 | 
				
			|||||||
@ -131,6 +131,7 @@ dict = {
 | 
				
			|||||||
    cheats_infiniteEndo: `无限内融核心`,
 | 
					    cheats_infiniteEndo: `无限内融核心`,
 | 
				
			||||||
    cheats_infiniteRegalAya: `无限御品阿耶`,
 | 
					    cheats_infiniteRegalAya: `无限御品阿耶`,
 | 
				
			||||||
    cheats_infiniteHelminthMaterials: `无限Helminth材料`,
 | 
					    cheats_infiniteHelminthMaterials: `无限Helminth材料`,
 | 
				
			||||||
 | 
					    cheats_claimingBlueprintRefundsIngredients: `[UNTRANSLATED] Claiming Blueprint Refunds Ingredients`,
 | 
				
			||||||
    cheats_dontSubtractConsumables: `[UNTRANSLATED] Don't Subtract Consumables`,
 | 
					    cheats_dontSubtractConsumables: `[UNTRANSLATED] Don't Subtract Consumables`,
 | 
				
			||||||
    cheats_unlockAllShipFeatures: `解锁所有飞船功能`,
 | 
					    cheats_unlockAllShipFeatures: `解锁所有飞船功能`,
 | 
				
			||||||
    cheats_unlockAllShipDecorations: `解锁所有飞船装饰`,
 | 
					    cheats_unlockAllShipDecorations: `解锁所有飞船装饰`,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user