Mod fusion
This commit is contained in:
parent
37e5e0defa
commit
6b8c412c74
23
src/controllers/api/artifactsController.ts
Normal file
23
src/controllers/api/artifactsController.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import { upgradeMod } from "@/src/services/inventoryService";
|
||||||
|
import { RequestHandler } from "express";
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
||||||
|
const artifactsController: RequestHandler = async (req, res) => {
|
||||||
|
const [data] = String(req.body).split("\n");
|
||||||
|
const id = req.query.accountId as string;
|
||||||
|
|
||||||
|
// TODO - salt check
|
||||||
|
|
||||||
|
try {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
||||||
|
const parsedData = JSON.parse(data);
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
||||||
|
await upgradeMod(parsedData, id);
|
||||||
|
res.json({});
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Error parsing JSON data:", err);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export { artifactsController };
|
@ -83,6 +83,7 @@ const missionInventoryUpdateController: RequestHandler = async (req, res) => {
|
|||||||
- [x] CreditsBonus
|
- [x] CreditsBonus
|
||||||
- [x] MissionCredits
|
- [x] MissionCredits
|
||||||
- [ ] InventoryChanges
|
- [ ] InventoryChanges
|
||||||
|
- [ ] FusionPoints int
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export { missionInventoryUpdateController };
|
export { missionInventoryUpdateController };
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { Model, Schema, Types, model } from "mongoose";
|
import { Model, Schema, Types, model } from "mongoose";
|
||||||
import { FlavourItem, RawUpgrade, MiscItem, IInventoryDatabase, Booster } from "../types/inventoryTypes/inventoryTypes";
|
import { FlavourItem, RawUpgrade, MiscItem, IInventoryDatabase, Booster } from "../types/inventoryTypes/inventoryTypes";
|
||||||
import { Oid } from "../types/commonTypes";
|
import { Oid } from "../types/commonTypes";
|
||||||
import { ISuitDatabase, ISuitDocument } from "@/src/types/inventoryTypes/SuitTypes";
|
import { ISuitDatabase } from "@/src/types/inventoryTypes/SuitTypes";
|
||||||
import { IWeaponDatabase } from "@/src/types/inventoryTypes/weaponTypes";
|
import { IWeaponDatabase } from "@/src/types/inventoryTypes/weaponTypes";
|
||||||
|
|
||||||
const abilityOverrideSchema = new Schema({
|
const abilityOverrideSchema = new Schema({
|
||||||
@ -71,6 +71,24 @@ const BoosterSchema = new Schema({
|
|||||||
ItemType: String
|
ItemType: String
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const RawUpgrades = new Schema({
|
||||||
|
ItemType: String,
|
||||||
|
UpgradeFingerprint: String,
|
||||||
|
PendingRerollFingerprint: String,
|
||||||
|
ItemCount: Number
|
||||||
|
});
|
||||||
|
|
||||||
|
RawUpgrades.set("toJSON", {
|
||||||
|
transform(_document, returnedObject) {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
|
||||||
|
returnedObject.ItemId = { $oid: returnedObject._id.toString() } satisfies Oid;
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
|
||||||
|
returnedObject.LastAdded = { $oid: returnedObject.__v.toString() } satisfies Oid;
|
||||||
|
delete returnedObject._id;
|
||||||
|
delete returnedObject.__v;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
WeaponSchema.set("toJSON", {
|
WeaponSchema.set("toJSON", {
|
||||||
transform(_document, returnedObject) {
|
transform(_document, returnedObject) {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
|
||||||
@ -181,7 +199,7 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>({
|
|||||||
MiscItems: [Schema.Types.Mixed],
|
MiscItems: [Schema.Types.Mixed],
|
||||||
ChallengesFixVersion: Number,
|
ChallengesFixVersion: Number,
|
||||||
ChallengeProgress: [Schema.Types.Mixed],
|
ChallengeProgress: [Schema.Types.Mixed],
|
||||||
RawUpgrades: [Schema.Types.Mixed],
|
RawUpgrades: [RawUpgrades],
|
||||||
ReceivedStartingGear: Boolean,
|
ReceivedStartingGear: Boolean,
|
||||||
Suits: [suitSchema],
|
Suits: [suitSchema],
|
||||||
LongGuns: [WeaponSchema],
|
LongGuns: [WeaponSchema],
|
||||||
@ -344,7 +362,7 @@ type InventoryDocumentProps = {
|
|||||||
Boosters: Types.DocumentArray<Booster>;
|
Boosters: Types.DocumentArray<Booster>;
|
||||||
};
|
};
|
||||||
|
|
||||||
type InventoryModelType = Model<IInventoryDatabase, {}, InventoryDocumentProps>;
|
type InventoryModelType = Model<IInventoryDatabase, object, InventoryDocumentProps>;
|
||||||
|
|
||||||
const Inventory = model<IInventoryDatabase, InventoryModelType>("Inventory", inventorySchema);
|
const Inventory = model<IInventoryDatabase, InventoryModelType>("Inventory", inventorySchema);
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@ import { updateSessionGetController, updateSessionPostController } from "@/src/c
|
|||||||
import { viewController } from "@/src/controllers/api/viewController";
|
import { viewController } from "@/src/controllers/api/viewController";
|
||||||
import { joinSessionController } from "@/src/controllers/api/joinSessionController";
|
import { joinSessionController } from "@/src/controllers/api/joinSessionController";
|
||||||
import { saveLoadoutController } from "@/src/controllers/api/saveLoadout";
|
import { saveLoadoutController } from "@/src/controllers/api/saveLoadout";
|
||||||
|
import { artifactsController } from "../controllers/api/artifactsController";
|
||||||
|
|
||||||
import express from "express";
|
import express from "express";
|
||||||
|
|
||||||
@ -58,6 +59,7 @@ apiRouter.get("/deleteSession.php", deleteSessionController);
|
|||||||
apiRouter.get("/logout.php", logoutController);
|
apiRouter.get("/logout.php", logoutController);
|
||||||
|
|
||||||
// post
|
// post
|
||||||
|
apiRouter.post("/artifacts.php", artifactsController);
|
||||||
apiRouter.post("/findSessions.php", findSessionsController);
|
apiRouter.post("/findSessions.php", findSessionsController);
|
||||||
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
||||||
apiRouter.post("/purchase.php", purchaseController);
|
apiRouter.post("/purchase.php", purchaseController);
|
||||||
|
@ -5,13 +5,14 @@ import { Types } from "mongoose";
|
|||||||
import { ISuitResponse } from "@/src/types/inventoryTypes/SuitTypes";
|
import { ISuitResponse } from "@/src/types/inventoryTypes/SuitTypes";
|
||||||
import { SlotType } from "@/src/types/purchaseTypes";
|
import { SlotType } from "@/src/types/purchaseTypes";
|
||||||
import { IWeaponResponse } from "@/src/types/inventoryTypes/weaponTypes";
|
import { IWeaponResponse } from "@/src/types/inventoryTypes/weaponTypes";
|
||||||
import { ChallengeProgress, FlavourItem, IInventoryDatabaseDocument } from "@/src/types/inventoryTypes/inventoryTypes";
|
|
||||||
import {
|
import {
|
||||||
MissionInventoryUpdate,
|
ChallengeProgress,
|
||||||
MissionInventoryUpdateCard,
|
FlavourItem,
|
||||||
MissionInventoryUpdateGear,
|
IInventoryDatabaseDocument,
|
||||||
MissionInventoryUpdateItem
|
MiscItem,
|
||||||
} from "../types/missionInventoryUpdateType";
|
RawUpgrade
|
||||||
|
} from "@/src/types/inventoryTypes/inventoryTypes";
|
||||||
|
import { MissionInventoryUpdate, MissionInventoryUpdateGear } from "../types/missionInventoryUpdateType";
|
||||||
|
|
||||||
const createInventory = async (accountOwnerId: Types.ObjectId) => {
|
const createInventory = async (accountOwnerId: Types.ObjectId) => {
|
||||||
try {
|
try {
|
||||||
@ -130,21 +131,33 @@ const addGearExpByCategory = (
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const addItemsByCategory = (
|
const addMiscItems = (inventory: IInventoryDatabaseDocument, itemsArray: MiscItem[] | undefined) => {
|
||||||
inventory: IInventoryDatabaseDocument,
|
const { MiscItems } = inventory;
|
||||||
itemsArray: (MissionInventoryUpdateItem | MissionInventoryUpdateCard)[] | undefined,
|
|
||||||
categoryName: "RawUpgrades" | "MiscItems"
|
|
||||||
) => {
|
|
||||||
const category = inventory[categoryName];
|
|
||||||
|
|
||||||
itemsArray?.forEach(({ ItemCount, ItemType }) => {
|
itemsArray?.forEach(({ ItemCount, ItemType }) => {
|
||||||
const itemIndex = category.findIndex(i => i.ItemType === ItemType);
|
const itemIndex = MiscItems.findIndex(i => i.ItemType === ItemType);
|
||||||
|
|
||||||
if (itemIndex !== -1) {
|
if (itemIndex !== -1) {
|
||||||
category[itemIndex].ItemCount += ItemCount;
|
MiscItems[itemIndex].ItemCount += ItemCount;
|
||||||
inventory.markModified(`${categoryName}.${itemIndex}.ItemCount`);
|
inventory.markModified(`MiscItems.${itemIndex}.ItemCount`);
|
||||||
} else {
|
} else {
|
||||||
category.push({ ItemCount, ItemType });
|
MiscItems.push({ ItemCount, ItemType });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const addMods = (inventory: IInventoryDatabaseDocument, itemsArray: RawUpgrade[] | undefined) => {
|
||||||
|
const { RawUpgrades } = inventory;
|
||||||
|
itemsArray?.forEach(({ ItemType, ItemCount, UpgradeFingerprint }) => {
|
||||||
|
const itemIndex = RawUpgrades.findIndex(
|
||||||
|
i => i.ItemType === ItemType && i.UpgradeFingerprint === UpgradeFingerprint
|
||||||
|
);
|
||||||
|
|
||||||
|
if (itemIndex !== -1) {
|
||||||
|
RawUpgrades[itemIndex].ItemCount += ItemCount;
|
||||||
|
inventory.markModified(`RawUpgrades.${itemIndex}.ItemCount`);
|
||||||
|
} else {
|
||||||
|
RawUpgrades.push({ ItemCount, ItemType });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@ -171,7 +184,8 @@ export const missionInventoryUpdate = async (data: MissionInventoryUpdate, accou
|
|||||||
const { RawUpgrades, MiscItems, RegularCredits, ChallengeProgress } = data;
|
const { RawUpgrades, MiscItems, RegularCredits, ChallengeProgress } = data;
|
||||||
const inventory = await getInventory(accountId);
|
const inventory = await getInventory(accountId);
|
||||||
|
|
||||||
// TODO - multipliers logic
|
// TODO - multipliers logic for mission reward (looted comes multiplied)
|
||||||
|
|
||||||
// credits
|
// credits
|
||||||
inventory.RegularCredits += RegularCredits || 0;
|
inventory.RegularCredits += RegularCredits || 0;
|
||||||
|
|
||||||
@ -179,8 +193,8 @@ export const missionInventoryUpdate = async (data: MissionInventoryUpdate, accou
|
|||||||
gearKeys.forEach((key: GearKeysType) => addGearExpByCategory(inventory, data[key], key));
|
gearKeys.forEach((key: GearKeysType) => addGearExpByCategory(inventory, data[key], key));
|
||||||
|
|
||||||
// other
|
// other
|
||||||
addItemsByCategory(inventory, RawUpgrades, "RawUpgrades"); // TODO - check mods fusion level
|
addMods(inventory, RawUpgrades);
|
||||||
addItemsByCategory(inventory, MiscItems, "MiscItems");
|
addMiscItems(inventory, MiscItems);
|
||||||
addChallenges(inventory, ChallengeProgress);
|
addChallenges(inventory, ChallengeProgress);
|
||||||
|
|
||||||
const changedInventory = await inventory.save();
|
const changedInventory = await inventory.save();
|
||||||
@ -206,4 +220,62 @@ export const addBooster = async (ItemType: string, time: number, accountId: stri
|
|||||||
await inventory.save();
|
await inventory.save();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const upgradeMod = async (
|
||||||
|
{
|
||||||
|
Upgrade,
|
||||||
|
LevelDiff,
|
||||||
|
Cost,
|
||||||
|
FusionPointCost
|
||||||
|
}: { Upgrade: RawUpgrade; LevelDiff: number; Cost: number; FusionPointCost: number },
|
||||||
|
accountId: string
|
||||||
|
): Promise<void> => {
|
||||||
|
const inventory = await getInventory(accountId);
|
||||||
|
const { RawUpgrades } = inventory;
|
||||||
|
const { ItemCount, ItemType, UpgradeFingerprint } = Upgrade;
|
||||||
|
const itemIndex = RawUpgrades.findIndex(
|
||||||
|
i => i.ItemType === ItemType && i.UpgradeFingerprint === UpgradeFingerprint
|
||||||
|
);
|
||||||
|
|
||||||
|
const safeUpgradeFingerprint = UpgradeFingerprint || '{"lvl":0}';
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
||||||
|
const parsedUpgradeFingerprint = JSON.parse(safeUpgradeFingerprint);
|
||||||
|
parsedUpgradeFingerprint.lvl += LevelDiff;
|
||||||
|
|
||||||
|
if (!ItemCount) return;
|
||||||
|
|
||||||
|
RawUpgrades[itemIndex].ItemCount--;
|
||||||
|
|
||||||
|
if (RawUpgrades[itemIndex].ItemCount > 0) {
|
||||||
|
inventory.markModified(`RawUpgrades.${itemIndex}.ItemCount`);
|
||||||
|
} else {
|
||||||
|
RawUpgrades.splice(itemIndex, 1);
|
||||||
|
inventory.markModified(`RawUpgrades`);
|
||||||
|
}
|
||||||
|
|
||||||
|
addMods(inventory, [{ ItemType, ItemCount: 1, UpgradeFingerprint: JSON.stringify(parsedUpgradeFingerprint) }]);
|
||||||
|
|
||||||
|
inventory.RegularCredits -= Cost;
|
||||||
|
inventory.FusionPoints -= FusionPointCost;
|
||||||
|
|
||||||
|
await inventory.save();
|
||||||
|
// {
|
||||||
|
// "Upgrade": {
|
||||||
|
// ItemType: "/Lotus/Upgrades/Mods/Warframe/Beginner/AvatarShieldMaxModBeginner",
|
||||||
|
// ItemId: {
|
||||||
|
// $oid: ""
|
||||||
|
// },
|
||||||
|
// UpgradeFingerprint: '{"lvl":1}',
|
||||||
|
// PendingRerollFingerprint: "",
|
||||||
|
// ItemCount: 2,
|
||||||
|
// LastAdded: {
|
||||||
|
// $oid: "64f01ab0c4dfa3a8ef090043"
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// "LevelDiff": 1,
|
||||||
|
// "Consumed": [],
|
||||||
|
// "Cost": 483,
|
||||||
|
// "FusionPointCost": 10
|
||||||
|
// }
|
||||||
|
};
|
||||||
|
|
||||||
export { createInventory, addPowerSuit };
|
export { createInventory, addPowerSuit };
|
||||||
|
@ -377,11 +377,6 @@ export interface FlavourItem {
|
|||||||
ItemType: string;
|
ItemType: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface RawUpgrade {
|
|
||||||
ItemCount: number;
|
|
||||||
ItemType: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface MiscItem {
|
export interface MiscItem {
|
||||||
ItemCount: number;
|
ItemCount: number;
|
||||||
ItemType: string;
|
ItemType: string;
|
||||||
@ -928,9 +923,11 @@ export interface Progress {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface RawUpgrade {
|
export interface RawUpgrade {
|
||||||
ItemCount: number;
|
|
||||||
LastAdded?: Oid;
|
|
||||||
ItemType: string;
|
ItemType: string;
|
||||||
|
ItemCount: number;
|
||||||
|
UpgradeFingerprint?: string;
|
||||||
|
PendingRerollFingerprint?: string;
|
||||||
|
LastAdded?: Oid;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Scoop {
|
export interface Scoop {
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
interface MongooseId{
|
interface MongooseId {
|
||||||
$oid: string;
|
$oid: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ExpireDate{
|
interface ExpireDate {
|
||||||
$date: {
|
$date: {
|
||||||
$numberLong: string;
|
$numberLong: string;
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface MissionInventoryUpdateGear{
|
export interface MissionInventoryUpdateGear {
|
||||||
ItemType: string;
|
ItemType: string;
|
||||||
ItemName: string;
|
ItemName: string;
|
||||||
ItemId: MongooseId;
|
ItemId: MongooseId;
|
||||||
@ -32,25 +32,25 @@ export interface MissionInventoryUpdateGear{
|
|||||||
ArchonCrystalUpgrades: any[];
|
ArchonCrystalUpgrades: any[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface MissionInventoryUpdateItem{
|
export interface MissionInventoryUpdateItem {
|
||||||
ItemCount: number;
|
ItemCount: number;
|
||||||
ItemType: string;
|
ItemType: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface MissionInventoryUpdateCard extends MissionInventoryUpdateItem{
|
export interface MissionInventoryUpdateCard extends MissionInventoryUpdateItem {
|
||||||
ItemId: MongooseId;
|
ItemId: MongooseId;
|
||||||
UpgradeFingerprint: string;
|
UpgradeFingerprint: string;
|
||||||
PendingRerollFingerprint: string;
|
PendingRerollFingerprint: string;
|
||||||
LastAdded: MongooseId;
|
LastAdded: MongooseId;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface MissionInventoryUpdateChallange{
|
interface MissionInventoryUpdateChallange {
|
||||||
Name: string;
|
Name: string;
|
||||||
Progress: number;
|
Progress: number;
|
||||||
Completed: any[];
|
Completed: any[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface MissionInventoryUpdate{
|
export interface MissionInventoryUpdate {
|
||||||
rewardsMultiplier?: number;
|
rewardsMultiplier?: number;
|
||||||
ActiveBoosters?: any[];
|
ActiveBoosters?: any[];
|
||||||
LongGuns?: MissionInventoryUpdateGear[];
|
LongGuns?: MissionInventoryUpdateGear[];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user