From 61471d678573f571b2358b474df894fadbb44745 Mon Sep 17 00:00:00 2001 From: Sainan Date: Tue, 11 Feb 2025 08:22:37 -0800 Subject: [PATCH 01/11] chore: update nightwave to vol. 8 (#941) Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/941 --- src/services/serversideVendorsService.ts | 4 +- ...dioLegionIntermission11VendorManifest.json | 559 -------- ...dioLegionIntermission12VendorManifest.json | 1192 +++++++++++++++++ .../worldState/worldState.json | 12 +- 4 files changed, 1204 insertions(+), 563 deletions(-) delete mode 100644 static/fixed_responses/getVendorInfo/RadioLegionIntermission11VendorManifest.json create mode 100644 static/fixed_responses/getVendorInfo/RadioLegionIntermission12VendorManifest.json diff --git a/src/services/serversideVendorsService.ts b/src/services/serversideVendorsService.ts index d4873a1d..b06f6ae7 100644 --- a/src/services/serversideVendorsService.ts +++ b/src/services/serversideVendorsService.ts @@ -21,7 +21,7 @@ import MaskSalesmanManifest from "@/static/fixed_responses/getVendorInfo/MaskSal import OstronFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronFishmongerVendorManifest.json"; import OstronPetVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronPetVendorManifest.json"; import OstronProspectorVendorManifest from "@/static/fixed_responses/getVendorInfo/OstronProspectorVendorManifest.json"; -import RadioLegionIntermission11VendorManifest from "@/static/fixed_responses/getVendorInfo/RadioLegionIntermission11VendorManifest.json"; +import RadioLegionIntermission12VendorManifest from "@/static/fixed_responses/getVendorInfo/RadioLegionIntermission12VendorManifest.json"; import SolarisDebtTokenVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisDebtTokenVendorManifest.json"; import SolarisDebtTokenVendorRepossessionsManifest from "@/static/fixed_responses/getVendorInfo/SolarisDebtTokenVendorRepossessionsManifest.json"; import SolarisFishmongerVendorManifest from "@/static/fixed_responses/getVendorInfo/SolarisFishmongerVendorManifest.json"; @@ -70,7 +70,7 @@ const vendorManifests: IVendorManifest[] = [ OstronFishmongerVendorManifest, OstronPetVendorManifest, OstronProspectorVendorManifest, - RadioLegionIntermission11VendorManifest, + RadioLegionIntermission12VendorManifest, SolarisDebtTokenVendorManifest, SolarisDebtTokenVendorRepossessionsManifest, SolarisFishmongerVendorManifest, diff --git a/static/fixed_responses/getVendorInfo/RadioLegionIntermission11VendorManifest.json b/static/fixed_responses/getVendorInfo/RadioLegionIntermission11VendorManifest.json deleted file mode 100644 index 008a1a7a..00000000 --- a/static/fixed_responses/getVendorInfo/RadioLegionIntermission11VendorManifest.json +++ /dev/null @@ -1,559 +0,0 @@ -{ - "VendorInfo": { - "_id": { "$oid": "66d538400000000000000000" }, - "TypeName": "/Lotus/Types/Game/VendorManifests/Events/RadioLegionIntermission11VendorManifest", - "ItemManifest": [ - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/TrapperChassisBlueprint", - "ItemPrices": [{ "ItemCount": 25, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000049" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/TrapperSystemsBlueprint", - "ItemPrices": [{ "ItemCount": 25, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000050" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/TrapperHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 25, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000051" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/OrokinCatalyst", - "ItemPrices": [{ "ItemCount": 75, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000052" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/OrokinReactor", - "ItemPrices": [{ "ItemCount": 75, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000053" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/Alertium", - "ItemPrices": [{ "ItemCount": 15, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 5, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000054" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/Kuva", - "ItemPrices": [{ "ItemCount": 50, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_3", - "QuantityMultiplier": 10000, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000055" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Nightwave/GlassmakerShipDeco", - "ItemPrices": [{ "ItemCount": 60, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "PurchaseQuantityLimit": 1, - "AllowMultipurchase": false, - "Id": { "$oid": "001400140000000000000056" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/ProteaAltHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000941" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StyanaxAltDHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000942" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/GramSolsticeSkinBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000943" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/PriestAltHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000944" } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Skins/Hoverboard/HoverboardStickerWolf", - "ItemPrices": [{ "ItemCount": 30, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000945" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessExcaliburAltHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000946" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessVaubanAltHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000947" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/PirateAltBHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000948" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessBansheeAltHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000949" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/HarlequinAltHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000950" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/NovaSlipstreamHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000951" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/NekrosShroudHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000952" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/GlassAltHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000953" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/TatsuSolsticeSkinBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000954" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessNyxAltHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000955" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/AtomosSolsticeSkinBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000956" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessTrinityAltHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000957" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/DanteAltHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000958" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessV2EmberAltHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000959" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/VaubanHelmetSoldierBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000960" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessV2FrostAltHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000961" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessSarynAltHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000962" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/ValkyrBastetHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000963" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/MirageAltBHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000964" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/OberonAltHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000965" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessV2TrinityAltHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000966" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/FairyAltTwoHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000967" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/DragonAltHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000968" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/JadeAltHelmetBlueprint", - "ItemPrices": [{ "ItemCount": 35, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000969" } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerSniperDamageAuraMod", - "ItemPrices": [{ "ItemCount": 20, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_1", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000970" } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerSprintAuraMod", - "ItemPrices": [{ "ItemCount": 20, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_1", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000971" } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Rifle/Event/Arbitration/InfCrpShockSwarmRifleArbitrationMod", - "ItemPrices": [{ "ItemCount": 20, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_1", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000972" } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerEnemyRadarAuraMod", - "ItemPrices": [{ "ItemCount": 20, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_1", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000973" } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Nightwave/MagnusNightwaveMod", - "ItemPrices": [{ "ItemCount": 20, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_1", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000974" } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerEnergyHealthRegenAuraMod", - "ItemPrices": [{ "ItemCount": 20, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_1", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000975" } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerRifleAmmoAuraMod", - "ItemPrices": [{ "ItemCount": 20, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_1", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000976" } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Aura/InfestationSpeedReductionAuraMod", - "ItemPrices": [{ "ItemCount": 20, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_1", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000977" } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Rifle/Event/Nightwave/NightwaveTiberonAugmentMod", - "ItemPrices": [{ "ItemCount": 20, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_1", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000978" } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerHealthAuraMod", - "ItemPrices": [{ "ItemCount": 20, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_1", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000979" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/GrnHammerBlueprint", - "ItemPrices": [{ "ItemCount": 30, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_2", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000980" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/GrnAxeBlueprint", - "ItemPrices": [{ "ItemCount": 30, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_2", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000981" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/DesertGrinlokSkinBlueprint", - "ItemPrices": [{ "ItemCount": 30, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_2", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000982" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/DaggerAxeBlueprint", - "ItemPrices": [{ "ItemCount": 30, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_2", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000983" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/ShockPlinxSkinBlueprint", - "ItemPrices": [{ "ItemCount": 30, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_3", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000984" } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Skins/Clan/GlassmakerEmblemItem", - "ItemPrices": [{ "ItemCount": 30, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_3", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000985" } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Skins/Sigils/NoraSeasonTwoSigil", - "ItemPrices": [{ "ItemCount": 30, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_3", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000986" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/PhotoboothTileWolfSixPrison", - "ItemPrices": [{ "ItemCount": 45, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_3", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000987" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/ShockExergisSkinBlueprint", - "ItemPrices": [{ "ItemCount": 30, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_3", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000988" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/HeatDaggerBlueprint", - "ItemPrices": [{ "ItemCount": 50, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_3", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000989" } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/CeramicDaggerBlueprint", - "ItemPrices": [{ "ItemCount": 50, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_3", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000990" } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/PvPMods/Rifle/GrakataUnlimitedAmmo", - "ItemPrices": [{ "ItemCount": 20, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_4", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000991" } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/PvPMods/Rifle/SupraHigherAccuracyAiming", - "ItemPrices": [{ "ItemCount": 20, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_4", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000992" } - }, - { - "StoreItem": "/Lotus/StoreItems/Powersuits/Ranger/RangerQuiverPvPAugmentCard", - "ItemPrices": [{ "ItemCount": 20, "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionElevenCreds", "ProductCategory": "MiscItems" }], - "Bin": "BIN_4", - "QuantityMultiplier": 1, - "Expiry": { "$date": { "$numberLong": "2051240400000" } }, - "AllowMultipurchase": true, - "Id": { "$oid": "001400140000000000000993" } - } - ], - "Expiry": { "$date": { "$numberLong": "2051240400000" } } - } -} diff --git a/static/fixed_responses/getVendorInfo/RadioLegionIntermission12VendorManifest.json b/static/fixed_responses/getVendorInfo/RadioLegionIntermission12VendorManifest.json new file mode 100644 index 00000000..7086dc2d --- /dev/null +++ b/static/fixed_responses/getVendorInfo/RadioLegionIntermission12VendorManifest.json @@ -0,0 +1,1192 @@ +{ + "VendorInfo": { + "_id": { + "$oid": "67a04d500000000000000000" + }, + "TypeName": "/Lotus/Types/Game/VendorManifests/Events/RadioLegionIntermission12VendorManifest", + "ItemManifest": [ + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/TrapperChassisBlueprint", + "ItemPrices": [ + { + "ItemCount": 25, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000049" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/TrapperSystemsBlueprint", + "ItemPrices": [ + { + "ItemCount": 25, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000050" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/TrapperHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 25, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000051" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/OrokinCatalyst", + "ItemPrices": [ + { + "ItemCount": 75, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000052" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/OrokinReactor", + "ItemPrices": [ + { + "ItemCount": 75, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000053" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/Alertium", + "ItemPrices": [ + { + "ItemCount": 15, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 5, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000054" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/Kuva", + "ItemPrices": [ + { + "ItemCount": 50, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_3", + "QuantityMultiplier": 10000, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000055" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Nightwave/GlassmakerShipDeco", + "ItemPrices": [ + { + "ItemCount": 60, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "PurchaseQuantityLimit": 1, + "AllowMultipurchase": false, + "Id": { + "$oid": "001500150000000000000056" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Skins/Hoverboard/HoverboardStickerWolf", + "ItemPrices": [ + { + "ItemCount": 30, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000057" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessV2MagAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000058" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessRhinoAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000059" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/NekrosShroudHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000060" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessAshAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000061" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/XakuAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000062" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessVaubanAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000063" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessV2TrinityAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000064" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/HildrynAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000065" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessFrostAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000066" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/OperatorArmour/Hood/RealOperatorWolfHoodBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000067" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessV2SarynAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000068" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/NidusAltTwoHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000069" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/OberonAltBHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000070" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StyanaxAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000071" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/ExcaliburMordredHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000072" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/RangerAltBHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000073" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessV2EmberAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000074" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/AnimaAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000075" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/JadeAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000076" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/NekrosAraknidHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000077" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/ProteaAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000078" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/PriestAlt2HelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000079" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/AtomosSolsticeSkinBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000080" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/DanteAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000081" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/RevenantAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000082" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/SandmanAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000083" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerLootRadarAuraMod", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_1", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000084" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerRifleDamageAuraMod", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_1", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000085" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerShellAmmoAuraMod", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_1", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000086" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Nightwave/BroncoNightwaveMod", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_1", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000087" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerHealthAuraMod", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_1", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000088" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Nightwave/MagnusNightwaveMod", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_1", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000089" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Rifle/Event/Nightwave/NightwaveBattacorAugmentMod", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_1", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000090" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/GrnAxeBlueprint", + "ItemPrices": [ + { + "ItemCount": 30, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_2", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000091" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/DesertGrinlokSkinBlueprint", + "ItemPrices": [ + { + "ItemCount": 30, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_2", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000092" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/HeatDaggerBlueprint", + "ItemPrices": [ + { + "ItemCount": 50, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_3", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000093" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/GlaiveBlueprint", + "ItemPrices": [ + { + "ItemCount": 50, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_3", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000094" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/DarkDaggerBlueprint", + "ItemPrices": [ + { + "ItemCount": 50, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_3", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000095" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Skins/Sigils/NoraSeasonTwoSigil", + "ItemPrices": [ + { + "ItemCount": 30, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_3", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000096" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/DarkSwordBlueprint", + "ItemPrices": [ + { + "ItemCount": 50, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_3", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000097" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/PlasmaSwordBlueprint", + "ItemPrices": [ + { + "ItemCount": 50, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_3", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000098" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/ShockExergisSkinBlueprint", + "ItemPrices": [ + { + "ItemCount": 30, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_3", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000099" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/PlushyThumperMediumDirty", + "ItemPrices": [ + { + "ItemCount": 40, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_3", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000100" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/PvPMods/Rifle/TetraFasterProjAiming", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_4", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000101" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Powersuits/Jade/SelfBulletAttractorPvPAugmentCard", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_4", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000102" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/PvPMods/Rifle/SupraHigherAccuracyAiming", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_4", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000103" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/PvPMods/Rifle/RubicoLowZoom", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_4", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000104" + } + } + ], + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + } + } +} \ No newline at end of file diff --git a/static/fixed_responses/worldState/worldState.json b/static/fixed_responses/worldState/worldState.json index 06fe715d..eef85698 100644 --- a/static/fixed_responses/worldState/worldState.json +++ b/static/fixed_responses/worldState/worldState.json @@ -150,6 +150,14 @@ "Seed": 353, "Nodes": [] }, + { + "_id": { "$oid": "663a4fc5ba6f84724fa48060" }, + "Activation": { "$date": { "$numberLong": "1715097541439" } }, + "Expiry": { "$date": { "$numberLong": "2000000000000" } }, + "Tag": "RadioLegionIntermission12Syndicate", + "Seed": 353, + "Nodes": [] + }, { "_id": { "$oid": "663a4fc5ba6f84724fa48057" }, "Activation": { "$date": { "$numberLong": "1715097541439" } }, @@ -1115,8 +1123,8 @@ "SeasonInfo": { "Activation": { "$date": { "$numberLong": "1715796000000" } }, "Expiry": { "$date": { "$numberLong": "2000000000000" } }, - "AffiliationTag": "RadioLegionIntermission11Syndicate", - "Season": 13, + "AffiliationTag": "RadioLegionIntermission12Syndicate", + "Season": 14, "Phase": 0, "Params": "", "ActiveChallenges": [ From b3b2ce55245bf6ac3e5eaeff4df60419a354a66d Mon Sep 17 00:00:00 2001 From: Sainan Date: Tue, 11 Feb 2025 08:22:43 -0800 Subject: [PATCH 02/11] fix(webui): remove 'step' from number inputs (#944) browsers seem to validate that the value is a multiple of the step size, which was not the intention here Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/944 --- static/webui/index.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/static/webui/index.html b/static/webui/index.html index 497122ae..5273ba50 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -101,7 +101,7 @@

- +
@@ -113,7 +113,7 @@

- +
@@ -125,7 +125,7 @@

- +
@@ -137,7 +137,7 @@

- +
From dc4d592b5a385573035661cbf127fad7c0809c12 Mon Sep 17 00:00:00 2001 From: Sainan Date: Wed, 12 Feb 2025 00:22:05 +0100 Subject: [PATCH 03/11] chore: fix order in api.ts --- src/routes/api.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/routes/api.ts b/src/routes/api.ts index 19f7d0e5..4d2571c0 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -32,6 +32,8 @@ import { getVendorInfoController } from "@/src/controllers/api/getVendorInfoCont import { getVoidProjectionRewardsController } from "@/src/controllers/api/getVoidProjectionRewardsController"; import { gildWeaponController } from "@/src/controllers/api/gildWeaponController"; import { giveKeyChainTriggeredItemsController } from "@/src/controllers/api/giveKeyChainTriggeredItemsController"; +import { giveKeyChainTriggeredMessageController } from "@/src/controllers/api/giveKeyChainTriggeredMessageController"; +import { giveQuestKeyRewardController } from "@/src/controllers/api/giveQuestKey"; import { guildTechController } from "../controllers/api/guildTechController"; import { hostSessionController } from "@/src/controllers/api/hostSessionController"; import { hubController } from "@/src/controllers/api/hubController"; @@ -82,8 +84,6 @@ import { updateQuestController } from "@/src/controllers/api/updateQuestControll import { updateSessionGetController, updateSessionPostController } from "@/src/controllers/api/updateSessionController"; import { updateThemeController } from "../controllers/api/updateThemeController"; import { upgradesController } from "@/src/controllers/api/upgradesController"; -import { giveKeyChainTriggeredMessageController } from "@/src/controllers/api/giveKeyChainTriggeredMessageController"; -import { giveQuestKeyRewardController } from "@/src/controllers/api/giveQuestKey"; const apiRouter = express.Router(); @@ -174,9 +174,9 @@ apiRouter.post("/trainingResult.php", trainingResultController); apiRouter.post("/unlockShipFeature.php", unlockShipFeatureController); apiRouter.post("/updateChallengeProgress.php", updateChallengeProgressController); apiRouter.post("/updateNodeIntros.php", genericUpdateController); +apiRouter.post("/updateQuest.php", updateQuestController); apiRouter.post("/updateSession.php", updateSessionPostController); apiRouter.post("/updateTheme.php", updateThemeController); -apiRouter.post("/updateQuest.php", updateQuestController); apiRouter.post("/upgrades.php", upgradesController); export { apiRouter }; From cf50738d34e00c3d3240b9a490f06b104ee06f55 Mon Sep 17 00:00:00 2001 From: Sainan Date: Tue, 11 Feb 2025 20:11:31 -0800 Subject: [PATCH 04/11] feat: setDojoComponentMessage (#948) Closes #946 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/948 --- src/controllers/api/getGuildDojoController.ts | 34 +----------- ...queueDojoComponentDestructionController.ts | 6 +-- .../api/setDojoComponentMessageController.ts | 18 +++++++ .../api/startDojoRecipeController.ts | 6 +-- src/models/guildModel.ts | 2 + src/routes/api.ts | 2 + src/services/guildService.ts | 54 ++++++++++++++++++- src/types/guildTypes.ts | 2 + 8 files changed, 82 insertions(+), 42 deletions(-) create mode 100644 src/controllers/api/setDojoComponentMessageController.ts diff --git a/src/controllers/api/getGuildDojoController.ts b/src/controllers/api/getGuildDojoController.ts index e16040aa..9d7ed93f 100644 --- a/src/controllers/api/getGuildDojoController.ts +++ b/src/controllers/api/getGuildDojoController.ts @@ -1,8 +1,7 @@ import { RequestHandler } from "express"; import { Types } from "mongoose"; import { Guild } from "@/src/models/guildModel"; -import { IDojoClient, IDojoComponentClient } from "@/src/types/guildTypes"; -import { toOid, toMongoDate } from "@/src/helpers/inventoryHelpers"; +import { getDojoClient } from "@/src/services/guildService"; export const getGuildDojoController: RequestHandler = async (req, res) => { const guildId = req.query.guildId as string; @@ -26,34 +25,5 @@ export const getGuildDojoController: RequestHandler = async (req, res) => { await guild.save(); } - const dojo: IDojoClient = { - _id: { $oid: guildId }, - Name: guild.Name, - Tier: 1, - FixedContributions: true, - DojoRevision: 1, - RevisionTime: Math.round(Date.now() / 1000), - Energy: guild.DojoEnergy, - Capacity: guild.DojoCapacity, - DojoRequestStatus: 0, - DojoComponents: [] - }; - guild.DojoComponents.forEach(dojoComponent => { - const clientComponent: IDojoComponentClient = { - id: toOid(dojoComponent._id), - pf: dojoComponent.pf, - ppf: dojoComponent.ppf, - DecoCapacity: 600 - }; - if (dojoComponent.pi) { - clientComponent.pi = toOid(dojoComponent.pi); - clientComponent.op = dojoComponent.op!; - clientComponent.pp = dojoComponent.pp!; - } - if (dojoComponent.CompletionTime) { - clientComponent.CompletionTime = toMongoDate(dojoComponent.CompletionTime); - } - dojo.DojoComponents.push(clientComponent); - }); - res.json(dojo); + res.json(getDojoClient(guild, 0)); }; diff --git a/src/controllers/api/queueDojoComponentDestructionController.ts b/src/controllers/api/queueDojoComponentDestructionController.ts index da84c40f..7f612896 100644 --- a/src/controllers/api/queueDojoComponentDestructionController.ts +++ b/src/controllers/api/queueDojoComponentDestructionController.ts @@ -1,4 +1,4 @@ -import { getGuildForRequest } from "@/src/services/guildService"; +import { getDojoClient, getGuildForRequest } from "@/src/services/guildService"; import { RequestHandler } from "express"; import { ExportDojoRecipes } from "warframe-public-export-plus"; @@ -15,7 +15,5 @@ export const queueDojoComponentDestructionController: RequestHandler = async (re guild.DojoEnergy -= room.energy; } await guild.save(); - res.json({ - DojoRequestStatus: 1 - }); + res.json(getDojoClient(guild, 1)); }; diff --git a/src/controllers/api/setDojoComponentMessageController.ts b/src/controllers/api/setDojoComponentMessageController.ts new file mode 100644 index 00000000..714dd7a5 --- /dev/null +++ b/src/controllers/api/setDojoComponentMessageController.ts @@ -0,0 +1,18 @@ +import { RequestHandler } from "express"; +import { getDojoClient, getGuildForRequest } from "@/src/services/guildService"; + +export const setDojoComponentMessageController: RequestHandler = async (req, res) => { + const guild = await getGuildForRequest(req); + // At this point, we know that a member of the guild is making this request. Assuming they are allowed to change the message. + const component = guild.DojoComponents!.find(x => x._id.equals(req.query.componentId as string))!; + const payload = JSON.parse(String(req.body)) as SetDojoComponentMessageRequest; + if ("Name" in payload) { + component.Name = payload.Name; + } else { + component.Message = payload.Message; + } + await guild.save(); + res.json(getDojoClient(guild, 1)); +}; + +type SetDojoComponentMessageRequest = { Name: string } | { Message: string }; diff --git a/src/controllers/api/startDojoRecipeController.ts b/src/controllers/api/startDojoRecipeController.ts index 625912d5..6fd2b5a9 100644 --- a/src/controllers/api/startDojoRecipeController.ts +++ b/src/controllers/api/startDojoRecipeController.ts @@ -1,6 +1,6 @@ import { RequestHandler } from "express"; import { IDojoComponentClient } from "@/src/types/guildTypes"; -import { getGuildForRequest } from "@/src/services/guildService"; +import { getDojoClient, getGuildForRequest } from "@/src/services/guildService"; import { Types } from "mongoose"; import { ExportDojoRecipes } from "warframe-public-export-plus"; @@ -30,7 +30,5 @@ export const startDojoRecipeController: RequestHandler = async (req, res) => { CompletionTime: new Date(Date.now()) // TOOD: Omit this field & handle the "Collecting Materials" state. }); await guild.save(); - res.json({ - DojoRequestStatus: 0 - }); + res.json(getDojoClient(guild, 0)); }; diff --git a/src/models/guildModel.ts b/src/models/guildModel.ts index ab87e719..0582dc64 100644 --- a/src/models/guildModel.ts +++ b/src/models/guildModel.ts @@ -14,6 +14,8 @@ const dojoComponentSchema = new Schema({ pi: Schema.Types.ObjectId, op: String, pp: String, + Name: String, + Message: String, CompletionTime: Date }); diff --git a/src/routes/api.ts b/src/routes/api.ts index 4d2571c0..a0eeba20 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -62,6 +62,7 @@ import { sellController } from "@/src/controllers/api/sellController"; import { setActiveQuestController } from "@/src/controllers/api/setActiveQuestController"; import { setActiveShipController } from "@/src/controllers/api/setActiveShipController"; import { setBootLocationController } from "@/src/controllers/api/setBootLocationController"; +import { setDojoComponentMessageController } from "@/src/controllers/api/setDojoComponentMessageController"; import { setEquippedInstrumentController } from "@/src/controllers/api/setEquippedInstrumentController"; import { setPlacedDecoInfoController } from "@/src/controllers/api/setPlacedDecoInfoController"; import { setShipCustomizationsController } from "@/src/controllers/api/setShipCustomizationsController"; @@ -158,6 +159,7 @@ apiRouter.post("/rerollRandomMod.php", rerollRandomModController); apiRouter.post("/saveDialogue.php", saveDialogueController); apiRouter.post("/saveLoadout.php", saveLoadoutController); apiRouter.post("/sell.php", sellController); +apiRouter.post("/setDojoComponentMessage.php", setDojoComponentMessageController); apiRouter.post("/setEquippedInstrument.php", setEquippedInstrumentController); apiRouter.post("/setPlacedDecoInfo.php", setPlacedDecoInfoController); apiRouter.post("/setShipCustomizations.php", setShipCustomizationsController); diff --git a/src/services/guildService.ts b/src/services/guildService.ts index 1fcddad4..210bc1a6 100644 --- a/src/services/guildService.ts +++ b/src/services/guildService.ts @@ -3,14 +3,20 @@ import { getAccountIdForRequest } from "@/src/services/loginService"; import { getInventory } from "@/src/services/inventoryService"; import { Guild } from "@/src/models/guildModel"; import { TInventoryDatabaseDocument } from "@/src/models/inventoryModels/inventoryModel"; +import { IDojoClient, IDojoComponentClient, IGuildDatabase } from "@/src/types/guildTypes"; +import { Document, Types } from "mongoose"; +import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers"; -export const getGuildForRequest = async (req: Request) => { +export const getGuildForRequest = async (req: Request): Promise => { const accountId = await getAccountIdForRequest(req); const inventory = await getInventory(accountId); return await getGuildForRequestEx(req, inventory); }; -export const getGuildForRequestEx = async (req: Request, inventory: TInventoryDatabaseDocument) => { +export const getGuildForRequestEx = async ( + req: Request, + inventory: TInventoryDatabaseDocument +): Promise => { const guildId = req.query.guildId as string; if (!inventory.GuildId || inventory.GuildId.toString() != guildId) { throw new Error("Account is not in the guild that it has sent a request for"); @@ -21,3 +27,47 @@ export const getGuildForRequestEx = async (req: Request, inventory: TInventoryDa } return guild; }; + +export const getDojoClient = (guild: TGuildDatabaseDocument, status: number): IDojoClient => { + const dojo: IDojoClient = { + _id: { $oid: guild._id.toString() }, + Name: guild.Name, + Tier: 1, + FixedContributions: true, + DojoRevision: 1, + RevisionTime: Math.round(Date.now() / 1000), + Energy: guild.DojoEnergy, + Capacity: guild.DojoCapacity, + DojoRequestStatus: status, + DojoComponents: [] + }; + guild.DojoComponents!.forEach(dojoComponent => { + const clientComponent: IDojoComponentClient = { + id: toOid(dojoComponent._id), + pf: dojoComponent.pf, + ppf: dojoComponent.ppf, + Name: dojoComponent.Name, + Message: dojoComponent.Message, + DecoCapacity: 600 + }; + if (dojoComponent.pi) { + clientComponent.pi = toOid(dojoComponent.pi); + clientComponent.op = dojoComponent.op!; + clientComponent.pp = dojoComponent.pp!; + } + if (dojoComponent.CompletionTime) { + clientComponent.CompletionTime = toMongoDate(dojoComponent.CompletionTime); + } + dojo.DojoComponents.push(clientComponent); + }); + return dojo; +}; + +// eslint-disable-next-line @typescript-eslint/ban-types +export type TGuildDatabaseDocument = Document & + IGuildDatabase & + Required<{ + _id: Types.ObjectId; + }> & { + __v: number; + }; diff --git a/src/types/guildTypes.ts b/src/types/guildTypes.ts index 1778582f..827e5d9a 100644 --- a/src/types/guildTypes.ts +++ b/src/types/guildTypes.ts @@ -34,6 +34,8 @@ export interface IDojoComponentClient { pi?: IOid; // Parent ID. N/A to root. op?: string; // "Open Portal"? N/A to root. pp?: string; // "Parent Portal"? N/A to root. + Name?: string; + Message?: string; RegularCredits?: number; // "Collecting Materials" state: Number of credits that were donated. MiscItems?: IMiscItem[]; // "Collecting Materials" state: Resources that were donated. CompletionTime?: IMongoDate; From 2dade02f3e7b51a78ce21529c6218395249f1a59 Mon Sep 17 00:00:00 2001 From: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Date: Tue, 11 Feb 2025 21:27:05 -0800 Subject: [PATCH 05/11] feat(stats): log unknown categories in updateStats (#947) Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/947 Reviewed-by: Sainan Co-authored-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Co-committed-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> --- src/controllers/stats/uploadController.ts | 9 +- src/controllers/stats/viewController.ts | 4 +- src/models/statsModel.ts | 14 +- src/services/statsService.ts | 622 +++++++++++++--------- src/types/statTypes.ts | 16 +- 5 files changed, 404 insertions(+), 261 deletions(-) diff --git a/src/controllers/stats/uploadController.ts b/src/controllers/stats/uploadController.ts index 105d8d90..89e5dfc3 100644 --- a/src/controllers/stats/uploadController.ts +++ b/src/controllers/stats/uploadController.ts @@ -1,14 +1,15 @@ import { getJSONfromString } from "@/src/helpers/stringHelpers"; import { getAccountIdForRequest } from "@/src/services/loginService"; -import { getStats, uploadStats } from "@/src/services/statsService"; -import { IStatsUpload } from "@/src/types/statTypes"; +import { getStats, updateStats } from "@/src/services/statsService"; +import { IStatsUpdate } from "@/src/types/statTypes"; import { RequestHandler } from "express"; const uploadController: RequestHandler = async (req, res) => { - const payload = getJSONfromString(String(req.body)); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { PS, ...payload } = getJSONfromString(String(req.body)); const accountId = await getAccountIdForRequest(req); const playerStats = await getStats(accountId); - await uploadStats(playerStats, payload); + await updateStats(playerStats, payload); res.status(200).end(); }; diff --git a/src/controllers/stats/viewController.ts b/src/controllers/stats/viewController.ts index 9782c65c..594efd3b 100644 --- a/src/controllers/stats/viewController.ts +++ b/src/controllers/stats/viewController.ts @@ -5,14 +5,14 @@ import allScans from "@/static/fixed_responses/allScans.json"; import { ExportEnemies } from "warframe-public-export-plus"; import { getInventory } from "@/src/services/inventoryService"; import { getStats } from "@/src/services/statsService"; -import { IStatsView } from "@/src/types/statTypes"; +import { IStatsClient } from "@/src/types/statTypes"; const viewController: RequestHandler = async (req, res) => { const accountId = await getAccountIdForRequest(req); const inventory = await getInventory(accountId, "XPInfo"); const playerStats = await getStats(accountId); - const responseJson: IStatsView = playerStats.toJSON(); + const responseJson = playerStats.toJSON() as IStatsClient; responseJson.Weapons ??= []; for (const item of inventory.XPInfo) { const weaponIndex = responseJson.Weapons.findIndex(element => element.type == item.ItemType); diff --git a/src/models/statsModel.ts b/src/models/statsModel.ts index d3df4a24..e11ca652 100644 --- a/src/models/statsModel.ts +++ b/src/models/statsModel.ts @@ -1,5 +1,5 @@ import { Document, Schema, Types, model } from "mongoose"; -import { IEnemy, IMission, IScan, ITutorial, IAbility, IWeapon, IStatsDatabase } from "@/src/types/statTypes"; +import { IEnemy, IMission, IScan, ITutorial, IAbility, IWeapon, IStatsDatabase, IRace } from "@/src/types/statTypes"; const abilitySchema = new Schema( { @@ -58,6 +58,13 @@ const weaponSchema = new Schema( { _id: false } ); +const raceSchema = new Schema( + { + highScore: Number + }, + { _id: false } +); + const statsSchema = new Schema({ accountOwnerId: { type: Schema.Types.ObjectId, required: true }, CiphersSolved: Number, @@ -69,6 +76,8 @@ const statsSchema = new Schema({ MissionsCompleted: Number, MissionsQuit: Number, MissionsFailed: Number, + MissionsInterrupted: Number, + MissionsDumped: Number, TimePlayedSec: Number, PickupCount: Number, Tutorial: { type: Map, of: tutorialSchema, default: {} }, @@ -81,7 +90,8 @@ const statsSchema = new Schema({ Missions: { type: [missionSchema], default: [] }, Deaths: Number, HealCount: Number, - ReviveCount: Number + ReviveCount: Number, + Races: { type: Map, of: raceSchema, default: {} } }); statsSchema.set("toJSON", { diff --git a/src/services/statsService.ts b/src/services/statsService.ts index 448d4034..d520e842 100644 --- a/src/services/statsService.ts +++ b/src/services/statsService.ts @@ -1,5 +1,15 @@ import { Stats, TStatsDatabaseDocument } from "@/src/models/statsModel"; -import { IStatsUpload } from "@/src/types/statTypes"; +import { + IEnemy, + IStatsAdd, + IStatsMax, + IStatsSet, + IStatsTimers, + IStatsUpdate, + IUploadEntry, + IWeapon +} from "@/src/types/statTypes"; +import { logger } from "../utils/logger"; export const createStats = async (accountId: string): Promise => { const stats = new Stats({ accountOwnerId: accountId }); @@ -15,269 +25,383 @@ export const getStats = async (accountOwnerId: string): Promise => { - if (payload.add) { - const { - MISSION_COMPLETE, - PICKUP_ITEM, - SCAN, - USE_ABILITY, - FIRE_WEAPON, - HIT_ENTITY_ITEM, - HEADSHOT_ITEM, - KILL_ENEMY_ITEM, - KILL_ENEMY, - EXECUTE_ENEMY, - HEADSHOT, - DIE, - MELEE_KILL, - INCOME, - CIPHER - } = payload.add; +export const updateStats = async (playerStats: TStatsDatabaseDocument, payload: IStatsUpdate): Promise => { + const unknownCategories: Record = {}; - if (MISSION_COMPLETE) { - for (const [key, value] of Object.entries(MISSION_COMPLETE)) { - switch (key) { - case "GS_SUCCESS": - playerStats.MissionsCompleted ??= 0; - playerStats.MissionsCompleted += value; - break; - case "GS_QUIT": - playerStats.MissionsQuit ??= 0; - playerStats.MissionsQuit += value; - break; - case "GS_FAILURE": - playerStats.MissionsFailed ??= 0; - playerStats.MissionsFailed += value; - break; + for (const [action, actionData] of Object.entries(payload)) { + switch (action) { + case "add": + for (const [category, data] of Object.entries(actionData as IStatsAdd)) { + switch (category) { + case "MISSION_COMPLETE": + for (const [key, value] of Object.entries(data as IUploadEntry)) { + switch (key) { + case "GS_SUCCESS": + playerStats.MissionsCompleted ??= 0; + playerStats.MissionsCompleted += value; + break; + case "GS_QUIT": + playerStats.MissionsQuit ??= 0; + playerStats.MissionsQuit += value; + break; + case "GS_FAILURE": + playerStats.MissionsFailed ??= 0; + playerStats.MissionsFailed += value; + break; + case "GS_INTERRUPTED": + playerStats.MissionsInterrupted ??= 0; + playerStats.MissionsInterrupted += value; + break; + case "GS_DUMPED": + playerStats.MissionsDumped ??= 0; + playerStats.MissionsDumped += value; + break; + default: + if (!ignoredCategories.includes(category)) { + if (!unknownCategories[action]) { + unknownCategories[action] = []; + } + unknownCategories[action].push(category); + } + break; + } + } + break; + + case "PICKUP_ITEM": + playerStats.PickupCount ??= 0; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + for (const [_key, value] of Object.entries(data as IUploadEntry)) { + playerStats.PickupCount += value; + } + break; + + case "SCAN": + playerStats.Scans ??= []; + for (const [type, scans] of Object.entries(data as IUploadEntry)) { + const scan = playerStats.Scans.find(element => element.type === type); + if (scan) { + scan.scans ??= 0; + scan.scans += scans; + } else { + playerStats.Scans.push({ type: type, scans }); + } + } + break; + + case "USE_ABILITY": + playerStats.Abilities ??= []; + for (const [type, used] of Object.entries(data as IUploadEntry)) { + const ability = playerStats.Abilities.find(element => element.type === type); + if (ability) { + ability.used ??= 0; + ability.used += used; + } else { + playerStats.Abilities.push({ type: type, used }); + } + } + break; + + case "FIRE_WEAPON": + case "HIT_ENTITY_ITEM": + case "HEADSHOT_ITEM": + case "KILL_ENEMY_ITEM": + playerStats.Weapons ??= []; + const statKey = { + FIRE_WEAPON: "fired", + HIT_ENTITY_ITEM: "hits", + HEADSHOT_ITEM: "headshots", + KILL_ENEMY_ITEM: "kills" + }[category] as "fired" | "hits" | "headshots" | "kills"; + + for (const [type, count] of Object.entries(data as IUploadEntry)) { + const weapon = playerStats.Weapons.find(element => element.type === type); + if (weapon) { + weapon[statKey] ??= 0; + weapon[statKey] += count; + } else { + const newWeapon: IWeapon = { type: type }; + newWeapon[statKey] = count; + playerStats.Weapons.push(newWeapon); + } + } + break; + + case "KILL_ENEMY": + case "EXECUTE_ENEMY": + case "HEADSHOT": + playerStats.Enemies ??= []; + const enemyStatKey = { + KILL_ENEMY: "kills", + EXECUTE_ENEMY: "executions", + HEADSHOT: "headshots" + }[category] as "kills" | "executions" | "headshots"; + + for (const [type, count] of Object.entries(data as IUploadEntry)) { + const enemy = playerStats.Enemies.find(element => element.type === type); + if (enemy) { + enemy[enemyStatKey] ??= 0; + enemy[enemyStatKey] += count; + } else { + const newEnemy: IEnemy = { type: type }; + newEnemy[enemyStatKey] = count; + playerStats.Enemies.push(newEnemy); + } + } + break; + + case "DIE": + playerStats.Enemies ??= []; + playerStats.Deaths ??= 0; + for (const [type, deaths] of Object.entries(data as IUploadEntry)) { + playerStats.Deaths += deaths; + const enemy = playerStats.Enemies.find(element => element.type === type); + if (enemy) { + enemy.deaths ??= 0; + enemy.deaths += deaths; + } else { + playerStats.Enemies.push({ type: type, deaths }); + } + } + break; + + case "MELEE_KILL": + playerStats.MeleeKills ??= 0; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + for (const [_key, kills] of Object.entries(data as IUploadEntry)) { + playerStats.MeleeKills += kills; + } + break; + + case "INCOME": + playerStats.Income ??= 0; + playerStats.Income += data; + break; + + case "CIPHER": + if (data["0"] > 0) { + playerStats.CiphersFailed ??= 0; + playerStats.CiphersFailed += data["0"]; + } + if (data["1"] > 0) { + playerStats.CiphersSolved ??= 0; + playerStats.CiphersSolved += data["1"]; + } + break; + + default: + if (!ignoredCategories.includes(category)) { + if (!unknownCategories[action]) { + unknownCategories[action] = []; + } + unknownCategories[action].push(category); + } + break; + } } - } - } + break; - if (PICKUP_ITEM) { - for (const value of Object.values(PICKUP_ITEM)) { - playerStats.PickupCount ??= 0; - playerStats.PickupCount += value; - } - } + case "timers": + for (const [category, data] of Object.entries(actionData as IStatsTimers)) { + switch (category) { + case "EQUIP_WEAPON": + playerStats.Weapons ??= []; + for (const [type, equipTime] of Object.entries(data as IUploadEntry)) { + const weapon = playerStats.Weapons.find(element => element.type === type); + if (weapon) { + weapon.equipTime ??= 0; + weapon.equipTime += equipTime; + } else { + playerStats.Weapons.push({ type: type, equipTime }); + } + } + break; - if (SCAN) { - playerStats.Scans ??= []; - for (const [key, scans] of Object.entries(SCAN)) { - const scan = playerStats.Scans.find(element => element.type === key); - if (scan) { - scan.scans ??= 0; - scan.scans += scans; - } else { - playerStats.Scans.push({ type: key, scans }); + case "CURRENT_MISSION_TIME": + playerStats.TimePlayedSec ??= 0; + playerStats.TimePlayedSec += data; + break; + + case "CIPHER_TIME": + playerStats.CipherTime ??= 0; + playerStats.CipherTime += data; + break; + + default: + if (!ignoredCategories.includes(category)) { + if (!unknownCategories[action]) { + unknownCategories[action] = []; + } + unknownCategories[action].push(category); + } + break; + } } - } - } + break; - if (USE_ABILITY) { - playerStats.Abilities ??= []; - for (const [key, used] of Object.entries(USE_ABILITY)) { - const ability = playerStats.Abilities.find(element => element.type === key); - if (ability) { - ability.used ??= 0; - ability.used += used; - } else { - playerStats.Abilities.push({ type: key, used }); + case "max": + for (const [category, data] of Object.entries(actionData as IStatsMax)) { + switch (category) { + case "WEAPON_XP": + playerStats.Weapons ??= []; + for (const [type, xp] of Object.entries(data as IUploadEntry)) { + const weapon = playerStats.Weapons.find(element => element.type === type); + if (weapon) { + if (xp > (weapon.xp ?? 0)) { + weapon.xp = xp; + } + } else { + playerStats.Weapons.push({ type: type, xp }); + } + } + break; + + case "MISSION_SCORE": + playerStats.Missions ??= []; + for (const [type, highScore] of Object.entries(data as IUploadEntry)) { + const mission = playerStats.Missions.find(element => element.type === type); + if (mission) { + if (highScore > mission.highScore) { + mission.highScore = highScore; + } + } else { + playerStats.Missions.push({ type: type, highScore }); + } + } + break; + + case "RACE_SCORE": + playerStats.Races ??= new Map(); + + for (const [race, highScore] of Object.entries(data as Record)) { + const currentRace = playerStats.Races.get(race); + + if (currentRace) { + if (highScore > currentRace.highScore) { + playerStats.Races.set(race, { highScore }); + } + } else { + playerStats.Races.set(race, { highScore }); + } + } + + break; + + default: + if (!ignoredCategories.includes(category)) { + if (!unknownCategories[action]) { + unknownCategories[action] = []; + } + unknownCategories[action].push(category); + } + break; + } } - } - } + break; - if (FIRE_WEAPON) { - playerStats.Weapons ??= []; - for (const [key, fired] of Object.entries(FIRE_WEAPON)) { - const weapon = playerStats.Weapons.find(element => element.type === key); - if (weapon) { - weapon.fired ??= 0; - weapon.fired += fired; - } else { - playerStats.Weapons.push({ type: key, fired }); + case "set": + for (const [category, value] of Object.entries(actionData as IStatsSet)) { + switch (category) { + case "ELO_RATING": + playerStats.Rating = value; + break; + + case "RANK": + playerStats.Rank = value; + break; + + case "PLAYER_LEVEL": + playerStats.PlayerLevel = value; + break; + + default: + if (!ignoredCategories.includes(category)) { + if (!unknownCategories[action]) { + unknownCategories[action] = []; + } + unknownCategories[action].push(category); + } + break; + } } - } - } + break; - if (HIT_ENTITY_ITEM) { - playerStats.Weapons ??= []; - for (const [key, hits] of Object.entries(HIT_ENTITY_ITEM)) { - const weapon = playerStats.Weapons.find(element => element.type === key); - if (weapon) { - weapon.hits ??= 0; - weapon.hits += hits; - } else { - playerStats.Weapons.push({ type: key, hits }); - } - } - } + case "displayName": + case "guildId": + break; - if (HEADSHOT_ITEM) { - playerStats.Weapons ??= []; - for (const [key, headshots] of Object.entries(HEADSHOT_ITEM)) { - const weapon = playerStats.Weapons.find(element => element.type === key); - if (weapon) { - weapon.headshots ??= 0; - weapon.headshots += headshots; - } else { - playerStats.Weapons.push({ type: key, headshots }); - } - } - } - - if (KILL_ENEMY_ITEM) { - playerStats.Weapons ??= []; - for (const [key, kills] of Object.entries(KILL_ENEMY_ITEM)) { - const weapon = playerStats.Weapons.find(element => element.type === key); - if (weapon) { - weapon.kills ??= 0; - weapon.kills += kills; - } else { - playerStats.Weapons.push({ type: key, kills }); - } - } - } - - if (KILL_ENEMY) { - playerStats.Enemies ??= []; - for (const [key, kills] of Object.entries(KILL_ENEMY)) { - const enemy = playerStats.Enemies.find(element => element.type === key); - if (enemy) { - enemy.kills ??= 0; - enemy.kills += kills; - } else { - playerStats.Enemies.push({ type: key, kills }); - } - } - } - - if (EXECUTE_ENEMY) { - playerStats.Enemies ??= []; - for (const [key, executions] of Object.entries(EXECUTE_ENEMY)) { - const enemy = playerStats.Enemies.find(element => element.type === key); - if (enemy) { - enemy.executions ??= 0; - enemy.executions += executions; - } else { - playerStats.Enemies.push({ type: key, executions }); - } - } - } - - if (HEADSHOT) { - playerStats.Enemies ??= []; - for (const [key, headshots] of Object.entries(HEADSHOT)) { - const enemy = playerStats.Enemies.find(element => element.type === key); - if (enemy) { - enemy.headshots ??= 0; - enemy.headshots += headshots; - } else { - playerStats.Enemies.push({ type: key, headshots }); - } - } - } - - if (DIE) { - playerStats.Enemies ??= []; - for (const [key, deaths] of Object.entries(DIE)) { - playerStats.Deaths ??= 0; - playerStats.Deaths += deaths; - const enemy = playerStats.Enemies.find(element => element.type === key); - if (enemy) { - enemy.deaths ??= 0; - enemy.deaths += deaths; - } else { - playerStats.Enemies.push({ type: key, deaths }); - } - } - } - - if (MELEE_KILL) { - playerStats.MeleeKills ??= 0; - for (const kills of Object.values(MELEE_KILL)) { - playerStats.MeleeKills += kills; - } - } - - if (INCOME) { - playerStats.Income ??= 0; - playerStats.Income += INCOME; - } - - if (CIPHER) { - if (CIPHER["0"] > 0) { - playerStats.CiphersFailed ??= 0; - playerStats.CiphersFailed += CIPHER["0"]; - } - if (CIPHER["1"] > 0) { - playerStats.CiphersSolved ??= 0; - playerStats.CiphersSolved += CIPHER["1"]; - } + default: + logger.debug(`Unknown updateStats action: ${action}`); + break; } } - if (payload.timers) { - const { EQUIP_WEAPON, CURRENT_MISSION_TIME, CIPHER_TIME } = payload.timers; - - if (EQUIP_WEAPON) { - playerStats.Weapons ??= []; - for (const [key, equipTime] of Object.entries(EQUIP_WEAPON)) { - const weapon = playerStats.Weapons.find(element => element.type === key); - if (weapon) { - weapon.equipTime ??= 0; - weapon.equipTime += equipTime; - } else { - playerStats.Weapons.push({ type: key, equipTime }); - } - } - } - - if (CURRENT_MISSION_TIME) { - playerStats.TimePlayedSec ??= 0; - playerStats.TimePlayedSec += CURRENT_MISSION_TIME; - } - - if (CIPHER_TIME) { - playerStats.CipherTime ??= 0; - playerStats.CipherTime += CIPHER_TIME; - } - } - - if (payload.max) { - const { WEAPON_XP, MISSION_SCORE } = payload.max; - - if (WEAPON_XP) { - playerStats.Weapons ??= []; - for (const [key, xp] of Object.entries(WEAPON_XP)) { - const weapon = playerStats.Weapons.find(element => element.type === key); - if (weapon) { - weapon.xp = xp; - } else { - playerStats.Weapons.push({ type: key, xp }); - } - } - } - - if (MISSION_SCORE) { - playerStats.Missions ??= []; - for (const [key, highScore] of Object.entries(MISSION_SCORE)) { - const mission = playerStats.Missions.find(element => element.type === key); - if (mission) { - mission.highScore = highScore; - } else { - playerStats.Missions.push({ type: key, highScore }); - } - } - } - } - - if (payload.set) { - const { ELO_RATING, RANK, PLAYER_LEVEL } = payload.set; - if (ELO_RATING) playerStats.Rating = ELO_RATING; - if (RANK) playerStats.Rank = RANK; - if (PLAYER_LEVEL) playerStats.PlayerLevel = PLAYER_LEVEL; + for (const [action, categories] of Object.entries(unknownCategories)) { + logger.debug(`Unknown updateStats ${action} action categories: ${categories.join(", ")}`); } await playerStats.save(); }; + +const ignoredCategories = [ + //add action + "MISSION_STARTED", + "HOST_OS", + "CPU_CORES", + "CPU_MODEL", + "CPU_VENDOR", + "GPU_CLASS", + "GFX_DRIVER", + "GFX_RESOLUTION", + "GFX_ASPECT", + "GFX_WINDOW", + "GPU_VENDOR", + "GFX_HDR", + "SPEAKER_COUNT", + "MISSION_MATCHMAKING", + "PLAYER_COUNT", + "HOST_MIGRATION", + "DESTROY_DECORATION", + "MOVEMENT", + "RECEIVE_UPGRADE", + "EQUIP_COSMETIC", + "EQUIP_UPGRADE", + "MISSION_TYPE", + "MISSION_FACTION", + "MISSION_PLAYED", + "MISSION_PLAYED_TIME", + "CPU_CLOCK", + "CPU_FEATURE", + "RAM", + "ADDR_SPACE", + "GFX_SCALE", + "LOGINS", + "GPU_MODEL", + "MEDALS_TOP", + "STATS_TIMERS_RESET", + "INPUT_ACTIVITY_TIME", + "LOGINS_ITEM", + "TAKE_DAMAGE", + "SQUAD_KILL_ENEMY", + "SQUAD_HEADSHOT", + "SQUAD_MELEE_KILL", + "MELEE_KILL_ITEM", + "TAKE_DAMAGE_ITEM", + "SQUAD_KILL_ENEMY_ITEM", + "SQUAD_HEADSHOT_ITEM", + "SQUAD_MELEE_KILL_ITEM", + "PRE_DIE", + "PRE_DIE_ITEM", + "GEAR_USED", + "DIE_ITEM", + + // timers action + "IN_SHIP_TIME", + "IN_SHIP_VIEW_TIME", + "MISSION_LOAD_TIME", + "MISSION_TIME", + "REGION_TIME", + "PLATFORM_TIME", + "PRE_DIE_TIME", + "VEHICLE_TIME" +]; diff --git a/src/types/statTypes.ts b/src/types/statTypes.ts index b698bdfa..0b49e20e 100644 --- a/src/types/statTypes.ts +++ b/src/types/statTypes.ts @@ -1,6 +1,6 @@ import { Types } from "mongoose"; -export interface IStatsView { +export interface IStatsClient { CiphersSolved?: number; CiphersFailed?: number; CipherTime?: number; @@ -10,9 +10,11 @@ export interface IStatsView { MissionsCompleted?: number; MissionsQuit?: number; MissionsFailed?: number; + MissionsInterrupted?: number; + MissionsDumped?: number; TimePlayedSec?: number; PickupCount?: number; - Tutorial?: { [key: string]: ITutorial }; + Tutorial?: Map; Abilities?: IAbility[]; Rating?: number; Income?: number; @@ -23,9 +25,10 @@ export interface IStatsView { Deaths?: number; HealCount?: number; ReviveCount?: number; + Races?: Map; } -export interface IStatsDatabase extends IStatsView { +export interface IStatsDatabase extends IStatsClient { accountOwnerId: Types.ObjectId; } @@ -68,7 +71,11 @@ export interface IWeapon { fired?: number; } -export interface IStatsUpload { +export interface IRace { + highScore: number; +} + +export interface IStatsUpdate { displayName: string; guildId?: string; PS?: string; @@ -128,6 +135,7 @@ export interface IUploadEntry { export interface IStatsMax { WEAPON_XP?: IUploadEntry; MISSION_SCORE?: IUploadEntry; + RACE_SCORE?: IUploadEntry; } export interface IStatsSet { From 947dcdcec56c54dbee2ffb6b05984e1d65829c0d Mon Sep 17 00:00:00 2001 From: Sainan Date: Tue, 11 Feb 2025 21:27:20 -0800 Subject: [PATCH 06/11] chore: update PE+ (#950) Closes #940 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/950 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 482647ab..0919aa26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "copyfiles": "^2.4.1", "express": "^5", "mongoose": "^8.9.4", - "warframe-public-export-plus": "^0.5.27", + "warframe-public-export-plus": "^0.5.28", "warframe-riven-info": "^0.1.2", "winston": "^3.17.0", "winston-daily-rotate-file": "^5.0.0" @@ -4093,9 +4093,9 @@ } }, "node_modules/warframe-public-export-plus": { - "version": "0.5.27", - "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.27.tgz", - "integrity": "sha512-fdFfvvhIXAPE7hTGLRsRJZ036vV8Jbd5vhu9STbZykdVLRXt9zeilo+sQThNy+2GchO+QhtTcETCjn1ntJhXZw==" + "version": "0.5.28", + "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.28.tgz", + "integrity": "sha512-g6uW4idVuYobYim2nu+mxLM7lDI+VjnVzDo6U3f5JdRqkogSekW6FY2+OQvrI9LV/jXHxbR1TNnBBKRL2ffJYA==" }, "node_modules/warframe-riven-info": { "version": "0.1.2", diff --git a/package.json b/package.json index a81905b1..562fa6a6 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "copyfiles": "^2.4.1", "express": "^5", "mongoose": "^8.9.4", - "warframe-public-export-plus": "^0.5.27", + "warframe-public-export-plus": "^0.5.28", "warframe-riven-info": "^0.1.2", "winston": "^3.17.0", "winston-daily-rotate-file": "^5.0.0" From eace26b4b30bd554af0efd95d9ef4736381c2924 Mon Sep 17 00:00:00 2001 From: Sainan Date: Wed, 12 Feb 2025 10:34:28 -0800 Subject: [PATCH 07/11] chore: update PE+ (#951) lavos prime and stuff Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/951 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0919aa26..efccae62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "copyfiles": "^2.4.1", "express": "^5", "mongoose": "^8.9.4", - "warframe-public-export-plus": "^0.5.28", + "warframe-public-export-plus": "^0.5.29", "warframe-riven-info": "^0.1.2", "winston": "^3.17.0", "winston-daily-rotate-file": "^5.0.0" @@ -4093,9 +4093,9 @@ } }, "node_modules/warframe-public-export-plus": { - "version": "0.5.28", - "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.28.tgz", - "integrity": "sha512-g6uW4idVuYobYim2nu+mxLM7lDI+VjnVzDo6U3f5JdRqkogSekW6FY2+OQvrI9LV/jXHxbR1TNnBBKRL2ffJYA==" + "version": "0.5.29", + "resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.29.tgz", + "integrity": "sha512-D61CFiJTr/LIQCvyZ03DgudUBpJDqrOTdNPNeB0kY21lmPHw1auDg4CNW2T1JaG0nL5K1hu9ypvnfXzno2omMA==" }, "node_modules/warframe-riven-info": { "version": "0.1.2", diff --git a/package.json b/package.json index 562fa6a6..33fac27b 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "copyfiles": "^2.4.1", "express": "^5", "mongoose": "^8.9.4", - "warframe-public-export-plus": "^0.5.28", + "warframe-public-export-plus": "^0.5.29", "warframe-riven-info": "^0.1.2", "winston": "^3.17.0", "winston-daily-rotate-file": "^5.0.0" From 7e7e4e2eea711b1d5f858c9970293b41ee5f0531 Mon Sep 17 00:00:00 2001 From: Sainan Date: Wed, 12 Feb 2025 14:06:48 -0800 Subject: [PATCH 08/11] feat: change dojo spawn room (#949) Closes #524 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/949 Co-authored-by: Sainan Co-committed-by: Sainan --- .../api/changeDojoRootController.ts | 90 +++++++++++++++++++ src/routes/api.ts | 2 + src/types/guildTypes.ts | 4 +- 3 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 src/controllers/api/changeDojoRootController.ts diff --git a/src/controllers/api/changeDojoRootController.ts b/src/controllers/api/changeDojoRootController.ts new file mode 100644 index 00000000..568bf688 --- /dev/null +++ b/src/controllers/api/changeDojoRootController.ts @@ -0,0 +1,90 @@ +import { RequestHandler } from "express"; +import { getDojoClient, getGuildForRequest } from "@/src/services/guildService"; +import { logger } from "@/src/utils/logger"; +import { IDojoComponentDatabase } from "@/src/types/guildTypes"; +import { Types } from "mongoose"; + +export const changeDojoRootController: RequestHandler = async (req, res) => { + const guild = await getGuildForRequest(req); + // At this point, we know that a member of the guild is making this request. Assuming they are allowed to change the root. + + const idToNode: Record = {}; + guild.DojoComponents!.forEach(x => { + idToNode[x._id.toString()] = { + component: x, + parent: undefined, + children: [] + }; + }); + + let oldRoot: INode | undefined; + guild.DojoComponents!.forEach(x => { + const node = idToNode[x._id.toString()]; + if (x.pi) { + idToNode[x.pi.toString()].children.push(node); + node.parent = idToNode[x.pi.toString()]; + } else { + oldRoot = node; + } + }); + logger.debug("Old tree:\n" + treeToString(oldRoot!)); + + const newRoot = idToNode[req.query.newRoot as string]; + recursivelyTurnParentsIntoChildren(newRoot); + newRoot.component.pi = undefined; + newRoot.component.op = undefined; + newRoot.component.pp = undefined; + newRoot.parent = undefined; + + // Don't even ask me why this is needed because I don't know either + const stack: INode[] = [newRoot]; + let i = 0; + const idMap: Record = {}; + while (stack.length != 0) { + const top = stack.shift()!; + idMap[top.component._id.toString()] = new Types.ObjectId( + (++i).toString(16).padStart(8, "0") + top.component._id.toString().substr(8) + ); + top.children.forEach(x => stack.push(x)); + } + guild.DojoComponents!.forEach(x => { + x._id = idMap[x._id.toString()]; + if (x.pi) { + x.pi = idMap[x.pi.toString()]; + } + }); + + logger.debug("New tree:\n" + treeToString(newRoot)); + + await guild.save(); + + res.json(getDojoClient(guild, 0)); +}; + +interface INode { + component: IDojoComponentDatabase; + parent: INode | undefined; + children: INode[]; +} + +const treeToString = (root: INode, depth: number = 0): string => { + let str = " ".repeat(depth * 4) + root.component.pf + " (" + root.component._id.toString() + ")\n"; + root.children.forEach(x => { + str += treeToString(x, depth + 1); + }); + return str; +}; + +const recursivelyTurnParentsIntoChildren = (node: INode): void => { + if (node.parent!.parent) { + recursivelyTurnParentsIntoChildren(node.parent!); + } + + node.parent!.component.pi = node.component._id; + node.parent!.component.op = node.component.pp; + node.parent!.component.pp = node.component.op; + + node.parent!.parent = node; + node.parent!.children.splice(node.parent!.children.indexOf(node), 1); + node.children.push(node.parent!); +}; diff --git a/src/routes/api.ts b/src/routes/api.ts index a0eeba20..d42a9f82 100644 --- a/src/routes/api.ts +++ b/src/routes/api.ts @@ -4,6 +4,7 @@ import { addFriendImageController } from "@/src/controllers/api/addFriendImageCo import { arcaneCommonController } from "@/src/controllers/api/arcaneCommonController"; import { archonFusionController } from "@/src/controllers/api/archonFusionController"; import { artifactsController } from "../controllers/api/artifactsController"; +import { changeDojoRootController } from "../controllers/api/changeDojoRootController"; import { checkDailyMissionBonusController } from "@/src/controllers/api/checkDailyMissionBonusController"; import { claimCompletedRecipeController } from "@/src/controllers/api/claimCompletedRecipeController"; import { clearDialogueHistoryController } from "@/src/controllers/api/clearDialogueHistoryController"; @@ -127,6 +128,7 @@ apiRouter.post("/addFriendImage.php", addFriendImageController); apiRouter.post("/arcaneCommon.php", arcaneCommonController); apiRouter.post("/archonFusion.php", archonFusionController); apiRouter.post("/artifacts.php", artifactsController); +apiRouter.post("/changeDojoRoot.php", changeDojoRootController); apiRouter.post("/claimCompletedRecipe.php", claimCompletedRecipeController); apiRouter.post("/clearDialogueHistory.php", clearDialogueHistoryController); apiRouter.post("/createGuild.php", createGuildController); diff --git a/src/types/guildTypes.ts b/src/types/guildTypes.ts index 827e5d9a..28a51c71 100644 --- a/src/types/guildTypes.ts +++ b/src/types/guildTypes.ts @@ -32,8 +32,8 @@ export interface IDojoComponentClient { pf: string; // Prefab (.level) ppf: string; pi?: IOid; // Parent ID. N/A to root. - op?: string; // "Open Portal"? N/A to root. - pp?: string; // "Parent Portal"? N/A to root. + op?: string; // Name of the door within this room that leads to its parent. N/A to root. + pp?: string; // Name of the door within the parent that leads to this room. N/A to root. Name?: string; Message?: string; RegularCredits?: number; // "Collecting Materials" state: Number of credits that were donated. From edddc80bd8203cf679795d9188feef47710e0229 Mon Sep 17 00:00:00 2001 From: Sainan Date: Wed, 12 Feb 2025 18:14:59 -0800 Subject: [PATCH 09/11] fix(webui): don't give legendary cores with "add missing mods" (#953) Closes #952 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/953 --- static/webui/script.js | 1 + 1 file changed, 1 insertion(+) diff --git a/static/webui/script.js b/static/webui/script.js index a7afa25d..4d62c4a3 100644 --- a/static/webui/script.js +++ b/static/webui/script.js @@ -1023,6 +1023,7 @@ function doAddAllMods() { for (const child of document.getElementById("datalist-mods").children) { modsAll.add(child.getAttribute("data-key")); } + modsAll.delete("/Lotus/Upgrades/Mods/Fusers/LegendaryModFuser"); revalidateAuthz(() => { const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1"); From 7ee8252d0e86b39f4bf60ad5c131e654b40d53c9 Mon Sep 17 00:00:00 2001 From: Sainan Date: Wed, 12 Feb 2025 18:15:07 -0800 Subject: [PATCH 10/11] chore: prettier (#954) some of the latest changes haven't been quite congruent with the way prettier would like things to be. this fixes those details. Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/954 --- scripts/update-translations.js | 12 +- ...dioLegionIntermission12VendorManifest.json | 2374 ++++++++--------- static/webui/script.js | 56 +- static/webui/translations/en.js | 238 +- static/webui/translations/ru.js | 238 +- 5 files changed, 1466 insertions(+), 1452 deletions(-) diff --git a/scripts/update-translations.js b/scripts/update-translations.js index c26deb7f..45067b25 100644 --- a/scripts/update-translations.js +++ b/scripts/update-translations.js @@ -1,7 +1,7 @@ // Based on http://209.141.38.3/OpenWF/Translations/src/branch/main/update.php // Converted via ChatGPT-4o -const fs = require('fs'); +const fs = require("fs"); function extractStrings(content) { const regex = /([a-zA-Z_]+): `([^`]*)`,/g; @@ -22,7 +22,7 @@ fs.readdirSync("../static/webui/translations").forEach(file => { const content = fs.readFileSync(`../static/webui/translations/${file}`, "utf8"); const targetStrings = extractStrings(content); const contentLines = content.split("\n"); - + const fileHandle = fs.openSync(`../static/webui/translations/${file}`, "w"); fs.writeSync(fileHandle, contentLines[0] + "\n"); @@ -31,16 +31,16 @@ fs.readdirSync("../static/webui/translations").forEach(file => { if (Object.keys(strings).length > 0) { Object.entries(strings).forEach(([key, value]) => { if (targetStrings.hasOwnProperty(key)) { - fs.writeSync(fileHandle, `\t${key}: \`${targetStrings[key]}\`,\n`); + fs.writeSync(fileHandle, ` ${key}: \`${targetStrings[key]}\`,\n`); } else { - fs.writeSync(fileHandle, `\t${key}: \`[UNTRANSLATED] ${value}\`,\n`); + fs.writeSync(fileHandle, ` ${key}: \`[UNTRANSLATED] ${value}\`,\n`); } }); - } else { + } else if (line.length) { fs.writeSync(fileHandle, line + "\n"); } }); - + fs.closeSync(fileHandle); } }); diff --git a/static/fixed_responses/getVendorInfo/RadioLegionIntermission12VendorManifest.json b/static/fixed_responses/getVendorInfo/RadioLegionIntermission12VendorManifest.json index 7086dc2d..33198a22 100644 --- a/static/fixed_responses/getVendorInfo/RadioLegionIntermission12VendorManifest.json +++ b/static/fixed_responses/getVendorInfo/RadioLegionIntermission12VendorManifest.json @@ -1,1192 +1,1192 @@ { - "VendorInfo": { - "_id": { - "$oid": "67a04d500000000000000000" - }, - "TypeName": "/Lotus/Types/Game/VendorManifests/Events/RadioLegionIntermission12VendorManifest", - "ItemManifest": [ - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/TrapperChassisBlueprint", - "ItemPrices": [ - { - "ItemCount": 25, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000049" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/TrapperSystemsBlueprint", - "ItemPrices": [ - { - "ItemCount": 25, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000050" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/TrapperHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 25, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000051" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/OrokinCatalyst", - "ItemPrices": [ - { - "ItemCount": 75, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000052" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/OrokinReactor", - "ItemPrices": [ - { - "ItemCount": 75, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000053" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/Alertium", - "ItemPrices": [ - { - "ItemCount": 15, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 5, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000054" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/Kuva", - "ItemPrices": [ - { - "ItemCount": 50, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_3", - "QuantityMultiplier": 10000, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000055" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Nightwave/GlassmakerShipDeco", - "ItemPrices": [ - { - "ItemCount": 60, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "PurchaseQuantityLimit": 1, - "AllowMultipurchase": false, - "Id": { - "$oid": "001500150000000000000056" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Skins/Hoverboard/HoverboardStickerWolf", - "ItemPrices": [ - { - "ItemCount": 30, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000057" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessV2MagAltHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000058" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessRhinoAltHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000059" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/NekrosShroudHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000060" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessAshAltHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000061" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/XakuAltHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000062" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessVaubanAltHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000063" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessV2TrinityAltHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000064" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/HildrynAltHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000065" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessFrostAltHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000066" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/OperatorArmour/Hood/RealOperatorWolfHoodBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000067" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessV2SarynAltHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000068" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/NidusAltTwoHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000069" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/OberonAltBHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000070" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StyanaxAltHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000071" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/ExcaliburMordredHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000072" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/RangerAltBHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000073" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessV2EmberAltHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000074" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/AnimaAltHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000075" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/JadeAltHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000076" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/NekrosAraknidHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000077" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/ProteaAltHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000078" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/PriestAlt2HelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000079" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/AtomosSolsticeSkinBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000080" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/DanteAltHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000081" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/RevenantAltHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000082" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/SandmanAltHelmetBlueprint", - "ItemPrices": [ - { - "ItemCount": 35, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_0", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000083" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerLootRadarAuraMod", - "ItemPrices": [ - { - "ItemCount": 20, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_1", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000084" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerRifleDamageAuraMod", - "ItemPrices": [ - { - "ItemCount": 20, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_1", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000085" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerShellAmmoAuraMod", - "ItemPrices": [ - { - "ItemCount": 20, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_1", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000086" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Nightwave/BroncoNightwaveMod", - "ItemPrices": [ - { - "ItemCount": 20, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_1", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000087" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerHealthAuraMod", - "ItemPrices": [ - { - "ItemCount": 20, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_1", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000088" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Nightwave/MagnusNightwaveMod", - "ItemPrices": [ - { - "ItemCount": 20, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_1", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000089" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Rifle/Event/Nightwave/NightwaveBattacorAugmentMod", - "ItemPrices": [ - { - "ItemCount": 20, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_1", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000090" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/GrnAxeBlueprint", - "ItemPrices": [ - { - "ItemCount": 30, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_2", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000091" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/DesertGrinlokSkinBlueprint", - "ItemPrices": [ - { - "ItemCount": 30, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_2", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000092" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/HeatDaggerBlueprint", - "ItemPrices": [ - { - "ItemCount": 50, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_3", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000093" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/GlaiveBlueprint", - "ItemPrices": [ - { - "ItemCount": 50, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_3", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000094" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/DarkDaggerBlueprint", - "ItemPrices": [ - { - "ItemCount": 50, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_3", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000095" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Skins/Sigils/NoraSeasonTwoSigil", - "ItemPrices": [ - { - "ItemCount": 30, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_3", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000096" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/DarkSwordBlueprint", - "ItemPrices": [ - { - "ItemCount": 50, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_3", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000097" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/PlasmaSwordBlueprint", - "ItemPrices": [ - { - "ItemCount": 50, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_3", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000098" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/ShockExergisSkinBlueprint", - "ItemPrices": [ - { - "ItemCount": 30, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_3", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000099" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/PlushyThumperMediumDirty", - "ItemPrices": [ - { - "ItemCount": 40, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_3", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000100" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/PvPMods/Rifle/TetraFasterProjAiming", - "ItemPrices": [ - { - "ItemCount": 20, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_4", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000101" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Powersuits/Jade/SelfBulletAttractorPvPAugmentCard", - "ItemPrices": [ - { - "ItemCount": 20, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_4", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000102" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/PvPMods/Rifle/SupraHigherAccuracyAiming", - "ItemPrices": [ - { - "ItemCount": 20, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_4", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000103" - } - }, - { - "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/PvPMods/Rifle/RubicoLowZoom", - "ItemPrices": [ - { - "ItemCount": 20, - "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", - "ProductCategory": "MiscItems" - } - ], - "Bin": "BIN_4", - "QuantityMultiplier": 1, - "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } - }, - "AllowMultipurchase": true, - "Id": { - "$oid": "001500150000000000000104" - } - } + "VendorInfo": { + "_id": { + "$oid": "67a04d500000000000000000" + }, + "TypeName": "/Lotus/Types/Game/VendorManifests/Events/RadioLegionIntermission12VendorManifest", + "ItemManifest": [ + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/TrapperChassisBlueprint", + "ItemPrices": [ + { + "ItemCount": 25, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, "Expiry": { - "$date": { - "$numberLong": "2051240400000" - } + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000049" } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/TrapperSystemsBlueprint", + "ItemPrices": [ + { + "ItemCount": 25, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000050" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/WarframeRecipes/TrapperHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 25, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000051" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/OrokinCatalyst", + "ItemPrices": [ + { + "ItemCount": 75, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000052" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/OrokinReactor", + "ItemPrices": [ + { + "ItemCount": 75, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000053" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/Alertium", + "ItemPrices": [ + { + "ItemCount": 15, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 5, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000054" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Items/MiscItems/Kuva", + "ItemPrices": [ + { + "ItemCount": 50, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_3", + "QuantityMultiplier": 10000, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000055" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Nightwave/GlassmakerShipDeco", + "ItemPrices": [ + { + "ItemCount": 60, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "PurchaseQuantityLimit": 1, + "AllowMultipurchase": false, + "Id": { + "$oid": "001500150000000000000056" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Skins/Hoverboard/HoverboardStickerWolf", + "ItemPrices": [ + { + "ItemCount": 30, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000057" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessV2MagAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000058" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessRhinoAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000059" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/NekrosShroudHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000060" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessAshAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000061" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/XakuAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000062" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessVaubanAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000063" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessV2TrinityAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000064" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/HildrynAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000065" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessFrostAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000066" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/OperatorArmour/Hood/RealOperatorWolfHoodBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000067" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessV2SarynAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000068" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/NidusAltTwoHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000069" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/OberonAltBHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000070" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StyanaxAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000071" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/ExcaliburMordredHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000072" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/RangerAltBHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000073" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/StatlessV2EmberAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000074" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/AnimaAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000075" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/JadeAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000076" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/NekrosAraknidHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000077" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/ProteaAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000078" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/PriestAlt2HelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000079" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/AtomosSolsticeSkinBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000080" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/DanteAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000081" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/RevenantAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000082" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Helmets/SandmanAltHelmetBlueprint", + "ItemPrices": [ + { + "ItemCount": 35, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_0", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000083" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerLootRadarAuraMod", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_1", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000084" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerRifleDamageAuraMod", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_1", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000085" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerShellAmmoAuraMod", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_1", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000086" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Nightwave/BroncoNightwaveMod", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_1", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000087" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Aura/PlayerHealthAuraMod", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_1", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000088" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Nightwave/MagnusNightwaveMod", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_1", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000089" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/Rifle/Event/Nightwave/NightwaveBattacorAugmentMod", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_1", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000090" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/GrnAxeBlueprint", + "ItemPrices": [ + { + "ItemCount": 30, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_2", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000091" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/DesertGrinlokSkinBlueprint", + "ItemPrices": [ + { + "ItemCount": 30, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_2", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000092" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/HeatDaggerBlueprint", + "ItemPrices": [ + { + "ItemCount": 50, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_3", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000093" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/GlaiveBlueprint", + "ItemPrices": [ + { + "ItemCount": 50, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_3", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000094" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/DarkDaggerBlueprint", + "ItemPrices": [ + { + "ItemCount": 50, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_3", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000095" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Skins/Sigils/NoraSeasonTwoSigil", + "ItemPrices": [ + { + "ItemCount": 30, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_3", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000096" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/DarkSwordBlueprint", + "ItemPrices": [ + { + "ItemCount": 50, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_3", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000097" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/PlasmaSwordBlueprint", + "ItemPrices": [ + { + "ItemCount": 50, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_3", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000098" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Recipes/Weapons/Skins/ShockExergisSkinBlueprint", + "ItemPrices": [ + { + "ItemCount": 30, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_3", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000099" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Types/Items/ShipDecos/Plushies/PlushyThumperMediumDirty", + "ItemPrices": [ + { + "ItemCount": 40, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_3", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000100" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/PvPMods/Rifle/TetraFasterProjAiming", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_4", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000101" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Powersuits/Jade/SelfBulletAttractorPvPAugmentCard", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_4", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000102" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/PvPMods/Rifle/SupraHigherAccuracyAiming", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_4", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000103" + } + }, + { + "StoreItem": "/Lotus/StoreItems/Upgrades/Mods/PvPMods/Rifle/RubicoLowZoom", + "ItemPrices": [ + { + "ItemCount": 20, + "ItemType": "/Lotus/Types/Items/MiscItems/NoraIntermissionTwelveCreds", + "ProductCategory": "MiscItems" + } + ], + "Bin": "BIN_4", + "QuantityMultiplier": 1, + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } + }, + "AllowMultipurchase": true, + "Id": { + "$oid": "001500150000000000000104" + } + } + ], + "Expiry": { + "$date": { + "$numberLong": "2051240400000" + } } -} \ No newline at end of file + } +} diff --git a/static/webui/script.js b/static/webui/script.js index 4d62c4a3..32d002c2 100644 --- a/static/webui/script.js +++ b/static/webui/script.js @@ -108,8 +108,10 @@ single.on("route_load", function (event) { function loc(tag) { return ((window.dict ?? {})[tag] ?? tag) - .split("|DISPLAYNAME|").join(document.querySelector(".displayname").textContent) - .split("|EMAIL|").join(localStorage.getItem("email")); + .split("|DISPLAYNAME|") + .join(document.querySelector(".displayname").textContent) + .split("|EMAIL|") + .join(localStorage.getItem("email")); } function updateLocElements() { @@ -129,7 +131,7 @@ function setActiveLanguage(lang) { const webui_lang = ["en", "ru"].indexOf(lang) == -1 ? "en" : lang; const script = document.createElement("script"); script.src = "/translations/" + webui_lang + ".js"; - script.onload = function() { + script.onload = function () { updateLocElements(); resolve(window.dict); }; @@ -141,7 +143,8 @@ setActiveLanguage(localStorage.getItem("lang") ?? "en"); function setLanguage(lang) { setActiveLanguage(lang); localStorage.setItem("lang", lang); - if (window.authz) { // Not in prelogin state? + if (window.authz) { + // Not in prelogin state? fetchItemList(); updateInventory(); } @@ -151,7 +154,7 @@ let uniqueLevelCaps = {}; function fetchItemList() { window.itemListPromise = new Promise(resolve => { const req = $.get("/custom/getItemLists?lang=" + window.lang); - req.done(async (data) => { + req.done(async data => { await dictPromise; window.archonCrystalUpgrades = data.archonCrystalUpgrades; @@ -173,9 +176,13 @@ function fetchItemList() { "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryBeam": { name: loc("code_kitgun") }, "/Lotus/Weapons/SolarisUnited/Secondary/LotusModularSecondaryShotgun": { name: loc("code_kitgun") }, "/Lotus/Weapons/Ostron/Melee/LotusModularWeapon": { name: loc("code_zaw") }, - "/Lotus/Weapons/Sentients/OperatorAmplifiers/SentTrainingAmplifier/OperatorTrainingAmpWeapon": { name: loc("code_moteAmp") }, + "/Lotus/Weapons/Sentients/OperatorAmplifiers/SentTrainingAmplifier/OperatorTrainingAmpWeapon": { + name: loc("code_moteAmp") + }, "/Lotus/Weapons/Sentients/OperatorAmplifiers/OperatorAmpWeapon": { name: loc("code_amp") }, - "/Lotus/Weapons/Operator/Pistols/DrifterPistol/DrifterPistolPlayerWeapon": { name: loc("code_sirocco") }, + "/Lotus/Weapons/Operator/Pistols/DrifterPistol/DrifterPistolPlayerWeapon": { + name: loc("code_sirocco") + }, "/Lotus/Types/Vehicles/Hoverboard/HoverboardSuit": { name: loc("code_kdrive") }, // Missing in data sources "/Lotus/Upgrades/Mods/Fusers/LegendaryModFuser": { name: loc("code_legendaryCore") }, @@ -227,13 +234,10 @@ function updateInventory() { window.didInitialInventoryUpdate = true; // Populate inventory route - [ - "RegularCredits", - "PremiumCredits", - "FusionPoints", - "PrimeTokens" - ].forEach(currency => { - document.getElementById(currency + "-owned").textContent = loc("currency_owned").split("|COUNT|").join(data[currency].toLocaleString()); + ["RegularCredits", "PremiumCredits", "FusionPoints", "PrimeTokens"].forEach(currency => { + document.getElementById(currency + "-owned").textContent = loc("currency_owned") + .split("|COUNT|") + .join(data[currency].toLocaleString()); }); [ @@ -366,11 +370,24 @@ function updateInventory() { const td = document.createElement("td"); td.textContent = itemMap[fingerprint.compat]?.name ?? fingerprint.compat; td.textContent += " " + RivenParser.parseRiven(rivenType, fingerprint, 1).name; - td.innerHTML += " ▲ " + fingerprint.buffs.length + ""; td.innerHTML += - " ▼ " + fingerprint.curses.length + ""; + " ▲ " + + fingerprint.buffs.length + + ""; td.innerHTML += - " ⟳ " + parseInt(fingerprint.rerolls) + ""; + " ▼ " + + fingerprint.curses.length + + ""; + td.innerHTML += + " ⟳ " + + parseInt(fingerprint.rerolls) + + ""; tr.appendChild(td); } { @@ -611,10 +628,7 @@ function addMissingEquipment(categories) { } }); }); - if ( - requests.length != 0 && - window.confirm(loc("code_addItemsConfirm").split("|COUNT|").join(requests.length)) - ) { + if (requests.length != 0 && window.confirm(loc("code_addItemsConfirm").split("|COUNT|").join(requests.length))) { dispatchAddItemsRequestsBatch(requests); } } diff --git a/static/webui/translations/en.js b/static/webui/translations/en.js index 7cc8e996..aac5bcb5 100644 --- a/static/webui/translations/en.js +++ b/static/webui/translations/en.js @@ -1,120 +1,120 @@ dict = { - general_inventoryUpdateNote: `Note: Changes made here will only be applied in-game when the game syncs the inventory. Visiting the navigation should be the easiest way to trigger that.`, - general_addButton: `Add`, - general_bulkActions: `Bulk Actions`, - code_nonValidAuthz: `Your credentials are no longer valid.`, - code_changeNameConfirm: `What would you like to change your account name to?`, - code_deleteAccountConfirm: `Are you sure you want to delete your account |DISPLAYNAME| (|EMAIL|)? This action cannot be undone.`, - code_archgun: `Archgun`, - code_melee: `Melee`, - code_pistol: `Pistol`, - code_rifle: `Rifle`, - code_shotgun: `Shotgun`, - code_kitgun: `Kitgun`, - code_zaw: `Zaw`, - code_moteAmp: `Mote Amp`, - code_amp: `Amp`, - code_sirocco: `Sirocco`, - code_kDrive: `K-Drive`, - code_legendaryCore: `Legendary Core`, - code_traumaticPeculiar: `Traumatic Peculiar`, - code_badItem: `(Imposter)`, - code_maxRank: `Max Rank`, - code_rename: `Rename`, - code_renamePrompt: `Enter new custom name:`, - code_remove: `Remove`, - code_addItemsConfirm: `Are you sure you want to add |COUNT| items to your account?`, - code_noEquipmentToRankUp: `No equipment to rank up.`, - code_succAdded: `Successfully added.`, - code_buffsNumber: `Number of buffs`, - code_cursesNumber: `Number of curses`, - code_rerollsNumber: `Number of rerolls`, - code_viewStats: `View Stats`, - code_rank: `Rank`, - code_count: `Count`, - code_focusAllUnlocked: `All focus schools are already unlocked.`, - code_focusUnlocked: `Unlocked |COUNT| new focus schools! An inventory update will be needed for the changes to be reflected in-game. Visiting the navigation should be the easiest way to trigger that.`, - code_addModsConfirm: `Are you sure you want to add |COUNT| mods to your account?`, - code_succImport: `Successfully imported.`, - login_description: `Login using your OpenWF account credentials (same as in-game when connecting to this server).`, - login_emailLabel: `Email address`, - login_passwordLabel: `Password`, - login_loginButton: `Login`, - navbar_logout: `Logout`, - navbar_renameAccount: `Rename Account`, - navbar_deleteAccount: `Delete Account`, - navbar_inventory: `Inventory`, - navbar_mods: `Mods`, - navbar_cheats: `Cheats`, - navbar_import: `Import`, - inventory_addItems: `Add Items`, - inventory_suits: `Warframes`, - inventory_longGuns: `Primary Weapons`, - inventory_pistols: `Secondary Weapons`, - inventory_melee: `Melee Weapons`, - inventory_spaceSuits: `Archwings`, - inventory_spaceGuns: `Archwing Primary Weapons`, - inventory_spaceMelee: `Archwing Melee Weapons`, - inventory_mechSuits: `Necramechs`, - inventory_sentinels: `Sentinels`, - inventory_sentinelWeapons: `Sentinel Weapons`, - inventory_operatorAmps: `Amps`, - inventory_hoverboards: `K-Drives`, - inventory_bulkAddSuits: `Add Missing Warframes`, - inventory_bulkAddWeapons: `Add Missing Weapons`, - inventory_bulkAddSpaceSuits: `Add Missing Archwings`, - inventory_bulkAddSpaceWeapons: `Add Missing Archwing Weapons`, - inventory_bulkAddSentinels: `Add Missing Sentinels`, - inventory_bulkAddSentinelWeapons: `Add Missing Sentinel Weapons`, - inventory_bulkRankUpSuits: `Max Rank All Warframes`, - inventory_bulkRankUpWeapons: `Max Rank All Weapons`, - inventory_bulkRankUpSpaceSuits: `Max Rank All Archwings`, - inventory_bulkRankUpSpaceWeapons: `Max Rank All Archwing Weapons`, - inventory_bulkRankUpSentinels: `Max Rank All Sentinels`, - inventory_bulkRankUpSentinelWeapons: `Max Rank All Sentinel Weapons`, - currency_RegularCredits: `Credits`, - currency_PremiumCredits: `Platinum`, - currency_FusionPoints: `Endo`, - currency_PrimeTokens: `Regal Aya`, - currency_owned: `You have |COUNT|.`, - powersuit_archonShardsLabel: `Archon Shard Slots`, - powersuit_archonShardsDescription: `You can use these unlimited slots to apply a wide range of upgrades`, - mods_addRiven: `Add Riven`, - mods_fingerprint: `Fingerprint`, - mods_fingerprintHelp: `Need help with the fingerprint?`, - mods_rivens: `Rivens`, - mods_mods: `Mods`, - mods_bulkAddMods: `Add Missing Mods`, - cheats_administratorRequirement: `You must be an administrator to use this feature. To become an administrator, add |DISPLAYNAME| to administratorNames in the config.json.`, - cheats_server: `Server`, - cheats_skipTutorial: `Skip Tutorial`, - cheats_skipAllDialogue: `Skip All Dialogue`, - cheats_unlockAllScans: `Unlock All Scans`, - cheats_unlockAllMissions: `Unlock All Missions`, - cheats_unlockAllQuests: `Unlock All Quests`, - cheats_completeAllQuests: `Complete All Quests`, - cheats_infiniteCredits: `Infinite Credits`, - cheats_infinitePlatinum: `Infinite Platinum`, - cheats_infiniteEndo: `Infinite Endo`, - cheats_infiniteRegalAya: `Infinite Regal Aya`, - cheats_unlockAllShipFeatures: `Unlock All Ship Features`, - cheats_unlockAllShipDecorations: `Unlock All Ship Decorations`, - cheats_unlockAllFlavourItems: `Unlock All Flavor Items`, - cheats_unlockAllSkins: `Unlock All Skins`, - cheats_unlockAllCapturaScenes: `Unlock All Captura Scenes`, - cheats_universalPolarityEverywhere: `Universal Polarity Everywhere`, - cheats_unlockDoubleCapacityPotatoesEverywhere: `Potatoes Everywhere`, - cheats_unlockExilusEverywhere: `Exilus Adapters Everywhere`, - cheats_unlockArcanesEverywhere: `Arcane Adapters Everywhere`, - cheats_noDailyStandingLimits: `No Daily Standing Limits`, - cheats_spoofMasteryRank: `Spoofed Mastery Rank (-1 to disable)`, - cheats_saveSettings: `Save Settings`, - cheats_account: `Account`, - cheats_unlockAllFocusSchools: `Unlock All Focus Schools`, - cheats_helminthUnlockAll: `Fully Level Up Helminth`, - cheats_changeSupportedSyndicate: `Supported syndicate`, - cheats_changeButton: `Change`, - cheats_none: `None`, - import_importNote: `You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer will be overwritten in your account.`, - import_submit: `Submit`, -} \ No newline at end of file + general_inventoryUpdateNote: `Note: Changes made here will only be applied in-game when the game syncs the inventory. Visiting the navigation should be the easiest way to trigger that.`, + general_addButton: `Add`, + general_bulkActions: `Bulk Actions`, + code_nonValidAuthz: `Your credentials are no longer valid.`, + code_changeNameConfirm: `What would you like to change your account name to?`, + code_deleteAccountConfirm: `Are you sure you want to delete your account |DISPLAYNAME| (|EMAIL|)? This action cannot be undone.`, + code_archgun: `Archgun`, + code_melee: `Melee`, + code_pistol: `Pistol`, + code_rifle: `Rifle`, + code_shotgun: `Shotgun`, + code_kitgun: `Kitgun`, + code_zaw: `Zaw`, + code_moteAmp: `Mote Amp`, + code_amp: `Amp`, + code_sirocco: `Sirocco`, + code_kDrive: `K-Drive`, + code_legendaryCore: `Legendary Core`, + code_traumaticPeculiar: `Traumatic Peculiar`, + code_badItem: `(Imposter)`, + code_maxRank: `Max Rank`, + code_rename: `Rename`, + code_renamePrompt: `Enter new custom name:`, + code_remove: `Remove`, + code_addItemsConfirm: `Are you sure you want to add |COUNT| items to your account?`, + code_noEquipmentToRankUp: `No equipment to rank up.`, + code_succAdded: `Successfully added.`, + code_buffsNumber: `Number of buffs`, + code_cursesNumber: `Number of curses`, + code_rerollsNumber: `Number of rerolls`, + code_viewStats: `View Stats`, + code_rank: `Rank`, + code_count: `Count`, + code_focusAllUnlocked: `All focus schools are already unlocked.`, + code_focusUnlocked: `Unlocked |COUNT| new focus schools! An inventory update will be needed for the changes to be reflected in-game. Visiting the navigation should be the easiest way to trigger that.`, + code_addModsConfirm: `Are you sure you want to add |COUNT| mods to your account?`, + code_succImport: `Successfully imported.`, + login_description: `Login using your OpenWF account credentials (same as in-game when connecting to this server).`, + login_emailLabel: `Email address`, + login_passwordLabel: `Password`, + login_loginButton: `Login`, + navbar_logout: `Logout`, + navbar_renameAccount: `Rename Account`, + navbar_deleteAccount: `Delete Account`, + navbar_inventory: `Inventory`, + navbar_mods: `Mods`, + navbar_cheats: `Cheats`, + navbar_import: `Import`, + inventory_addItems: `Add Items`, + inventory_suits: `Warframes`, + inventory_longGuns: `Primary Weapons`, + inventory_pistols: `Secondary Weapons`, + inventory_melee: `Melee Weapons`, + inventory_spaceSuits: `Archwings`, + inventory_spaceGuns: `Archwing Primary Weapons`, + inventory_spaceMelee: `Archwing Melee Weapons`, + inventory_mechSuits: `Necramechs`, + inventory_sentinels: `Sentinels`, + inventory_sentinelWeapons: `Sentinel Weapons`, + inventory_operatorAmps: `Amps`, + inventory_hoverboards: `K-Drives`, + inventory_bulkAddSuits: `Add Missing Warframes`, + inventory_bulkAddWeapons: `Add Missing Weapons`, + inventory_bulkAddSpaceSuits: `Add Missing Archwings`, + inventory_bulkAddSpaceWeapons: `Add Missing Archwing Weapons`, + inventory_bulkAddSentinels: `Add Missing Sentinels`, + inventory_bulkAddSentinelWeapons: `Add Missing Sentinel Weapons`, + inventory_bulkRankUpSuits: `Max Rank All Warframes`, + inventory_bulkRankUpWeapons: `Max Rank All Weapons`, + inventory_bulkRankUpSpaceSuits: `Max Rank All Archwings`, + inventory_bulkRankUpSpaceWeapons: `Max Rank All Archwing Weapons`, + inventory_bulkRankUpSentinels: `Max Rank All Sentinels`, + inventory_bulkRankUpSentinelWeapons: `Max Rank All Sentinel Weapons`, + currency_RegularCredits: `Credits`, + currency_PremiumCredits: `Platinum`, + currency_FusionPoints: `Endo`, + currency_PrimeTokens: `Regal Aya`, + currency_owned: `You have |COUNT|.`, + powersuit_archonShardsLabel: `Archon Shard Slots`, + powersuit_archonShardsDescription: `You can use these unlimited slots to apply a wide range of upgrades`, + mods_addRiven: `Add Riven`, + mods_fingerprint: `Fingerprint`, + mods_fingerprintHelp: `Need help with the fingerprint?`, + mods_rivens: `Rivens`, + mods_mods: `Mods`, + mods_bulkAddMods: `Add Missing Mods`, + cheats_administratorRequirement: `You must be an administrator to use this feature. To become an administrator, add |DISPLAYNAME| to administratorNames in the config.json.`, + cheats_server: `Server`, + cheats_skipTutorial: `Skip Tutorial`, + cheats_skipAllDialogue: `Skip All Dialogue`, + cheats_unlockAllScans: `Unlock All Scans`, + cheats_unlockAllMissions: `Unlock All Missions`, + cheats_unlockAllQuests: `Unlock All Quests`, + cheats_completeAllQuests: `Complete All Quests`, + cheats_infiniteCredits: `Infinite Credits`, + cheats_infinitePlatinum: `Infinite Platinum`, + cheats_infiniteEndo: `Infinite Endo`, + cheats_infiniteRegalAya: `Infinite Regal Aya`, + cheats_unlockAllShipFeatures: `Unlock All Ship Features`, + cheats_unlockAllShipDecorations: `Unlock All Ship Decorations`, + cheats_unlockAllFlavourItems: `Unlock All Flavor Items`, + cheats_unlockAllSkins: `Unlock All Skins`, + cheats_unlockAllCapturaScenes: `Unlock All Captura Scenes`, + cheats_universalPolarityEverywhere: `Universal Polarity Everywhere`, + cheats_unlockDoubleCapacityPotatoesEverywhere: `Potatoes Everywhere`, + cheats_unlockExilusEverywhere: `Exilus Adapters Everywhere`, + cheats_unlockArcanesEverywhere: `Arcane Adapters Everywhere`, + cheats_noDailyStandingLimits: `No Daily Standing Limits`, + cheats_spoofMasteryRank: `Spoofed Mastery Rank (-1 to disable)`, + cheats_saveSettings: `Save Settings`, + cheats_account: `Account`, + cheats_unlockAllFocusSchools: `Unlock All Focus Schools`, + cheats_helminthUnlockAll: `Fully Level Up Helminth`, + cheats_changeSupportedSyndicate: `Supported syndicate`, + cheats_changeButton: `Change`, + cheats_none: `None`, + import_importNote: `You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer will be overwritten in your account.`, + import_submit: `Submit` +}; diff --git a/static/webui/translations/ru.js b/static/webui/translations/ru.js index 77a8a34a..372fcf3c 100644 --- a/static/webui/translations/ru.js +++ b/static/webui/translations/ru.js @@ -1,121 +1,121 @@ // Russian translation by AMelonInsideLemon dict = { - general_inventoryUpdateNote: `Примечание: изменения, внесенные здесь, отобразятся в игре только после повторной загрузки вашего инвентаря. Посещение навигации — самый простой способ этого добиться.`, - general_addButton: `Добавить`, - general_bulkActions: `Массовые действия`, - code_nonValidAuthz: `Ваши данные больше не действительны.`, - code_changeNameConfirm: `Какое имя вы хотите установить для своей учетной записи?`, - code_deleteAccountConfirm: `Вы уверены, что хотите удалить аккаунт |DISPLAYNAME| (|EMAIL|)? Это действие нельзя отменить.`, - code_archgun: `Арч-Пушка`, - code_melee: `Ближний бой`, - code_pistol: `Пистолет`, - code_rifle: `Винтовка`, - code_shotgun: `Дробовик`, - code_kitgun: `Китган`, - code_zaw: `Зо`, - code_moteAmp: `Пылинка`, - code_amp: `Усилитель`, - code_sirocco: `Сирокко`, - code_kDrive: `К-Драйв`, - code_legendaryCore: `Легендарное ядро`, - code_traumaticPeculiar: `Травмирующая Странность`, - code_badItem: `(Самозванец)`, - code_maxRank: `Максимальный ранг`, - code_rename: `Переименовать`, - code_renamePrompt: `Введите новое имя:`, - code_remove: `Удалить`, - code_addItemsConfirm: `Вы уверены, что хотите добавить |COUNT| предметов на ваш аккаунт?`, - code_noEquipmentToRankUp: `Нет снаряжения для повышения ранга.`, - code_succAdded: `Успешно добавлено.`, - code_buffsNumber: `Количество усилений`, - code_cursesNumber: `Количество проклятий`, - code_rerollsNumber: `Количество циклов`, - code_viewStats: `Просмотр характеристики`, - code_rank: `Ранг`, - code_count: `Количество`, - code_focusAllUnlocked: `Все школы фокуса уже разблокированы.`, - code_focusUnlocked: `Разблокировано |COUNT| новых школ фокуса! Для отображения изменений в игре потребуется обновление инвентаря. Посещение навигации — самый простой способ этого добиться.`, - code_addModsConfirm: `Вы уверены, что хотите добавить |COUNT| модов на ваш аккаунт?`, - code_succImport: `Успешно импортировано.`, - login_description: `Войдите, используя учетные данные OpenWF (те же, что и в игре при подключении к этому серверу).`, - login_emailLabel: `Адрес электронной почты`, - login_passwordLabel: `Пароль`, - login_loginButton: `Войти`, - navbar_logout: `Выйти`, - navbar_renameAccount: `Переименовать аккаунт`, - navbar_deleteAccount: `Удалить аккаунт`, - navbar_inventory: `Инвентарь`, - navbar_mods: `Моды`, - navbar_cheats: `Читы`, - navbar_import: `Импорт`, - inventory_addItems: `Добавить предметы`, - inventory_suits: `Варфреймы`, - inventory_longGuns: `Основное оружие`, - inventory_pistols: `Вторичное оружие`, - inventory_melee: `Оружие ближнего боя`, - inventory_spaceSuits: `Арчвинги`, - inventory_spaceGuns: `Оружие арчвинга`, - inventory_spaceMelee: `Оружие ближнего боя арчвинга`, - inventory_mechSuits: `Некрамехи`, - inventory_sentinels: `Стражи`, - inventory_sentinelWeapons: `Оружие стражей`, - inventory_operatorAmps: `Усилители`, - inventory_hoverboards: `К-Драйвы`, - inventory_bulkAddSuits: `Добавить отсутствующие варфреймы`, - inventory_bulkAddWeapons: `Добавить отсутствующее оружие`, - inventory_bulkAddSpaceSuits: `Добавить отсутствующие арчвинги`, - inventory_bulkAddSpaceWeapons: `Добавить отсутствующее оружие арчвингов`, - inventory_bulkAddSentinels: `Добавить отсутствующих стражей`, - inventory_bulkAddSentinelWeapons: `Добавить отсутствующее оружие стражей`, - inventory_bulkRankUpSuits: `Максимальный ранг всех варфреймов`, - inventory_bulkRankUpWeapons: `Максимальный ранг всего оружия`, - inventory_bulkRankUpSpaceSuits: `Максимальный ранг всех арчвингов`, - inventory_bulkRankUpSpaceWeapons: `Максимальный ранг всего оружия арчвингов`, - inventory_bulkRankUpSentinels: `Максимальный ранг всех стражей`, - inventory_bulkRankUpSentinelWeapons: `Максимальный ранг всего оружия стражей`, - currency_RegularCredits: `Кредиты`, - currency_PremiumCredits: `Платина`, - currency_FusionPoints: `Эндо`, - currency_PrimeTokens: `Королевские Айя`, - currency_owned: `У тебя есть |COUNT|.`, - powersuit_archonShardsLabel: `Ячейки осколков архонта`, - powersuit_archonShardsDescription: `Вы можете использовать эти неограниченные ячейки для установки множества улучшений.`, - mods_addRiven: `Добавить Мод Разлома`, - mods_fingerprint: `Отпечаток`, - mods_fingerprintHelp: `Нужна помощь с отпечатком?`, - mods_rivens: `Моды Разлома`, - mods_mods: `Моды`, - mods_bulkAddMods: `Добавить отсутствующие моды`, - cheats_administratorRequirement: `Вы должны быть администратором для использования этой функции. Чтобы стать администратором, добавьте \"|DISPLAYNAME|\" в administratorNames в config.json.`, - cheats_server: `Сервер`, - cheats_skipTutorial: `Пропустить обучение`, - cheats_skipAllDialogue: `Пропустить все диалоги`, - cheats_unlockAllScans: `Разблокировать все сканирования`, - cheats_unlockAllMissions: `Разблокировать все миссии`, - cheats_unlockAllQuests: `Разблокировать все квесты`, - cheats_completeAllQuests: `Завершить все квесты`, - cheats_infiniteCredits: `Бесконечные кредиты`, - cheats_infinitePlatinum: `Бесконечная платина`, - cheats_infiniteEndo: `Бесконечное эндо`, - cheats_infiniteRegalAya: `Бесконечная Королевская Айя`, - cheats_unlockAllShipFeatures: `Разблокировать все функции корабля`, - cheats_unlockAllShipDecorations: `Разблокировать все украшения корабля`, - cheats_unlockAllFlavourItems: `Разблокировать все уникальные предметы`, - cheats_unlockAllSkins: `Разблокировать все скины`, - cheats_unlockAllCapturaScenes: `Разблокировать все сцены Каптуры`, - cheats_universalPolarityEverywhere: `Универсальная полярность везде`, - cheats_unlockDoubleCapacityPotatoesEverywhere: `Катализаторы везде`, - cheats_unlockExilusEverywhere: `Адаптеры Эксилус везде`, - cheats_unlockArcanesEverywhere: `Адаптеры для мистификаторов везде`, - cheats_noDailyStandingLimits: `Без ежедневных ограничений репутации`, - cheats_spoofMasteryRank: `Подделанный ранг мастерства (-1 для отключения)`, - cheats_saveSettings: `Сохранить настройки`, - cheats_account: `Аккаунт`, - cheats_unlockAllFocusSchools: `Разблокировать все школы фокуса`, - cheats_helminthUnlockAll: `Полностью улучшить Гельминта`, - cheats_changeSupportedSyndicate: `Поддерживаемый синдикат`, - cheats_changeButton: `Изменить`, - cheats_none: `Отсутствует`, - import_importNote: `Вы можете загрузить полный или частичный ответ инвентаря (клиентское представление) здесь. Все поддерживаемые поля будут перезаписаны в вашем аккаунте.`, - import_submit: `Отправить`, -} \ No newline at end of file + general_inventoryUpdateNote: `Примечание: изменения, внесенные здесь, отобразятся в игре только после повторной загрузки вашего инвентаря. Посещение навигации — самый простой способ этого добиться.`, + general_addButton: `Добавить`, + general_bulkActions: `Массовые действия`, + code_nonValidAuthz: `Ваши данные больше не действительны.`, + code_changeNameConfirm: `Какое имя вы хотите установить для своей учетной записи?`, + code_deleteAccountConfirm: `Вы уверены, что хотите удалить аккаунт |DISPLAYNAME| (|EMAIL|)? Это действие нельзя отменить.`, + code_archgun: `Арч-Пушка`, + code_melee: `Ближний бой`, + code_pistol: `Пистолет`, + code_rifle: `Винтовка`, + code_shotgun: `Дробовик`, + code_kitgun: `Китган`, + code_zaw: `Зо`, + code_moteAmp: `Пылинка`, + code_amp: `Усилитель`, + code_sirocco: `Сирокко`, + code_kDrive: `К-Драйв`, + code_legendaryCore: `Легендарное ядро`, + code_traumaticPeculiar: `Травмирующая Странность`, + code_badItem: `(Самозванец)`, + code_maxRank: `Максимальный ранг`, + code_rename: `Переименовать`, + code_renamePrompt: `Введите новое имя:`, + code_remove: `Удалить`, + code_addItemsConfirm: `Вы уверены, что хотите добавить |COUNT| предметов на ваш аккаунт?`, + code_noEquipmentToRankUp: `Нет снаряжения для повышения ранга.`, + code_succAdded: `Успешно добавлено.`, + code_buffsNumber: `Количество усилений`, + code_cursesNumber: `Количество проклятий`, + code_rerollsNumber: `Количество циклов`, + code_viewStats: `Просмотр характеристики`, + code_rank: `Ранг`, + code_count: `Количество`, + code_focusAllUnlocked: `Все школы фокуса уже разблокированы.`, + code_focusUnlocked: `Разблокировано |COUNT| новых школ фокуса! Для отображения изменений в игре потребуется обновление инвентаря. Посещение навигации — самый простой способ этого добиться.`, + code_addModsConfirm: `Вы уверены, что хотите добавить |COUNT| модов на ваш аккаунт?`, + code_succImport: `Успешно импортировано.`, + login_description: `Войдите, используя учетные данные OpenWF (те же, что и в игре при подключении к этому серверу).`, + login_emailLabel: `Адрес электронной почты`, + login_passwordLabel: `Пароль`, + login_loginButton: `Войти`, + navbar_logout: `Выйти`, + navbar_renameAccount: `Переименовать аккаунт`, + navbar_deleteAccount: `Удалить аккаунт`, + navbar_inventory: `Инвентарь`, + navbar_mods: `Моды`, + navbar_cheats: `Читы`, + navbar_import: `Импорт`, + inventory_addItems: `Добавить предметы`, + inventory_suits: `Варфреймы`, + inventory_longGuns: `Основное оружие`, + inventory_pistols: `Вторичное оружие`, + inventory_melee: `Оружие ближнего боя`, + inventory_spaceSuits: `Арчвинги`, + inventory_spaceGuns: `Оружие арчвинга`, + inventory_spaceMelee: `Оружие ближнего боя арчвинга`, + inventory_mechSuits: `Некрамехи`, + inventory_sentinels: `Стражи`, + inventory_sentinelWeapons: `Оружие стражей`, + inventory_operatorAmps: `Усилители`, + inventory_hoverboards: `К-Драйвы`, + inventory_bulkAddSuits: `Добавить отсутствующие варфреймы`, + inventory_bulkAddWeapons: `Добавить отсутствующее оружие`, + inventory_bulkAddSpaceSuits: `Добавить отсутствующие арчвинги`, + inventory_bulkAddSpaceWeapons: `Добавить отсутствующее оружие арчвингов`, + inventory_bulkAddSentinels: `Добавить отсутствующих стражей`, + inventory_bulkAddSentinelWeapons: `Добавить отсутствующее оружие стражей`, + inventory_bulkRankUpSuits: `Максимальный ранг всех варфреймов`, + inventory_bulkRankUpWeapons: `Максимальный ранг всего оружия`, + inventory_bulkRankUpSpaceSuits: `Максимальный ранг всех арчвингов`, + inventory_bulkRankUpSpaceWeapons: `Максимальный ранг всего оружия арчвингов`, + inventory_bulkRankUpSentinels: `Максимальный ранг всех стражей`, + inventory_bulkRankUpSentinelWeapons: `Максимальный ранг всего оружия стражей`, + currency_RegularCredits: `Кредиты`, + currency_PremiumCredits: `Платина`, + currency_FusionPoints: `Эндо`, + currency_PrimeTokens: `Королевские Айя`, + currency_owned: `У тебя есть |COUNT|.`, + powersuit_archonShardsLabel: `Ячейки осколков архонта`, + powersuit_archonShardsDescription: `Вы можете использовать эти неограниченные ячейки для установки множества улучшений.`, + mods_addRiven: `Добавить Мод Разлома`, + mods_fingerprint: `Отпечаток`, + mods_fingerprintHelp: `Нужна помощь с отпечатком?`, + mods_rivens: `Моды Разлома`, + mods_mods: `Моды`, + mods_bulkAddMods: `Добавить отсутствующие моды`, + cheats_administratorRequirement: `Вы должны быть администратором для использования этой функции. Чтобы стать администратором, добавьте \"|DISPLAYNAME|\" в administratorNames в config.json.`, + cheats_server: `Сервер`, + cheats_skipTutorial: `Пропустить обучение`, + cheats_skipAllDialogue: `Пропустить все диалоги`, + cheats_unlockAllScans: `Разблокировать все сканирования`, + cheats_unlockAllMissions: `Разблокировать все миссии`, + cheats_unlockAllQuests: `Разблокировать все квесты`, + cheats_completeAllQuests: `Завершить все квесты`, + cheats_infiniteCredits: `Бесконечные кредиты`, + cheats_infinitePlatinum: `Бесконечная платина`, + cheats_infiniteEndo: `Бесконечное эндо`, + cheats_infiniteRegalAya: `Бесконечная Королевская Айя`, + cheats_unlockAllShipFeatures: `Разблокировать все функции корабля`, + cheats_unlockAllShipDecorations: `Разблокировать все украшения корабля`, + cheats_unlockAllFlavourItems: `Разблокировать все уникальные предметы`, + cheats_unlockAllSkins: `Разблокировать все скины`, + cheats_unlockAllCapturaScenes: `Разблокировать все сцены Каптуры`, + cheats_universalPolarityEverywhere: `Универсальная полярность везде`, + cheats_unlockDoubleCapacityPotatoesEverywhere: `Катализаторы везде`, + cheats_unlockExilusEverywhere: `Адаптеры Эксилус везде`, + cheats_unlockArcanesEverywhere: `Адаптеры для мистификаторов везде`, + cheats_noDailyStandingLimits: `Без ежедневных ограничений репутации`, + cheats_spoofMasteryRank: `Подделанный ранг мастерства (-1 для отключения)`, + cheats_saveSettings: `Сохранить настройки`, + cheats_account: `Аккаунт`, + cheats_unlockAllFocusSchools: `Разблокировать все школы фокуса`, + cheats_helminthUnlockAll: `Полностью улучшить Гельминта`, + cheats_changeSupportedSyndicate: `Поддерживаемый синдикат`, + cheats_changeButton: `Изменить`, + cheats_none: `Отсутствует`, + import_importNote: `Вы можете загрузить полный или частичный ответ инвентаря (клиентское представление) здесь. Все поддерживаемые поля будут перезаписаны в вашем аккаунте.`, + import_submit: `Submit` +}; From 0e7c124d26e0936ebb83161dc2f07899bfadbec8 Mon Sep 17 00:00:00 2001 From: Sainan Date: Wed, 12 Feb 2025 18:15:22 -0800 Subject: [PATCH 11/11] fix: unable to add legendary core (#955) Related to #952 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/955 --- src/services/inventoryService.ts | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/services/inventoryService.ts b/src/services/inventoryService.ts index efdf414d..1241d61c 100644 --- a/src/services/inventoryService.ts +++ b/src/services/inventoryService.ts @@ -415,20 +415,21 @@ export const addItem = async ( } break; case "Upgrades": { - if (typeName.substr(1).split("/")[2] == "CosmeticEnhancers") { - // Needed to add Traumatic Peculiar - const changes = [ - { - ItemType: typeName, - ItemCount: quantity - } - ]; - addMods(inventory, changes); - return { - InventoryChanges: { - RawUpgrades: changes - } - }; + switch (typeName.substr(1).split("/")[2]) { + case "Mods": // Legendary Core + case "CosmeticEnhancers": // Traumatic Peculiar + const changes = [ + { + ItemType: typeName, + ItemCount: quantity + } + ]; + addMods(inventory, changes); + return { + InventoryChanges: { + RawUpgrades: changes + } + }; } break; }