XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFESpaceNinjaServer

fix: U5 foundry fixes (#3650)

allows to craft `Inferno Mod` allows to add U5 mods thought webui excludes `Recipes` and `MiscItems` that doesn't exists in U5 to avoid script errors Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/3650 Reviewed-by: Sainan <63328889+sainan@users.noreply.github.com> Co-authored-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Co-committed-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>

09954e0e
AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>
提交于

代码差异

16 个文件 +839 -73
Modified src/controllers/api/checkPendingRecipesController.ts +12 -3
@@ -1,10 +1,12 @@
1 import { getAccountIdForRequest } from "../../services/loginService.ts";
1 import { getAccountForRequest } from "../../services/loginService.ts";
2 2 import type { RequestHandler } from "express";
3 3 import { getInventory } from "../../services/inventoryService.ts";
4 import { modernToU5Recipes, U5Recipes, version_compare } from "../../helpers/inventoryHelpers.ts";
5 import gameToBuildVersion from "../../constants/gameToBuildVersion.ts";
4 6
5 7 export const checkPendingRecipesController: RequestHandler = async (req, res) => {
6 const accountId = await getAccountIdForRequest(req);
7 const inventory = await getInventory(accountId, "PendingRecipes");
8 const account = await getAccountForRequest(req);
9 const inventory = await getInventory(account._id, "PendingRecipes");
8 10 const now = Date.now();
9 11 const resp: ICheckPendingRecipesResponse = {
10 12 PendingRecipes: inventory.PendingRecipes.map(recipe => ({
@@ -13,6 +15,13 @@ export const checkPendingRecipesController: RequestHandler = async (req, res) =>
13 15 }))
14 16 };
15 17
18 if (account.BuildLabel && version_compare(account.BuildLabel, gameToBuildVersion["7.3.0"]) < 0) {
19 resp.PendingRecipes = resp.PendingRecipes.map(recipe => {
20 const U5ItemType = modernToU5Recipes[recipe.ItemType];
21 return U5ItemType ? { ...recipe, ItemType: U5ItemType } : recipe;
22 }).filter(recipe => U5Recipes.includes(recipe.ItemType));
23 }
24
16 25 res.send(resp);
17 26 };
18 27
Modified src/controllers/api/claimCompletedRecipeController.ts +7 -2
@@ -19,12 +19,13 @@ import {
19 19 import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
20 20 import type { IPendingRecipeDatabase } from "../../types/inventoryTypes/inventoryTypes.ts";
21 21 import { InventorySlot } from "../../types/inventoryTypes/inventoryTypes.ts";
22 import { fromOid, toOid2, version_compare } from "../../helpers/inventoryHelpers.ts";
22 import { fromOid, toOid2, U5ToModernRecipes, version_compare } from "../../helpers/inventoryHelpers.ts";
23 23 import type { TInventoryDatabaseDocument } from "../../models/inventoryModels/inventoryModel.ts";
24 24 import type { IRecipe } from "warframe-public-export-plus";
25 25 import type { IEquipmentClient } from "../../types/equipmentTypes.ts";
26 26 import { EquipmentFeatures, Status } from "../../types/equipmentTypes.ts";
27 27 import { pseudoRecipeToOwnedRecipeMap } from "../../services/foundryService.ts";
28 import gameToBuildVersion from "../../constants/gameToBuildVersion.ts";
28 29
29 30 interface IClaimCompletedRecipeRequest {
30 31 RecipeIds?: IOidWithLegacySupport[]; // U24.4 and beyond
@@ -86,7 +87,11 @@ export const claimCompletedRecipeController: RequestHandler = async (req, res) =
86 87 throw new Error(`recipe list from request was undefined?`);
87 88 }
88 89 } else {
89 const recipeName = String(req.query.recipeName); // U8
90 let recipeName = String(req.query.recipeName); // U8
91 if (account.BuildLabel && version_compare(account.BuildLabel, gameToBuildVersion["7.3.0"]) < 0) {
92 const modernItemType = U5ToModernRecipes[recipeName];
93 if (modernItemType) recipeName = modernItemType;
94 }
90 95 const pendingRecipe = inventory.PendingRecipes.find(r => r.ItemType == recipeName);
91 96 if (!pendingRecipe) {
92 97 throw new Error(`no pending recipe found with ItemType ${recipeName}`);
Modified src/controllers/api/inventoryController.ts +33 -0
@@ -40,9 +40,11 @@ import {
40 40 convertIColorToLegacyColorsWithAtt,
41 41 convertToLegacyFingerprint,
42 42 fromOid,
43 modernToU5Recipes,
43 44 toLegacyOid,
44 45 toOid,
45 46 toOid2,
47 U5Recipes,
46 48 version_compare
47 49 } from "../../helpers/inventoryHelpers.ts";
48 50 import { Inbox } from "../../models/inboxModel.ts";
@@ -811,6 +813,37 @@ export const getInventoryResponse = async (
811 813 const n = Number.parseInt(m.Tag.slice(7), 10);
812 814 return n >= 1 && n <= 128;
813 815 });
816
817 inventoryResponse.Recipes = inventoryResponse.Recipes.map(recipe => {
818 const U5ItemType = modernToU5Recipes[recipe.ItemType];
819 return U5ItemType ? { ...recipe, ItemType: U5ItemType } : recipe;
820 }).filter(recipe => U5Recipes.includes(recipe.ItemType));
821 inventoryResponse.PendingRecipes = inventoryResponse.PendingRecipes.map(recipe => {
822 const U5ItemType = modernToU5Recipes[recipe.ItemType];
823 return U5ItemType ? { ...recipe, ItemType: U5ItemType } : recipe;
824 }).filter(recipe => U5Recipes.includes(recipe.ItemType));
825
826 const allowedMiscItems = [
827 "/Lotus/Types/Items/MiscItems/Actuator",
828 "/Lotus/Types/Items/MiscItems/AlloyPlate",
829 "/Lotus/Types/Items/MiscItems/Circuits",
830 "/Lotus/Types/Items/MiscItems/ControlModule",
831 "/Lotus/Types/Items/MiscItems/Ferrite",
832 "/Lotus/Types/Items/MiscItems/Gallium",
833 "/Lotus/Types/Items/MiscItems/Morphic",
834 "/Lotus/Types/Items/MiscItems/Nanospores",
835 "/Lotus/Types/Items/MiscItems/NeuralSensor",
836 "/Lotus/Types/Items/MiscItems/Neurode",
837 "/Lotus/Types/Items/MiscItems/OrokinCell",
838 "/Lotus/Types/Items/MiscItems/Plastids",
839 "/Lotus/Types/Items/MiscItems/PolymerBundle",
840 "/Lotus/Types/Items/MiscItems/Rubedo",
841 "/Lotus/Types/Items/MiscItems/Salvage"
842 ];
843
844 inventoryResponse.MiscItems = inventoryResponse.MiscItems.filter(m =>
845 allowedMiscItems.includes(m.ItemType)
846 );
814 847 }
815 848 }
816 849 }
Modified src/controllers/api/startRecipeController.ts +11 -1
@@ -8,10 +8,11 @@ import { unixTimesInMs } from "../../constants/timeConstants.ts";
8 8 import { Types } from "mongoose";
9 9 import type { ISpectreLoadout } from "../../types/inventoryTypes/inventoryTypes.ts";
10 10 import { InventorySlot } from "../../types/inventoryTypes/inventoryTypes.ts";
11 import { fromOid, toOid } from "../../helpers/inventoryHelpers.ts";
11 import { fromOid, toOid, U5ToModernRecipes, version_compare } from "../../helpers/inventoryHelpers.ts";
12 12 import { ExportWeapons } from "warframe-public-export-plus";
13 13 import { getRandomElement } from "../../services/rngService.ts";
14 14 import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
15 import gameToBuildVersion from "../../constants/gameToBuildVersion.ts";
15 16
16 17 interface IStartRecipeRequest {
17 18 RecipeName: string;
@@ -26,6 +27,10 @@ export const startRecipeController: RequestHandler = async (req, res) => {
26 27
27 28 let recipeName = startRecipeRequest.RecipeName;
28 29 if (req.query.recipeName) recipeName = String(req.query.recipeName); // U8
30 if (account.BuildLabel && version_compare(account.BuildLabel, gameToBuildVersion["7.3.0"]) < 0) {
31 const modernItemType = U5ToModernRecipes[recipeName];
32 if (modernItemType) recipeName = modernItemType;
33 }
29 34 const recipe = getRecipe(recipeName);
30 35
31 36 if (!recipe) {
@@ -54,6 +59,11 @@ export const startRecipeController: RequestHandler = async (req, res) => {
54 59 if (index != -1) {
55 60 inventory.KubrowPetEggs.splice(index, 1);
56 61 }
62 } else if (recipe.ingredients[i].ItemType.startsWith("/Lotus/Upgrades/")) {
63 const index = inventory.Upgrades.findIndex(x => x._id.equals(startRecipeRequest.Ids[i]));
64 if (index != -1) {
65 inventory.Upgrades.splice(index, 1);
66 }
57 67 } else {
58 68 const category = ExportWeapons[recipe.ingredients[i].ItemType].productCategory;
59 69 if (category != "LongGuns" && category != "Pistols" && category != "Melee") {
Modified src/helpers/inventoryHelpers.ts +44 -0
@@ -339,3 +339,47 @@ export const kubrowDetails: TTraitsPool = {
339 339
340 340 Tails: []
341 341 };
342
343 export const modernToU5Recipes: Record<string, string> = {
344 "/Lotus/Types/Recipes/Weapons/CeramicDaggerBlueprint": "/Lotus/Types/Recipes/Weapons/CeramicDaggeBlueprint",
345 "/Lotus/Types/Recipes/Weapons/DarkDaggerBlueprint": "/Lotus/Types/Recipes/Weapons/DarkDaggeBlueprint",
346 "/Lotus/Types/Recipes/Weapons/HeatDaggerBlueprint": "/Lotus/Types/Recipes/Weapons/HeatDaggeBlueprint"
347 };
348
349 export const U5ToModernRecipes: Record<string, string> = Object.fromEntries(
350 Object.entries(modernToU5Recipes).map(([modern, U5]) => [U5, modern])
351 );
352
353 export const U5Recipes = [
354 "/Lotus/Types/Recipes/KevinTestRecipe",
355 "/Lotus/Types/Recipes/CronusBlueprint",
356 "/Lotus/Types/Recipes/IncendiaryRifleModBlueprint",
357 "/Lotus/Types/Recipes/WarframeRecipes/AshBlueprint",
358 "/Lotus/Types/Recipes/WarframeRecipes/AshChassisBlueprint",
359 "/Lotus/Types/Recipes/WarframeRecipes/AshHelmetBlueprint",
360 "/Lotus/Types/Recipes/WarframeRecipes/AshSystemsBlueprint",
361 "/Lotus/Types/Recipes/WarframeRecipes/EmberBlueprint",
362 "/Lotus/Types/Recipes/WarframeRecipes/EmberChassisBlueprint",
363 "/Lotus/Types/Recipes/WarframeRecipes/EmberHelmetBlueprint",
364 "/Lotus/Types/Recipes/WarframeRecipes/EmberSystemsBlueprint",
365 "/Lotus/Types/Recipes/WarframeRecipes/RhinoBlueprint",
366 "/Lotus/Types/Recipes/WarframeRecipes/RhinoChassisBlueprint",
367 "/Lotus/Types/Recipes/WarframeRecipes/RhinoHelmetBlueprint",
368 "/Lotus/Types/Recipes/WarframeRecipes/RhinoSystemsBlueprint",
369 "/Lotus/Types/Recipes/WarframeRecipes/TrinityBlueprint",
370 "/Lotus/Types/Recipes/WarframeRecipes/TrinityChassisBlueprint",
371 "/Lotus/Types/Recipes/WarframeRecipes/TrinityHelmetBlueprint",
372 "/Lotus/Types/Recipes/WarframeRecipes/TrinitySystemsBlueprint",
373 "/Lotus/Types/Recipes/WarframeRecipes/MagBlueprint",
374 "/Lotus/Types/Recipes/WarframeRecipes/MagChassisBlueprint",
375 "/Lotus/Types/Recipes/WarframeRecipes/MagHelmetBlueprint",
376 "/Lotus/Types/Recipes/WarframeRecipes/MagSystemsBlueprint",
377 "/Lotus/Types/Recipes/Weapons/CeramicDaggeBlueprint",
378 "/Lotus/Types/Recipes/Weapons/DarkDaggeBlueprint",
379 "/Lotus/Types/Recipes/Weapons/HeatDaggeBlueprint",
380 "/Lotus/Types/Recipes/Weapons/HeatSwordBlueprint",
381 "/Lotus/Types/Recipes/Weapons/JawBlueprint",
382 "/Lotus/Types/Recipes/Weapons/PangolinSwordBlueprint",
383 "/Lotus/Types/Recipes/Weapons/PlasmaSwordBlueprint",
384 "/Lotus/Types/Recipes/DarkSwordBlueprint"
385 ];
Modified src/services/inventoryService.ts +42 -13
@@ -33,7 +33,14 @@ import { InventorySlot, equipmentKeys } from "../types/inventoryTypes/inventoryT
33 33 import type { IGenericUpdate, IUpdateNodeIntrosResponse } from "../types/genericUpdate.ts";
34 34 import type { IKeyChainRequest, IMissionInventoryUpdateRequest } from "../types/requestTypes.ts";
35 35 import { logger } from "../utils/logger.ts";
36 import { convertInboxMessage, fromStoreItem, getKeyChainItems } from "./itemDataService.ts";
36 import {
37 convertInboxMessage,
38 fromStoreItem,
39 getKeyChainItems,
40 supplementalRecipes,
41 U5ModsWeights,
42 U5Modules
43 } from "./itemDataService.ts";
37 44 import type { IFlavourItem, IItemConfig, IItemConfigDatabase } from "../types/inventoryTypes/commonInventoryTypes.ts";
38 45 import type { IDefaultUpgrade, IPowersuit, ISentinel, TStandingLimitBin } from "warframe-public-export-plus";
39 46 import {
@@ -74,7 +81,14 @@ import {
74 81 import { addQuestKey, completeQuest } from "./questService.ts";
75 82 import { handleBundleAcquisition } from "./purchaseService.ts";
76 83 import libraryDailyTasks from "../../static/fixed_responses/libraryDailyTasks.json" with { type: "json" };
77 import { generateRewardSeed, getRandomElement, getRandomInt, getRandomWeightedReward, SRng } from "./rngService.ts";
84 import {
85 generateRewardSeed,
86 getRandomElement,
87 getRandomFloat,
88 getRandomInt,
89 getRandomWeightedReward,
90 SRng
91 } from "./rngService.ts";
78 92 import type { IMessageCreationTemplate } from "./inboxService.ts";
79 93 import { createMessage } from "./inboxService.ts";
80 94 import { getMaxStanding, getMinStanding } from "../helpers/syndicateStandingHelper.ts";
@@ -483,7 +497,7 @@ export const addItem = async (
483 497 }
484 498
485 499 // Strict typing
486 if (typeName in ExportRecipes) {
500 if (typeName in ExportRecipes || typeName in supplementalRecipes) {
487 501 const recipeChanges = [
488 502 {
489 503 ItemType: typeName,
@@ -625,11 +639,35 @@ export const addItem = async (
625 639 if (
626 640 typeName in ExportUpgrades ||
627 641 typeName in ExportArcanes ||
642 typeName in U5Modules ||
628 643 (typeName.startsWith("/Lotus/Upgrades/Mods/") && // Fusion Core, Legendary Core
629 644 !typeName.startsWith("/Lotus/Upgrades/Mods/FusionBundles/")) ||
630 645 typeName.startsWith("/Lotus/Upgrades/CosmeticEnhancers/") || // Traumatic Peculiar
631 646 (typeName.endsWith("AbilityCard") && typeName.startsWith("/Lotus/Powersuits/"))
632 647 ) {
648 if (!targetFingerprint && typeName in U5Modules) {
649 const meta = U5Modules[typeName];
650 const equipment = getRandomWeightedReward(meta.fits, U5ModsWeights)!;
651 const upgrades = [];
652 {
653 const rolledUpgrade = getRandomWeightedReward(meta.upgrades, U5ModsWeights)!;
654 const rolledRarity = getRandomWeightedReward(
655 (["COMMON", "UNCOMMON", "RARE"] as const).map(rarity => ({ rarity })),
656 U5ModsWeights
657 )!.rarity;
658 const valueRange = rolledUpgrade.ValueRanges[rolledRarity];
659 upgrades.push({
660 upgrade: rolledUpgrade.UpgradeType,
661 valueRarity: rolledRarity,
662 value: getRandomFloat(valueRange[0], valueRange[1]) * (equipment.StatAtten || 1)
663 });
664 }
665 targetFingerprint = JSON.stringify({
666 reqLevel: getRandomInt(0, 30),
667 fits: equipment.Type,
668 upgrades: upgrades
669 });
670 }
633 671 if (targetFingerprint && typeName.startsWith("/Lotus/Upgrades/Mods/Randomized/Raw")) {
634 672 logger.debug(`ignoring fingerprint for raw riven mod`);
635 673 } else if (targetFingerprint && targetFingerprint != `{"lvl":0}`) {
@@ -1148,16 +1186,7 @@ export const addItem = async (
1148 1186 }
1149 1187 break;
1150 1188 case "Keys":
1151 if (typeName.endsWith("Blueprint")) {
1152 const recipeChanges = [
1153 {
1154 ItemType: typeName,
1155 ItemCount: quantity
1156 } satisfies ITypeCount
1157 ];
1158 addRecipes(inventory, recipeChanges);
1159 return { Recipes: recipeChanges };
1160 } else if (typeName.endsWith("Key") || typeName.substring(1).split("/")[3] == "RaidKeys") {
1189 if (typeName.endsWith("Key") || typeName.substring(1).split("/")[3] == "RaidKeys") {
1161 1190 const levelKeyChanges = [{ ItemType: typeName, ItemCount: quantity }];
1162 1191 addLevelKeys(inventory, levelKeyChanges);
1163 1192 return { LevelKeys: levelKeyChanges };
Modified src/services/rngService.ts +4 -0
@@ -18,6 +18,10 @@ export const getRandomInt = (min: number, max: number): number => {
18 18 return Math.floor(Math.random() * (max - min + 1)) + min;
19 19 };
20 20
21 export const getRandomFloat = (min: number, max: number, decimals = 9): number => {
22 return Number((Math.random() * (max - min) + min).toFixed(decimals));
23 };
24
21 25 export const generateRewardSeed = (): bigint => {
22 26 const hiDword = getRandomInt(0, 0x7fffffff);
23 27 const loDword = getRandomInt(0, 0xffffffff);
Modified static/webui/script.js +71 -19
@@ -537,6 +537,36 @@ function fetchItemList() {
537 537 {
538 538 uniqueName: "/Lotus/Upgrades/CosmeticEnhancers/Peculiars/CyoteMod",
539 539 name: loc("code_traumaticPeculiar")
540 },
541 {
542 uniqueName: "/Lotus/Upgrades/Modules/GrineerMeleeModule",
543 name: loc("code_U5Mod").replace("|TYPE|", loc("code_melee")),
544 fusionLimit: 0
545 },
546 {
547 uniqueName: "/Lotus/Upgrades/Modules/GrineerPistolModule",
548 name: loc("code_U5Mod").replace("|TYPE|", loc("code_pistol")),
549 fusionLimit: 0
550 },
551 {
552 uniqueName: "/Lotus/Upgrades/Modules/GrineerRifleModule",
553 name: loc("code_U5Mod").replace("|TYPE|", loc("code_rifle")),
554 fusionLimit: 0
555 },
556 {
557 uniqueName: "/Lotus/Upgrades/Modules/GrineerShotgunModule",
558 name: loc("code_U5Mod").replace("|TYPE|", loc("code_shotgun")),
559 fusionLimit: 0
560 },
561 {
562 uniqueName: "/Lotus/Upgrades/Modules/OrokinWarframeModule",
563 name: loc("code_U5Mod").replace("|TYPE|", loc("code_warframe")),
564 fusionLimit: 0
565 },
566 {
567 uniqueName: "/Lotus/Upgrades/Modules/Crafted/IncendiaryRifleMod",
568 name: loc("code_infernoMod"),
569 fusionLimit: 0
540 570 }
541 571 );
542 572
@@ -717,6 +747,14 @@ function fetchItemList() {
717 747 "|ITEM|",
718 748 data.miscitems.find(i => i.uniqueName === "/Lotus/Types/Keys/DerelictSurvivalKey").name
719 749 )
750 },
751 {
752 uniqueName: "/Lotus/Types/Recipes/KevinTestRecipe",
753 name: data.blueprintAndItem.replace("|ITEM|", loc("code_infernoMod"))
754 },
755 {
756 uniqueName: "/Lotus/Types/Recipes/IncendiaryRifleModBlueprint",
757 name: data.blueprintAndItem.replace("|ITEM|", loc("code_infernoMod"))
720 758 }
721 759 );
722 760
@@ -794,21 +832,7 @@ function fetchItemList() {
794 832 "/Lotus/Language/Game/Rank_Utility": {
795 833 name: loc("guildView_rank_utility")
796 834 },
797 "/Lotus/Upgrades/Modules/GrineerMeleeModule": {
798 name: loc("code_meleeMod")
799 },
800 "/Lotus/Upgrades/Modules/GrineerPistolModule": {
801 name: loc("code_pistolMod")
802 },
803 "/Lotus/Upgrades/Modules/GrineerRifleModule": {
804 name: loc("code_rifleMod")
805 },
806 "/Lotus/Upgrades/Modules/GrineerShotgunModule": {
807 name: loc("code_shotgunMod")
808 },
809 "/Lotus/Upgrades/Modules/OrokinWarframeModule": {
810 name: loc("code_warframeMod")
811 }
835 "/Lotus/Types/Game/PowerSuit": { name: loc("code_warframe") }
812 836 };
813 837 for (const [type, items] of Object.entries(data)) {
814 838 if (type == "archonCrystalUpgrades") {
@@ -1683,6 +1707,25 @@ function translateInventoryDataToDom() {
1683 1707 {
1684 1708 const td = document.createElement("td");
1685 1709 td.textContent = itemMap[item.ItemType]?.name ?? item.ItemType;
1710 if (
1711 [
1712 "/Lotus/Upgrades/Modules/GrineerMeleeModule",
1713 "/Lotus/Upgrades/Modules/GrineerPistolModule",
1714 "/Lotus/Upgrades/Modules/GrineerRifleModule",
1715 "/Lotus/Upgrades/Modules/GrineerShotgunModule",
1716 "/Lotus/Upgrades/Modules/OrokinWarframeModule"
1717 ].includes(item.ItemType)
1718 ) {
1719 if (item.UpgradeFingerprint) {
1720 const fingerprint = JSON.parse(item.UpgradeFingerprint);
1721 if (fingerprint.fits) {
1722 td.textContent = loc("code_U5Mod").replace(
1723 "|TYPE|",
1724 itemMap[fingerprint.fits]?.name ?? fingerprint.fits
1725 );
1726 }
1727 }
1728 }
1686 1729 if (itemMap[item.ItemType]?.badReason == "notraw") {
1687 1730 // Assuming this is a riven with a pending challenge, so rank would be N/A, but otherwise it's fine.
1688 1731 } else if (!Number.isNaN(rank)) {
@@ -3965,10 +4008,19 @@ function doAddAllMods() {
3965 4008 for (const child of document.getElementById("datalist-mods").children) {
3966 4009 modsAll.add(child.getAttribute("data-key"));
3967 4010 }
3968 modsAll.delete("/Lotus/Upgrades/Mods/Fusers/CommonModFuser");
3969 modsAll.delete("/Lotus/Upgrades/Mods/Fusers/UncommonModFuser");
3970 modsAll.delete("/Lotus/Upgrades/Mods/Fusers/RareModFuser");
3971 modsAll.delete("/Lotus/Upgrades/Mods/Fusers/LegendaryModFuser");
4011
4012 [
4013 "/Lotus/Upgrades/Mods/Fusers/CommonModFuser",
4014 "/Lotus/Upgrades/Mods/Fusers/UncommonModFuser",
4015 "/Lotus/Upgrades/Mods/Fusers/RareModFuser",
4016 "/Lotus/Upgrades/Mods/Fusers/LegendaryModFuser",
4017 "/Lotus/Upgrades/Modules/GrineerMeleeModule",
4018 "/Lotus/Upgrades/Modules/GrineerPistolModule",
4019 "/Lotus/Upgrades/Modules/GrineerRifleModule",
4020 "/Lotus/Upgrades/Modules/GrineerShotgunModule",
4021 "/Lotus/Upgrades/Modules/OrokinWarframeModule",
4022 "/Lotus/Upgrades/Modules/Crafted/IncendiaryRifleMod"
4023 ].forEach(path => modsAll.delete(path));
3972 4024
3973 4025 revalidateAuthz().then(() => {
3974 4026 getInventoryData().then(data => {
Modified static/webui/translations/de.js +3 -5
@@ -24,17 +24,15 @@ dict = {
24 24 code_moteAmp: `Anfangsverstärker`,
25 25 code_amp: `Verstärker`,
26 26 code_kDrive: `K-Drive`,
27 code_warframe: `Warframe`,
27 28 code_fusionCoreCommon: `Fusionskern (Gewöhnlich)`,
28 29 code_fusionCoreUncommon: `Fusionskern (Ungewöhnlich)`,
29 30 code_fusionCoreRare: `Fusionskern (Selten)`,
30 31 code_ancientFusionCoreCommon: `Antiker Fusionskern (Gewöhnlich)`,
31 32 code_ancientFusionCoreUncommon: `Antiker Fusionskern (Ungewöhnlich)`,
32 33 code_ancientFusionCoreRare: `Antiker Fusionskern (Selten)`,
33 code_meleeMod: `Nahkampf-Mod`,
34 code_pistolMod: `Pistolen-Mod`,
35 code_rifleMod: `Gewehr-Mod`,
36 code_shotgunMod: `Schrotflinten-Mod`,
37 code_warframeMod: `Warframe-Mod`,
34 code_U5Mod: `|TYPE|-Mod`,
35 code_infernoMod: `[UNTRANSLATED] Inferno Mod`,
38 36 code_legendaryCore: `Legendärer Kern`,
39 37 code_traumaticPeculiar: `Kuriose Mod: Traumatisch`,
40 38 code_starter: `|MOD| (Defekt)`,
Modified static/webui/translations/en.js +3 -5
@@ -23,17 +23,15 @@ dict = {
23 23 code_moteAmp: `Mote Amp`,
24 24 code_amp: `Amp`,
25 25 code_kDrive: `K-Drive`,
26 code_warframe: `Warframe`,
26 27 code_fusionCoreCommon: `Fusion Core (Common)`,
27 28 code_fusionCoreUncommon: `Fusion Core (Uncommon)`,
28 29 code_fusionCoreRare: `Fusion Core (Rare)`,
29 30 code_ancientFusionCoreCommon: `Ancient Fusion Core (Common)`,
30 31 code_ancientFusionCoreUncommon: `Ancient Fusion Core (Uncommon)`,
31 32 code_ancientFusionCoreRare: `Ancient Fusion Core (Rare)`,
32 code_meleeMod: `Melee Mod`,
33 code_pistolMod: `Pistol Mod`,
34 code_rifleMod: `Rifle Mod`,
35 code_shotgunMod: `Shotgun Mod`,
36 code_warframeMod: `Warframe Mod`,
33 code_U5Mod: `|TYPE| Mod`,
34 code_infernoMod: `Inferno Mod`,
37 35 code_legendaryCore: `Legendary Core`,
38 36 code_traumaticPeculiar: `Traumatic Peculiar`,
39 37 code_starter: `|MOD| (Flawed)`,
Modified static/webui/translations/es.js +3 -5
@@ -24,17 +24,15 @@ dict = {
24 24 code_moteAmp: `Amp Mota`,
25 25 code_amp: `Amp`,
26 26 code_kDrive: `K-Drive`,
27 code_warframe: `Warframe`,
27 28 code_fusionCoreCommon: `[UNTRANSLATED] Fusion Core (Common)`,
28 29 code_fusionCoreUncommon: `[UNTRANSLATED] Fusion Core (Uncommon)`,
29 30 code_fusionCoreRare: `[UNTRANSLATED] Fusion Core (Rare)`,
30 31 code_ancientFusionCoreCommon: `[UNTRANSLATED] Ancient Fusion Core (Common)`,
31 32 code_ancientFusionCoreUncommon: `[UNTRANSLATED] Ancient Fusion Core (Uncommon)`,
32 33 code_ancientFusionCoreRare: `[UNTRANSLATED] Ancient Fusion Core (Rare)`,
33 code_meleeMod: `[UNTRANSLATED] Melee Mod`,
34 code_pistolMod: `[UNTRANSLATED] Pistol Mod`,
35 code_rifleMod: `[UNTRANSLATED] Rifle Mod`,
36 code_shotgunMod: `[UNTRANSLATED] Shotgun Mod`,
37 code_warframeMod: `[UNTRANSLATED] Warframe Mod`,
34 code_U5Mod: `[UNTRANSLATED] |TYPE| Mod`,
35 code_infernoMod: `[UNTRANSLATED] Inferno Mod`,
38 36 code_legendaryCore: `Núcleo legendario`,
39 37 code_traumaticPeculiar: `Traumatismo peculiar`,
40 38 code_starter: `|MOD| (Defectuoso)`,
Modified static/webui/translations/fr.js +3 -5
@@ -24,17 +24,15 @@ dict = {
24 24 code_moteAmp: `Amplificateur Faible`,
25 25 code_amp: `Amplificateur`,
26 26 code_kDrive: `K-Drive`,
27 code_warframe: `Warframe`,
27 28 code_fusionCoreCommon: `Coeur de fusion (Commun)`,
28 29 code_fusionCoreUncommon: `Coeur de fusion (Inhabituel)`,
29 30 code_fusionCoreRare: `Coeur de fusion (Rare)`,
30 31 code_ancientFusionCoreCommon: `Coeur de fusion ancien (Commun)`,
31 32 code_ancientFusionCoreUncommon: `Coeur de fusion ancien (Inhabituel)`,
32 33 code_ancientFusionCoreRare: `Coeur de fusion ancien (Rare)`,
33 code_meleeMod: `Mod de mêlée`,
34 code_pistolMod: `Mod de pistolet`,
35 code_rifleMod: `Mod de fusil`,
36 code_shotgunMod: `Mod de fusil à pompe`,
37 code_warframeMod: `Mod de Warframe`,
34 code_U5Mod: `Mod de |TYPE|`,
35 code_infernoMod: `[UNTRANSLATED] Inferno Mod`,
38 36 code_legendaryCore: `Coeur Légendaire`,
39 37 code_traumaticPeculiar: `Traumatisme Atypique`,
40 38 code_starter: `|MOD| (Défectueux)`,
Modified static/webui/translations/ru.js +3 -5
Modified static/webui/translations/uk.js +3 -5
Modified static/webui/translations/zh.js +3 -5