forked from OpenWF/SpaceNinjaServer
		
	Compare commits
	
		
			9 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9369e6cc5a | |||
| 49eb14f758 | |||
| 5e455d1e90 | |||
| 4d93dc80dc | |||
| 38326fc452 | |||
| 6e9c787c59 | |||
| 82fe598056 | |||
| bc271216ac | |||
| c5463166a8 | 
@ -1,9 +1,17 @@
 | 
				
			|||||||
import type { RequestHandler } from "express";
 | 
					import type { RequestHandler } from "express";
 | 
				
			||||||
import { deleteSession } from "../../managers/sessionManager.ts";
 | 
					import { deleteSession } from "../../managers/sessionManager.ts";
 | 
				
			||||||
 | 
					import { getAccountForRequest } from "../../services/loginService.ts";
 | 
				
			||||||
 | 
					import { version_compare } from "../../helpers/inventoryHelpers.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const deleteSessionController: RequestHandler = (_req, res) => {
 | 
					const deleteSessionController: RequestHandler = async (_req, res) => {
 | 
				
			||||||
 | 
					    const account = await getAccountForRequest(_req);
 | 
				
			||||||
    deleteSession(_req.query.sessionId as string);
 | 
					    deleteSession(_req.query.sessionId as string);
 | 
				
			||||||
    res.sendStatus(200);
 | 
					    if (account.BuildLabel && version_compare(account.BuildLabel, "2016.07.08.16.56") < 0) {
 | 
				
			||||||
 | 
					        // Pre-Specters of the Rail
 | 
				
			||||||
 | 
					        res.send(_req.query.sessionId as string); // Unsure if this is correct, but the client is chill with it
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        res.sendStatus(200);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export { deleteSessionController };
 | 
					export { deleteSessionController };
 | 
				
			||||||
 | 
				
			|||||||
@ -13,8 +13,8 @@ const hostSessionController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
    const session = createNewSession(hostSessionRequest, account._id);
 | 
					    const session = createNewSession(hostSessionRequest, account._id);
 | 
				
			||||||
    logger.debug(`New Session Created`, { session });
 | 
					    logger.debug(`New Session Created`, { session });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (account.BuildLabel && version_compare(account.BuildLabel, "2015.03.21.08.17") < 0) {
 | 
					    if (account.BuildLabel && version_compare(account.BuildLabel, "2016.07.08.16.56") < 0) {
 | 
				
			||||||
        // U15 or below
 | 
					        // Pre-Specters of the Rail
 | 
				
			||||||
        res.send(session.sessionId.toString());
 | 
					        res.send(session.sessionId.toString());
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        res.json({ sessionId: toOid2(session.sessionId, account.BuildLabel), rewardSeed: 99999999 });
 | 
					        res.json({ sessionId: toOid2(session.sessionId, account.BuildLabel), rewardSeed: 99999999 });
 | 
				
			||||||
 | 
				
			|||||||
@ -310,12 +310,13 @@ export const getInventoryResponse = async (
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (inventory.skipAllDialogue) {
 | 
					    if (inventory.skipAllDialogue) {
 | 
				
			||||||
        inventoryResponse.TauntHistory = [
 | 
					        inventoryResponse.TauntHistory ??= [];
 | 
				
			||||||
            {
 | 
					        if (!inventoryResponse.TauntHistory.find(x => x.node == "TreasureTutorial")) {
 | 
				
			||||||
 | 
					            inventoryResponse.TauntHistory.push({
 | 
				
			||||||
                node: "TreasureTutorial",
 | 
					                node: "TreasureTutorial",
 | 
				
			||||||
                state: "TS_COMPLETED"
 | 
					                state: "TS_COMPLETED"
 | 
				
			||||||
            }
 | 
					            });
 | 
				
			||||||
        ];
 | 
					        }
 | 
				
			||||||
        for (const str of allDialogue) {
 | 
					        for (const str of allDialogue) {
 | 
				
			||||||
            addString(inventoryResponse.NodeIntrosCompleted, str);
 | 
					            addString(inventoryResponse.NodeIntrosCompleted, str);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -109,12 +109,19 @@ const createLoginResponse = (
 | 
				
			|||||||
    const resp: ILoginResponse = {
 | 
					    const resp: ILoginResponse = {
 | 
				
			||||||
        id: account.id,
 | 
					        id: account.id,
 | 
				
			||||||
        DisplayName: account.DisplayName,
 | 
					        DisplayName: account.DisplayName,
 | 
				
			||||||
        CountryCode: account.CountryCode,
 | 
					 | 
				
			||||||
        AmazonAuthToken: account.AmazonAuthToken,
 | 
					        AmazonAuthToken: account.AmazonAuthToken,
 | 
				
			||||||
        AmazonRefreshToken: account.AmazonRefreshToken,
 | 
					        AmazonRefreshToken: account.AmazonRefreshToken,
 | 
				
			||||||
        Nonce: account.Nonce,
 | 
					        Nonce: account.Nonce,
 | 
				
			||||||
        BuildLabel: buildLabel
 | 
					        BuildLabel: buildLabel
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    if (version_compare(buildLabel, "2014.10.24.08.24") >= 0) {
 | 
				
			||||||
 | 
					        // U15 and up
 | 
				
			||||||
 | 
					        resp.CountryCode = account.CountryCode;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        // U8
 | 
				
			||||||
 | 
					        resp.NatHash = "0";
 | 
				
			||||||
 | 
					        resp.SteamId = "0";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    if (version_compare(buildLabel, "2015.02.13.10.41") >= 0) {
 | 
					    if (version_compare(buildLabel, "2015.02.13.10.41") >= 0) {
 | 
				
			||||||
        resp.NRS = [config.nrsAddress ?? myAddress];
 | 
					        resp.NRS = [config.nrsAddress ?? myAddress];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -37,7 +37,7 @@ export const manageQuestsController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
    switch (operation) {
 | 
					    switch (operation) {
 | 
				
			||||||
        case "completeAll": {
 | 
					        case "completeAll": {
 | 
				
			||||||
            for (const questKey of inventory.QuestKeys) {
 | 
					            for (const questKey of inventory.QuestKeys) {
 | 
				
			||||||
                await completeQuest(inventory, questKey.ItemType);
 | 
					                await completeQuest(inventory, questKey.ItemType, undefined);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -72,7 +72,7 @@ export const manageQuestsController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                await completeQuest(inventory, questItemType);
 | 
					                await completeQuest(inventory, questItemType, undefined);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -137,7 +137,7 @@ export const manageQuestsController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                if (currentStage + 1 == questManifest.chainStages?.length) {
 | 
					                if (currentStage + 1 == questManifest.chainStages?.length) {
 | 
				
			||||||
                    logger.debug(`Trying to complete last stage with nextStage, calling completeQuest instead`);
 | 
					                    logger.debug(`Trying to complete last stage with nextStage, calling completeQuest instead`);
 | 
				
			||||||
                    await completeQuest(inventory, questKey.ItemType, true);
 | 
					                    await completeQuest(inventory, questKey.ItemType, undefined, true);
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    if (run > 0) {
 | 
					                    if (run > 0) {
 | 
				
			||||||
                        questKey.Progress[currentStage + 1].c = run;
 | 
					                        questKey.Progress[currentStage + 1].c = run;
 | 
				
			||||||
@ -151,10 +151,14 @@ export const manageQuestsController: RequestHandler = async (req, res) => {
 | 
				
			|||||||
                    });
 | 
					                    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if (currentStage > 0) {
 | 
					                    if (currentStage > 0) {
 | 
				
			||||||
                        await giveKeyChainMissionReward(inventory, {
 | 
					                        await giveKeyChainMissionReward(
 | 
				
			||||||
                            KeyChain: questKey.ItemType,
 | 
					                            inventory,
 | 
				
			||||||
                            ChainStage: currentStage
 | 
					                            {
 | 
				
			||||||
                        });
 | 
					                                KeyChain: questKey.ItemType,
 | 
				
			||||||
 | 
					                                ChainStage: currentStage
 | 
				
			||||||
 | 
					                            },
 | 
				
			||||||
 | 
					                            undefined
 | 
				
			||||||
 | 
					                        );
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
				
			|||||||
@ -10,6 +10,7 @@ import { addPendingFriendController } from "../controllers/api/addPendingFriendC
 | 
				
			|||||||
import { addToAllianceController } from "../controllers/api/addToAllianceController.ts";
 | 
					import { addToAllianceController } from "../controllers/api/addToAllianceController.ts";
 | 
				
			||||||
import { addToGuildController } from "../controllers/api/addToGuildController.ts";
 | 
					import { addToGuildController } from "../controllers/api/addToGuildController.ts";
 | 
				
			||||||
import { adoptPetController } from "../controllers/api/adoptPetController.ts";
 | 
					import { adoptPetController } from "../controllers/api/adoptPetController.ts";
 | 
				
			||||||
 | 
					import { aggregateSessionsController } from "../controllers/dynamic/aggregateSessionsController.ts";
 | 
				
			||||||
import { apartmentController } from "../controllers/api/apartmentController.ts";
 | 
					import { apartmentController } from "../controllers/api/apartmentController.ts";
 | 
				
			||||||
import { arcaneCommonController } from "../controllers/api/arcaneCommonController.ts";
 | 
					import { arcaneCommonController } from "../controllers/api/arcaneCommonController.ts";
 | 
				
			||||||
import { archonFusionController } from "../controllers/api/archonFusionController.ts";
 | 
					import { archonFusionController } from "../controllers/api/archonFusionController.ts";
 | 
				
			||||||
@ -170,6 +171,7 @@ import { upgradeOperatorController } from "../controllers/api/upgradeOperatorCon
 | 
				
			|||||||
import { upgradesController } from "../controllers/api/upgradesController.ts";
 | 
					import { upgradesController } from "../controllers/api/upgradesController.ts";
 | 
				
			||||||
import { valenceSwapController } from "../controllers/api/valenceSwapController.ts";
 | 
					import { valenceSwapController } from "../controllers/api/valenceSwapController.ts";
 | 
				
			||||||
import { wishlistController } from "../controllers/api/wishlistController.ts";
 | 
					import { wishlistController } from "../controllers/api/wishlistController.ts";
 | 
				
			||||||
 | 
					import { worldStateController } from "../controllers/dynamic/worldStateController.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const apiRouter = express.Router();
 | 
					const apiRouter = express.Router();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -235,6 +237,7 @@ apiRouter.get("/surveys.php", surveysController);
 | 
				
			|||||||
apiRouter.get("/trading.php", tradingController);
 | 
					apiRouter.get("/trading.php", tradingController);
 | 
				
			||||||
apiRouter.get("/updateSession.php", updateSessionGetController);
 | 
					apiRouter.get("/updateSession.php", updateSessionGetController);
 | 
				
			||||||
apiRouter.get("/upgradeOperator.php", upgradeOperatorController);
 | 
					apiRouter.get("/upgradeOperator.php", upgradeOperatorController);
 | 
				
			||||||
 | 
					apiRouter.get("/worldState.php", worldStateController); // U8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// post
 | 
					// post
 | 
				
			||||||
apiRouter.post("/abortDojoComponent.php", abortDojoComponentController);
 | 
					apiRouter.post("/abortDojoComponent.php", abortDojoComponentController);
 | 
				
			||||||
@ -246,6 +249,7 @@ apiRouter.post("/addPendingFriend.php", addPendingFriendController);
 | 
				
			|||||||
apiRouter.post("/addToAlliance.php", addToAllianceController);
 | 
					apiRouter.post("/addToAlliance.php", addToAllianceController);
 | 
				
			||||||
apiRouter.post("/addToGuild.php", addToGuildController);
 | 
					apiRouter.post("/addToGuild.php", addToGuildController);
 | 
				
			||||||
apiRouter.post("/adoptPet.php", adoptPetController);
 | 
					apiRouter.post("/adoptPet.php", adoptPetController);
 | 
				
			||||||
 | 
					apiRouter.post("/aggregateSessions.php", aggregateSessionsController); // Pre-Specters of the Rail builds
 | 
				
			||||||
apiRouter.post("/arcaneCommon.php", arcaneCommonController);
 | 
					apiRouter.post("/arcaneCommon.php", arcaneCommonController);
 | 
				
			||||||
apiRouter.post("/archonFusion.php", archonFusionController);
 | 
					apiRouter.post("/archonFusion.php", archonFusionController);
 | 
				
			||||||
apiRouter.post("/artifacts.php", artifactsController);
 | 
					apiRouter.post("/artifacts.php", artifactsController);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,6 @@
 | 
				
			|||||||
import express from "express";
 | 
					import express from "express";
 | 
				
			||||||
import path from "path";
 | 
					import path from "path";
 | 
				
			||||||
 | 
					import fs from "fs/promises";
 | 
				
			||||||
import { repoDir, rootDir } from "../helpers/pathHelper.ts";
 | 
					import { repoDir, rootDir } from "../helpers/pathHelper.ts";
 | 
				
			||||||
import { args } from "../helpers/commandLineArguments.ts";
 | 
					import { args } from "../helpers/commandLineArguments.ts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -21,50 +22,62 @@ webuiRouter.use("/webui", (req, res, next) => {
 | 
				
			|||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Serve virtual routes
 | 
					// Serve virtual routes
 | 
				
			||||||
webuiRouter.get("/webui/inventory", (_req, res) => {
 | 
					webuiRouter.get("/webui/inventory", async (_req, res) => {
 | 
				
			||||||
    res.sendFile(path.join(baseDir, "static/webui/index.html"));
 | 
					    res.set("Content-Type", "text/html;charset=utf8");
 | 
				
			||||||
 | 
					    res.send(await fs.readFile(path.join(baseDir, "static/webui/index.html")));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
webuiRouter.get("/webui/detailedView", (_req, res) => {
 | 
					webuiRouter.get("/webui/detailedView", async (_req, res) => {
 | 
				
			||||||
    res.sendFile(path.join(baseDir, "static/webui/index.html"));
 | 
					    res.set("Content-Type", "text/html;charset=utf8");
 | 
				
			||||||
 | 
					    res.send(await fs.readFile(path.join(baseDir, "static/webui/index.html")));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
webuiRouter.get("/webui/mods", (_req, res) => {
 | 
					webuiRouter.get("/webui/mods", async (_req, res) => {
 | 
				
			||||||
    res.sendFile(path.join(baseDir, "static/webui/index.html"));
 | 
					    res.set("Content-Type", "text/html;charset=utf8");
 | 
				
			||||||
 | 
					    res.send(await fs.readFile(path.join(baseDir, "static/webui/index.html")));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
webuiRouter.get("/webui/settings", (_req, res) => {
 | 
					webuiRouter.get("/webui/settings", async (_req, res) => {
 | 
				
			||||||
    res.sendFile(path.join(baseDir, "static/webui/index.html"));
 | 
					    res.set("Content-Type", "text/html;charset=utf8");
 | 
				
			||||||
 | 
					    res.send(await fs.readFile(path.join(baseDir, "static/webui/index.html")));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
webuiRouter.get("/webui/quests", (_req, res) => {
 | 
					webuiRouter.get("/webui/quests", async (_req, res) => {
 | 
				
			||||||
    res.sendFile(path.join(baseDir, "static/webui/index.html"));
 | 
					    res.set("Content-Type", "text/html;charset=utf8");
 | 
				
			||||||
 | 
					    res.send(await fs.readFile(path.join(baseDir, "static/webui/index.html")));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
webuiRouter.get("/webui/cheats", (_req, res) => {
 | 
					webuiRouter.get("/webui/cheats", async (_req, res) => {
 | 
				
			||||||
    res.sendFile(path.join(baseDir, "static/webui/index.html"));
 | 
					    res.set("Content-Type", "text/html;charset=utf8");
 | 
				
			||||||
 | 
					    res.send(await fs.readFile(path.join(baseDir, "static/webui/index.html")));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
webuiRouter.get("/webui/import", (_req, res) => {
 | 
					webuiRouter.get("/webui/import", async (_req, res) => {
 | 
				
			||||||
    res.sendFile(path.join(baseDir, "static/webui/index.html"));
 | 
					    res.set("Content-Type", "text/html;charset=utf8");
 | 
				
			||||||
 | 
					    res.send(await fs.readFile(path.join(baseDir, "static/webui/index.html")));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
webuiRouter.get("/webui/guildView", (_req, res) => {
 | 
					webuiRouter.get("/webui/guildView", async (_req, res) => {
 | 
				
			||||||
    res.sendFile(path.join(baseDir, "static/webui/index.html"));
 | 
					    res.set("Content-Type", "text/html;charset=utf8");
 | 
				
			||||||
 | 
					    res.send(await fs.readFile(path.join(baseDir, "static/webui/index.html")));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Serve static files
 | 
					// Serve static files
 | 
				
			||||||
webuiRouter.use("/webui", express.static(path.join(baseDir, "static/webui")));
 | 
					webuiRouter.use("/webui", express.static(path.join(baseDir, "static/webui")));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Serve favicon
 | 
					// Serve favicon
 | 
				
			||||||
webuiRouter.get("/favicon.ico", (_req, res) => {
 | 
					webuiRouter.get("/favicon.ico", async (_req, res) => {
 | 
				
			||||||
    res.sendFile(path.join(repoDir, "static/fixed_responses/favicon.ico"));
 | 
					    res.set("Content-Type", "image/vnd.microsoft.icon");
 | 
				
			||||||
 | 
					    res.send(await fs.readFile(path.join(repoDir, "static/fixed_responses/favicon.ico")));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Serve warframe-riven-info
 | 
					// Serve warframe-riven-info
 | 
				
			||||||
webuiRouter.get("/webui/riven-tool/", (_req, res) => {
 | 
					webuiRouter.get("/webui/riven-tool/", async (_req, res) => {
 | 
				
			||||||
    res.sendFile(path.join(repoDir, "node_modules/warframe-riven-info/index.html"));
 | 
					    res.set("Content-Type", "text/html;charset=utf8");
 | 
				
			||||||
 | 
					    res.send(await fs.readFile(path.join(repoDir, "node_modules/warframe-riven-info/index.html")));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
webuiRouter.get("/webui/riven-tool/RivenParser.js", (_req, res) => {
 | 
					webuiRouter.get("/webui/riven-tool/RivenParser.js", async (_req, res) => {
 | 
				
			||||||
    res.sendFile(path.join(repoDir, "node_modules/warframe-riven-info/RivenParser.js"));
 | 
					    res.set("Content-Type", "text/javascript;charset=utf8");
 | 
				
			||||||
 | 
					    res.send(await fs.readFile(path.join(repoDir, "node_modules/warframe-riven-info/RivenParser.js")));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Serve translations
 | 
					// Serve translations
 | 
				
			||||||
webuiRouter.get("/translations/:file", (req, res) => {
 | 
					webuiRouter.get("/translations/:file", async (req, res) => {
 | 
				
			||||||
    res.sendFile(path.join(baseDir, `static/webui/translations/${req.params.file}`));
 | 
					    res.set("Content-Type", "text/javascript;charset=utf8");
 | 
				
			||||||
 | 
					    res.send(await fs.readFile(path.join(baseDir, `static/webui/translations/${req.params.file}`)));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export { webuiRouter };
 | 
					export { webuiRouter };
 | 
				
			||||||
 | 
				
			|||||||
@ -116,8 +116,8 @@ export const createInventory = async (
 | 
				
			|||||||
        if (config.skipTutorial) {
 | 
					        if (config.skipTutorial) {
 | 
				
			||||||
            inventory.PlayedParkourTutorial = true;
 | 
					            inventory.PlayedParkourTutorial = true;
 | 
				
			||||||
            await addStartingGear(inventory);
 | 
					            await addStartingGear(inventory);
 | 
				
			||||||
            await completeQuest(inventory, "/Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain");
 | 
					            await completeQuest(inventory, "/Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain", undefined);
 | 
				
			||||||
            await completeQuest(inventory, "/Lotus/Types/Keys/ModQuest/ModQuestKeyChain");
 | 
					            await completeQuest(inventory, "/Lotus/Types/Keys/ModQuest/ModQuestKeyChain", undefined);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            const completedMissions = ["SolNode27", "SolNode89", "SolNode63", "SolNode85", "SolNode15", "SolNode79"];
 | 
					            const completedMissions = ["SolNode27", "SolNode89", "SolNode63", "SolNode85", "SolNode15", "SolNode79"];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -473,7 +473,9 @@ export const addItem = async (
 | 
				
			|||||||
        return addCustomization(inventory, typeName);
 | 
					        return addCustomization(inventory, typeName);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (typeName in ExportUpgrades || typeName in ExportArcanes) {
 | 
					    if (typeName in ExportUpgrades || typeName in ExportArcanes) {
 | 
				
			||||||
        if (targetFingerprint) {
 | 
					        if (targetFingerprint && typeName.startsWith("/Lotus/Upgrades/Mods/Randomized/Raw")) {
 | 
				
			||||||
 | 
					            logger.debug(`ignoring fingerprint for raw riven mod`);
 | 
				
			||||||
 | 
					        } else if (targetFingerprint) {
 | 
				
			||||||
            if (quantity != 1) {
 | 
					            if (quantity != 1) {
 | 
				
			||||||
                logger.warn(`adding 1 of ${typeName} ${targetFingerprint} even tho quantity ${quantity} was requested`);
 | 
					                logger.warn(`adding 1 of ${typeName} ${targetFingerprint} even tho quantity ${quantity} was requested`);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -1569,6 +1571,7 @@ const addCrewShip = async (
 | 
				
			|||||||
            const questChanges = await completeQuest(
 | 
					            const questChanges = await completeQuest(
 | 
				
			||||||
                inventory,
 | 
					                inventory,
 | 
				
			||||||
                "/Lotus/Types/Keys/RailJackBuildQuest/RailjackBuildQuestKeyChain",
 | 
					                "/Lotus/Types/Keys/RailJackBuildQuest/RailjackBuildQuestKeyChain",
 | 
				
			||||||
 | 
					                undefined,
 | 
				
			||||||
                false
 | 
					                false
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
            if (questChanges) {
 | 
					            if (questChanges) {
 | 
				
			||||||
 | 
				
			|||||||
@ -40,6 +40,8 @@ import {
 | 
				
			|||||||
} from "warframe-public-export-plus";
 | 
					} from "warframe-public-export-plus";
 | 
				
			||||||
import type { IMessage } from "../models/inboxModel.ts";
 | 
					import type { IMessage } from "../models/inboxModel.ts";
 | 
				
			||||||
import { logger } from "../utils/logger.ts";
 | 
					import { logger } from "../utils/logger.ts";
 | 
				
			||||||
 | 
					import { version_compare } from "../helpers/inventoryHelpers.ts";
 | 
				
			||||||
 | 
					import vorsPrizePreU40Rewards from "../../static/fixed_responses/vorsPrizePreU40Rewards.json" with { type: "json" };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export type WeaponTypeInternal =
 | 
					export type WeaponTypeInternal =
 | 
				
			||||||
    | "LongGuns"
 | 
					    | "LongGuns"
 | 
				
			||||||
@ -227,12 +229,13 @@ export const getKeyChainItems = ({ KeyChain, ChainStage }: IKeyChainRequest): st
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getLevelKeyRewards = (
 | 
					export const getLevelKeyRewards = (
 | 
				
			||||||
    levelKey: string
 | 
					    levelKey: string,
 | 
				
			||||||
 | 
					    buildLabel: string | undefined
 | 
				
			||||||
): { levelKeyRewards?: IMissionReward; levelKeyRewards2?: TReward[] } => {
 | 
					): { levelKeyRewards?: IMissionReward; levelKeyRewards2?: TReward[] } => {
 | 
				
			||||||
    const key = ExportKeys[levelKey] as IKey | undefined;
 | 
					    const key = ExportKeys[levelKey] as IKey | undefined;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const levelKeyRewards = key?.missionReward;
 | 
					    const levelKeyRewards = key?.missionReward;
 | 
				
			||||||
    const levelKeyRewards2 = key?.rewards;
 | 
					    let levelKeyRewards2 = key?.rewards;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!levelKeyRewards && !levelKeyRewards2) {
 | 
					    if (!levelKeyRewards && !levelKeyRewards2) {
 | 
				
			||||||
        logger.warn(
 | 
					        logger.warn(
 | 
				
			||||||
@ -240,6 +243,12 @@ export const getLevelKeyRewards = (
 | 
				
			|||||||
        );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (buildLabel && version_compare(buildLabel, "2025.10.14.16.10") < 0) {
 | 
				
			||||||
 | 
					        if (levelKey in vorsPrizePreU40Rewards) {
 | 
				
			||||||
 | 
					            levelKeyRewards2 = vorsPrizePreU40Rewards[levelKey as keyof typeof vorsPrizePreU40Rewards] as TReward[];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
        levelKeyRewards,
 | 
					        levelKeyRewards,
 | 
				
			||||||
        levelKeyRewards2
 | 
					        levelKeyRewards2
 | 
				
			||||||
 | 
				
			|||||||
@ -1133,7 +1133,8 @@ export const addMissionRewards = async (
 | 
				
			|||||||
        VoidTearParticipantsCurrWave: voidTearWave,
 | 
					        VoidTearParticipantsCurrWave: voidTearWave,
 | 
				
			||||||
        StrippedItems: strippedItems,
 | 
					        StrippedItems: strippedItems,
 | 
				
			||||||
        AffiliationChanges: AffiliationMods,
 | 
					        AffiliationChanges: AffiliationMods,
 | 
				
			||||||
        InvasionProgress: invasionProgress
 | 
					        InvasionProgress: invasionProgress,
 | 
				
			||||||
 | 
					        EndOfMatchUpload: endOfMatchUpload
 | 
				
			||||||
    }: IMissionInventoryUpdateRequest,
 | 
					    }: IMissionInventoryUpdateRequest,
 | 
				
			||||||
    firstCompletion: boolean
 | 
					    firstCompletion: boolean
 | 
				
			||||||
): Promise<AddMissionRewardsReturnType> => {
 | 
					): Promise<AddMissionRewardsReturnType> => {
 | 
				
			||||||
@ -1218,7 +1219,7 @@ export const addMissionRewards = async (
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (levelKeyName) {
 | 
					    if (levelKeyName) {
 | 
				
			||||||
        const fixedLevelRewards = getLevelKeyRewards(levelKeyName);
 | 
					        const fixedLevelRewards = getLevelKeyRewards(levelKeyName, account.BuildLabel);
 | 
				
			||||||
        //logger.debug(`fixedLevelRewards ${fixedLevelRewards}`);
 | 
					        //logger.debug(`fixedLevelRewards ${fixedLevelRewards}`);
 | 
				
			||||||
        if (fixedLevelRewards.levelKeyRewards) {
 | 
					        if (fixedLevelRewards.levelKeyRewards) {
 | 
				
			||||||
            missionCompletionCredits += addFixedLevelRewards(
 | 
					            missionCompletionCredits += addFixedLevelRewards(
 | 
				
			||||||
@ -1392,73 +1393,77 @@ export const addMissionRewards = async (
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (strippedItems) {
 | 
					    if (strippedItems) {
 | 
				
			||||||
        for (const si of strippedItems) {
 | 
					        if (endOfMatchUpload) {
 | 
				
			||||||
            if (si.DropTable in droptableAliases) {
 | 
					            for (const si of strippedItems) {
 | 
				
			||||||
                logger.debug(`rewriting ${si.DropTable} to ${droptableAliases[si.DropTable]}`);
 | 
					                if (si.DropTable in droptableAliases) {
 | 
				
			||||||
                si.DropTable = droptableAliases[si.DropTable];
 | 
					                    logger.debug(`rewriting ${si.DropTable} to ${droptableAliases[si.DropTable]}`);
 | 
				
			||||||
            }
 | 
					                    si.DropTable = droptableAliases[si.DropTable];
 | 
				
			||||||
            const droptables = ExportEnemies.droptables[si.DropTable] ?? [];
 | 
					 | 
				
			||||||
            if (si.DROP_MOD) {
 | 
					 | 
				
			||||||
                const modDroptable = droptables.find(x => x.type == "mod");
 | 
					 | 
				
			||||||
                if (modDroptable) {
 | 
					 | 
				
			||||||
                    for (let i = 0; i != si.DROP_MOD.length; ++i) {
 | 
					 | 
				
			||||||
                        const reward = getRandomReward(modDroptable.items)!;
 | 
					 | 
				
			||||||
                        logger.debug(`stripped droptable (mods pool) rolled`, reward);
 | 
					 | 
				
			||||||
                        await addItem(inventory, reward.type);
 | 
					 | 
				
			||||||
                        MissionRewards.push({
 | 
					 | 
				
			||||||
                            StoreItem: toStoreItem(reward.type),
 | 
					 | 
				
			||||||
                            ItemCount: 1,
 | 
					 | 
				
			||||||
                            FromEnemyCache: true // to show "identified"
 | 
					 | 
				
			||||||
                        });
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                } else {
 | 
					 | 
				
			||||||
                    logger.error(`unknown droptable ${si.DropTable} for DROP_MOD`);
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					                const droptables = ExportEnemies.droptables[si.DropTable] ?? [];
 | 
				
			||||||
            if (si.DROP_BLUEPRINT) {
 | 
					                if (si.DROP_MOD) {
 | 
				
			||||||
                const blueprintDroptable = droptables.find(x => x.type == "blueprint");
 | 
					                    const modDroptable = droptables.find(x => x.type == "mod");
 | 
				
			||||||
                if (blueprintDroptable) {
 | 
					                    if (modDroptable) {
 | 
				
			||||||
                    for (let i = 0; i != si.DROP_BLUEPRINT.length; ++i) {
 | 
					                        for (let i = 0; i != si.DROP_MOD.length; ++i) {
 | 
				
			||||||
                        const reward = getRandomReward(blueprintDroptable.items)!;
 | 
					                            const reward = getRandomReward(modDroptable.items)!;
 | 
				
			||||||
                        logger.debug(`stripped droptable (blueprints pool) rolled`, reward);
 | 
					                            logger.debug(`stripped droptable (mods pool) rolled`, reward);
 | 
				
			||||||
                        await addItem(inventory, reward.type);
 | 
					                            await addItem(inventory, reward.type);
 | 
				
			||||||
                        MissionRewards.push({
 | 
					 | 
				
			||||||
                            StoreItem: toStoreItem(reward.type),
 | 
					 | 
				
			||||||
                            ItemCount: 1,
 | 
					 | 
				
			||||||
                            FromEnemyCache: true // to show "identified"
 | 
					 | 
				
			||||||
                        });
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                } else {
 | 
					 | 
				
			||||||
                    logger.error(`unknown droptable ${si.DropTable} for DROP_BLUEPRINT`);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            // e.g. H-09 Apex Turret Sumdali
 | 
					 | 
				
			||||||
            if (si.DROP_MISC_ITEM) {
 | 
					 | 
				
			||||||
                const resourceDroptable = droptables.find(x => x.type == "resource");
 | 
					 | 
				
			||||||
                if (resourceDroptable) {
 | 
					 | 
				
			||||||
                    for (let i = 0; i != si.DROP_MISC_ITEM.length; ++i) {
 | 
					 | 
				
			||||||
                        const reward = getRandomReward(resourceDroptable.items)!;
 | 
					 | 
				
			||||||
                        logger.debug(`stripped droptable (resources pool) rolled`, reward);
 | 
					 | 
				
			||||||
                        if (Object.keys(await addItem(inventory, reward.type)).length == 0) {
 | 
					 | 
				
			||||||
                            logger.debug(`item already owned, skipping`);
 | 
					 | 
				
			||||||
                        } else {
 | 
					 | 
				
			||||||
                            MissionRewards.push({
 | 
					                            MissionRewards.push({
 | 
				
			||||||
                                StoreItem: toStoreItem(reward.type),
 | 
					                                StoreItem: toStoreItem(reward.type),
 | 
				
			||||||
                                ItemCount: 1,
 | 
					                                ItemCount: 1,
 | 
				
			||||||
                                FromEnemyCache: true // to show "identified"
 | 
					                                FromEnemyCache: true // to show "identified"
 | 
				
			||||||
                            });
 | 
					                            });
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        logger.error(`unknown droptable ${si.DropTable} for DROP_MOD`);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                } else {
 | 
					                }
 | 
				
			||||||
                    logger.error(`unknown droptable ${si.DropTable} for DROP_MISC_ITEM`);
 | 
					                if (si.DROP_BLUEPRINT) {
 | 
				
			||||||
 | 
					                    const blueprintDroptable = droptables.find(x => x.type == "blueprint");
 | 
				
			||||||
 | 
					                    if (blueprintDroptable) {
 | 
				
			||||||
 | 
					                        for (let i = 0; i != si.DROP_BLUEPRINT.length; ++i) {
 | 
				
			||||||
 | 
					                            const reward = getRandomReward(blueprintDroptable.items)!;
 | 
				
			||||||
 | 
					                            logger.debug(`stripped droptable (blueprints pool) rolled`, reward);
 | 
				
			||||||
 | 
					                            await addItem(inventory, reward.type);
 | 
				
			||||||
 | 
					                            MissionRewards.push({
 | 
				
			||||||
 | 
					                                StoreItem: toStoreItem(reward.type),
 | 
				
			||||||
 | 
					                                ItemCount: 1,
 | 
				
			||||||
 | 
					                                FromEnemyCache: true // to show "identified"
 | 
				
			||||||
 | 
					                            });
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        logger.error(`unknown droptable ${si.DropTable} for DROP_BLUEPRINT`);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                // e.g. H-09 Apex Turret Sumdali
 | 
				
			||||||
 | 
					                if (si.DROP_MISC_ITEM) {
 | 
				
			||||||
 | 
					                    const resourceDroptable = droptables.find(x => x.type == "resource");
 | 
				
			||||||
 | 
					                    if (resourceDroptable) {
 | 
				
			||||||
 | 
					                        for (let i = 0; i != si.DROP_MISC_ITEM.length; ++i) {
 | 
				
			||||||
 | 
					                            const reward = getRandomReward(resourceDroptable.items)!;
 | 
				
			||||||
 | 
					                            logger.debug(`stripped droptable (resources pool) rolled`, reward);
 | 
				
			||||||
 | 
					                            if (Object.keys(await addItem(inventory, reward.type)).length == 0) {
 | 
				
			||||||
 | 
					                                logger.debug(`item already owned, skipping`);
 | 
				
			||||||
 | 
					                            } else {
 | 
				
			||||||
 | 
					                                MissionRewards.push({
 | 
				
			||||||
 | 
					                                    StoreItem: toStoreItem(reward.type),
 | 
				
			||||||
 | 
					                                    ItemCount: 1,
 | 
				
			||||||
 | 
					                                    FromEnemyCache: true // to show "identified"
 | 
				
			||||||
 | 
					                                });
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        logger.error(`unknown droptable ${si.DropTable} for DROP_MISC_ITEM`);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (si.DropTable == "/Lotus/Types/DropTables/ContainerDropTables/VoidVaultMissionRewardsDropTable") {
 | 
				
			||||||
 | 
					                    // Consume netracells search pulse; only when the container reward was picked up. Discussed in https://onlyg.it/OpenWF/SpaceNinjaServer/issues/2673
 | 
				
			||||||
 | 
					                    updateEntratiVault(inventory);
 | 
				
			||||||
 | 
					                    inventory.EntratiVaultCountLastPeriod! += 1;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
            if (si.DropTable == "/Lotus/Types/DropTables/ContainerDropTables/VoidVaultMissionRewardsDropTable") {
 | 
					            logger.debug(`ignoring StrippedItems in intermediate inventory update, deferring until extraction`);
 | 
				
			||||||
                // Consume netracells search pulse; only when the container reward was picked up. Discussed in https://onlyg.it/OpenWF/SpaceNinjaServer/issues/2673
 | 
					 | 
				
			||||||
                updateEntratiVault(inventory);
 | 
					 | 
				
			||||||
                inventory.EntratiVaultCountLastPeriod! += 1;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -149,6 +149,7 @@ export const addQuestKey = (
 | 
				
			|||||||
export const completeQuest = async (
 | 
					export const completeQuest = async (
 | 
				
			||||||
    inventory: TInventoryDatabaseDocument,
 | 
					    inventory: TInventoryDatabaseDocument,
 | 
				
			||||||
    questKey: string,
 | 
					    questKey: string,
 | 
				
			||||||
 | 
					    buildLabel: string | undefined,
 | 
				
			||||||
    sendMessages: boolean = false
 | 
					    sendMessages: boolean = false
 | 
				
			||||||
): Promise<void | IQuestKeyClient> => {
 | 
					): Promise<void | IQuestKeyClient> => {
 | 
				
			||||||
    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
 | 
					    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
 | 
				
			||||||
@ -197,8 +198,8 @@ export const completeQuest = async (
 | 
				
			|||||||
        if (stage.c <= run) {
 | 
					        if (stage.c <= run) {
 | 
				
			||||||
            stage.c = run;
 | 
					            stage.c = run;
 | 
				
			||||||
            await giveKeyChainStageTriggered(inventory, { KeyChain: questKey, ChainStage: i }, sendMessages);
 | 
					            await giveKeyChainStageTriggered(inventory, { KeyChain: questKey, ChainStage: i }, sendMessages);
 | 
				
			||||||
            await giveKeyChainMissionReward(inventory, { KeyChain: questKey, ChainStage: i });
 | 
					            await giveKeyChainMissionReward(inventory, { KeyChain: questKey, ChainStage: i }, buildLabel);
 | 
				
			||||||
            await installShipFeatures(inventory, { KeyChain: questKey, ChainStage: i });
 | 
					            await installShipFeatures(inventory, { KeyChain: questKey, ChainStage: i }, buildLabel);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -400,7 +401,8 @@ export const giveKeyChainMessage = async (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export const giveKeyChainMissionReward = async (
 | 
					export const giveKeyChainMissionReward = async (
 | 
				
			||||||
    inventory: TInventoryDatabaseDocument,
 | 
					    inventory: TInventoryDatabaseDocument,
 | 
				
			||||||
    keyChainInfo: IKeyChainRequest
 | 
					    keyChainInfo: IKeyChainRequest,
 | 
				
			||||||
 | 
					    buildLabel: string | undefined
 | 
				
			||||||
): Promise<void> => {
 | 
					): Promise<void> => {
 | 
				
			||||||
    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
 | 
					    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
 | 
				
			||||||
    const chainStages = ExportKeys[keyChainInfo.KeyChain]?.chainStages;
 | 
					    const chainStages = ExportKeys[keyChainInfo.KeyChain]?.chainStages;
 | 
				
			||||||
@ -409,7 +411,7 @@ export const giveKeyChainMissionReward = async (
 | 
				
			|||||||
        const missionName = chainStages[keyChainInfo.ChainStage].key;
 | 
					        const missionName = chainStages[keyChainInfo.ChainStage].key;
 | 
				
			||||||
        const questKey = inventory.QuestKeys.find(q => q.ItemType === keyChainInfo.KeyChain);
 | 
					        const questKey = inventory.QuestKeys.find(q => q.ItemType === keyChainInfo.KeyChain);
 | 
				
			||||||
        if (missionName && questKey) {
 | 
					        if (missionName && questKey) {
 | 
				
			||||||
            const fixedLevelRewards = getLevelKeyRewards(missionName);
 | 
					            const fixedLevelRewards = getLevelKeyRewards(missionName, buildLabel);
 | 
				
			||||||
            const run = questKey.Progress?.[0]?.c ?? 0;
 | 
					            const run = questKey.Progress?.[0]?.c ?? 0;
 | 
				
			||||||
            if (fixedLevelRewards.levelKeyRewards) {
 | 
					            if (fixedLevelRewards.levelKeyRewards) {
 | 
				
			||||||
                const missionRewards: { StoreItem: string; ItemCount: number }[] = [];
 | 
					                const missionRewards: { StoreItem: string; ItemCount: number }[] = [];
 | 
				
			||||||
@ -463,7 +465,8 @@ export const giveKeyChainStageTriggered = async (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export const installShipFeatures = async (
 | 
					export const installShipFeatures = async (
 | 
				
			||||||
    inventory: TInventoryDatabaseDocument,
 | 
					    inventory: TInventoryDatabaseDocument,
 | 
				
			||||||
    keyChainInfo: IKeyChainRequest
 | 
					    keyChainInfo: IKeyChainRequest,
 | 
				
			||||||
 | 
					    buildLabel: string | undefined
 | 
				
			||||||
): Promise<void> => {
 | 
					): Promise<void> => {
 | 
				
			||||||
    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
 | 
					    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
 | 
				
			||||||
    const chainStages = ExportKeys[keyChainInfo.KeyChain]?.chainStages;
 | 
					    const chainStages = ExportKeys[keyChainInfo.KeyChain]?.chainStages;
 | 
				
			||||||
@ -478,7 +481,7 @@ export const installShipFeatures = async (
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (prevStage.key) {
 | 
					            if (prevStage.key) {
 | 
				
			||||||
                const fixedLevelRewards = getLevelKeyRewards(prevStage.key);
 | 
					                const fixedLevelRewards = getLevelKeyRewards(prevStage.key, buildLabel);
 | 
				
			||||||
                if (fixedLevelRewards.levelKeyRewards?.items) {
 | 
					                if (fixedLevelRewards.levelKeyRewards?.items) {
 | 
				
			||||||
                    for (const item of fixedLevelRewards.levelKeyRewards.items) {
 | 
					                    for (const item of fixedLevelRewards.levelKeyRewards.items) {
 | 
				
			||||||
                        if (item.startsWith("/Lotus/StoreItems/Types/Items/ShipFeatureItems/")) {
 | 
					                        if (item.startsWith("/Lotus/StoreItems/Types/Items/ShipFeatureItems/")) {
 | 
				
			||||||
 | 
				
			|||||||
@ -55,6 +55,8 @@ export interface ILoginResponse extends IAccountAndLoginResponseCommons {
 | 
				
			|||||||
    DTLS?: number;
 | 
					    DTLS?: number;
 | 
				
			||||||
    IRC?: string[];
 | 
					    IRC?: string[];
 | 
				
			||||||
    HUB?: string;
 | 
					    HUB?: string;
 | 
				
			||||||
 | 
					    NatHash?: string;
 | 
				
			||||||
 | 
					    SteamId?: string;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface IGroup {
 | 
					export interface IGroup {
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										160
									
								
								static/fixed_responses/vorsPrizePreU40Rewards.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								static/fixed_responses/vorsPrizePreU40Rewards.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,160 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "/Lotus/Types/Keys/VorsPrize/MissionOne": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Types/Items/ShipFeatureItems/SocialMenuFeatureItem"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/WeaponMeleeDamageMod"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/WeaponDamageAmountMod"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/WeaponDamageAmountMod"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_CREDITS",
 | 
				
			||||||
 | 
					      "amount": 2500
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "/Lotus/Types/Keys/VorsPrize/MissionTwo": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Types/Items/ShipFeatureItems/ModsFeatureItem"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarHealthMaxMod"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarShieldMaxMod"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarAbilityRangeMod"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarAbilityStrengthMod"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarAbilityDurationMod"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_CREDITS",
 | 
				
			||||||
 | 
					      "amount": 2500
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "/Lotus/Types/Keys/VorsPrize/MissionThree": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Types/Items/ShipFeatureItems/FoundryFeatureItem"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/Melee/WeaponFireRateMod"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/WeaponFactionDamageCorpus"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/Rifle/WeaponFactionDamageGrineer"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/WeaponFireDamageMod"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/Pistol/WeaponElectricityDamageMod"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_CREDITS",
 | 
				
			||||||
 | 
					      "amount": 2500
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "/Lotus/Types/Keys/VorsPrize/MissionFour": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarPickupBonusMod"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarPowerMaxMod"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/Warframe/AvatarEnemyRadarMod"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_CREDITS",
 | 
				
			||||||
 | 
					      "amount": 2500
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "/Lotus/Types/Keys/VorsPrize/MissionFive": [
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Types/Items/ShipFeatureItems/MercuryNavigationFeatureItem"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_STORE_ITEM",
 | 
				
			||||||
 | 
					      "itemType": "/Lotus/StoreItems/Upgrades/Mods/FusionBundles/CommonFusionBundle"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      "rewardType": "RT_CREDITS",
 | 
				
			||||||
 | 
					      "amount": 5000
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -169,6 +169,7 @@ function renameAccount(taken_name) {
 | 
				
			|||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    $(".displayname").text(newname);
 | 
					                    $(".displayname").text(newname);
 | 
				
			||||||
                    updateLocElements();
 | 
					                    updateLocElements();
 | 
				
			||||||
 | 
					                    toast(loc("code_succRelog"));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
				
			|||||||
@ -51,7 +51,7 @@ dict = {
 | 
				
			|||||||
    code_focusUnlocked: `|COUNT| neue Fokus-Schulen freigeschaltet! Ein Inventar-Update wird benötigt, damit die Änderungen im Spiel sichtbar werden.`,
 | 
					    code_focusUnlocked: `|COUNT| neue Fokus-Schulen freigeschaltet! Ein Inventar-Update wird benötigt, damit die Änderungen im Spiel sichtbar werden.`,
 | 
				
			||||||
    code_addModsConfirm: `Bist du sicher, dass du |COUNT| Mods zu deinem Account hinzufügen möchtest?`,
 | 
					    code_addModsConfirm: `Bist du sicher, dass du |COUNT| Mods zu deinem Account hinzufügen möchtest?`,
 | 
				
			||||||
    code_succImport: `Erfolgreich importiert.`,
 | 
					    code_succImport: `Erfolgreich importiert.`,
 | 
				
			||||||
    code_succRelog: `Fertig. Bitte beachte, dass du dich neu anmelden musst, um Änderungen im Spiel zu sehen.`,
 | 
					    code_succRelog: `Fertig. Bitte beachte, dass du dich neu anmelden musst, damit die Änderung im Spiel sichtbar wird.`,
 | 
				
			||||||
    code_nothingToDo: `Fertig. Es gab nichts zu tun.`,
 | 
					    code_nothingToDo: `Fertig. Es gab nichts zu tun.`,
 | 
				
			||||||
    code_gild: `Veredeln`,
 | 
					    code_gild: `Veredeln`,
 | 
				
			||||||
    code_moa: `Moa`,
 | 
					    code_moa: `Moa`,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user