fix: move ship decorations (#300)

This commit is contained in:
OrdisPrime 2024-06-15 17:39:13 +02:00 committed by GitHub
parent f216d5222f
commit 21db3b5c5d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 79 additions and 7 deletions

View File

@ -7,7 +7,8 @@ const placedDecosSchema = new Schema<IPlacedDecosDatabase>(
{ {
Type: String, Type: String,
Pos: [Number], Pos: [Number],
Rot: [Number] Rot: [Number],
Scale: Number
}, },
{ id: false } { id: false }
); );

View File

@ -6,6 +6,7 @@ import {
IShipDecorationsRequest, IShipDecorationsRequest,
IShipDecorationsResponse IShipDecorationsResponse
} from "@/src/types/shipTypes"; } from "@/src/types/shipTypes";
import { logger } from "@/src/utils/logger";
import { Types } from "mongoose"; import { Types } from "mongoose";
export const setShipCustomizations = async (shipCustomization: ISetShipCustomizationsRequest) => { export const setShipCustomizations = async (shipCustomization: ISetShipCustomizationsRequest) => {
@ -37,12 +38,74 @@ export const handleSetShipDecorations = async (
const rooms = placedDecoration.IsApartment ? personalRooms.Apartment.Rooms : personalRooms.Ship.Rooms; const rooms = placedDecoration.IsApartment ? personalRooms.Apartment.Rooms : personalRooms.Ship.Rooms;
const room = rooms.find(room => room.Name === placedDecoration.Room); const roomToPlaceIn = rooms.find(room => room.Name === placedDecoration.Room);
if (!roomToPlaceIn) {
logger.error("room not found");
throw new Error("room not found");
}
if (placedDecoration.MoveId) {
//moved within the same room
if (placedDecoration.OldRoom === placedDecoration.Room) {
const existingDecorationIndex = roomToPlaceIn?.PlacedDecos?.findIndex(
deco => deco._id.toString() === placedDecoration.MoveId
);
if (existingDecorationIndex === -1) {
logger.error("decoration to be moved not found");
throw new Error("decoration to be moved not found");
}
roomToPlaceIn.PlacedDecos[existingDecorationIndex].Pos = placedDecoration.Pos;
roomToPlaceIn.PlacedDecos[existingDecorationIndex].Rot = placedDecoration.Rot;
if (placedDecoration.Scale) {
roomToPlaceIn.PlacedDecos[existingDecorationIndex].Scale = placedDecoration.Scale;
}
await personalRooms.save();
return {
OldRoom: placedDecoration.OldRoom,
NewRoom: placedDecoration.Room,
IsApartment: placedDecoration.IsApartment,
MaxCapacityIncrease: 0 // TODO: calculate capacity change upon removal
};
}
//moved to a different room
const oldRoom = rooms.find(room => room.Name === placedDecoration.OldRoom);
if (!oldRoom) {
logger.error("old room not found");
throw new Error("old room not found");
}
oldRoom.PlacedDecos.pull({ _id: placedDecoration.MoveId });
const newDecoration = {
Type: placedDecoration.Type,
Pos: placedDecoration.Pos,
Rot: placedDecoration.Rot,
Scale: placedDecoration.Scale || 1,
_id: placedDecoration.MoveId
};
//the new room is still roomToPlaceIn
roomToPlaceIn.PlacedDecos.push(newDecoration);
await personalRooms.save();
return {
OldRoom: placedDecoration.OldRoom,
NewRoom: placedDecoration.Room,
IsApartment: placedDecoration.IsApartment,
MaxCapacityIncrease: 0 // TODO: calculate capacity change upon removal
};
}
//TODO: check whether to remove from shipitems //TODO: check whether to remove from shipitems
if (placedDecoration.RemoveId) { if (placedDecoration.RemoveId) {
room?.PlacedDecos?.pull({ _id: placedDecoration.RemoveId }); roomToPlaceIn.PlacedDecos.pull({ _id: placedDecoration.RemoveId });
await personalRooms.save(); await personalRooms.save();
return { return {
DecoId: placedDecoration.RemoveId, DecoId: placedDecoration.RemoveId,
@ -54,11 +117,13 @@ export const handleSetShipDecorations = async (
// TODO: handle capacity // TODO: handle capacity
//place decoration
const decoId = new Types.ObjectId(); const decoId = new Types.ObjectId();
room?.PlacedDecos?.push({ roomToPlaceIn.PlacedDecos?.push({
Type: placedDecoration.Type, Type: placedDecoration.Type,
Pos: placedDecoration.Pos, Pos: placedDecoration.Pos,
Rot: placedDecoration.Rot, Rot: placedDecoration.Rot,
Scale: placedDecoration.Scale || 1,
_id: decoId _id: decoId
}); });

View File

@ -69,6 +69,7 @@ export interface IPlacedDecosDatabase {
Type: string; Type: string;
Pos: [number, number, number]; Pos: [number, number, number];
Rot: [number, number, number]; Rot: [number, number, number];
Scale: number;
_id: Types.ObjectId; _id: Types.ObjectId;
} }
@ -100,12 +101,17 @@ export interface IShipDecorationsRequest {
Rot: [number, number, number]; Rot: [number, number, number];
Room: string; Room: string;
IsApartment: boolean; IsApartment: boolean;
RemoveId: string; RemoveId?: string;
MoveId?: string;
OldRoom?: string;
Scale?: number;
} }
export interface IShipDecorationsResponse { export interface IShipDecorationsResponse {
DecoId: string; DecoId?: string;
Room: string; Room?: string;
IsApartment: boolean; IsApartment: boolean;
MaxCapacityIncrease?: number; MaxCapacityIncrease?: number;
OldRoom?: string;
NewRoom?: string;
} }