返回提交历史
Modified
src/controllers/dynamic/worldStateController.ts
+1
-1
Modified
src/services/worldStateService.ts
+183
-20
Modified
src/types/worldStateTypes.ts
+103
-6
Deleted
static/fixed_responses/worldState/worldState.json
+0
-333
XFEstudio/XFESpaceNinjaServer
chore: move static world state data into controller (#4143)
Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/4143 Reviewed-by: Sainan <63328889+sainan@users.noreply.github.com> Co-authored-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Co-committed-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>
e313a97b
代码差异
4 个文件
+287
-360
@@ -28,7 +28,7 @@ export const worldStateController: RequestHandler = async (req, res) => {
28
28
populateFissures(worldState)
29
29
]);
30
30
31
if (req.query.l && worldState.Events) {
31
if (req.query.l) {
32
32
for (const event of worldState.Events) {
33
33
const msg = event.Messages.find(x => x.LanguageCode == req.query.l)?.Message ?? event.Msg;
34
34
if (msg) {
@@ -1,4 +1,3 @@
1
import staticWorldState from "../../static/fixed_responses/worldState/worldState.json" with { type: "json" };
2
1
import baro from "../../static/fixed_responses/worldState/baro.json" with { type: "json" };
3
2
import varzia from "../constants/varzia.ts";
4
3
import fissureMissions from "../../static/fixed_responses/worldState/fissureMissions.json" with { type: "json" };
@@ -573,9 +572,9 @@ const pushSyndicateMissions = (
573
572
const dayStart = getSortieTime(day);
574
573
const dayEnd = getSortieTime(day + 1);
575
574
worldState.SyndicateMissions.push({
576
_id: { $oid: ((dayStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + idSuffix },
577
Activation: { $date: { $numberLong: dayStart.toString() } },
578
Expiry: { $date: { $numberLong: dayEnd.toString() } },
575
_id: toOid2(((dayStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + idSuffix, worldState.BuildLabel),
576
Activation: toMongoDate2(dayStart, worldState.BuildLabel),
577
Expiry: toMongoDate2(dayEnd, worldState.BuildLabel),
579
578
Tag: syndicateTag,
580
579
Seed: seed,
581
580
Nodes: nodes
@@ -1874,9 +1873,11 @@ export const getWorldState = (buildLabel: string = BL_LATEST): IWorldState => {
1874
1873
const defenseWavesPerRotation = version_compare(buildLabel, gameToBuildVersion["38.5.0"]) < 0 ? 5 : 3;
1875
1874
1876
1875
const worldState: IWorldState = {
1876
Version: 10,
1877
1877
BuildLabel: buildLabel,
1878
1878
Time: timeSecs,
1879
1879
Goals: [],
1880
Events: [],
1880
1881
Alerts: [],
1881
1882
Sorties: [],
1882
1883
LiteSorties: [],
@@ -1888,25 +1889,178 @@ export const getWorldState = (buildLabel: string = BL_LATEST): IWorldState => {
1888
1889
PrimeVaultTraders: [],
1889
1890
VoidStorms: [],
1890
1891
DailyDeals: [],
1891
//LibraryInfo: {},
1892
1892
//EndlessXpChoices: [],
1893
1893
//EndlessXpSchedule: [],
1894
1894
KnownCalendarSeasons: [],
1895
1895
PVPChallengeInstances: [],
1896
1896
FeaturedGuilds: [],
1897
1897
NodeOverrides: [],
1898
...staticWorldState,
1899
SyndicateMissions: [...staticWorldState.SyndicateMissions],
1898
LibraryInfo: { LastCompletedTargetType: "/Lotus/Types/Game/Library/Targets/Research7Target" },
1899
PrimeVaultAvailabilities: [false, false, false, false, false],
1900
PrimeTokenAvailability: true,
1901
PrimeAccessAvailability: { State: "PRIME1" },
1902
PersistentEnemies: [],
1903
PVPAlternativeModes: [],
1904
PVPActiveTournaments: [],
1905
ConstructionProjects: [],
1906
ProjectPct: [0, 0, 0],
1907
TwitchPromos: [],
1908
ForceLogoutVersion: 0,
1909
ExperimentRecommended: [],
1910
SyndicateMissions: [],
1900
1911
InGameMarket: {
1901
1912
LandingPage: {
1902
Categories: staticWorldState.InGameMarket.LandingPage.Categories.map(c => ({
1903
...c,
1904
Items: [...c.Items]
1905
}))
1913
Categories: [
1914
{
1915
CategoryName: "NEW_PLAYER",
1916
Name: "/Lotus/Language/Store/NewPlayerCategoryTitle",
1917
Icon: "newplayer",
1918
AddToMenu: true,
1919
Items: [
1920
"/Lotus/Types/StoreItems/Packages/2024Bundles/WeaponStarterPack",
1921
"/Lotus/StoreItems/Powersuits/MonkeyKing/MonkeyKing",
1922
"/Lotus/StoreItems/Weapons/Tenno/Melee/SwordsAndBoards/MeleeContestWinnerOne/TennoSwordShield",
1923
"/Lotus/StoreItems/Upgrades/Skins/Effects/WerewolfEphemera",
1924
"/Lotus/StoreItems/Types/StoreItems/SlotItems/TwoWeaponSlotItem",
1925
"/Lotus/StoreItems/Powersuits/Wisp/Wisp",
1926
"/Lotus/StoreItems/Weapons/Tenno/Shotgun/Shotgun",
1927
"/Lotus/StoreItems/Powersuits/Rhino/Rhino",
1928
"/Lotus/StoreItems/Weapons/Corpus/Pistols/CrpAirPistol/CrpAirPistolArray",
1929
"/Lotus/Types/StoreItems/Boosters/AffinityBooster3DayStoreItem"
1930
]
1931
},
1932
{
1933
CategoryName: "NEW",
1934
Name: "/Lotus/Language/Menu/Store_New",
1935
Icon: "new",
1936
Items: []
1937
},
1938
{
1939
CategoryName: "POPULAR",
1940
Name: "/Lotus/Language/Menu/StorePopular",
1941
Icon: "popular",
1942
AddToMenu: true,
1943
Items: [
1944
"/Lotus/Types/StoreItems/Packages/2025Bundles/TC2025DigitalPack",
1945
"/Lotus/Types/StoreItems/Packages/2025Bundles/EncoreCompSupPack",
1946
"/Lotus/Types/StoreItems/Packages/2025Bundles/EncoreGeminiSupPack",
1947
"/Lotus/Types/StoreItems/Packages/WarframeBundles/TempleItemsBundle",
1948
"/Lotus/Types/StoreItems/Packages/FormaPack",
1949
"/Lotus/StoreItems/Upgrades/Skins/Saryn/WF1999SarynSkin",
1950
"/Lotus/StoreItems/Weapons/Tenno/Melee/Swords/DaxDuviriKatana/DaxDuviriKatanaWeapon",
1951
"/Lotus/StoreItems/Upgrades/Skins/Jade/WF1999NyxSkin",
1952
"/Lotus/StoreItems/Types/StoreItems/SuitCustomizations/NinjaColourPickerItem",
1953
"/Lotus/StoreItems/Upgrades/Skins/Mag/WF1999MagSkin",
1954
"/Lotus/StoreItems/Upgrades/Skins/Frost/WF1999FrostSkin",
1955
"/Lotus/StoreItems/Weapons/Tenno/Melee/Swords/DaxDuviriTwoHandedKatana/DaxDuviriTwoHandedKatanaWeapon",
1956
"/Lotus/StoreItems/Upgrades/Skins/Harlequin/MirageDeluxeSkin",
1957
"/Lotus/StoreItems/Weapons/Tenno/Melee/Hammer/DaxDuviriHammer/DaxDuviriHammerWeapon"
1958
]
1959
},
1960
{
1961
CategoryName: "SEASONAL",
1962
Name: "/Lotus/Language/Store/SeasonalCategoryTitle",
1963
Icon: "seasonal",
1964
AddToMenu: true,
1965
Items: []
1966
},
1967
{
1968
CategoryName: "COMMUNITY",
1969
Name: "/Lotus/Language/Store/CommunityCategoryTitle",
1970
Icon: "community",
1971
AddToMenu: true,
1972
Items: []
1973
},
1974
{
1975
CategoryName: "HEIRLOOM",
1976
Name: "/Lotus/Language/Store/HeirloomCategoryTitle",
1977
Icon: "heirloom",
1978
AddToMenu: true,
1979
Items: [
1980
"/Lotus/StoreItems/Upgrades/Skins/Berserker/ValkyrHeirloomSkin",
1981
"/Lotus/StoreItems/Upgrades/Skins/Crowns/HeirloomValkyrCrown",
1982
"/Lotus/StoreItems/Types/StoreItems/SuitCustomizations/ColourPickerValkyrHeirloom",
1983
"/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardValkyrHeirloom",
1984
"/Lotus/StoreItems/Types/StoreItems/AvatarImages/HeirloomValkyrGlyph",
1985
"/Lotus/StoreItems/Upgrades/Skins/Sigils/HeirloomValkyrSigil",
1986
"/Lotus/Types/StoreItems/Packages/HeirloomPackRhino",
1987
"/Lotus/StoreItems/Upgrades/Skins/Rhino/RhinoHeirloomSkin",
1988
"/Lotus/StoreItems/Upgrades/Skins/Crowns/HeirloomRhinoCrown",
1989
"/Lotus/StoreItems/Types/StoreItems/SuitCustomizations/ColourPickerRhinoHeirloom",
1990
"/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardRhinoHeirloom",
1991
"/Lotus/StoreItems/Types/StoreItems/AvatarImages/HeirloomRhinoGlyph",
1992
"/Lotus/StoreItems/Upgrades/Skins/Sigils/HeirloomRhinoSigil",
1993
"/Lotus/Types/StoreItems/Packages/HeirloomPackEmber",
1994
"/Lotus/StoreItems/Upgrades/Skins/Ember/EmberHeirloomSkin",
1995
"/Lotus/StoreItems/Upgrades/Skins/Crowns/HeirloomEmberCrown",
1996
"/Lotus/StoreItems/Types/StoreItems/SuitCustomizations/ColourPickerEmberHeirloom",
1997
"/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardEmberHeirloom",
1998
"/Lotus/StoreItems/Types/StoreItems/AvatarImages/HeirloomEmberGlyph",
1999
"/Lotus/StoreItems/Upgrades/Skins/Sigils/HeirloomEmberSigil"
2000
]
2001
},
2002
{
2003
CategoryName: "TENNOGEN",
2004
Name: "/Lotus/Language/Menu/Store_Tennogen",
2005
Icon: "tennogen",
2006
AddToMenu: true,
2007
Items: [
2008
"/Lotus/StoreItems/Upgrades/Skins/Armor/SWEndocitosShoulderArmor/SWEndocitosShoulderArmorA",
2009
"/Lotus/StoreItems/Upgrades/Skins/Scarves/SWLunariusSyandana",
2010
"/Lotus/StoreItems/Upgrades/Skins/Scarves/SWRauSyandana",
2011
"/Lotus/StoreItems/Upgrades/Skins/Hoplite/SWStyanaxHuzarrSkin",
2012
"/Lotus/StoreItems/Upgrades/Skins/Werewolf/VorunaDemionnaSkin"
2013
]
2014
},
2015
{
2016
CategoryName: "SALE",
2017
Name: "/Lotus/Language/Menu/Store_Sale",
2018
Icon: "sale",
2019
AddToMenu: true,
2020
Items: []
2021
},
2022
{
2023
CategoryName: "WISH_LIST",
2024
Name: "/Lotus/Language/Menu/Store_Wishlist",
2025
Icon: "wishlist",
2026
Items: []
2027
},
2028
{
2029
CategoryName: "QUICK_BUY",
2030
Name: "/Lotus/Language/Store/TopSeller_Title",
2031
Icon: "quickbuy",
2032
Items: [
2033
"/Lotus/Types/StoreItems/Packages/FormaPack",
2034
"/Lotus/StoreItems/Types/Items/MiscItems/OrokinCatalyst",
2035
"/Lotus/StoreItems/Types/Items/MiscItems/WeaponUtilityUnlocker"
2036
]
2037
}
2038
]
1906
2039
}
1907
2040
}
1908
2041
};
1909
2042
2043
worldState.Events.push({
2044
Msg: "Join the OpenWF Discord!",
2045
Messages: [
2046
{ LanguageCode: "fr", Message: "Rejoignez le Discord OpenWF!" },
2047
{ LanguageCode: "it", Message: "Unisciti al Discord di OpenWF!" },
2048
{ LanguageCode: "de", Message: "Trete dem OpenWF Discord bei!" },
2049
{ LanguageCode: "es", Message: "Únete al Discord de OpenWF!" },
2050
{ LanguageCode: "pt", Message: "Junte-se ao Discord do OpenWF!" },
2051
{ LanguageCode: "ru", Message: "Присоединяйтесь к OpenWF Discord!" },
2052
{ LanguageCode: "pl", Message: "Dołącz do Discord OpenWF!" },
2053
{ LanguageCode: "uk", Message: "Приєднуйтесь до OpenWF Discord!" },
2054
{ LanguageCode: "tr", Message: "OpenWF Discord'a katıl!" },
2055
{ LanguageCode: "ja", Message: "OpenWFのDiscordに参加しよう!" },
2056
{ LanguageCode: "zh", Message: "加入OpenWF Discord!" },
2057
{ LanguageCode: "ko", Message: "OpenWF Discord에 가입하세요!" },
2058
{ LanguageCode: "tc", Message: "加入OpenWF Discord!" }
2059
],
2060
Prop: "https://discord.gg/PNNZ3asUuY",
2061
Icon: "/Lotus/Interface/Icons/DiscordIconNoBacker.png"
2062
});
2063
1910
2064
if (config.worldState?.tennoLiveRelay) {
1911
2065
worldState.Goals.push({
1912
2066
_id: toOid2("687bf9400000000000000000", buildLabel),
@@ -3894,25 +4048,34 @@ export const getWorldState = (buildLabel: string = BL_LATEST): IWorldState => {
3894
4048
const bountyCycleStart = Math.trunc((bountyEpoch + bountyCycle * eidolonCycleDuration) * 1000);
3895
4049
bountyCycleEnd = Math.trunc(bountyCycleStart + eidolonCycleDuration * 1000);
3896
4050
worldState.SyndicateMissions.push({
3897
_id: { $oid: ((bountyCycleStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "0000000000000029" },
3898
Activation: { $date: { $numberLong: bountyCycleStart.toString() } },
3899
Expiry: { $date: { $numberLong: bountyCycleEnd.toString() } },
4051
_id: toOid2(
4052
((bountyCycleStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "0000000000000029",
4053
buildLabel
4054
),
4055
Activation: toMongoDate2(bountyCycleStart, buildLabel),
4056
Expiry: toMongoDate2(bountyCycleEnd, buildLabel),
3900
4057
Tag: "ZarimanSyndicate",
3901
4058
Seed: bountyCycle,
3902
4059
Nodes: []
3903
4060
});
3904
4061
worldState.SyndicateMissions.push({
3905
_id: { $oid: ((bountyCycleStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "0000000000000004" },
3906
Activation: { $date: { $numberLong: bountyCycleStart.toString() } },
3907
Expiry: { $date: { $numberLong: bountyCycleEnd.toString() } },
4062
_id: toOid2(
4063
((bountyCycleStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "0000000000000004",
4064
buildLabel
4065
),
4066
Activation: toMongoDate2(bountyCycleStart, buildLabel),
4067
Expiry: toMongoDate2(bountyCycleEnd, buildLabel),
3908
4068
Tag: "EntratiLabSyndicate",
3909
4069
Seed: bountyCycle,
3910
4070
Nodes: []
3911
4071
});
3912
4072
worldState.SyndicateMissions.push({
3913
_id: { $oid: ((bountyCycleStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "0000000000000006" },
3914
Activation: { $date: { $numberLong: bountyCycleStart.toString(10) } },
3915
Expiry: { $date: { $numberLong: bountyCycleEnd.toString(10) } },
4073
_id: toOid2(
4074
((bountyCycleStart / 1000) & 0xffffffff).toString(16).padStart(8, "0") + "0000000000000006",
4075
buildLabel
4076
),
4077
Activation: toMongoDate2(bountyCycleStart, buildLabel),
4078
Expiry: toMongoDate2(bountyCycleEnd, buildLabel),
3916
4079
Tag: "HexSyndicate",
3917
4080
Seed: bountyCycle,
3918
4081
Nodes: []
@@ -8,7 +8,7 @@ export interface IWorldState {
8
8
MobileVersion?: string; // if present, the companion app may show a warning about being out of date
9
9
BuildLabel: string;
10
10
Time: number;
11
Events?: IEvent[];
11
Events: IEvent[];
12
12
Goals: IGoal[];
13
13
Alerts: IAlert[];
14
14
Sorties: ISortie[];
@@ -50,6 +50,17 @@ export interface IWorldState {
50
50
KnownCalendarSeasons: ICalendarSeason[];
51
51
Conquests?: IConquest[];
52
52
Descents?: IDescent[];
53
PrimeVaultAvailabilities: boolean[]; // different in older versions
54
PrimeAccessAvailability: { State: string };
55
PrimeTokenAvailability: boolean;
56
PersistentEnemies: IPersistentEnemy[];
57
PVPAlternativeModes: IPVPAltMode[];
58
PVPActiveTournaments: IPVPTournament[];
59
ConstructionProjects: IConstructionProject[];
60
TwitchPromos: { startDate: IMongoDateWithLegacySupport; endDate: IMongoDateWithLegacySupport; type: string }[];
61
ProjectPct: [number, number, number];
62
ForceLogoutVersion: number;
63
ExperimentRecommended: never[]; // idk proper type
53
64
Tmp?: string;
54
65
}
55
66
@@ -75,8 +86,8 @@ interface IEvent {
75
86
76
87
export interface IAlert {
77
88
_id: IOidWithLegacySupport;
78
Activation: IMongoDate;
79
Expiry: IMongoDate;
89
Activation: IMongoDateWithLegacySupport;
90
Expiry: IMongoDateWithLegacySupport;
80
91
MissionInfo: IAlertMissionInfo;
81
92
Tag?: string;
82
93
Icon?: string;
@@ -196,9 +207,9 @@ export interface ISyndicateJob {
196
207
}
197
208
198
209
export interface ISyndicateMissionInfo {
199
_id: IOid;
200
Activation: IMongoDate;
201
Expiry: IMongoDate;
210
_id: IOidWithLegacySupport;
211
Activation: IMongoDateWithLegacySupport;
212
Expiry: IMongoDateWithLegacySupport;
202
213
Tag: string;
203
214
Seed: number;
204
215
Nodes: string[];
@@ -593,3 +604,89 @@ interface IConquestOverride {
593
604
c?: [string, string][];
594
605
fv?: string[];
595
606
}
607
608
interface IPersistentEnemy {
609
_id: IOidWithLegacySupport;
610
StartTime: IMongoDateWithLegacySupport;
611
AgentType: string;
612
LocTag: string;
613
Icon: string;
614
Rank: number;
615
HealthPercent: number;
616
FleeDamage: number;
617
UseTicketing: boolean;
618
Region: number;
619
Discovered: boolean;
620
LastDiscoveredLocation: string; // SolNode
621
LastDiscoveredTime: IMongoDateWithLegacySupport;
622
623
// I'm not sure about that - it's not in the ws archives, but the game does parse those fields
624
EnhancementIndex?: number;
625
LeaderWeaponType?: string;
626
MinionAgentTypes?: string[];
627
MinionWeaponTypes?: string[];
628
}
629
630
interface IPVPAltMode {
631
TargetMode: string;
632
633
TitleLoc: string;
634
DescriptionLoc: string;
635
636
DisableEnergyPickups: boolean;
637
DisableEnergySurge: boolean;
638
DisableAmmoPickups: boolean;
639
DisableWeaponSwitching: boolean;
640
DisableWeaponHud: boolean;
641
ForceChangeLoadoutOnDeath: boolean;
642
643
MatchTimeOverride: number;
644
EnergyCapOverride: number;
645
MaxPlayersOverride: number;
646
MinPlayersPerTeamOverride: number;
647
MaxTeamCountDifferenceOverride: number;
648
649
WeaponOverrides: IPVPAltModeWeaponOverride[];
650
MeleeWeaponOverride: IPVPAltModeMeleeOverride;
651
}
652
653
interface IPVPAltModeWeaponOverride {
654
Override: boolean;
655
UseFirstAsDefault: boolean;
656
Resources: string[];
657
OriginalVersions: string[];
658
}
659
660
interface IPVPAltModeMeleeOverride extends IPVPAltModeWeaponOverride {
661
IsModularMeleeWeapon: boolean;
662
BalancesPool: string[];
663
HandlesPool: string[];
664
TipsPool: string[];
665
}
666
667
interface IPVPTournament {
668
TargetMode: string;
669
StartDate: IMongoDateWithLegacySupport;
670
EndDate: IMongoDateWithLegacySupport;
671
Week: number;
672
Season: number;
673
}
674
675
interface IConstructionProject {
676
Tag: string;
677
Node: string;
678
Activation: IMongoDateWithLegacySupport;
679
EarlyAccess: IMongoDateWithLegacySupport;
680
PublicAccess: IMongoDateWithLegacySupport;
681
Completed: boolean;
682
Phases: IConstructionPhase[];
683
}
684
685
interface IConstructionPhase {
686
GoalId: IOidWithLegacySupport;
687
Option0: number; // ???
688
Option1: number; // ???
689
RequiredCount: number;
690
RequiredCountGuild: [{ Tier: string }, { Tier: string }, { Tier: string }]; // ???
691
ClanResearchRecipe: string;
692
}
@@ -1,333 +0,0 @@
1
{
2
"Version": 10,
3
"Events": [
4
{
5
"Msg": "Join the OpenWF Discord!",
6
"Messages": [
7
{ "LanguageCode": "fr", "Message": "Rejoignez le Discord OpenWF!" },
8
{ "LanguageCode": "it", "Message": "Unisciti al Discord di OpenWF!" },
9
{ "LanguageCode": "de", "Message": "Trete dem OpenWF Discord bei!" },
10
{ "LanguageCode": "es", "Message": "Únete al Discord de OpenWF!" },
11
{ "LanguageCode": "pt", "Message": "Junte-se ao Discord do OpenWF!" },
12
{ "LanguageCode": "ru", "Message": "Присоединяйтесь к OpenWF Discord!" },
13
{ "LanguageCode": "pl", "Message": "Dołącz do Discord OpenWF!" },
14
{ "LanguageCode": "uk", "Message": "Приєднуйтесь до OpenWF Discord!" },
15
{ "LanguageCode": "tr", "Message": "OpenWF Discord'a katıl!" },
16
{ "LanguageCode": "ja", "Message": "OpenWFのDiscordに参加しよう!" },
17
{ "LanguageCode": "zh", "Message": "加入OpenWF Discord!" },
18
{ "LanguageCode": "ko", "Message": "OpenWF Discord에 가입하세요!" },
19
{ "LanguageCode": "tc", "Message": "加入OpenWF Discord!" }
20
],
21
"Prop": "https://discord.gg/PNNZ3asUuY",
22
"Icon": "/Lotus/Interface/Icons/DiscordIconNoBacker.png"
23
}
24
],
25
"InGameMarket": {
26
"LandingPage": {
27
"Categories": [
28
{
29
"CategoryName": "NEW_PLAYER",
30
"Name": "/Lotus/Language/Store/NewPlayerCategoryTitle",
31
"Icon": "newplayer",
32
"AddToMenu": true,
33
"Items": [
34
"/Lotus/Types/StoreItems/Packages/2024Bundles/WeaponStarterPack",
35
"/Lotus/StoreItems/Powersuits/MonkeyKing/MonkeyKing",
36
"/Lotus/StoreItems/Weapons/Tenno/Melee/SwordsAndBoards/MeleeContestWinnerOne/TennoSwordShield",
37
"/Lotus/StoreItems/Upgrades/Skins/Effects/WerewolfEphemera",
38
"/Lotus/StoreItems/Types/StoreItems/SlotItems/TwoWeaponSlotItem",
39
"/Lotus/StoreItems/Powersuits/Wisp/Wisp",
40
"/Lotus/StoreItems/Weapons/Tenno/Shotgun/Shotgun",
41
"/Lotus/StoreItems/Powersuits/Rhino/Rhino",
42
"/Lotus/StoreItems/Weapons/Corpus/Pistols/CrpAirPistol/CrpAirPistolArray",
43
"/Lotus/Types/StoreItems/Boosters/AffinityBooster3DayStoreItem"
44
]
45
},
46
{
47
"CategoryName": "NEW",
48
"Name": "/Lotus/Language/Menu/Store_New",
49
"Icon": "new",
50
"Items": []
51
},
52
{
53
"CategoryName": "POPULAR",
54
"Name": "/Lotus/Language/Menu/StorePopular",
55
"Icon": "popular",
56
"AddToMenu": true,
57
"Items": [
58
"/Lotus/Types/StoreItems/Packages/2025Bundles/TC2025DigitalPack",
59
"/Lotus/Types/StoreItems/Packages/2025Bundles/EncoreCompSupPack",
60
"/Lotus/Types/StoreItems/Packages/2025Bundles/EncoreGeminiSupPack",
61
"/Lotus/Types/StoreItems/Packages/WarframeBundles/TempleItemsBundle",
62
"/Lotus/Types/StoreItems/Packages/FormaPack",
63
"/Lotus/StoreItems/Upgrades/Skins/Saryn/WF1999SarynSkin",
64
"/Lotus/StoreItems/Weapons/Tenno/Melee/Swords/DaxDuviriKatana/DaxDuviriKatanaWeapon",
65
"/Lotus/StoreItems/Upgrades/Skins/Jade/WF1999NyxSkin",
66
"/Lotus/StoreItems/Types/StoreItems/SuitCustomizations/NinjaColourPickerItem",
67
"/Lotus/StoreItems/Upgrades/Skins/Mag/WF1999MagSkin",
68
"/Lotus/StoreItems/Upgrades/Skins/Frost/WF1999FrostSkin",
69
"/Lotus/StoreItems/Weapons/Tenno/Melee/Swords/DaxDuviriTwoHandedKatana/DaxDuviriTwoHandedKatanaWeapon",
70
"/Lotus/StoreItems/Upgrades/Skins/Harlequin/MirageDeluxeSkin",
71
"/Lotus/StoreItems/Weapons/Tenno/Melee/Hammer/DaxDuviriHammer/DaxDuviriHammerWeapon"
72
]
73
},
74
{
75
"CategoryName": "SEASONAL",
76
"Name": "/Lotus/Language/Store/SeasonalCategoryTitle",
77
"Icon": "seasonal",
78
"AddToMenu": true,
79
"Items": []
80
},
81
{
82
"CategoryName": "COMMUNITY",
83
"Name": "/Lotus/Language/Store/CommunityCategoryTitle",
84
"Icon": "community",
85
"AddToMenu": true,
86
"Items": []
87
},
88
{
89
"CategoryName": "HEIRLOOM",
90
"Name": "/Lotus/Language/Store/HeirloomCategoryTitle",
91
"Icon": "heirloom",
92
"AddToMenu": true,
93
"Items": [
94
"/Lotus/StoreItems/Upgrades/Skins/Berserker/ValkyrHeirloomSkin",
95
"/Lotus/StoreItems/Upgrades/Skins/Crowns/HeirloomValkyrCrown",
96
"/Lotus/StoreItems/Types/StoreItems/SuitCustomizations/ColourPickerValkyrHeirloom",
97
"/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardValkyrHeirloom",
98
"/Lotus/StoreItems/Types/StoreItems/AvatarImages/HeirloomValkyrGlyph",
99
"/Lotus/StoreItems/Upgrades/Skins/Sigils/HeirloomValkyrSigil",
100
"/Lotus/Types/StoreItems/Packages/HeirloomPackRhino",
101
"/Lotus/StoreItems/Upgrades/Skins/Rhino/RhinoHeirloomSkin",
102
"/Lotus/StoreItems/Upgrades/Skins/Crowns/HeirloomRhinoCrown",
103
"/Lotus/StoreItems/Types/StoreItems/SuitCustomizations/ColourPickerRhinoHeirloom",
104
"/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardRhinoHeirloom",
105
"/Lotus/StoreItems/Types/StoreItems/AvatarImages/HeirloomRhinoGlyph",
106
"/Lotus/StoreItems/Upgrades/Skins/Sigils/HeirloomRhinoSigil",
107
"/Lotus/Types/StoreItems/Packages/HeirloomPackEmber",
108
"/Lotus/StoreItems/Upgrades/Skins/Ember/EmberHeirloomSkin",
109
"/Lotus/StoreItems/Upgrades/Skins/Crowns/HeirloomEmberCrown",
110
"/Lotus/StoreItems/Types/StoreItems/SuitCustomizations/ColourPickerEmberHeirloom",
111
"/Lotus/StoreItems/Types/Items/ShipDecos/TarotCardEmberHeirloom",
112
"/Lotus/StoreItems/Types/StoreItems/AvatarImages/HeirloomEmberGlyph",
113
"/Lotus/StoreItems/Upgrades/Skins/Sigils/HeirloomEmberSigil"
114
]
115
},
116
{
117
"CategoryName": "TENNOGEN",
118
"Name": "/Lotus/Language/Menu/Store_Tennogen",
119
"Icon": "tennogen",
120
"AddToMenu": true,
121
"Items": [
122
"/Lotus/StoreItems/Upgrades/Skins/Armor/SWEndocitosShoulderArmor/SWEndocitosShoulderArmorA",
123
"/Lotus/StoreItems/Upgrades/Skins/Scarves/SWLunariusSyandana",
124
"/Lotus/StoreItems/Upgrades/Skins/Scarves/SWRauSyandana",
125
"/Lotus/StoreItems/Upgrades/Skins/Hoplite/SWStyanaxHuzarrSkin",
126
"/Lotus/StoreItems/Upgrades/Skins/Werewolf/VorunaDemionnaSkin"
127
]
128
},
129
{
130
"CategoryName": "SALE",
131
"Name": "/Lotus/Language/Menu/Store_Sale",
132
"Icon": "sale",
133
"AddToMenu": true,
134
"Items": []
135
},
136
{
137
"CategoryName": "WISH_LIST",
138
"Name": "/Lotus/Language/Menu/Store_Wishlist",
139
"Icon": "wishlist",
140
"Items": []
141
},
142
{
143
"CategoryName": "QUICK_BUY",
144
"Name": "/Lotus/Language/Store/TopSeller_Title",
145
"Icon": "quickbuy",
146
"Items": ["/Lotus/Types/StoreItems/Packages/FormaPack", "/Lotus/StoreItems/Types/Items/MiscItems/OrokinCatalyst", "/Lotus/StoreItems/Types/Items/MiscItems/WeaponUtilityUnlocker"]
147
}
148
]
149
}
150
},
151
"SyndicateMissions": [
152
{
153
"_id": { "$oid": "663a4fc5ba6f84724fa4804c" },
154
"Activation": { "$date": { "$numberLong": "1715097541439" } },
155
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
156
"Tag": "EventSyndicate",
157
"Seed": 47385,
158
"Nodes": []
159
},
160
{
161
"_id": { "$oid": "663a4fc5ba6f84724fa4804b" },
162
"Activation": { "$date": { "$numberLong": "1715097541439" } },
163
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
164
"Tag": "NecraloidSyndicate",
165
"Seed": 73038,
166
"Nodes": []
167
},
168
{
169
"_id": { "$oid": "663a4fc5ba6f84724fa4804d" },
170
"Activation": { "$date": { "$numberLong": "1715097541439" } },
171
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
172
"Tag": "KahlSyndicate",
173
"Seed": 50102,
174
"Nodes": []
175
},
176
{
177
"_id": { "$oid": "663a4fc5ba6f84724fa4804f" },
178
"Activation": { "$date": { "$numberLong": "1715097541439" } },
179
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
180
"Tag": "QuillsSyndicate",
181
"Seed": 77721,
182
"Nodes": []
183
},
184
{
185
"_id": { "$oid": "663a4fc5ba6f84724fa48052" },
186
"Activation": { "$date": { "$numberLong": "1715097541439" } },
187
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
188
"Tag": "RadioLegion3Syndicate",
189
"Seed": 95995,
190
"Nodes": []
191
},
192
{
193
"_id": { "$oid": "663a4fc5ba6f84724fa48051" },
194
"Activation": { "$date": { "$numberLong": "1715097541439" } },
195
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
196
"Tag": "RadioLegion2Syndicate",
197
"Seed": 32091,
198
"Nodes": []
199
},
200
{
201
"_id": { "$oid": "663a4fc5ba6f84724fa48053" },
202
"Activation": { "$date": { "$numberLong": "1715097541439" } },
203
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
204
"Tag": "RadioLegionIntermission10Syndicate",
205
"Seed": 74072,
206
"Nodes": []
207
},
208
{
209
"_id": { "$oid": "663a4fc5ba6f84724fa48060" },
210
"Activation": { "$date": { "$numberLong": "1715097541439" } },
211
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
212
"Tag": "RadioLegionIntermission11Syndicate",
213
"Seed": 353,
214
"Nodes": []
215
},
216
{
217
"_id": { "$oid": "663a4fc5ba6f84724fa48060" },
218
"Activation": { "$date": { "$numberLong": "1715097541439" } },
219
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
220
"Tag": "RadioLegionIntermission12Syndicate",
221
"Seed": 353,
222
"Nodes": []
223
},
224
{
225
"_id": { "$oid": "663a4fc5ba6f84724fa48057" },
226
"Activation": { "$date": { "$numberLong": "1715097541439" } },
227
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
228
"Tag": "RadioLegionIntermission5Syndicate",
229
"Seed": 95997,
230
"Nodes": []
231
},
232
{
233
"_id": { "$oid": "663a4fc5ba6f84724fa48055" },
234
"Activation": { "$date": { "$numberLong": "1715097541439" } },
235
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
236
"Tag": "RadioLegionIntermission3Syndicate",
237
"Seed": 71506,
238
"Nodes": []
239
},
240
{
241
"_id": { "$oid": "663a4fc5ba6f84724fa48056" },
242
"Activation": { "$date": { "$numberLong": "1715097541439" } },
243
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
244
"Tag": "RadioLegionIntermission4Syndicate",
245
"Seed": 97653,
246
"Nodes": []
247
},
248
{
249
"_id": { "$oid": "663a4fc5ba6f84724fa48054" },
250
"Activation": { "$date": { "$numberLong": "1715097541439" } },
251
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
252
"Tag": "RadioLegionIntermission2Syndicate",
253
"Seed": 64160,
254
"Nodes": []
255
},
256
{
257
"_id": { "$oid": "663a4fc5ba6f84724fa48058" },
258
"Activation": { "$date": { "$numberLong": "1715097541439" } },
259
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
260
"Tag": "RadioLegionIntermission6Syndicate",
261
"Seed": 94007,
262
"Nodes": []
263
},
264
{
265
"_id": { "$oid": "663a4fc5ba6f84724fa4805c" },
266
"Activation": { "$date": { "$numberLong": "1715097541439" } },
267
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
268
"Tag": "RadioLegionIntermissionSyndicate",
269
"Seed": 69122,
270
"Nodes": []
271
},
272
{
273
"_id": { "$oid": "663a4fc5ba6f84724fa4805a" },
274
"Activation": { "$date": { "$numberLong": "1715097541439" } },
275
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
276
"Tag": "RadioLegionIntermission8Syndicate",
277
"Seed": 69270,
278
"Nodes": []
279
},
280
{
281
"_id": { "$oid": "663a4fc5ba6f84724fa4805b" },
282
"Activation": { "$date": { "$numberLong": "1715097541439" } },
283
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
284
"Tag": "RadioLegionIntermission9Syndicate",
285
"Seed": 5166,
286
"Nodes": []
287
},
288
{
289
"_id": { "$oid": "663a4fc5ba6f84724fa48059" },
290
"Activation": { "$date": { "$numberLong": "1715097541439" } },
291
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
292
"Tag": "RadioLegionIntermission7Syndicate",
293
"Seed": 82114,
294
"Nodes": []
295
},
296
{
297
"_id": { "$oid": "663a4fc5ba6f84724fa4805d" },
298
"Activation": { "$date": { "$numberLong": "1715097541439" } },
299
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
300
"Tag": "RadioLegionSyndicate",
301
"Seed": 25645,
302
"Nodes": []
303
},
304
{
305
"_id": { "$oid": "663a4fc5ba6f84724fa4805f" },
306
"Activation": { "$date": { "$numberLong": "1715097541439" } },
307
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
308
"Tag": "VentKidsSyndicate",
309
"Seed": 67257,
310
"Nodes": []
311
},
312
{
313
"_id": { "$oid": "663a4fc5ba6f84724fa48060" },
314
"Activation": { "$date": { "$numberLong": "1715097541439" } },
315
"Expiry": { "$date": { "$numberLong": "2000000000000" } },
316
"Tag": "VoxSyndicate",
317
"Seed": 77972,
318
"Nodes": []
319
}
320
],
321
"PrimeAccessAvailability": { "State": "PRIME1" },
322
"PrimeVaultAvailabilities": [false, false, false, false, false],
323
"PrimeTokenAvailability": true,
324
"LibraryInfo": { "LastCompletedTargetType": "/Lotus/Types/Game/Library/Targets/Research7Target" },
325
"PersistentEnemies": [],
326
"PVPAlternativeModes": [],
327
"PVPActiveTournaments": [],
328
"ProjectPct": [47.16325544797147, 70.88794362074432, 0],
329
"ConstructionProjects": [],
330
"TwitchPromos": [],
331
"ExperimentRecommended": [],
332
"ForceLogoutVersion": 0
333
}