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

fix: improve handling of rewardSeed + sessions (#3108)

This should fix the rewardSeed always being the same after creating a new session, which the game does by default with "public" mode. There is probably still some missing logic for keeping the rewardSeed in sync in the case where multiple people are actually in the same session. Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/3108 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>

9cd24ce7
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

4 个文件 +10 -4
Modified src/controllers/api/hostSessionController.ts +1 -1
@@ -18,7 +18,7 @@ const hostSessionController: RequestHandler = async (req, res) => {
18 18 // Pre-Specters of the Rail
19 19 res.send(session.sessionId.toString());
20 20 } else {
21 res.json({ sessionId: toOid2(session.sessionId, account.BuildLabel), rewardSeed: 99999999 });
21 res.json({ sessionId: toOid2(session.sessionId, account.BuildLabel), rewardSeed: session.rewardSeed });
22 22 }
23 23 };
24 24
Modified src/managers/sessionManager.ts +5 -0
@@ -1,3 +1,4 @@
1 import { generateRewardSeed } from "../services/rngService.ts";
1 2 import type { ISession, IFindSessionRequest, IFindSessionResponseSession } from "../types/session.ts";
2 3 import { logger } from "../utils/logger.ts";
3 4 import { JSONParse } from "json-with-bigint";
@@ -34,6 +35,9 @@ function createNewSession(sessionData: ISession, Creator: Types.ObjectId): ISess
34 35 freePrivate: sessionData.freePrivate || 0,
35 36 fullReset: 0
36 37 };
38 if (newSession.rewardSeed == -1) {
39 newSession.rewardSeed = generateRewardSeed();
40 }
37 41 sessions.push(newSession);
38 42 return newSession;
39 43 }
@@ -86,6 +90,7 @@ function getSessionByCreatorID(creatorId: string | Types.ObjectId): ISession | u
86 90 }
87 91
88 92 function updateSession(sessionId: string | Types.ObjectId, sessionData: string): boolean {
93 logger.debug(`session update:`, sessionData);
89 94 const session = sessions.find(session => session.sessionId.equals(sessionId));
90 95 if (!session) return false;
91 96 try {
Modified src/services/missionInventoryUpdateService.ts +3 -2
@@ -2220,11 +2220,12 @@ function getRandomMissionDrops(
2220 2220 if (rewardManifests.length != 0) {
2221 2221 logger.debug(`generating random mission rewards`, { rewardManifests, rotations });
2222 2222 }
2223 if (RewardInfo.rewardSeed) {
2223 // Disabling this warning because the inventory reward seed is only what is used when matchmaking is set to solo.
2224 /*if (RewardInfo.rewardSeed) {
2224 2225 if (RewardInfo.rewardSeed != inventory.RewardSeed) {
2225 2226 logger.warn(`RewardSeed mismatch:`, { client: RewardInfo.rewardSeed, database: inventory.RewardSeed });
2226 2227 }
2227 }
2228 }*/
2228 2229 const rng = new SRng(BigInt(RewardInfo.rewardSeed ?? generateRewardSeed()) ^ 0xffffffffffffffffn);
2229 2230 rewardManifests.forEach(name => {
2230 2231 const table = ExportRewards[name];
Modified src/types/session.ts +1 -1
@@ -18,7 +18,7 @@ export interface ISession {
18 18 maps?: string[];
19 19 originalSessionId?: string;
20 20 customSettings?: string;
21 rewardSeed?: number;
21 rewardSeed?: number | bigint;
22 22 guildId?: string;
23 23 buildId?: number | bigint;
24 24 platform?: number;