返回提交历史
Modified
src/controllers/api/checkPendingRecipesController.ts
+12
-3
Modified
src/controllers/api/claimCompletedRecipeController.ts
+7
-2
Modified
src/controllers/api/inventoryController.ts
+33
-0
Modified
src/controllers/api/startRecipeController.ts
+11
-1
Modified
src/helpers/inventoryHelpers.ts
+44
-0
Modified
src/services/inventoryService.ts
+42
-13
Modified
src/services/itemDataService.ts
+594
-0
Modified
src/services/rngService.ts
+4
-0
Modified
static/webui/script.js
+71
-19
Modified
static/webui/translations/de.js
+3
-5
Modified
static/webui/translations/en.js
+3
-5
Modified
static/webui/translations/es.js
+3
-5
Modified
static/webui/translations/fr.js
+3
-5
Modified
static/webui/translations/ru.js
+3
-5
Modified
static/webui/translations/uk.js
+3
-5
Modified
static/webui/translations/zh.js
+3
-5
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
代码差异
16 个文件
+839
-73
@@ -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
@@ -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}`);
@@ -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
}
@@ -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") {
@@ -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
];
@@ -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 };
@@ -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);
@@ -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 => {
@@ -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)`,
@@ -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)`,
@@ -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)`,
@@ -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)`,