返回提交历史
Modified
src/controllers/api/hostSessionController.ts
+1
-1
Modified
src/managers/sessionManager.ts
+5
-0
Modified
src/services/missionInventoryUpdateService.ts
+3
-2
Modified
src/types/session.ts
+1
-1
XFEstudio/SpaceNinjaServer
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
代码差异
4 个文件
+10
-4
@@ -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
@@ -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 {
@@ -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];
@@ -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;