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

chore: add gameToBuildVersion (#3104)

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

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

代码差异

21 个文件 +127 -73
Modified src/controllers/api/artifactsController.ts +2 -1
@@ -9,6 +9,7 @@ import type {
9 9 import { addMods, getInventory } from "../../services/inventoryService.ts";
10 10 import { broadcastInventoryUpdate } from "../../services/wsService.ts";
11 11 import { fromOid, version_compare } from "../../helpers/inventoryHelpers.ts";
12 import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
12 13
13 14 export const artifactsController: RequestHandler = async (req, res) => {
14 15 const account = await getAccountForRequest(req);
@@ -24,7 +25,7 @@ export const artifactsController: RequestHandler = async (req, res) => {
24 25 if (
25 26 "ignoreBuildLabel" in req.query ||
26 27 !account.BuildLabel ||
27 version_compare(account.BuildLabel, "2016.08.19.17.12") >= 0
28 version_compare(account.BuildLabel, gameToBuildVersion["18.18.0"]) >= 0
28 29 ) {
29 30 const safeUpgradeFingerprint = UpgradeFingerprint || '{"lvl":0}';
30 31 const parsedUpgradeFingerprint = JSON.parse(safeUpgradeFingerprint) as { lvl: number };
Modified src/controllers/api/deleteSessionController.ts +2 -1
@@ -2,11 +2,12 @@ import type { RequestHandler } from "express";
2 2 import { deleteSession } from "../../managers/sessionManager.ts";
3 3 import { getAccountForRequest } from "../../services/loginService.ts";
4 4 import { version_compare } from "../../helpers/inventoryHelpers.ts";
5 import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
5 6
6 7 const deleteSessionController: RequestHandler = async (_req, res) => {
7 8 const account = await getAccountForRequest(_req);
8 9 deleteSession(_req.query.sessionId as string);
9 if (account.BuildLabel && version_compare(account.BuildLabel, "2016.07.08.16.56") < 0) {
10 if (account.BuildLabel && version_compare(account.BuildLabel, gameToBuildVersion["18.16.0"]) < 0) {
10 11 // Pre-Specters of the Rail
11 12 res.send(_req.query.sessionId as string); // Unsure if this is correct, but the client is chill with it
12 13 } else {
Modified src/controllers/api/focusController.ts +2 -1
@@ -7,12 +7,13 @@ import { logger } from "../../utils/logger.ts";
7 7 import { ExportFocusUpgrades } from "warframe-public-export-plus";
8 8 import { Inventory } from "../../models/inventoryModels/inventoryModel.ts";
9 9 import { version_compare } from "../../helpers/inventoryHelpers.ts";
10 import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
10 11
11 12 export const focusController: RequestHandler = async (req, res) => {
12 13 const account = await getAccountForRequest(req);
13 14
14 15 let op = req.query.op as string;
15 const focus2 = account.BuildLabel && version_compare(account.BuildLabel, "2022.04.29.12.53") < 0;
16 const focus2 = account.BuildLabel && version_compare(account.BuildLabel, gameToBuildVersion["31.5.0"]) < 0;
16 17 if (focus2) {
17 18 // Focus 2.0
18 19 switch (req.query.op) {
Modified src/controllers/api/hostSessionController.ts +2 -1
@@ -5,6 +5,7 @@ import { logger } from "../../utils/logger.ts";
5 5 import type { ISession } from "../../types/session.ts";
6 6 import { JSONParse } from "json-with-bigint";
7 7 import { toOid2, version_compare } from "../../helpers/inventoryHelpers.ts";
8 import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
8 9
9 10 const hostSessionController: RequestHandler = async (req, res) => {
10 11 const account = await getAccountForRequest(req);
@@ -13,7 +14,7 @@ const hostSessionController: RequestHandler = async (req, res) => {
13 14 const session = createNewSession(hostSessionRequest, account._id);
14 15 logger.debug(`New Session Created`, { session });
15 16
16 if (account.BuildLabel && version_compare(account.BuildLabel, "2016.07.08.16.56") < 0) {
17 if (account.BuildLabel && version_compare(account.BuildLabel, gameToBuildVersion["18.16.0"]) < 0) {
17 18 // Pre-Specters of the Rail
18 19 res.send(session.sessionId.toString());
19 20 } else {
Modified src/controllers/api/inboxController.ts +2 -1
@@ -26,6 +26,7 @@ import { unixTimesInMs } from "../../constants/timeConstants.ts";
26 26 import { config } from "../../services/configService.ts";
27 27 import { Types } from "mongoose";
28 28 import { version_compare } from "../../helpers/inventoryHelpers.ts";
29 import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
29 30
30 31 export const inboxController: RequestHandler = async (req, res) => {
31 32 const { deleteId, lastMessage: latestClientMessageId, messageId } = req.query;
@@ -150,7 +151,7 @@ const createNewEventMessages = async (req: Request): Promise<void> => {
150 151 const baroEnd = baroStart + unixTimesInMs.day * 14;
151 152 const baroActualStart = baroStart + unixTimesInMs.day * (config.worldState?.baroAlwaysAvailable ? 0 : 12);
152 153 const evilBaroStage =
153 account.BuildLabel && version_compare(account.BuildLabel, "2025.10.14.16.10") < 0
154 account.BuildLabel && version_compare(account.BuildLabel, gameToBuildVersion["40.0.0"]) < 0
154 155 ? 0
155 156 : (config.worldState?.evilBaroStage ?? 0);
156 157 const evilBaroTransmission = [
Modified src/controllers/api/infestedFoundryController.ts +2 -3
@@ -21,6 +21,7 @@ import {
21 21 handleSubsumeCompletion
22 22 } from "../../services/infestedFoundryService.ts";
23 23 import { sendWsBroadcastToGame } from "../../services/wsService.ts";
24 import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
24 25
25 26 export const infestedFoundryController: RequestHandler = async (req, res) => {
26 27 const account = await getAccountForRequest(req);
@@ -76,12 +77,10 @@ export const infestedFoundryController: RequestHandler = async (req, res) => {
76 77 if (!inventory.infiniteHelminthMaterials) {
77 78 let type: string;
78 79 let count: number;
79 if (account.BuildLabel && version_compare(account.BuildLabel, "2025.05.20.10.18") < 0) {
80 // < 38.6.0
80 if (account.BuildLabel && version_compare(account.BuildLabel, gameToBuildVersion["38.6.0"]) < 0) {
81 81 type = "/Lotus/Types/Items/InfestedFoundry/HelminthBile";
82 82 count = 300;
83 83 } else {
84 // >= 38.6.0
85 84 type =
86 85 archonCrystalRemovalResource[
87 86 suit.ArchonCrystalUpgrades![request.Slot].Color!.replace("_MYTHIC", "")
Modified src/controllers/api/inventoryController.ts +14 -11
@@ -45,6 +45,7 @@ import { EquipmentFeatures } from "../../types/equipmentTypes.ts";
45 45 import { generateRewardSeed } from "../../services/rngService.ts";
46 46 import { getInvasionByOid, getWorldState } from "../../services/worldStateService.ts";
47 47 import { createMessage } from "../../services/inboxService.ts";
48 import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
48 49
49 50 export const inventoryController: RequestHandler = async (request, response) => {
50 51 const account = await getAccountForRequest(request);
@@ -465,7 +466,7 @@ export const getInventoryResponse = async (
465 466 inventoryResponse.Nemesis = undefined;
466 467 }
467 468
468 if (version_compare(buildLabel, "2019.03.07.20.21") < 0) {
469 if (version_compare(buildLabel, gameToBuildVersion["24.4.0"]) < 0) {
469 470 // Builds before U24.4.0 handle equipment features differently
470 471 for (const category of equipmentKeys) {
471 472 for (const item of inventoryResponse[category]) {
@@ -481,25 +482,25 @@ export const getInventoryResponse = async (
481 482 }
482 483 }
483 484
484 if (version_compare(buildLabel, "2018.02.22.14.34") < 0) {
485 if (version_compare(buildLabel, gameToBuildVersion["22.13.4"]) < 0) {
485 486 const personalRoomsDb = await getPersonalRooms(inventory.accountOwnerId.toString());
486 487 const personalRooms = personalRoomsDb.toJSON<IPersonalRoomsClient>();
487 488 inventoryResponse.Ship = personalRooms.Ship;
488 489
489 if (version_compare(buildLabel, "2016.12.21.19.13") <= 0) {
490 if (version_compare(buildLabel, gameToBuildVersion["19.5.0"]) <= 0) {
490 491 // U19.5 and below use $id instead of $oid
491 492 for (const category of equipmentKeys) {
492 493 for (const item of inventoryResponse[category]) {
493 494 toLegacyOid(item.ItemId);
494 if (version_compare(buildLabel, "2015.05.14.16.29") < 0) {
495 if (version_compare(buildLabel, gameToBuildVersion["16.5.5"]) < 0) {
495 496 // Appearance config format is different for versions before U16.5
496 497 for (const config of item.Configs) {
497 if (version_compare(buildLabel, "2015.03.21.08.17") < 0) {
498 if (version_compare(buildLabel, gameToBuildVersion["16.0.2"]) < 0) {
498 499 config.Customization = {
499 500 Colors: convertIColorToLegacyColorsWithAtt(config.pricol, config.attcol),
500 501 Skins: config.Skins ?? []
501 502 };
502 } else if (version_compare(buildLabel, "2015.03.21.08.17") >= 0) {
503 } else if (version_compare(buildLabel, gameToBuildVersion["16.0.2"]) >= 0) {
503 504 config.Colors = convertIColorToLegacyColorsWithAtt(
504 505 config.pricol,
505 506 config.attcol
@@ -551,7 +552,7 @@ export const getInventoryResponse = async (
551 552
552 553 for (const upgrade of inventoryResponse.Upgrades) {
553 554 toLegacyOid(upgrade.ItemId);
554 if (version_compare(buildLabel, "2016.08.19.17.12") < 0) {
555 if (version_compare(buildLabel, gameToBuildVersion["18.18.0"]) < 0) {
555 556 // Pre-U18.18 builds use a different UpgradeFingerprint format
556 557 let rank: number = 0;
557 558 if (upgrade.UpgradeFingerprint) {
@@ -563,7 +564,7 @@ export const getInventoryResponse = async (
563 564 );
564 565 }
565 566 upgrade.UpgradeFingerprint = `lvl=${rank}|`;
566 if (version_compare(buildLabel, "2014.04.10.17.47") < 0) {
567 if (version_compare(buildLabel, gameToBuildVersion["13.0.0"]) < 0) {
567 568 // Pre-U10 builds
568 569 if (
569 570 !upgrade.AmountRemaining ||
@@ -623,7 +624,7 @@ export const getInventoryResponse = async (
623 624 inventoryResponse.CurrentLoadOutIds.length > 0 &&
624 625 inventoryResponse.LoadOutPresets.NORMAL.length > 0
625 626 ) {
626 if (version_compare(buildLabel, "2014.07.21.18.38") >= 0) {
627 if (version_compare(buildLabel, gameToBuildVersion["14.0.0"]) >= 0) {
627 628 // U14-U15 expect a different response than any other version, where the client is pulling loadout data from has not been found yet
628 629 // As such, loading loadouts is currently unsupported for these versions
629 630 logger.warn("Loadouts are currently unsupported in U14-U15, loadouts will be undefined");
@@ -682,7 +683,9 @@ const mapLegacyLoadoutConfig = (
682 683 const l = normPreset.l?.ItemId?.$oid ? inventory.LongGuns.id(normPreset.l.ItemId.$oid) : null;
683 684 const m = normPreset.m?.ItemId?.$oid ? inventory.Melee.id(normPreset.m.ItemId.$oid) : null;
684 685 const loadoutConfig = {
685 ItemId: { $id: version_compare(buildLabel, "2014.07.21.18.38") < 0 ? "Current" : normPreset.ItemId.$oid },
686 ItemId: {
687 $id: version_compare(buildLabel, gameToBuildVersion["14.0.0"]) < 0 ? "Current" : normPreset.ItemId.$oid
688 },
686 689 Name: normPreset.n ?? "Default Loadout",
687 690 Presets: [
688 691 {
@@ -791,7 +794,7 @@ const mapLegacyLoadoutConfig = (
791 794 }
792 795 }
793 796
794 if (version_compare(buildLabel, "2014.10.24.08.24") >= 0) {
797 if (version_compare(buildLabel, gameToBuildVersion["15.0.0"]) >= 0) {
795 798 if (inventory.CurrentLoadOutIds.length > 2 && loadoutPresets.ARCHWING.length > 0) {
796 799 const archPreset = loadoutPresets.ARCHWING.find(
797 800 x => x.ItemId.$oid == inventory.CurrentLoadOutIds[2].toString()
Modified src/controllers/api/loginController.ts +15 -18
@@ -14,6 +14,7 @@ import { createMessage } from "../../services/inboxService.ts";
14 14 import { fromStoreItem } from "../../services/itemDataService.ts";
15 15 import { getTokenForClient, getTunablesForClient } from "../../services/tunablesService.ts";
16 16 import type { AddressInfo } from "node:net";
17 import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
17 18
18 19 export const loginController: RequestHandler = async (request, response) => {
19 20 const loginRequest = JSON.parse(String(request.body)) as ILoginRequest; // parse octet stream of json data to json object
@@ -71,7 +72,7 @@ export const loginController: RequestHandler = async (request, response) => {
71 72
72 73 if (account.Nonce && account.ClientType != "webui" && !account.Dropped && !loginRequest.kick) {
73 74 // U17 seems to handle "nonce still set" like a login failure.
74 if (version_compare(buildLabel, "2015.12.05.18.07") >= 0) {
75 if (version_compare(buildLabel, gameToBuildVersion["18.0.2"]) >= 0) {
75 76 response.status(400).send({ error: "nonce still set" });
76 77 return;
77 78 }
@@ -119,7 +120,7 @@ const createLoginResponse = (request: Request, account: IDatabaseAccountJson, bu
119 120 Nonce: account.Nonce,
120 121 BuildLabel: buildLabel
121 122 };
122 if (version_compare(buildLabel, "2014.04.10.17.47") >= 0) {
123 if (version_compare(buildLabel, gameToBuildVersion["13.0.0"]) >= 0) {
123 124 // U13 and up
124 125 resp.CountryCode = account.CountryCode;
125 126 } else {
@@ -128,33 +129,29 @@ const createLoginResponse = (request: Request, account: IDatabaseAccountJson, bu
128 129 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
129 130 resp.SteamId = "0";
130 131 }
131 if (version_compare(buildLabel, "2015.02.13.10.41") >= 0) {
132 if (version_compare(buildLabel, gameToBuildVersion["15.14.1"]) >= 0) {
132 133 resp.NRS = [config.nrsAddress ?? myAddress];
133 134 }
134 if (version_compare(buildLabel, "2015.05.14.16.29") >= 0) {
135 // U17 and up
135 if (version_compare(buildLabel, gameToBuildVersion["16.5.5"]) >= 0) {
136 136 resp.IRC = [config.ircAddress ?? myAddress];
137 137 }
138 if (version_compare(buildLabel, "2018.11.08.14.45") >= 0) {
139 // U24 and up
138 if (version_compare(buildLabel, gameToBuildVersion["24.0.0"]) >= 0) {
140 139 resp.ConsentNeeded = account.ConsentNeeded;
141 140 resp.TrackedSettings = account.TrackedSettings;
142 141 }
143 if (version_compare(buildLabel, "2019.08.29.20.01") >= 0) {
144 // U25.7 and up
142 if (version_compare(buildLabel, gameToBuildVersion["25.7.0"]) >= 0) {
145 143 resp.ForceLogoutVersion = account.ForceLogoutVersion;
146 144 }
147 if (version_compare(buildLabel, "2019.10.31.22.42") >= 0) {
148 // U26 and up
145 if (version_compare(buildLabel, gameToBuildVersion["26.0.0"]) >= 0) {
149 146 resp.Groups = [];
150 147 }
151 if (version_compare(buildLabel, "2021.04.13.19.58") >= 0) {
148 if (version_compare(buildLabel, gameToBuildVersion["30.0.0"]) >= 0) {
152 149 resp.DTLS = config.dtls ?? 0; // bit 0 enables DTLS. if enabled, additional bits can be set, e.g. bit 2 to enable logging. on live, the value is 99.
153 150 }
154 if (version_compare(buildLabel, "2022.04.29.12.53") >= 0) {
151 if (version_compare(buildLabel, gameToBuildVersion["31.5.0"]) >= 0) {
155 152 resp.ClientType = account.ClientType;
156 153 }
157 if (version_compare(buildLabel, "2022.09.06.19.24") >= 0) {
154 if (version_compare(buildLabel, gameToBuildVersion["32.0.0"]) >= 0) {
158 155 resp.CrossPlatformAllowed = account.CrossPlatformAllowed;
159 156 resp.HUB = `${myUrlBase}/api/`;
160 157
@@ -168,11 +165,11 @@ const createLoginResponse = (request: Request, account: IDatabaseAccountJson, bu
168 165 minute
169 166 ).toString();
170 167 }
171 if (version_compare(buildLabel, "2023.04.25.23.40") >= 0) {
172 if (version_compare(buildLabel, "2025.10.14.16.10") >= 0) {
168 if (version_compare(buildLabel, gameToBuildVersion["33.0.0"]) >= 0) {
169 if (version_compare(buildLabel, gameToBuildVersion["40.0.0"]) >= 0) {
173 170 // U40 is when they changed this from content.warframe.com/dynamic/ to api.warframe.com/cdn/
174 171 resp.platformCDNs = [`${myUrlBase}/cdn/`];
175 } else if (version_compare(buildLabel, "2025.08.26.09.49") >= 0) {
172 } else if (version_compare(buildLabel, gameToBuildVersion["39.1.0"]) >= 0) {
176 173 // U39.1 is when they made dynamic/ explicit
177 174 resp.platformCDNs = [`${myUrlBase}/dynamic/`];
178 175 } else {
@@ -188,7 +185,7 @@ const createLoginResponse = (request: Request, account: IDatabaseAccountJson, bu
188 185 version_compare(clientMod.substring(21), "0.12.0") >= 0
189 186 ) {
190 187 const tunables = getTunablesForClient((request.socket.address() as AddressInfo).address);
191 if (version_compare(buildLabel, "2015.05.14.16.29") < 0) {
188 if (version_compare(buildLabel, gameToBuildVersion["16.5.5"]) < 0) {
192 189 tunables.irc = config.ircAddress ?? myAddress;
193 190 }
194 191 raw += "\t" + JSON.stringify(tunables);
Modified src/controllers/api/setGuildMotdController.ts +2 -1
@@ -6,6 +6,7 @@ import { getAccountForRequest, getSuffixedName } from "../../services/loginServi
6 6 import type { ILongMOTD } from "../../types/guildTypes.ts";
7 7 import { GuildPermission } from "../../types/guildTypes.ts";
8 8 import type { RequestHandler } from "express";
9 import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
9 10
10 11 export const setGuildMotdController: RequestHandler = async (req, res) => {
11 12 const account = await getAccountForRequest(req);
@@ -57,7 +58,7 @@ export const setGuildMotdController: RequestHandler = async (req, res) => {
57 58 await guild.save();
58 59 }
59 60
60 if (!account.BuildLabel || version_compare(account.BuildLabel, "2020.11.04.18.58") > 0) {
61 if (!account.BuildLabel || version_compare(account.BuildLabel, gameToBuildVersion["29.3.1"]) > 0) {
61 62 res.json({ IsLongMOTD, MOTD });
62 63 } else {
63 64 res.send(MOTD).end();
Modified src/controllers/api/upgradesController.ts +2 -1
@@ -12,6 +12,7 @@ import { sendWsBroadcastTo } from "../../services/wsService.ts";
12 12 import type { IEquipmentDatabase } from "../../types/equipmentTypes.ts";
13 13 import { EquipmentFeatures } from "../../types/equipmentTypes.ts";
14 14 import { Types } from "mongoose";
15 import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
15 16
16 17 export const upgradesController: RequestHandler = async (req, res) => {
17 18 const account = await getAccountForRequest(req);
@@ -19,7 +20,7 @@ export const upgradesController: RequestHandler = async (req, res) => {
19 20 const inventory = await getInventory(accountId);
20 21 const inventoryChanges: IInventoryChanges = {};
21 22
22 if (account.BuildLabel && version_compare(account.BuildLabel, "2019.03.07.20.21") < 0) {
23 if (account.BuildLabel && version_compare(account.BuildLabel, gameToBuildVersion["24.4.0"]) < 0) {
23 24 // Builds before U24.4.0 have a different request format
24 25 const payload = JSON.parse(String(req.body)) as IUpgradesRequestLegacy;
25 26 const itemId = fromOid(payload.Weapon.ItemId);
Modified src/controllers/dynamic/worldStateController.ts +2 -1
@@ -1,6 +1,7 @@
1 1 import type { RequestHandler } from "express";
2 2 import { getWorldState, populateDailyDeal, populateFissures } from "../../services/worldStateService.ts";
3 3 import { version_compare } from "../../helpers/inventoryHelpers.ts";
4 import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
4 5
5 6 export const worldStateController: RequestHandler = async (req, res) => {
6 7 const buildLabel = req.query.buildLabel as string | undefined;
@@ -9,7 +10,7 @@ export const worldStateController: RequestHandler = async (req, res) => {
9 10 const populatePromises = [populateDailyDeal(worldState)];
10 11
11 12 // Omitting void fissures for versions prior to Dante Unbound to avoid script errors.
12 if (!buildLabel || version_compare(buildLabel, "2024.03.24.20.00") >= 0) {
13 if (!buildLabel || version_compare(buildLabel, gameToBuildVersion["35.5.0"]) >= 0) {
13 14 populatePromises.push(populateFissures(worldState));
14 15 }
15 16
Modified src/controllers/pay/getSkuCatalogController.ts +2 -1
@@ -1,10 +1,11 @@
1 1 import type { RequestHandler } from "express";
2 2 import { getAccountForRequest } from "../../services/loginService.ts";
3 3 import { version_compare } from "../../helpers/inventoryHelpers.ts";
4 import gameToBuildVersion from "../../../static/fixed_responses/gameToBuildVersion.json" with { type: "json" };
4 5
5 6 export const getSkuCatalogController: RequestHandler = async (req, res) => {
6 7 const account = await getAccountForRequest(req);
7 if (!account.BuildLabel || version_compare(account.BuildLabel, "2025.10.14.16.10") >= 0) {
8 if (!account.BuildLabel || version_compare(account.BuildLabel, gameToBuildVersion["40.0.0"]) >= 0) {
8 9 res.sendFile("static/fixed_responses/getSkuCatalogU40.json", { root: "./" });
9 10 } else {
10 11 res.sendFile("static/fixed_responses/getSkuCatalog.json", { root: "./" });
Modified src/helpers/inventoryHelpers.ts +2 -1
Modified src/helpers/nemesisHelpers.ts +12 -11
Modified src/services/guildService.ts +2 -1
Modified src/services/inventoryService.ts +3 -2
Modified src/services/itemDataService.ts +2 -1
Modified src/services/missionInventoryUpdateService.ts +2 -1
Modified src/services/saveLoadoutService.ts +4 -3
Modified src/services/worldStateService.ts +13 -12
Added static/fixed_responses/gameToBuildVersion.json +38 -0