This commit is contained in:
Ordis 2023-12-14 14:44:45 +01:00
parent 79c58f2558
commit ee6f9cb985
25 changed files with 473 additions and 254 deletions

6
package-lock.json generated
View File

@ -327,9 +327,9 @@
} }
}, },
"node_modules/@types/express": { "node_modules/@types/express": {
"version": "4.17.20", "version": "4.17.21",
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
"integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/body-parser": "*", "@types/body-parser": "*",

View File

@ -0,0 +1,6 @@
import { Handler } from "express";
export const focusController: Handler = (_req, _res) => {
//console.log("focusController", req.query);
_res.sendStatus(400);
};

View File

@ -3,26 +3,24 @@ import { IGenericUpdate } from "@/src/types/genericUpdate";
import { RequestHandler } from "express"; import { RequestHandler } from "express";
// TODO: Nightwave evidence submission support is the only thing missing. // TODO: Nightwave evidence submission support is the only thing missing.
// TODO: Also, you might want to test this, because I definitely didn't. // TODO: this was added by someone without testing. It may not work.
const genericUpdateController: RequestHandler = async (request, response) => { // eslint-disable-next-line @typescript-eslint/no-misused-promises
const accountId = request.query.accountId as string; const genericUpdateController: RequestHandler = async (_request, response) => {
// const accountId = request.query.accountId as string;
const [body] = String(request.body).split("\n"); // const [body] = String(request.body).split("\n");
let reply = {}; // let reply = {};
try { // try {
const update = JSON.parse(body) as IGenericUpdate; // const update = JSON.parse(body) as IGenericUpdate;
if (typeof update !== "object") { // if (typeof update !== "object") {
throw new Error("Invalid data format"); // throw new Error("Invalid data format");
} // }
reply = await updateGeneric(update, accountId); // reply = await updateGeneric(update, accountId);
} catch (err) { // } catch (err) {
console.error("Error parsing JSON data:", err); // console.error("Error parsing JSON data:", err);
} // }
// Response support added for when Nightwave is supported below.
// response.json(reply);
response.json({}); response.json({});
}; };

View File

@ -13,6 +13,77 @@ const getShipController: RequestHandler = async (req, res) => {
res.status(500).json({ error: "error finding a corresponding ship" }); res.status(500).json({ error: "error finding a corresponding ship" });
return; return;
} }
ship.Ship.Features = [
"/Lotus/Types/Items/ShipFeatureItems/AdvancedOrdisFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/AlchemyRoomFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/AlertsFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/ArsenalFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/CeresNavigationFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/ClanFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/EarthNavigationFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/EidolonArchwingFoundryUpgradeFeatureBlueprint",
"/Lotus/Types/Items/ShipFeatureItems/EidolonArchwingFoundryUpgradeFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/ErisNavigationFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/EuropaNavigationFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/FoundryConcurrentBuildFormaFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/FoundryFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/FoundryVesselUpgradeFeatureBlueprint",
"/Lotus/Types/Items/ShipFeatureItems/FoundryVesselUpgradeFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryCatbrowUpgradeFeatureBlueprint",
"/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryCatbrowUpgradeFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryUpgradeFeatureBlueprint",
"/Lotus/Types/Items/ShipFeatureItems/GeneticFoundryUpgradeFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryArchonShardBlueprint",
"/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryArchonShardFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryBlueprint",
"/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryItem",
"/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryUpgradeBlueprint",
"/Lotus/Types/Items/ShipFeatureItems/InfestedFoundryUpgradeFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/JupiterNavigationFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/MarketTierOneFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/MarketTierTwoFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/MarsNavigationFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/MercuryNavigationFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/ModsFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/ModsFusionFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/ModsTransmuteFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/NeptuneNavigationFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/PersonalQuartersFeatureBlueprint",
"/Lotus/Types/Items/ShipFeatureItems/PersonalQuartersFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/PhobosNavigationFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/PlutoNavigationFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackHoodBraceFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackHoodFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackHullFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackNacelleLeftFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackNacelleRightFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/Railjack/DamagedRailjackTailFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHoodBraceFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHoodBraceFeatureItemBlueprint",
"/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHoodFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHoodFeatureItemBlueprint",
"/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHullFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackHullFeatureItemBlueprint",
"/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackNacelleLeftFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackNacelleLeftFeatureItemBlueprint",
"/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackNacelleRightFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackNacelleRightFeatureItemBlueprint",
"/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackTailFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/Railjack/RailjackTailFeatureItemBlueprint",
"/Lotus/Types/Items/ShipFeatureItems/RailjackCephalonShipFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/RailjackKeyShipFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/SaturnNavigationFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/SednaNavigationFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/ShipFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/SocialMenuFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/SolarChartFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/UranusNavigationFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/VenusNavigationFeatureItem",
"/Lotus/Types/Items/ShipFeatureItems/VoidProjectionFeatureItem"
];
res.json(ship); res.json(ship);
}; };

View File

@ -31,7 +31,6 @@ const inventoryController: RequestHandler = async (request: Request, response: R
if (config.testMission) inventoryResponse.Missions = testMissions; if (config.testMission) inventoryResponse.Missions = testMissions;
if (config.testQuestKey) inventoryResponse.QuestKeys = testQuestKeys; if (config.testQuestKey) inventoryResponse.QuestKeys = testQuestKeys;
inventoryResponse.DuviriInfo = { Seed: -123123123123123123, NumCompletions: 0 };
response.json(inventoryResponse); response.json(inventoryResponse);
}; };

View File

@ -50,7 +50,7 @@ const loginController: RequestHandler = async (request, response) => {
return; return;
} catch (error: unknown) { } catch (error: unknown) {
if (error instanceof Error) { if (error instanceof Error) {
throw new Error("error creating account"); throw new Error("error creating account", error);
} }
} }
} }

View File

@ -8,14 +8,17 @@ import { parseString } from "@/src/helpers/general";
const saveLoadoutController: RequestHandler = async (req, res) => { const saveLoadoutController: RequestHandler = async (req, res) => {
//validate here //validate here
const accountId = parseString(req.query.accountId); const accountId = parseString(req.query.accountId);
try {
const body: ISaveLoadoutRequest = JSON.parse(req.body as string) as ISaveLoadoutRequest; const body: ISaveLoadoutRequest = JSON.parse(req.body as string) as ISaveLoadoutRequest;
// console.log(util.inspect(body, { showHidden: false, depth: null, colors: true })); // console.log(util.inspect(body, { showHidden: false, depth: null, colors: true }));
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
const { UpgradeVer, ...equipmentChanges } = body; const { UpgradeVer, ...equipmentChanges } = body;
await handleInventoryItemConfigChange(equipmentChanges, accountId); await handleInventoryItemConfigChange(equipmentChanges, accountId);
} catch (error) {
res.status(200).end(); res.status(200).end();
}
}; };
export { saveLoadoutController }; export { saveLoadoutController };

View File

@ -0,0 +1,6 @@
import { Request, Response } from "express";
export const setBootLocationController = (req: Request, res: Response) => {
console.log("setBootLocationController", req.query);
res.end();
};

View File

@ -1,8 +0,0 @@
import { RequestHandler } from "express";
import view from "@/static/fixed_responses/view.json";
const viewController: RequestHandler = (_req, res) => {
res.json(view);
};
export { viewController };

View File

@ -1,7 +1,8 @@
import { RequestHandler } from "express"; import { RequestHandler } from "express";
import view from "@/static/fixed_responses/view.json";
const viewController: RequestHandler = (_req, res) => { const viewController: RequestHandler = (_req, res) => {
res.json({}); res.json(view);
}; };
export { viewController }; export { viewController };

View File

@ -1,10 +1,14 @@
import { IOid } from "@/src/types/commonTypes";
import { IInventoryDatabase, IInventoryResponse } from "@/src/types/inventoryTypes/inventoryTypes"; import { IInventoryDatabase, IInventoryResponse } from "@/src/types/inventoryTypes/inventoryTypes";
import { Types } from "mongoose";
// a schema's toJSON is responsible for changing Oid and Date to their corresponding Response versions __id to "ItemId":{"$oid":"6450f720bc562ebf030222d4"}, and a Date to "date":{"$date":{"$numberLong":"unix timestamp"}) // a schema's toJSON is responsible for changing Oid and Date to their corresponding Response versions __id to "ItemId":{"$oid":"6450f720bc562ebf030222d4"}, and a Date to "date":{"$date":{"$numberLong":"unix timestamp"})
const toInventoryResponse = (inventoryDatabase: IInventoryDatabase): IInventoryResponse => { export const toInventoryResponse = (inventoryDatabase: IInventoryDatabase): IInventoryResponse => {
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
const { accountOwnerId, ...inventoryResponse } = inventoryDatabase; const { accountOwnerId, ...inventoryResponse } = inventoryDatabase;
return inventoryResponse as unknown as IInventoryResponse; return inventoryResponse as unknown as IInventoryResponse;
}; };
export { toInventoryResponse }; export const toOid = (objectId: Types.ObjectId) => {
return { $oid: objectId.toString() } satisfies IOid;
};

View File

@ -7,17 +7,23 @@ import {
IBooster, IBooster,
IInventoryResponse, IInventoryResponse,
IInventoryDatabaseDocument, IInventoryDatabaseDocument,
ISlots ISlots,
IGenericItem,
IMailbox,
IDuviriInfo
} from "../../types/inventoryTypes/inventoryTypes"; } from "../../types/inventoryTypes/inventoryTypes";
import { IMongoDate, IOid } from "../../types/commonTypes"; import { IMongoDate, IOid } from "../../types/commonTypes";
import { import { ISuitDatabase } from "@/src/types/inventoryTypes/SuitTypes";
IItemConfig,
ISuitDatabase,
IOperatorConfigClient,
IOperatorConfigDatabase
} from "@/src/types/inventoryTypes/SuitTypes";
import { IWeaponDatabase } from "@/src/types/inventoryTypes/weaponTypes"; import { IWeaponDatabase } from "@/src/types/inventoryTypes/weaponTypes";
import { IAbilityOverride, IColor, IPolarity } from "@/src/types/inventoryTypes/commonInventoryTypes"; import {
IAbilityOverride,
IColor,
IItemConfig,
IOperatorConfigClient,
IOperatorConfigDatabase,
IPolarity
} from "@/src/types/inventoryTypes/commonInventoryTypes";
import { toOid } from "@/src/helpers/inventoryHelpers";
const polaritySchema = new Schema<IPolarity>({ const polaritySchema = new Schema<IPolarity>({
Slot: Number, Slot: Number,
@ -51,6 +57,7 @@ const operatorConfigSchema = new Schema<IOperatorConfigDatabase>(
eyecol: colorSchema, eyecol: colorSchema,
facial: colorSchema, facial: colorSchema,
syancol: colorSchema, syancol: colorSchema,
cloth: colorSchema,
Upgrades: [String], Upgrades: [String],
Name: String, // not sure if possible in operator Name: String, // not sure if possible in operator
ugly: Boolean // not sure if possible in operator ugly: Boolean // not sure if possible in operator
@ -141,10 +148,13 @@ const BoosterSchema = new Schema<IBooster>({
ItemType: String ItemType: String
}); });
const RawUpgrades = new Schema<IRawUpgrade>({ const RawUpgrades = new Schema<IRawUpgrade>(
{
ItemType: String, ItemType: String,
ItemCount: Number ItemCount: Number
}); },
{ id: false }
);
RawUpgrades.virtual("LastAdded").get(function () { RawUpgrades.virtual("LastAdded").get(function () {
return { $oid: this._id.toString() } satisfies IOid; return { $oid: this._id.toString() } satisfies IOid;
@ -158,7 +168,7 @@ RawUpgrades.set("toJSON", {
} }
}); });
//TODO: validate what this is //TODO: find out what this is
const Upgrade = new Schema({ const Upgrade = new Schema({
UpgradeFingerprint: String, UpgradeFingerprint: String,
ItemType: String ItemType: String
@ -208,14 +218,18 @@ suitSchema.set("toJSON", {
const slotsBinSchema = new Schema<ISlots>( const slotsBinSchema = new Schema<ISlots>(
{ {
Slots: Number Slots: Number,
Extra: Number
}, },
{ _id: false } { _id: false }
); );
const FlavourItemSchema = new Schema({ const FlavourItemSchema = new Schema(
{
ItemType: String ItemType: String
}); },
{ _id: false }
);
FlavourItemSchema.set("toJSON", { FlavourItemSchema.set("toJSON", {
transform(_document, returnedObject) { transform(_document, returnedObject) {
@ -224,7 +238,70 @@ FlavourItemSchema.set("toJSON", {
} }
}); });
const GenericItemSchema = new Schema<IGenericItem>(
{
ItemType: String,
Configs: [ItemConfigSchema],
UpgradeVer: Number //this is probably just __v
},
{ id: false }
);
GenericItemSchema.virtual("ItemId").get(function () {
return { $oid: this._id.toString() } satisfies IOid;
});
GenericItemSchema.set("toJSON", {
virtuals: true,
transform(_document, returnedObject) {
delete returnedObject._id;
delete returnedObject.__v;
}
});
// "Mailbox": { "LastInboxId": { "$oid": "123456780000000000000000" } }
const MailboxSchema = new Schema<IMailbox>(
{
LastInboxId: {
type: Schema.Types.ObjectId,
set: (v: IMailbox["LastInboxId"]) => v.$oid.toString()
}
},
{ id: false, _id: false }
);
MailboxSchema.set("toJSON", {
transform(_document, returnedObject) {
delete returnedObject.__v;
//TODO: there is a lot of any here
returnedObject.LastInboxId = toOid(returnedObject.LastInboxId as Types.ObjectId);
}
});
const DuviriInfoSchema = new Schema<IDuviriInfo>(
{
Seed: Number,
NumCompletions: Number
},
{
_id: false,
id: false
}
);
DuviriInfoSchema.set("toJSON", {
transform(_document, returnedObject) {
delete returnedObject.__v;
}
});
const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>({ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>({
Horses: [GenericItemSchema],
DrifterMelee: [GenericItemSchema],
DrifterGuns: [GenericItemSchema],
DuviriInfo: DuviriInfoSchema,
Mailbox: MailboxSchema,
KahlLoadOuts: [Schema.Types.Mixed],
accountOwnerId: Schema.Types.ObjectId, accountOwnerId: Schema.Types.ObjectId,
SubscribedToEmails: Number, SubscribedToEmails: Number,
Created: Schema.Types.Mixed, Created: Schema.Types.Mixed,
@ -236,11 +313,15 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>({
SuitBin: slotsBinSchema, SuitBin: slotsBinSchema,
WeaponBin: slotsBinSchema, WeaponBin: slotsBinSchema,
SentinelBin: slotsBinSchema, SentinelBin: slotsBinSchema,
SpaceSuitBin: Schema.Types.Mixed, SpaceSuitBin: slotsBinSchema,
SpaceWeaponBin: Schema.Types.Mixed, SpaceWeaponBin: slotsBinSchema,
PvpBonusLoadoutBin: Schema.Types.Mixed, PvpBonusLoadoutBin: slotsBinSchema,
PveBonusLoadoutBin: Schema.Types.Mixed, PveBonusLoadoutBin: slotsBinSchema,
RandomModBin: Schema.Types.Mixed, RandomModBin: slotsBinSchema,
OperatorAmpBin: slotsBinSchema,
CrewShipSalvageBin: slotsBinSchema,
MechBin: slotsBinSchema,
CrewMemberBin: slotsBinSchema,
TradesRemaining: Number, TradesRemaining: Number,
DailyAffiliation: Number, DailyAffiliation: Number,
DailyAffiliationPvp: Number, DailyAffiliationPvp: Number,
@ -260,7 +341,7 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>({
Ships: [Schema.Types.Mixed], Ships: [Schema.Types.Mixed],
QuestKeys: [Schema.Types.Mixed], QuestKeys: [Schema.Types.Mixed],
FlavourItems: [FlavourItemSchema], FlavourItems: [FlavourItemSchema],
Scoops: [Schema.Types.Mixed], Scoops: [GenericItemSchema],
TrainingRetriesLeft: Number, TrainingRetriesLeft: Number,
LoadOutPresets: { type: Schema.Types.ObjectId, ref: "Loadout" }, LoadOutPresets: { type: Schema.Types.ObjectId, ref: "Loadout" },
CurrentLoadOutIds: [Schema.Types.Mixed], CurrentLoadOutIds: [Schema.Types.Mixed],
@ -294,14 +375,14 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>({
Affiliations: [Schema.Types.Mixed], Affiliations: [Schema.Types.Mixed],
QualifyingInvasions: [Schema.Types.Mixed], QualifyingInvasions: [Schema.Types.Mixed],
FactionScores: [Number], FactionScores: [Number],
SpaceSuits: [Schema.Types.Mixed], SpaceSuits: [GenericItemSchema],
SpaceMelee: [Schema.Types.Mixed], SpaceMelee: [GenericItemSchema],
SpaceGuns: [Schema.Types.Mixed], SpaceGuns: [Schema.Types.Mixed],
ArchwingEnabled: Boolean, ArchwingEnabled: Boolean,
PendingSpectreLoadouts: [Schema.Types.Mixed], PendingSpectreLoadouts: [Schema.Types.Mixed],
SpectreLoadouts: [Schema.Types.Mixed], SpectreLoadouts: [Schema.Types.Mixed],
SentinelWeapons: [Schema.Types.Mixed], Sentinels: [WeaponSchema],
Sentinels: [Schema.Types.Mixed], SentinelWeapons: [WeaponSchema],
EmailItems: [Schema.Types.Mixed], EmailItems: [Schema.Types.Mixed],
CompletedSyndicates: [String], CompletedSyndicates: [String],
FocusXP: Schema.Types.Mixed, FocusXP: Schema.Types.Mixed,
@ -314,7 +395,6 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>({
ActiveAvatarImageType: String, ActiveAvatarImageType: String,
KubrowPets: [Schema.Types.Mixed], KubrowPets: [Schema.Types.Mixed],
ShipDecorations: [Schema.Types.Mixed], ShipDecorations: [Schema.Types.Mixed],
OperatorAmpBin: Schema.Types.Mixed,
DailyAffiliationCetus: Number, DailyAffiliationCetus: Number,
DailyAffiliationQuills: Number, DailyAffiliationQuills: Number,
DiscoveredMarkers: [Schema.Types.Mixed], DiscoveredMarkers: [Schema.Types.Mixed],
@ -346,13 +426,12 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>({
MoaPets: [Schema.Types.Mixed], MoaPets: [Schema.Types.Mixed],
EquippedInstrument: String, EquippedInstrument: String,
InvasionChainProgress: [Schema.Types.Mixed], InvasionChainProgress: [Schema.Types.Mixed],
DataKnives: [Schema.Types.Mixed], DataKnives: [GenericItemSchema],
NemesisHistory: [Schema.Types.Mixed], NemesisHistory: [Schema.Types.Mixed],
LastNemesisAllySpawnTime: Schema.Types.Mixed, LastNemesisAllySpawnTime: Schema.Types.Mixed,
Settings: Schema.Types.Mixed, Settings: Schema.Types.Mixed,
PersonalTechProjects: [Schema.Types.Mixed], PersonalTechProjects: [Schema.Types.Mixed],
CrewShips: [Schema.Types.Mixed], CrewShips: [Schema.Types.Mixed],
CrewShipSalvageBin: Schema.Types.Mixed,
PlayerSkills: Schema.Types.Mixed, PlayerSkills: Schema.Types.Mixed,
CrewShipAmmo: [Schema.Types.Mixed], CrewShipAmmo: [Schema.Types.Mixed],
CrewShipSalvagedWeaponSkins: [Schema.Types.Mixed], CrewShipSalvagedWeaponSkins: [Schema.Types.Mixed],
@ -362,13 +441,11 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>({
TradeBannedUntil: Schema.Types.Mixed, TradeBannedUntil: Schema.Types.Mixed,
PlayedParkourTutorial: Boolean, PlayedParkourTutorial: Boolean,
SubscribedToEmailsPersonalized: Number, SubscribedToEmailsPersonalized: Number,
MechBin: Schema.Types.Mixed,
DailyAffiliationEntrati: Number, DailyAffiliationEntrati: Number,
DailyAffiliationNecraloid: Number, DailyAffiliationNecraloid: Number,
MechSuits: [Schema.Types.Mixed], MechSuits: [suitSchema],
InfestedFoundry: Schema.Types.Mixed, InfestedFoundry: Schema.Types.Mixed,
BlessingCooldown: Schema.Types.Mixed, BlessingCooldown: Schema.Types.Mixed,
CrewMemberBin: Schema.Types.Mixed,
CrewShipHarnesses: [Schema.Types.Mixed], CrewShipHarnesses: [Schema.Types.Mixed],
CrewShipRawSalvage: [Schema.Types.Mixed], CrewShipRawSalvage: [Schema.Types.Mixed],
CrewMembers: [Schema.Types.Mixed], CrewMembers: [Schema.Types.Mixed],
@ -393,10 +470,7 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>({
HasResetAccount: Boolean, HasResetAccount: Boolean,
PendingCoupon: Schema.Types.Mixed, PendingCoupon: Schema.Types.Mixed,
Harvestable: Boolean, Harvestable: Boolean,
DeathSquadable: Boolean, DeathSquadable: Boolean
Horses: [Schema.Types.Mixed],
DrifterMelee: [Schema.Types.Mixed],
KahlLoadOuts: [Schema.Types.Mixed]
}); });
inventorySchema.set("toJSON", { inventorySchema.set("toJSON", {
@ -425,6 +499,12 @@ type InventoryDocumentProps = {
Boosters: Types.DocumentArray<IBooster>; Boosters: Types.DocumentArray<IBooster>;
OperatorLoadOuts: Types.DocumentArray<IOperatorConfigClient>; OperatorLoadOuts: Types.DocumentArray<IOperatorConfigClient>;
AdultOperatorLoadOuts: Types.DocumentArray<IOperatorConfigClient>; AdultOperatorLoadOuts: Types.DocumentArray<IOperatorConfigClient>;
MechSuits: Types.DocumentArray<ISuitDatabase>;
Scoops: Types.DocumentArray<IGenericItem>;
DataKnives: Types.DocumentArray<IGenericItem>;
DrifterMelee: Types.DocumentArray<IGenericItem>;
Sentinels: Types.DocumentArray<IWeaponDatabase>;
Horses: Types.DocumentArray<IGenericItem>;
}; };
type InventoryModelType = Model<IInventoryDatabase, {}, InventoryDocumentProps>; type InventoryModelType = Model<IInventoryDatabase, {}, InventoryDocumentProps>;

View File

@ -26,13 +26,14 @@ import { setActiveQuestController } from "@/src/controllers/api/setActiveQuestCo
import { surveysController } from "@/src/controllers/api/surveysController"; import { surveysController } from "@/src/controllers/api/surveysController";
import { updateChallengeProgressController } from "@/src/controllers/api/updateChallengeProgressController"; import { updateChallengeProgressController } from "@/src/controllers/api/updateChallengeProgressController";
import { updateSessionGetController, updateSessionPostController } from "@/src/controllers/api/updateSessionController"; import { updateSessionGetController, updateSessionPostController } from "@/src/controllers/api/updateSessionController";
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 { trainingResultController } from "@/src/controllers/api/trainingResultController"; import { trainingResultController } from "@/src/controllers/api/trainingResultController";
import { artifactsController } from "../controllers/api/artifactsController"; import { artifactsController } from "../controllers/api/artifactsController";
import express from "express"; import express from "express";
import { setBootLocationController } from "@/src/controllers/api/setBootLocationController";
import { focusController } from "@/src/controllers/api/focusController";
const apiRouter = express.Router(); const apiRouter = express.Router();
@ -46,7 +47,6 @@ apiRouter.get("/loginRewards.php", loginRewardsController);
apiRouter.get("/checkDailyMissionBonus.php", checkDailyMissionBonusController); apiRouter.get("/checkDailyMissionBonus.php", checkDailyMissionBonusController);
apiRouter.get("/inbox.php", inboxController); apiRouter.get("/inbox.php", inboxController);
apiRouter.get("/getShip.php", getShipController); apiRouter.get("/getShip.php", getShipController);
apiRouter.get("/view.php", viewController);
apiRouter.get("/drones.php", dronesController); apiRouter.get("/drones.php", dronesController);
apiRouter.get("/getIgnoredUsers.php", getIgnoredUsersController); apiRouter.get("/getIgnoredUsers.php", getIgnoredUsersController);
apiRouter.get("/getNewRewardSeed.php", getNewRewardSeedController); apiRouter.get("/getNewRewardSeed.php", getNewRewardSeedController);
@ -58,8 +58,10 @@ apiRouter.get("/hub", hubController);
apiRouter.get("/modularWeaponSale.php", modularWeaponSaleController); apiRouter.get("/modularWeaponSale.php", modularWeaponSaleController);
apiRouter.get("/deleteSession.php", deleteSessionController); apiRouter.get("/deleteSession.php", deleteSessionController);
apiRouter.get("/logout.php", logoutController); apiRouter.get("/logout.php", logoutController);
apiRouter.get("/setBootLocation.php", setBootLocationController);
// post // post
apiRouter.post("/focus.php", focusController);
apiRouter.post("/artifacts.php", artifactsController); 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

View File

@ -1,4 +1,4 @@
import { viewController } from "../controllers/api/viewController"; import { viewController } from "../controllers/stats/viewController";
import { uploadController } from "@/src/controllers/stats/uploadController"; import { uploadController } from "@/src/controllers/stats/uploadController";
import express from "express"; import express from "express";

View File

@ -17,7 +17,7 @@ import {
import { IGenericUpdate } from "../types/genericUpdate"; import { IGenericUpdate } from "../types/genericUpdate";
import { IArtifactsRequest, IMissionInventoryUpdateRequest } from "../types/requestTypes"; import { IArtifactsRequest, IMissionInventoryUpdateRequest } from "../types/requestTypes";
const createInventory = async (accountOwnerId: Types.ObjectId, loadOutPresetId: Types.ObjectId) => { export const createInventory = async (accountOwnerId: Types.ObjectId, loadOutPresetId: Types.ObjectId) => {
try { try {
const inventory = new Inventory({ const inventory = new Inventory({
...new_inventory, ...new_inventory,
@ -53,13 +53,28 @@ export const getInventory = async (accountOwnerId: string) => {
return inventory; return inventory;
}; };
const addPowerSuit = async (powersuitName: string, accountId: string): Promise<ISuitClient> => { //TODO: genericMethod for all the add methods, they share a lot of logic
export const addSentinel = async (sentinelName: string, accountId: string) => {
const inventory = await getInventory(accountId);
const sentinelIndex = inventory.Sentinels.push({ ItemType: sentinelName, Configs: [], XP: 0 });
const changedInventory = await inventory.save();
return changedInventory.Sentinels[sentinelIndex - 1].toJSON();
};
export const addPowerSuit = async (powersuitName: string, accountId: string): Promise<ISuitClient> => {
const inventory = await getInventory(accountId); const inventory = await getInventory(accountId);
const suitIndex = inventory.Suits.push({ ItemType: powersuitName, Configs: [], UpgradeVer: 101, XP: 0 }); const suitIndex = inventory.Suits.push({ ItemType: powersuitName, Configs: [], UpgradeVer: 101, XP: 0 });
const changedInventory = await inventory.save(); const changedInventory = await inventory.save();
return changedInventory.Suits[suitIndex - 1].toJSON(); return changedInventory.Suits[suitIndex - 1].toJSON();
}; };
export const addMechSuit = async (mechsuitName: string, accountId: string) => {
const inventory = await getInventory(accountId);
const suitIndex = inventory.MechSuits.push({ ItemType: mechsuitName, Configs: [], UpgradeVer: 101, XP: 0 });
const changedInventory = await inventory.save();
return changedInventory.MechSuits[suitIndex - 1].toJSON();
};
export const updateSlots = async (slotType: SlotType, accountId: string, slots: number) => { export const updateSlots = async (slotType: SlotType, accountId: string, slots: number) => {
const inventory = await getInventory(accountId); const inventory = await getInventory(accountId);
@ -70,6 +85,9 @@ export const updateSlots = async (slotType: SlotType, accountId: string, slots:
case SlotType.WEAPON: case SlotType.WEAPON:
inventory.WeaponBin.Slots += slots; inventory.WeaponBin.Slots += slots;
break; break;
case SlotType.MECHSUIT:
inventory.MechBin.Slots += slots;
break;
default: default:
throw new Error("invalid slot type"); throw new Error("invalid slot type");
} }
@ -343,5 +361,3 @@ export const upgradeMod = async (artifactsData: IArtifactsRequest, accountId: st
throw error; throw error;
} }
}; };
export { createInventory, addPowerSuit };

View File

@ -1,6 +1,14 @@
import { getWeaponType } from "@/src/helpers/purchaseHelpers"; import { getWeaponType } from "@/src/helpers/purchaseHelpers";
import { getSubstringFromKeyword } from "@/src/helpers/stringHelpers"; import { getSubstringFromKeyword } from "@/src/helpers/stringHelpers";
import { addBooster, addCustomization, addPowerSuit, addWeapon, updateSlots } from "@/src/services/inventoryService"; import {
addBooster,
addCustomization,
addMechSuit,
addPowerSuit,
addSentinel,
addWeapon,
updateSlots
} from "@/src/services/inventoryService";
import { IPurchaseRequest, SlotType } from "@/src/types/purchaseTypes"; import { IPurchaseRequest, SlotType } from "@/src/types/purchaseTypes";
export const getStoreItemCategory = (storeItem: string) => { export const getStoreItemCategory = (storeItem: string) => {
@ -72,8 +80,25 @@ const handleWeaponsPurchase = async (weaponName: string, accountId: string) => {
}; };
const handlePowersuitPurchase = async (powersuitName: string, accountId: string) => { const handlePowersuitPurchase = async (powersuitName: string, accountId: string) => {
if (powersuitName.includes("EntratiMech")) {
const mechSuit = await addMechSuit(powersuitName, accountId);
await updateSlots(SlotType.MECHSUIT, accountId, -1);
console.log("mech suit", mechSuit);
return {
InventoryChanges: {
MechBin: {
count: 1,
platinum: 0,
Slots: -1
},
MechSuits: [mechSuit]
}
};
}
const suit = await addPowerSuit(powersuitName, accountId); const suit = await addPowerSuit(powersuitName, accountId);
await updateSlots(SlotType.WEAPON, accountId, -1); await updateSlots(SlotType.SUIT, accountId, -1);
return { return {
InventoryChanges: { InventoryChanges: {
@ -95,13 +120,24 @@ const handleTypesPurchase = async (typesName: string, accountId: string) => {
return await handleSuitCustomizationsPurchase(typesName, accountId); return await handleSuitCustomizationsPurchase(typesName, accountId);
// case "Recipes": // case "Recipes":
// break; // break;
// case "Sentinels": case "Sentinels":
// break; return await handleSentinelPurchase(typesName, accountId);
default: default:
throw new Error(`unknown Types category: ${typeCategory} not implemented or new`); throw new Error(`unknown Types category: ${typeCategory} not implemented or new`);
} }
}; };
const handleSentinelPurchase = async (sentinelName: string, accountId: string) => {
const sentinel = await addSentinel(sentinelName, accountId);
return {
InventoryChanges: {
SentinelBin: { count: 1, platinum: 0, Slots: -1 },
Sentinels: [sentinel]
}
};
};
const handleSuitCustomizationsPurchase = async (customizationName: string, accountId: string) => { const handleSuitCustomizationsPurchase = async (customizationName: string, accountId: string) => {
const customization = await addCustomization(customizationName, accountId); const customization = await addCustomization(customizationName, accountId);

View File

@ -15,13 +15,20 @@ export const isEmptyObject = (obj: unknown): boolean => {
//setup default items on account creation or like originally in giveStartingItems.php //setup default items on account creation or like originally in giveStartingItems.php
//export const updateLoadout = (loadout: ISaveLoadoutRequest, accountId: string) => {}; //TODO: avoid multiple saves for less db calls
//TODO: change update functions to only add and not save
/* loadouts has loadoutconfigs
operatorloadouts has itemconfig, but no multiple config ids
itemconfig has multiple config ids
*/
//support multiple loadouts and multiple items and multiple configs per item
export const handleInventoryItemConfigChange = async ( export const handleInventoryItemConfigChange = async (
equipmentChanges: ISaveLoadoutRequestNoUpgradeVer, equipmentChanges: ISaveLoadoutRequestNoUpgradeVer,
accountId: string accountId: string
) => { ) => {
const inventory = await getInventory(accountId);
for (const [_equipmentName, _equipment] of Object.entries(equipmentChanges)) { for (const [_equipmentName, _equipment] of Object.entries(equipmentChanges)) {
const equipment = _equipment as ISaveLoadoutRequestNoUpgradeVer[keyof ISaveLoadoutRequestNoUpgradeVer]; const equipment = _equipment as ISaveLoadoutRequestNoUpgradeVer[keyof ISaveLoadoutRequestNoUpgradeVer];
const equipmentName = _equipmentName as keyof ISaveLoadoutRequestNoUpgradeVer; const equipmentName = _equipmentName as keyof ISaveLoadoutRequestNoUpgradeVer;
@ -34,12 +41,10 @@ export const handleInventoryItemConfigChange = async (
switch (equipmentName) { switch (equipmentName) {
case "OperatorLoadOuts": case "OperatorLoadOuts":
case "AdultOperatorLoadOuts": { case "AdultOperatorLoadOuts": {
console.log("loadout received", equipmentName);
const inventory = await getInventory(accountId); const inventory = await getInventory(accountId);
const operatorConfig = equipment as IOperatorConfigEntry; const operatorConfig = equipment as IOperatorConfigEntry;
const operatorLoadout = inventory[equipmentName]; const operatorLoadout = inventory[equipmentName];
console.log("loadout received", equipmentName, operatorConfig);
// all non-empty entries are one loadout slot // all non-empty entries are one loadout slot
for (const [loadoutId, loadoutConfig] of Object.entries(operatorConfig)) { for (const [loadoutId, loadoutConfig] of Object.entries(operatorConfig)) {
// console.log("loadoutId", loadoutId, "loadoutconfig", loadoutConfig); // console.log("loadoutId", loadoutId, "loadoutconfig", loadoutConfig);
@ -123,20 +128,25 @@ export const handleInventoryItemConfigChange = async (
case "LongGuns": case "LongGuns":
case "Pistols": case "Pistols":
case "Suits": case "Suits":
case "Melee": { case "Melee":
case "Scoops":
case "DataKnives":
case "DrifterMelee":
case "Sentinels":
case "Horses": {
console.log("? ???? ?", equipmentName, equipment); console.log("? ???? ?", equipmentName, equipment);
const itemEntry = equipment as IItemEntry; const itemEntries = equipment as IItemEntry;
const inventory = await getInventory(accountId); const inventory = await getInventory(accountId);
for (const [itemId, itemConfig] of Object.entries(itemEntry)) { for (const [itemId, itemConfigEntries] of Object.entries(itemEntries)) {
const inventoryItem = inventory[equipmentName].find(item => item._id.toString() === itemId); const inventoryItem = inventory[equipmentName].find(item => item._id?.toString() === itemId);
if (!inventoryItem) { if (!inventoryItem) {
throw new Error(`inventory item ${equipmentName} not found with id ${itemId}`); throw new Error(`inventory item ${equipmentName} not found with id ${itemId}`);
} }
//config ids are 0,1,2 can there be a 3? //config ids are 0,1,2 can there be a 3?
for (const [configId, config] of Object.entries(itemConfig)) { for (const [configId, config] of Object.entries(itemConfigEntries)) {
inventoryItem.Configs[parseInt(configId)] = config; inventoryItem.Configs[parseInt(configId)] = config;
} }
} }
@ -145,35 +155,40 @@ export const handleInventoryItemConfigChange = async (
} }
case "CurrentLoadOutIds": { case "CurrentLoadOutIds": {
//TODO: remove duplicate getInventory after finding out when currentloadOutId is sent //TODO: remove duplicate getInventory after finding out when currentloadOutId is sent
const loadoutIds = equipment as IOid[]; const loadoutIds = equipment as IOid[]; // TODO: Check for more than just an array of oids, I think i remember one instance
const inventory = await getInventory(accountId); const inventory = await getInventory(accountId);
inventory.CurrentLoadOutIds = loadoutIds; inventory.CurrentLoadOutIds = loadoutIds;
await inventory.save(); await inventory.save();
break; break;
} }
case "EquippedGear": {
inventory.EquippedGear = equipment as string[];
break;
}
default: { default: {
console.log("category not implemented", equipmentName); console.log("category not implemented", equipmentName, equipment);
} }
} }
//case "OperatorAmps": //case "OperatorAmps":
// case "Sentinels":
// case "SentinelWeapons": // case "SentinelWeapons":
// case "KubrowPets": // case "KubrowPets":
// case "SpaceSuits": // case "SpaceSuits":
// case "SpaceGuns": // case "SpaceGuns":
// case "SpaceMelee": // case "SpaceMelee":
// case "Scoops":
// case "SpecialItems": // case "SpecialItems":
// case "MoaPets": // case "MoaPets":
// case "Hoverboards": // case "Hoverboards":
// case "DataKnives":
// case "MechSuits": // case "MechSuits":
// case "CrewShipHarnesses": // case "CrewShipHarnesses":
// case "Horses":
// case "DrifterMelee": //
// case "CrewShips": // case "CrewShips":
//case "KahlLoadOuts": not sure yet how to handle kahl: it is not sent in inventory //case "KahlLoadOuts": not sure yet how to handle kahl: it is not sent in inventory
} }
await inventory.save();
}; };

View File

@ -1,6 +1,7 @@
import { IOid } from "@/src/types/commonTypes"; import { IOid } from "@/src/types/commonTypes";
import { IAbilityOverride, IColor, IPolarity } from "@/src/types/inventoryTypes/commonInventoryTypes"; import { IPolarity } from "@/src/types/inventoryTypes/commonInventoryTypes";
import { Types } from "mongoose"; import { Types } from "mongoose";
import { IItemConfig } from "./commonInventoryTypes";
export interface ISuitClient extends ISuitDatabase { export interface ISuitClient extends ISuitDatabase {
ItemId: IOid; ItemId: IOid;
@ -19,43 +20,5 @@ export interface ISuitDatabase {
FocusLens?: string; FocusLens?: string;
UnlockLevel?: number; UnlockLevel?: number;
_id: Types.ObjectId; _id: Types.ObjectId;
} ItemId?: IOid; // only in response
interface IItemConfigBase {
Skins: string[];
pricol?: IColor;
attcol?: IColor;
sigcol?: IColor;
eyecol?: IColor;
facial?: IColor;
syancol?: IColor;
cloth?: IColor;
Upgrades?: string[];
Name?: string;
ugly?: boolean;
}
export interface IItemConfig extends IItemConfigBase {
Songs?: ISong[];
AbilityOverride?: IAbilityOverride;
PvpUpgrades?: string[];
ugly?: boolean;
}
export interface ISong {
m?: string;
b?: string;
p?: string;
s: string;
}
//TODO: Consider renaming it to loadout instead of config
export interface IOperatorConfigDatabase extends IItemConfigBase {
_id: Types.ObjectId;
AbilityOverride?: IAbilityOverride; // not present in adultOperator
OperatorAmp?: IOid; // not present in adultOperator
}
export interface IOperatorConfigClient extends Omit<IOperatorConfigDatabase, "_id"> {
ItemId: IOid;
} }

View File

@ -1,3 +1,6 @@
import { IOid } from "@/src/types/commonTypes";
import { Types } from "mongoose";
export interface IPolarity { export interface IPolarity {
Slot: number; Slot: number;
Value: FocusSchool; Value: FocusSchool;
@ -41,3 +44,44 @@ export interface Isigcol {
t1: number; t1: number;
en: number; en: number;
} }
interface IItemConfigBase {
Skins: string[];
pricol?: IColor;
attcol?: IColor;
sigcol?: IColor;
eyecol?: IColor;
facial?: IColor;
syancol?: IColor;
cloth?: IColor;
Upgrades?: string[];
Name?: string;
ugly?: boolean;
}
//TODO: Proper names for the different config types, this should be something like
//IItemConfigPlayable
export interface IItemConfig extends IItemConfigBase {
Songs?: ISong[];
AbilityOverride?: IAbilityOverride;
PvpUpgrades?: string[];
ugly?: boolean;
}
export interface ISong {
m?: string;
b?: string;
p?: string;
s: string;
}
//TODO: Consider renaming it to loadout instead of config
export interface IOperatorConfigDatabase extends IItemConfigBase {
_id: Types.ObjectId;
AbilityOverride?: IAbilityOverride; // not present in adultOperator
OperatorAmp?: IOid; // not present in adultOperator
}
export interface IOperatorConfigClient extends Omit<IOperatorConfigDatabase, "_id"> {
ItemId: IOid;
}

View File

@ -1,17 +1,24 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import { Document, Types } from "mongoose"; import { Document, Types } from "mongoose";
import { IOid, IMongoDate } from "../commonTypes"; import { IOid, IMongoDate } from "../commonTypes";
import { IAbilityOverride, IColor, FocusSchool, IPolarity } from "@/src/types/inventoryTypes/commonInventoryTypes"; import {
import { IOperatorConfigClient, ISuitDatabase } from "@/src/types/inventoryTypes/SuitTypes"; IAbilityOverride,
IColor,
FocusSchool,
IPolarity,
IItemConfig,
IOperatorConfigClient
} from "@/src/types/inventoryTypes/commonInventoryTypes";
import { ISuitDatabase } from "@/src/types/inventoryTypes/SuitTypes";
import { IOperatorLoadOutSigcol, IWeaponDatabase } from "@/src/types/inventoryTypes/weaponTypes"; import { IOperatorLoadOutSigcol, IWeaponDatabase } from "@/src/types/inventoryTypes/weaponTypes";
import { IItemConfig } from "@/src/types/saveLoadoutTypes";
//Document extends will be deleted soon. TODO: delete and migrate uses to ... //Document extends will be deleted soon. TODO: delete and migrate uses to ...
export interface IInventoryDatabaseDocument extends IInventoryDatabase, Document {} export interface IInventoryDatabaseDocument extends IInventoryDatabase, Document {}
export interface IInventoryDatabase extends Omit<IInventoryResponse, "TrainingDate" | "LoadOutPresets"> { export interface IInventoryDatabase extends Omit<IInventoryResponse, "TrainingDate" | "LoadOutPresets" | "Mailbox"> {
accountOwnerId: Types.ObjectId; accountOwnerId: Types.ObjectId;
TrainingDate: Date; // TrainingDate changed from IMongoDate to Date TrainingDate: Date; // TrainingDate changed from IMongoDate to Date
LoadOutPresets: Types.ObjectId; // LoadOutPresets changed from ILoadOutPresets to Types.ObjectId for population LoadOutPresets: Types.ObjectId; // LoadOutPresets changed from ILoadOutPresets to Types.ObjectId for population
Mailbox: Types.ObjectId; // Mailbox changed from IMailbox to Types.ObjectId
} }
export interface IInventoryResponseDocument extends IInventoryResponse, Document {} export interface IInventoryResponseDocument extends IInventoryResponse, Document {}
@ -22,13 +29,25 @@ export interface IGenericItem {
Configs: IItemConfig[]; Configs: IItemConfig[];
UpgradeVer: number; UpgradeVer: number;
ItemId: IOid; ItemId: IOid;
Features?: number; //space suit has this
}
export interface IDuviriInfo {
Seed: number;
NumCompletions: number;
}
export interface IMailbox {
LastInboxId: IOid;
} }
export interface IInventoryResponse { export interface IInventoryResponse {
KahlLoadOuts: IGenericItem[];
DrifterMelee: IGenericItem[];
Horses: IGenericItem[]; Horses: IGenericItem[];
DuviriInfo: { Seed: number; NumCompletions: number }; // TODO: add to schema DrifterMelee: IGenericItem[];
DrifterGuns: IGenericItem[];
DuviriInfo: IDuviriInfo;
Mailbox: IMailbox;
KahlLoadOuts: IGenericItem[];
SubscribedToEmails: number; SubscribedToEmails: number;
Created: IMongoDate; Created: IMongoDate;
RewardSeed: number; RewardSeed: number;
@ -41,9 +60,13 @@ export interface IInventoryResponse {
SentinelBin: ISlots; SentinelBin: ISlots;
SpaceSuitBin: ISlots; SpaceSuitBin: ISlots;
SpaceWeaponBin: ISlots; SpaceWeaponBin: ISlots;
PvpBonusLoadoutBin: ICrewMemberBinClass; PvpBonusLoadoutBin: ISlots;
PveBonusLoadoutBin: ISlots; PveBonusLoadoutBin: ISlots;
RandomModBin: ISlots; RandomModBin: ISlots;
MechBin: ISlots;
CrewMemberBin: ISlots;
OperatorAmpBin: ISlots;
CrewShipSalvageBin: ISlots;
TradesRemaining: number; TradesRemaining: number;
DailyAffiliation: number; DailyAffiliation: number;
DailyAffiliationPvp: number; DailyAffiliationPvp: number;
@ -63,7 +86,7 @@ export interface IInventoryResponse {
Ships: IShip[]; Ships: IShip[];
QuestKeys: IQuestKey[]; QuestKeys: IQuestKey[];
FlavourItems: IFlavourItem[]; FlavourItems: IFlavourItem[];
Scoops: IScoop[]; Scoops: IGenericItem[];
TrainingRetriesLeft: number; TrainingRetriesLeft: number;
LoadOutPresets: ILoadOutPresets; LoadOutPresets: ILoadOutPresets;
CurrentLoadOutIds: Array<any[] | IOid>; CurrentLoadOutIds: Array<any[] | IOid>;
@ -97,14 +120,14 @@ export interface IInventoryResponse {
Affiliations: IAffiliation[]; Affiliations: IAffiliation[];
QualifyingInvasions: any[]; QualifyingInvasions: any[];
FactionScores: number[]; FactionScores: number[];
SpaceSuits: ISpace[]; SpaceSuits: IGenericItem[];
SpaceMelee: ISpace[]; SpaceMelee: IGenericItem[];
SpaceGuns: ISpaceGun[]; SpaceGuns: ISpaceGun[];
ArchwingEnabled: boolean; ArchwingEnabled: boolean;
PendingSpectreLoadouts: any[]; PendingSpectreLoadouts: any[];
SpectreLoadouts: ISpectreLoadout[]; SpectreLoadouts: ISpectreLoadout[];
SentinelWeapons: ISentinelWeapon[]; SentinelWeapons: IWeaponDatabase[];
Sentinels: ISentinel[]; Sentinels: IWeaponDatabase[];
EmailItems: IEmailItem[]; EmailItems: IEmailItem[];
CompletedSyndicates: string[]; CompletedSyndicates: string[];
FocusXP: IFocusXP; FocusXP: IFocusXP;
@ -117,7 +140,6 @@ export interface IInventoryResponse {
ActiveAvatarImageType: string; ActiveAvatarImageType: string;
KubrowPets: IKubrowPet[]; KubrowPets: IKubrowPet[];
ShipDecorations: IConsumable[]; ShipDecorations: IConsumable[];
OperatorAmpBin: ISlots;
DailyAffiliationCetus: number; DailyAffiliationCetus: number;
DailyAffiliationQuills: number; DailyAffiliationQuills: number;
DiscoveredMarkers: IDiscoveredMarker[]; DiscoveredMarkers: IDiscoveredMarker[];
@ -149,13 +171,12 @@ export interface IInventoryResponse {
MoaPets: IMoaPet[]; MoaPets: IMoaPet[];
EquippedInstrument: string; EquippedInstrument: string;
InvasionChainProgress: IInvasionChainProgress[]; InvasionChainProgress: IInvasionChainProgress[];
DataKnives: IDataKnife[]; DataKnives: IGenericItem[];
NemesisHistory: INemesisHistory[]; NemesisHistory: INemesisHistory[];
LastNemesisAllySpawnTime: IMongoDate; LastNemesisAllySpawnTime: IMongoDate;
Settings: ISettings; Settings: ISettings;
PersonalTechProjects: IPersonalTechProject[]; PersonalTechProjects: IPersonalTechProject[];
CrewShips: ICrewShip[]; CrewShips: ICrewShip[];
CrewShipSalvageBin: ISlots;
PlayerSkills: IPlayerSkills; PlayerSkills: IPlayerSkills;
CrewShipAmmo: IConsumable[]; CrewShipAmmo: IConsumable[];
CrewShipSalvagedWeaponSkins: ICrewShipSalvagedWeaponSkin[]; CrewShipSalvagedWeaponSkins: ICrewShipSalvagedWeaponSkin[];
@ -165,13 +186,11 @@ export interface IInventoryResponse {
TradeBannedUntil: IMongoDate; TradeBannedUntil: IMongoDate;
PlayedParkourTutorial: boolean; PlayedParkourTutorial: boolean;
SubscribedToEmailsPersonalized: number; SubscribedToEmailsPersonalized: number;
MechBin: ICrewMemberBinClass;
DailyAffiliationEntrati: number; DailyAffiliationEntrati: number;
DailyAffiliationNecraloid: number; DailyAffiliationNecraloid: number;
MechSuits: IMechSuit[]; MechSuits: ISuitDatabase[];
InfestedFoundry: IInfestedFoundry; InfestedFoundry: IInfestedFoundry;
BlessingCooldown: IMongoDate; BlessingCooldown: IMongoDate;
CrewMemberBin: ICrewMemberBinClass;
CrewShipHarnesses: ICrewShipHarness[]; CrewShipHarnesses: ICrewShipHarness[];
CrewShipRawSalvage: IConsumable[]; CrewShipRawSalvage: IConsumable[];
CrewMembers: ICrewMember[]; CrewMembers: ICrewMember[];
@ -275,10 +294,6 @@ export interface IConsumable {
ItemType: string; ItemType: string;
} }
export interface ICrewMemberBinClass {
Slots: number;
}
export interface ICrewMember { export interface ICrewMember {
ItemType: string; ItemType: string;
NemesisFingerprint: number; NemesisFingerprint: number;
@ -418,22 +433,6 @@ export interface IPortGuns {
PRIMARY_A: IL; PRIMARY_A: IL;
} }
export interface IDataKnife {
ItemType: string;
XP: number;
Configs: IDataKnifeConfig[];
UpgradeVer: number;
ItemId: IOid;
}
export interface IDataKnifeConfig {
Upgrades?: string[];
pricol?: IColor;
Skins: string[];
attcol?: IColor;
sigcol?: IColor;
}
export interface IDiscoveredMarker { export interface IDiscoveredMarker {
tag: string; tag: string;
discoveryState: number[]; discoveryState: number[];
@ -733,17 +732,6 @@ export interface ILotusCustomization {
Persona: string; Persona: string;
} }
export interface IMechSuit {
ItemType: string;
Configs: IDataKnifeConfig[];
Features: number;
UpgradeVer: number;
XP: number;
Polarity: IPolarity[];
Polarized: number;
ItemId: IOid;
}
export interface IMission { export interface IMission {
Completes: number; Completes: number;
Tier?: number; Tier?: number;
@ -932,6 +920,7 @@ export interface IQuestKey {
Progress?: IProgress[]; Progress?: IProgress[];
unlock?: boolean; unlock?: boolean;
Completed?: boolean; Completed?: boolean;
CustomData?: string;
ItemType: string; ItemType: string;
CompletionDate?: IMongoDate; CompletionDate?: IMongoDate;
} }
@ -949,17 +938,6 @@ export interface IRawUpgrade {
LastAdded?: IOid; LastAdded?: IOid;
} }
export interface IScoop {
ItemType: string;
Configs: IScoopConfig[];
UpgradeVer: number;
ItemId: IOid;
}
export interface IScoopConfig {
pricol?: IColor;
}
export interface ISeasonChallengeHistory { export interface ISeasonChallengeHistory {
challenge: string; challenge: string;
id: string; id: string;
@ -969,40 +947,6 @@ export interface ISentientSpawnChanceBoosters {
numOceanMissionsCompleted: number; numOceanMissionsCompleted: number;
} }
export interface ISentinelWeapon {
ItemType: string;
Configs: ISentinelWeaponConfig[];
UpgradeVer?: number;
XP?: number;
ItemId: IOid;
Features?: number;
Polarity?: IPolarity[];
Polarized?: number;
}
export interface ISentinelWeaponConfig {
Skins?: FluffySkin[];
Upgrades?: string[];
}
export enum FluffySkin {
Empty = "",
LotusUpgradesSkinsHolsterCustomizationsGlaiveInPlace = "/Lotus/Upgrades/Skins/HolsterCustomizations/GlaiveInPlace",
LotusUpgradesSkinsHolsterCustomizationsPistolHipsR = "/Lotus/Upgrades/Skins/HolsterCustomizations/PistolHipsR",
LotusUpgradesSkinsHolsterCustomizationsRifleUpperBack = "/Lotus/Upgrades/Skins/HolsterCustomizations/RifleUpperBack"
}
export interface ISentinel {
ItemType: string;
Configs: IKubrowPetConfig[];
UpgradeVer: number;
XP: number;
Features?: number;
Polarity?: IPolarity[];
Polarized?: number;
ItemId: IOid;
}
export interface ISettings { export interface ISettings {
FriendInvRestriction: string; FriendInvRestriction: string;
GiftMode: string; GiftMode: string;
@ -1038,15 +982,6 @@ export interface ISpaceGunConfig {
Upgrades?: string[]; Upgrades?: string[];
} }
export interface ISpace {
ItemType: string;
Configs: IKubrowPetConfig[];
XP: number;
UpgradeVer: number;
ItemId: IOid;
Features?: number;
}
export interface ISpecialItem { export interface ISpecialItem {
ItemType: string; ItemType: string;
Configs: ISpecialItemConfig[]; Configs: ISpecialItemConfig[];

View File

@ -1,5 +1,5 @@
import { IOid } from "@/src/types/commonTypes"; import { IOid } from "@/src/types/commonTypes";
import { IItemConfig } from "@/src/types/inventoryTypes/SuitTypes"; import { IItemConfig } from "./commonInventoryTypes";
import { IPolarity } from "@/src/types/inventoryTypes/commonInventoryTypes"; import { IPolarity } from "@/src/types/inventoryTypes/commonInventoryTypes";
import { Types } from "mongoose"; import { Types } from "mongoose";

View File

@ -40,5 +40,6 @@ export type IBinChanges = {
export enum SlotType { export enum SlotType {
SUIT = "SuitBin", SUIT = "SuitBin",
WEAPON = "WeaponBin" WEAPON = "WeaponBin",
MECHSUIT = "MechBin"
} }

View File

@ -1,5 +1,5 @@
import { IOid } from "@/src/types/commonTypes"; import { IOid } from "@/src/types/commonTypes";
import { IItemConfig, IOperatorConfigClient } from "@/src/types/inventoryTypes/SuitTypes"; import { IItemConfig, IOperatorConfigClient } from "@/src/types/inventoryTypes/commonInventoryTypes";
import { Types } from "mongoose"; import { Types } from "mongoose";
export interface ISaveLoadoutRequest { export interface ISaveLoadoutRequest {
@ -31,6 +31,7 @@ export interface ISaveLoadoutRequest {
CrewShips: IItemEntry; CrewShips: IItemEntry;
CurrentLoadOutIds: IOid[]; CurrentLoadOutIds: IOid[];
ValidNewLoadoutId: string; ValidNewLoadoutId: string;
EquippedGear: string[];
} }
export interface ISaveLoadoutRequestNoUpgradeVer extends Omit<ISaveLoadoutRequest, "UpgradeVer"> {} export interface ISaveLoadoutRequestNoUpgradeVer extends Omit<ISaveLoadoutRequest, "UpgradeVer"> {}
@ -89,4 +90,3 @@ export interface IEquipmentSelection {
mod: number; mod: number;
cus: number; cus: number;
} }
export { IItemConfig };

View File

@ -5,7 +5,7 @@
"RewardSeed": -5604904486637265640, "RewardSeed": -5604904486637265640,
"CrewMemberBin": { "Slots": 3 }, "CrewMemberBin": { "Slots": 3 },
"CrewShipSalvageBin": { "Slots": 8 }, "CrewShipSalvageBin": { "Slots": 8 },
"DrifterMelee": [{ "ItemType": "/Lotus/Types/Friendly/PlayerControllable/Weapons/DuviriDualSwords", "ItemId": { "$oid": "647bd268c547fe5b2909e715" } }], "DrifterMelee": [{ "ItemType": "/Lotus/Types/Friendly/PlayerControllable/Weapons/DuviriDualSwords", "ItemId": { "$oid": "647bd27cf856530b4f3bf343" } }],
"FusionPoints": 0, "FusionPoints": 0,
"MechBin": { "Slots": 4 }, "MechBin": { "Slots": 4 },
"OperatorAmpBin": { "Slots": 8 }, "OperatorAmpBin": { "Slots": 8 },
@ -84,7 +84,24 @@
"CrewShipWeaponSkins": [], "CrewShipWeaponSkins": [],
"DrifterGuns": [], "DrifterGuns": [],
"Drones": [], "Drones": [],
"Horses": [], "Horses": [
{
"ItemType": "/Lotus/Types/NeutralCreatures/ErsatzHorse/ErsatzHorsePowerSuit",
"Configs": [
{
"Skins": ["", "", "/Lotus/Upgrades/Skins/Horse/ErsatzHorseTailDefault"]
},
{
"Skins": ["", "", "/Lotus/Upgrades/Skins/Horse/ErsatzHorseTailDefault"]
},
{
"Skins": ["", "", "/Lotus/Upgrades/Skins/Horse/ErsatzHorseTailDefault"]
}
],
"UpgradeVer": 101,
"ItemId": { "$oid": "647bd27cf856530b4f3bf343" }
}
],
"Hoverboards": [], "Hoverboards": [],
"KubrowPets": [], "KubrowPets": [],
"KubrowPetEggs": [], "KubrowPetEggs": [],

View File

@ -7,5 +7,35 @@
}, },
{ {
"ItemType": "/Lotus/Types/Keys/DuviriQuest/DuviriQuestKeyChain" "ItemType": "/Lotus/Types/Keys/DuviriQuest/DuviriQuestKeyChain"
},
{
"ItemType": "/Lotus/Types/Keys/WarWithinQuest/WarWithinQuestKeyChain"
},
{
"ItemType": "/Lotus/Types/Keys/SacrificeQuest/SacrificeQuestKeyChain"
},
{
"ItemType": "/Lotus/Types/Keys/NewWarIntroQuest/NewWarIntroKeyChain"
},
{
"ItemType": "/Lotus/Types/Keys/NewWarQuest/NewWarQuestKeyChain"
},
{
"ItemType": "/Lotus/Types/Keys/ApostasyQuest/ApostasyKeyChain"
},
{
"ItemType": "/Lotus/Types/Keys/WarWithinQuest/WarWithinQuestKeyChain"
},
{
"ItemType": "/Lotus/Types/Keys/OrokinMoonQuest/OrokinMoonQuestKeyChain"
},
{
"ItemType": "/Lotus/Types/Keys/ZarimanQuest/ZarimanQuestKeyChain"
},
{
"ItemType": "/Lotus/Types/Keys/DuviriQuest/DuviriQuestKeyChain"
},
{
"ItemType": "/Lotus/Types/Keys/ArchwingQuest/ArchwingQuestKeyChain"
} }
] ]