feat: reset decorations #2516
@ -1,20 +1,17 @@
|
|||||||
import { getAccountIdForRequest } from "@/src/services/loginService";
|
import { getAccountIdForRequest } from "@/src/services/loginService";
|
||||||
import { IShipDecorationsRequest } from "@/src/types/personalRoomsTypes";
|
import { IShipDecorationsRequest, IResetShipDecorationsRequest } from "@/src/types/personalRoomsTypes";
|
||||||
import { logger } from "@/src/utils/logger";
|
|
||||||
import { RequestHandler } from "express";
|
import { RequestHandler } from "express";
|
||||||
import { handleSetShipDecorations } from "@/src/services/shipCustomizationsService";
|
import { handleResetShipDecorations, handleSetShipDecorations } from "@/src/services/shipCustomizationsService";
|
||||||
|
|
||||||
export const shipDecorationsController: RequestHandler = async (req, res) => {
|
export const shipDecorationsController: RequestHandler = async (req, res) => {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
const shipDecorationsRequest = JSON.parse(req.body as string) as IShipDecorationsRequest;
|
if (req.query.reset == "1") {
|
||||||
|
const request = JSON.parse(req.body as string) as IResetShipDecorationsRequest;
|
||||||
try {
|
const response = await handleResetShipDecorations(accountId, request);
|
||||||
|
res.send(response);
|
||||||
|
} else {
|
||||||
|
const shipDecorationsRequest = JSON.parse(req.body as string) as IShipDecorationsRequest;
|
||||||
const placedDecoration = await handleSetShipDecorations(accountId, shipDecorationsRequest);
|
const placedDecoration = await handleSetShipDecorations(accountId, shipDecorationsRequest);
|
||||||
res.send(placedDecoration);
|
res.send(placedDecoration);
|
||||||
} catch (error: unknown) {
|
|
||||||
if (error instanceof Error) {
|
|
||||||
logger.error(`error in shipDecorationsController: ${error.message}`);
|
|
||||||
res.status(400).json({ error: error.message });
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
import { getPersonalRooms } from "@/src/services/personalRoomsService";
|
import { getPersonalRooms } from "@/src/services/personalRoomsService";
|
||||||
import { getShip } from "@/src/services/shipService";
|
import { getShip } from "@/src/services/shipService";
|
||||||
import {
|
import {
|
||||||
|
IResetShipDecorationsRequest,
|
||||||
|
IResetShipDecorationsResponse,
|
||||||
ISetPlacedDecoInfoRequest,
|
ISetPlacedDecoInfoRequest,
|
||||||
ISetShipCustomizationsRequest,
|
ISetShipCustomizationsRequest,
|
||||||
IShipDecorationsRequest,
|
IShipDecorationsRequest,
|
||||||
@ -154,7 +156,6 @@ export const handleSetShipDecorations = async (
|
|||||||
|
|
||||||
if (!config.unlockAllShipDecorations) {
|
if (!config.unlockAllShipDecorations) {
|
||||||
const inventory = await getInventory(accountId);
|
const inventory = await getInventory(accountId);
|
||||||
const itemType = Object.entries(ExportResources).find(arr => arr[1].deco == placedDecoration.Type)![0];
|
|
||||||
if (placedDecoration.Sockets !== undefined) {
|
if (placedDecoration.Sockets !== undefined) {
|
||||||
addFusionTreasures(inventory, [{ ItemType: itemType, Sockets: placedDecoration.Sockets, ItemCount: -1 }]);
|
addFusionTreasures(inventory, [{ ItemType: itemType, Sockets: placedDecoration.Sockets, ItemCount: -1 }]);
|
||||||
} else {
|
} else {
|
||||||
@ -198,6 +199,51 @@ const getRoomsForBootLocation = (
|
|||||||
return personalRooms.Ship.Rooms;
|
return personalRooms.Ship.Rooms;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const handleResetShipDecorations = async (
|
||||||
|
accountId: string,
|
||||||
|
request: IResetShipDecorationsRequest
|
||||||
|
): Promise<IResetShipDecorationsResponse> => {
|
||||||
|
const [personalRooms, inventory] = await Promise.all([getPersonalRooms(accountId), getInventory(accountId)]);
|
||||||
|
const room = getRoomsForBootLocation(personalRooms, request).find(room => room.Name === request.Room);
|
||||||
|
if (!room) {
|
||||||
|
throw new Error(`unknown room: ${request.Room}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const deco of room.PlacedDecos) {
|
||||||
|
const entry = Object.entries(ExportResources).find(arr => arr[1].deco == deco.Type);
|
||||||
|
if (!entry) {
|
||||||
|
throw new Error(`unknown deco type: ${deco.Type}`);
|
||||||
|
}
|
||||||
|
const [itemType, meta] = entry;
|
||||||
|
if (meta.capacityCost === undefined) {
|
||||||
|
throw new Error(`unknown deco type: ${deco.Type}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// refund item
|
||||||
|
if (!config.unlockAllShipDecorations) {
|
||||||
|
if (deco.Sockets !== undefined) {
|
||||||
|
addFusionTreasures(inventory, [{ ItemType: itemType, Sockets: deco.Sockets, ItemCount: 1 }]);
|
||||||
|
} else {
|
||||||
|
addShipDecorations(inventory, [{ ItemType: itemType, ItemCount: 1 }]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// refund capacity
|
||||||
|
room.MaxCapacity += meta.capacityCost;
|
||||||
|
}
|
||||||
|
|
||||||
|
// empty room
|
||||||
|
room.PlacedDecos.splice(0, room.PlacedDecos.length);
|
||||||
|
|
||||||
|
await Promise.all([personalRooms.save(), inventory.save()]);
|
||||||
|
|
||||||
|
return {
|
||||||
|
ResetRoom: request.Room,
|
||||||
|
ClaimedDecos: [], // Not sure what this is for; the client already implies that the decos were returned to inventory.
|
||||||
|
NewCapacity: room.MaxCapacity
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
export const handleSetPlacedDecoInfo = async (accountId: string, req: ISetPlacedDecoInfoRequest): Promise<void> => {
|
export const handleSetPlacedDecoInfo = async (accountId: string, req: ISetPlacedDecoInfoRequest): Promise<void> => {
|
||||||
if (req.GuildId && req.ComponentId) {
|
if (req.GuildId && req.ComponentId) {
|
||||||
const guild = (await Guild.findById(req.GuildId))!;
|
const guild = (await Guild.findById(req.GuildId))!;
|
||||||
|
@ -150,6 +150,17 @@ export interface IShipDecorationsResponse {
|
|||||||
NewRoom?: string;
|
NewRoom?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface IResetShipDecorationsRequest {
|
||||||
|
Room: string;
|
||||||
|
BootLocation?: TBootLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IResetShipDecorationsResponse {
|
||||||
|
ResetRoom: string;
|
||||||
|
ClaimedDecos: [];
|
||||||
|
NewCapacity: number;
|
||||||
|
}
|
||||||
|
|
||||||
export interface ISetPlacedDecoInfoRequest {
|
export interface ISetPlacedDecoInfoRequest {
|
||||||
DecoType: string;
|
DecoType: string;
|
||||||
DecoId: string;
|
DecoId: string;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user