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

XFESpaceNinjaServer

A simple server for a small space ninja game

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

XFEstudio/XFESpaceNinjaServer

feat: per-suit revive units (#3649)

Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/3649 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>

31279a6e
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

6 个文件 +43 -2
Modified src/controllers/api/inventoryController.ts +6 -0
@@ -136,6 +136,12 @@ export const inventoryController: RequestHandler = async (request, response) =>
136 136 }
137 137 }
138 138
139 for (const suit of inventory.Suits) {
140 if (suit.ExtraRemaining !== undefined) {
141 suit.ExtraRemaining = undefined;
142 }
143 }
144
139 145 // Handle weekly reset
140 146 const lastLoginWeek = Math.trunc(
141 147 (inventory.NextRefill.getTime() - (86400000 + KAHL_EPOCH)) / unixTimesInMs.week
Added src/controllers/api/refillRevivesController.ts +26 -0
@@ -0,0 +1,26 @@
1 import type { RequestHandler } from "express";
2 import { getAccountIdForRequest } from "../../services/loginService.ts";
3 import type { IOidWithLegacySupport } from "../../types/commonTypes.ts";
4 import { getInventory, updateCurrency } from "../../services/inventoryService.ts";
5 import { fromOid } from "../../helpers/inventoryHelpers.ts";
6 import { getJSONfromString } from "../../helpers/stringHelpers.ts";
7
8 export const refillRevivesController: RequestHandler = async (req, res) => {
9 const accountId = await getAccountIdForRequest(req);
10 const inventory = await getInventory(accountId, "PremiumCredits PremiumCreditsFree Suits");
11 const body = getJSONfromString<IRefillRevivesRequest>(String(req.body));
12 const suit = inventory.Suits.id(fromOid(body.SuitId));
13 if (suit?.ExtraRemaining !== undefined) {
14 suit.ExtraRemaining += body.Count;
15 updateCurrency(inventory, 3 * body.Count, true);
16 await inventory.save();
17 }
18 res.json({
19 PremiumCredits: inventory.PremiumCredits
20 });
21 };
22
23 interface IRefillRevivesRequest {
24 SuitId: IOidWithLegacySupport;
25 Count: number;
26 }
Modified src/models/inventoryModels/inventoryModel.ts +2 -1
@@ -1143,7 +1143,8 @@ const EquipmentSchema = new Schema<IEquipmentDatabase>(
1143 1143 Favorite: Boolean,
1144 1144 IsNew: Boolean,
1145 1145 AltWeaponModeId: Types.ObjectId,
1146 UpgradeNodes: Number
1146 UpgradeNodes: Number,
1147 ExtraRemaining: Number
1147 1148 },
1148 1149 { id: false }
1149 1150 );
Modified src/routes/api.ts +2 -0
@@ -119,6 +119,7 @@ import { purchaseGetController, purchasePostController } from "../controllers/ap
119 119 import { questControlController } from "../controllers/api/questControlController.ts";
120 120 import { queueDojoComponentDestructionController } from "../controllers/api/queueDojoComponentDestructionController.ts";
121 121 import { redeemPromoCodeController } from "../controllers/api/redeemPromoCodeController.ts";
122 import { refillRevivesController } from "../controllers/api/refillRevivesController.ts";
122 123 import { releasePetController } from "../controllers/api/releasePetController.ts";
123 124 import { removeFriendGetController, removeFriendPostController } from "../controllers/api/removeFriendController.ts";
124 125 import { removeFromAllianceController } from "../controllers/api/removeFromAllianceController.ts";
@@ -358,6 +359,7 @@ apiRouter.post("/projectionManager.php", projectionManagerController);
358 359 apiRouter.post("/purchase.php", purchasePostController);
359 360 apiRouter.post("/questControl.php", questControlController); // U17
360 361 apiRouter.post("/redeemPromoCode.php", redeemPromoCodeController);
362 apiRouter.post("/refillRevives.php", refillRevivesController);
361 363 apiRouter.post("/releasePet.php", releasePetController);
362 364 apiRouter.post("/removeFriend.php", removeFriendPostController);
363 365 apiRouter.post("/removeFromGuild.php", removeFromGuildPostController);
Modified src/services/inventoryService.ts +6 -1
@@ -2155,7 +2155,7 @@ export const applyClientEquipmentUpdates = (
2155 2155 ): void => {
2156 2156 const category = inventory[categoryName];
2157 2157
2158 gearArray.forEach(({ ItemId, XP, InfestationDate }) => {
2158 gearArray.forEach(({ ItemId, XP, InfestationDate, ExtraRemaining }) => {
2159 2159 const item = category.id(fromOid(ItemId));
2160 2160 if (!item) {
2161 2161 logger.warn(`Skipping unknown ${categoryName} item: id ${fromOid(ItemId)} not found`);
@@ -2202,6 +2202,11 @@ export const applyClientEquipmentUpdates = (
2202 2202 item.InfestationDate =
2203 2203 InfestationDate.$date.$numberLong == "2147483647000" ? new Date(0) : fromMongoDate(InfestationDate);
2204 2204 }
2205
2206 if (ExtraRemaining) {
2207 item.ExtraRemaining ??= 4;
2208 item.ExtraRemaining += ExtraRemaining;
2209 }
2205 2210 });
2206 2211 };
2207 2212
Modified src/types/equipmentTypes.ts +1 -0
@@ -65,6 +65,7 @@ export interface IEquipmentDatabase {
65 65 IsNew?: boolean;
66 66 AltWeaponModeId?: Types.ObjectId;
67 67 UpgradeNodes?: number;
68 ExtraRemaining?: number; // Revives remaining
68 69 _id: Types.ObjectId;
69 70 }
70 71