feat: decorating the backroom (#604)

This commit is contained in:
Sainan 2024-12-22 20:32:19 +01:00 committed by GitHub
parent cbdd1cd0a7
commit 95bd07b50f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 103 additions and 13 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

@ -13,7 +13,7 @@ export const shipDecorationsController: RequestHandler = async (req, res) => {
res.send(placedDecoration); res.send(placedDecoration);
} catch (error: unknown) { } catch (error: unknown) {
if (error instanceof Error) { if (error instanceof Error) {
logger.error(`error in saveLoadoutController: ${error.message}`); logger.error(`error in shipDecorationsController: ${error.message}`);
res.status(400).json({ error: error.message }); res.status(400).json({ error: error.message });
} }
} }

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 } 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>(
@ -44,7 +52,7 @@ placedDecosSchema.set("toJSON", {
} }
}); });
const roomSchema = new Schema( const roomSchema = new Schema<IRoom>(
{ {
Name: String, Name: String,
MaxCapacity: Number, MaxCapacity: Number,
@ -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,9 +1,9 @@
import { IApartment, IRooms, 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 {
Features: string[]; Features: string[];
Rooms: IRooms[]; Rooms: IRoom[];
ContentUrlSignature: string; ContentUrlSignature: string;
BootLocation?: TBootLocation; BootLocation?: TBootLocation;
} }
@ -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 };
} }
@ -26,7 +27,7 @@ export interface IShip {
Features: string[]; Features: string[];
ShipId: IOid; ShipId: IOid;
ShipInterior: IShipInterior; ShipInterior: IShipInterior;
Rooms: IRooms[]; Rooms: IRoom[];
ContentUrlSignature: string; ContentUrlSignature: string;
BootLocation?: TBootLocation; BootLocation?: TBootLocation;
} }
@ -41,7 +42,7 @@ export interface IShipDatabase {
SkinFlavourItem?: string; SkinFlavourItem?: string;
} }
export interface IRooms { export interface IRoom {
Name: string; Name: string;
MaxCapacity: number; MaxCapacity: number;
PlacedDecos?: IPlacedDecosDatabase[]; PlacedDecos?: IPlacedDecosDatabase[];
@ -62,7 +63,7 @@ export interface IGardening {
} }
export interface IApartment { export interface IApartment {
Gardening: IGardening; Gardening: IGardening;
Rooms: IRooms[]; Rooms: IRoom[];
FavouriteLoadouts: string[]; FavouriteLoadouts: string[];
} }
@ -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: []; // ???
}