chore: improve ship customization stuff (#2402)

The only functionally relevant change is that orbiter scenes are now saved via SkinFlavourItem (as of U39?).
The rest is cleanup of the types because the ship customization stuff was duplicated all over the place.

Reviewed-on: OpenWF/SpaceNinjaServer#2402
Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com>
Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
This commit is contained in:
Sainan 2025-07-04 15:19:15 -07:00 committed by Sainan
parent 0416221d15
commit 5089f67146
17 changed files with 262 additions and 281 deletions

View File

@ -6,9 +6,8 @@ import { getAccountIdForRequest } from "@/src/services/loginService";
import { createGarden, getPersonalRooms } from "@/src/services/personalRoomsService";
import { IMongoDate } from "@/src/types/commonTypes";
import { IMissionReward } from "@/src/types/missionTypes";
import { IPersonalRoomsClient } from "@/src/types/personalRoomsTypes";
import { IGardeningClient, IPersonalRoomsClient } from "@/src/types/personalRoomsTypes";
import { IInventoryChanges } from "@/src/types/purchaseTypes";
import { IGardeningClient } from "@/src/types/shipTypes";
import { RequestHandler } from "express";
import { dict_en, ExportResources } from "warframe-public-export-plus";

View File

@ -3,10 +3,9 @@ import { config } from "@/src/services/configService";
import allShipFeatures from "@/static/fixed_responses/allShipFeatures.json";
import { getAccountIdForRequest } from "@/src/services/loginService";
import { createGarden, getPersonalRooms } from "@/src/services/personalRoomsService";
import { toOid } from "@/src/helpers/inventoryHelpers";
import { IGetShipResponse } from "@/src/types/shipTypes";
import { IPersonalRoomsClient } from "@/src/types/personalRoomsTypes";
import { IGetShipResponse, IPersonalRoomsClient } from "@/src/types/personalRoomsTypes";
import { getLoadout } from "@/src/services/loadoutService";
import { toOid } from "@/src/helpers/inventoryHelpers";
export const getShipController: RequestHandler = async (req, res) => {
const accountId = await getAccountIdForRequest(req);
@ -26,15 +25,7 @@ export const getShipController: RequestHandler = async (req, res) => {
LoadOutInventory: { LoadOutPresets: loadout.toJSON() },
Ship: {
...personalRooms.Ship,
ShipId: toOid(personalRoomsDb.activeShipId),
ShipInterior: {
Colors: personalRooms.ShipInteriorColors,
ShipAttachments: { HOOD_ORNAMENT: "" },
SkinFlavourItem: ""
},
FavouriteLoadoutId: personalRooms.Ship.FavouriteLoadoutId
? toOid(personalRooms.Ship.FavouriteLoadoutId)
: undefined
ShipId: toOid(personalRoomsDb.activeShipId)
},
Apartment: personalRooms.Apartment,
TailorShop: personalRooms.TailorShop

View File

@ -1,7 +1,7 @@
import { RequestHandler } from "express";
import { getAccountIdForRequest } from "@/src/services/loginService";
import { getPersonalRooms } from "@/src/services/personalRoomsService";
import { TBootLocation } from "@/src/types/shipTypes";
import { TBootLocation } from "@/src/types/personalRoomsTypes";
import { getInventory } from "@/src/services/inventoryService";
export const setBootLocationController: RequestHandler = async (req, res) => {

View File

@ -1,5 +1,5 @@
import { getAccountIdForRequest } from "@/src/services/loginService";
import { IPictureFrameInfo, ISetPlacedDecoInfoRequest } from "@/src/types/shipTypes";
import { IPictureFrameInfo, ISetPlacedDecoInfoRequest } from "@/src/types/personalRoomsTypes";
import { RequestHandler } from "express";
import { handleSetPlacedDecoInfo } from "@/src/services/shipCustomizationsService";

View File

@ -1,6 +1,6 @@
import { getAccountIdForRequest } from "@/src/services/loginService";
import { setShipCustomizations } from "@/src/services/shipCustomizationsService";
import { ISetShipCustomizationsRequest } from "@/src/types/shipTypes";
import { ISetShipCustomizationsRequest } from "@/src/types/personalRoomsTypes";
import { logger } from "@/src/utils/logger";
import { RequestHandler } from "express";

View File

@ -3,7 +3,7 @@ import { RequestHandler } from "express";
import { getPersonalRooms } from "@/src/services/personalRoomsService";
import { IOid } from "@/src/types/commonTypes";
import { Types } from "mongoose";
import { IFavouriteLoadoutDatabase, TBootLocation } from "@/src/types/shipTypes";
import { IFavouriteLoadoutDatabase, TBootLocation } from "@/src/types/personalRoomsTypes";
export const setShipFavouriteLoadoutController: RequestHandler = async (req, res) => {
const accountId = await getAccountIdForRequest(req);

View File

@ -1,5 +1,5 @@
import { getAccountIdForRequest } from "@/src/services/loginService";
import { IShipDecorationsRequest } from "@/src/types/shipTypes";
import { IShipDecorationsRequest } from "@/src/types/personalRoomsTypes";
import { logger } from "@/src/utils/logger";
import { RequestHandler } from "express";
import { handleSetShipDecorations } from "@/src/services/shipCustomizationsService";

26
src/models/commonModel.ts Normal file
View File

@ -0,0 +1,26 @@
import { Schema } from "mongoose";
import { IColor } from "@/src/types/inventoryTypes/commonInventoryTypes";
import { IShipCustomization } from "@/src/types/personalRoomsTypes";
export const colorSchema = new Schema<IColor>(
{
t0: Number,
t1: Number,
t2: Number,
t3: Number,
en: Number,
e1: Number,
m0: Number,
m1: Number
},
{ _id: false }
);
export const shipCustomizationSchema = new Schema<IShipCustomization>(
{
SkinFlavourItem: String,
Colors: colorSchema,
ShipAttachments: { HOOD_ORNAMENT: String }
},
{ _id: false }
);

View File

@ -42,7 +42,6 @@ import {
ICrewShipCustomization,
ICrewShipWeapon,
ICrewShipWeaponEmplacements,
IShipExterior,
IHelminthFoodRecord,
ICrewShipMembersDatabase,
IDialogueHistoryDatabase,
@ -106,7 +105,6 @@ import {
import { IOid } from "../../types/commonTypes";
import {
IAbilityOverride,
IColor,
IItemConfig,
IOperatorConfigDatabase,
IPolarity,
@ -117,6 +115,7 @@ import {
import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
import { EquipmentSelectionSchema, oidSchema } from "./loadoutModel";
import { ICountedStoreItem } from "warframe-public-export-plus";
import { colorSchema, shipCustomizationSchema } from "../commonModel";
export const typeCountSchema = new Schema<ITypeCount>({ ItemType: String, ItemCount: Number }, { _id: false });
@ -166,20 +165,6 @@ const abilityOverrideSchema = new Schema<IAbilityOverride>(
{ _id: false }
);
export const colorSchema = new Schema<IColor>(
{
t0: Number,
t1: Number,
t2: Number,
t3: Number,
en: Number,
e1: Number,
m0: Number,
m1: Number
},
{ _id: false }
);
const operatorConfigSchema = new Schema<IOperatorConfigDatabase>(
{
Skins: [String],
@ -896,18 +881,9 @@ const crewShipWeaponSchema = new Schema<ICrewShipWeapon>(
{ _id: false }
);
const shipExteriorSchema = new Schema<IShipExterior>(
{
SkinFlavourItem: String,
Colors: colorSchema,
ShipAttachments: { HOOD_ORNAMENT: String }
},
{ _id: false }
);
const crewShipCustomizationSchema = new Schema<ICrewShipCustomization>(
{
CrewshipInterior: shipExteriorSchema
CrewshipInterior: shipCustomizationSchema
},
{ _id: false }
);

View File

@ -1,19 +1,22 @@
import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
import { colorSchema } from "@/src/models/inventoryModels/inventoryModel";
import { IOrbiter, IPersonalRoomsDatabase, PersonalRoomsModelType } from "@/src/types/personalRoomsTypes";
import {
IApartmentDatabase,
IFavouriteLoadoutDatabase,
IGardeningDatabase,
IPlacedDecosDatabase,
IOrbiterClient,
IOrbiterDatabase,
IPersonalRoomsDatabase,
IPictureFrameInfo,
IPlacedDecosDatabase,
IPlantClient,
IPlantDatabase,
IPlanterDatabase,
IRoom,
ITailorShopDatabase,
IApartmentDatabase,
IPlanterDatabase,
IPlantDatabase,
IPlantClient
} from "@/src/types/shipTypes";
PersonalRoomsModelType
} from "@/src/types/personalRoomsTypes";
import { Schema, Types, model } from "mongoose";
import { colorSchema, shipCustomizationSchema } from "./commonModel";
export const pictureFrameInfoSchema = new Schema<IPictureFrameInfo>(
{
@ -137,10 +140,11 @@ const apartmentDefault: IApartmentDatabase = {
}
};
const orbiterSchema = new Schema<IOrbiter>(
const orbiterSchema = new Schema<IOrbiterDatabase>(
{
Features: [String],
Rooms: [roomSchema],
ShipInterior: shipCustomizationSchema,
VignetteFish: { type: [String], default: undefined },
FavouriteLoadoutId: Schema.Types.ObjectId,
Wallpaper: String,
@ -150,7 +154,18 @@ const orbiterSchema = new Schema<IOrbiter>(
},
{ _id: false }
);
const orbiterDefault: IOrbiter = {
orbiterSchema.set("toJSON", {
virtuals: true,
transform(_doc, obj) {
const db = obj as IOrbiterDatabase;
const client = obj as IOrbiterClient;
if (db.FavouriteLoadoutId) {
client.FavouriteLoadoutId = toOid(db.FavouriteLoadoutId);
}
}
});
const orbiterDefault: IOrbiterDatabase = {
Features: ["/Lotus/Types/Items/ShipFeatureItems/EarthNavigationFeatureItem"], //TODO: potentially remove after missionstarting gear
Rooms: [
{ Name: "AlchemyRoom", MaxCapacity: 1600 },
@ -197,7 +212,6 @@ const tailorShopDefault: ITailorShopDatabase = {
export const personalRoomsSchema = new Schema<IPersonalRoomsDatabase>({
personalRoomsOwnerId: Schema.Types.ObjectId,
activeShipId: Schema.Types.ObjectId,
ShipInteriorColors: colorSchema,
Ship: { type: orbiterSchema, default: orbiterDefault },
Apartment: { type: apartmentSchema, default: apartmentDefault },
TailorShop: { type: tailorShopSchema, default: tailorShopDefault }

View File

@ -1,7 +1,7 @@
import { Document, Schema, Types, model } from "mongoose";
import { IShipDatabase } from "../types/shipTypes";
import { toOid } from "@/src/helpers/inventoryHelpers";
import { colorSchema } from "@/src/models/inventoryModels/inventoryModel";
import { colorSchema } from "@/src/models/commonModel";
import { IShipInventory } from "@/src/types/inventoryTypes/inventoryTypes";
const shipSchema = new Schema<IShipDatabase>(

View File

@ -1,7 +1,6 @@
import { PersonalRooms } from "@/src/models/personalRoomsModel";
import { addItem, getInventory } from "@/src/services/inventoryService";
import { TPersonalRoomsDatabaseDocument } from "../types/personalRoomsTypes";
import { IGardeningDatabase } from "../types/shipTypes";
import { IGardeningDatabase, TPersonalRoomsDatabaseDocument } from "../types/personalRoomsTypes";
import { getRandomElement } from "./rngService";
export const getPersonalRooms = async (

View File

@ -1,12 +1,14 @@
import { getPersonalRooms } from "@/src/services/personalRoomsService";
import { getShip } from "@/src/services/shipService";
import {
ISetPlacedDecoInfoRequest,
ISetShipCustomizationsRequest,
IShipDecorationsRequest,
IShipDecorationsResponse,
ISetPlacedDecoInfoRequest,
TBootLocation
} from "@/src/types/shipTypes";
RoomsType,
TBootLocation,
TPersonalRoomsDatabaseDocument
} from "../types/personalRoomsTypes";
import { logger } from "@/src/utils/logger";
import { Types } from "mongoose";
import { addFusionTreasures, addShipDecorations, getInventory } from "./inventoryService";
@ -15,7 +17,6 @@ import { Guild } from "../models/guildModel";
import { hasGuildPermission } from "./guildService";
import { GuildPermission } from "../types/guildTypes";
import { ExportResources } from "warframe-public-export-plus";
import { RoomsType, TPersonalRoomsDatabaseDocument } from "../types/personalRoomsTypes";
export const setShipCustomizations = async (
accountId: string,
@ -39,7 +40,7 @@ export const setShipCustomizations = async (
personalRooms.TailorShop.LevelDecosVisible = shipCustomization.Customization.LevelDecosVisible;
personalRooms.TailorShop.CustomJson = shipCustomization.Customization.CustomJson;
} else {
personalRooms.ShipInteriorColors = shipCustomization.Customization.Colors;
personalRooms.Ship.ShipInterior = shipCustomization.Customization;
}
await personalRooms.save();
}

View File

@ -1,7 +1,7 @@
import { Types } from "mongoose";
import { IOid, IMongoDate, IOidWithLegacySupport } from "@/src/types/commonTypes";
import { IFusionTreasure, IMiscItem, ITypeCount } from "@/src/types/inventoryTypes/inventoryTypes";
import { IPictureFrameInfo } from "./shipTypes";
import { IPictureFrameInfo } from "./personalRoomsTypes";
import { IFriendInfo } from "./friendTypes";
export interface IGuildClient {

View File

@ -11,7 +11,7 @@ import {
IOperatorConfigDatabase
} from "@/src/types/inventoryTypes/commonInventoryTypes";
import { IFingerprintStat, RivenFingerprint } from "@/src/helpers/rivenHelper";
import { IOrbiter } from "../personalRoomsTypes";
import { IOrbiterClient, IShipCustomization } from "../personalRoomsTypes";
import { ICountedStoreItem } from "warframe-public-export-plus";
export type InventoryDatabaseEquipment = {
@ -381,7 +381,7 @@ export interface IInventoryClient extends IDailyAffiliations, InventoryClientEqu
BrandedSuits?: IOidWithLegacySupport[];
LockedWeaponGroup?: ILockedWeaponGroupClient;
HubNpcCustomizations?: IHubNpcCustomization[];
Ship?: IOrbiter; // U22 and below, response only
Ship?: IOrbiterClient; // U22 and below, response only
ClaimedJunctionChallengeRewards?: string[]; // U39
SpecialItemRewardAttenuation?: IRewardAttenuation[]; // Baro's Void Surplus
}
@ -575,17 +575,7 @@ export interface ICrewShipMemberDatabase {
}
export interface ICrewShipCustomization {
CrewshipInterior: IShipExterior;
}
export interface IShipExterior {
SkinFlavourItem?: string;
Colors?: IColor;
ShipAttachments?: IShipAttachments;
}
export interface IShipAttachments {
HOOD_ORNAMENT: string;
CrewshipInterior: IShipCustomization;
}
export interface IFlavourItem {
@ -1104,7 +1094,7 @@ export interface ISettings {
export interface IShipInventory {
ItemType: string;
ShipExterior: IShipExterior;
ShipExterior: IShipCustomization;
AirSupportPower: string;
ItemId: IOid;
}

View File

@ -1,18 +1,45 @@
import { IColor } from "@/src/types/inventoryTypes/commonInventoryTypes";
import {
IRoom,
IPlacedDecosDatabase,
ITailorShop,
ITailorShopDatabase,
TBootLocation,
IApartmentDatabase,
IApartmentClient
} from "@/src/types/shipTypes";
import { Document, Model, Types } from "mongoose";
import { ILoadoutClient } from "./saveLoadoutTypes";
import { IMongoDate, IOid } from "./commonTypes";
export interface IOrbiter {
export interface IGetShipResponse {
ShipOwnerId: string;
Ship: IOrbiterClient;
Apartment: IApartmentClient;
TailorShop: ITailorShop;
LoadOutInventory: { LoadOutPresets: ILoadoutClient };
}
export interface IShipAttachments {
HOOD_ORNAMENT?: string;
}
export interface IShipCustomization {
SkinFlavourItem?: string;
Colors?: IColor;
ShipAttachments?: IShipAttachments;
}
export type TBootLocation = "LISET" | "DRIFTER_CAMP" | "APARTMENT" | "SHOP";
export interface IOrbiterClient {
Features: string[];
ShipId: IOid;
ShipInterior: IShipCustomization;
Rooms: IRoom[];
VignetteFish?: string[];
FavouriteLoadoutId?: IOid;
Wallpaper?: string;
Vignette?: string;
BootLocation?: TBootLocation;
ContentUrlSignature?: string;
}
export interface IOrbiterDatabase {
Features: string[];
Rooms: IRoom[];
ShipInterior?: IShipCustomization;
VignetteFish?: string[];
FavouriteLoadoutId?: Types.ObjectId;
Wallpaper?: string;
@ -22,25 +49,169 @@ export interface IOrbiter {
}
export interface IPersonalRoomsClient {
ShipInteriorColors: IColor;
Ship: IOrbiter;
Ship: IOrbiterClient;
Apartment: IApartmentClient;
TailorShop: ITailorShop;
}
export interface IPersonalRoomsDatabase {
ShipInteriorColors: IColor;
personalRoomsOwnerId: Types.ObjectId;
activeShipId: Types.ObjectId;
Ship: IOrbiter;
Ship: IOrbiterDatabase;
Apartment: IApartmentDatabase;
TailorShop: ITailorShopDatabase;
}
export interface IRoom {
Name: string;
MaxCapacity: number;
PlacedDecos?: IPlacedDecosDatabase[];
}
export interface IPlantClient {
PlantType: string;
EndTime: IMongoDate;
PlotIndex: number;
}
export interface IPlantDatabase extends Omit<IPlantClient, "EndTime"> {
EndTime: Date;
}
export interface IPlanterClient {
Name: string;
Plants: IPlantClient[];
}
export interface IPlanterDatabase {
Name: string;
Plants: IPlantDatabase[];
}
export interface IGardeningClient {
Planters: IPlanterClient[];
}
export interface IGardeningDatabase {
Planters: IPlanterDatabase[];
}
export interface IApartmentClient {
Gardening: IGardeningClient;
Rooms: IRoom[];
FavouriteLoadouts: IFavouriteLoadout[];
}
export interface IApartmentDatabase {
Gardening: IGardeningDatabase;
Rooms: IRoom[];
FavouriteLoadouts: IFavouriteLoadoutDatabase[];
}
export interface IPlacedDecosDatabase {
Type: string;
Pos: [number, number, number];
Rot: [number, number, number];
Scale?: number;
Sockets?: number;
PictureFrameInfo?: IPictureFrameInfo;
_id: Types.ObjectId;
}
export interface IPlacedDecosClient extends Omit<IPlacedDecosDatabase, "_id"> {
id: IOid;
}
export interface ISetShipCustomizationsRequest {
ShipId: string;
Customization: {
SkinFlavourItem?: string;
Colors?: IColor;
ShipAttachments?: IShipAttachments;
LevelDecosVisible?: boolean;
CustomJson?: string;
};
IsExterior: boolean;
AirSupportPower?: string;
IsShop?: boolean;
}
export interface IShipDecorationsRequest {
Type: string;
Pos: [number, number, number];
Rot: [number, number, number];
Room: string;
BootLocation?: TBootLocation;
IsApartment?: boolean;
RemoveId?: string;
MoveId?: string;
OldRoom?: string;
Scale?: number;
Sockets?: number;
}
export interface IShipDecorationsResponse {
DecoId?: string;
Room?: string;
IsApartment?: boolean;
MaxCapacityIncrease?: number;
OldRoom?: string;
NewRoom?: string;
}
export interface ISetPlacedDecoInfoRequest {
DecoType: string;
DecoId: string;
Room: string;
PictureFrameInfo: IPictureFrameInfo;
BootLocation?: TBootLocation;
ComponentId?: string;
GuildId?: string;
}
export interface IPictureFrameInfo {
Image: string;
Filter: string;
XOffset: number;
YOffset: number;
Scale: number;
InvertX: boolean;
InvertY: boolean;
ColorCorrection: number;
Text: string;
TextScale: number;
TextColorA: number;
TextColorB: number;
TextOrientation: number;
}
export interface IFavouriteLoadout {
Tag: string;
LoadoutId: IOid;
}
export interface IFavouriteLoadoutDatabase {
Tag: string;
LoadoutId: Types.ObjectId;
}
export interface ITailorShopDatabase {
FavouriteLoadouts: IFavouriteLoadoutDatabase[];
Colors?: IColor;
CustomJson?: string;
LevelDecosVisible?: boolean;
Rooms: IRoom[];
}
export interface ITailorShop extends Omit<ITailorShopDatabase, "FavouriteLoadouts"> {
FavouriteLoadouts: IFavouriteLoadout[];
}
export type RoomsType = { Name: string; MaxCapacity: number; PlacedDecos: Types.DocumentArray<IPlacedDecosDatabase> };
export type PersonalRoomsDocumentProps = {
Ship: Omit<IOrbiter, "Rooms"> & {
Ship: Omit<IOrbiterDatabase, "Rooms"> & {
Rooms: RoomsType[];
};
Apartment: Omit<IApartmentDatabase, "Rooms"> & {

View File

@ -1,40 +1,6 @@
import { Types } from "mongoose";
import { IMongoDate, IOid } from "@/src/types/commonTypes";
import { IColor } from "@/src/types/inventoryTypes/commonInventoryTypes";
import { ILoadoutClient } from "./saveLoadoutTypes";
export interface IGetShipResponse {
ShipOwnerId: string;
Ship: IShip;
Apartment: IApartmentClient;
TailorShop: ITailorShop;
LoadOutInventory: { LoadOutPresets: ILoadoutClient };
}
export interface IShipAttachments {
HOOD_ORNAMENT: string;
}
export interface IShipInterior {
Colors?: IColor;
ShipAttachments?: IShipAttachments;
SkinFlavourItem?: string;
}
export type TBootLocation = "LISET" | "DRIFTER_CAMP" | "APARTMENT" | "SHOP";
export interface IShip {
Features: string[];
ShipId: IOid;
ShipInterior: IShipInterior;
Rooms: IRoom[];
VignetteFish?: string[];
FavouriteLoadoutId?: IOid;
Wallpaper?: string;
Vignette?: string;
BootLocation?: TBootLocation;
ContentUrlSignature?: string;
}
import { IShipAttachments } from "./personalRoomsTypes";
export interface IShipDatabase {
ItemType: string;
@ -44,155 +10,3 @@ export interface IShipDatabase {
ShipAttachments?: IShipAttachments;
SkinFlavourItem?: string;
}
export interface IRoom {
Name: string;
MaxCapacity: number;
PlacedDecos?: IPlacedDecosDatabase[];
}
export interface IPlantClient {
PlantType: string;
EndTime: IMongoDate;
PlotIndex: number;
}
export interface IPlantDatabase extends Omit<IPlantClient, "EndTime"> {
EndTime: Date;
}
export interface IPlanterClient {
Name: string;
Plants: IPlantClient[];
}
export interface IPlanterDatabase {
Name: string;
Plants: IPlantDatabase[];
}
export interface IGardeningClient {
Planters: IPlanterClient[];
}
export interface IGardeningDatabase {
Planters: IPlanterDatabase[];
}
export interface IApartmentClient {
Gardening: IGardeningClient;
Rooms: IRoom[];
FavouriteLoadouts: IFavouriteLoadout[];
}
export interface IApartmentDatabase {
Gardening: IGardeningDatabase;
Rooms: IRoom[];
FavouriteLoadouts: IFavouriteLoadoutDatabase[];
}
export interface IPlacedDecosDatabase {
Type: string;
Pos: [number, number, number];
Rot: [number, number, number];
Scale?: number;
Sockets?: number;
PictureFrameInfo?: IPictureFrameInfo;
_id: Types.ObjectId;
}
export interface IPlacedDecosClient extends Omit<IPlacedDecosDatabase, "_id"> {
id: IOid;
}
export interface ISetShipCustomizationsRequest {
ShipId: string;
Customization: Customization;
IsExterior: boolean;
AirSupportPower?: string;
IsShop?: boolean;
}
export interface Customization {
SkinFlavourItem: string;
Colors: IColor;
ShipAttachments: ShipAttachments;
LevelDecosVisible: boolean;
CustomJson: string;
}
//TODO: check for more attachments
export interface ShipAttachments {
HOOD_ORNAMENT: string;
}
export interface IShipDecorationsRequest {
Type: string;
Pos: [number, number, number];
Rot: [number, number, number];
Room: string;
BootLocation?: TBootLocation;
IsApartment?: boolean;
RemoveId?: string;
MoveId?: string;
OldRoom?: string;
Scale?: number;
Sockets?: number;
}
export interface IShipDecorationsResponse {
DecoId?: string;
Room?: string;
IsApartment?: boolean;
MaxCapacityIncrease?: number;
OldRoom?: string;
NewRoom?: string;
}
export interface ISetPlacedDecoInfoRequest {
DecoType: string;
DecoId: string;
Room: string;
PictureFrameInfo: IPictureFrameInfo;
BootLocation?: TBootLocation;
ComponentId?: string;
GuildId?: string;
}
export interface IPictureFrameInfo {
Image: string;
Filter: string;
XOffset: number;
YOffset: number;
Scale: number;
InvertX: boolean;
InvertY: boolean;
ColorCorrection: number;
Text: string;
TextScale: number;
TextColorA: number;
TextColorB: number;
TextOrientation: number;
}
export interface IFavouriteLoadout {
Tag: string;
LoadoutId: IOid;
}
export interface IFavouriteLoadoutDatabase {
Tag: string;
LoadoutId: Types.ObjectId;
}
export interface ITailorShopDatabase {
FavouriteLoadouts: IFavouriteLoadoutDatabase[];
Colors?: IColor;
CustomJson: string;
LevelDecosVisible: boolean;
Rooms: IRoom[];
}
export interface ITailorShop extends Omit<ITailorShopDatabase, "FavouriteLoadouts"> {
FavouriteLoadouts: IFavouriteLoadout[];
}