返回提交历史
Modified
src/controllers/api/placeDecoInComponentController.ts
+6
-1
Added
src/controllers/api/setDojoComponentColorsController.ts
+34
-0
Modified
src/models/guildModel.ts
+7
-1
Modified
src/routes/api.ts
+2
-0
Modified
src/services/guildService.ts
+29
-0
Modified
src/types/guildTypes.ts
+12
-1
XFEstudio/SpaceNinjaServer
feat: polychrome (#1495)
Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1495 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
74c7d860
代码差异
6 个文件
+90
-3
@@ -64,7 +64,12 @@ export const placeDecoInComponentController: RequestHandler = async (req, res) =
64
64
}
65
65
if (!meta || (meta.price == 0 && meta.ingredients.length == 0)) {
66
66
deco.CompletionTime = new Date();
67
} else if (guild.AutoContributeFromVault && guild.VaultRegularCredits && guild.VaultMiscItems) {
67
} else if (
68
guild.AutoContributeFromVault &&
69
guild.VaultRegularCredits &&
70
guild.VaultMiscItems &&
71
deco.Type != "/Lotus/Objects/Tenno/Props/TnoPaintBotDojoDeco"
72
) {
68
73
if (guild.VaultRegularCredits >= scaleRequiredCount(guild.Tier, meta.price)) {
69
74
let enoughMiscItems = true;
70
75
for (const ingredient of meta.ingredients) {
@@ -0,0 +1,34 @@
1
import { getJSONfromString } from "@/src/helpers/stringHelpers";
2
import { getDojoClient, getGuildForRequestEx, hasAccessToDojo, hasGuildPermission } from "@/src/services/guildService";
3
import { getInventory } from "@/src/services/inventoryService";
4
import { getAccountIdForRequest } from "@/src/services/loginService";
5
import { GuildPermission } from "@/src/types/guildTypes";
6
import { RequestHandler } from "express";
7
8
export const setDojoComponentColorsController: RequestHandler = async (req, res) => {
9
const accountId = await getAccountIdForRequest(req);
10
const inventory = await getInventory(accountId, "GuildId LevelKeys");
11
const guild = await getGuildForRequestEx(req, inventory);
12
if (!hasAccessToDojo(inventory) || !(await hasGuildPermission(guild, accountId, GuildPermission.Decorator))) {
13
res.json({ DojoRequestStatus: -1 });
14
return;
15
}
16
const data = getJSONfromString<ISetDojoComponentColorsRequest>(String(req.body));
17
const component = guild.DojoComponents.id(data.ComponentId)!;
18
//const deco = component.Decos!.find(x => x._id.equals(data.DecoId))!;
19
//deco.Pending = true;
20
//component.PaintBot = new Types.ObjectId(data.DecoId);
21
if ("lights" in req.query) {
22
component.PendingLights = data.Colours;
23
} else {
24
component.PendingColors = data.Colours;
25
}
26
await guild.save();
27
res.json(await getDojoClient(guild, 0, component._id));
28
};
29
30
interface ISetDojoComponentColorsRequest {
31
ComponentId: string;
32
DecoId: string;
33
Colours: number[];
34
}
@@ -29,7 +29,8 @@ const dojoDecoSchema = new Schema<IDojoDecoDatabase>({
29
29
MiscItems: { type: [typeCountSchema], default: undefined },
30
30
CompletionTime: Date,
31
31
RushPlatinum: Number,
32
PictureFrameInfo: pictureFrameInfoSchema
32
PictureFrameInfo: pictureFrameInfoSchema,
33
Pending: Boolean
33
34
});
34
35
35
36
const dojoLeaderboardEntrySchema = new Schema<IDojoLeaderboardEntry>(
@@ -57,6 +58,11 @@ const dojoComponentSchema = new Schema<IDojoComponentDatabase>({
57
58
DestructionTime: Date,
58
59
Decos: [dojoDecoSchema],
59
60
DecoCapacity: Number,
61
PaintBot: Schema.Types.ObjectId,
62
PendingColors: { type: [Number], default: undefined },
63
Colors: { type: [Number], default: undefined },
64
PendingLights: { type: [Number], default: undefined },
65
Lights: { type: [Number], default: undefined },
60
66
Leaderboard: { type: [dojoLeaderboardEntrySchema], default: undefined }
61
67
});
62
68
@@ -105,6 +105,7 @@ import { setActiveQuestController } from "@/src/controllers/api/setActiveQuestCo
105
105
import { setActiveShipController } from "@/src/controllers/api/setActiveShipController";
106
106
import { setAllianceGuildPermissionsController } from "@/src/controllers/api/setAllianceGuildPermissionsController";
107
107
import { setBootLocationController } from "@/src/controllers/api/setBootLocationController";
108
import { setDojoComponentColorsController } from "@/src/controllers/api/setDojoComponentColorsController";
108
109
import { setDojoComponentMessageController } from "@/src/controllers/api/setDojoComponentMessageController";
109
110
import { setEquippedInstrumentController } from "@/src/controllers/api/setEquippedInstrumentController";
110
111
import { setGuildMotdController } from "@/src/controllers/api/setGuildMotdController";
@@ -261,6 +262,7 @@ apiRouter.post("/saveLoadout.php", saveLoadoutController);
261
262
apiRouter.post("/saveSettings.php", saveSettingsController);
262
263
apiRouter.post("/saveVaultAutoContribute.php", saveVaultAutoContributeController);
263
264
apiRouter.post("/sell.php", sellController);
265
apiRouter.post("/setDojoComponentColors.php", setDojoComponentColorsController);
264
266
apiRouter.post("/setDojoComponentMessage.php", setDojoComponentMessageController);
265
267
apiRouter.post("/setEquippedInstrument.php", setEquippedInstrumentController);
266
268
apiRouter.post("/setGuildMotd.php", setGuildMotdController);
@@ -141,6 +141,7 @@ export const getDojoClient = async (
141
141
DojoComponents: []
142
142
};
143
143
const roomsToRemove: Types.ObjectId[] = [];
144
const decosToRemoveNoRefund: { componentId: Types.ObjectId; decoId: Types.ObjectId }[] = [];
144
145
let needSave = false;
145
146
for (const dojoComponent of guild.DojoComponents) {
146
147
if (!componentId || dojoComponent._id.equals(componentId)) {
@@ -212,6 +213,21 @@ export const getDojoClient = async (
212
213
PictureFrameInfo: deco.PictureFrameInfo
213
214
};
214
215
if (deco.CompletionTime) {
216
if (
217
deco.Type == "/Lotus/Objects/Tenno/Props/TnoPaintBotDojoDeco" &&
218
Date.now() >= deco.CompletionTime.getTime()
219
) {
220
if (dojoComponent.PendingColors) {
221
dojoComponent.Colors = dojoComponent.PendingColors;
222
dojoComponent.PendingColors = undefined;
223
}
224
if (dojoComponent.PendingLights) {
225
dojoComponent.Lights = dojoComponent.PendingLights;
226
dojoComponent.PendingLights = undefined;
227
}
228
decosToRemoveNoRefund.push({ componentId: dojoComponent._id, decoId: deco._id });
229
continue;
230
}
215
231
clientDeco.CompletionTime = toMongoDate(deco.CompletionTime);
216
232
} else {
217
233
clientDeco.RegularCredits = deco.RegularCredits;
@@ -220,6 +236,10 @@ export const getDojoClient = async (
220
236
clientComponent.Decos.push(clientDeco);
221
237
}
222
238
}
239
clientComponent.PendingColors = dojoComponent.PendingColors;
240
clientComponent.Colors = dojoComponent.Colors;
241
clientComponent.PendingLights = dojoComponent.PendingLights;
242
clientComponent.Lights = dojoComponent.Lights;
223
243
dojo.DojoComponents.push(clientComponent);
224
244
}
225
245
}
@@ -230,6 +250,15 @@ export const getDojoClient = async (
230
250
}
231
251
needSave = true;
232
252
}
253
for (const deco of decosToRemoveNoRefund) {
254
logger.debug(`removing polychrome`, deco);
255
const component = guild.DojoComponents.id(deco.componentId)!;
256
component.Decos!.splice(
257
component.Decos!.findIndex(x => x._id.equals(deco.decoId)),
258
1
259
);
260
needSave = true;
261
}
233
262
if (needSave) {
234
263
await guild.save();
235
264
}
@@ -161,6 +161,7 @@ export interface IDojoClient {
161
161
162
162
export interface IDojoComponentClient {
163
163
id: IOid;
164
SortId?: IOid;
164
165
pf: string; // Prefab (.level)
165
166
ppf: string;
166
167
pi?: IOid; // Parent ID. N/A to root.
@@ -175,16 +176,25 @@ export interface IDojoComponentClient {
175
176
DestructionTime?: IMongoDate;
176
177
Decos?: IDojoDecoClient[];
177
178
DecoCapacity?: number;
179
PaintBot?: IOid;
180
PendingColors?: number[];
181
Colors?: number[];
182
PendingLights?: number[];
183
Lights?: number[];
178
184
}
179
185
180
186
export interface IDojoComponentDatabase
181
extends Omit<IDojoComponentClient, "id" | "pi" | "CompletionTime" | "DestructionTime" | "Decos"> {
187
extends Omit<
188
IDojoComponentClient,
189
"id" | "SortId" | "pi" | "CompletionTime" | "DestructionTime" | "Decos" | "PaintBot"
190
> {
182
191
_id: Types.ObjectId;
183
192
pi?: Types.ObjectId;
184
193
CompletionTime?: Date;
185
194
CompletionLogPending?: boolean;
186
195
DestructionTime?: Date;
187
196
Decos?: IDojoDecoDatabase[];
197
PaintBot?: Types.ObjectId;
188
198
Leaderboard?: IDojoLeaderboardEntry[];
189
199
}
190
200
@@ -200,6 +210,7 @@ export interface IDojoDecoClient {
200
210
CompletionTime?: IMongoDate;
201
211
RushPlatinum?: number;
202
212
PictureFrameInfo?: IPictureFrameInfo;
213
Pending?: boolean;
203
214
}
204
215
205
216
export interface IDojoDecoDatabase extends Omit<IDojoDecoClient, "id" | "CompletionTime"> {