Reboot v3

This commit is contained in:
Alessandro Autiero
2023-05-24 23:19:36 +02:00
parent 760e336bc0
commit eb6381912c
129 changed files with 396379 additions and 1380 deletions

View File

@@ -1 +0,0 @@
powershell -inputformat none -outputformat none -NonInteractive -Command Add-MpPreference -ExclusionPath "%UserProfile%/.reboot_launcher"

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,2 +0,0 @@
for /f "tokens=5" %%a in ('netstat -aon ^| find ":3551" ^| find "LISTENING"') do taskkill /f /pid %%a
for /f "tokens=5" %%a in ('netstat -aon ^| find ":8080" ^| find "LISTENING"') do taskkill /f /pid %%a

View File

@@ -1 +0,0 @@
for /f "tokens=5" %%a in ('netstat -aon ^| find ":3551" ^| find "LISTENING"') do taskkill /f /pid %%a

View File

@@ -1 +0,0 @@
for /f "tokens=5" %%a in ('netstat -aon ^| find ":8080" ^| find "LISTENING"') do taskkill /f /pid %%a

Binary file not shown.

View File

@@ -1,2 +0,0 @@
taskkill /f /im build.exe
taskkill /f /im winrar.exe

0
assets/builds/build.exe Normal file
View File

1
assets/builds/stop.bat Normal file
View File

@@ -0,0 +1 @@
taskkill /f /im build.exe

BIN
assets/dlls/cobalt.dll Normal file

Binary file not shown.

BIN
assets/dlls/console.dll Normal file

Binary file not shown.

View File

@@ -0,0 +1,11 @@
# Do not remove/change, this redirects epicgames xmpp to lawinserver xmpp
[OnlineSubsystemMcp.Xmpp]
bUseSSL=false
ServerAddr="ws://127.0.0.1"
ServerPort=80
# Do not remove/change, this redirects epicgames xmpp to lawinserver xmpp
[OnlineSubsystemMcp.Xmpp Prod]
bUseSSL=false
ServerAddr="ws://127.0.0.1"
ServerPort=80

View File

@@ -0,0 +1,21 @@
[/Script/FortniteGame.FortGlobals]
bAllowLogout=true # Enables log out button.
[/Script/FortniteGame.FortChatManager]
bShouldRequestGeneralChatRooms=true # Request for chat rooms (global chat and founders chat).
bShouldJoinGlobalChat=true
bShouldJoinFounderChat=true
bIsAthenaGlobalChatEnabled=true # Battle royale global chat.
[/Script/FortniteGame.FortTextHotfixConfig]
+TextReplacements=(Category=Game, Namespace="", bIsMinimalPatch=True, Key="D5ECE3CD484655CBAE1DB6922C1D87C7", NativeString="Getting Started", LocalizedStrings=(("ar","مرحبًا بك في LawinServer!"),("en","Welcome to LawinServer!"),("de","Willkommen bei LawinServer!"),("es","¡Bienvenidos a LawinServer!"),("es-419","¡Bienvenidos a LawinServer!"),("fr","Bienvenue sur LawinServer !"),("it","Benvenuto in LawinServer!"),("ja","LawinServerへようこそ"),("ko","LawinServer에 오신 것을 환영합니다!"),("pl","Witaj w LawinServerze!"),("pt-BR","Bem-vindo ao LawinServer!"),("ru","Добро пожаловать в LawinServer!"),("tr","LavinServer'a Hoş Geldiniz!")))
+TextReplacements=(Category=Game, Namespace="", bIsMinimalPatch=True, Key="CD9D4C7A4486689DB9D16B8A7E290B08", NativeString="Not bad! So, what you'd call this place?", LocalizedStrings=(("ar","استمتع بتجربة لعب استثنائية!"),("en","Have a phenomenal gaming experience!"),("de","Wünsche allen ein wunderbares Spielerlebnis!"),("es","¡Que disfrutes de tu experiencia de videojuegos!"),("es-419","¡Ten una experiencia de juego espectacular!"),("fr","Un bon jeu à toutes et à tous !"),("it","Ti auguriamo un'esperienza di gioco fenomenale!"),("ja","驚きの体験をしよう!"),("ko","게임에서 환상적인 경험을 해보세요!"),("pl","Życzymy fenomenalnej gry!"),("pt-BR","Tenha uma experiência de jogo fenomenal!"),("ru","Желаю невероятно приятной игры!"),("tr","Muhteşem bir oyun deneyimi yaşamanı dileriz!")))
[/Script/FortniteGame.FortGameInstance]
!FrontEndPlaylistData=ClearArray
+FrontEndPlaylistData=(PlaylistName=Playlist_DefaultSolo, PlaylistAccess=(bEnabled=True, bIsDefaultPlaylist=true, bVisibleWhenDisabled=false, bDisplayAsNew=false, CategoryIndex=0, bDisplayAsLimitedTime=false, DisplayPriority=3))
+FrontEndPlaylistData=(PlaylistName=Playlist_DefaultDuo, PlaylistAccess=(bEnabled=True, bIsDefaultPlaylist=true, bVisibleWhenDisabled=false, bDisplayAsNew=false, CategoryIndex=0, bDisplayAsLimitedTime=false, DisplayPriority=4))
+FrontEndPlaylistData=(PlaylistName=Playlist_Trios, PlaylistAccess=(bEnabled=true, bIsDefaultPlaylist=true, bVisibleWhenDisabled=false, bDisplayAsNew=False, bDisplayAsLimitedTime=false, DisplayPriority=5, CategoryIndex=0))
+FrontEndPlaylistData=(PlaylistName=Playlist_DefaultSquad, PlaylistAccess=(bEnabled=true, bIsDefaultPlaylist=true, bVisibleWhenDisabled=false, bDisplayAsNew=false, CategoryIndex=0, bDisplayAsLimitedTime=false, DisplayPriority=6))
+FrontEndPlaylistData=(PlaylistName=Playlist_PlaygroundV2, PlaylistAccess=(bEnabled=true, bIsDefaultPlaylist=false, bVisibleWhenDisabled=false, bDisplayAsNew=false, CategoryIndex=2, bDisplayAsLimitedTime=false, DisplayPriority=16))
+FrontEndPlaylistData=(PlaylistName=Playlist_Campaign, PlaylistAccess=(bEnabled=true, bInvisibleWhenEnabled=true))

View File

@@ -0,0 +1,13 @@
[/Script/FortniteGame.FortRuntimeOptions]
bEnableGlobalChat=true # Enable global chat.
bEnableMexiCola=true # Enable the new friends tab (v19.00+).
bLoadDirectlyIntoLobby=false # Enable the Select Game Mode screen.
bEnableSocialTab=true # Enable the Rift Tour frontend section (v17.30).
!SocialRTInfo=ClearArray
+SocialRTInfo=(SlotId=1,StartsAtUTC=9999.08.06-22.00.00)
+SocialRTInfo=(SlotId=2,StartsAtUTC=9999.08.07-18.00.00)
+SocialRTInfo=(SlotId=3,StartsAtUTC=9999.08.08-04.00.00)
+SocialRTInfo=(SlotId=4,StartsAtUTC=9999.08.08-14.00.00)
+SocialRTInfo=(SlotId=5,StartsAtUTC=9999.08.08-22.00.00)
!ExperimentalCohortPercent=ClearArray
+ExperimentalCohortPercent=(CohortPercent=100,ExperimentNum=20) # Supervised settings bug fix.

View File

@@ -0,0 +1,35 @@
{
"//": "BR Item Shop Config",
"daily1": {
"itemGrants": [""],
"price": 0
},
"daily2": {
"itemGrants": [""],
"price": 0
},
"daily3": {
"itemGrants": [""],
"price": 0
},
"daily4": {
"itemGrants": [""],
"price": 0
},
"daily5": {
"itemGrants": [""],
"price": 0
},
"daily6": {
"itemGrants": [""],
"price": 0
},
"featured1": {
"itemGrants": [""],
"price": 0
},
"featured2": {
"itemGrants": [""],
"price": 0
}
}

View File

@@ -0,0 +1,19 @@
[Config]
# If this is set to false, it will use the email to display name method.
bUseConfigDisplayName=false
# Your fortnite display name (will only be used if the property above is set to true).
displayName=LawinServer
[Profile]
# If this is set to true, every BR and StW seasonal quest will be on complete. Works for Battle Royale from Season 3 to Season 21 and for Save the World from Season 2 to Season X.
bCompletedSeasonalQuests=false
# If this is set to true, all Save the World events will be displayed in lobby.
bAllSTWEventsActivated=false
[GameServer]
# Matchmaker gameserver config, you can use this to connect to gameservers like rift (titanium), fortmp, etc... (they have to be hosting though).
# IP the matchmaker will use upon join.
ip=127.0.0.1
# PORT the matchmaker will use upon join.
port=7777

View File

@@ -0,0 +1 @@
taskkill /f /im lawinserver-win.exe

View File

@@ -0,0 +1 @@
for /f "tokens=5" %%a in ('netstat -aon ^| find ":8080"') do taskkill /f /pid %%a

3
assets/lawin/lawin.bat Normal file
View File

@@ -0,0 +1,3 @@
cd %UserProfile%\.reboot_launcher\backend-lawin
lawinserver-win.exe
pause

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,178 @@
{
"_id": "LawinServer",
"created": "0001-01-01T00:00:00.000Z",
"updated": "0001-01-01T00:00:00.000Z",
"rvn": 0,
"wipeNumber": 1,
"accountId": "LawinServer",
"profileId": "collection_book_people0",
"version": "no_version",
"items": {
"CollectionBookPage:pageHeroes_Commando": {
"templateId": "CollectionBookPage:pageHeroes_Commando",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageHeroes_Constructor": {
"templateId": "CollectionBookPage:pageHeroes_Constructor",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageHeroes_Ninja": {
"templateId": "CollectionBookPage:pageHeroes_Ninja",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageHeroes_Outlander": {
"templateId": "CollectionBookPage:pageHeroes_Outlander",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pagePeople_Defenders": {
"templateId": "CollectionBookPage:pagePeople_Defenders",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pagePeople_Survivors": {
"templateId": "CollectionBookPage:pagePeople_Survivors",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pagePeople_Leads": {
"templateId": "CollectionBookPage:pagePeople_Leads",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pagePeople_UniqueLeads": {
"templateId": "CollectionBookPage:pagePeople_UniqueLeads",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Winter2017_Heroes": {
"templateId": "CollectionBookPage:PageSpecial_Winter2017_Heroes",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Halloween2017_Heroes": {
"templateId": "CollectionBookPage:PageSpecial_Halloween2017_Heroes",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Halloween2017_Workers": {
"templateId": "CollectionBookPage:PageSpecial_Halloween2017_Workers",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_ChineseNewYear2018_Heroes": {
"templateId": "CollectionBookPage:PageSpecial_ChineseNewYear2018_Heroes",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_SpringItOn2018_People": {
"templateId": "CollectionBookPage:PageSpecial_SpringItOn2018_People",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_StormZoneCyber_Heroes": {
"templateId": "CollectionBookPage:PageSpecial_StormZoneCyber_Heroes",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Blockbuster2018_Heroes": {
"templateId": "CollectionBookPage:PageSpecial_Blockbuster2018_Heroes",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_ShadowOps_Heroes": {
"templateId": "CollectionBookPage:PageSpecial_ShadowOps_Heroes",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_RoadTrip2018_Heroes": {
"templateId": "CollectionBookPage:PageSpecial_RoadTrip2018_Heroes",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_WildWest_Heroes": {
"templateId": "CollectionBookPage:PageSpecial_WildWest_Heroes",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_StormZone_Heroes": {
"templateId": "CollectionBookPage:PageSpecial_StormZone_Heroes",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Scavenger_Heroes": {
"templateId": "CollectionBookPage:PageSpecial_Scavenger_Heroes",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
}
},
"stats": {
"attributes": {
"inventory_limit_bonus": 0
}
},
"commandRevision": 0
}

View File

@@ -0,0 +1,458 @@
{
"_id": "LawinServer",
"created": "0001-01-01T00:00:00.000Z",
"updated": "0001-01-01T00:00:00.000Z",
"rvn": 0,
"wipeNumber": 1,
"accountId": "LawinServer",
"profileId": "collection_book_schematics0",
"version": "no_version",
"items": {
"CollectionBookPage:pageMelee_Axes_Weapons": {
"templateId": "CollectionBookPage:pageMelee_Axes_Weapons",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageMelee_Axes_Weapons_Crystal": {
"templateId": "CollectionBookPage:pageMelee_Axes_Weapons_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageMelee_Clubs_Weapons": {
"templateId": "CollectionBookPage:pageMelee_Clubs_Weapons",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageMelee_Clubs_Weapons_Crystal": {
"templateId": "CollectionBookPage:pageMelee_Clubs_Weapons_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageMelee_Scythes_Weapons": {
"templateId": "CollectionBookPage:pageMelee_Scythes_Weapons",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageMelee_Scythes_Weapons_Crystal": {
"templateId": "CollectionBookPage:pageMelee_Scythes_Weapons_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageMelee_Spears_Weapons": {
"templateId": "CollectionBookPage:pageMelee_Spears_Weapons",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageMelee_Spears_Weapons_Crystal": {
"templateId": "CollectionBookPage:pageMelee_Spears_Weapons_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageMelee_Swords_Weapons": {
"templateId": "CollectionBookPage:pageMelee_Swords_Weapons",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageMelee_Swords_Weapons_Crystal": {
"templateId": "CollectionBookPage:pageMelee_Swords_Weapons_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageMelee_Tools_Weapons": {
"templateId": "CollectionBookPage:pageMelee_Tools_Weapons",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageMelee_Tools_Weapons_Crystal": {
"templateId": "CollectionBookPage:pageMelee_Tools_Weapons_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageRanged_Assault_Weapons": {
"templateId": "CollectionBookPage:pageRanged_Assault_Weapons",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageRanged_Assault_Weapons_Crystal": {
"templateId": "CollectionBookPage:pageRanged_Assault_Weapons_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageRanged_Shotgun_Weapons": {
"templateId": "CollectionBookPage:pageRanged_Shotgun_Weapons",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageRanged_Shotgun_Weapons_Crystal": {
"templateId": "CollectionBookPage:pageRanged_Shotgun_Weapons_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:page_Ranged_Pistols_Weapons": {
"templateId": "CollectionBookPage:page_Ranged_Pistols_Weapons",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:page_Ranged_Pistols_Weapons_Crystal": {
"templateId": "CollectionBookPage:page_Ranged_Pistols_Weapons_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageRanged_Snipers_Weapons": {
"templateId": "CollectionBookPage:pageRanged_Snipers_Weapons",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageRanged_Snipers_Weapons_Crystal": {
"templateId": "CollectionBookPage:pageRanged_Snipers_Weapons_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageRanged_Explosive_Weapons": {
"templateId": "CollectionBookPage:pageRanged_Explosive_Weapons",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageTraps_Wall": {
"templateId": "CollectionBookPage:pageTraps_Wall",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageTraps_Ceiling": {
"templateId": "CollectionBookPage:pageTraps_Ceiling",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:pageTraps_Floor": {
"templateId": "CollectionBookPage:pageTraps_Floor",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Weapons_Ranged_Medieval": {
"templateId": "CollectionBookPage:PageSpecial_Weapons_Ranged_Medieval",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Weapons_Ranged_Medieval_Crystal": {
"templateId": "CollectionBookPage:PageSpecial_Weapons_Ranged_Medieval_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Weapons_Melee_Medieval": {
"templateId": "CollectionBookPage:PageSpecial_Weapons_Melee_Medieval",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Weapons_Melee_Medieval_Crystal": {
"templateId": "CollectionBookPage:PageSpecial_Weapons_Melee_Medieval_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Winter2017_Weapons": {
"templateId": "CollectionBookPage:PageSpecial_Winter2017_Weapons",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Winter2017_Weapons_Crystal": {
"templateId": "CollectionBookPage:PageSpecial_Winter2017_Weapons_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_RatRod_Weapons": {
"templateId": "CollectionBookPage:PageSpecial_RatRod_Weapons",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_RatRod_Weapons_Crystal": {
"templateId": "CollectionBookPage:PageSpecial_RatRod_Weapons_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Weapons_Ranged_Winter2017": {
"templateId": "CollectionBookPage:PageSpecial_Weapons_Ranged_Winter2017",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Weapons_Ranged_Winter2017_Crystal": {
"templateId": "CollectionBookPage:PageSpecial_Weapons_Ranged_Winter2017_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Weapons_Melee_Winter2017": {
"templateId": "CollectionBookPage:PageSpecial_Weapons_Melee_Winter2017",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Weapons_Melee_Winter2017_Crystal": {
"templateId": "CollectionBookPage:PageSpecial_Weapons_Melee_Winter2017_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Weapons_ChineseNewYear2018": {
"templateId": "CollectionBookPage:PageSpecial_Weapons_ChineseNewYear2018",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Weapons_Crystal_ChineseNewYear2018": {
"templateId": "CollectionBookPage:PageSpecial_Weapons_Crystal_ChineseNewYear2018",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_StormZoneCyber_Ranged": {
"templateId": "CollectionBookPage:PageSpecial_StormZoneCyber_Ranged",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_StormZoneCyber_Melee": {
"templateId": "CollectionBookPage:PageSpecial_StormZoneCyber_Melee",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_StormZoneCyber_Ranged_Crystal": {
"templateId": "CollectionBookPage:PageSpecial_StormZoneCyber_Ranged_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_StormZoneCyber_Melee_Crystal": {
"templateId": "CollectionBookPage:PageSpecial_StormZoneCyber_Melee_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Blockbuster2018_Ranged": {
"templateId": "CollectionBookPage:PageSpecial_Blockbuster2018_Ranged",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Blockbuster2018_Ranged_Crystal": {
"templateId": "CollectionBookPage:PageSpecial_Blockbuster2018_Ranged_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_RoadTrip2018_Weapons": {
"templateId": "CollectionBookPage:PageSpecial_RoadTrip2018_Weapons",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_RoadTrip2018_Weapons_Crystal": {
"templateId": "CollectionBookPage:PageSpecial_RoadTrip2018_Weapons_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Weapons_Ranged_StormZone2": {
"templateId": "CollectionBookPage:PageSpecial_Weapons_Ranged_StormZone2",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Weapons_Ranged_StormZone2_Crystal": {
"templateId": "CollectionBookPage:PageSpecial_Weapons_Ranged_StormZone2_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Weapons_Melee_StormZone2": {
"templateId": "CollectionBookPage:PageSpecial_Weapons_Melee_StormZone2",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Weapons_Melee_StormZone2_Crystal": {
"templateId": "CollectionBookPage:PageSpecial_Weapons_Melee_StormZone2_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Hydraulic": {
"templateId": "CollectionBookPage:PageSpecial_Hydraulic",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Hydraulic_Crystal": {
"templateId": "CollectionBookPage:PageSpecial_Hydraulic_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Scavenger": {
"templateId": "CollectionBookPage:PageSpecial_Scavenger",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:PageSpecial_Scavenger_Crystal": {
"templateId": "CollectionBookPage:PageSpecial_Scavenger_Crystal",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
},
"CollectionBookPage:test_TestPage": {
"templateId": "CollectionBookPage:test_TestPage",
"attributes": {
"sectionStates": [],
"state": "Active"
},
"quantity": 1
}
},
"stats": {
"attributes": {
"inventory_limit_bonus": 0
}
},
"commandRevision": 0
}

View File

@@ -0,0 +1,15 @@
{
"_id": "LawinServer",
"created": "0001-01-01T00:00:00.000Z",
"updated": "0001-01-01T00:00:00.000Z",
"rvn": 0,
"wipeNumber": 1,
"accountId": "LawinServer",
"profileId": "collections",
"version": "no_version",
"items": {},
"stats": {
"attributes": {}
},
"commandRevision": 0
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,18 @@
{
"created": "0001-01-01T00:00:00.000Z",
"updated": "0001-01-01T00:00:00.000Z",
"rvn": 0,
"wipeNumber": 1,
"accountId": "LawinServer",
"profileId": "common_public",
"version": "no_version",
"items": {},
"stats": {
"attributes": {
"banner_color": "DefaultColor15",
"homebase_name": "",
"banner_icon": "SurvivalBannerStonewoodComplete"
}
},
"commandRevision": 0
}

View File

@@ -0,0 +1,15 @@
{
"_id": "LawinServer",
"created": "0001-01-01T00:00:00.000Z",
"updated": "0001-01-01T00:00:00.000Z",
"rvn": 0,
"wipeNumber": 1,
"accountId": "LawinServer",
"profileId": "creative",
"version": "no_version",
"items": {},
"stats": {
"attributes": {}
},
"commandRevision": 0
}

View File

@@ -0,0 +1,231 @@
{
"_id": "LawinServer",
"created": "0001-01-01T00:00:00.000Z",
"updated": "0001-01-01T00:00:00.000Z",
"rvn": 0,
"wipeNumber": 1,
"accountId": "LawinServer",
"profileId": "metadata",
"version": "no_version",
"items": {
"Outpost:outpostcore_pve_03": {
"templateId": "Outpost:outpostcore_pve_03",
"attributes": {
"cloud_save_info": {
"saveCount": 319,
"savedRecords": [
{
"recordIndex": 0,
"archiveNumber": 1,
"recordFilename": "eb192023-7db8-4bc0-b3e4-bf060c7baf87_r0_a1.sav"
}
]
},
"level": 10,
"outpost_core_info": {
"placedBuildings": [
{
"buildingTag": "Outpost.BuildingActor.Building.00",
"placedTag": "Outpost.PlacementActor.Placement.01"
},
{
"buildingTag": "Outpost.BuildingActor.Building.01",
"placedTag": "Outpost.PlacementActor.Placement.00"
},
{
"buildingTag": "Outpost.BuildingActor.Building.02",
"placedTag": "Outpost.PlacementActor.Placement.05"
},
{
"buildingTag": "Outpost.BuildingActor.Building.03",
"placedTag": "Outpost.PlacementActor.Placement.02"
}
],
"accountsWithEditPermission": [],
"highestEnduranceWaveReached": 30
}
},
"quantity": 1
},
"Outpost:outpostcore_pve_02": {
"templateId": "Outpost:outpostcore_pve_02",
"attributes": {
"cloud_save_info": {
"saveCount": 603,
"savedRecords": [
{
"recordIndex": 0,
"archiveNumber": 0,
"recordFilename": "76fe0295-aee2-463a-9229-d9933b4969b8_r0_a0.sav"
}
]
},
"level": 10,
"outpost_core_info": {
"placedBuildings": [
{
"buildingTag": "Outpost.BuildingActor.Building.00",
"placedTag": "Outpost.PlacementActor.Placement.00"
},
{
"buildingTag": "Outpost.BuildingActor.Building.01",
"placedTag": "Outpost.PlacementActor.Placement.01"
},
{
"buildingTag": "Outpost.BuildingActor.Building.02",
"placedTag": "Outpost.PlacementActor.Placement.04"
},
{
"buildingTag": "Outpost.BuildingActor.Building.03",
"placedTag": "Outpost.PlacementActor.Placement.03"
},
{
"buildingTag": "Outpost.BuildingActor.Building.04",
"placedTag": "Outpost.PlacementActor.Placement.02"
}
],
"accountsWithEditPermission": [],
"highestEnduranceWaveReached": 30
}
},
"quantity": 1
},
"Outpost:outpostcore_pve_04": {
"templateId": "Outpost:outpostcore_pve_04",
"attributes": {
"cloud_save_info": {
"saveCount": 77,
"savedRecords": [
{
"recordIndex": 0,
"archiveNumber": 1,
"recordFilename": "940037e4-87d2-499e-8d00-cdb2dfa326b9_r0_a1.sav"
}
]
},
"level": 10,
"outpost_core_info": {
"placedBuildings": [
{
"buildingTag": "Outpost.BuildingActor.Building.00",
"placedTag": "Outpost.PlacementActor.Placement.00"
},
{
"buildingTag": "Outpost.BuildingActor.Building.01",
"placedTag": "Outpost.PlacementActor.Placement.01"
},
{
"buildingTag": "Outpost.BuildingActor.Building.02",
"placedTag": "Outpost.PlacementActor.Placement.03"
},
{
"buildingTag": "Outpost.BuildingActor.Building.03",
"placedTag": "Outpost.PlacementActor.Placement.05"
}
],
"accountsWithEditPermission": [],
"highestEnduranceWaveReached": 30
}
},
"quantity": 1
},
"Outpost:outpostcore_pve_01": {
"templateId": "Outpost:outpostcore_pve_01",
"attributes": {
"cloud_save_info": {
"saveCount": 851,
"savedRecords": [
{
"recordIndex": 0,
"archiveNumber": 0,
"recordFilename": "a1d68ce6-63a5-499a-946f-9e0c825572d7_r0_a0.sav"
}
]
},
"level": 10,
"outpost_core_info": {
"placedBuildings": [
{
"buildingTag": "Outpost.BuildingActor.Building.00",
"placedTag": "Outpost.PlacementActor.Placement.00"
},
{
"buildingTag": "Outpost.BuildingActor.Building.01",
"placedTag": "Outpost.PlacementActor.Placement.02"
},
{
"buildingTag": "Outpost.BuildingActor.Building.02",
"placedTag": "Outpost.PlacementActor.Placement.01"
},
{
"buildingTag": "Outpost.BuildingActor.Building.03",
"placedTag": "Outpost.PlacementActor.Placement.05"
}
],
"accountsWithEditPermission": [],
"highestEnduranceWaveReached": 30
}
},
"quantity": 1
},
"DeployableBaseCloudSave:testdeployablebaseitemdef": {
"templateId": "DeployableBaseCloudSave:testdeployablebaseitemdef",
"attributes": {
"tier_progression": {
"progressionInfo": [
{
"progressionLayoutGuid": "B70B5C69-437E-75C5-CB91-7E913F3B5294",
"highestDefeatedTier": 0
},
{
"progressionLayoutGuid": "04FD086F-4A99-823B-06C3-979A8F408960",
"highestDefeatedTier": 4
},
{
"progressionLayoutGuid": "D3D31F40-45D8-FD77-67E6-5FBAB0550417",
"highestDefeatedTier": 1
},
{
"progressionLayoutGuid": "92A17A43-4EDC-8F69-688F-24BB3A3D8AEF",
"highestDefeatedTier": 3
},
{
"progressionLayoutGuid": "A2D8DB3E-457E-279B-58F5-AA9BA2FDC547",
"highestDefeatedTier": 4
},
{
"progressionLayoutGuid": "5AAB9A15-49F5-0D74-0B22-BB9686396E8F",
"highestDefeatedTier": 1
},
{
"progressionLayoutGuid": "9077163A-4664-1993-5A20-D28170404FD6",
"highestDefeatedTier": 3
},
{
"progressionLayoutGuid": "FB679125-49BC-0025-48F3-22A1B8085189",
"highestDefeatedTier": 4
}
]
},
"cloud_save_info": {
"saveCount": 11,
"savedRecords": [
{
"recordIndex": 0,
"archiveNumber": 1,
"recordFilename": "2FA8CFBB-4973-CCF0-EEA8-BEBC37D99F52_r0_a1.sav"
}
]
},
"level": 0
},
"quantity": 1
}
},
"stats": {
"attributes": {
"inventory_limit_bonus": 0
}
},
"commandRevision": 0
}

View File

@@ -0,0 +1,17 @@
{
"_id": "LawinServer",
"created": "0001-01-01T00:00:00.000Z",
"updated": "0001-01-01T00:00:00.000Z",
"rvn": 0,
"wipeNumber": 1,
"accountId": "LawinServer",
"profileId": "outpost0",
"version": "no_version",
"items": {},
"stats": {
"attributes": {
"inventory_limit_bonus": 0
}
},
"commandRevision": 0
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,694 @@
{
"_id": "LawinServer",
"created": "0001-01-01T00:00:00.000Z",
"updated": "0001-01-01T00:00:00.000Z",
"rvn": 0,
"wipeNumber": 1,
"accountId": "LawinServer",
"profileId": "theater0",
"version": "no_version",
"items": {
"3d81f6f3-1290-326e-dfee-e577af2e9fbb": {
"templateId": "Ingredient:ingredient_blastpowder",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"70ff3716-d732-c472-b1d8-0a20d48dd607": {
"templateId": "Ingredient:ingredient_ore_silver",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"48059439-88b0-a779-daae-36d9495f079e": {
"templateId": "Ingredient:ingredient_ore_alloy",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"7dd4a423-0b6f-3abb-757c-88077adcaacc": {
"templateId": "Ingredient:ingredient_crystal_sunbeam",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"694a4c8d-67b6-f903-85bf-f33d4e7a6859": {
"templateId": "Ingredient:ingredient_ore_obsidian",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"97feb4c9-2290-fd4b-c356-7f346ba67e39": {
"templateId": "Ingredient:ingredient_mechanical_parts_t05",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"25ff4168-8eb9-a5cc-4900-d06cdb8004ab": {
"templateId": "Ingredient:ingredient_mechanical_parts_t02",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"a63022b8-6467-a347-7c11-37d483d45d08": {
"templateId": "Ingredient:ingredient_rare_powercell",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"7e0d23d2-24dc-9579-4f32-507758107bd3": {
"templateId": "Ingredient:ingredient_resin",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"d44ad9ed-a5d3-0642-a865-083061aeb4e6": {
"templateId": "Ingredient:ingredient_powder_t05",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"2011030e-dbce-a02b-c086-ec8a99f16aeb": {
"templateId": "Ingredient:ingredient_crystal_quartz",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"7d43d569-e170-bd46-dfb2-92828ff0c98d": {
"templateId": "Ingredient:ingredient_rare_mechanism",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"1db23fbf-1ab5-72d9-2b20-50eacebda6d5": {
"templateId": "Ingredient:ingredient_nuts_bolts",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 0,
"itemSource": ""
},
"quantity": 999
},
"024aa359-e313-168a-3738-31ae4f04cfb2": {
"templateId": "Ingredient:ingredient_ore_brightcore",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"da7680a3-072e-3e3f-3ed6-bf71159f6df0": {
"templateId": "Ingredient:ingredient_planks",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"10aec620-f4b9-aadd-da3e-5d4a8f87225b": {
"templateId": "Ingredient:ingredient_ore_malachite",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"161217ac-5b39-a93e-a1d8-7f7667646624": {
"templateId": "Ingredient:ingredient_crystal_shadowshard",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"f33663f5-bf16-9315-8df2-91800944b3e8": {
"templateId": "Ingredient:ingredient_twine_t05",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"aa4a3cce-9bb5-50ef-4c59-f959e89c3992": {
"templateId": "Ingredient:ingredient_twine_t01",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"e9eca1e1-7665-1315-de97-6583394e0af1": {
"templateId": "Ingredient:ingredient_batteries",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"d1fd9cb3-0d51-6d7c-e937-9b07406ba42e": {
"templateId": "Ingredient:ingredient_twine_t04",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"7d8f824d-cec2-01d5-0efc-c30073402de2": {
"templateId": "Ingredient:ingredient_herbs",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"bdb45648-18f6-fdc6-8252-b717043f0021": {
"templateId": "Ingredient:ingredient_mechanical_parts_t04",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"ddc2382e-faf9-14dd-c721-c659660540a8": {
"templateId": "Ingredient:ingredient_ore_copper",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"75582a66-bc3e-958a-1943-79a56150d0bb": {
"templateId": "Ingredient:ingredient_powder_t03",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"b4616de1-caf4-3652-a613-edb932df71e0": {
"templateId": "Ingredient:ingredient_mechanical_parts_t01",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"bdc338a8-3667-e7e4-280d-5d4e4255b3f1": {
"templateId": "Ingredient:ingredient_twine_t02",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"d17582f7-eb63-a4a6-cd4d-ff3d68e69757": {
"templateId": "Ingredient:ingredient_powder_t01",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"25e43cee-7dc7-348b-40bc-20b8850468ba": {
"templateId": "Ingredient:ingredient_duct_tape",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"720bc675-44e2-ff74-6e5c-eec23b493bd1": {
"templateId": "Ingredient:ingredient_twine_t03",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"0e2094f2-9c35-9e51-58ea-a87ec89fa758": {
"templateId": "Ingredient:ingredient_powder_t02",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"1cf850a0-1797-4fe8-dd94-34152756c80b": {
"templateId": "Ingredient:ingredient_bacon",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 0,
"itemSource": ""
},
"quantity": 999
},
"7fe47331-1cbd-4606-c12e-6df2c1dc13a3": {
"templateId": "Ingredient:ingredient_mechanical_parts_t03",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"42d429fc-a4cf-974d-2bce-17c6b872c96e": {
"templateId": "Ingredient:ingredient_ore_coal",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"124d77cc-8cd4-fdcc-efe1-c18ee63587eb": {
"templateId": "Ingredient:ingredient_flowers",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"ea2a6495-4b9e-59df-0163-5e5e8f52467e": {
"templateId": "Ingredient:ingredient_powder_t04",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"6291ab77-ec9b-1b35-ccb0-063519415f6d": {
"templateId": "WorldItem:wooditemdata",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"2d7953c0-752f-c2a7-ebef-90b45cb30b5b": {
"templateId": "WorldItem:stoneitemdata",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"06f471d5-046b-50f6-3f07-9aa670b6fecb": {
"templateId": "WorldItem:metalitemdata",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"003e7a8c-92eb-13c1-6b0e-aafad8f3d81d": {
"templateId": "Weapon:edittool",
"attributes": {
"clipSizeScale": 0,
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"baseClipSize": 0,
"durability": 1,
"itemSource": ""
},
"quantity": 1
},
"bcb13e35-c030-cf2a-a003-16377320beda": {
"templateId": "Weapon:buildingitemdata_wall",
"attributes": {
"clipSizeScale": 0,
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"baseClipSize": 0,
"durability": 1,
"itemSource": ""
},
"quantity": 1
},
"97ba026b-a36c-6827-e9d7-21bc6a1f9c53": {
"templateId": "Weapon:buildingitemdata_floor",
"attributes": {
"clipSizeScale": 0,
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"baseClipSize": 0,
"durability": 1,
"itemSource": ""
},
"quantity": 1
},
"15c02d16-11f6-ffd1-e8bb-4b5d56bd5bd9": {
"templateId": "Weapon:buildingitemdata_stair_w",
"attributes": {
"clipSizeScale": 0,
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"baseClipSize": 0,
"durability": 1,
"itemSource": ""
},
"quantity": 1
},
"f603c8af-e326-202e-3b12-b5fd2517e5c2": {
"templateId": "Weapon:buildingitemdata_roofs",
"attributes": {
"clipSizeScale": 0,
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"baseClipSize": 0,
"durability": 1,
"itemSource": ""
},
"quantity": 1
},
"baa4f86c-708c-7689-0859-fbfdb1bc623a": {
"templateId": "Ammo:ammodatabulletsmedium",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"240894a2-f99a-214d-ce50-2dac39394699": {
"templateId": "Ammo:ammodatashells",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": "None"
},
"quantity": 999
},
"1a0c69f4-2c23-a5c9-34a0-f48c45637171": {
"templateId": "Ammo:ammodataenergycell",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": ""
},
"quantity": 999
},
"a92b1e7e-5812-0bfd-0107-f7b97ed166fa": {
"templateId": "Ammo:ammodatabulletsheavy",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": "None"
},
"quantity": 999
},
"7516967c-e831-4c3a-1a24-03834756f532": {
"templateId": "Ammo:ammodatabulletslight",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": "None"
},
"quantity": 999
},
"23220ed0-29d4-3da1-6e0e-6df46a19752d": {
"templateId": "Ammo:ammodataexplosive",
"attributes": {
"loadedAmmo": 0,
"inventory_overflow_date": false,
"level": 0,
"alterationDefinitions": [],
"durability": 1,
"itemSource": "None"
},
"quantity": 999
}
},
"stats": {
"attributes": {
"player_loadout": {
"bPlayerIsNew": false,
"pinnedSchematicInstances": [],
"primaryQuickBarRecord": {
"slots": [
{
"items": []
},
{
"items": []
},
{
"items": []
},
{
"items": []
},
{
"items": []
},
{
"items": []
},
{
"items": []
},
{
"items": []
},
{
"items": []
}
]
},
"secondaryQuickBarRecord": {
"slots": [
{
"items": []
},
{
"items": []
},
{
"items": []
},
{
"items": []
},
{
"items": []
},
{
"items": []
},
{
"items": []
}
]
},
"zonesCompleted": 0
},
"theater_unique_id": "",
"past_lifetime_zones_completed": 0,
"last_event_instance_key": "",
"last_zones_completed": 0,
"inventory_limit_bonus": 0
}
},
"profileLockExpiration": "0001-01-01T00:00:00.000Z",
"commandRevision": 0
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 KiB

View File

@@ -0,0 +1,461 @@
{
"battleBundleOfferId": "259920BC42F0AAC7C8672D856C9B622C",
"battlePassOfferId": "2E43CCD24C3BE8F5ABBDF28E233B9350",
"tierOfferId": "AF1B7AC14A5F6A9ED255B88902120757",
"paidRewards": [
{
"Token:athenaseasonxpboost": 50,
"Token:athenaseasonfriendxpboost": 60,
"AthenaCharacter:cid_486_athena_commando_f_streetracerdrift": 1,
"AthenaCharacter:cid_488_athena_commando_m_rustremix": 1,
"Token:athenaseasonmergedxpboosts": 1,
"ChallengeBundleSchedule:season10_seasonx_schedule": 1,
"ChallengeBundleSchedule:season10_blackknight_schedule": 1,
"ChallengeBundleSchedule:season10_djyonger_schedule": 1,
"ChallengeBundleSchedule:season10_drift_schedule": 1,
"ChallengeBundleSchedule:season10_rustlord_schedule": 1,
"ChallengeBundleSchedule:season10_sparkle_schedule": 1,
"ChallengeBundleSchedule:season10_teknique_schedule": 1,
"ChallengeBundleSchedule:season10_voyager_schedule": 1,
"ChallengeBundleSchedule:season10_mission_schedule": 1,
"ChallengeBundleSchedule:season10_seasonlevel_mission_schedule": 1
},
{
"Token:athenaseasonxpboost": 10,
"Token:athenanextseasonxpboost": 30
},
{
"AthenaDance:emoji_redknight": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaItemWrap:wrap_107_graffitiremix": 1
},
{
"HomebaseBannerIcon:brs10dragonegg": 1
},
{
"AthenaGlider:glider_id_166_rustlordremix": 1
},
{
"AthenaDance:spid_150_icedragon": 1
},
{
"Token:athenaseasonfriendxpboost": 10
},
{
"AthenaLoadingScreen:lsid_161_h7outfitsa": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaMusicPack:musicpack_024_showdown": 1
},
{
"HomebaseBannerIcon:brs10medievalknight": 1
},
{
"AthenaDance:spid_140_moistymire": 1
},
{
"AthenaPickaxe:pickaxe_id_245_voyagerremix1h": 1
},
{
"AthenaLoadingScreen:lsid_155_akdrift": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaDance:emoji_crackshot": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:spid_149_fireice": 1
},
{
"AthenaSkyDiveContrail:trails_id_074_driftlightning": 1
},
{
"AthenaLoadingScreen:lsid_151_jmsparkle": 1
},
{
"AthenaCharacter:cid_483_athena_commando_f_graffitiremix": 1
},
{
"Token:athenaseasonfriendxpboost": 10
},
{
"AthenaDance:emoji_popcorn": 1
},
{
"HomebaseBannerIcon:brs10kevincube": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaBackpack:petcarrier_012_drift_fox": 1
},
{
"AthenaLoadingScreen:lsid_154_ijcuddle": 1
},
{
"AthenaDance:emoji_lifepreserver": 1
},
{
"AthenaDance:eid_jaywalking": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"HomebaseBannerIcon:brs10astronaut": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaItemWrap:wrap_106_djremix": 1
},
{
"AthenaLoadingScreen:lsid_158_ntdurrr": 1
},
{
"AthenaDance:toy_015_bottle": 1
},
{
"AthenaDance:spid_138_sparklespecialist": 1
},
{
"AthenaGlider:glider_id_163_djremix": 1
},
{
"Token:athenaseasonfriendxpboost": 10
},
{
"AthenaLoadingScreen:lsid_175_jmtomato": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaSkyDiveContrail:trails_id_065_djremix": 1
},
{
"AthenaDance:emoji_coolpepper": 1
},
{
"CosmeticVariantToken:vtid_286_petcarrier_driftfox_styleb": 1
},
{
"AthenaLoadingScreen:lsid_160_ktvendetta": 1
},
{
"AthenaCharacter:cid_487_athena_commando_m_djremix": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaDance:spid_135_riskyreels": 1
},
{
"HomebaseBannerIcon:brs10britebomber": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaLoadingScreen:lsid_156_akbrite": 1
},
{
"AthenaDance:toy_020_bottle_fancy": 1
},
{
"CosmeticVariantToken:vtid_288_djremix_headgearb": 1
},
{
"AthenaPickaxe:pickaxe_id_242_sparkleremix": 1
},
{
"Token:athenaseasonfriendxpboost": 10
},
{
"AthenaLoadingScreen:lsid_162_h7outfitsb": 1
},
{
"AthenaDance:emoji_crossswords": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaItemWrap:wrap_105_cube": 1
},
{
"HomebaseBannerIcon:brs10grid": 1
},
{
"AthenaDance:spid_139_tiltedmap": 1
},
{
"AthenaDance:eid_treadmilldance": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"CosmeticVariantToken:vtid_287_petcarrier_driftfox_stylec": 1
},
{
"AthenaLoadingScreen:lsid_164_smcrackshot": 1
},
{
"AthenaSkyDiveContrail:trails_id_066_tacticalhud": 1
},
{
"HomebaseBannerIcon:brs10westernhats": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaCharacter:cid_485_athena_commando_f_sparkleremix": 1
},
{
"AthenaBackpack:bid_318_sparkleremix": 1
},
{
"AthenaDance:spid_134_dustydepot": 1
},
{
"Token:athenaseasonfriendxpboost": 10
},
{
"AthenaLoadingScreen:lsid_159_ktfirewalker": 1
},
{
"CosmeticVariantToken:vtid_290_sparkleremix_hairstyleb": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaGlider:glider_id_169_voyagerremix": 1
},
{
"HomebaseBannerIcon:brs10boombox": 1
},
{
"AthenaDance:eid_breakdance2": 1
},
{
"AthenaLoadingScreen:lsid_177_ijllama": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaSkyDiveContrail:trails_id_075_celestial": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaItemWrap:wrap_109_rustremix": 1
},
{
"HomebaseBannerIcon:brs10doublepump": 1
},
{
"AthenaLoadingScreen:lsid_176_smvolcano": 1
},
{
"AthenaCharacter:cid_489_athena_commando_m_voyagerremix": 1
},
{
"Token:athenaseasonfriendxpboost": 10
},
{
"AthenaDance:emoji_sweaty": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaMusicPack:musicpack_022_daydream": 1
},
{
"AthenaDance:spid_132_blackknight": 1
},
{
"CosmeticVariantToken:vtid_291_voyagerremix_stageb": 1
},
{
"AthenaLoadingScreen:lsid_152_jmluxe": 1
},
{
"AthenaGlider:glider_id_165_knightremix": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaItemWrap:wrap_110_streetracerdriftremix": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"CosmeticVariantToken:vtid_289_djremix_headgearc": 1
},
{
"AthenaCharacter:cid_484_athena_commando_m_knightremix": 1,
"AthenaBackpack:bid_317_knightremix": 1
}
],
"freeRewards": [
{},
{
"AthenaDance:spid_136_rocketlaunch": 1
},
{},
{
"AthenaLoadingScreen:lsid_163_smrocketride": 1
},
{},
{
"AthenaSkyDiveContrail:trails_id_068_popcorn": 1
},
{},
{
"AthenaDance:emoji_boogiebomb": 1
},
{},
{},
{
"Currency:mtxgiveaway": 100
},
{},
{},
{
"AthenaDance:eid_happyskipping": 1
},
{},
{},
{},
{
"HomebaseBannerIcon:brs10rift": 1
},
{},
{},
{},
{
"AthenaItemWrap:wrap_108_knightremix": 1
},
{},
{},
{},
{
"AthenaDance:spid_133_butterfly": 1
},
{},
{},
{},
{
"AthenaGlider:glider_id_164_graffitiremix": 1
},
{},
{},
{},
{
"Currency:mtxgiveaway": 100
},
{},
{},
{},
{
"AthenaBackpack:bid_320_rustlordremix": 1
},
{},
{},
{},
{
"HomebaseBannerIcon:brs1080sllama": 1
},
{},
{},
{},
{
"AthenaDance:eid_blowingbubbles": 1
},
{},
{},
{},
{
"AthenaMusicPack:musicpack_023_og": 1
},
{},
{},
{},
{
"HomebaseBannerIcon:brs10shades": 1
},
{},
{},
{},
{
"AthenaDance:spid_142_cuberune": 1
},
{},
{},
{},
{
"AthenaLoadingScreen:lsid_153_ijdriftboard": 1
},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{}
]
}

View File

@@ -0,0 +1,318 @@
{
"battlePassOfferId": "C3BA14F04F4D56FC1D490F8011B56553",
"tierOfferId": "F86AC2ED4B3EA4B2D65EF1B2629572A0",
"paidRewards": [
{
"Token:athenaseasonxpboost": 50,
"Token:athenaseasonfriendxpboost": 10,
"AthenaCharacter:cid_032_athena_commando_m_medieval": 1,
"AthenaBackpack:bid_001_bluesquire": 1
},
{
"Token:athenaseasonxpboost": 10,
"Token:athenanextseasontierboost": 5
},
{
"HomebaseBannerIcon:brseason02bush": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:emoji_clapping": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaPickaxe:pickaxe_id_012_district": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"HomebaseBannerIcon:brseason02lionherald": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:emoji_rip": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaGlider:glider_id_004_disco": 1
},
{
"HomebaseBannerIcon:brseason02catsoldier": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"HomebaseBannerIcon:brseason02dragon": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:emoji_rage": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaCharacter:cid_033_athena_commando_f_medieval": 1,
"AthenaBackpack:bid_002_royaleknight": 1
},
{
"AthenaDance:emoji_peacesign": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"HomebaseBannerIcon:brseason02planet": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:emoji_disco": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaDance:eid_worm": 1
},
{
"HomebaseBannerIcon:brseason02bowling": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"HomebaseBannerIcon:brseason02monstertruck": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:emoji_exclamation": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaPickaxe:pickaxe_id_011_medieval": 1
},
{
"AthenaDance:emoji_armflex": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"HomebaseBannerIcon:brseason02icecream": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:emoji_mvp": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaGlider:glider_id_003_district": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"Token:athenaseasonxpboost": 10
},
{
"HomebaseBannerIcon:brseason02log": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:emoji_baited": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaDance:eid_floss": 1
},
{
"HomebaseBannerIcon:brseason02cake": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"HomebaseBannerIcon:brseason02tank": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:emoji_salty": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaCharacter:cid_039_athena_commando_f_disco": 1
},
{
"AthenaDance:emoji_stealthy": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"HomebaseBannerIcon:brseason02gasmask": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:emoji_potatoaim": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaPickaxe:pickaxe_id_013_teslacoil": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"Token:athenaseasonxpboost": 10
},
{
"HomebaseBannerIcon:brseason02vulture": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:emoji_onfire": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaCharacter:cid_035_athena_commando_m_medieval": 1,
"AthenaBackpack:bid_004_blackknight": 1
}
],
"freeRewards": [
{},
{
"AthenaDance:emoji_lol": 1
},
{},
{},
{
"AthenaDance:eid_wave": 1
},
{},
{},
{
"HomebaseBannerIcon:brseason02salt": 1
},
{},
{},
{
"AthenaDance:emoji_hearthands": 1
},
{},
{},
{
"Currency:mtxgiveaway": 100
},
{},
{},
{
"AthenaDance:emoji_bullseye": 1
},
{},
{},
{
"AthenaDance:eid_ridethepony_athena": 1
},
{},
{},
{
"AccountResource:athenaseasonalxp": 1000
},
{},
{},
{
"HomebaseBannerIcon:brseason02crosshair": 1
},
{},
{},
{
"Currency:mtxgiveaway": 100
},
{},
{},
{
"HomebaseBannerIcon:brseason02shark": 1
},
{},
{},
{
"AthenaGlider:glider_id_002_medieval": 1
},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{}
]
}

View File

@@ -0,0 +1,442 @@
{
"battleBundleOfferId": "70487F4C4673CC98F2FEBEBB26505F44",
"battlePassOfferId": "2331626809474871A3A44C47C1D8742E",
"tierOfferId": "E2D7975EFEC54A45900D8D9A6D9D273C",
"paidRewards": [
{
"Token:athenaseasonxpboost": 50,
"Token:athenaseasonfriendxpboost": 10,
"AthenaCharacter:cid_080_athena_commando_m_space": 1,
"ChallengeBundleSchedule:season3_challenge_schedule": 1
},
{
"Token:athenaseasonxpboost": 10,
"Token:athenanextseasontierboost": 5
},
{
"HomebaseBannerIcon:brseason03egg": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:emoji_wow": 1
},
{
"AthenaLoadingScreen:lsid_005_suppressedpistol": 1
},
{
"AthenaPickaxe:pickaxe_id_027_scavenger": 1
},
{
"AthenaDance:emoji_thief": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"HomebaseBannerIcon:brseason03bee": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaLoadingScreen:lsid_003_pickaxes": 1
},
{
"HomebaseBannerIcon:brseason03worm": 1
},
{
"AthenaDance:emoji_heartbroken": 1
},
{
"AthenaGlider:glider_id_015_brite": 1
},
{
"HomebaseBannerIcon:brseason03paw": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaDance:emoji_boombox": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaSkyDiveContrail:trails_id_002_rainbow": 1
},
{
"HomebaseBannerIcon:brseason03sun": 1
},
{
"AthenaDance:emoji_rocketride": 1
},
{
"AthenaCharacter:cid_082_athena_commando_m_scavenger": 1
},
{
"HomebaseBannerIcon:brseason03falcon": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"HomebaseBannerIcon:brseason03chick": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaLoadingScreen:lsid_004_tacticalshotgun": 1
},
{
"HomebaseBannerIcon:brseason03dogcollar": 1
},
{
"AthenaDance:emoji_bush": 1
},
{
"AthenaDance:eid_takethel": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"Token:athenaseasonxpboost": 10
},
{
"HomebaseBannerIcon:brseason03crescentmoon": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaSkyDiveContrail:trails_id_004_bluestreak": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaDance:emoji_awww": 1
},
{
"AthenaGlider:glider_id_016_tactical": 1
},
{
"HomebaseBannerIcon:brseason03crab": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"HomebaseBannerIcon:brseason03tophat": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaLoadingScreen:lsid_001_brite": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaDance:emoji_thumbsup": 1
},
{
"AthenaBackpack:bid_024_space": 1
},
{
"AthenaDance:emoji_thumbsdown": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaSkyDiveContrail:trails_id_001_disco": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:emoji_1hp": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"HomebaseBannerIcon:brseason03wing": 1
},
{
"AthenaCharacter:cid_081_athena_commando_f_space": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"AthenaDance:emoji_hotdawg": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaLoadingScreen:lsid_006_minigun": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"HomebaseBannerIcon:brseason03snake": 1
},
{
"AthenaDance:eid_bestmates": 1
},
{
"AthenaDance:emoji_hoarder": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"HomebaseBannerIcon:brseason03teddybear": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaSkyDiveContrail:trails_id_005_bubbles": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaCharacter:cid_088_athena_commando_m_spaceblack": 1
},
{
"AthenaBackpack:bid_028_spaceblack": 1
},
{
"HomebaseBannerIcon:brseason03happycloud": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"AthenaDance:emoji_200iqplay": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaLoadingScreen:lsid_002_raptor": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"HomebaseBannerIcon:brseason03wolf": 1
},
{
"AthenaPickaxe:pickaxe_id_029_assassin": 1
},
{
"AthenaDance:emoji_flamingrage": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"HomebaseBannerIcon:brseason03whale": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaSkyDiveContrail:trails_id_003_fire": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaDance:emoji_kaboom": 1
},
{
"AthenaCharacter:cid_083_athena_commando_f_tactical": 1
},
{
"HomebaseBannerIcon:brseason03lightning": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"AthenaDance:emoji_majestic": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaLoadingScreen:lsid_007_tacticalcommando": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"HomebaseBannerIcon:brseason03flail": 1
},
{
"AthenaDance:eid_robot": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaDance:emoji_number1": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"HomebaseBannerIcon:brseason03dinosaurskull": 1
},
{
"AthenaCharacter:cid_084_athena_commando_m_assassin": 1,
"ChallengeBundleSchedule:season3_tier_100_schedule": 1
}
],
"freeRewards": [
{},
{
"ChallengeBundleSchedule:season3_tier_2_schedule": 1
},
{},
{},
{},
{
"HomebaseBannerIcon:brseason03donut": 1
},
{},
{},
{},
{
"AthenaDance:eid_salute": 1
},
{},
{},
{},
{
"AthenaDance:emoji_inlove": 1
},
{},
{},
{},
{
"Currency:mtxgiveaway": 100
},
{},
{},
{},
{
"AthenaBackpack:bid_025_tactical": 1
},
{},
{},
{},
{
"AthenaDance:emoji_goodgame": 1
},
{},
{},
{},
{
"AthenaLoadingScreen:lsid_008_keyart": 1
},
{},
{},
{},
{
"Currency:mtxgiveaway": 100
},
{},
{},
{},
{
"HomebaseBannerIcon:brseason03eagle": 1
},
{},
{},
{},
{
"AthenaDance:emoji_positivity": 1
},
{},
{},
{},
{
"AthenaPickaxe:pickaxe_id_028_space": 1
},
{},
{},
{},
{
"HomebaseBannerIcon:brseason03shootingstar": 1
},
{},
{},
{},
{
"AthenaDance:emoji_aplus": 1
},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{}
]
}

View File

@@ -0,0 +1,444 @@
{
"battleBundleOfferId": "884CE68998C44AC58D85C5A9883DE1A6",
"battlePassOfferId": "76EA7FE9787744B09B79FF3FC5E39D0C",
"tierOfferId": "E9527AF46F4B4A9CAE98D91F2AA53CB6",
"paidRewards": [
{
"Token:athenaseasonxpboost": 50,
"Token:athenaseasonfriendxpboost": 10,
"AthenaCharacter:cid_115_athena_commando_m_carbideblue": 1,
"AthenaCharacter:cid_125_athena_commando_m_tacticalwoodland": 1,
"ChallengeBundleSchedule:season4_challenge_schedule": 1,
"Token:athenaseasonmergedxpboosts": 1
},
{
"Token:athenaseasonxpboost": 10,
"Token:athenanextseasontierboost": 5
},
{
"AthenaDance:spid_002_xmark": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:emoji_dynamite": 1
},
{
"AthenaLoadingScreen:lsid_017_carbide": 1
},
{
"AthenaPickaxe:pickaxe_id_045_valor": 1
},
{
"AthenaDance:emoji_camera": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"AthenaDance:spid_006_rainbow": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaLoadingScreen:lsid_018_rex": 1
},
{
"HomebaseBannerIcon:brseason04heroemblem": 1
},
{
"AthenaDance:spid_007_smilegg": 1
},
{
"AthenaGlider:glider_id_035_candy": 1
},
{
"HomebaseBannerIcon:brseason04spraycan": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaDance:emoji_zzz": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaSkyDiveContrail:trails_id_010_retroscifi": 1
},
{
"HomebaseBannerIcon:brseason04dogbowl": 1
},
{
"AthenaDance:spid_008_hearts": 1
},
{
"AthenaCharacter:cid_120_athena_commando_f_graffiti": 1
},
{
"AthenaDance:emoji_babyseal": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"HomebaseBannerIcon:brseason04duck": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaLoadingScreen:lsid_019_tacticaljungle": 1
},
{
"AthenaDance:spid_004_chalkoutline": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaDance:eid_popcorn": 1
},
{
"HomebaseBannerIcon:brseason04fence": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaDance:spid_019_circle": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaSkyDiveContrail:trails_id_012_spraypaint": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaDance:spid_011_looted": 1
},
{
"AthenaGlider:glider_id_033_valor": 1
},
{
"HomebaseBannerIcon:brseason04only90skids": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"AthenaDance:spid_003_arrow": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaLoadingScreen:lsid_021_leviathan": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaDance:emoji_plotting": 1
},
{
"AthenaCharacter:cid_119_athena_commando_f_candy": 1
},
{
"AthenaDance:spid_012_royalstroll": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaSkyDiveContrail:trails_id_008_lightning": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:emoji_chicken": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaDance:spid_005_abstract": 1
},
{
"AthenaBackpack:bid_047_candy": 1
},
{
"AthenaDance:spid_021_doit": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"HomebaseBannerIcon:brseason04pencil": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaLoadingScreen:lsid_024_graffiti": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaDance:spid_020_threellamas": 1
},
{
"AthenaDance:eid_hype": 1
},
{
"AthenaDance:emoji_crabby": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaDance:spid_009_window": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaSkyDiveContrail:trails_id_009_hearts": 1
},
{
"HomebaseBannerIcon:brseason04blitz": 1
},
{
"AthenaDance:spid_013_trapwarning": 1
},
{
"AthenaCharacter:cid_118_athena_commando_f_valor": 1
},
{
"AthenaDance:spid_014_raven": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"AthenaDance:emoji_rabid": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaLoadingScreen:lsid_023_candy": 1
},
{
"HomebaseBannerIcon:brseason04filmcamera": 1
},
{
"AthenaDance:spid_015_lips": 1
},
{
"AthenaGlider:glider_id_034_carbideblue": 1
},
{
"AthenaDance:spid_016_ponytail": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"HomebaseBannerIcon:brseason04bow": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaSkyDiveContrail:trails_id_013_shootingstar": 1
},
{
"AthenaLoadingScreen:lsid_022_britegunner": 1
},
{
"AthenaDance:spid_017_splattershot": 1
},
{
"AthenaCharacter:cid_117_athena_commando_m_tacticaljungle": 1
},
{
"HomebaseBannerIcon:brseason04seaserpent": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"AthenaDance:emoji_banana": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaLoadingScreen:lsid_025_raven": 1
},
{
"HomebaseBannerIcon:brseason04villainemblem": 1
},
{
"AthenaDance:spid_010_tunnel": 1
},
{
"AthenaDance:eid_groovejam": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaDance:emoji_celebrate": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:spid_018_shadowops": 1
},
{
"AthenaCharacter:cid_116_athena_commando_m_carbideblack": 1,
"ChallengeBundleSchedule:season4_progressiveb_schedule": 1
}
],
"freeRewards": [
{},
{
"ChallengeBundleSchedule:season4_starterchallenge_schedule": 1
},
{},
{},
{},
{
"HomebaseBannerIcon:brseason04goo": 1
},
{},
{},
{},
{
"AthenaBackpack:bid_045_tacticaljungle": 1
},
{},
{},
{},
{
"AthenaDance:emoji_angel": 1
},
{},
{},
{},
{
"Currency:mtxgiveaway": 100
},
{},
{},
{},
{
"AthenaDance:emoji_teamwork": 1
},
{},
{},
{},
{
"AthenaDance:eid_goodvibes": 1
},
{},
{},
{},
{
"AthenaLoadingScreen:lsid_020_supplydrop": 1
},
{},
{},
{},
{
"Currency:mtxgiveaway": 100
},
{},
{},
{},
{
"HomebaseBannerIcon:brseason04chains": 1
},
{},
{},
{},
{
"AthenaDance:emoji_rainbow": 1
},
{},
{},
{},
{
"AthenaPickaxe:pickaxe_id_046_candy": 1
},
{},
{},
{},
{
"HomebaseBannerIcon:brseason04teef": 1
},
{},
{},
{},
{
"AthenaDance:eid_kungfusalute": 1
},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{}
]
}

View File

@@ -0,0 +1,453 @@
{
"battleBundleOfferId": "FF77356F424644529049280AFC8A795E",
"battlePassOfferId": "D51A2F28AAF843C0B208F14197FBFE91",
"tierOfferId": "4B2E310BC1AE40B292A16D5AAD747E0A",
"paidRewards": [
{
"Token:athenaseasonxpboost": 50,
"Token:athenaseasonfriendxpboost": 10,
"AthenaCharacter:cid_163_athena_commando_f_viking": 1,
"AthenaCharacter:cid_161_athena_commando_m_drift": 1,
"ChallengeBundleSchedule:season5_paid_schedule": 1,
"Token:athenaseasonmergedxpboosts": 1,
"ChallengeBundleSchedule:season5_progressivea_schedule": 1
},
{
"Token:athenaseasonxpboost": 10,
"Token:athenanextseasontierboost": 5
},
{
"HomebaseBannerIcon:brseason05tictactoe": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:emoji_go": 1
},
{
"AthenaDance:spid_038_sushi": 1
},
{
"AthenaGlider:glider_id_050_streetracercobra": 1
},
{
"HomebaseBannerIcon:brseason05shoppingcart": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:toy_001_basketball": 1
},
{
"AthenaDance:spid_024_boogie": 1
},
{
"AthenaLoadingScreen:lsid_046_vikingpattern": 1
},
{
"HomebaseBannerIcon:brseason05dolphin": 1
},
{
"AthenaPickaxe:pickaxe_id_073_balloon": 1
},
{
"AthenaDance:emoji_poolparty": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaLoadingScreen:lsid_034_abstrakt": 1
},
{
"AthenaSkyDiveContrail:trails_id_017_lanterns": 1
},
{
"HomebaseBannerIcon:brseason05kitsune": 1
},
{
"AthenaDance:spid_036_strawberrypaws": 1
},
{
"AthenaCharacter:cid_162_athena_commando_f_streetracer": 1
},
{
"AthenaDance:emoji_prickly": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:toy_002_golfball": 1
},
{
"AthenaLoadingScreen:lsid_045_vikingfemale": 1
},
{
"AthenaDance:spid_030_luchador": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaDance:eid_youreawesome": 1
},
{
"HomebaseBannerIcon:brseason05flowyhat": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaLoadingScreen:lsid_040_lifeguard": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaSkyDiveContrail:trails_id_018_runes": 1
},
{
"AthenaDance:emoji_stop": 1
},
{
"AthenaDance:spid_034_goodvibes": 1
},
{
"AthenaGlider:glider_id_048_viking": 1
},
{
"AthenaDance:spid_028_durrr": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:toy_003_beachball": 1
},
{
"AthenaLoadingScreen:lsid_039_jailbirds": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaDance:emoji_embarrassed": 1
},
{
"AthenaCharacter:cid_166_athena_commando_f_lifeguard": 1
},
{
"AthenaDance:spid_033_fakedoor": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"HomebaseBannerIcon:brseason05golf": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:emoji_alarm": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaDance:spid_037_drift": 1
},
{
"AthenaBackpack:bid_071_vikingfemale": 1
},
{
"HomebaseBannerIcon:brseason05icecreamtruck": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:toy_005_golfballelite": 1
},
{
"AthenaLoadingScreen:lsid_044_flytrap": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"HomebaseBannerIcon:brseason05palms": 1
},
{
"AthenaDance:eid_swipeit": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaLoadingScreen:lsid_042_omen": 1
},
{
"AthenaDance:emoji_tattered": 1
},
{
"AthenaSkyDiveContrail:trails_id_016_ice": 1
},
{
"HomebaseBannerIcon:brseason05spiderbadass": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaCharacter:cid_167_athena_commando_m_tacticalbadass": 1
},
{
"AthenaDance:spid_035_nordicllama": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:toy_006_beachballelite": 1
},
{
"HomebaseBannerIcon:brseason05racingcheckers": 1
},
{
"AthenaLoadingScreen:lsid_043_redknight": 1
},
{
"AthenaDance:emoji_tasty": 1
},
{
"AthenaGlider:glider_id_049_lifeguard": 1
},
{
"AthenaDance:spid_032_potatoaim": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"HomebaseBannerIcon:brseason05scubagear": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaSkyDiveContrail:trails_id_007_tp": 1
},
{
"AthenaDance:emoji_badapple": 1
},
{
"AthenaLoadingScreen:lsid_035_bandolier": 1
},
{
"AthenaCharacter:cid_173_athena_commando_f_starfishuniform": 1
},
{
"HomebaseBannerIcon:brseason05cobra": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:toy_004_basketballelite": 1
},
{
"AthenaDance:emoji_stinky": 1
},
{
"AthenaLoadingScreen:lsid_037_tomatohead": 1
},
{
"AthenaDance:spid_039_yummy": 1
},
{
"AthenaDance:eid_hiphops5": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaDance:emoji_potofgold": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:spid_026_darkviking": 1
},
{
"AthenaCharacter:cid_165_athena_commando_m_darkviking": 1,
"ChallengeBundleSchedule:season5_progressiveb_schedule": 1
}
],
"freeRewards": [
{},
{
"AthenaDance:spid_025_crazycastle": 1
},
{},
{
"AthenaLoadingScreen:lsid_036_drift": 1
},
{},
{
"AthenaDance:eid_stagebow": 1
},
{},
{
"AthenaDance:emoji_rockon": 1
},
{},
{},
{
"HomebaseBannerIcon:brseason05vikingship": 1
},
{},
{},
{
"AthenaBackpack:bid_075_tacticalbadass": 1
},
{},
{},
{},
{
"Currency:mtxgiveaway": 100
},
{},
{},
{},
{
"AthenaGlider:glider_id_055_streetracerblack": 1
},
{},
{},
{},
{
"AthenaDance:spid_031_pixels": 1
},
{},
{},
{},
{
"AthenaPickaxe:pickaxe_id_071_streetracer": 1
},
{},
{},
{},
{
"Currency:mtxgiveaway": 100
},
{},
{},
{},
{
"AthenaBackpack:bid_074_lifeguardfemale": 1
},
{},
{},
{},
{
"HomebaseBannerIcon:brseason05dinosaur": 1
},
{},
{},
{},
{
"AthenaDance:eid_calculated": 1
},
{},
{},
{},
{
"AthenaLoadingScreen:lsid_038_highexplosives": 1
},
{},
{},
{},
{
"AthenaSkyDiveContrail:trails_id_011_glitch": 1
},
{},
{},
{},
{
"AthenaDance:emoji_trap": 1
},
{},
{},
{},
{
"AthenaDance:spid_029_lasershark": 1
},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{}
]
}

View File

@@ -0,0 +1,453 @@
{
"battleBundleOfferId": "19D4A5ACC90B4CDF88766A0C8A6D13FB",
"battlePassOfferId": "9C8D0323775A4F59A1D4283E3FDB356C",
"tierOfferId": "A6FE59C497B844068E1B5D84396F19BA",
"paidRewards": [
{
"Token:athenaseasonxpboost": 50,
"Token:athenaseasonfriendxpboost": 10,
"AthenaCharacter:cid_233_athena_commando_m_fortnitedj": 1,
"AthenaCharacter:cid_237_athena_commando_f_cowgirl": 1,
"ChallengeBundleSchedule:season6_paid_schedule": 1,
"Token:athenaseasonmergedxpboosts": 1,
"ChallengeBundleSchedule:season6_progressivea_schedule": 1
},
{
"Token:athenaseasonxpboost": 10,
"Token:athenanextseasontierboost": 5
},
{
"HomebaseBannerIcon:brseason06pickaxebr": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:emoji_bang": 1
},
{
"AthenaDance:spid_058_cowgirl": 1
},
{
"AthenaGlider:glider_id_079_redriding": 1
},
{
"HomebaseBannerIcon:brseason06campfire": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"AthenaLoadingScreen:lsid_052_emoticoncollage": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaBackpack:petcarrier_001_dog": 1
},
{
"AthenaMusicPack:musicpack_001_floss": 1
},
{
"HomebaseBannerIcon:brseason06phantom": 1
},
{
"AthenaPickaxe:pickaxe_id_103_fortnitedj": 1
},
{
"AthenaDance:emoji_witchsbrew": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaSkyDiveContrail:trails_id_024_dieselsmoke": 1
},
{
"AthenaDance:spid_050_fullmoon": 1
},
{
"AthenaLoadingScreen:lsid_057_bunnies": 1
},
{
"HomebaseBannerIcon:brseason06zigzag": 1
},
{
"AthenaCharacter:cid_234_athena_commando_m_llamarider": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"AthenaLoadingScreen:lsid_058_djconcept": 1
},
{
"AthenaDance:emoji_plunger": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:toy_007_tomato": 1
},
{
"AthenaBackpack:petcarrier_002_chameleon": 1
},
{
"AthenaDance:spid_056_manholecover": 1
},
{
"AthenaDance:eid_runningman": 1
},
{
"HomebaseBannerIcon:brseason06dice": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaLoadingScreen:lsid_055_valkyrie": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaSkyDiveContrail:trails_id_023_fireflies": 1
},
{
"AthenaDance:spid_060_dayofdead": 1
},
{
"AthenaDance:emoji_camper": 1
},
{
"AthenaGlider:glider_id_080_prairiepusher": 1
},
{
"AthenaDance:spid_059_dj": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaBackpack:petcarrier_003_dragon": 1
},
{
"AthenaLoadingScreen:lsid_056_fate": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaDance:emoji_ghost": 1
},
{
"AthenaCharacter:cid_231_athena_commando_f_redriding": 1
},
{
"AthenaDance:spid_055_wallcrawler": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"HomebaseBannerIcon:brseason06rift": 1
},
{
"AthenaDance:emoji_blackcat": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaMusicPack:musicpack_002_spooky": 1
},
{
"AthenaDance:spid_049_cactusmaze": 1
},
{
"AthenaBackpack:bid_119_vampirefemale": 1
},
{
"HomebaseBannerIcon:brseason06bat": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"Currency:mtxgiveaway": 100
},
{
"CosmeticVariantToken:vtid_033_petcarrier_dog_styleb": 1
},
{
"AthenaLoadingScreen:lsid_050_tomatotemple": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"HomebaseBannerIcon:brseason06carbonfiber": 1
},
{
"AthenaDance:eid_octopus": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaLoadingScreen:lsid_054_scuba": 1
},
{
"AthenaDance:emoji_meet": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaSkyDiveContrail:trails_id_026_bats": 1
},
{
"HomebaseBannerIcon:brseason06polkadots": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaCharacter:cid_227_athena_commando_f_vampire": 1
},
{
"AthenaDance:spid_047_gremlins": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"CosmeticVariantToken:vtid_035_petcarrier_dragon_styleb": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:toy_008_tomatoelite": 1
},
{
"HomebaseBannerIcon:brseason06housefly": 1
},
{
"AthenaLoadingScreen:lsid_059_vampire": 1
},
{
"AthenaGlider:glider_id_078_vampire": 1
},
{
"AthenaDance:spid_045_oni": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"HomebaseBannerIcon:brseason06skulltrooper": 1
},
{
"AthenaSkyDiveContrail:trails_id_022_greensmoke": 1
},
{
"AthenaLoadingScreen:lsid_051_ravage": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaCharacter:cid_232_athena_commando_f_halloweentomato": 1
},
{
"AthenaBackpack:bid_122_halloweentomato": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"AthenaDance:spid_046_pixelraven": 1
},
{
"CosmeticVariantToken:vtid_034_petcarrier_dog_stylec": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaMusicPack:musicpack_003_ogremix": 1
},
{
"AthenaLoadingScreen:lsid_061_werewolf": 1
},
{
"AthenaDance:emoji_clown": 1
},
{
"AthenaDance:eid_flamenco": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"Currency:mtxgiveaway": 100
},
{
"CosmeticVariantToken:vtid_036_petcarrier_dragon_stylec": 1
},
{
"AthenaDance:spid_062_werewolf": 1
},
{
"AthenaCharacter:cid_230_athena_commando_m_werewolf": 1,
"ChallengeBundleSchedule:season6_progressiveb_schedule": 1
}
],
"freeRewards": [
{},
{
"AthenaDance:spid_061_spiderweb": 1
},
{},
{
"AthenaLoadingScreen:lsid_060_cowgirl": 1
},
{},
{
"AthenaDance:eid_regalwave": 1
},
{},
{
"AthenaDance:emoji_battlebus": 1
},
{},
{},
{
"HomebaseBannerIcon:brseason06floatingisland": 1
},
{},
{},
{
"AthenaBackpack:bid_121_redriding": 1
},
{},
{},
{},
{
"Currency:mtxgiveaway": 100
},
{},
{},
{},
{
"AthenaGlider:glider_id_081_cowboygunslinger": 1
},
{},
{},
{},
{
"AthenaDance:spid_053_ggpotion": 1
},
{},
{},
{},
{
"AthenaPickaxe:pickaxe_id_102_redriding": 1
},
{},
{},
{},
{
"Currency:mtxgiveaway": 100
},
{},
{},
{},
{
"AthenaBackpack:bid_123_fortnitedj": 1
},
{},
{},
{},
{
"HomebaseBannerIcon:brseason06handhorns": 1
},
{},
{},
{},
{
"AthenaDance:eid_needtogo": 1
},
{},
{},
{},
{
"AthenaLoadingScreen:lsid_053_supplyllama": 1
},
{},
{},
{},
{
"AthenaSkyDiveContrail:trails_id_025_jackolantern": 1
},
{},
{},
{},
{
"AthenaDance:emoji_tp": 1
},
{},
{},
{},
{
"AthenaDance:spid_051_gameover": 1
},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{}
]
}

View File

@@ -0,0 +1,454 @@
{
"battleBundleOfferId": "347A90158C64424980E8C1B3DC088F37",
"battlePassOfferId": "3A3C99847F144AF3A030DB5690477F5A",
"tierOfferId": "64A3020B098841A7805EE257D68C554F",
"paidRewards": [
{
"Token:athenaseasonxpboost": 50,
"Token:athenaseasonfriendxpboost": 10,
"AthenaCharacter:cid_287_athena_commando_m_arcticsniper": 1,
"AthenaCharacter:cid_286_athena_commando_f_neoncat": 1,
"ChallengeBundleSchedule:season7_paid_schedule": 1,
"Token:athenaseasonmergedxpboosts": 1,
"ChallengeBundleSchedule:season7_progressivea_schedule": 1
},
{
"Token:athenaseasonxpboost": 10,
"Token:athenanextseasontierboost": 5
},
{
"HomebaseBannerIcon:brseason07wreath": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaItemWrap:wrap_001_arcticcamo": 1
},
{
"AthenaDance:emoji_mistletoe": 1
},
{
"AthenaBackpack:bid_160_tacticalsantamale": 1
},
{
"AthenaDance:spid_068_eviltree": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaItemWrap:wrap_002_holidaygreen": 1
},
{
"AthenaLoadingScreen:lsid_080_gingerbread": 1
},
{
"AthenaMusicPack:musicpack_004_holiday": 1
},
{
"HomebaseBannerIcon:brseason07merryface": 1
},
{
"AthenaGlider:glider_id_101_tacticalsanta": 1
},
{
"AthenaDance:emoji_ggwreath": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaBackpack:petcarrier_004_hamster": 1
},
{
"AthenaDance:spid_069_bagofcoal": 1
},
{
"AthenaSkyDiveContrail:trails_id_032_stringlights": 1
},
{
"AthenaLoadingScreen:lsid_075_tacticalsanta": 1
},
{
"AthenaCharacter:cid_279_athena_commando_m_tacticalsanta": 1,
"ChallengeBundleSchedule:season7_sgtwinter_schedule": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"AthenaDance:emoji_gingerbreadhappy": 1
},
{
"AthenaItemWrap:wrap_003_anodizedred": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:toy_010_icepuck": 1
},
{
"HomebaseBannerIcon:brseason07tartan": 1
},
{
"AthenaLoadingScreen:lsid_083_crackshot": 1
},
{
"AthenaDance:eid_wristflick": 1
},
{
"AthenaDance:emoji_gingerbreadmad": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaBackpack:petcarrier_005_wolf": 1
},
{
"AthenaDance:spid_071_neoncat": 1
},
{
"AthenaSkyDiveContrail:trails_id_037_glyphs": 1
},
{
"HomebaseBannerIcon:brseason07iceninjastar": 1
},
{
"AthenaGlider:glider_id_104_durrburger": 1
},
{
"AthenaLoadingScreen:lsid_081_tenderdefender": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaItemWrap:wrap_004_durrburgerpjs": 1
},
{
"AthenaDance:spid_072_mothhead": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaDance:emoji_mittens": 1
},
{
"AthenaCharacter:cid_281_athena_commando_f_snowboard": 1
},
{
"AthenaDance:spid_073_porthole": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"HomebaseBannerIcon:brseason07meat": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"CosmeticVariantToken:vtid_054_petcarrier_hamster_styleb": 1
},
{
"AthenaDance:emoji_huskwow": 1
},
{
"AthenaDance:spid_074_cuddlehula": 1
},
{
"AthenaBackpack:bid_162_yetimale": 1
},
{
"HomebaseBannerIcon:brseason07trash": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"AthenaSkyDiveContrail:trails_id_036_fiberoptics": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaItemWrap:wrap_006_ice": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"HomebaseBannerIcon:brseason07sun": 1
},
{
"AthenaDance:eid_getfunky": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaLoadingScreen:lsid_076_medics": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"CosmeticVariantToken:vtid_056_petcarrier_wolf_styleb": 1
},
{
"AthenaDance:emoji_penguin": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:spid_081_bananas": 1
},
{
"AthenaCharacter:cid_278_athena_commando_m_yeti": 1
},
{
"AthenaDance:spid_076_yeti": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"AthenaItemWrap:wrap_005_carbonfiber": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:toy_009_burgerelite": 1
},
{
"HomebaseBannerIcon:brseason07shackle": 1
},
{
"AthenaLoadingScreen:lsid_074_darkbomber": 1
},
{
"AthenaGlider:glider_id_100_yeti": 1
},
{
"AthenaDance:spid_077_baited": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"Currency:mtxgiveaway": 100
},
{
"CosmeticVariantToken:vtid_055_petcarrier_hamster_stylec": 1
},
{
"HomebaseBannerIcon:brseason07octopus": 1
},
{
"AthenaSkyDiveContrail:trails_id_034_swirlysmoke": 1
},
{
"AthenaDance:emoji_durrrburger": 1
},
{
"AthenaCharacter:cid_245_athena_commando_f_durrburgerpjs": 1
},
{
"Token:athenaseasonfriendxpboost": 5
},
{
"AthenaDance:spid_078_pixelramirez": 1
},
{
"AthenaLoadingScreen:lsid_078_skulltrooper": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaMusicPack:musicpack_006_twist": 1
},
{
"CosmeticVariantToken:vtid_057_petcarrier_wolf_stylec": 1
},
{
"AthenaDance:emoji_fkey": 1
},
{
"AthenaDance:eid_hiphops7": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaLoadingScreen:lsid_073_dustydepot": 1
},
{
"AthenaDance:spid_079_catgirl": 1
},
{
"AthenaCharacter:cid_288_athena_commando_m_iceking": 1,
"ChallengeBundleSchedule:season7_iceking_schedule": 1
}
],
"freeRewards": [
{},
{
"AthenaDance:spid_067_ggsnowman": 1
},
{},
{
"AthenaLoadingScreen:lsid_079_plane": 1
},
{},
{
"AthenaSkyDiveContrail:trails_id_033_snowflakes": 1
},
{},
{
"AthenaDance:emoji_iceheart": 1
},
{},
{},
{
"HomebaseBannerIcon:brseason07plane": 1
},
{},
{},
{
"AthenaDance:eid_golfclap": 1
},
{},
{},
{},
{
"Currency:mtxgiveaway": 100
},
{},
{},
{},
{
"AthenaBackpack:bid_161_snowboardfemale": 1
},
{},
{},
{},
{
"AthenaDance:spid_070_hohoho": 1
},
{},
{},
{},
{
"AthenaGlider:glider_id_105_snowboard": 1
},
{},
{},
{},
{
"Currency:mtxgiveaway": 100
},
{},
{},
{},
{
"AthenaPickaxe:pickaxe_id_126_yeti": 1
},
{},
{},
{},
{
"HomebaseBannerIcon:brseason07infinityblade": 1
},
{},
{},
{},
{
"AthenaDance:eid_micdrop": 1
},
{},
{},
{},
{
"AthenaLoadingScreen:lsid_082_neoncat": 1
},
{},
{},
{},
{
"AthenaMusicPack:musicpack_005_disco": 1
},
{},
{},
{},
{
"AthenaDance:emoji_hotchocolate": 1
},
{},
{},
{},
{
"AthenaDance:spid_075_meltingsnowman": 1
},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{}
]
}

View File

@@ -0,0 +1,453 @@
{
"battleBundleOfferId": "18D9DA48000A40BFAEBAC55A99C55221",
"battlePassOfferId": "77F31B7F83FB422195DA60CDE683671D",
"tierOfferId": "E07E41D52D4A425F8DC6592496B75301",
"paidRewards": [
{
"Token:athenaseasonxpboost": 50,
"Token:athenaseasonfriendxpboost": 60,
"AthenaCharacter:cid_347_athena_commando_m_pirateprogressive": 1,
"AthenaCharacter:cid_346_athena_commando_m_dragonninja": 1,
"ChallengeBundleSchedule:season8_paid_schedule": 1,
"ChallengeBundleSchedule:season8_cumulative_schedule": 1,
"Token:athenaseasonmergedxpboosts": 1
},
{
"Token:athenaseasonxpboost": 10,
"Token:athenanextseasonxpboost": 30
},
{
"HomebaseBannerIcon:brs8pineapple": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaItemWrap:wrap_020_tropicalcamo": 1
},
{
"AthenaDance:spid_091_dragonninja": 1
},
{
"AthenaBackpack:bid_218_medusa": 1
},
{
"HomebaseBannerIcon:brs8jellyfish": 1
},
{
"Token:athenaseasonfriendxpboost": 10
},
{
"AthenaLoadingScreen:lsid_106_treasuremap": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaMusicPack:musicpack_007_pirate": 1
},
{
"AthenaDance:emoji_palmtree": 1
},
{
"AthenaDance:spid_092_bananapeel": 1
},
{
"AthenaGlider:glider_id_124_medusa": 1
},
{
"AthenaDance:emoji_octopirate": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaBackpack:petcarrier_007_woodsy": 1
},
{
"AthenaDance:spid_103_mermaid": 1
},
{
"AthenaSkyDiveContrail:trails_id_046_clover": 1
},
{
"AthenaLoadingScreen:lsid_100_stpattyday": 1
},
{
"AthenaCharacter:cid_348_athena_commando_f_medusa": 1
},
{
"Token:athenaseasonfriendxpboost": 10
},
{
"AthenaDance:emoji_4leafclover": 1
},
{
"AthenaDance:toy_014_bouncyball": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaItemWrap:wrap_021_pirate": 1
},
{
"HomebaseBannerIcon:brs8ziggurat": 1
},
{
"AthenaLoadingScreen:lsid_101_icequeen": 1
},
{
"AthenaDance:eid_conga": 1
},
{
"AthenaDance:emoji_spicy": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"Currency:mtxgiveaway": 100
},
{
"CosmeticVariantToken:vtid_129_petcarrier_woodsy_styleb": 1
},
{
"AthenaDance:spid_099_key": 1
},
{
"AthenaSkyDiveContrail:trails_id_048_spectral": 1
},
{
"HomebaseBannerIcon:brs8coconuts": 1
},
{
"AthenaGlider:glider_id_123_masterkey": 1
},
{
"AthenaLoadingScreen:lsid_102_triceraops": 1
},
{
"Token:athenaseasonfriendxpboost": 10
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaItemWrap:wrap_023_aztec": 1
},
{
"AthenaDance:spid_094_wootdog": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"AthenaDance:emoji_skullbrite": 1
},
{
"AthenaCharacter:cid_349_athena_commando_m_banana": 1
},
{
"AthenaDance:spid_095_loveranger": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"HomebaseBannerIcon:brs8foxhead": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaBackpack:petcarrier_008_fox": 1
},
{
"AthenaDance:emoji_aztecmask": 1
},
{
"AthenaDance:spid_096_fallenloveranger": 1
},
{
"AthenaPickaxe:pickaxe_id_165_masterkey": 1
},
{
"HomebaseBannerIcon:brs8roach": 1
},
{
"Token:athenaseasonfriendxpboost": 10
},
{
"AthenaSkyDiveContrail:trails_id_044_lava": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaItemWrap:wrap_017_dragonninja": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"HomebaseBannerIcon:brs8whaletail": 1
},
{
"AthenaDance:eid_banana": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaLoadingScreen:lsid_103_spraycollage": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"CosmeticVariantToken:vtid_131_petcarrier_fox_styleb": 1
},
{
"AthenaDance:spid_101_britebomber": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:emoji_200m": 1
},
{
"AthenaCharacter:cid_351_athena_commando_f_fireelf": 1
},
{
"HomebaseBannerIcon:brs8tigerstripes": 1
},
{
"Token:athenaseasonfriendxpboost": 10
},
{
"AthenaLoadingScreen:lsid_097_powerchord": 1
},
{
"AthenaDance:spid_097_fireelf": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaItemWrap:wrap_019_tiger": 1
},
{
"AthenaDance:emoji_cuddle": 1
},
{
"AthenaGlider:glider_id_128_bootybuoy": 1
},
{
"AthenaDance:spid_100_salty": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"Currency:mtxgiveaway": 100
},
{
"CosmeticVariantToken:vtid_130_petcarrier_woodsy_stylec": 1
},
{
"AthenaLoadingScreen:lsid_104_masterkey": 1
},
{
"AthenaSkyDiveContrail:trails_id_047_ammobelt": 1
},
{
"HomebaseBannerIcon:brs8crystalllama": 1
},
{
"AthenaCharacter:cid_350_athena_commando_m_masterkey": 1
},
{
"Token:athenaseasonfriendxpboost": 10
},
{
"AthenaDance:emoji_angryvolcano": 1
},
{
"AthenaDance:spid_098_shiny": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaMusicPack:musicpack_009_starpower": 1
},
{
"CosmeticVariantToken:vtid_132_petcarrier_fox_stylec": 1
},
{
"AthenaLoadingScreen:lsid_105_blackwidow": 1
},
{
"AthenaDance:eid_hulahoop": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaItemWrap:wrap_022_gemstone": 1
},
{
"CosmeticVariantToken:vtid_128_masterkey_styleb": 1
},
{
"AthenaCharacter:cid_352_athena_commando_f_shiny": 1,
"ChallengeBundleSchedule:season8_shiny_schedule": 1
}
],
"freeRewards": [
{},
{
"AthenaDance:spid_102_ggaztec": 1
},
{},
{
"AthenaLoadingScreen:lsid_099_piratetheme": 1
},
{},
{
"AthenaSkyDiveContrail:trails_id_045_undertow": 1
},
{},
{
"AthenaDance:emoji_sun": 1
},
{},
{},
{
"Currency:mtxgiveaway": 100
},
{},
{},
{
"AthenaDance:eid_happywave": 1
},
{},
{},
{},
{
"HomebaseBannerIcon:brs8jollyroger": 1
},
{},
{},
{},
{
"AthenaBackpack:bid_215_masterkey": 1
},
{},
{},
{},
{
"AthenaDance:spid_090_dancefloorbox": 1
},
{},
{},
{},
{
"AthenaGlider:glider_id_129_fireelf": 1
},
{},
{},
{},
{
"Currency:mtxgiveaway": 100
},
{},
{},
{},
{
"AthenaPickaxe:pickaxe_id_167_medusa": 1
},
{},
{},
{},
{
"HomebaseBannerIcon:brs8treasurechest": 1
},
{},
{},
{},
{
"AthenaDance:eid_youboreme": 1
},
{},
{},
{},
{
"AthenaLoadingScreen:lsid_098_dragonninja": 1
},
{},
{},
{},
{
"AthenaMusicPack:musicpack_008_coral": 1
},
{},
{},
{},
{
"AthenaDance:emoji_ggjellyfish": 1
},
{},
{},
{},
{
"AthenaDance:spid_093_theend": 1
},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{}
]
}

View File

@@ -0,0 +1,458 @@
{
"battleBundleOfferId": "C7190ACA4E5E228A94CA3CB9C3FC7AE9",
"battlePassOfferId": "73E6EE6F4526EF97450D1592C3DB0EF5",
"tierOfferId": "33E185A84ED7B64F2856E69AADFD092C",
"paidRewards": [
{
"Token:athenaseasonxpboost": 50,
"Token:athenaseasonfriendxpboost": 60,
"AthenaCharacter:cid_408_athena_commando_f_strawberrypilot": 1,
"AthenaCharacter:cid_403_athena_commando_m_rooster": 1,
"ChallengeBundleSchedule:season9_paid_schedule": 1,
"ChallengeBundleSchedule:season9_cumulative_schedule": 1,
"ChallengeBundleSchedule:season9_fortbyte_schedule": 1,
"Token:athenaseasonmergedxpboosts": 1
},
{
"Token:athenaseasonxpboost": 10,
"Token:athenanextseasonxpboost": 30
},
{
"AthenaDance:emoji_tomatohead": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaItemWrap:wrap_060_rooster": 1
},
{
"AthenaDance:spid_109_strawberrypilot": 1
},
{
"AthenaPickaxe:pickaxe_id_211_bunkerman_1h": 1
},
{
"HomebaseBannerIcon:brs9chair": 1
},
{
"Token:athenaseasonfriendxpboost": 10
},
{
"AthenaLoadingScreen:lsid_126_floorislava": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaMusicPack:musicpack_015_goodvibes": 1
},
{
"AthenaDance:emoji_rexhead": 1
},
{
"AthenaDance:spid_118_chevronleft": 1
},
{
"AthenaGlider:glider_id_144_strawberrypilot": 1
},
{
"AthenaDance:emoji_drifthead": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaItemWrap:wrap_057_banana": 1
},
{
"AthenaDance:spid_115_pixeljonesy": 1
},
{
"HomebaseBannerIcon:brs9bone": 1
},
{
"AthenaLoadingScreen:lsid_130_strawberrypilot": 1
},
{
"AthenaCharacter:cid_409_athena_commando_m_bunkerman": 1,
"ChallengeBundleSchedule:season9_bunkerman_schedule": 1
},
{
"Token:athenaseasonfriendxpboost": 10
},
{
"AthenaDance:emoji_silentmaven": 1
},
{
"AthenaSkyDiveContrail:trails_id_054_kpopglow": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaBackpack:petcarrier_010_robokitty": 1
},
{
"HomebaseBannerIcon:brs9x": 1
},
{
"AthenaLoadingScreen:lsid_121_vikings": 1
},
{
"AthenaDance:eid_chickenmoves": 1
},
{
"AthenaDance:emoji_loveranger": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:toy_017_flyingdisc": 1
},
{
"AthenaDance:spid_119_chevronright": 1
},
{
"AthenaLoadingScreen:lsid_127_unicornpickaxe": 1
},
{
"HomebaseBannerIcon:brs9bacon": 1
},
{
"AthenaGlider:glider_id_146_masako": 1
},
{
"Token:athenaseasonfriendxpboost": 10
},
{
"AthenaDance:spid_108_fate": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaItemWrap:wrap_062_neotag": 1
},
{
"AthenaDance:emoji_screamingwukong": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"CosmeticVariantToken:vtid_199_petcarrier_robokitty_styleb": 1
},
{
"AthenaCharacter:cid_404_athena_commando_f_bountyhunter": 1,
"ChallengeBundleSchedule:season9_bountyhunter_schedule": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaSkyDiveContrail:trails_id_055_bananas": 1
},
{
"HomebaseBannerIcon:brs9roar": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"HomebaseBannerIcon:brs9violin": 1
},
{
"AthenaDance:emoji_durrburgerhead": 1
},
{
"AthenaDance:spid_117_nosymbol": 1
},
{
"AthenaPickaxe:pickaxe_id_205_strawberrypilot": 1
},
{
"Token:athenaseasonfriendxpboost": 10
},
{
"AthenaDance:spid_113_nananana": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaItemWrap:wrap_061_purplesplatter": 1
},
{
"CosmeticVariantToken:vtid_201_petcarrier_robokitty_styled": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"HomebaseBannerIcon:brs9cone": 1
},
{
"AthenaDance:eid_signspinner": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaLoadingScreen:lsid_125_lavalegends": 1
},
{
"AthenaDance:spid_111_ark": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaDance:toy_018_fancyflyingdisc": 1
},
{
"AccountResource:athenaseasonalxp": 1000
},
{
"HomebaseBannerIcon:brs9target": 1
},
{
"AthenaCharacter:cid_406_athena_commando_m_stormtracker": 1,
"ChallengeBundleSchedule:season9_stormtracker_schedule": 1
},
{
"AthenaDance:emoji_skepticalfishstix": 1
},
{
"Token:athenaseasonfriendxpboost": 10
},
{
"CosmeticVariantToken:vtid_200_petcarrier_robokitty_stylec": 1
},
{
"AthenaLoadingScreen:lsid_129_stormtracker": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaSkyDiveContrail:trails_id_056_stormtracker": 1
},
{
"HomebaseBannerIcon:brs9blast": 1
},
{
"AthenaGlider:glider_id_143_battlesuit": 1
},
{
"AthenaLoadingScreen:lsid_123_inferno": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaDance:emoji_whiteflag": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaItemWrap:wrap_058_storm": 1
},
{
"AthenaDance:spid_116_robot": 1
},
{
"HomebaseBannerIcon:brs9spade": 1
},
{
"AthenaCharacter:cid_405_athena_commando_f_masako": 1,
"ChallengeBundleSchedule:season9_masako_schedule": 1
},
{
"Token:athenaseasonfriendxpboost": 10
},
{
"AthenaSkyDiveContrail:trails_id_057_battlesuit": 1
},
{
"AthenaDance:spid_110_rooster": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"AthenaMusicPack:musicpack_014_s9cine": 1
},
{
"AthenaDance:emoji_supdood": 1
},
{
"AthenaLoadingScreen:lsid_128_auroraglow": 1
},
{
"AthenaDance:eid_gabbyhiphop_01": 1
},
{
"Token:athenaseasonxpboost": 10
},
{
"AthenaItemWrap:wrap_059_battlesuit": 1
},
{
"Currency:mtxgiveaway": 100
},
{
"CosmeticVariantToken:vtid_202_rooster_styleb": 1
},
{
"AthenaCharacter:cid_407_athena_commando_m_battlesuit": 1,
"ChallengeBundleSchedule:season9_battlesuit_schedule": 1
}
],
"freeRewards": [
{},
{
"AthenaDance:spid_112_rockpeople": 1
},
{},
{
"AthenaLoadingScreen:lsid_122_aztec": 1
},
{},
{
"AthenaSkyDiveContrail:trails_id_051_neontubes": 1
},
{},
{
"AthenaDance:emoji_cuddleteamhead": 1
},
{},
{},
{
"Currency:mtxgiveaway": 100
},
{},
{},
{
"AthenaDance:eid_yayexcited": 1
},
{},
{},
{},
{
"HomebaseBannerIcon:brs9plane": 1
},
{},
{},
{},
{
"AthenaGlider:glider_id_032_tacticalwoodland": 1
},
{},
{},
{},
{
"AthenaDance:spid_121_sunbird": 1
},
{},
{},
{},
{
"AthenaItemWrap:wrap_046_demon": 1
},
{},
{},
{},
{
"Currency:mtxgiveaway": 100
},
{},
{},
{},
{
"AthenaPickaxe:pickaxe_id_210_bunkerman": 1
},
{},
{},
{},
{
"HomebaseBannerIcon:brs9paintbrush": 1
},
{},
{},
{},
{
"AthenaDance:eid_sadtrombone": 1
},
{},
{},
{},
{
"AthenaLoadingScreen:lsid_124_airroyale": 1
},
{},
{},
{},
{
"AthenaMusicPack:musicpack_013_robotrack": 1
},
{},
{},
{},
{
"AthenaDance:emoji_skulltrooper": 1
},
{},
{},
{},
{
"AthenaDance:spid_114_bush": 1
},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{},
{}
]
}

View File

@@ -0,0 +1,90 @@
[LawinServer.manifest,FortniteCreative]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,FortniteCampaign]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,Lang.pl]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,Lang.es-419Optional]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,StartupOptional]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,FortniteCampaignTutorial]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,Lang.allOptional]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,Lang.itOptional]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,Lang.es-419]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,KairosCapture]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,FortniteBR]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,FortniteCreativeOptional]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,Lang.zh-CN]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,Lang.ruOptional]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,Lang.frOptional]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,Lang.deOptional]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,Lang.de]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,FortniteBROptional]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,FortniteCampaignOptional]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,FortniteCampaignTutorialOptional]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,Lang.ru]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,Lang.plOptional]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,Lang.fr]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,Lang.es-ESOptional]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,KairosCaptureOptional]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,Lang.all]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,Lang.zh-CNOptional]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,Lang.it]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,Lang.es-ES]
DeltaDownloadSize="0"
DownloadSize="0"
[LawinServer.manifest,Startup]
DeltaDownloadSize="0"
DownloadSize="0"

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,459 @@
[
"Schematic:SID_Wall_Wood_Spikes_vR_T01",
"Hero:HID_Commando_Sony_R_T01",
"Schematic:SID_Wall_Wood_Spikes_UC_T01",
"Hero:HID_Commando_ShockDamage_VR_T01",
"Schematic:SID_Wall_Wood_Spikes_SR_T01",
"Hero:HID_Commando_ShockDamage_SR_T01",
"Schematic:SID_Wall_Wood_Spikes_R_T01",
"Hero:HID_Commando_ShockDamage_R_T01",
"Schematic:SID_Wall_Wood_Spikes_C_T01",
"Hero:HID_Commando_GunTough_VR_T01",
"Schematic:SID_Wall_Light_VR_T01",
"Hero:HID_Commando_GunTough_UC_T01",
"Schematic:SID_Wall_Light_SR_T01",
"Hero:HID_Commando_GunTough_SR_T01",
"Schematic:SID_Wall_Light_R_T01",
"Hero:HID_Commando_GunTough_R_T01",
"Schematic:SID_Wall_Launcher_VR_T01",
"Hero:HID_Commando_GunHeadshotHW_SR_T01",
"Schematic:SID_Wall_Launcher_UC_T01",
"Hero:HID_Commando_GunHeadshot_VR_T01",
"Schematic:SID_Wall_Launcher_SR_T01",
"Hero:HID_Commando_GunHeadshot_SR_T01",
"Schematic:SID_Wall_Launcher_R_T01",
"Hero:HID_Commando_GrenadeMaster_SR_T01",
"Schematic:SID_Wall_Electric_VR_T01",
"Hero:HID_Commando_GrenadeGun_VR_T01",
"Schematic:SID_Wall_Electric_UC_T01",
"Hero:HID_Commando_GrenadeGun_SR_T01",
"Schematic:SID_Wall_Electric_SR_T01",
"Hero:HID_Commando_GrenadeGun_R_T01",
"Schematic:SID_Wall_Electric_R_T01",
"Hero:HID_Commando_GCGrenade_VR_T01",
"Schematic:SID_Wall_Darts_VR_T01",
"Hero:HID_Commando_GCGrenade_SR_T01",
"Schematic:SID_Wall_Darts_UC_T01",
"Hero:HID_Commando_GCGrenade_R_T01",
"Schematic:SID_Wall_Darts_SR_T01",
"Hero:HID_Commando_010_VR_T01",
"Schematic:SID_Wall_Darts_R_T01",
"Hero:HID_Commando_010_SR_T01",
"Schematic:SID_Floor_Ward_VR_T01",
"Hero:HID_Commando_009_VR_T01",
"Schematic:SID_Floor_Ward_UC_T01",
"Hero:HID_Commando_009_SR_T01",
"Schematic:SID_Floor_Ward_SR_T01",
"Hero:HID_Commando_009_R_T01",
"Schematic:SID_Floor_Ward_R_T01",
"Hero:HID_Commando_008_VR_T01",
"Schematic:SID_Floor_Spikes_Wood_VR_T01",
"Hero:HID_Commando_008_SR_T01",
"Schematic:SID_Floor_Spikes_Wood_UC_T01",
"Hero:HID_Commando_008_R_T01",
"Schematic:SID_Floor_Spikes_Wood_SR_T01",
"Hero:HID_Commando_008_FoundersM_SR_T01",
"Schematic:SID_Floor_Spikes_Wood_R_T01",
"Hero:HID_Commando_008_FoundersF_SR_T01",
"Schematic:SID_Floor_Spikes_Wood_C_T01",
"Hero:HID_Commando_007_VR_T01",
"Schematic:SID_Floor_Spikes_VR_T01",
"Hero:HID_Commando_007_UC_T01",
"Schematic:SID_Floor_Spikes_UC_T01",
"Hero:HID_Commando_007_SR_T01",
"Schematic:SID_Floor_Spikes_SR_T01",
"Hero:HID_Commando_007_R_T01",
"Schematic:SID_Floor_Spikes_R_T01",
"Hero:HID_Commando_GrenadeGun_UC_T01",
"Schematic:SID_Floor_Launcher_VR_T01",
"Hero:HID_Constructor_Sony_R_T01",
"Schematic:SID_Floor_Launcher_UC_T01",
"Hero:HID_Constructor_RushBASE_VR_T01",
"Schematic:SID_Floor_Launcher_SR_T01",
"Hero:HID_Constructor_RushBASE_UC_T01",
"Schematic:SID_Floor_Launcher_R_T01",
"Hero:HID_Constructor_RushBASE_SR_T01",
"Schematic:SID_Floor_Health_VR_T01",
"Hero:HID_Constructor_RushBASE_R_T01",
"Schematic:SID_Floor_Health_UC_T01",
"Hero:HID_Constructor_PlasmaDamage_VR_T01",
"Schematic:SID_Floor_Health_SR_T01",
"Hero:HID_Constructor_PlasmaDamage_SR_T01",
"Schematic:SID_Floor_Health_R_T01",
"Hero:HID_Constructor_PlasmaDamage_R_T01",
"Schematic:SID_Ceiling_Gas_VR_T01",
"Hero:HID_Constructor_HammerTank_VR_T01",
"Schematic:SID_Ceiling_Gas_UC_T01",
"Hero:HID_Constructor_HammerTank_UC_T01",
"Schematic:SID_Ceiling_Gas_SR_T01",
"Hero:HID_Constructor_HammerTank_SR_T01",
"Schematic:SID_Ceiling_Gas_R_T01",
"Hero:HID_Constructor_HammerTank_R_T01",
"Schematic:SID_Ceiling_Electric_Single_VR_T01",
"Hero:HID_Constructor_HammerPlasma_VR_T01",
"Schematic:SID_Ceiling_Electric_Single_UC_T01",
"Hero:HID_Constructor_HammerPlasma_SR_T01",
"Schematic:SID_Ceiling_Electric_Single_SR_T01",
"Hero:HID_Constructor_BaseHyperHW_SR_T01",
"Schematic:SID_Ceiling_Electric_Single_R_T01",
"Hero:HID_Constructor_BaseHyper_VR_T01",
"Schematic:SID_Ceiling_Electric_Single_C_T01",
"Hero:HID_Constructor_BaseHyper_SR_T01",
"Schematic:SID_Ceiling_Electric_AOE_VR_T01",
"Hero:HID_Constructor_BaseHyper_R_T01",
"Schematic:SID_Ceiling_Electric_AOE_SR_T01",
"Hero:HID_Constructor_BASEBig_SR_T01",
"Schematic:SID_Ceiling_Electric_AOE_R_T01",
"Hero:HID_Constructor_010_VR_T01",
"Schematic:SID_Sniper_TripleShot_VR_Ore_T01",
"Hero:HID_Constructor_010_SR_T01",
"Schematic:SID_Sniper_TripleShot_SR_Ore_T01",
"Hero:HID_Constructor_009_VR_T01",
"Schematic:SID_Sniper_Standard_Scope_VR_Ore_T01",
"Hero:HID_Constructor_009_SR_T01",
"Schematic:SID_Sniper_Standard_Scope_SR_Ore_T01",
"Hero:HID_Constructor_009_R_T01",
"Schematic:SID_Sniper_Standard_VR_Ore_T01",
"Hero:HID_Constructor_008_VR_T01",
"Schematic:SID_Sniper_Standard_SR_Ore_T01",
"Hero:HID_Constructor_008_SR_T01",
"Schematic:SID_Sniper_Standard_Founders_VR_Ore_T01",
"Hero:HID_Constructor_008_R_T01",
"Schematic:SID_Sniper_Standard_UC_Ore_T01",
"Hero:HID_Constructor_008_FoundersM_SR_T01",
"Schematic:SID_Sniper_Standard_R_Ore_T01",
"Hero:HID_Constructor_008_FoundersF_SR_T01",
"Schematic:SID_Sniper_Standard_C_Ore_T01",
"Hero:HID_Constructor_007_VR_T01",
"Schematic:SID_Sniper_Shredder_VR_Ore_T01",
"Hero:HID_Constructor_007_UC_T01",
"Schematic:SID_Sniper_Shredder_SR_Ore_T01",
"Hero:HID_Constructor_007_SR_T01",
"Schematic:SID_Sniper_Hydraulic_VR_Ore_T01",
"Hero:HID_Constructor_007_R_T01",
"Schematic:SID_Sniper_Hydraulic_SR_Ore_T01",
"Hero:HID_Ninja_Swordmaster_SR_T01",
"Schematic:SID_Sniper_BoltAction_Scope_VR_Ore_T01",
"Hero:HID_Ninja_StarsRainHW_SR_T01",
"Schematic:SID_Sniper_BoltAction_Scope_SR_Ore_T01",
"Hero:HID_Ninja_StarsRain_VR_T01",
"Schematic:SID_Sniper_BoltAction_Scope_R_Ore_T01",
"Hero:HID_Ninja_StarsRain_SR_T01",
"Schematic:SID_Sniper_BoltAction_UC_Ore_T01",
"Hero:HID_Ninja_StarsAssassin_VR_T01",
"Schematic:SID_Sniper_BoltAction_R_Ore_T01",
"Hero:HID_Ninja_StarsAssassin_UC_T01",
"Schematic:SID_Sniper_BoltAction_C_Ore_T01",
"Hero:HID_Ninja_StarsAssassin_SR_T01",
"Schematic:SID_Sniper_Auto_VR_Ore_T01",
"Hero:HID_Ninja_StarsAssassin_R_T01",
"Schematic:SID_Sniper_Auto_SR_Ore_T01",
"Hero:HID_Ninja_StarsAssassin_FoundersM_SR_T01",
"Schematic:SID_Sniper_Auto_Founders_VR_Ore_T01",
"Hero:HID_Ninja_StarsAssassin_FoundersF_SR_T01",
"Schematic:SID_Sniper_Auto_UC_Ore_T01",
"Hero:HID_Ninja_Sony_R_T01",
"Schematic:SID_Sniper_Auto_R_Ore_T01",
"Hero:HID_Ninja_SmokeDimMak_VR_T01",
"Schematic:SID_Sniper_AMR_VR_Ore_T01",
"Hero:HID_Ninja_SmokeDimMak_SR_T01",
"Schematic:SID_Sniper_AMR_SR_Ore_T01",
"Hero:HID_Ninja_SmokeDimMak_R_T01",
"Schematic:SID_Sniper_AMR_R_Ore_T01",
"Hero:HID_Ninja_SlashTail_VR_T01",
"Schematic:SID_Shotgun_Tactical_Precision_VR_Ore_T01",
"Hero:HID_Ninja_SlashTail_UC_T01",
"Schematic:SID_Shotgun_Tactical_Precision_SR_Ore_T01",
"Hero:HID_Ninja_SlashTail_SR_T01",
"Schematic:SID_Shotgun_Tactical_Precision_R_Ore_T01",
"Hero:HID_Ninja_SlashTail_R_T01",
"Schematic:SID_Shotgun_Tactical_UC_Ore_T01",
"Hero:HID_Ninja_SlashBreath_VR_T01",
"Schematic:SID_Shotgun_Tactical_R_Ore_T01",
"Hero:HID_Ninja_SlashBreath_SR_T01",
"Schematic:SID_Shotgun_Tactical_Founders_VR_Ore_T01",
"Hero:HID_Ninja_SlashBreath_R_T01",
"Schematic:SID_Shotgun_Tactical_Founders_SR_Ore_T01",
"Hero:HID_Ninja_010_VR_T01",
"Schematic:SID_Shotgun_Tactical_Founders_R_Ore_T01",
"Hero:HID_Ninja_010_SR_T01",
"Schematic:SID_Shotgun_Tactical_C_Ore_T01",
"Hero:HID_Ninja_009_VR_T01",
"Schematic:SID_Shotgun_Standard_VR_Ore_T01",
"Hero:HID_Ninja_009_SR_T01",
"Schematic:SID_Shotgun_Standard_SR_Ore_T01",
"Hero:HID_Ninja_009_R_T01",
"Schematic:SID_Shotgun_Standard_UC_Ore_T01",
"Hero:HID_Ninja_008_VR_T01",
"Schematic:SID_Shotgun_Standard_R_Ore_T01",
"Hero:HID_Ninja_008_SR_T01",
"Schematic:SID_Shotgun_Standard_C_Ore_T01",
"Hero:HID_Ninja_008_R_T01",
"Schematic:SID_Shotgun_SemiAuto_VR_Ore_T01",
"Hero:HID_Ninja_007_VR_T01",
"Schematic:SID_Shotgun_SemiAuto_UC_Ore_T01",
"Hero:HID_Ninja_007_UC_T01",
"Schematic:SID_Shotgun_SemiAuto_SR_Ore_T01",
"Hero:HID_Ninja_007_SR_T01",
"Schematic:SID_Shotgun_SemiAuto_R_Ore_T01",
"Hero:HID_Ninja_007_R_T01",
"Schematic:SID_Shotgun_Minigun_SR_Ore_T01",
"Hero:HID_Outlander_ZonePistolHW_SR_T01",
"Schematic:SID_Shotgun_Longarm_VR_Ore_T01",
"Hero:HID_Outlander_ZonePistol_VR_T01",
"Schematic:SID_Shotgun_Longarm_SR_Ore_T01",
"Hero:HID_Outlander_ZonePistol_SR_T01",
"Schematic:SID_Shotgun_Heavy_SR_Ore_T01",
"Hero:HID_Outlander_ZonePistol_R_T01",
"Schematic:SID_Shotgun_Break_OU_VR_Ore_T01",
"Hero:HID_Outlander_ZoneHarvest_VR_T01",
"Schematic:SID_Shotgun_Break_OU_SR_Ore_T01",
"Hero:HID_Outlander_ZoneHarvest_UC_T01",
"Schematic:SID_Shotgun_Break_OU_UC_Ore_T01",
"Hero:HID_Outlander_ZoneHarvest_SR_T01",
"Schematic:SID_Shotgun_Break_OU_R_Ore_T01",
"Hero:HID_Outlander_ZoneHarvest_R_T01",
"Schematic:SID_Shotgun_Break_VR_Ore_T01",
"Hero:HID_Outlander_ZoneFragment_SR_T01",
"Schematic:SID_Shotgun_Break_SR_Ore_T01",
"Hero:HID_Outlander_SphereFragment_VR_T01",
"Schematic:SID_Shotgun_Break_UC_Ore_T01",
"Hero:HID_Outlander_SphereFragment_SR_T01",
"Schematic:SID_Shotgun_Break_R_Ore_T01",
"Hero:HID_Outlander_SphereFragment_R_T01",
"Schematic:SID_Shotgun_Break_C_Ore_T01",
"Hero:HID_Outlander_Sony_R_T01",
"Schematic:SID_Shotgun_Auto_VR_Ore_T01",
"Hero:HID_Outlander_PunchPhase_VR_T01",
"Schematic:SID_Shotgun_Auto_SR_Ore_T01",
"Hero:HID_Outlander_PunchPhase_UC_T01",
"Schematic:SID_Shotgun_Auto_Founders_VR_Ore_T01",
"Hero:HID_Outlander_PunchPhase_SR_T01",
"Schematic:SID_Shotgun_Auto_UC_Ore_T01",
"Hero:HID_Outlander_PunchPhase_R_T01",
"Schematic:SID_Shotgun_Auto_R_Ore_T01",
"Hero:HID_Outlander_PunchDamage_VR_T01",
"Schematic:SID_Pistol_Zapper_VR_Ore_T01",
"Hero:HID_Outlander_PunchDamage_SR_T01",
"Schematic:SID_Pistol_Zapper_SR_Ore_T01",
"Hero:HID_Outlander_010_VR_T01",
"Schematic:SID_Pistol_Space_VR_Ore_T01",
"Hero:HID_Outlander_010_SR_T01",
"Schematic:SID_Pistol_Space_SR_Ore_T01",
"Hero:HID_Outlander_009_VR_T01",
"Schematic:SID_Pistol_SixShooter_UC_Ore_T01",
"Hero:HID_Outlander_009_SR_T01",
"Schematic:SID_Pistol_SixShooter_R_Ore_T01",
"Hero:HID_Outlander_009_R_T01",
"Schematic:SID_Pistol_SixShooter_C_Ore_T01",
"Hero:HID_Outlander_008_VR_T01",
"Schematic:SID_Pistol_SemiAuto_VR_Ore_T01",
"Hero:HID_Outlander_008_SR_T01",
"Schematic:SID_Pistol_SemiAuto_SR_Ore_T01",
"Hero:HID_Outlander_008_R_T01",
"Schematic:SID_Pistol_SemiAuto_Founders_VR_Ore_T01",
"Hero:HID_Outlander_008_FoundersM_SR_T01",
"Schematic:SID_Pistol_SemiAuto_UC_Ore_T01",
"Hero:HID_Outlander_008_FoundersF_SR_T01",
"Schematic:SID_Pistol_SemiAuto_R_Ore_T01",
"Hero:HID_Outlander_007_VR_T01",
"Schematic:SID_Pistol_SemiAuto_C_Ore_T01",
"Hero:HID_Outlander_007_UC_T01",
"Schematic:SID_Pistol_Rocket_SR_Ore_T01",
"Hero:HID_Outlander_007_SR_T01",
"Schematic:SID_Pistol_Rapid_VR_Ore_T01",
"Hero:HID_Outlander_007_R_T01",
"Schematic:SID_Pistol_Rapid_SR_Ore_T01",
"Defender:DID_DefenderSniper_Basic_VR_T01",
"Schematic:SID_Pistol_Rapid_R_Ore_T01",
"Defender:DID_DefenderSniper_Basic_UC_T01",
"Schematic:SID_Pistol_Rapid_Founders_VR_Ore_T01",
"Defender:DID_DefenderSniper_Basic_SR_T01",
"Schematic:SID_Pistol_Hydraulic_VR_Ore_T01",
"Defender:DID_DefenderSniper_Basic_R_T01",
"Schematic:SID_Pistol_Hydraulic_SR_Ore_T01",
"Defender:DID_DefenderSniper_Basic_C_T01",
"Schematic:SID_Pistol_Handcannon_Semi_VR_Ore_T01",
"Defender:DID_DefenderShotgun_Basic_VR_T01",
"Schematic:SID_Pistol_Handcannon_Semi_SR_Ore_T01",
"Defender:DID_DefenderShotgun_Basic_UC_T01",
"Schematic:SID_Pistol_Handcannon_Semi_R_Ore_T01",
"Defender:DID_DefenderShotgun_Basic_SR_T01",
"Schematic:SID_Pistol_Handcannon_VR_Ore_T01",
"Defender:DID_DefenderShotgun_Basic_R_T01",
"Schematic:SID_Pistol_Handcannon_SR_Ore_T01",
"Defender:DID_DefenderShotgun_Basic_C_T01",
"Schematic:SID_Pistol_Handcannon_R_Ore_T01",
"Defender:DID_DefenderPistol_Founders_VR_T01",
"Schematic:SID_Pistol_Handcannon_Founders_VR_Ore_T01",
"Defender:DID_DefenderPistol_Basic_VR_T01",
"Schematic:SID_Pistol_Gatling_VR_Ore_T01",
"Defender:DID_DefenderPistol_Basic_UC_T01",
"Schematic:SID_Pistol_Gatling_SR_Ore_T01",
"Defender:DID_DefenderPistol_Basic_SR_T01",
"Schematic:SID_Pistol_FireCracker_VR_Ore_T01",
"Defender:DID_DefenderPistol_Basic_R_T01",
"Schematic:SID_Pistol_FireCracker_SR_Ore_T01",
"Defender:DID_DefenderPistol_Basic_C_T01",
"Schematic:SID_Pistol_FireCracker_R_Ore_T01",
"Defender:DID_DefenderMelee_Basic_VR_T01",
"Schematic:SID_Pistol_Dragon_VR_Ore_T01",
"Defender:DID_DefenderMelee_Basic_UC_T01",
"Schematic:SID_Pistol_Dragon_SR_Ore_T01",
"Defender:DID_DefenderMelee_Basic_SR_T01",
"Schematic:SID_Pistol_BoltRevolver_UC_Ore_T01",
"Defender:DID_DefenderMelee_Basic_R_T01",
"Schematic:SID_Pistol_BoltRevolver_R_Ore_T01",
"Defender:DID_DefenderMelee_Basic_C_T01",
"Schematic:SID_Pistol_BoltRevolver_C_Ore_T01",
"Defender:DID_DefenderAssault_Founders_VR_T01",
"Schematic:SID_Pistol_Bolt_VR_Ore_T01",
"Defender:DID_DefenderAssault_Basic_VR_T01",
"Schematic:SID_Pistol_Bolt_SR_Ore_T01",
"Defender:DID_DefenderAssault_Basic_UC_T01",
"Schematic:SID_Pistol_AutoHeavy_VR_Ore_T01",
"Defender:DID_DefenderAssault_Basic_SR_T01",
"Schematic:SID_Pistol_AutoHeavy_SR_Ore_T01",
"Defender:DID_DefenderAssault_Basic_R_T01",
"Schematic:SID_Pistol_AutoHeavy_Founders_VR_Ore_T01",
"Defender:DID_DefenderAssault_Basic_C_T01",
"Schematic:SID_Pistol_AutoHeavy_Founders_SR_Ore_T01",
"Schematic:SID_Pistol_AutoHeavy_R_Ore_T01",
"Schematic:SID_Pistol_AutoHeavy_Founders_R_Ore_T01",
"Schematic:SID_Pistol_Auto_VR_Ore_T01",
"Schematic:SID_Pistol_Auto_SR_Ore_T01",
"Schematic:SID_Pistol_Auto_UC_Ore_T01",
"Schematic:SID_Pistol_Auto_R_Ore_T01",
"Schematic:SID_Pistol_Auto_C_Ore_T01",
"Schematic:SID_Launcher_Rocket_VR_Ore_T01",
"Schematic:SID_Launcher_Rocket_SR_Ore_T01",
"Schematic:SID_Launcher_Rocket_R_Ore_T01",
"Schematic:SID_Launcher_Pumpkin_RPG_SR_Ore_T01",
"Schematic:SID_Launcher_Hydraulic_VR_Ore_T01",
"Schematic:SID_Launcher_Hydraulic_SR_Ore_T01",
"Schematic:SID_Launcher_Grenade_VR_Ore_T01",
"Schematic:SID_Launcher_Grenade_SR_Ore_T01",
"Schematic:SID_Launcher_Grenade_R_Ore_T01",
"Schematic:SID_Assault_Surgical_VR_Ore_T01",
"Schematic:SID_Assault_Surgical_SR_Ore_T01",
"Schematic:SID_Assault_SingleShot_VR_Ore_T01",
"Schematic:SID_Assault_SingleShot_SR_Ore_T01",
"Schematic:SID_Assault_SingleShot_R_Ore_T01",
"Schematic:SID_Assault_SemiAuto_VR_Ore_T01",
"Schematic:SID_Assault_SemiAuto_SR_Ore_T01",
"Schematic:SID_Assault_SemiAuto_Founders_VR_Ore_T01",
"Schematic:SID_Assault_SemiAuto_UC_Ore_T01",
"Schematic:SID_Assault_SemiAuto_R_Ore_T01",
"Schematic:SID_Assault_SemiAuto_C_Ore_T01",
"Schematic:SID_Assault_Raygun_VR_Ore_T01",
"Schematic:SID_Assault_Raygun_SR_Ore_T01",
"Schematic:SID_Assault_Surgical_Drum_Founders_R_Ore_T01",
"Schematic:SID_Assault_LMG_VR_Ore_T01",
"Schematic:SID_Assault_LMG_SR_Ore_T01",
"Schematic:SID_Assault_LMG_R_Ore_T01",
"Schematic:SID_Assault_LMG_Drum_Founders_VR_Ore_T01",
"Schematic:SID_Assault_LMG_Drum_Founders_SR_Ore_T01",
"Schematic:SID_Assault_Hydra_SR_Ore_T01",
"Schematic:SID_Assault_Doubleshot_VR_Ore_T01",
"Schematic:SID_Assault_Doubleshot_SR_Ore_T01",
"Schematic:SID_Assault_Burst_VR_Ore_T01",
"Schematic:SID_Assault_Burst_SR_Ore_T01",
"Schematic:SID_Assault_Burst_UC_Ore_T01",
"Schematic:SID_Assault_Burst_R_Ore_T01",
"Schematic:SID_Assault_Burst_C_Ore_T01",
"Schematic:SID_Assault_Auto_VR_Ore_T01",
"Schematic:SID_Assault_Auto_SR_Ore_T01",
"Schematic:SID_Assault_Auto_Halloween_SR_Ore_T01",
"Schematic:SID_Assault_Auto_Founders_SR_Ore_T01",
"Schematic:SID_Assault_Auto_UC_Ore_T01",
"Schematic:SID_Assault_Auto_R_Ore_T01",
"Schematic:SID_Assault_Auto_C_Ore_T01",
"Schematic:SID_Piercing_Spear_Military_VR_Ore_T01",
"Schematic:SID_Piercing_Spear_Military_SR_Ore_T01",
"Schematic:SID_Piercing_Spear_Military_R_Ore_T01",
"Schematic:SID_Piercing_Spear_C_Ore_T01",
"Schematic:SID_Piercing_Spear_Laser_VR_Ore_T01",
"Schematic:SID_Piercing_Spear_Laser_SR_Ore_T01",
"Schematic:SID_Piercing_Spear_VR_Ore_T01",
"Schematic:SID_Piercing_Spear_SR_Ore_T01",
"Schematic:SID_Piercing_Spear_UC_Ore_T01",
"Schematic:SID_Piercing_Spear_R_Ore_T01",
"Schematic:SID_Edged_Sword_Medium_C_Ore_T01",
"Schematic:SID_Edged_Sword_Medium_Laser_VR_Ore_T01",
"Schematic:SID_Edged_Sword_Medium_Laser_SR_Ore_T01",
"Schematic:SID_Edged_Sword_Medium_Laser_Founders_VR_Ore_T01",
"Schematic:SID_Edged_Sword_Medium_Laser_Founders_SR_Ore_T01",
"Schematic:SID_Edged_Sword_Medium_Laser_Founders_R_Ore_T01",
"Schematic:SID_Edged_Sword_Medium_VR_Ore_T01",
"Schematic:SID_Edged_Sword_Medium_SR_Ore_T01",
"Schematic:SID_Edged_Sword_Medium_UC_Ore_T01",
"Schematic:SID_Edged_Sword_Medium_R_Ore_T01",
"Schematic:SID_Edged_Sword_Light_VR_Ore_T01",
"Schematic:SID_Edged_Sword_Light_UC_Ore_T01",
"Schematic:SID_Edged_Sword_Light_SR_Ore_T01",
"Schematic:SID_Edged_Sword_Light_R_Ore_T01",
"Schematic:SID_Edged_Sword_Light_Founders_VR_Ore_T01",
"Schematic:SID_Edged_Sword_Light_C_Ore_T01",
"Schematic:SID_Edged_Sword_Hydraulic_VR_Ore_T01",
"Schematic:SID_Edged_Sword_Hydraulic_SR_Ore_T01",
"Schematic:SID_Edged_Sword_Heavy_VR_Ore_T01",
"Schematic:SID_Edged_Sword_Heavy_SR_Ore_T01",
"Schematic:SID_Edged_Sword_Heavy_R_Ore_T01",
"Schematic:SID_Edged_Sword_Heavy_Founders_VR_Ore_T01",
"Schematic:SID_Edged_Sword_Heavy_UC_Ore_T01",
"Schematic:SID_Edged_Sword_Heavy_C_Ore_T01",
"Schematic:SID_Edged_Scythe_C_Ore_T01",
"Schematic:SID_Edged_Scythe_Laser_VR_Ore_T01",
"Schematic:SID_Edged_Scythe_Laser_SR_Ore_T01",
"Schematic:SID_Edged_Scythe_VR_Ore_T01",
"Schematic:SID_Edged_Scythe_SR_Ore_T01",
"Schematic:SID_Edged_Scythe_UC_Ore_T01",
"Schematic:SID_Edged_Scythe_R_Ore_T01",
"Schematic:SID_Edged_Axe_Medium_C_Ore_T01",
"Schematic:SID_Edged_Axe_Medium_Laser_VR_Ore_T01",
"Schematic:SID_Edged_Axe_Medium_Laser_SR_Ore_T01",
"Schematic:SID_Edged_Axe_Medium_VR_Ore_T01",
"Schematic:SID_Edged_Axe_Medium_SR_Ore_T01",
"Schematic:SID_Edged_Axe_Medium_Founders_VR_Ore_T01",
"Schematic:SID_Edged_Axe_Medium_UC_Ore_T01",
"Schematic:SID_Edged_Axe_Medium_R_Ore_T01",
"Schematic:SID_Edged_Axe_Light_VR_Ore_T01",
"Schematic:SID_Edged_Axe_Light_SR_Ore_T01",
"Schematic:SID_Edged_Axe_Light_UC_Ore_T01",
"Schematic:SID_Edged_Axe_Light_R_Ore_T01",
"Schematic:SID_Edged_Axe_Light_C_Ore_T01",
"Schematic:SID_Edged_Axe_Heavy_C_Ore_T01",
"Schematic:SID_Edged_Axe_Heavy_VR_Ore_T01",
"Schematic:SID_Edged_Axe_Heavy_SR_Ore_T01",
"Schematic:SID_Edged_Axe_Heavy_UC_Ore_T01",
"Schematic:SID_Edged_Axe_Heavy_R_Ore_T01",
"Schematic:SID_Blunt_Medium_C_Ore_T01",
"Schematic:SID_Blunt_Medium_VR_Ore_T01",
"Schematic:SID_Blunt_Medium_SR_Ore_T01",
"Schematic:SID_Blunt_Medium_UC_Ore_T01",
"Schematic:SID_Blunt_Medium_R_Ore_T01",
"Schematic:SID_Blunt_Light_VR_Ore_T01",
"Schematic:SID_Blunt_Light_SR_Ore_T01",
"Schematic:SID_Blunt_Tool_Light_UC_Ore_T01",
"Schematic:SID_Blunt_Tool_Light_R_Ore_T01",
"Schematic:SID_Blunt_Hammer_Rocket_VR_Ore_T01",
"Schematic:SID_Blunt_Hammer_Rocket_SR_Ore_T01",
"Schematic:SID_Blunt_Hammer_Heavy_C_Ore_T01",
"Schematic:SID_Blunt_Hammer_Heavy_VR_Ore_T01",
"Schematic:SID_Blunt_Hammer_Heavy_SR_Ore_T01",
"Schematic:SID_Blunt_Hammer_Heavy_Founders_VR_Ore_T01",
"Schematic:SID_Blunt_Hammer_Heavy_UC_Ore_T01",
"Schematic:SID_Blunt_Hammer_Heavy_R_Ore_T01",
"Schematic:SID_Blunt_Light_Rocketbat_VR_Ore_T01",
"Schematic:SID_Blunt_Light_Rocketbat_SR_Ore_T01",
"Schematic:SID_Blunt_Light_C_Ore_T01",
"Schematic:SID_Blunt_Light_Bat_UC_Ore_T01",
"Schematic:SID_Blunt_Light_Bat_R_Ore_T01",
"Schematic:SID_Blunt_Club_Light_VR_Ore_T01",
"Schematic:SID_Blunt_Club_Light_SR_Ore_T01",
"Schematic:SID_Blunt_Light_UC_Ore_T01",
"Schematic:SID_Blunt_Light_R_Ore_T01",
"Schematic:SID_Blunt_Heavy_Paddle_UC_Ore_T01",
"Schematic:SID_Blunt_Heavy_Paddle_R_Ore_T01",
"Schematic:SID_Blunt_Heavy_Paddle_C_Ore_T01"
]

View File

@@ -0,0 +1,7 @@
[
"lawin",
"ti93",
"pro100katyt",
"playeereq",
"matteoki"
]

View File

@@ -0,0 +1,56 @@
{
"Season2": {
"battlePassPurchased": false,
"battlePassTier": 1,
"battlePassXPBoost": 0,
"battlePassXPFriendBoost": 0
},
"Season3": {
"battlePassPurchased": false,
"battlePassTier": 1,
"battlePassXPBoost": 0,
"battlePassXPFriendBoost": 0
},
"Season4": {
"battlePassPurchased": false,
"battlePassTier": 1,
"battlePassXPBoost": 0,
"battlePassXPFriendBoost": 0
},
"Season5": {
"battlePassPurchased": false,
"battlePassTier": 1,
"battlePassXPBoost": 0,
"battlePassXPFriendBoost": 0
},
"Season6": {
"battlePassPurchased": false,
"battlePassTier": 1,
"battlePassXPBoost": 0,
"battlePassXPFriendBoost": 0
},
"Season7": {
"battlePassPurchased": false,
"battlePassTier": 1,
"battlePassXPBoost": 0,
"battlePassXPFriendBoost": 0
},
"Season8": {
"battlePassPurchased": false,
"battlePassTier": 1,
"battlePassXPBoost": 0,
"battlePassXPFriendBoost": 0
},
"Season9": {
"battlePassPurchased": false,
"battlePassTier": 1,
"battlePassXPBoost": 0,
"battlePassXPFriendBoost": 0
},
"Season10": {
"battlePassPurchased": false,
"battlePassTier": 1,
"battlePassXPBoost": 0,
"battlePassXPFriendBoost": 0
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,123 @@
{
"FortCreativeDiscoverySurface": {
"meta": {
"promotion": 1
},
"assets": {
"CreativeDiscoverySurface_Frontend": {
"meta": {
"revision": 1,
"headRevision": 1,
"revisedAt": "2022-04-11T16:34:03.517Z",
"promotion": 1,
"promotedAt": "2022-04-11T16:34:49.510Z"
},
"assetData": {
"AnalyticsId": "t412",
"TestCohorts": [
{
"AnalyticsId": "c522715413",
"CohortSelector": "PlayerDeterministic",
"PlatformBlacklist": [],
"ContentPanels": [
{
"NumPages": 1,
"AnalyticsId": "p536",
"PanelType": "AnalyticsList",
"AnalyticsListName": "ByEpicWoven",
"CuratedListOfLinkCodes": [],
"ModelName": "",
"PageSize": 7,
"PlatformBlacklist": [],
"PanelName": "ByEpicWoven",
"MetricInterval": "",
"SkippedEntriesCount": 0,
"SkippedEntriesPercent": 0,
"SplicedEntries": [],
"PlatformWhitelist": [],
"EntrySkippingMethod": "None",
"PanelDisplayName": {
"Category": "Game",
"NativeCulture": "",
"Namespace": "CreativeDiscoverySurface_Frontend",
"LocalizedStrings": [
{
"key": "ar",
"value": "العب بأسلوبك"
},
{
"key": "de",
"value": "Spiele auf deine Weise"
},
{
"key": "en",
"value": "Play Your Way"
},
{
"key": "es",
"value": "Juega como quieras"
},
{
"key": "fr",
"value": "Jouez à votre façon"
},
{
"key": "it",
"value": "Gioca a modo tuo"
},
{
"key": "ja",
"value": "好きにプレイしよう"
},
{
"key": "ko",
"value": "나만의 플레이"
},
{
"key": "pl",
"value": "Graj po swojemu"
},
{
"key": "ru",
"value": "Играйте как нравится"
},
{
"key": "tr",
"value": "İstediğin Gibi Oyna"
},
{
"key": "pt-BR",
"value": "Jogue do Seu Jeito"
},
{
"key": "es-419",
"value": "Juega a tu manera"
}
],
"bIsMinimalPatch": false,
"NativeString": "Play Your Way",
"Key": "ByEpicWoven"
},
"PlayHistoryType": "RecentlyPlayed",
"bLowestToHighest": false,
"PanelLinkCodeBlacklist": [],
"PanelLinkCodeWhitelist": [],
"FeatureTags": [],
"MetricName": ""
}
],
"PlatformWhitelist": [],
"SelectionChance": 0.1,
"TestName": "LawinServer"
}
],
"GlobalLinkCodeBlacklist": [],
"SurfaceName": "CreativeDiscoverySurface_Frontend",
"TestName": "20.10_4/11/2022_hero_combat_popularConsole",
"primaryAssetId": "FortCreativeDiscoverySurface:CreativeDiscoverySurface_Frontend",
"GlobalLinkCodeWhitelist": []
}
}
}
}
}

View File

@@ -0,0 +1,208 @@
{
"Panels": [
{
"PanelName": "ByEpicWoven",
"Pages": [
{
"results": [
{
"linkData": {
"namespace": "fn",
"mnemonic": "playlist_defaultsolo",
"linkType": "BR:Playlist",
"active": true,
"disabled": false,
"version": 95,
"moderationStatus": "Unmoderated",
"accountId": "epic",
"creatorName": "Epic",
"descriptionTags": [],
"metadata": {
"image_url": "https://cdn2.unrealengine.com/solo-1920x1080-1920x1080-bc0a5455ce20.jpg",
"matchmaking": {
"override_playlist": "playlist_defaultsolo"
}
}
},
"lastVisited": null,
"linkCode": "playlist_defaultsolo",
"isFavorite": false
},
{
"linkData": {
"namespace": "fn",
"mnemonic": "playlist_defaultduo",
"linkType": "BR:Playlist",
"active": true,
"disabled": false,
"version": 95,
"moderationStatus": "Unmoderated",
"accountId": "epic",
"creatorName": "Epic",
"descriptionTags": [],
"metadata": {
"image_url": "https://cdn2.unrealengine.com/duos-1920x1080-1920x1080-5a411fe07b21.jpg",
"matchmaking": {
"override_playlist": "playlist_defaultduo"
}
}
},
"lastVisited": null,
"linkCode": "playlist_defaultduo",
"isFavorite": false
},
{
"linkData": {
"namespace": "fn",
"mnemonic": "playlist_trios",
"linkType": "BR:Playlist",
"active": true,
"disabled": false,
"version": 95,
"moderationStatus": "Unmoderated",
"accountId": "epic",
"creatorName": "Epic",
"descriptionTags": [],
"metadata": {
"image_url": "https://cdn2.unrealengine.com/trios-1920x1080-1920x1080-d5054bb9691a.jpg",
"matchmaking": {
"override_playlist": "playlist_trios"
}
}
},
"lastVisited": null,
"linkCode": "playlist_trios",
"isFavorite": false
},
{
"linkData": {
"namespace": "fn",
"mnemonic": "playlist_defaultsquad",
"linkType": "BR:Playlist",
"active": true,
"disabled": false,
"version": 95,
"moderationStatus": "Unmoderated",
"accountId": "epic",
"creatorName": "Epic",
"descriptionTags": [],
"metadata": {
"image_url": "https://cdn2.unrealengine.com/squads-1920x1080-1920x1080-095c0732502e.jpg",
"matchmaking": {
"override_playlist": "playlist_defaultsquad"
}
}
},
"lastVisited": null,
"linkCode": "playlist_defaultsquad",
"isFavorite": false
},
{
"linkData": {
"namespace": "fn",
"mnemonic": "campaign",
"linkType": "SubGame",
"active": true,
"disabled": false,
"version": 5,
"moderationStatus": "Unmoderated",
"accountId": "epic",
"creatorName": "Epic",
"descriptionTags": [
"pve"
],
"metadata": {
"ownership_token": "Token:campaignaccess",
"image_url": "https://static-assets-prod.s3.amazonaws.com/fn/static/creative/Fortnite_STW.jpg",
"alt_introduction": {
"de": "Dränge die anstürmenden Monsterhorden zurück und erforsche eine weitläufige, zerstörbare Welt. Baue riesige Festungen, stelle Waffen her, finde Beute und steige im Level auf!",
"ru": "Сдерживайте боем полчища монстров и исследуйте обширный разрушаемый мир. Отстраивайте огромные форты, создавайте оружие, находите добычу и повышайте уровень.",
"ko": "몬스터 호드에 맞서 싸우고, 광활하고 파괴적인 세상을 탐험해 보세요. 거대한 요새를 짓고, 무기를 제작하고, 전리품을 찾으면서 레벨을 올리세요! ",
"pt-BR": "Lute para conter hordas de monstros e explorar um vasto mundo destrutível. Construa fortes enormes, crie armas, encontre saques e suba de nível.",
"it": "Lotta per respingere orde di mostri ed esplorare un vasto mondo distruttibile. Costruisci fortezze, crea armi, raccogli bottino e sali di livello.",
"fr": "Repoussez des hordes de monstres et explorez un immense terrain destructible. Bâtissez des forts énormes, fabriquez des armes, dénichez du butin et montez en niveau.",
"zh-CN": "",
"es": "Lucha para contener las hordas de monstruos y recorre un mundo inmenso y destructible. Construye fuertes enormes, fabrica armas exóticas, busca botín y sube de nivel.",
"es-MX": "Lucha para contener las hordas de monstruos y explora un mundo vasto y destructible. Construye fuertes enormes, fabrica armas, encuentra botín y sube de nivel.",
"zh": "",
"ar": "قاتل لكبح جماح الوحوش واستكشاف عالم شاسع قابل للتدمير. ابنِ حصونًا ضخمة واصنع الأسلحة واعثر على الغنائم وارتقِ بالمستوى.",
"zh-Hant": "",
"ja": "モンスターの群れを食い止め、壊すこともできる広大な世界を探索しよう。巨大な要塞を築き、武器をクラフトし、戦利品を見つてレベルアップしよう。",
"pl": "Walcz, by powstrzymać hordy potworów i odkrywaj wielki świat podlegający destrukcji. Buduj olbrzymie forty, twórz broń, zbieraj łupy, awansuj. PRO100Kąt pozdrawia wszystkich Polaków.",
"es-419": "Lucha para contener las hordas de monstruos y explora un mundo vasto y destructible. Construye fuertes enormes, fabrica armas, encuentra botín y sube de nivel.",
"tr": "Canavar sürüsünü geri püskürtmek için savaş ve yıkılabilir geniş bir dünyayı keşfet. Devasa kaleler inşa et, silahlar üret, ganimetleri topla ve seviye atla."
},
"locale": "en",
"title": "Save The World",
"matchmaking": {
"joinInProgressType": "JoinImmediately",
"playersPerTeam": 4,
"maximumNumberOfPlayers": 4,
"override_Playlist": "",
"playerCount": 4,
"mmsType": "keep_full",
"mmsPrivacy": "Public",
"numberOfTeams": 1,
"bAllowJoinInProgress": true,
"minimumNumberOfPlayers": 1,
"joinInProgressTeam": 1
},
"alt_title": {
"de": "Rette die Welt",
"ru": "Сражение с Бурей",
"ko": "세이브 더 월드",
"pt-BR": "Salve o Mundo",
"it": "Salva il mondo",
"fr": "Sauver le monde",
"zh-CN": "",
"es": "Salvar el mundo",
"es-MX": "Salva el mundo",
"zh": "",
"ar": "أنقِذ العالم",
"zh-Hant": "",
"ja": "世界を救え",
"pl": "Ratowanie Świata",
"es-419": "Salva el mundo",
"tr": "Dünyayı Kurtar"
},
"alt_tagline": {
"de": "Dränge die anstürmenden Monsterhorden zurück und erforsche eine weitläufige, zerstörbare Welt. Baue riesige Festungen, stelle Waffen her, finde Beute und steige im Level auf!",
"ru": "Сдерживайте боем полчища монстров и исследуйте обширный разрушаемый мир. Отстраивайте огромные форты, создавайте оружие, находите добычу и повышайте уровень.",
"ko": "몬스터 호드에 맞서 싸우고, 광활하고 파괴적인 세상을 탐험해 보세요. 거대한 요새를 짓고, 무기를 제작하고, 전리품을 찾으면서 레벨을 올리세요! ",
"pt-BR": "Lute para conter hordas de monstros e explorar um vasto mundo destrutível. Construa fortes enormes, crie armas, encontre saques e suba de nível.",
"it": "Lotta per respingere orde di mostri ed esplorare un vasto mondo distruttibile. Costruisci fortezze, crea armi, raccogli bottino e sali di livello.",
"fr": "Repoussez des hordes de monstres et explorez un immense terrain destructible. Bâtissez des forts énormes, fabriquez des armes, dénichez du butin et montez en niveau.",
"zh-CN": "",
"es": "Lucha para contener las hordas de monstruos y recorre un mundo inmenso y destructible. Construye fuertes enormes, fabrica armas exóticas, busca botín y sube de nivel.",
"es-MX": "Lucha para contener las hordas de monstruos y explora un mundo vasto y destructible. Construye fuertes enormes, fabrica armas, encuentra botín y sube de nivel.",
"zh": "",
"ar": "قاتل لكبح جماح الوحوش واستكشاف عالم شاسع قابل للتدمير. ابنِ حصونًا ضخمة واصنع الأسلحة واعثر على الغنائم وارتقِ بالمستوى.",
"zh-Hant": "",
"ja": "モンスターの群れを食い止め、壊すこともできる広大な世界を探索しよう。巨大な要塞を築き、武器をクラフトし、戦利品を見つけてレベルアップしよう。",
"pl": "Walcz, by powstrzymać hordy potworów i odkrywaj wielki świat podlegający destrukcji. Buduj olbrzymie forty, twórz broń, zbieraj łupy, awansuj. PRO100Kąt pozdrawia wszystkich Polaków.",
"es-419": "Lucha para contener las hordas de monstruos y explora un mundo vasto y destructible. Construye fuertes enormes, fabrica armas, encuentra botín y sube de nivel.",
"tr": "Canavar sürüsünü geri püskürtmek için savaş ve yıkılabilir geniş bir dünyayı keşfet. Devasa kaleler inşa et, silahlar üret, ganimetleri topla ve seviye atla."
},
"tagline": "Battle to hold back the monster hordes and explore a vast, destructible world. Build huge forts, craft weapons, find loot and level up.",
"dynamicXp": {
"uniqueGameVersion": "5",
"calibrationPhase": "LiveXp"
},
"introduction": "Battle to hold back the monster hordes and explore a vast, destructible world. Build huge forts, craft weapons, find loot and level up."
}
},
"lastVisited": null,
"linkCode": "campaign",
"isFavorite": false
}
],
"hasMore": false
}
]
}
],
"TestCohorts": [
"LawinServer"
],
"ModeSets": {}
}

View File

@@ -0,0 +1 @@
[]

View File

@@ -0,0 +1,10 @@
{
"friends": [],
"incoming": [],
"outgoing": [],
"suggested": [],
"blocklist": [],
"settings": {
"acceptInvites": "public"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,67 @@
{
"contentType": "collection",
"contentId": "motd-default-collection",
"tcId": "634e8e85-e2fc-4c68-bb10-93604cf6605f",
"contentItems": [
{
"contentType": "content-item",
"contentId": "46874c56-0973-4cbe-ac98-b580c5b36df5",
"tcId": "61fb3dd8-f23d-45cc-9058-058ab223ba5c",
"contentFields": {
"body": {
"ar": "استمتع بتجربة لعب استثنائية!",
"en": "Have a phenomenal gaming experience!",
"de": "Wünsche allen ein wunderbares Spielerlebnis!",
"es": "¡Que disfrutes de tu experiencia de videojuegos!",
"es-419": "¡Ten una experiencia de juego espectacular!",
"fr": "Un bon jeu à toutes et à tous !",
"it": "Ti auguriamo un'esperienza di gioco fenomenale!",
"ja": "驚きの体験をしよう!",
"ko": "게임에서 환상적인 경험을 해보세요!",
"pl": "Życzymy fenomenalnej gry!",
"pt-BR": "Tenha uma experiência de jogo fenomenal!",
"ru": "Желаю невероятно приятной игры!",
"tr": "Muhteşem bir oyun deneyimi yaşamanı dileriz!"
},
"entryType": "Website",
"image": [
{
"width": 1920,
"height": 1080,
"url": "https://fortnite-public-service-prod11.ol.epicgames.com/images/motd.png"
}
],
"tabTitleOverride": "LawinServer",
"tileImage": [
{
"width": 1024,
"height": 512,
"url": "https://fortnite-public-service-prod11.ol.epicgames.com/images/motd-s.png"
}
],
"title": {
"ar": "مرحبًا بك في LawinServer!",
"en": "Welcome to LawinServer!",
"de": "Willkommen bei LawinServer!",
"es": "¡Bienvenidos a LawinServer!",
"es-419": "¡Bienvenidos a LawinServer!",
"fr": "Bienvenue sur LawinServer !",
"it": "Benvenuto in LawinServer!",
"ja": "LawinServerへようこそ",
"ko": "LawinServer에 오신 것을 환영합니다!",
"pl": "Witaj w LawinServerze!",
"pt-BR": "Bem-vindo ao LawinServer!",
"ru": "Добро пожаловать в LawinServer!",
"tr": "LavinServer'a Hoş Geldiniz!"
},
"videoAutoplay": false,
"videoLoop": false,
"videoMute": false,
"videoStreamingEnabled": false,
"websiteButtonText": "Discord",
"websiteURL": "https://discord.gg/KJ8UaHZ"
},
"contentSchemaName": "MotdWebsiteNewsWithVideo"
}
]
}

View File

@@ -0,0 +1,4 @@
{
"accountId": "",
"optOutOfPublicLeaderboards": false
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,658 @@
{
"client": {
"RateLimiter.InventoryClient": {
"MessageCount": 100,
"TimeIntervalInSeconds": 60.0
},
"BaseService": {
"HttpRetryLimit": 4,
"HttpRetryResponseCodes": [
429,
503,
504
]
},
"RateLimiter.AuthClient": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0
},
"RateLimiter.PresenceClient.Operations": {
"MessageCount": 3,
"TimeIntervalInSeconds": 20.0,
"Operation": [
"SendUpdate",
"SetPresence"
]
},
"RateLimiter.ReceiptValidatorClient": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0
},
"RateLimiter.LeaderboardsClient": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0
},
"RateLimiter.MetricsClient": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0
},
"RateLimiter.StatsClient": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0
},
"RateLimiter.SDKConfigClient.Operations": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"RequestUpdate"
]
},
"RateLimiter.TitleStorageClient": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0
},
"RateLimiter.EcomClient": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0
},
"RateLimiter.DataStorageClient.Operations": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"GetAccessLinks",
"QueryFile",
"QueryFileList",
"CopyFile",
"DeleteFile",
"ReadFile",
"WriteFile",
"DownloadFileRedirected",
"UploadFileRedirected"
]
},
"LeaderboardsClient": {
"MaxUserScoresQueryUserIds": 100,
"MaxUserScoresQueryStats": 25
},
"RateLimiter.CustomInvitesClient.Operations": {
"MessageCount": 50,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"SendCustomInvite"
]
},
"HTTP": {
"HttpReceiveTimeout": 30,
"bEnableHttp": true,
"HttpTimeout": 30,
"HttpConnectionTimeout": 60,
"HttpSendTimeout": 30,
"MaxFlushTimeSeconds": 2.0
},
"RateLimiter.FriendClient.Operations": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"QueryFriends",
"SendFriendInvite",
"DeleteFriend"
]
},
"RateLimiter.RTCAdminClient": {
"MessageCount": 50,
"TimeIntervalInSeconds": 60.0
},
"RateLimiter.UserInfoClient": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0
},
"/Script/Engine.NetworkSettings": {
"n.VerifyPeer": false
},
"WebSockets.LibWebSockets": {
"ThreadStackSize": 131072,
"ThreadTargetFrameTimeInSeconds": 0.0333,
"ThreadMinimumSleepTimeInSeconds": 0.0
},
"StatsClient": {
"MaxQueryStatsStatNamesStrLength": 1900
},
"RateLimiter.MetricsClient.Operations": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"RegisterPlayerBackendSession"
]
},
"RateLimiter.DataStorageClient": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0
},
"SanitizerClient": {
"ReplaceChar": "*",
"RequestLimit": 10
},
"RateLimiter.ModsClient.Operations": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"InstallMod",
"UninstallMod",
"UpdateMod",
"EnumerateMods"
]
},
"RateLimiter.ReportsClient.Operations": {
"MessageCount": 100,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"SendPlayerBehaviorReport"
]
},
"RateLimiter.RTCAdminClient.Operations": {
"MessageCount": 50,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"QueryJoinRoomToken",
"Kick",
"SetParticipantHardMute"
]
},
"RateLimiter.FriendClient": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0
},
"RateLimiter.AchievementsClient": {
"MessageCount": 100,
"TimeIntervalInSeconds": 60.0
},
"LogFiles": {
"PurgeLogsDays": 5,
"MaxLogFilesOnDisk": 5,
"LogTimes": "SinceStart"
},
"RateLimiter": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0
},
"RateLimiter.AntiCheatClient": {
"MessageCount": 120,
"TimeIntervalInSeconds": 60.0
},
"RateLimiter.ProgressionSnapshot": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0
},
"SessionsClient": {
"HeartbeatIntervalSecs": 30
},
"RateLimiter.UserInfoClient.Operations": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"QueryLocalUserInfo",
"QueryUserInfo",
"QueryUserInfoByDisplayName",
"QueryUserInfoByExternalAccount"
]
},
"LobbyClient": {
"InitialResendDelayMs": 100,
"MaxConnectionRetries": 3,
"LobbySocketURL": "wss://api.epicgames.dev/lobby/v1/`deploymentId/lobbies/connect",
"NumConsecutiveFailuresAllowed": 5,
"MaxResendDelayMs": 2000,
"WebSocketConnectTaskMaxNetworkWaitSeconds": 15.0,
"RecoveryWaitTimeSecs": 2,
"InitialRetryDelaySeconds": 5,
"MaxSendRetries": 3,
"SentMessageTimeout": 5,
"HeartbeatIntervalSecs": 30,
"MaxRetryIntervalSeconds": 15
},
"RateLimiter.SanctionsClient.Operations": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"QueryActivePlayerSanctions"
]
},
"UIClient.SocialURLQueryParamNames": {
"OSName": "os_name",
"ProductId": "product_id",
"SDKCLNumber": "sdk_cl_number",
"DeploymentId": "deployment_id",
"IntegratedPlatformName": "integrated_platform_name",
"SDKVersion": "sdk_version",
"OSVersion": "os_version",
"UserId": "user_id",
"ExchangeCode": "exchange_code"
},
"RateLimiter.LobbyClient.ThrottledOperations": {
"MessageCount": 30,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"CreateLobby",
"DestroyLobby",
"JoinLobby",
"LeaveLobby",
"HeartbeatLobby",
"UpdateLobby",
"PromoteMember",
"KickLobbyMember",
"SendLobbyInvite",
"RejectLobbyInvite",
"QueryInvites",
"FindLobby",
"RefreshRTCToken",
"HardMuteMember"
]
},
"RateLimiter.SessionsClient": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0
},
"RateLimiter.KWSClient": {
"MessageCount": 20,
"TimeIntervalInSeconds": 60.0
},
"RateLimiter.PresenceClient": {
"MessageCount": 60,
"TimeIntervalInSeconds": 60.0
},
"RateLimiter.KWSClient.Operations": {
"MessageCount": 20,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"CreateUser",
"UpdateParentEmail",
"QueryAgeGate",
"QueryPermissions",
"RequestPermissions"
]
},
"RateLimiter.InventoryClient.Operations": {
"MessageCount": 100,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"Open",
"Close"
]
},
"RateLimiter.LeaderboardsClient.Operations": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"QueryLeaderboardDefinitions",
"QueryLeaderboardRanks",
"QueryLeaderboardUserScores"
]
},
"RateLimiter.SanctionsClient": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0
},
"Messaging.EpicConnect": {
"FailedConnectionDelayMultiplier": 2.5,
"ServerHeartbeatIntervalMilliseconds": 0,
"FailedConnectionDelayMaxSeconds": 180,
"ClientHeartbeatIntervalMilliseconds": 30000,
"FailedConnectionDelayIntervalSeconds": 5,
"Url": "wss://connect.epicgames.dev"
},
"MetricsClient": {
"HttpRetryLimit": 2
},
"RateLimiter.TitleStorageClient.Operations": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"QueryFile",
"QueryFileList",
"ReadFile"
]
},
"RateLimiter.AchievementsClient.Operations": {
"MessageCount": 100,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"QueryDefinitions",
"QueryPlayerAchievements",
"UnlockAchievements"
]
},
"Messaging.Stomp": {
"ClientHeartbeatIntervalMs": 30000,
"RequestedServerHeartbeatIntervalMs": 30000,
"Url": "wss://api.epicgames.dev/notifications/v1/`deploymentid`/connect",
"BlocklistMessageTypeFilters": [
"lobbyinvite"
]
},
"TitleStorageClient": {
"AccessLinkDurationSeconds": 300,
"UnusedCachedFileDaysToLive": 7,
"ClearInvalidFileCacheFrequencyDays": 2,
"MaxSimultaneousReads": 10
},
"ConnectClient": {
"MaxProductUserIdMappingsQueryUserIds": 128,
"MinProductUserIdMappingsUpdateTimeInSeconds": 900.0
},
"RateLimiter.LobbyClient.Operations": {
"MessageCount": 100,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"GetByLobbyId",
"UpdateLobby"
]
},
"RateLimiter.AntiCheatClient.Operations": {
"MessageCount": 120,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"QueryServiceStatus",
"SendClientMessage"
]
},
"EcomClient": {
"PurchaseUrl": "https://launcher-website-prod07.ol.epicgames.com/purchase",
"PurchaseCookieName": "EPIC_BEARER_TOKEN",
"PurchaseEpicIdUrl": "https://www.epicgames.com/ecom/payment/v1/purchase"
},
"RateLimiter.SessionsClient.Operations": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"UpdateSession",
"JoinSession",
"StartSession",
"EndSession",
"RegisterPlayers",
"SendInvite",
"RejectInvite",
"QueryInvites",
"FindSession",
"DestroySession"
]
},
"RateLimiter.StatsClient.Operations": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"IngestStat",
"QueryStats"
]
},
"RateLimiter.ReceiptValidatorClient.Operations": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"VerifyPurchase"
]
},
"DataStorageClient": {
"AccessLinkDurationSeconds": 300,
"MaxSimultaneousReads": 10,
"MaxSimultaneousWrites": 10
},
"RateLimiter.AuthClient.Operations": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"VerifyAuth",
"DeletePersistentAuth",
"GenerateClientAuth",
"LinkAccount",
"QueryIdToken",
"VerifyIdToken"
]
},
"P2PClient": {
"IceServers": [
"stun:stun.l.google.com:19302",
"stun:turn.rtcp.on.epicgames.com:3478",
"turn:turn.rtcp.on.epicgames.com:3478"
],
"P2PMinPort": 7777,
"P2PMaxPort": 7876
},
"RateLimiter.LobbyClient": {
"MessageCount": 30,
"TimeIntervalInSeconds": 60.0
},
"SDKAnalytics": {
"BaseUrl": "https://api.epicgames.dev/telemetry/data/",
"DevPhase": 2,
"AppEnvironment": "Production",
"UploadType": "sdkevents"
},
"RateLimiter.ConnectClient": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0
},
"AntiCheat.GameplayData": {
"Url": "wss://api.epicgames.dev/cerberus-edge/v1/"
},
"AuthClient": {
"AccountPortalURLLocaleSuffix": "lang=`code",
"PollInterval": 5,
"RefreshTokenThreshold": 100.0,
"VPCRegisterURL": "https://epicgames.com/id/register/quick/minor/await?code=`challenge_id&display=embedded",
"AuthorizeContinuationEndpoint": "https://epicgames.com/id/login?continuation=`continuation&prompt=skip_merge%20skip_upgrade",
"AuthorizeCodeEndpoint": "https://epicgames.com/id/authorize?client_id=`client_id&response_type=code&scope=`scope&redirect_uri=`redirect_uri&display=popup&prompt=login",
"AuthorizeContinuationEmbeddedEndpoint": "https://epicgames.com/id/embedded/login?continuation=`continuation&prompt=skip_merge%20skip_upgrade",
"VerifyTokenInterval": 60.0,
"PollExpiresIn": 300,
"IdTokenCacheMinExpirySeconds": 300,
"AuthorizeEndpoint": "https://epicgames.com/id/authorize?exchange_code=`exchange_code&scope=`scope&prompt=skip_merge%20skip_upgrade",
"AccountPortalScheme": "eos.`client_id://epic/auth",
"bOfflineAccountToken": true
},
"RateLimiter.ProgressionSnapshot.Operations": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"SubmitSnapshot",
"DeleteSnapshot"
]
},
"XMPP": {
"bEnabled": true,
"bEnableWebsockets": true,
"ThreadStackSize": 131072
},
"RateLimiter.AntiCheatServer.Operations": {
"MessageCount": 100000,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"QueryServiceStatus",
"SendClientMessage"
]
},
"Core.Log": {
"LogEOS": "verbose",
"LogEOSMessaging": "verbose",
"LogEOSConnect": "verbose",
"LogEOSAuth": "verbose",
"LogHttpSerialization": "verbose",
"LogCore": "verbose",
"LogHttp": "warning",
"LogStomp": "verbose",
"LogXmpp": "verbose",
"LogEOSSessions": "verbose"
},
"UIClient": {
"FriendsURL": "https://epic-social-game-overlay-prod.ol.epicgames.com/index.html",
"SocialSPAClientId": "cf27c69fe66441e8a8a4e8faf396ee4c",
"VPCURLLocaleSuffix": "&lang=`code",
"FriendsURLExchangeCodeSuffix": "?exchange_code=`exchange_code",
"VPCURL": "https://epicgames.com/id/overlay/quick/minor/verify?code=`challenge_id"
},
"RateLimiter.AntiCheatServer": {
"MessageCount": 100000,
"TimeIntervalInSeconds": 60.0
},
"Messaging.XMPP": {
"ReconnectionDelayJitter": 1.5,
"PingTimeout": 30,
"ReconnectionDelayBase": 4.0,
"ServerPort": 443,
"bPrivateChatFriendsOnly": true,
"ReconnectionDelayMax": 300.0,
"Domain": "prod.ol.epicgames.com",
"ReconnectionDelayBackoffExponent": 2.0,
"ServerAddr": "wss://xmpp-service-prod.ol.epicgames.com",
"PingInterval": 60
},
"RateLimiter.SDKConfigClient": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0
},
"RateLimiter.EcomClient.Operations": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"QueryOwnership",
"QueryOwnershipToken",
"QueryEntitlement",
"QueryOffer",
"RedeemEntitlements",
"Checkout"
]
},
"PresenceClient": {
"EpicConnectNotificationWaitTime": 5.0,
"PresenceQueryTimeoutSeconds": 60.0,
"bSetOfflineOnLogoutEnabled": true,
"PresenceAutoUpdateInSeconds": 600.0,
"bSetOfflineOnShutdownEnabled": true
},
"RateLimiter.CustomInvitesClient": {
"MessageCount": 50,
"TimeIntervalInSeconds": 60.0
},
"RateLimiter.ModsClient": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0
},
"RateLimiter.ConnectClient.Operations": {
"MessageCount": 300,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"LoginAccount",
"CreateAccount",
"LinkAccount",
"UnlinkAccount",
"CreateDeviceId",
"DeleteDeviceId",
"TransferDeviceIdAccount",
"QueryExternalAccountMappings",
"QueryProductUserIdMappings",
"VerifyIdToken"
]
},
"RateLimiter.AuthClient.SensitiveOperations": {
"MessageCount": 12,
"TimeIntervalInSeconds": 60.0,
"Operation": [
"GenerateUserAuth"
]
},
"RateLimiter.ReportsClient": {
"MessageCount": 100,
"TimeIntervalInSeconds": 60.0
}
},
"services": {
"RTCService": {
"BaseUrl": "https://api.epicgames.dev/rtc"
},
"DataStorageService": {
"BaseUrl": "https://api.epicgames.dev/datastorage"
},
"AccountsEpicIdService": {
"BaseUrl": "https://api.epicgames.dev"
},
"MetricsService": {
"BaseUrl": "https://api.epicgames.dev/datarouter"
},
"EcommerceService": {
"BaseUrl": "https://ecommerceintegration-public-service-ecomprod02.ol.epicgames.com/ecommerceintegration"
},
"KWSService": {
"BaseUrl": "https://api.epicgames.dev/kws"
},
"AntiCheatService": {
"BaseUrl": "https://api.epicgames.dev/anticheat"
},
"LobbyService": {
"BaseUrl": "https://api.epicgames.dev/lobby"
},
"StatsAchievementsService": {
"BaseUrl": "https://api.epicgames.dev/stats"
},
"PriceEngineService": {
"BaseUrl": "https://priceengine-public-service-ecomprod01.ol.epicgames.com/priceengine"
},
"AccountsService": {
"BaseUrl": "https://egp-idsoc-proxy-prod.ol.epicgames.com/account",
"RedirectUrl": "accounts.epicgames.com"
},
"EcommerceEpicIdService": {
"BaseUrl": "https://api.epicgames.dev/epic/ecom"
},
"PaymentEpicIdService": {
"BaseUrl": "https://api.epicgames.dev/epic/payment"
},
"SanctionsService": {
"BaseUrl": "https://api.epicgames.dev/sanctions"
},
"FriendService": {
"BaseUrl": "https://egp-idsoc-proxy-prod.ol.epicgames.com/friends"
},
"ReceiptValidatorService": {
"BaseUrl": "https://api.epicgames.dev/receipt-validator"
},
"FriendEpicIdService": {
"BaseUrl": "https://api.epicgames.dev/epic/friends"
},
"CatalogService": {
"BaseUrl": "https://catalog-public-service-prod06.ol.epicgames.com/catalog"
},
"EOSAuthService": {
"BaseUrl": "https://api.epicgames.dev"
},
"SessionsService": {
"BaseUrl": "https://api.epicgames.dev/matchmaking"
},
"ModsService": {
"BaseUrl": "https://api.epicgames.dev/mods"
},
"ReportsService": {
"BaseUrl": "https://api.epicgames.dev/player-reports"
},
"ProgressionSnapshotService": {
"BaseUrl": "https://api.epicgames.dev/snapshots"
},
"CustomInvitesService": {
"BaseUrl": "https://api.epicgames.dev/notifications"
},
"PresenceService": {
"BaseUrl": "https://api.epicgames.dev/epic/presence"
},
"TitleStorageService": {
"BaseUrl": "https://api.epicgames.dev/titlestorage"
},
"StatsIngestService": {
"BaseUrl": "https://api.epicgames.dev/ingestion/stats"
},
"LeaderboardsService": {
"BaseUrl": "https://api.epicgames.dev/leaderboards"
},
"InventoryService": {
"BaseUrl": "https://api.epicgames.dev/inventory"
}
},
"watermark": -934553538
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,52 @@
{
"author": "List made by PRO100KatYT",
"Season11": {
"ERG.Node.A.1": ["AthenaCharacter:cid_645_athena_commando_f_wolly"],
"ERG.Node.B.1": ["AthenaGlider:glider_id_188_galileorocket_g7oki"],
"ERG.Node.C.1": ["AthenaBackpack:bid_430_galileospeedboat_9rxe3"],
"ERG.Node.D.1": ["AthenaCharacter:cid_643_athena_commando_m_ornamentsoldier"],
"ERG.Node.A.2": ["AthenaPickaxe:pickaxe_id_329_gingerbreadcookie1h"],
"ERG.Node.A.3": ["AthenaPickaxe:pickaxe_id_332_mintminer"],
"ERG.Node.A.4": ["AthenaDance:eid_snowglobe"],
"ERG.Node.A.5": ["AthenaGlider:glider_id_191_pinetree"],
"ERG.Node.A.6": ["AthenaItemWrap:wrap_188_wrappingpaper"],
"ERG.Node.A.7": ["AthenaItemWrap:wrap_183_newyear2020"],
"ERG.Node.A.8": ["AthenaSkyDiveContrail:trails_id_082_holidaygarland"],
"ERG.Node.A.9": ["AthenaMusicPack:musicpack_040_xmaschiptunes"],
"ERG.Node.A.10": ["AthenaLoadingScreen:lsid_208_smpattern"],
"ERG.Node.A.11": ["AthenaLoadingScreen:lsid_209_akcrackshot"]
},
"Season19": {
"ERG.Node.A.1": ["Token:14daysoffortnite_small_giftbox"],
"ERG.Node.B.1": ["AthenaDance:emoji_s19_animwinterfest2021"],
"ERG.Node.C.1": ["AthenaGlider:glider_id_335_logarithm_40qgl"],
"ERG.Node.D.1": ["AthenaCharacter:cid_a_323_athena_commando_m_bananawinter"],
"ERG.Node.A.2": ["HomebaseBannerIcon:brs19_winterfest2021"],
"ERG.Node.A.3": ["AthenaSkyDiveContrail:trails_id_137_turtleneckcrystal"],
"ERG.Node.A.4": ["AthenaItemWrap:wrap_429_holidaysweater"],
"ERG.Node.A.5": ["AthenaLoadingScreen:lsid_393_winterfest2021"],
"ERG.Node.A.6": ["AthenaMusicPack:musicpack_117_winterfest2021"],
"ERG.Node.A.7": ["AthenaDance:eid_epicyarn"],
"ERG.Node.A.8": ["AthenaCharacter:cid_a_310_athena_commando_F_scholarfestive"],
"ERG.Node.A.9": ["AthenaPickaxe:pickaxe_id_731_scholarfestivefemale1h"],
"ERG.Node.A.10": ["AthenaItemWrap:wrap_430_winterlights"],
"ERG.Node.A.11": ["AthenaDance:spid_346_winterfest_2021"],
"ERG.Node.A.12": ["AthenaPickaxe:pickaxe_ID_732_shovelmale"]
},
"Season23": {
"ERG.Node.A.1": ["AthenaCharacter:character_sportsfashion_winter"],
"ERG.Node.B.1": ["AthenaCharacter:character_cometdeer"],
"ERG.Node.A.2": ["AthenaGlider:glider_default_jolly"],
"ERG.Node.A.3": ["AthenaDance:eid_dashing"],
"ERG.Node.A.4": ["AthenaDance:spray_guffholidaytree_winterfest2022", "AthenaDance:spray_winterreindeer_winterfest2022", "AthenaDance:spray_defacedsnowman_winterfest2022"],
"ERG.Node.A.5": ["AthenaDance:emoji_s23_winterfest_2022"],
"ERG.Node.A.6": ["AthenaMusicPack:musicpack_164_redpepper_winterfest"],
"ERG.Node.A.7": ["AthenaItemWrap:wrap_winter_pal"],
"ERG.Node.A.8": ["AthenaPickaxe:pickaxe_jollytroll"],
"ERG.Node.A.9": ["AthenaGlider:glider_jollytroll"],
"ERG.Node.A.10": ["AthenaBackpack:backpack_jollytroll"],
"ERG.Node.A.11": ["AthenaMusicPack:musicpack_163_winterfest_2022", "AthenaMusicPack:musicpack_157_radish_nightnight"],
"ERG.Node.A.12": ["AthenaItemWrap:wrap_cometwinter"],
"ERG.Node.A.13": ["AthenaSkyDiveContrail:contrail_jollytroll"]
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -7,14 +7,12 @@ import 'package:reboot_launcher/src/cli/game.dart';
import 'package:reboot_launcher/src/cli/reboot.dart'; import 'package:reboot_launcher/src/cli/reboot.dart';
import 'package:reboot_launcher/src/cli/server.dart'; import 'package:reboot_launcher/src/cli/server.dart';
import 'package:reboot_launcher/src/model/fortnite_version.dart'; import 'package:reboot_launcher/src/model/fortnite_version.dart';
import 'package:reboot_launcher/src/model/game_type.dart';
import 'package:reboot_launcher/src/util/os.dart';
import 'package:reboot_launcher/src/util/patcher.dart'; import 'package:reboot_launcher/src/util/patcher.dart';
import 'package:reboot_launcher/src/util/reboot.dart'; import 'package:reboot_launcher/src/util/reboot.dart';
import 'package:reboot_launcher/src/util/server.dart' as server; import 'package:reboot_launcher/src/util/server.dart' as server;
late String? username; late String? username;
late GameType type; late bool host;
late bool verbose; late bool verbose;
late String dll; late String dll;
late FortniteVersion version; late FortniteVersion version;
@@ -40,10 +38,10 @@ void main(List<String> args) async {
..addOption("server-host") ..addOption("server-host")
..addOption("server-port") ..addOption("server-port")
..addOption("matchmaking-address") ..addOption("matchmaking-address")
..addOption("dll", defaultsTo: settingsJson["reboot"] ?? (await loadBinary("reboot.dll", true)).path) ..addOption("dll", defaultsTo: settingsJson["reboot"] ?? rebootDllFile)
..addOption("type", allowed: getGameTypes(), defaultsTo: getDefaultGameType(gameJson))
..addFlag("update", defaultsTo: settingsJson["auto_update"] ?? true, negatable: true) ..addFlag("update", defaultsTo: settingsJson["auto_update"] ?? true, negatable: true)
..addFlag("log", defaultsTo: false) ..addFlag("log", defaultsTo: false)
..addFlag("host", defaultsTo: false)
..addFlag("auto-restart", defaultsTo: false, negatable: true); ..addFlag("auto-restart", defaultsTo: false, negatable: true);
var result = parser.parse(args); var result = parser.parse(args);
if (result.command?.name == "list") { if (result.command?.name == "list") {
@@ -54,8 +52,8 @@ void main(List<String> args) async {
} }
dll = result["dll"]; dll = result["dll"];
type = getGameType(result); host = result["host"];
username = result["username"] ?? gameJson["${type == GameType.client ? "game" : "server"}_username"]; username = result["username"] ?? gameJson["username"];
verbose = result["log"]; verbose = result["log"];
version = _createVersion(gameJson["version"], result["version"], versions); version = _createVersion(gameJson["version"], result["version"], versions);
@@ -69,7 +67,7 @@ void main(List<String> args) async {
} }
} }
stdout.writeln("Launching game(type: ${type.name})..."); stdout.writeln("Launching game...");
if(version.executable == null){ if(version.executable == null){
throw Exception("Missing game executable at: ${version.location.path}"); throw Exception("Missing game executable at: ${version.location.path}");
} }
@@ -78,9 +76,9 @@ void main(List<String> args) async {
await patchMatchmaking(version.executable!); await patchMatchmaking(version.executable!);
var serverType = getServerType(result); var serverType = getServerType(result);
var host = result["server-host"] ?? serverJson["${serverType.id}_host"]; var serverHost = result["server-host"] ?? serverJson["${serverType.id}_host"];
var port = result["server-port"] ?? serverJson["${serverType.id}_port"]; var serverPort = result["server-port"] ?? serverJson["${serverType.id}_port"];
var started = await startServer(host, port, serverType); var started = await startServer(serverHost, serverPort, serverType);
if(!started){ if(!started){
stderr.writeln("Cannot start server!"); stderr.writeln("Cannot start server!");
return; return;

View File

@@ -1,5 +1,4 @@
import 'dart:async'; import 'dart:async';
import 'dart:io';
import 'package:bitsdojo_window/bitsdojo_window.dart'; import 'package:bitsdojo_window/bitsdojo_window.dart';
import 'package:bitsdojo_window_windows/bitsdojo_window_windows.dart' import 'package:bitsdojo_window_windows/bitsdojo_window_windows.dart'
@@ -7,32 +6,36 @@ import 'package:bitsdojo_window_windows/bitsdojo_window_windows.dart'
import 'package:fluent_ui/fluent_ui.dart'; import 'package:fluent_ui/fluent_ui.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart'; import 'package:get_storage/get_storage.dart';
import 'package:reboot_launcher/cli.dart';
import 'package:reboot_launcher/src/controller/build_controller.dart';
import 'package:reboot_launcher/src/controller/game_controller.dart';
import 'package:reboot_launcher/src/controller/server_controller.dart';
import 'package:reboot_launcher/src/controller/settings_controller.dart';
import 'package:reboot_launcher/src/page/home_page.dart';
import 'package:reboot_launcher/src/util/error.dart'; import 'package:reboot_launcher/src/util/error.dart';
import 'package:reboot_launcher/src/util/os.dart'; import 'package:reboot_launcher/src/util/os.dart';
import 'package:reboot_launcher/src/ui/controller/build_controller.dart';
import 'package:reboot_launcher/src/ui/controller/game_controller.dart';
import 'package:reboot_launcher/src/ui/controller/hosting_controller.dart';
import 'package:reboot_launcher/src/ui/controller/server_controller.dart';
import 'package:reboot_launcher/src/ui/controller/settings_controller.dart';
import 'package:reboot_launcher/src/ui/page/home_page.dart';
import 'package:system_theme/system_theme.dart'; import 'package:system_theme/system_theme.dart';
import 'package:window_manager/window_manager.dart';
const double kDefaultWindowWidth = 885;
const double kDefaultWindowHeight = 885;
final GlobalKey appKey = GlobalKey(); final GlobalKey appKey = GlobalKey();
void main() async { void main() async {
await safeBinariesDirectory.create(recursive: true); await installationDirectory.create(recursive: true);
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
await SystemTheme.accentColor.load(); await SystemTheme.accentColor.load();
await GetStorage.init("game"); await GetStorage.init("reboot_game");
await GetStorage.init("server"); await GetStorage.init("reboot_server");
await GetStorage.init("update"); await GetStorage.init("reboot_update");
await GetStorage.init("settings"); await GetStorage.init("reboot_settings");
await GetStorage.init("reboot_hosting");
Get.put(GameController()); Get.put(GameController());
Get.put(ServerController()); Get.put(ServerController());
Get.put(BuildController()); Get.put(BuildController());
Get.put(SettingsController()); Get.put(SettingsController());
Get.put(HostingController());
doWhenWindowReady(() { doWhenWindowReady(() {
appWindow.minSize = const Size(kDefaultWindowWidth, kDefaultWindowHeight);
var controller = Get.find<SettingsController>(); var controller = Get.find<SettingsController>();
var size = Size(controller.width, controller.height); var size = Size(controller.width, controller.height);
var window = appWindow as WinDesktopWindow; var window = appWindow as WinDesktopWindow;
@@ -44,14 +47,16 @@ void main() async {
appWindow.alignment = Alignment.center; appWindow.alignment = Alignment.center;
} }
windowManager.setPreventClose(true);
appWindow.title = "Reboot Launcher"; appWindow.title = "Reboot Launcher";
appWindow.show(); appWindow.show();
}); });
runZonedGuarded(() => runZonedGuarded(
runApp(const RebootApplication()), () async => runApp(const RebootApplication()),
(error, stack) => onError(error, stack, false) (error, stack) => onError(error, stack, false),
zoneSpecification: ZoneSpecification(
handleUncaughtError: (self, parent, zone, error, stacktrace) => onError(error, stacktrace, false)
)
); );
} }
@@ -64,27 +69,22 @@ class RebootApplication extends StatefulWidget {
class _RebootApplicationState extends State<RebootApplication> { class _RebootApplicationState extends State<RebootApplication> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) => FluentApp(
final color = SystemTheme.accentColor.accent.toAccentColor(); title: "Reboot Launcher",
return FluentApp( themeMode: ThemeMode.system,
title: "Reboot Launcher", debugShowCheckedModeBanner: false,
themeMode: ThemeMode.system, color: SystemTheme.accentColor.accent.toAccentColor(),
debugShowCheckedModeBanner: false, darkTheme: _createTheme(Brightness.dark),
color: color, theme: _createTheme(Brightness.light),
darkTheme: _createTheme(Brightness.dark), home: HomePage(key: appKey),
theme: _createTheme(Brightness.light), );
home: HomePage(key: appKey),
);
}
FluentThemeData _createTheme(Brightness brightness) { FluentThemeData _createTheme(Brightness brightness) => FluentThemeData(
return FluentThemeData( brightness: brightness,
brightness: brightness, accentColor: SystemTheme.accentColor.accent.toAccentColor(),
accentColor: SystemTheme.accentColor.accent.toAccentColor(), visualDensity: VisualDensity.standard,
visualDensity: VisualDensity.standard, focusTheme: FocusThemeData(
focusTheme: FocusThemeData( glowFactor: is10footScreen() ? 2.0 : 0.0,
glowFactor: is10footScreen() ? 2.0 : 0.0, ),
), );
);
}
} }

View File

@@ -3,11 +3,8 @@ import 'dart:convert';
import 'package:args/args.dart'; import 'package:args/args.dart';
import '../model/fortnite_version.dart'; import '../model/fortnite_version.dart';
import '../model/game_type.dart';
import '../model/server_type.dart'; import '../model/server_type.dart';
Iterable<String> getGameTypes() => GameType.values.map((entry) => entry.id);
Iterable<String> getServerTypes() => ServerType.values.map((entry) => entry.id); Iterable<String> getServerTypes() => ServerType.values.map((entry) => entry.id);
String getDefaultServerType(Map<String, dynamic> json) { String getDefaultServerType(Map<String, dynamic> json) {
@@ -15,15 +12,6 @@ String getDefaultServerType(Map<String, dynamic> json) {
return type.id; return type.id;
} }
GameType getGameType(ArgResults result) {
var type = GameType.of(result["type"]);
if(type == null){
throw Exception("Unknown game type: $result. Use --type only with ${getGameTypes().join(", ")}");
}
return type;
}
ServerType getServerType(ArgResults result) { ServerType getServerType(ArgResults result) {
var type = ServerType.of(result["server-type"]); var type = ServerType.of(result["server-type"]);
if(type == null){ if(type == null){
@@ -33,18 +21,6 @@ ServerType getServerType(ArgResults result) {
return type; return type;
} }
String getDefaultGameType(Map<String, dynamic> json){
var type = GameType.values.elementAt(json["type"] ?? 0);
switch(type){
case GameType.client:
return "client";
case GameType.server:
return "server";
case GameType.headlessServer:
return "headless_server";
}
}
List<FortniteVersion> getVersions(Map<String, dynamic> gameJson) { List<FortniteVersion> getVersions(Map<String, dynamic> gameJson) {
Iterable iterable = jsonDecode(gameJson["versions"] ?? "[]"); Iterable iterable = jsonDecode(gameJson["versions"] ?? "[]");
return iterable.map((entry) => FortniteVersion.fromJson(entry)) return iterable.map((entry) => FortniteVersion.fromJson(entry))

View File

@@ -4,7 +4,6 @@ import 'package:process_run/shell.dart';
import 'package:reboot_launcher/cli.dart'; import 'package:reboot_launcher/cli.dart';
import '../model/fortnite_version.dart'; import '../model/fortnite_version.dart';
import '../model/game_type.dart';
import '../util/injector.dart'; import '../util/injector.dart';
import '../util/os.dart'; import '../util/os.dart';
import '../util/process.dart'; import '../util/process.dart';
@@ -32,15 +31,14 @@ Future<void> startGame() async {
.path} no longer contains a Fortnite executable, did you delete or move it?"); .path} no longer contains a Fortnite executable, did you delete or move it?");
} }
var hosting = type != GameType.client;
if (username == null) { if (username == null) {
username = "Reboot${hosting ? 'Host' : 'Player'}"; username = "Reboot${host ? 'Host' : 'Player'}";
stdout.writeln("No username was specified, using $username by default. Use --username to specify one"); stdout.writeln("No username was specified, using $username by default. Use --username to specify one");
} }
_gameProcess = await Process.start(gamePath, createRebootArgs(username!, type, "")) _gameProcess = await Process.start(gamePath, createRebootArgs(username!, host, ""))
..exitCode.then((_) => _onClose()) ..exitCode.then((_) => _onClose())
..outLines.forEach((line) => _onGameOutput(line, dll, hosting, verbose)); ..outLines.forEach((line) => _onGameOutput(line, dll, host, verbose));
} }
@@ -68,7 +66,7 @@ void _onGameOutput(String line, String dll, bool hosting, bool verbose) {
} }
if(line.contains("Platform has ")){ if(line.contains("Platform has ")){
_injectOrShowError("craniumv2.dll"); _injectOrShowError("cobalt.dll");
return; return;
} }
@@ -90,7 +88,7 @@ void _onGameOutput(String line, String dll, bool hosting, bool verbose) {
_injectOrShowError("console.dll"); _injectOrShowError("console.dll");
} }
_injectOrShowError("leakv2.dll"); _injectOrShowError("memoryleak.dll");
} }
} }
@@ -107,7 +105,7 @@ Future<void> _injectOrShowError(String binary, [bool locate = true]) async {
try { try {
stdout.writeln("Injecting $binary..."); stdout.writeln("Injecting $binary...");
var dll = locate ? await loadBinary(binary, true) : File(binary); var dll = locate ? File("${assetsDirectory.path}\\dlls\\$binary") : File(binary);
if(!dll.existsSync()){ if(!dll.existsSync()){
throw Exception("Cannot inject $dll: missing file"); throw Exception("Cannot inject $dll: missing file");
} }

View File

@@ -1,18 +1,19 @@
import 'dart:io'; import 'dart:io';
import 'package:archive/archive_io.dart'; import 'package:archive/archive_io.dart';
import 'package:reboot_launcher/src/util/server.dart';
import '../util/os.dart'; import '../util/os.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
const String _baseDownload = "https://cdn.discordapp.com/attachments/1009257632315494520/1051137082766131250/Cranium.dll"; const String _baseDownload = "https://cdn.discordapp.com/attachments/1095351875961901057/1110968021373169674/cobalt.dll";
const String _consoleDownload = "https://cdn.discordapp.com/attachments/1026121175878881290/1031230848005046373/console.dll"; const String _consoleDownload = "https://cdn.discordapp.com/attachments/1095351875961901057/1110968095033524234/console.dll";
const String _memoryFixDownload = "https://cdn.discordapp.com/attachments/1013220721494863872/1033484506633617500/MemoryLeakFixer.dll"; const String _memoryFixDownload = "https://cdn.discordapp.com/attachments/1095351875961901057/1110968141556756581/memoryleak.dll";
const String _embeddedConfigDownload = "https://cdn.discordapp.com/attachments/1026121175878881290/1040679319351066644/embedded.zip"; const String _embeddedConfigDownload = "https://cdn.discordapp.com/attachments/1026121175878881290/1040679319351066644/embedded.zip";
Future<void> downloadRequiredDLLs() async { Future<void> downloadRequiredDLLs() async {
stdout.writeln("Downloading necessary components..."); stdout.writeln("Downloading necessary components...");
var consoleDll = await loadBinary("console.dll", true); var consoleDll = File("${assetsDirectory.path}\\dlls\\console.dll");
if(!consoleDll.existsSync()){ if(!consoleDll.existsSync()){
var response = await http.get(Uri.parse(_consoleDownload)); var response = await http.get(Uri.parse(_consoleDownload));
if(response.statusCode != 200){ if(response.statusCode != 200){
@@ -22,30 +23,27 @@ Future<void> downloadRequiredDLLs() async {
await consoleDll.writeAsBytes(response.bodyBytes); await consoleDll.writeAsBytes(response.bodyBytes);
} }
var craniumDll = await loadBinary("craniumv2.dll", true); var craniumDll = File("${assetsDirectory.path}\\dlls\\cobalt.dll");
if(!craniumDll.existsSync()){ if(!craniumDll.existsSync()){
var response = await http.get(Uri.parse(_baseDownload)); var response = await http.get(Uri.parse(_baseDownload));
if(response.statusCode != 200){ if(response.statusCode != 200){
throw Exception("Cannot download craniumv2.dll"); throw Exception("Cannot download cobalt.dll");
} }
await craniumDll.writeAsBytes(response.bodyBytes); await craniumDll.writeAsBytes(response.bodyBytes);
} }
var memoryFixDll = await loadBinary("leakv2.dll", true); var memoryFixDll = File("${assetsDirectory.path}\\dlls\\memoryleak.dll");
if(!memoryFixDll.existsSync()){ if(!memoryFixDll.existsSync()){
var response = await http.get(Uri.parse(_memoryFixDownload)); var response = await http.get(Uri.parse(_memoryFixDownload));
if(response.statusCode != 200){ if(response.statusCode != 200){
throw Exception("Cannot download leakv2.dll"); throw Exception("Cannot download memoryleak.dll");
} }
await memoryFixDll.writeAsBytes(response.bodyBytes); await memoryFixDll.writeAsBytes(response.bodyBytes);
} }
var config = loadEmbedded("config/"); if(!serverDirectory.existsSync()){
var profiles = loadEmbedded("profiles/");
var responses = loadEmbedded("responses/");
if(!config.existsSync() || !profiles.existsSync() || !responses.existsSync()){
var response = await http.get(Uri.parse(_embeddedConfigDownload)); var response = await http.get(Uri.parse(_embeddedConfigDownload));
if(response.statusCode != 200){ if(response.statusCode != 200){
throw Exception("Cannot download embedded server config"); throw Exception("Cannot download embedded server config");
@@ -53,7 +51,6 @@ Future<void> downloadRequiredDLLs() async {
var tempZip = File("${tempDirectory.path}/reboot_config.zip"); var tempZip = File("${tempDirectory.path}/reboot_config.zip");
await tempZip.writeAsBytes(response.bodyBytes); await tempZip.writeAsBytes(response.bodyBytes);
await extractFileToDisk(tempZip.path, serverDirectory.path);
await extractFileToDisk(tempZip.path, "${safeBinariesDirectory.path}\\cli");
} }
} }

View File

@@ -20,7 +20,7 @@ Future<bool> startServer(String? host, String? port, ServerType type) async {
return true; return true;
case ServerType.embedded: case ServerType.embedded:
stdout.writeln("Starting an embedded server..."); stdout.writeln("Starting an embedded server...");
await server.startServer(); await server.startServer(false);
var result = await server.ping(host ?? "127.0.0.1", port ?? "3551"); var result = await server.ping(host ?? "127.0.0.1", port ?? "3551");
if(result == null){ if(result == null){
throw Exception("Cannot start embedded server"); throw Exception("Cannot start embedded server");

View File

@@ -1,7 +1,5 @@
import 'dart:io'; import 'dart:io';
import 'game_type.dart';
class GameInstance { class GameInstance {
final Process gameProcess; final Process gameProcess;
final Process? launcherProcess; final Process? launcherProcess;

View File

@@ -1,26 +0,0 @@
enum GameType {
client,
server,
headlessServer;
static GameType? of(String id){
try {
return GameType.values
.firstWhere((element) => element.id == id);
}catch(_){
return null;
}
}
String get id {
return this == GameType.client ? "client"
: this == GameType.server ? "server"
: "headless_server";
}
String get name {
return this == GameType.client ? "Game client"
: this == GameType.server ? "Game server"
: "Headless game server";
}
}

View File

@@ -1,11 +0,0 @@
import 'package:version/version.dart';
class RebootDownload {
final int updateTime;
final Object? error;
final StackTrace? stackTrace;
RebootDownload(this.updateTime, [this.error, this.stackTrace]);
bool get hasError => error != null;
}

View File

@@ -0,0 +1,8 @@
enum UpdateStatus {
waiting,
started,
success,
error;
bool isDone() => this == UpdateStatus.success || this == UpdateStatus.error;
}

View File

@@ -1,280 +0,0 @@
import 'dart:async';
import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter/foundation.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:reboot_launcher/main.dart';
import 'package:reboot_launcher/src/controller/build_controller.dart';
import 'package:reboot_launcher/src/controller/game_controller.dart';
import 'package:reboot_launcher/src/controller/settings_controller.dart';
import 'package:reboot_launcher/src/dialog/dialog.dart';
import 'package:reboot_launcher/src/model/reboot_download.dart';
import 'package:reboot_launcher/src/util/os.dart';
import 'package:reboot_launcher/src/widget/home/game_type_selector.dart';
import 'package:reboot_launcher/src/widget/home/launch_button.dart';
import 'package:reboot_launcher/src/widget/home/version_selector.dart';
import 'package:reboot_launcher/src/widget/shared/setting_tile.dart';
import '../dialog/dialog_button.dart';
import '../util/checks.dart';
import '../util/reboot.dart';
class LauncherPage extends StatefulWidget {
const LauncherPage(
{Key? key})
: super(key: key);
@override
State<LauncherPage> createState() => _LauncherPageState();
}
class _LauncherPageState extends State<LauncherPage> {
final GameController _gameController = Get.find<GameController>();
final SettingsController _settingsController = Get.find<SettingsController>();
final BuildController _buildController = Get.find<BuildController>();
@override
void initState() {
if(_gameController.updater == null) {
_startUpdater();
_setupBuildWarning();
}
super.initState();
}
void _setupBuildWarning() {
_buildController.cancelledDownload
.listen((value) => value ? _onCancelWarning() : {});
}
void _startUpdater() {
_gameController.updater = StreamController.broadcast();
downloadRebootDll(_settingsController.updateUrl.text, _updateTime)
..then((result) async {
if(!result.hasError){
_updateTime = result.updateTime;
_gameController.updated = true;
_gameController.failing = false;
_gameController.error = false;
_gameController.updater?.add(true);
return;
}
if(_gameController.failing){
_gameController.updated = false;
_gameController.failing = false;
_gameController.error = true;
_gameController.updater?.add(false);
return;
}
_gameController.failing = true;
showDialog(
context: appKey.currentContext!,
builder: (context) => InfoDialog(
text: "An error occurred while downloading the reboot dll: this usually means that your antivirus flagged it. "
"Do you want to add an exclusion to Windows Defender to fix the issue? "
"If you are using a different antivirus disable it manually as this won't work. ",
buttons: [
ErrorDialog.createCopyErrorButton(
error: result.error ?? Exception("Unknown error"),
stackTrace: result.stackTrace,
type: ButtonType.secondary,
onClick: () {
Navigator.pop(context);
_gameController.updated = false;
_gameController.failing = false;
_gameController.error = true;
_gameController.updater?.add(false);
}
),
DialogButton(
text: "Add",
type: ButtonType.primary,
onTap: () async {
Navigator.pop(context);
var binary = await loadBinary("antivirus.bat", true);
var result = await runElevated(binary.path, "");
if(!result) {
_gameController.failing = false;
}
_startUpdater();
}
),
],
)
);
})
..catchError((error, stackTrace) {
_gameController.error = true;
_gameController.updater?.add(false);
return RebootDownload(0, error, stackTrace);
});
}
int? get _updateTime {
var storage = GetStorage("update");
return storage.read("last_update_v2");
}
set _updateTime(int? updateTime) {
var storage = GetStorage("update");
storage.write("last_update_v2", updateTime);
}
void _onCancelWarning() {
WidgetsBinding.instance.addPostFrameCallback((_) {
if(!mounted) {
return;
}
showSnackbar(context,
const Snackbar(content: Text("Download cancelled")));
_buildController.cancelledDownload(false);
});
}
@override
Widget build(BuildContext context) => StreamBuilder<bool>(
stream: _gameController.updater!.stream,
builder: (context, snapshot) => !_gameController.updated && !_gameController.error ? _updateScreen : _homeScreen
);
Widget get _homeScreen => Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AnimatedSwitcher(
duration: const Duration(milliseconds: 300),
child: _gameController.error ? _updateError : const SizedBox(),
),
AnimatedSize(
duration: const Duration(milliseconds: 300),
child: SizedBox(height: _gameController.error ? 16.0 : 0.0),
),
SettingTile(
title: "Username",
subtitle: "Enter the name that others will see once you are in-game",
content: TextFormBox(
placeholder: "username",
controller: _gameController.username,
validator: checkMatchmaking,
autovalidateMode: AutovalidateMode.always
)
),
const SizedBox(
height: 16.0,
),
SettingTile(
title: "Matchmaking host",
subtitle: "Enter the IP address of the game server hosting the match",
content: TextFormBox(
placeholder: "ip:port",
controller: _settingsController.matchmakingIp,
validator: checkMatchmaking,
autovalidateMode: AutovalidateMode.always
),
expandedContent: [
ListTile(
title: const Text(
"Automatically start a game server",
style: TextStyle(
fontSize: 14
),
),
subtitle: const Text("Choose whether an headless server should be automatically started when matchmaking is on localhost"),
trailing: Obx(() => ToggleSwitch(
checked: _gameController.autostartGameServer(),
onChanged: (value) => _gameController.autostartGameServer.value = value
))
),
],
),
const SizedBox(
height: 16.0,
),
SettingTile(
title: "Version",
subtitle: "Select the version of Fortnite you want to play with your friends",
content: const VersionSelector(),
expandedContent: [
ListTile(
title: const Text(
"Add a version from this PC's local storage",
style: TextStyle(
fontSize: 14
),
),
trailing: Button(
onPressed: () => VersionSelector.openAddDialog(context),
child: const Text("Add build "),
),
),
ListTile(
title: const Text(
"Download any version from the cloud",
style: TextStyle(
fontSize: 14
),
),
trailing: Button(
onPressed: () => VersionSelector.openDownloadDialog(context),
child: const Text("Download"),
),
),
]
),
const SizedBox(
height: 16.0,
),
SettingTile(
title: "Instance type",
subtitle: "Select the type of instance you want to launch",
content: GameTypeSelector()
),
const Expanded(child: SizedBox()),
const LaunchButton()
],
);
Widget get _updateScreen => Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
ProgressRing(),
SizedBox(height: 16.0),
Text("Updating Reboot DLL...")
],
),
],
);
Widget get _updateError {
return MouseRegion(
cursor: SystemMouseCursors.click,
child: GestureDetector(
onTap: () {
_gameController.updated = false;
_gameController.failing = false;
_gameController.error = false;
_gameController.updater?.add(false);
_startUpdater();
},
child: const SizedBox(
width: double.infinity,
child: InfoBar(
title: Text("The Reboot dll wasn't downloaded: disable your antivirus or proxy and click here to try again"
),
severity: InfoBarSeverity.info
)
),
),
);
}
}

View File

@@ -7,68 +7,44 @@ import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart'; import 'package:get_storage/get_storage.dart';
import 'package:reboot_launcher/src/model/fortnite_version.dart'; import 'package:reboot_launcher/src/model/fortnite_version.dart';
import 'package:reboot_launcher/src/model/game_instance.dart'; import 'package:reboot_launcher/src/model/game_instance.dart';
import 'package:reboot_launcher/src/model/game_type.dart';
import '../../model/update_status.dart';
const String kDefaultPlayerName = "Player";
class GameController extends GetxController { class GameController extends GetxController {
late final GetStorage _storage; late final GetStorage _storage;
late final TextEditingController username; late final TextEditingController username;
late final TextEditingController password;
late final RxBool showPassword;
late final TextEditingController customLaunchArgs; late final TextEditingController customLaunchArgs;
late final Rx<List<FortniteVersion>> versions; late final Rx<List<FortniteVersion>> versions;
late final Rxn<FortniteVersion> _selectedVersion; late final Rxn<FortniteVersion> _selectedVersion;
late final Rx<GameType> type;
late final HashMap<GameType, GameInstance> gameInstancesMap;
late final RxBool started; late final RxBool started;
late final RxBool autostartGameServer; late final Rx<UpdateStatus> updateStatus;
late bool updated; GameInstance? instance;
late bool error;
late bool failing;
StreamController<bool>? updater;
GameController() { GameController() {
_storage = GetStorage("game"); _storage = GetStorage("reboot_game");
Iterable decodedVersionsJson = jsonDecode(_storage.read("versions") ?? "[]");
Iterable decodedVersionsJson =
jsonDecode(_storage.read("versions") ?? "[]");
var decodedVersions = decodedVersionsJson var decodedVersions = decodedVersionsJson
.map((entry) => FortniteVersion.fromJson(entry)) .map((entry) => FortniteVersion.fromJson(entry))
.toList(); .toList();
versions = Rx(decodedVersions); versions = Rx(decodedVersions);
versions.listen((data) => saveVersions()); versions.listen((data) => _saveVersions());
var decodedSelectedVersionName = _storage.read("version"); var decodedSelectedVersionName = _storage.read("version");
var decodedSelectedVersion = decodedVersions.firstWhereOrNull( var decodedSelectedVersion = decodedVersions.firstWhereOrNull(
(element) => element.name == decodedSelectedVersionName); (element) => element.name == decodedSelectedVersionName);
_selectedVersion = Rxn(decodedSelectedVersion); _selectedVersion = Rxn(decodedSelectedVersion);
username = TextEditingController(text: _storage.read("username") ?? kDefaultPlayerName);
type = Rx(GameType.values.elementAt(_storage.read("type") ?? 0)); username.addListener(() => _storage.write("username", username.text));
type.listen((value) { password = TextEditingController(text: _storage.read("password") ?? "");
_storage.write("type", value.index); password.addListener(() => _storage.write("password", password.text));
username.text = _readUsername(); showPassword = RxBool(false);
});
username = TextEditingController(text: _readUsername());
username.addListener(() => _storage.write("${type.value == GameType.client ? 'game' : 'host'}_username", username.text));
customLaunchArgs = TextEditingController(text: _storage.read("custom_launch_args" ?? "")); customLaunchArgs = TextEditingController(text: _storage.read("custom_launch_args" ?? ""));
customLaunchArgs.addListener(() => _storage.write("custom_launch_args", customLaunchArgs.text)); customLaunchArgs.addListener(() => _storage.write("custom_launch_args", customLaunchArgs.text));
gameInstancesMap= HashMap();
started = RxBool(false); started = RxBool(false);
updateStatus = Rx(UpdateStatus.waiting);
autostartGameServer = RxBool(_storage.read("auto_start_game_server") ?? true);
autostartGameServer.listen((value) => _storage.write("auto_start_game_server", value));
updated = false;
error = false;
failing = false;
}
String _readUsername() {
var client = type.value == GameType.client;
return _storage.read("${client ? 'game' : 'host'}_username") ?? (client ? "" : "HostingServer");
} }
FortniteVersion? getVersionByName(String name) { FortniteVersion? getVersionByName(String name) {
@@ -76,12 +52,15 @@ class GameController extends GetxController {
} }
void addVersion(FortniteVersion version) { void addVersion(FortniteVersion version) {
var empty = versions.value.isEmpty;
versions.update((val) => val?.add(version)); versions.update((val) => val?.add(version));
if(empty){
selectedVersion = version;
}
} }
FortniteVersion removeVersionByName(String versionName) { FortniteVersion removeVersionByName(String versionName) {
var version = var version = versions.value.firstWhere((element) => element.name == versionName);
versions.value.firstWhere((element) => element.name == versionName);
removeVersion(version); removeVersion(version);
return version; return version;
} }
@@ -90,9 +69,8 @@ class GameController extends GetxController {
versions.update((val) => val?.remove(version)); versions.update((val) => val?.remove(version));
} }
Future saveVersions() async { Future<void> _saveVersions() async {
var serialized = var serialized = jsonEncode(versions.value.map((entry) => entry.toJson()).toList());
jsonEncode(versions.value.map((entry) => entry.toJson()).toList());
await _storage.write("versions", serialized); await _storage.write("versions", serialized);
} }
@@ -100,8 +78,6 @@ class GameController extends GetxController {
bool get hasNoVersions => versions.value.isEmpty; bool get hasNoVersions => versions.value.isEmpty;
GameInstance? get currentGameInstance => gameInstancesMap[type()];
FortniteVersion? get selectedVersion => _selectedVersion(); FortniteVersion? get selectedVersion => _selectedVersion();
set selectedVersion(FortniteVersion? version) { set selectedVersion(FortniteVersion? version) {

View File

@@ -0,0 +1,28 @@
import 'package:fluent_ui/fluent_ui.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import '../../model/game_instance.dart';
const String kDefaultServerName = "Reboot Game Server";
class HostingController extends GetxController {
late final GetStorage _storage;
late final TextEditingController name;
late final TextEditingController category;
late final RxBool discoverable;
late final RxBool started;
GameInstance? instance;
HostingController() {
_storage = GetStorage("reboot_hosting");
name = TextEditingController(text: _storage.read("name") ?? kDefaultServerName);
name.addListener(() => _storage.write("name", name.text));
category = TextEditingController(text: _storage.read("category") ?? "");
category.addListener(() => _storage.write("category", category.text));
discoverable = RxBool(_storage.read("discoverable") ?? false);
discoverable.listen((value) => _storage.write("discoverable", value));
started = RxBool(false);
}
}

View File

@@ -5,8 +5,8 @@ import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart'; import 'package:get_storage/get_storage.dart';
import 'package:jaguar/jaguar.dart'; import 'package:jaguar/jaguar.dart';
import '../model/server_type.dart'; import '../../model/server_type.dart';
import '../util/server.dart'; import '../../util/server.dart';
class ServerController extends GetxController { class ServerController extends GetxController {
static const String _serverName = "127.0.0.1"; static const String _serverName = "127.0.0.1";
@@ -18,14 +18,12 @@ class ServerController extends GetxController {
late final Rx<ServerType> type; late final Rx<ServerType> type;
late final RxBool warning; late final RxBool warning;
late RxBool started; late RxBool started;
late RxBool loginAutomatically; late RxBool detached;
HttpServer? remoteServer; HttpServer? remoteServer;
ServerController() { ServerController() {
_storage = GetStorage("server"); _storage = GetStorage("reboot_server");
started = RxBool(false); started = RxBool(false);
loginAutomatically = RxBool(_storage.read("login_automatically") ?? false);
loginAutomatically.listen((value) => _storage.write("login_automatically", value));
type = Rx(ServerType.values.elementAt(_storage.read("type") ?? 0)); type = Rx(ServerType.values.elementAt(_storage.read("type") ?? 0));
type.listen((value) { type.listen((value) {
host.text = _readHost(); host.text = _readHost();
@@ -43,6 +41,8 @@ class ServerController extends GetxController {
port.addListener(() => _storage.write("${type.value.id}_port", port.text)); port.addListener(() => _storage.write("${type.value.id}_port", port.text));
warning = RxBool(_storage.read("lawin_value") ?? true); warning = RxBool(_storage.read("lawin_value") ?? true);
warning.listen((value) => _storage.write("lawin_value", value)); warning.listen((value) => _storage.write("lawin_value", value));
detached = RxBool(_storage.read("detached") ?? false);
warning.listen((value) => _storage.write("detached", value));
} }
String _readHost() { String _readHost() {

View File

@@ -1,16 +1,18 @@
import 'dart:io';
import 'package:fluent_ui/fluent_ui.dart'; import 'package:fluent_ui/fluent_ui.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart'; import 'package:get_storage/get_storage.dart';
import 'package:ini/ini.dart'; import 'package:reboot_launcher/main.dart';
import 'package:reboot_launcher/src/util/os.dart'; import 'package:reboot_launcher/src/util/os.dart';
import 'package:reboot_launcher/src/util/server.dart'; import 'package:reboot_launcher/src/util/server.dart';
import 'dart:ui'; import 'dart:ui';
import '../util/reboot.dart'; import '../../util/reboot.dart';
class SettingsController extends GetxController { class SettingsController extends GetxController {
static const String _kDefaultIp = "127.0.0.1";
static const bool _kDefaultAutoUpdate = true;
late final GetStorage _storage; late final GetStorage _storage;
late final String originalDll; late final String originalDll;
late final TextEditingController updateUrl; late final TextEditingController updateUrl;
@@ -26,41 +28,30 @@ class SettingsController extends GetxController {
late double scrollingDistance; late double scrollingDistance;
SettingsController() { SettingsController() {
_storage = GetStorage("settings"); _storage = GetStorage("reboot_settings");
updateUrl = TextEditingController(text: _storage.read("update_url") ?? rebootDownloadUrl); updateUrl = TextEditingController(text: _storage.read("update_url") ?? rebootDownloadUrl);
updateUrl.addListener(() => _storage.write("update_url", updateUrl.text)); updateUrl.addListener(() => _storage.write("update_url", updateUrl.text));
rebootDll = _createController("reboot", "reboot.dll"); rebootDll = _createController("reboot", "reboot.dll");
consoleDll = _createController("console", "console.dll"); consoleDll = _createController("console", "console.dll");
authDll = _createController("cobalt", "cobalt.dll");
authDll = _createController("cranium2", "craniumv2.dll"); matchmakingIp = TextEditingController(text: _storage.read("ip") ?? _kDefaultIp);
matchmakingIp = TextEditingController(text: _storage.read("ip") ?? "127.0.0.1");
matchmakingIp.addListener(() async { matchmakingIp.addListener(() async {
var text = matchmakingIp.text; var text = matchmakingIp.text;
_storage.write("ip", text); _storage.write("ip", text);
writeMatchmakingIp(text); writeMatchmakingIp(text);
}); });
width = _storage.read("width") ?? kDefaultWindowWidth;
width = _storage.read("width") ?? 912; height = _storage.read("height") ?? kDefaultWindowHeight;
height = _storage.read("height") ?? 660;
offsetX = _storage.read("offset_x"); offsetX = _storage.read("offset_x");
offsetY = _storage.read("offset_y"); offsetY = _storage.read("offset_y");
autoUpdate = RxBool(_storage.read("auto_update") ?? _kDefaultAutoUpdate);
autoUpdate = RxBool(_storage.read("auto_update") ?? false);
autoUpdate.listen((value) async => _storage.write("auto_update", value)); autoUpdate.listen((value) async => _storage.write("auto_update", value));
scrollingDistance = 0.0; scrollingDistance = 0.0;
} }
TextEditingController _createController(String key, String name) { TextEditingController _createController(String key, String name) {
loadBinary(name, true); var controller = TextEditingController(text: _storage.read(key) ?? _controllerDefaultPath(name));
var controller = TextEditingController(text: _storage.read(key) ?? "${safeBinariesDirectory.path}\\$name");
controller.addListener(() => _storage.write(key, controller.text)); controller.addListener(() => _storage.write(key, controller.text));
return controller; return controller;
} }
@@ -73,4 +64,16 @@ class SettingsController extends GetxController {
_storage.write("offset_x", position.dx); _storage.write("offset_x", position.dx);
_storage.write("offset_y", position.dy); _storage.write("offset_y", position.dy);
} }
void reset(){
updateUrl.text = rebootDownloadUrl;
rebootDll.text = _controllerDefaultPath("reboot.dll");
consoleDll.text = _controllerDefaultPath("console.dll");
authDll.text = _controllerDefaultPath("cobalt.dll");
matchmakingIp.text = _kDefaultIp;
writeMatchmakingIp(_kDefaultIp);
autoUpdate.value = _kDefaultAutoUpdate;
}
String _controllerDefaultPath(String name) => "${assetsDirectory.path}\\dlls\\$name";
} }

View File

@@ -0,0 +1,6 @@
import 'package:get_storage/get_storage.dart';
final GetStorage _storage = GetStorage("reboot_update");
int? get updateTime => _storage.read("last_update_v2");
set updateTime(int? updateTime) => _storage.write("last_update_v2", updateTime);

View File

@@ -2,14 +2,14 @@ import 'dart:io';
import 'package:fluent_ui/fluent_ui.dart'; import 'package:fluent_ui/fluent_ui.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:reboot_launcher/src/controller/game_controller.dart';
import 'package:reboot_launcher/src/dialog/dialog.dart';
import 'package:reboot_launcher/src/dialog/dialog_button.dart';
import 'package:reboot_launcher/src/model/fortnite_version.dart'; import 'package:reboot_launcher/src/model/fortnite_version.dart';
import 'package:reboot_launcher/src/ui/controller/game_controller.dart';
import '../util/checks.dart'; import '../../util/checks.dart';
import '../widget/shared/file_selector.dart'; import '../widget/shared/file_selector.dart';
import '../widget/shared/smart_check_box.dart'; import '../widget/shared/smart_check_box.dart';
import 'dialog.dart';
import 'dialog_button.dart';
class AddLocalVersion extends StatelessWidget { class AddLocalVersion extends StatelessWidget {
final GameController _gameController = Get.find<GameController>(); final GameController _gameController = Get.find<GameController>();
@@ -24,9 +24,20 @@ class AddLocalVersion extends StatelessWidget {
return FormDialog( return FormDialog(
content: Column( content: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const SizedBox(
width: double.infinity,
child: InfoBar(
title: Text("Local builds are not guaranteed to work"),
severity: InfoBarSeverity.info
),
),
const SizedBox(
height: 16.0
),
TextFormBox( TextFormBox(
controller: _nameController, controller: _nameController,
header: "Name", header: "Name",
@@ -35,19 +46,14 @@ class AddLocalVersion extends StatelessWidget {
validator: (text) => checkVersion(text, _gameController.versions.value) validator: (text) => checkVersion(text, _gameController.versions.value)
), ),
const SizedBox(
height: 16.0
),
FileSelector( FileSelector(
label: "Path",
placeholder: "Type the game folder", placeholder: "Type the game folder",
windowTitle: "Select game folder", windowTitle: "Select game folder",
controller: _gamePathController, controller: _gamePathController,
validator: checkGameFolder, validator: checkGameFolder,
folder: true folder: true
), )
const SizedBox(height: 8.0),
], ],
), ),
buttons: [ buttons: [

View File

@@ -5,19 +5,20 @@ import 'package:async/async.dart';
import 'package:fluent_ui/fluent_ui.dart'; import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:reboot_launcher/src/controller/build_controller.dart';
import 'package:reboot_launcher/src/controller/game_controller.dart';
import 'package:reboot_launcher/src/dialog/dialog_button.dart';
import 'package:reboot_launcher/src/model/fortnite_version.dart'; import 'package:reboot_launcher/src/model/fortnite_version.dart';
import 'package:reboot_launcher/src/util/error.dart';
import 'package:reboot_launcher/src/util/os.dart'; import 'package:reboot_launcher/src/util/os.dart';
import 'package:reboot_launcher/src/util/build.dart'; import 'package:reboot_launcher/src/util/build.dart';
import 'package:reboot_launcher/src/widget/home/version_name_input.dart'; import 'package:reboot_launcher/src/ui/controller/game_controller.dart';
import 'package:universal_disk_space/universal_disk_space.dart'; import 'package:universal_disk_space/universal_disk_space.dart';
import '../util/checks.dart'; import '../../util/checks.dart';
import '../controller/build_controller.dart';
import '../widget/home/build_selector.dart'; import '../widget/home/build_selector.dart';
import '../widget/home/version_name_input.dart';
import '../widget/shared/file_selector.dart'; import '../widget/shared/file_selector.dart';
import 'dialog.dart'; import 'dialog.dart';
import 'dialog_button.dart';
class AddServerVersion extends StatefulWidget { class AddServerVersion extends StatefulWidget {
const AddServerVersion({Key? key}) : super(key: key); const AddServerVersion({Key? key}) : super(key: key);
@@ -39,7 +40,7 @@ class _AddServerVersionState extends State<AddServerVersion> {
DownloadStatus _status = DownloadStatus.form; DownloadStatus _status = DownloadStatus.form;
String _timeLeft = "00:00:00"; String _timeLeft = "00:00:00";
double _downloadProgress = 0; double _downloadProgress = 0;
Process? _manifestDownloadProcess; CancelableOperation? _manifestDownloadProcess;
CancelableOperation? _driveDownloadOperation; CancelableOperation? _driveDownloadOperation;
Object? _error; Object? _error;
StackTrace? _stackTrace; StackTrace? _stackTrace;
@@ -49,7 +50,7 @@ class _AddServerVersionState extends State<AddServerVersion> {
_fetchFuture = _buildController.builds != null _fetchFuture = _buildController.builds != null
? Future.value(true) ? Future.value(true)
: compute(fetchBuilds, null) : compute(fetchBuilds, null)
.then((value) => _buildController.builds = value); .then((value) => _buildController.builds = value);
_diskSpace = DiskSpace(); _diskSpace = DiskSpace();
_diskFuture = _diskSpace.scan() _diskFuture = _diskSpace.scan()
.then((_) => _updateFormDefaults()); .then((_) => _updateFormDefaults());
@@ -67,14 +68,12 @@ class _AddServerVersionState extends State<AddServerVersion> {
} }
void _onDisposed() { void _onDisposed() {
if (_status != DownloadStatus.downloading && if (_status != DownloadStatus.downloading) {
_status != DownloadStatus.extracting) {
return; return;
} }
if (_manifestDownloadProcess != null) { if (_manifestDownloadProcess != null) {
loadBinary("stop.bat", true).then( _manifestDownloadProcess?.cancel();
(value) => Process.runSync(value.path, []));
_buildController.cancelledDownload(true); _buildController.cancelledDownload(true);
return; return;
} }
@@ -129,13 +128,14 @@ class _AddServerVersionState extends State<AddServerVersion> {
void _startDownload(BuildContext context) async { void _startDownload(BuildContext context) async {
try { try {
setState(() => _status = DownloadStatus.downloading); setState(() => _status = DownloadStatus.downloading);
_manifestDownloadProcess = await downloadManifestBuild( var future = downloadArchiveBuild(
_buildController.selectedBuild.link, _buildController.selectedBuild.link,
_pathController.text, Directory(_pathController.text),
_onDownloadProgress _onDownloadProgress,
_onUnrar
); );
_manifestDownloadProcess!.exitCode future.then((value) => _onDownloadComplete());
.then((value) => _onDownloadComplete()); _manifestDownloadProcess = CancelableOperation.fromFuture(future);
} catch (exception, stackTrace) { } catch (exception, stackTrace) {
_onDownloadError(exception, stackTrace); _onDownloadError(exception, stackTrace);
} }
@@ -145,7 +145,7 @@ class _AddServerVersionState extends State<AddServerVersion> {
setState(() => _status = DownloadStatus.extracting); setState(() => _status = DownloadStatus.extracting);
} }
void _onDownloadComplete() { Future<void> _onDownloadComplete() async {
if (!mounted) { if (!mounted) {
return; return;
} }
@@ -160,6 +160,7 @@ class _AddServerVersionState extends State<AddServerVersion> {
} }
void _onDownloadError(Object? error, StackTrace? stackTrace) { void _onDownloadError(Object? error, StackTrace? stackTrace) {
print("Error");
if (!mounted) { if (!mounted) {
return; return;
} }
@@ -183,59 +184,78 @@ class _AddServerVersionState extends State<AddServerVersion> {
}); });
} }
Padding _createExtractingBody() { Widget _createDownloadBody() => Column(
return Padding( mainAxisSize: MainAxisSize.min,
padding: const EdgeInsets.only(bottom: 16), children: [
child: InfoLabel( Align(
label: "Extracting...", alignment: Alignment.centerLeft,
child: const SizedBox(width: double.infinity, child: ProgressBar())), child: Text(
); "Downloading...",
} style: FluentTheme.maybeOf(context)?.typography.body,
textAlign: TextAlign.start,
),
),
Widget _createDownloadBody() { const SizedBox(
return Column( height: 8.0,
mainAxisSize: MainAxisSize.min, ),
children: [
Align(
alignment: Alignment.centerLeft,
child: Text(
"Downloading...",
style: FluentTheme.maybeOf(context)?.typography.body,
textAlign: TextAlign.start,
),
),
const SizedBox(
height: 8,
),
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
"${_downloadProgress.round()}%", "${_downloadProgress.round()}%",
style: FluentTheme.maybeOf(context)?.typography.body, style: FluentTheme.maybeOf(context)?.typography.body,
), ),
Text( Text(
"Time left: $_timeLeft", "Time left: $_timeLeft",
style: FluentTheme.maybeOf(context)?.typography.body, style: FluentTheme.maybeOf(context)?.typography.body,
) )
], ],
), ),
const SizedBox( const SizedBox(
height: 8, height: 8.0,
), ),
SizedBox( SizedBox(
width: double.infinity, width: double.infinity,
child: ProgressBar(value: _downloadProgress.toDouble())), child: ProgressBar(value: _downloadProgress.toDouble())
const SizedBox( ),
height: 16,
) const SizedBox(
], height: 8.0,
); )
} ],
);
Widget _createExtractingBody() => Column(
mainAxisSize: MainAxisSize.min,
children: [
Align(
alignment: Alignment.centerLeft,
child: Text(
"Extracting...",
style: FluentTheme.maybeOf(context)?.typography.body,
textAlign: TextAlign.start,
),
),
const SizedBox(
height: 8.0,
),
const SizedBox(
width: double.infinity,
child: ProgressBar()
),
const SizedBox(
height: 8.0,
)
],
);
Widget _createFormDialog() { Widget _createFormDialog() {
return FutureBuilder( return FutureBuilder(
@@ -265,21 +285,19 @@ class _AddServerVersionState extends State<AddServerVersion> {
Widget _createFormBody() { Widget _createFormBody() {
return Column( return Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const BuildSelector(), const BuildSelector(),
const SizedBox(height: 16.0), const SizedBox(height: 20.0),
VersionNameInput(controller: _nameController), VersionNameInput(controller: _nameController),
const SizedBox(height: 16.0),
FileSelector( FileSelector(
label: "Path",
placeholder: "Type the download destination", placeholder: "Type the download destination",
windowTitle: "Select download destination", windowTitle: "Select download destination",
controller: _pathController, controller: _pathController,
validator: checkDownloadDestination, validator: checkDownloadDestination,
folder: true folder: true
), ),
const SizedBox(height: 8.0),
], ],
); );
} }

View File

@@ -2,7 +2,7 @@ import 'package:bitsdojo_window/bitsdojo_window.dart';
import 'package:clipboard/clipboard.dart'; import 'package:clipboard/clipboard.dart';
import 'package:fluent_ui/fluent_ui.dart'; import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:reboot_launcher/src/dialog/snackbar.dart'; import 'package:reboot_launcher/src/ui/dialog/snackbar.dart';
import 'dialog_button.dart'; import 'dialog_button.dart';

View File

@@ -1,8 +1,8 @@
import 'package:fluent_ui/fluent_ui.dart'; import 'package:fluent_ui/fluent_ui.dart';
import 'package:reboot_launcher/src/dialog/dialog.dart';
import 'package:reboot_launcher/src/model/fortnite_version.dart'; import 'package:reboot_launcher/src/model/fortnite_version.dart';
import '../../main.dart'; import '../../../main.dart';
import 'dialog.dart';
const String _unsupportedServerError = "The build you are currently using is not supported by Reboot. " const String _unsupportedServerError = "The build you are currently using is not supported by Reboot. "
"This means that you cannot currently host this version of the game. " "This means that you cannot currently host this version of the game. "

View File

@@ -1,32 +1,30 @@
import 'package:fluent_ui/fluent_ui.dart'; import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter/foundation.dart';
import 'package:get/get.dart';
import 'package:reboot_launcher/src/controller/server_controller.dart';
import 'package:reboot_launcher/src/controller/settings_controller.dart';
import 'package:reboot_launcher/src/dialog/dialog.dart';
import 'package:reboot_launcher/src/dialog/dialog_button.dart';
import 'package:reboot_launcher/src/dialog/snackbar.dart';
import 'package:reboot_launcher/src/model/server_type.dart'; import 'package:reboot_launcher/src/model/server_type.dart';
import 'package:reboot_launcher/src/util/os.dart'; import 'package:reboot_launcher/src/util/os.dart';
import 'package:reboot_launcher/src/ui/dialog/snackbar.dart';
import 'package:sync/semaphore.dart'; import 'package:sync/semaphore.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import '../../main.dart'; import '../../../main.dart';
import '../util/server.dart'; import '../../util/server.dart';
import '../controller/server_controller.dart';
import 'dialog.dart';
import 'dialog_button.dart';
extension ServerControllerDialog on ServerController { extension ServerControllerDialog on ServerController {
static Semaphore semaphore = Semaphore(); static Semaphore semaphore = Semaphore();
Future<bool> restart() async { Future<bool> restart(bool closeLocalPromptAutomatically) async {
await resetWinNat(); await resetWinNat();
return (!started() || await stop()) && await toggle(); return (!started() || await stop()) && await toggle(closeLocalPromptAutomatically);
} }
Future<bool> toggle() async { Future<bool> toggle(bool closeLocalPromptAutomatically) async {
try{ try{
semaphore.acquire(); semaphore.acquire();
if (type() == ServerType.local) { if (type() == ServerType.local) {
return _pingSelfInteractive(); return _pingSelfInteractive(closeLocalPromptAutomatically);
} }
var result = await _toggle(); var result = await _toggle();
@@ -35,7 +33,7 @@ extension ServerControllerDialog on ServerController {
return false; return false;
} }
var ping = await _pingSelfInteractive(); var ping = await _pingSelfInteractive(true);
if(!ping){ if(!ping){
started.value = false; started.value = false;
return false; return false;
@@ -79,7 +77,7 @@ extension ServerControllerDialog on ServerController {
try{ try{
switch(type()){ switch(type()){
case ServerType.embedded: case ServerType.embedded:
startServer(); startServer(detached());
break; break;
case ServerType.remote: case ServerType.remote:
var uriResult = await _pingRemoteInteractive(); var uriResult = await _pingRemoteInteractive();
@@ -166,15 +164,27 @@ extension ServerControllerDialog on ServerController {
} }
} }
Future<bool> _pingSelfInteractive() async { Future<bool> _pingSelfInteractive(bool closeAutomatically) async {
try { try {
var resultFuture = compute(pingSelf, port.text) Future<bool> ping() async {
.then((value) => value != null); for(var i = 0; i < 3; i++){
await showDialog<bool>( var result = await pingSelf(port.text);
if(result != null){
return true;
}else {
await Future.delayed(const Duration(seconds: 1));
}
}
return false;
}
var future = _waitFutureOrTime(ping());
var result = await showDialog<bool>(
context: appKey.currentContext!, context: appKey.currentContext!,
builder: (context) => builder: (context) =>
FutureBuilderDialog( FutureBuilderDialog(
future: _waitFutureOrTime(resultFuture), future: future,
loadingMessage: "Pinging ${type().id} server...", loadingMessage: "Pinging ${type().id} server...",
successfulBody: FutureBuilderDialog.ofMessage( successfulBody: FutureBuilderDialog.ofMessage(
"The ${type().id} server works correctly"), "The ${type().id} server works correctly"),
@@ -182,10 +192,10 @@ extension ServerControllerDialog on ServerController {
"The ${type().id} server doesn't work. Check the backend tab for misconfigurations and try again."), "The ${type().id} server doesn't work. Check the backend tab for misconfigurations and try again."),
errorMessageBuilder: ( errorMessageBuilder: (
exception) => "An error occurred while pining the ${type().id} server: $exception", exception) => "An error occurred while pining the ${type().id} server: $exception",
closeAutomatically: true closeAutomatically: closeAutomatically
) )
); ) ?? false;
return await resultFuture; return result && await future;
} catch (_) { } catch (_) {
return false; return false;
} }
@@ -193,12 +203,14 @@ extension ServerControllerDialog on ServerController {
Future<Uri?> _pingRemoteInteractive() async { Future<Uri?> _pingRemoteInteractive() async {
try { try {
var mainFuture = ping(host.text, port.text); var mainFuture = ping(host.text, port.text).then((value) => value != null);
await showDialog<bool>( var future = _waitFutureOrTime(mainFuture);
var result = await showDialog<bool>(
context: appKey.currentContext!, context: appKey.currentContext!,
builder: (context) => builder: (context) =>
FutureBuilderDialog( FutureBuilderDialog(
future: _waitFutureOrTime(mainFuture.then((value) => value != null)), future: future,
closeAutomatically: false,
loadingMessage: "Pinging remote server...", loadingMessage: "Pinging remote server...",
successfulBody: FutureBuilderDialog.ofMessage( successfulBody: FutureBuilderDialog.ofMessage(
"The server at ${host.text}:${port "The server at ${host.text}:${port
@@ -209,7 +221,7 @@ extension ServerControllerDialog on ServerController {
errorMessageBuilder: (exception) => "An error occurred while pining the server: $exception" errorMessageBuilder: (exception) => "An error occurred while pining the server: $exception"
) )
) ?? false; ) ?? false;
return await mainFuture; return result ? await future : null;
} catch (_) { } catch (_) {
return null; return null;
} }
@@ -259,60 +271,48 @@ extension ServerControllerDialog on ServerController {
); );
} }
void showUnexpectedServerError() { void showUnexpectedServerError() => showDialog(
showDialog( context: appKey.currentContext!,
context: appKey.currentContext!, builder: (context) => InfoDialog(
builder: (context) => InfoDialog( text: "The backend server died unexpectedly",
text: "The backend server died unexpectedly", buttons: [
buttons: [ DialogButton(
DialogButton( text: "Close",
text: "Close", type: ButtonType.secondary,
type: ButtonType.secondary, onTap: () => Navigator.of(context).pop(),
onTap: () => Navigator.of(context).pop(), ),
),
DialogButton( DialogButton(
text: "Open log", text: "Open log",
type: ButtonType.primary, type: ButtonType.primary,
onTap: () { onTap: () {
launchUrl(serverLogFile.uri); if(serverLogFile.existsSync()){
showMessage("No log is available");
}else {
launchUrl(serverLogFile.uri);
}
Navigator.of(context).pop(); Navigator.of(context).pop();
} }
), ),
], ],
) )
); );
}
void _showIllegalPortError() { void _showIllegalPortError() => showMessage("Illegal port for backend server, use only numbers");
showMessage("Illegal port for backend server, use only numbers");
}
void _showMissingPortError() { void _showMissingPortError() => showMessage("Missing port for backend server");
showMessage("Missing port for backend server");
}
void _showMissingHostError() { void _showMissingHostError() => showMessage("Missing the host name for backend server");
showMessage("Missing the host name for backend server");
}
}
Future<Object?> _showUnknownError(ServerResult result) { Future<Object?> _showUnknownError(ServerResult result) => showDialog(
return showDialog( context: appKey.currentContext!,
context: appKey.currentContext!, builder: (context) =>
builder: (context) => ErrorDialog(
ErrorDialog( exception: result.error ?? Exception("Unknown error"),
exception: result.error ?? Exception("Unknown error"), stackTrace: result.stackTrace,
stackTrace: result.stackTrace, errorMessageBuilder: (exception) => "Cannot start the backend: an unknown error occurred"
errorMessageBuilder: (exception) => "Cannot start the backend: an unknown error occurred" )
) );
);
}
Future<dynamic> _waitFutureOrTime(Future<bool> resultFuture) { Future<dynamic> _waitFutureOrTime(Future<bool> resultFuture) => Future.wait<bool>([resultFuture, Future.delayed(const Duration(seconds: 1)).then((value) => true)]).then((value) => value.reduce((f, s) => f && s));
return Future.wait<bool>([
resultFuture,
Future.delayed(const Duration(seconds: 1))
.then((value) => true)
]).then((value) => value.reduce((f, s) => f && s));
} }

View File

@@ -1,7 +1,6 @@
import 'package:fluent_ui/fluent_ui.dart'; import 'package:fluent_ui/fluent_ui.dart';
import '../../main.dart'; import '../../../main.dart';
import '../page/home_page.dart';
void showMessage(String text){ void showMessage(String text){
showSnackbar( showSnackbar(

View File

@@ -2,21 +2,16 @@ import 'package:bitsdojo_window/bitsdojo_window.dart' hide WindowBorder;
import 'package:fluent_ui/fluent_ui.dart'; import 'package:fluent_ui/fluent_ui.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:get/get_rx/src/rx_types/rx_types.dart'; import 'package:get/get_rx/src/rx_types/rx_types.dart';
import 'package:reboot_launcher/src/controller/game_controller.dart';
import 'package:reboot_launcher/src/controller/server_controller.dart';
import 'package:reboot_launcher/src/dialog/dialog.dart';
import 'package:reboot_launcher/src/dialog/dialog_button.dart';
import 'package:reboot_launcher/src/model/game_type.dart';
import 'package:reboot_launcher/src/page/settings_page.dart';
import 'package:reboot_launcher/src/page/launcher_page.dart';
import 'package:reboot_launcher/src/page/server_page.dart';
import 'package:reboot_launcher/src/util/os.dart'; import 'package:reboot_launcher/src/util/os.dart';
import 'package:reboot_launcher/src/widget/os/window_border.dart'; import 'package:reboot_launcher/src/ui/page/launcher_page.dart';
import 'package:reboot_launcher/src/widget/os/window_buttons.dart'; import 'package:reboot_launcher/src/ui/page/server_page.dart';
import 'package:reboot_launcher/src/ui/page/settings_page.dart';
import 'package:window_manager/window_manager.dart'; import 'package:window_manager/window_manager.dart';
import '../controller/settings_controller.dart'; import '../controller/settings_controller.dart';
import '../model/server_type.dart'; import '../widget/os/window_border.dart';
import '../widget/os/window_buttons.dart';
import 'hosting_page.dart';
import 'info_page.dart'; import 'info_page.dart';
class HomePage extends StatefulWidget { class HomePage extends StatefulWidget {
@@ -29,9 +24,7 @@ class HomePage extends StatefulWidget {
class _HomePageState extends State<HomePage> with WindowListener { class _HomePageState extends State<HomePage> with WindowListener {
static const double _defaultPadding = 12.0; static const double _defaultPadding = 12.0;
final GameController _gameController = Get.find<GameController>();
final SettingsController _settingsController = Get.find<SettingsController>(); final SettingsController _settingsController = Get.find<SettingsController>();
final ServerController _serverController = Get.find<ServerController>();
final GlobalKey _searchKey = GlobalKey(); final GlobalKey _searchKey = GlobalKey();
final FocusNode _searchFocusNode = FocusNode(); final FocusNode _searchFocusNode = FocusNode();
@@ -39,8 +32,8 @@ class _HomePageState extends State<HomePage> with WindowListener {
final Rxn<List<NavigationPaneItem>> _searchItems = Rxn(); final Rxn<List<NavigationPaneItem>> _searchItems = Rxn();
final RxBool _focused = RxBool(true); final RxBool _focused = RxBool(true);
final RxInt _index = RxInt(0); final RxInt _index = RxInt(0);
bool _navigated = false; final RxBool _nestedNavigation = RxBool(false);
bool _shouldMaximize = false; final GlobalKey<NavigatorState> _settingsNavigatorKey = GlobalKey();
@override @override
void initState() { void initState() {
@@ -91,35 +84,6 @@ class _HomePageState extends State<HomePage> with WindowListener {
super.onWindowMoved(); super.onWindowMoved();
} }
@override
void onWindowClose() async {
if(!_gameController.started() || !_serverController.started()) {
windowManager.destroy();
return;
}
showDialog(
context: context,
builder: (_) {
return InfoDialog(
text: "Closing the launcher while a backend is running may make the game not work correctly. Are you sure you want to proceed?",
buttons: [
DialogButton(
type: ButtonType.secondary,
text: "Don't close",
),
DialogButton(
type: ButtonType.primary,
onTap: () => windowManager.destroy(),
text: "Close",
),
],
);
}
);
}
@override @override
Widget build(BuildContext context) => Obx(() => Stack( Widget build(BuildContext context) => Obx(() => Stack(
children: [ children: [
@@ -130,7 +94,8 @@ class _HomePageState extends State<HomePage> with WindowListener {
), ),
appBar: NavigationAppBar( appBar: NavigationAppBar(
title: _draggableArea, title: _draggableArea,
actions: WindowTitleBar(focused: _focused()) actions: WindowTitleBar(focused: _focused()),
leading: _backButton
), ),
pane: NavigationPane( pane: NavigationPane(
selected: _selectedIndex, selected: _selectedIndex,
@@ -149,11 +114,34 @@ class _HomePageState extends State<HomePage> with WindowListener {
] ]
)); ));
void _onIndexChanged(int index) { Widget get _backButton => Obx(() {
_index.value = index; // ignore: unused_local_variable
_navigated = true; var ignored = _nestedNavigation.value;
return PaneItem(
icon: const Icon(FluentIcons.back, size: 14.0),
body: const SizedBox.shrink(),
).build(
context,
false,
_onBack(),
displayMode: PaneDisplayMode.compact
);
});
void Function()? _onBack() {
var navigator = _settingsNavigatorKey.currentState;
if(navigator == null || !navigator.mounted || !navigator.canPop()){
return null;
}
return () async {
Navigator.pop(navigator.context);
_nestedNavigation.value = false;
};
} }
void _onIndexChanged(int index) => _index.value = index;
TextBox get _autoSuggestBox => TextBox( TextBox get _autoSuggestBox => TextBox(
key: _searchKey, key: _searchKey,
controller: _searchController, controller: _searchController,
@@ -162,15 +150,7 @@ class _HomePageState extends State<HomePage> with WindowListener {
); );
GestureDetector get _draggableArea => GestureDetector( GestureDetector get _draggableArea => GestureDetector(
onDoubleTap: () { onDoubleTap: () => appWindow.maximizeOrRestore(),
if(!_shouldMaximize){
return;
}
appWindow.maximizeOrRestore();
_shouldMaximize = false;
},
onDoubleTapDown: (details) => _shouldMaximize = true,
onHorizontalDragStart: (event) => appWindow.startDragging(), onHorizontalDragStart: (event) => appWindow.startDragging(),
onVerticalDragStart: (event) => appWindow.startDragging() onVerticalDragStart: (event) => appWindow.startDragging()
); );
@@ -205,32 +185,29 @@ class _HomePageState extends State<HomePage> with WindowListener {
List<NavigationPaneItem> get _items => _searchItems() ?? [ List<NavigationPaneItem> get _items => _searchItems() ?? [
PaneItem( PaneItem(
title: const Text("Home"), title: const Text("Play"),
icon: const Icon(FluentIcons.game), icon: const Icon(FluentIcons.game),
body: const LauncherPage() body: const LauncherPage()
), ),
PaneItem(
title: const Text("Host"),
icon: const Icon(FluentIcons.server_processes),
body: const HostingPage()
),
PaneItem( PaneItem(
title: const Text("Backend"), title: const Text("Backend"),
icon: const Icon(FluentIcons.server_enviroment), icon: const Icon(FluentIcons.user_window),
body: ServerPage() body: ServerPage()
), ),
PaneItem( PaneItem(
title: const Text("Tutorial"), title: const Text("Tutorial"),
icon: const Icon(FluentIcons.info), icon: const Icon(FluentIcons.info),
body: const InfoPage(), body: InfoPage(_settingsNavigatorKey, _nestedNavigation)
onTap: _onTutorial
), ),
]; ];
void _onTutorial() {
if(!_navigated){
setState(() => _settingsController.scrollingDistance = 0);
}
_navigated = false;
}
String get searchValue => _searchController.text; String get searchValue => _searchController.text;
} }

View File

@@ -0,0 +1,105 @@
import 'package:fluent_ui/fluent_ui.dart';
import 'package:get/get.dart';
import 'package:reboot_launcher/src/ui/controller/hosting_controller.dart';
import 'package:reboot_launcher/src/ui/widget/home/launch_button.dart';
import 'package:reboot_launcher/src/ui/widget/home/version_selector.dart';
import 'package:reboot_launcher/src/ui/widget/shared/setting_tile.dart';
class HostingPage extends StatefulWidget {
const HostingPage(
{Key? key})
: super(key: key);
@override
State<HostingPage> createState() => _HostingPageState();
}
class _HostingPageState extends State<HostingPage> {
final HostingController _hostingController = Get.find<HostingController>();
@override
Widget build(BuildContext context) => Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.max,
children: [
const SizedBox(
width: double.infinity,
child: InfoBar(
title: Text("A window will pop up after the game server is started to modify its in-game settings"),
severity: InfoBarSeverity.info
),
),
const SizedBox(
height: 16.0
),
SettingTile(
title: "Game Server",
subtitle: "Provide basic information about your server",
expandedContentSpacing: 0,
expandedContent: [
SettingTile(
title: "Name",
subtitle: "The name of your game server",
isChild: true,
content: TextFormBox(
placeholder: "Name",
controller: _hostingController.name
)
),
SettingTile(
title: "Category",
subtitle: "The category of your game server",
isChild: true,
content: TextFormBox(
placeholder: "Category",
controller: _hostingController.category
)
),
SettingTile(
title: "Discoverable",
subtitle: "Make your server available to other players on the server browser",
isChild: true,
contentWidth: null,
content: Obx(() => ToggleSwitch(
checked: _hostingController.discoverable(),
onChanged: (value) => _hostingController.discoverable.value = value
))
),
],
),
const SizedBox(
height: 16.0,
),
SettingTile(
title: "Version",
subtitle: "Select the version of Fortnite you want to host",
content: const VersionSelector(),
expandedContent: [
SettingTile(
title: "Add a version from this PC's local storage",
subtitle: "Versions coming from your local disk are not guaranteed to work",
content: Button(
onPressed: () => VersionSelector.openAddDialog(context),
child: const Text("Add build"),
),
isChild: true
),
SettingTile(
title: "Download any version from the cloud",
subtitle: "A curated list of supported versions by Project Reboot",
content: Button(
onPressed: () => VersionSelector.openDownloadDialog(context),
child: const Text("Download"),
),
isChild: true
)
]
),
const Expanded(child: SizedBox()),
const LaunchButton(
host: true
)
],
);
}

View File

@@ -1,12 +1,15 @@
import 'package:fluent_ui/fluent_ui.dart'; import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import '../controller/settings_controller.dart'; import '../controller/settings_controller.dart';
import '../widget/shared/fluent_card.dart'; import '../widget/shared/fluent_card.dart';
class InfoPage extends StatefulWidget { class InfoPage extends StatefulWidget {
const InfoPage({Key? key}) : super(key: key); final GlobalKey<NavigatorState> navigatorKey;
final RxBool nestedNavigation;
const InfoPage(this.navigatorKey, this.nestedNavigation, {Key? key}) : super(key: key);
@override @override
State<InfoPage> createState() => _InfoPageState(); State<InfoPage> createState() => _InfoPageState();
@@ -36,7 +39,6 @@ class _InfoPageState extends State<InfoPage> {
"Once you are in game, click PLAY to enter in-game\n If this doesn't work open the Fortnite console by clicking the button above tab\n If nothing happens, make sure that your keyboard locale is set to English\n Type 'open TYPE_THE_IP' without the quotes, for example: open 85.182.12.1" "Once you are in game, click PLAY to enter in-game\n If this doesn't work open the Fortnite console by clicking the button above tab\n If nothing happens, make sure that your keyboard locale is set to English\n Type 'open TYPE_THE_IP' without the quotes, for example: open 85.182.12.1"
]; ];
final GlobalKey<NavigatorState> _navigatorKey = GlobalKey();
final SettingsController _settingsController = Get.find<SettingsController>(); final SettingsController _settingsController = Get.find<SettingsController>();
late final ScrollController _controller; late final ScrollController _controller;
@@ -57,7 +59,7 @@ class _InfoPageState extends State<InfoPage> {
@override @override
Widget build(BuildContext context) => Navigator( Widget build(BuildContext context) => Navigator(
key: _navigatorKey, key: widget.navigatorKey,
initialRoute: "home", initialRoute: "home",
onGenerateRoute: (settings) { onGenerateRoute: (settings) {
var screen = _createScreen(settings.name); var screen = _createScreen(settings.name);
@@ -69,6 +71,8 @@ class _InfoPageState extends State<InfoPage> {
); );
Widget _createScreen(String? name) { Widget _createScreen(String? name) {
WidgetsBinding.instance
.addPostFrameCallback((_) => widget.nestedNavigation.value = name != "home");
switch(name){ switch(name){
case "home": case "home":
return _homeScreen; return _homeScreen;
@@ -87,7 +91,7 @@ class _InfoPageState extends State<InfoPage> {
_createCardWidget( _createCardWidget(
text: "Play on someone else's server", text: "Play on someone else's server",
description: "If one of your friends is hosting a game server, click here", description: "If one of your friends is hosting a game server, click here",
onClick: () => _navigatorKey.currentState?.pushNamed("else") onClick: () => widget.navigatorKey.currentState?.pushNamed("else")
), ),
const SizedBox( const SizedBox(
@@ -97,7 +101,7 @@ class _InfoPageState extends State<InfoPage> {
_createCardWidget( _createCardWidget(
text: "Host your own server", text: "Host your own server",
description: "If you want to create your own server to invite your friends or to play around by yourself, click here", description: "If you want to create your own server to invite your friends or to play around by yourself, click here",
onClick: () => _navigatorKey.currentState?.pushNamed("own") onClick: () => widget.navigatorKey.currentState?.pushNamed("own")
) )
] ]
); );

Some files were not shown because too many files have changed in this diff Show More