feat: personal research
This should be good enough for the railjack quest at least
This commit is contained in:
parent
2eb28c4e89
commit
960ed238b1
@ -26,17 +26,18 @@ import { IInventoryChanges } from "@/src/types/purchaseTypes";
|
|||||||
import { config } from "@/src/services/configService";
|
import { config } from "@/src/services/configService";
|
||||||
import { GuildPermission, ITechProjectClient } from "@/src/types/guildTypes";
|
import { GuildPermission, ITechProjectClient } from "@/src/types/guildTypes";
|
||||||
import { GuildMember } from "@/src/models/guildModel";
|
import { GuildMember } from "@/src/models/guildModel";
|
||||||
import { toMongoDate } from "@/src/helpers/inventoryHelpers";
|
import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
|
||||||
import { logger } from "@/src/utils/logger";
|
import { logger } from "@/src/utils/logger";
|
||||||
|
|
||||||
export const guildTechController: RequestHandler = async (req, res) => {
|
export const guildTechController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
const inventory = await getInventory(accountId);
|
const inventory = await getInventory(accountId);
|
||||||
const guild = await getGuildForRequestEx(req, inventory);
|
|
||||||
const data = JSON.parse(String(req.body)) as TGuildTechRequest;
|
const data = JSON.parse(String(req.body)) as TGuildTechRequest;
|
||||||
|
console.log(data);
|
||||||
if (data.Action == "Sync") {
|
if (data.Action == "Sync") {
|
||||||
let needSave = false;
|
let needSave = false;
|
||||||
const techProjects: ITechProjectClient[] = [];
|
const techProjects: ITechProjectClient[] = [];
|
||||||
|
const guild = await getGuildForRequestEx(req, inventory);
|
||||||
if (guild.TechProjects) {
|
if (guild.TechProjects) {
|
||||||
for (const project of guild.TechProjects) {
|
for (const project of guild.TechProjects) {
|
||||||
const techProject: ITechProjectClient = {
|
const techProject: ITechProjectClient = {
|
||||||
@ -59,110 +60,170 @@ export const guildTechController: RequestHandler = async (req, res) => {
|
|||||||
}
|
}
|
||||||
res.json({ TechProjects: techProjects });
|
res.json({ TechProjects: techProjects });
|
||||||
} else if (data.Action == "Start") {
|
} else if (data.Action == "Start") {
|
||||||
if (!hasAccessToDojo(inventory) || !(await hasGuildPermission(guild, accountId, GuildPermission.Tech))) {
|
if (data.Mode == "Guild") {
|
||||||
res.status(400).send("-1").end();
|
const guild = await getGuildForRequestEx(req, inventory);
|
||||||
return;
|
if (!hasAccessToDojo(inventory) || !(await hasGuildPermission(guild, accountId, GuildPermission.Tech))) {
|
||||||
}
|
res.status(400).send("-1").end();
|
||||||
const recipe = ExportDojoRecipes.research[data.RecipeType];
|
return;
|
||||||
guild.TechProjects ??= [];
|
}
|
||||||
if (!guild.TechProjects.find(x => x.ItemType == data.RecipeType)) {
|
const recipe = ExportDojoRecipes.research[data.RecipeType];
|
||||||
const techProject =
|
guild.TechProjects ??= [];
|
||||||
guild.TechProjects[
|
if (!guild.TechProjects.find(x => x.ItemType == data.RecipeType)) {
|
||||||
guild.TechProjects.push({
|
const techProject =
|
||||||
ItemType: data.RecipeType,
|
guild.TechProjects[
|
||||||
ReqCredits: config.noDojoResearchCosts ? 0 : scaleRequiredCount(guild.Tier, recipe.price),
|
guild.TechProjects.push({
|
||||||
ReqItems: recipe.ingredients.map(x => ({
|
ItemType: data.RecipeType,
|
||||||
ItemType: x.ItemType,
|
ReqCredits: config.noDojoResearchCosts ? 0 : scaleRequiredCount(guild.Tier, recipe.price),
|
||||||
ItemCount: config.noDojoResearchCosts ? 0 : scaleRequiredCount(guild.Tier, x.ItemCount)
|
ReqItems: recipe.ingredients.map(x => ({
|
||||||
})),
|
ItemType: x.ItemType,
|
||||||
State: 0
|
ItemCount: config.noDojoResearchCosts ? 0 : scaleRequiredCount(guild.Tier, x.ItemCount)
|
||||||
}) - 1
|
})),
|
||||||
];
|
State: 0
|
||||||
setGuildTechLogState(guild, techProject.ItemType, 5);
|
}) - 1
|
||||||
if (config.noDojoResearchCosts) {
|
];
|
||||||
processFundedGuildTechProject(guild, techProject, recipe);
|
setGuildTechLogState(guild, techProject.ItemType, 5);
|
||||||
} else {
|
if (config.noDojoResearchCosts) {
|
||||||
if (data.RecipeType.substring(0, 39) == "/Lotus/Types/Items/Research/DojoColors/") {
|
processFundedGuildTechProject(guild, techProject, recipe);
|
||||||
guild.ActiveDojoColorResearch = data.RecipeType;
|
} else {
|
||||||
|
if (data.RecipeType.substring(0, 39) == "/Lotus/Types/Items/Research/DojoColors/") {
|
||||||
|
guild.ActiveDojoColorResearch = data.RecipeType;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
await guild.save();
|
||||||
|
res.end();
|
||||||
|
} else {
|
||||||
|
const recipe = ExportDojoRecipes.research[data.RecipeType];
|
||||||
|
const techProject =
|
||||||
|
inventory.PersonalTechProjects[
|
||||||
|
inventory.PersonalTechProjects.push({
|
||||||
|
State: 0,
|
||||||
|
ReqCredits: recipe.price,
|
||||||
|
ItemType: data.RecipeType,
|
||||||
|
ReqItems: recipe.ingredients
|
||||||
|
}) - 1
|
||||||
|
];
|
||||||
|
await inventory.save();
|
||||||
|
res.json({
|
||||||
|
isPersonal: true,
|
||||||
|
action: "Start",
|
||||||
|
personalTech: techProject.toJSON()
|
||||||
|
});
|
||||||
}
|
}
|
||||||
await guild.save();
|
|
||||||
res.end();
|
|
||||||
} else if (data.Action == "Contribute") {
|
} else if (data.Action == "Contribute") {
|
||||||
if (!hasAccessToDojo(inventory)) {
|
if ((req.query.guildId as string) == "000000000000000000000000") {
|
||||||
res.status(400).send("-1").end();
|
const techProject = inventory.PersonalTechProjects.id(data.ResearchId)!;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const guildMember = (await GuildMember.findOne(
|
techProject.ReqCredits -= data.RegularCredits;
|
||||||
{ accountId, guildId: guild._id },
|
const inventoryChanges: IInventoryChanges = updateCurrency(inventory, data.RegularCredits, false);
|
||||||
"RegularCreditsContributed MiscItemsContributed"
|
|
||||||
))!;
|
|
||||||
|
|
||||||
const contributions = data;
|
const miscItemChanges = [];
|
||||||
const techProject = guild.TechProjects!.find(x => x.ItemType == contributions.RecipeType)!;
|
for (const miscItem of data.MiscItems) {
|
||||||
|
|
||||||
if (contributions.VaultCredits) {
|
|
||||||
if (contributions.VaultCredits > techProject.ReqCredits) {
|
|
||||||
contributions.VaultCredits = techProject.ReqCredits;
|
|
||||||
}
|
|
||||||
techProject.ReqCredits -= contributions.VaultCredits;
|
|
||||||
guild.VaultRegularCredits! -= contributions.VaultCredits;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (contributions.RegularCredits > techProject.ReqCredits) {
|
|
||||||
contributions.RegularCredits = techProject.ReqCredits;
|
|
||||||
}
|
|
||||||
techProject.ReqCredits -= contributions.RegularCredits;
|
|
||||||
|
|
||||||
guildMember.RegularCreditsContributed ??= 0;
|
|
||||||
guildMember.RegularCreditsContributed += contributions.RegularCredits;
|
|
||||||
|
|
||||||
if (contributions.VaultMiscItems.length) {
|
|
||||||
for (const miscItem of contributions.VaultMiscItems) {
|
|
||||||
const reqItem = techProject.ReqItems.find(x => x.ItemType == miscItem.ItemType);
|
const reqItem = techProject.ReqItems.find(x => x.ItemType == miscItem.ItemType);
|
||||||
if (reqItem) {
|
if (reqItem) {
|
||||||
if (miscItem.ItemCount > reqItem.ItemCount) {
|
if (miscItem.ItemCount > reqItem.ItemCount) {
|
||||||
miscItem.ItemCount = reqItem.ItemCount;
|
miscItem.ItemCount = reqItem.ItemCount;
|
||||||
}
|
}
|
||||||
reqItem.ItemCount -= miscItem.ItemCount;
|
reqItem.ItemCount -= miscItem.ItemCount;
|
||||||
|
miscItemChanges.push({
|
||||||
const vaultMiscItem = guild.VaultMiscItems!.find(x => x.ItemType == miscItem.ItemType)!;
|
ItemType: miscItem.ItemType,
|
||||||
vaultMiscItem.ItemCount -= miscItem.ItemCount;
|
ItemCount: miscItem.ItemCount * -1
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
addMiscItems(inventory, miscItemChanges);
|
||||||
|
inventoryChanges.MiscItems = miscItemChanges;
|
||||||
|
|
||||||
const miscItemChanges = [];
|
techProject.HasContributions = true;
|
||||||
for (const miscItem of contributions.MiscItems) {
|
|
||||||
const reqItem = techProject.ReqItems.find(x => x.ItemType == miscItem.ItemType);
|
|
||||||
if (reqItem) {
|
|
||||||
if (miscItem.ItemCount > reqItem.ItemCount) {
|
|
||||||
miscItem.ItemCount = reqItem.ItemCount;
|
|
||||||
}
|
|
||||||
reqItem.ItemCount -= miscItem.ItemCount;
|
|
||||||
miscItemChanges.push({
|
|
||||||
ItemType: miscItem.ItemType,
|
|
||||||
ItemCount: miscItem.ItemCount * -1
|
|
||||||
});
|
|
||||||
|
|
||||||
addGuildMemberMiscItemContribution(guildMember, miscItem);
|
if (techProject.ReqCredits == 0 && !techProject.ReqItems.find(x => x.ItemCount > 0)) {
|
||||||
|
techProject.State = 1;
|
||||||
|
const recipe = ExportDojoRecipes.research[techProject.ItemType];
|
||||||
|
techProject.CompletionDate = new Date(Date.now() + recipe.time * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await inventory.save();
|
||||||
|
res.json({
|
||||||
|
InventoryChanges: inventoryChanges,
|
||||||
|
PersonalResearch: { $oid: data.ResearchId },
|
||||||
|
PersonalResearchDate: techProject.CompletionDate ? toMongoDate(techProject.CompletionDate) : undefined
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
if (!hasAccessToDojo(inventory)) {
|
||||||
|
res.status(400).send("-1").end();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const guild = await getGuildForRequestEx(req, inventory);
|
||||||
|
const guildMember = (await GuildMember.findOne(
|
||||||
|
{ accountId, guildId: guild._id },
|
||||||
|
"RegularCreditsContributed MiscItemsContributed"
|
||||||
|
))!;
|
||||||
|
|
||||||
|
const techProject = guild.TechProjects!.find(x => x.ItemType == data.RecipeType)!;
|
||||||
|
|
||||||
|
if (data.VaultCredits) {
|
||||||
|
if (data.VaultCredits > techProject.ReqCredits) {
|
||||||
|
data.VaultCredits = techProject.ReqCredits;
|
||||||
|
}
|
||||||
|
techProject.ReqCredits -= data.VaultCredits;
|
||||||
|
guild.VaultRegularCredits! -= data.VaultCredits;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.RegularCredits > techProject.ReqCredits) {
|
||||||
|
data.RegularCredits = techProject.ReqCredits;
|
||||||
|
}
|
||||||
|
techProject.ReqCredits -= data.RegularCredits;
|
||||||
|
|
||||||
|
guildMember.RegularCreditsContributed ??= 0;
|
||||||
|
guildMember.RegularCreditsContributed += data.RegularCredits;
|
||||||
|
|
||||||
|
if (data.VaultMiscItems.length) {
|
||||||
|
for (const miscItem of data.VaultMiscItems) {
|
||||||
|
const reqItem = techProject.ReqItems.find(x => x.ItemType == miscItem.ItemType);
|
||||||
|
if (reqItem) {
|
||||||
|
if (miscItem.ItemCount > reqItem.ItemCount) {
|
||||||
|
miscItem.ItemCount = reqItem.ItemCount;
|
||||||
|
}
|
||||||
|
reqItem.ItemCount -= miscItem.ItemCount;
|
||||||
|
|
||||||
|
const vaultMiscItem = guild.VaultMiscItems!.find(x => x.ItemType == miscItem.ItemType)!;
|
||||||
|
vaultMiscItem.ItemCount -= miscItem.ItemCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const miscItemChanges = [];
|
||||||
|
for (const miscItem of data.MiscItems) {
|
||||||
|
const reqItem = techProject.ReqItems.find(x => x.ItemType == miscItem.ItemType);
|
||||||
|
if (reqItem) {
|
||||||
|
if (miscItem.ItemCount > reqItem.ItemCount) {
|
||||||
|
miscItem.ItemCount = reqItem.ItemCount;
|
||||||
|
}
|
||||||
|
reqItem.ItemCount -= miscItem.ItemCount;
|
||||||
|
miscItemChanges.push({
|
||||||
|
ItemType: miscItem.ItemType,
|
||||||
|
ItemCount: miscItem.ItemCount * -1
|
||||||
|
});
|
||||||
|
|
||||||
|
addGuildMemberMiscItemContribution(guildMember, miscItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
addMiscItems(inventory, miscItemChanges);
|
||||||
|
const inventoryChanges: IInventoryChanges = updateCurrency(inventory, data.RegularCredits, false);
|
||||||
|
inventoryChanges.MiscItems = miscItemChanges;
|
||||||
|
|
||||||
|
// Check if research is fully funded now.
|
||||||
|
await processGuildTechProjectContributionsUpdate(guild, techProject);
|
||||||
|
|
||||||
|
await Promise.all([guild.save(), inventory.save(), guildMember.save()]);
|
||||||
|
res.json({
|
||||||
|
InventoryChanges: inventoryChanges,
|
||||||
|
Vault: getGuildVault(guild)
|
||||||
|
});
|
||||||
}
|
}
|
||||||
addMiscItems(inventory, miscItemChanges);
|
|
||||||
const inventoryChanges: IInventoryChanges = updateCurrency(inventory, contributions.RegularCredits, false);
|
|
||||||
inventoryChanges.MiscItems = miscItemChanges;
|
|
||||||
|
|
||||||
// Check if research is fully funded now.
|
|
||||||
await processGuildTechProjectContributionsUpdate(guild, techProject);
|
|
||||||
|
|
||||||
await Promise.all([guild.save(), inventory.save(), guildMember.save()]);
|
|
||||||
res.json({
|
|
||||||
InventoryChanges: inventoryChanges,
|
|
||||||
Vault: getGuildVault(guild)
|
|
||||||
});
|
|
||||||
} else if (data.Action.split(",")[0] == "Buy") {
|
} else if (data.Action.split(",")[0] == "Buy") {
|
||||||
|
const guild = await getGuildForRequestEx(req, inventory);
|
||||||
if (!hasAccessToDojo(inventory) || !(await hasGuildPermission(guild, accountId, GuildPermission.Fabricator))) {
|
if (!hasAccessToDojo(inventory) || !(await hasGuildPermission(guild, accountId, GuildPermission.Fabricator))) {
|
||||||
res.status(400).send("-1").end();
|
res.status(400).send("-1").end();
|
||||||
return;
|
return;
|
||||||
@ -190,6 +251,7 @@ export const guildTechController: RequestHandler = async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else if (data.Action == "Fabricate") {
|
} else if (data.Action == "Fabricate") {
|
||||||
|
const guild = await getGuildForRequestEx(req, inventory);
|
||||||
if (!hasAccessToDojo(inventory) || !(await hasGuildPermission(guild, accountId, GuildPermission.Fabricator))) {
|
if (!hasAccessToDojo(inventory) || !(await hasGuildPermission(guild, accountId, GuildPermission.Fabricator))) {
|
||||||
res.status(400).send("-1").end();
|
res.status(400).send("-1").end();
|
||||||
return;
|
return;
|
||||||
@ -206,6 +268,7 @@ export const guildTechController: RequestHandler = async (req, res) => {
|
|||||||
// Not a mistake: This response uses `inventoryChanges` instead of `InventoryChanges`.
|
// Not a mistake: This response uses `inventoryChanges` instead of `InventoryChanges`.
|
||||||
res.json({ inventoryChanges: inventoryChanges });
|
res.json({ inventoryChanges: inventoryChanges });
|
||||||
} else if (data.Action == "Pause") {
|
} else if (data.Action == "Pause") {
|
||||||
|
const guild = await getGuildForRequestEx(req, inventory);
|
||||||
if (!hasAccessToDojo(inventory) || !(await hasGuildPermission(guild, accountId, GuildPermission.Tech))) {
|
if (!hasAccessToDojo(inventory) || !(await hasGuildPermission(guild, accountId, GuildPermission.Tech))) {
|
||||||
res.status(400).send("-1").end();
|
res.status(400).send("-1").end();
|
||||||
return;
|
return;
|
||||||
@ -217,6 +280,7 @@ export const guildTechController: RequestHandler = async (req, res) => {
|
|||||||
await removePigmentsFromGuildMembers(guild._id);
|
await removePigmentsFromGuildMembers(guild._id);
|
||||||
res.end();
|
res.end();
|
||||||
} else if (data.Action == "Unpause") {
|
} else if (data.Action == "Unpause") {
|
||||||
|
const guild = await getGuildForRequestEx(req, inventory);
|
||||||
if (!hasAccessToDojo(inventory) || !(await hasGuildPermission(guild, accountId, GuildPermission.Tech))) {
|
if (!hasAccessToDojo(inventory) || !(await hasGuildPermission(guild, accountId, GuildPermission.Tech))) {
|
||||||
res.status(400).send("-1").end();
|
res.status(400).send("-1").end();
|
||||||
return;
|
return;
|
||||||
@ -239,7 +303,7 @@ type TGuildTechRequest =
|
|||||||
|
|
||||||
interface IGuildTechBasicRequest {
|
interface IGuildTechBasicRequest {
|
||||||
Action: "Start" | "Fabricate" | "Pause" | "Unpause";
|
Action: "Start" | "Fabricate" | "Pause" | "Unpause";
|
||||||
Mode: "Guild";
|
Mode: "Guild" | "Personal";
|
||||||
RecipeType: string;
|
RecipeType: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -251,7 +315,7 @@ interface IGuildTechBuyRequest {
|
|||||||
|
|
||||||
interface IGuildTechContributeRequest {
|
interface IGuildTechContributeRequest {
|
||||||
Action: "Contribute";
|
Action: "Contribute";
|
||||||
ResearchId: "";
|
ResearchId: string;
|
||||||
RecipeType: string;
|
RecipeType: string;
|
||||||
RegularCredits: number;
|
RegularCredits: number;
|
||||||
MiscItems: IMiscItem[];
|
MiscItems: IMiscItem[];
|
||||||
|
@ -84,7 +84,9 @@ import {
|
|||||||
IInfNode,
|
IInfNode,
|
||||||
IDiscoveredMarker,
|
IDiscoveredMarker,
|
||||||
IWeeklyMission,
|
IWeeklyMission,
|
||||||
ILockedWeaponGroupDatabase
|
ILockedWeaponGroupDatabase,
|
||||||
|
IPersonalTechProjectDatabase,
|
||||||
|
IPersonalTechProjectClient
|
||||||
} from "../../types/inventoryTypes/inventoryTypes";
|
} from "../../types/inventoryTypes/inventoryTypes";
|
||||||
import { IOid } from "../../types/commonTypes";
|
import { IOid } from "../../types/commonTypes";
|
||||||
import {
|
import {
|
||||||
@ -498,7 +500,34 @@ const seasonChallengeHistorySchema = new Schema<ISeasonChallenge>(
|
|||||||
{ _id: false }
|
{ _id: false }
|
||||||
);
|
);
|
||||||
|
|
||||||
//TODO: check whether this is complete
|
const personalTechProjectSchema = new Schema<IPersonalTechProjectDatabase>({
|
||||||
|
State: Number,
|
||||||
|
ReqCredits: Number,
|
||||||
|
ItemType: String,
|
||||||
|
ReqItems: { type: [typeCountSchema], default: undefined },
|
||||||
|
HasContributions: Boolean,
|
||||||
|
CompletionDate: Date
|
||||||
|
});
|
||||||
|
|
||||||
|
personalTechProjectSchema.virtual("ItemId").get(function () {
|
||||||
|
return { $oid: this._id.toString() };
|
||||||
|
});
|
||||||
|
|
||||||
|
personalTechProjectSchema.set("toJSON", {
|
||||||
|
virtuals: true,
|
||||||
|
transform(_doc, ret, _options) {
|
||||||
|
delete ret._id;
|
||||||
|
delete ret.__v;
|
||||||
|
|
||||||
|
const db = ret as IPersonalTechProjectDatabase;
|
||||||
|
const client = ret as IPersonalTechProjectClient;
|
||||||
|
|
||||||
|
if (db.CompletionDate) {
|
||||||
|
client.CompletionDate = toMongoDate(db.CompletionDate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const playerSkillsSchema = new Schema<IPlayerSkills>(
|
const playerSkillsSchema = new Schema<IPlayerSkills>(
|
||||||
{
|
{
|
||||||
LPP_SPACE: { type: Number, default: 0 },
|
LPP_SPACE: { type: Number, default: 0 },
|
||||||
@ -1442,7 +1471,7 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
|
|||||||
|
|
||||||
//Railjack craft
|
//Railjack craft
|
||||||
//https://warframe.fandom.com/wiki/Rising_Tide
|
//https://warframe.fandom.com/wiki/Rising_Tide
|
||||||
PersonalTechProjects: [Schema.Types.Mixed],
|
PersonalTechProjects: { type: [personalTechProjectSchema], default: [] },
|
||||||
|
|
||||||
//Modulars lvl and exp(Railjack|Duviri)
|
//Modulars lvl and exp(Railjack|Duviri)
|
||||||
//https://warframe.fandom.com/wiki/Intrinsics
|
//https://warframe.fandom.com/wiki/Intrinsics
|
||||||
@ -1585,6 +1614,7 @@ export type InventoryDocumentProps = {
|
|||||||
Drones: Types.DocumentArray<IDroneDatabase>;
|
Drones: Types.DocumentArray<IDroneDatabase>;
|
||||||
CrewShipWeaponSkins: Types.DocumentArray<IUpgradeDatabase>;
|
CrewShipWeaponSkins: Types.DocumentArray<IUpgradeDatabase>;
|
||||||
CrewShipSalvagedWeaponsSkins: Types.DocumentArray<IUpgradeDatabase>;
|
CrewShipSalvagedWeaponsSkins: Types.DocumentArray<IUpgradeDatabase>;
|
||||||
|
PersonalTechProjects: Types.DocumentArray<IPersonalTechProjectDatabase>;
|
||||||
} & { [K in TEquipmentKey]: Types.DocumentArray<IEquipmentDatabase> };
|
} & { [K in TEquipmentKey]: Types.DocumentArray<IEquipmentDatabase> };
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
||||||
|
@ -46,6 +46,7 @@ export interface IInventoryDatabase
|
|||||||
| "EntratiVaultCountResetDate"
|
| "EntratiVaultCountResetDate"
|
||||||
| "BrandedSuits"
|
| "BrandedSuits"
|
||||||
| "LockedWeaponGroup"
|
| "LockedWeaponGroup"
|
||||||
|
| "PersonalTechProjects"
|
||||||
| TEquipmentKey
|
| TEquipmentKey
|
||||||
>,
|
>,
|
||||||
InventoryDatabaseEquipment {
|
InventoryDatabaseEquipment {
|
||||||
@ -77,6 +78,7 @@ export interface IInventoryDatabase
|
|||||||
EntratiVaultCountResetDate?: Date;
|
EntratiVaultCountResetDate?: Date;
|
||||||
BrandedSuits?: Types.ObjectId[];
|
BrandedSuits?: Types.ObjectId[];
|
||||||
LockedWeaponGroup?: ILockedWeaponGroupDatabase;
|
LockedWeaponGroup?: ILockedWeaponGroupDatabase;
|
||||||
|
PersonalTechProjects: IPersonalTechProjectDatabase[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IQuestKeyDatabase {
|
export interface IQuestKeyDatabase {
|
||||||
@ -301,7 +303,7 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu
|
|||||||
NemesisHistory: INemesisBaseClient[];
|
NemesisHistory: INemesisBaseClient[];
|
||||||
LastNemesisAllySpawnTime?: IMongoDate;
|
LastNemesisAllySpawnTime?: IMongoDate;
|
||||||
Settings?: ISettings;
|
Settings?: ISettings;
|
||||||
PersonalTechProjects: IPersonalTechProject[];
|
PersonalTechProjects: IPersonalTechProjectClient[];
|
||||||
PlayerSkills: IPlayerSkills;
|
PlayerSkills: IPlayerSkills;
|
||||||
CrewShipAmmo: ITypeCount[];
|
CrewShipAmmo: ITypeCount[];
|
||||||
CrewShipWeaponSkins: IUpgradeClient[];
|
CrewShipWeaponSkins: IUpgradeClient[];
|
||||||
@ -936,16 +938,20 @@ export interface IPersonalGoalProgress {
|
|||||||
ReceivedClanReward1?: boolean;
|
ReceivedClanReward1?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IPersonalTechProject {
|
export interface IPersonalTechProjectDatabase {
|
||||||
State: number;
|
State: number;
|
||||||
ReqCredits: number;
|
ReqCredits: number;
|
||||||
ItemType: string;
|
ItemType: string;
|
||||||
ReqItems: ITypeCount[];
|
ReqItems: ITypeCount[];
|
||||||
|
HasContributions?: boolean;
|
||||||
|
CompletionDate?: Date;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IPersonalTechProjectClient extends Omit<IPersonalTechProjectDatabase, "CompletionDate"> {
|
||||||
CompletionDate?: IMongoDate;
|
CompletionDate?: IMongoDate;
|
||||||
ItemId: IOid;
|
|
||||||
ProductCategory?: string;
|
ProductCategory?: string;
|
||||||
CategoryItemId?: IOid;
|
CategoryItemId?: IOid;
|
||||||
HasContributions?: boolean;
|
ItemId: IOid;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IPlayerSkills {
|
export interface IPlayerSkills {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user