XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

SpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 1 Star 0
返回提交历史

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
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

6 个文件 +90 -3
Modified src/controllers/api/placeDecoInComponentController.ts +6 -1
@@ -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) {
Added src/controllers/api/setDojoComponentColorsController.ts +34 -0
@@ -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 }
Modified src/models/guildModel.ts +7 -1
@@ -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
Modified src/routes/api.ts +2 -0
@@ -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);
Modified src/services/guildService.ts +29 -0
@@ -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 }
Modified src/types/guildTypes.ts +12 -1
@@ -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"> {