Compare commits

..

No commits in common. "main" and "main" have entirely different histories.
main ... main

15 changed files with 118 additions and 343 deletions

View File

@ -1,17 +1,9 @@
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 = async (_req, res) => { const deleteSessionController: RequestHandler = (_req, res) => {
const account = await getAccountForRequest(_req);
deleteSession(_req.query.sessionId as string); deleteSession(_req.query.sessionId as string);
if (account.BuildLabel && version_compare(account.BuildLabel, "2016.07.08.16.56") < 0) { res.sendStatus(200);
// 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 };

View File

@ -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, "2016.07.08.16.56") < 0) { if (account.BuildLabel && version_compare(account.BuildLabel, "2015.03.21.08.17") < 0) {
// Pre-Specters of the Rail // U15 or below
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 });

View File

@ -310,13 +310,12 @@ 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);
} }

View File

@ -109,19 +109,12 @@ 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];
} }

View File

@ -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, undefined); await completeQuest(inventory, questKey.ItemType);
} }
break; break;
} }
@ -72,7 +72,7 @@ export const manageQuestsController: RequestHandler = async (req, res) => {
break; break;
} }
await completeQuest(inventory, questItemType, undefined); await completeQuest(inventory, questItemType);
} }
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, undefined, true); await completeQuest(inventory, questKey.ItemType, true);
} else { } else {
if (run > 0) { if (run > 0) {
questKey.Progress[currentStage + 1].c = run; questKey.Progress[currentStage + 1].c = run;
@ -151,14 +151,10 @@ export const manageQuestsController: RequestHandler = async (req, res) => {
}); });
if (currentStage > 0) { if (currentStage > 0) {
await giveKeyChainMissionReward( await giveKeyChainMissionReward(inventory, {
inventory, KeyChain: questKey.ItemType,
{ ChainStage: currentStage
KeyChain: questKey.ItemType, });
ChainStage: currentStage
},
undefined
);
} }
} }
} }

View File

@ -10,7 +10,6 @@ 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";
@ -171,7 +170,6 @@ 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();
@ -237,7 +235,6 @@ 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);
@ -249,7 +246,6 @@ 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);

View File

@ -1,6 +1,5 @@
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";
@ -22,62 +21,50 @@ webuiRouter.use("/webui", (req, res, next) => {
}); });
// Serve virtual routes // Serve virtual routes
webuiRouter.get("/webui/inventory", async (_req, res) => { webuiRouter.get("/webui/inventory", (_req, res) => {
res.set("Content-Type", "text/html;charset=utf8"); res.sendFile(path.join(baseDir, "static/webui/index.html"));
res.send(await fs.readFile(path.join(baseDir, "static/webui/index.html")));
}); });
webuiRouter.get("/webui/detailedView", async (_req, res) => { webuiRouter.get("/webui/detailedView", (_req, res) => {
res.set("Content-Type", "text/html;charset=utf8"); res.sendFile(path.join(baseDir, "static/webui/index.html"));
res.send(await fs.readFile(path.join(baseDir, "static/webui/index.html")));
}); });
webuiRouter.get("/webui/mods", async (_req, res) => { webuiRouter.get("/webui/mods", (_req, res) => {
res.set("Content-Type", "text/html;charset=utf8"); res.sendFile(path.join(baseDir, "static/webui/index.html"));
res.send(await fs.readFile(path.join(baseDir, "static/webui/index.html")));
}); });
webuiRouter.get("/webui/settings", async (_req, res) => { webuiRouter.get("/webui/settings", (_req, res) => {
res.set("Content-Type", "text/html;charset=utf8"); res.sendFile(path.join(baseDir, "static/webui/index.html"));
res.send(await fs.readFile(path.join(baseDir, "static/webui/index.html")));
}); });
webuiRouter.get("/webui/quests", async (_req, res) => { webuiRouter.get("/webui/quests", (_req, res) => {
res.set("Content-Type", "text/html;charset=utf8"); res.sendFile(path.join(baseDir, "static/webui/index.html"));
res.send(await fs.readFile(path.join(baseDir, "static/webui/index.html")));
}); });
webuiRouter.get("/webui/cheats", async (_req, res) => { webuiRouter.get("/webui/cheats", (_req, res) => {
res.set("Content-Type", "text/html;charset=utf8"); res.sendFile(path.join(baseDir, "static/webui/index.html"));
res.send(await fs.readFile(path.join(baseDir, "static/webui/index.html")));
}); });
webuiRouter.get("/webui/import", async (_req, res) => { webuiRouter.get("/webui/import", (_req, res) => {
res.set("Content-Type", "text/html;charset=utf8"); res.sendFile(path.join(baseDir, "static/webui/index.html"));
res.send(await fs.readFile(path.join(baseDir, "static/webui/index.html")));
}); });
webuiRouter.get("/webui/guildView", async (_req, res) => { webuiRouter.get("/webui/guildView", (_req, res) => {
res.set("Content-Type", "text/html;charset=utf8"); res.sendFile(path.join(baseDir, "static/webui/index.html"));
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", async (_req, res) => { webuiRouter.get("/favicon.ico", (_req, res) => {
res.set("Content-Type", "image/vnd.microsoft.icon"); res.sendFile(path.join(repoDir, "static/fixed_responses/favicon.ico"));
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/", async (_req, res) => { webuiRouter.get("/webui/riven-tool/", (_req, res) => {
res.set("Content-Type", "text/html;charset=utf8"); res.sendFile(path.join(repoDir, "node_modules/warframe-riven-info/index.html"));
res.send(await fs.readFile(path.join(repoDir, "node_modules/warframe-riven-info/index.html")));
}); });
webuiRouter.get("/webui/riven-tool/RivenParser.js", async (_req, res) => { webuiRouter.get("/webui/riven-tool/RivenParser.js", (_req, res) => {
res.set("Content-Type", "text/javascript;charset=utf8"); res.sendFile(path.join(repoDir, "node_modules/warframe-riven-info/RivenParser.js"));
res.send(await fs.readFile(path.join(repoDir, "node_modules/warframe-riven-info/RivenParser.js")));
}); });
// Serve translations // Serve translations
webuiRouter.get("/translations/:file", async (req, res) => { webuiRouter.get("/translations/:file", (req, res) => {
res.set("Content-Type", "text/javascript;charset=utf8"); res.sendFile(path.join(baseDir, `static/webui/translations/${req.params.file}`));
res.send(await fs.readFile(path.join(baseDir, `static/webui/translations/${req.params.file}`)));
}); });
export { webuiRouter }; export { webuiRouter };

View File

@ -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", undefined); await completeQuest(inventory, "/Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain");
await completeQuest(inventory, "/Lotus/Types/Keys/ModQuest/ModQuestKeyChain", undefined); await completeQuest(inventory, "/Lotus/Types/Keys/ModQuest/ModQuestKeyChain");
const completedMissions = ["SolNode27", "SolNode89", "SolNode63", "SolNode85", "SolNode15", "SolNode79"]; const completedMissions = ["SolNode27", "SolNode89", "SolNode63", "SolNode85", "SolNode15", "SolNode79"];
@ -473,9 +473,7 @@ 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 && typeName.startsWith("/Lotus/Upgrades/Mods/Randomized/Raw")) { if (targetFingerprint) {
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`);
} }
@ -1571,7 +1569,6 @@ 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) {

View File

@ -40,8 +40,6 @@ 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"
@ -229,13 +227,12 @@ 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;
let levelKeyRewards2 = key?.rewards; const levelKeyRewards2 = key?.rewards;
if (!levelKeyRewards && !levelKeyRewards2) { if (!levelKeyRewards && !levelKeyRewards2) {
logger.warn( logger.warn(
@ -243,12 +240,6 @@ 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

View File

@ -1133,8 +1133,7 @@ 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> => {
@ -1219,7 +1218,7 @@ export const addMissionRewards = async (
} }
if (levelKeyName) { if (levelKeyName) {
const fixedLevelRewards = getLevelKeyRewards(levelKeyName, account.BuildLabel); const fixedLevelRewards = getLevelKeyRewards(levelKeyName);
//logger.debug(`fixedLevelRewards ${fixedLevelRewards}`); //logger.debug(`fixedLevelRewards ${fixedLevelRewards}`);
if (fixedLevelRewards.levelKeyRewards) { if (fixedLevelRewards.levelKeyRewards) {
missionCompletionCredits += addFixedLevelRewards( missionCompletionCredits += addFixedLevelRewards(
@ -1393,77 +1392,73 @@ export const addMissionRewards = async (
} }
if (strippedItems) { if (strippedItems) {
if (endOfMatchUpload) { for (const si of strippedItems) {
for (const si of strippedItems) { if (si.DropTable in droptableAliases) {
if (si.DropTable in droptableAliases) { logger.debug(`rewriting ${si.DropTable} to ${droptableAliases[si.DropTable]}`);
logger.debug(`rewriting ${si.DropTable} to ${droptableAliases[si.DropTable]}`); si.DropTable = droptableAliases[si.DropTable];
si.DropTable = droptableAliases[si.DropTable]; }
} const droptables = ExportEnemies.droptables[si.DropTable] ?? [];
const droptables = ExportEnemies.droptables[si.DropTable] ?? []; if (si.DROP_MOD) {
if (si.DROP_MOD) { const modDroptable = droptables.find(x => x.type == "mod");
const modDroptable = droptables.find(x => x.type == "mod"); if (modDroptable) {
if (modDroptable) { for (let i = 0; i != si.DROP_MOD.length; ++i) {
for (let i = 0; i != si.DROP_MOD.length; ++i) { const reward = getRandomReward(modDroptable.items)!;
const reward = getRandomReward(modDroptable.items)!; logger.debug(`stripped droptable (mods pool) rolled`, reward);
logger.debug(`stripped droptable (mods pool) rolled`, reward); await addItem(inventory, reward.type);
await addItem(inventory, reward.type); 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 {
if (si.DROP_BLUEPRINT) { logger.error(`unknown droptable ${si.DropTable} for DROP_MOD`);
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.DROP_BLUEPRINT) {
logger.debug(`ignoring StrippedItems in intermediate inventory update, deferring until extraction`); 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;
}
} }
} }

View File

@ -149,7 +149,6 @@ 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
@ -198,8 +197,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 }, buildLabel); await giveKeyChainMissionReward(inventory, { KeyChain: questKey, ChainStage: i });
await installShipFeatures(inventory, { KeyChain: questKey, ChainStage: i }, buildLabel); await installShipFeatures(inventory, { KeyChain: questKey, ChainStage: i });
} }
} }
@ -401,8 +400,7 @@ 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;
@ -411,7 +409,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, buildLabel); const fixedLevelRewards = getLevelKeyRewards(missionName);
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 }[] = [];
@ -465,8 +463,7 @@ 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;
@ -481,7 +478,7 @@ export const installShipFeatures = async (
} }
} }
if (prevStage.key) { if (prevStage.key) {
const fixedLevelRewards = getLevelKeyRewards(prevStage.key, buildLabel); const fixedLevelRewards = getLevelKeyRewards(prevStage.key);
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/")) {

View File

@ -55,8 +55,6 @@ 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 {

View File

@ -1,165 +0,0 @@
{
"/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": {
"name": "/Lotus/Language/G1Quests/VorsPrize3",
"parentName": "/Lotus/Types/Keys/TestKeyA",
"codexSecret": true,
"rewards": [
{
"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
}
]
}

View File

@ -169,7 +169,6 @@ function renameAccount(taken_name) {
} else { } else {
$(".displayname").text(newname); $(".displayname").text(newname);
updateLocElements(); updateLocElements();
toast(loc("code_succRelog"));
} }
}); });
}); });

View File

@ -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, damit die Änderung im Spiel sichtbar wird.`, code_succRelog: `Fertig. Bitte beachte, dass du dich neu anmelden musst, um Änderungen im Spiel zu sehen.`,
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`,