feat: decorating the backroom

This commit is contained in:
Sainan 2024-12-22 20:21:33 +01:00
parent 6beb3c73e0
commit 65c000249c
5 changed files with 97 additions and 7 deletions

View File

@ -27,7 +27,8 @@ export const getShipController: RequestHandler = async (req, res) => {
SkinFlavourItem: ship.SkinFlavourItem SkinFlavourItem: ship.SkinFlavourItem
} }
}, },
Apartment: personalRooms.Apartment Apartment: personalRooms.Apartment,
TailorShop: personalRooms.TailorShop
}; };
if (config.unlockAllShipFeatures) { if (config.unlockAllShipFeatures) {

View File

@ -1,6 +1,14 @@
import { toOid } from "@/src/helpers/inventoryHelpers"; import { toOid } from "@/src/helpers/inventoryHelpers";
import { IOrbiter, IPersonalRooms, PersonalRoomsModelType } from "@/src/types/personalRoomsTypes"; import { IOrbiter, IPersonalRooms, PersonalRoomsModelType } from "@/src/types/personalRoomsTypes";
import { IApartment, IGardening, IPlacedDecosDatabase, IPictureFrameInfo, IRoom } from "@/src/types/shipTypes"; import {
IApartment,
IFavouriteLoadoutDatabase,
IGardening,
IPlacedDecosDatabase,
IPictureFrameInfo,
IRoom,
ITailorShopDatabase
} from "@/src/types/shipTypes";
import { Schema, model } from "mongoose"; import { Schema, model } from "mongoose";
const pictureFrameInfoSchema = new Schema<IPictureFrameInfo>( const pictureFrameInfoSchema = new Schema<IPictureFrameInfo>(
@ -76,11 +84,59 @@ const orbiterSchema = new Schema<IOrbiter>(
{ _id: false } { _id: false }
); );
const favouriteLoadoutSchema = new Schema<IFavouriteLoadoutDatabase>(
{
Tag: String,
LoadoutId: Schema.Types.ObjectId
},
{ _id: false }
);
favouriteLoadoutSchema.set("toJSON", {
virtuals: true,
transform(_document, returnedObject) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
returnedObject.LoadoutId = toOid(returnedObject.LoadoutId);
}
});
const tailorShopSchema = new Schema<ITailorShopDatabase>(
{
FavouriteLoadouts: [favouriteLoadoutSchema],
CustomJson: String,
LevelDecosVisible: Boolean,
Rooms: [roomSchema]
},
{ _id: false }
);
const tailorShopDefault: ITailorShopDatabase = {
FavouriteLoadouts: [],
CustomJson: "{}",
LevelDecosVisible: true,
Rooms: [
{
Name: "LabRoom",
MaxCapacity: 4000
},
{
Name: "LivingQuartersRoom",
MaxCapacity: 3000
},
{
Name: "HelminthRoom",
MaxCapacity: 2000
}
]
};
export const personalRoomsSchema = new Schema<IPersonalRooms>({ export const personalRoomsSchema = new Schema<IPersonalRooms>({
personalRoomsOwnerId: Schema.Types.ObjectId, personalRoomsOwnerId: Schema.Types.ObjectId,
activeShipId: Schema.Types.ObjectId, activeShipId: Schema.Types.ObjectId,
Ship: orbiterSchema, Ship: orbiterSchema,
Apartment: apartmentSchema Apartment: apartmentSchema,
TailorShop: {
type: tailorShopSchema,
default: tailorShopDefault as any as undefined // Yeah, this is bad, but mongoose types here are wrong.
}
}); });
export const PersonalRooms = model<IPersonalRooms, PersonalRoomsModelType>("PersonalRooms", personalRoomsSchema); export const PersonalRooms = model<IPersonalRooms, PersonalRoomsModelType>("PersonalRooms", personalRoomsSchema);

View File

@ -37,7 +37,12 @@ export const handleSetShipDecorations = async (
): Promise<IShipDecorationsResponse> => { ): Promise<IShipDecorationsResponse> => {
const personalRooms = await getPersonalRooms(accountId); const personalRooms = await getPersonalRooms(accountId);
const rooms = placedDecoration.IsApartment ? personalRooms.Apartment.Rooms : personalRooms.Ship.Rooms; const rooms =
placedDecoration.BootLocation == "SHOP"
? personalRooms.TailorShop.Rooms
: placedDecoration.IsApartment
? personalRooms.Apartment.Rooms
: personalRooms.Ship.Rooms;
const roomToPlaceIn = rooms.find(room => room.Name === placedDecoration.Room); const roomToPlaceIn = rooms.find(room => room.Name === placedDecoration.Room);

View File

@ -1,4 +1,4 @@
import { IApartment, IRoom, IPlacedDecosDatabase, TBootLocation } from "@/src/types/shipTypes"; import { IApartment, IRoom, IPlacedDecosDatabase, ITailorShop, TBootLocation } from "@/src/types/shipTypes";
import { Model, Types } from "mongoose"; import { Model, Types } from "mongoose";
export interface IOrbiter { export interface IOrbiter {
@ -13,6 +13,7 @@ export interface IPersonalRooms {
activeShipId: Types.ObjectId; activeShipId: Types.ObjectId;
Ship: IOrbiter; Ship: IOrbiter;
Apartment: IApartment; Apartment: IApartment;
TailorShop: ITailorShop;
} }
export type RoomsType = { Name: string; MaxCapacity: number; PlacedDecos: Types.DocumentArray<IPlacedDecosDatabase> }; export type RoomsType = { Name: string; MaxCapacity: number; PlacedDecos: Types.DocumentArray<IPlacedDecosDatabase> };
@ -24,6 +25,9 @@ export type PersonalRoomsDocumentProps = {
Apartment: Omit<IApartment, "Rooms"> & { Apartment: Omit<IApartment, "Rooms"> & {
Rooms: RoomsType[]; Rooms: RoomsType[];
}; };
TailorShop: Omit<ITailorShop, "Rooms"> & {
Rooms: RoomsType[];
};
}; };
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types

View File

@ -7,6 +7,7 @@ export interface IGetShipResponse {
ShipOwnerId: string; ShipOwnerId: string;
Ship: IShip; Ship: IShip;
Apartment: IApartment; Apartment: IApartment;
TailorShop: ITailorShop;
LoadOutInventory: { LoadOutPresets: ILoadoutClient }; LoadOutInventory: { LoadOutPresets: ILoadoutClient };
} }
@ -102,7 +103,8 @@ export interface IShipDecorationsRequest {
Pos: [number, number, number]; Pos: [number, number, number];
Rot: [number, number, number]; Rot: [number, number, number];
Room: string; Room: string;
IsApartment: boolean; BootLocation?: TBootLocation;
IsApartment?: boolean;
RemoveId?: string; RemoveId?: string;
MoveId?: string; MoveId?: string;
OldRoom?: string; OldRoom?: string;
@ -112,7 +114,7 @@ export interface IShipDecorationsRequest {
export interface IShipDecorationsResponse { export interface IShipDecorationsResponse {
DecoId?: string; DecoId?: string;
Room?: string; Room?: string;
IsApartment: boolean; IsApartment?: boolean;
MaxCapacityIncrease?: number; MaxCapacityIncrease?: number;
OldRoom?: string; OldRoom?: string;
NewRoom?: string; NewRoom?: string;
@ -141,3 +143,25 @@ export interface IPictureFrameInfo {
TextColorB: number; TextColorB: number;
TextOrientation: number; TextOrientation: number;
} }
export interface IFavouriteLoadout {
Tag: string;
LoadoutId: IOid;
}
export interface IFavouriteLoadoutDatabase {
Tag: string;
LoadoutId: Types.ObjectId;
}
export interface ITailorShopDatabase {
FavouriteLoadouts: IFavouriteLoadoutDatabase[];
CustomJson: "{}"; // ???
LevelDecosVisible: boolean;
Rooms: IRoom[];
}
export interface ITailorShop extends Omit<ITailorShopDatabase, "FavouriteLoadouts"> {
FavouriteLoadouts: IFavouriteLoadout[];
Colors: []; // ???
}