diff --git a/CloudStorage/DefaultGame.ini b/CloudStorage/DefaultGame.ini index 5832dc1..ec5a454 100644 --- a/CloudStorage/DefaultGame.ini +++ b/CloudStorage/DefaultGame.ini @@ -6,3 +6,7 @@ bShouldRequestGeneralChatRooms=true bShouldJoinGlobalChat=true bShouldJoinFounderChat=true bIsAthenaGlobalChatEnabled=true + +[/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!"))) \ No newline at end of file diff --git a/README.md b/README.md index 4ad7060..703862e 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ - Fully working daily challenges system (New daily challenge every day, replacing daily challenges, etc...) - Seasonal Quests from Season 3 up to Season 19 (Can change) - Purchasable battle pass from Season 2 to Season 10 (Can change) +- Discovery Tab ## How to use? 1) Install [NodeJS](https://nodejs.org/en/) diff --git a/profiles/campaign.json b/profiles/campaign.json index bd7d07f..07135db 100644 --- a/profiles/campaign.json +++ b/profiles/campaign.json @@ -3302,11 +3302,11 @@ "xp_reward_scalar": 1, "challenge_linked_quest_given": "", "quest_pool": "", - "quest_state": "Claimed", + "quest_state": "Active", "last_state_change_time": "2020-01-25T18:55:36.618Z", "challenge_linked_quest_parent": "", "max_level_bonus": 0, - "completion_hbonboarding_namehomebase": 1, + "completion_hbonboarding_namehomebase": 0, "completion_hbonboarding_watchsatellitecine": 1, "xp": 0, "favorite": false @@ -3363,7 +3363,7 @@ "xp_reward_scalar": 1, "challenge_linked_quest_given": "", "quest_pool": "", - "quest_state": "Active", + "quest_state": "Inactive", "last_state_change_time": "2020-01-17T12:16:44.924Z", "challenge_linked_quest_parent": "", "completion_questcomplete_plankertonquest_launchrocket_d5": 0, @@ -5942,7 +5942,7 @@ "xp_reward_scalar": 1, "challenge_linked_quest_given": "", "quest_pool": "", - "quest_state": "Active", + "quest_state": "Inactive", "last_state_change_time": "2020-01-23T23:36:41.992Z", "challenge_linked_quest_parent": "", "max_level_bonus": 0, @@ -61446,7 +61446,7 @@ "xp_reward_scalar": 1, "challenge_linked_quest_given": "", "quest_pool": "", - "quest_state": "Active", + "quest_state": "Inactive", "bucket": "", "last_state_change_time": "2018-07-26T17:37:36.808Z", "challenge_linked_quest_parent": "", @@ -62724,7 +62724,7 @@ "xp_reward_scalar": 1, "challenge_linked_quest_given": "", "quest_pool": "", - "quest_state": "Active", + "quest_state": "Inactive", "bucket": "", "last_state_change_time": "2018-12-10T20:42:07.278Z", "challenge_linked_quest_parent": "", @@ -65023,80 +65023,80 @@ ], "collection_book": { "pages": [ - "CollectionBookPage:pageheroes_ninja", - "CollectionBookPage:pageheroes_outlander", "CollectionBookPage:pageheroes_commando", "CollectionBookPage:pageheroes_constructor", + "CollectionBookPage:pageheroes_ninja", + "CollectionBookPage:pageheroes_outlander", "CollectionBookPage:pagepeople_defenders", + "CollectionBookPage:pagepeople_survivors", "CollectionBookPage:pagepeople_leads", "CollectionBookPage:pagepeople_uniqueleads", - "CollectionBookPage:pagepeople_survivors", + "CollectionBookPage:pagespecial_winter2017_heroes", + "CollectionBookPage:pagespecial_halloween2017_heroes", + "CollectionBookPage:pagespecial_halloween2017_workers", + "CollectionBookPage:pagespecial_chinesenewyear2018_heroes", + "CollectionBookPage:pagespecial_springiton2018_people", + "CollectionBookPage:pagespecial_stormzonecyber_heroes", + "CollectionBookPage:pagespecial_blockbuster2018_heroes", + "CollectionBookPage:pagespecial_shadowops_heroes", + "CollectionBookPage:pagespecial_roadtrip2018_heroes", + "CollectionBookPage:pagespecial_wildwest_heroes", + "CollectionBookPage:pagespecial_stormzone_heroes", + "CollectionBookPage:pagespecial_scavenger_heroes", + "CollectionBookPage:pagemelee_axes_weapons", + "CollectionBookPage:pagemelee_axes_weapons_crystal", + "CollectionBookPage:pagemelee_clubs_weapons", + "CollectionBookPage:pagemelee_clubs_weapons_crystal", + "CollectionBookPage:pagemelee_scythes_weapons", + "CollectionBookPage:pagemelee_scythes_weapons_crystal", + "CollectionBookPage:pagemelee_spears_weapons", + "CollectionBookPage:pagemelee_spears_weapons_crystal", + "CollectionBookPage:pagemelee_swords_weapons", + "CollectionBookPage:pagemelee_swords_weapons_crystal", + "CollectionBookPage:pagemelee_tools_weapons", + "CollectionBookPage:pagemelee_tools_weapons_crystal", "CollectionBookPage:pageranged_assault_weapons", - "CollectionBookPage:pageranged_shotgun_weapons", - "CollectionBookPage:page_ranged_pistols_weapons", - "CollectionBookPage:pageranged_snipers_weapons", - "CollectionBookPage:pageranged_shotgun_weapons_crystal", "CollectionBookPage:pageranged_assault_weapons_crystal", + "CollectionBookPage:pageranged_shotgun_weapons", + "CollectionBookPage:pageranged_shotgun_weapons_crystal", + "CollectionBookPage:page_ranged_pistols_weapons", "CollectionBookPage:page_ranged_pistols_weapons_crystal", + "CollectionBookPage:pageranged_snipers_weapons", "CollectionBookPage:pageranged_snipers_weapons_crystal", + "CollectionBookPage:pageranged_explosive_weapons", "CollectionBookPage:pagetraps_wall", "CollectionBookPage:pagetraps_ceiling", "CollectionBookPage:pagetraps_floor", - "CollectionBookPage:pagemelee_swords_weapons", - "CollectionBookPage:pagemelee_swords_weapons_crystal", - "CollectionBookPage:pagemelee_axes_weapons", - "CollectionBookPage:pagemelee_axes_weapons_crystal", - "CollectionBookPage:pagemelee_scythes_weapons", - "CollectionBookPage:pagemelee_scythes_weapons_crystal", - "CollectionBookPage:pagemelee_clubs_weapons", - "CollectionBookPage:pagemelee_clubs_weapons_crystal", - "CollectionBookPage:pagemelee_spears_weapons", - "CollectionBookPage:pagemelee_spears_weapons_crystal", - "CollectionBookPage:pagemelee_tools_weapons", - "CollectionBookPage:pagemelee_tools_weapons_crystal", - "CollectionBookPage:pageranged_explosive_weapons", - "CollectionBookPage:pagespecial_springiton2018_people", - "CollectionBookPage:pagespecial_chinesenewyear2018_heroes", - "CollectionBookPage:pagespecial_weapons_chinesenewyear2018", - "CollectionBookPage:pagespecial_weapons_crystal_chinesenewyear2018", - "CollectionBookPage:pagespecial_stormzonecyber_heroes", - "CollectionBookPage:pagespecial_stormzonecyber_ranged", - "CollectionBookPage:pagespecial_stormzonecyber_melee", - "CollectionBookPage:pagespecial_stormzonecyber_ranged_crystal", - "CollectionBookPage:pagespecial_stormzonecyber_melee_crystal", - "CollectionBookPage:pagespecial_blockbuster2018_heroes", - "CollectionBookPage:pagespecial_blockbuster2018_ranged", - "CollectionBookPage:pagespecial_blockbuster2018_ranged_crystal", - "CollectionBookPage:pagespecial_roadtrip2018_heroes", - "CollectionBookPage:pagespecial_roadtrip2018_weapons", - "CollectionBookPage:pagespecial_roadtrip2018_weapons_crystal", - "CollectionBookPage:pagespecial_hydraulic", - "CollectionBookPage:pagespecial_hydraulic_crystal", - "CollectionBookPage:pagespecial_stormzone_heroes", - "CollectionBookPage:pagespecial_scavenger", - "CollectionBookPage:pagespecial_scavenger_crystal", - "CollectionBookPage:pagespecial_scavenger_heroes", - "CollectionBookPage:pagespecial_halloween2017_heroes", - "CollectionBookPage:pagespecial_halloween2017_workers", - "CollectionBookPage:pagespecial_weapons_ranged_stormzone2", - "CollectionBookPage:pagespecial_weapons_ranged_stormzone2_crystal", - "CollectionBookPage:pagespecial_weapons_melee_stormzone2", - "CollectionBookPage:pagespecial_weapons_melee_stormzone2_crystal", - "CollectionBookPage:pagespecial_winter2017_heroes", - "CollectionBookPage:pagespecial_weapons_ranged_winter2017", - "CollectionBookPage:pagespecial_weapons_ranged_winter2017_crystal", - "CollectionBookPage:pagespecial_weapons_melee_winter2017", - "CollectionBookPage:pagespecial_weapons_melee_winter2017_crystal", - "CollectionBookPage:pagespecial_winter2017_weapons", - "CollectionBookPage:pagespecial_winter2017_weapons_crystal", - "CollectionBookPage:pagespecial_ratrod_weapons", - "CollectionBookPage:pagespecial_ratrod_weapons_crystal", "CollectionBookPage:pagespecial_weapons_ranged_medieval", "CollectionBookPage:pagespecial_weapons_ranged_medieval_crystal", "CollectionBookPage:pagespecial_weapons_melee_medieval", "CollectionBookPage:pagespecial_weapons_melee_medieval_crystal", - "CollectionBookPage:pagespecial_shadowops_heroes", - "CollectionBookPage:pagespecial_wildwest_heroes" + "CollectionBookPage:pagespecial_winter2017_weapons", + "CollectionBookPage:pagespecial_winter2017_weapons_crystal", + "CollectionBookPage:pagespecial_ratrod_weapons", + "CollectionBookPage:pagespecial_ratrod_weapons_crystal", + "CollectionBookPage:pagespecial_weapons_ranged_winter2017", + "CollectionBookPage:pagespecial_weapons_ranged_winter2017_crystal", + "CollectionBookPage:pagespecial_weapons_melee_winter2017", + "CollectionBookPage:pagespecial_weapons_melee_winter2017_crystal", + "CollectionBookPage:pagespecial_weapons_chinesenewyear2018", + "CollectionBookPage:pagespecial_weapons_crystal_chinesenewyear2018", + "CollectionBookPage:pagespecial_stormzonecyber_ranged", + "CollectionBookPage:pagespecial_stormzonecyber_melee", + "CollectionBookPage:pagespecial_stormzonecyber_ranged_crystal", + "CollectionBookPage:pagespecial_stormzonecyber_melee_crystal", + "CollectionBookPage:pagespecial_blockbuster2018_ranged", + "CollectionBookPage:pagespecial_blockbuster2018_ranged_crystal", + "CollectionBookPage:pagespecial_roadtrip2018_weapons", + "CollectionBookPage:pagespecial_roadtrip2018_weapons_crystal", + "CollectionBookPage:pagespecial_weapons_ranged_stormzone2", + "CollectionBookPage:pagespecial_weapons_ranged_stormzone2_crystal", + "CollectionBookPage:pagespecial_weapons_melee_stormzone2", + "CollectionBookPage:pagespecial_weapons_melee_stormzone2_crystal", + "CollectionBookPage:pagespecial_hydraulic", + "CollectionBookPage:pagespecial_hydraulic_crystal", + "CollectionBookPage:pagespecial_scavenger", + "CollectionBookPage:pagespecial_scavenger_crystal" ], "maxBookXpLevelAchieved": 0 }, diff --git a/profiles/common_public.json b/profiles/common_public.json index 84cd8b0..f920090 100644 --- a/profiles/common_public.json +++ b/profiles/common_public.json @@ -10,7 +10,7 @@ "stats": { "attributes": { "banner_color": "DefaultColor15", - "homebase_name": "LawinServer", + "homebase_name": "", "banner_icon": "SurvivalBannerStonewoodComplete" } }, diff --git a/profiles/profile0.json b/profiles/profile0.json index 7035af8..efec79c 100644 --- a/profiles/profile0.json +++ b/profiles/profile0.json @@ -90,10 +90,10 @@ "7bfbc8f3-83ac-4ec7-88a2-b293526e0536": { "templateId": "Quest:homebaseonboarding", "attributes": { - "quest_state": "Claimed", + "quest_state": "Active", "last_state_change_time": "2017-08-29T21:05:57.087Z", "max_level_bonus": 0, - "completion_hbonboarding_namehomebase": 1, + "completion_hbonboarding_namehomebase": 0, "level": -1, "completion_hbonboarding_completezone": 1, "item_seen": false, @@ -148,7 +148,7 @@ "agresdarti48ut387t8bgbgfuckaa": { "templateId": "Quest:FoundersQuest_GetRewards_0_1", "attributes": { - "quest_state": "Active", + "quest_state": "Claimed", "last_state_change_time": "2017-08-29T21:05:57.087Z", "max_level_bonus": 0, "level": -1, @@ -35822,38 +35822,80 @@ "default_hero_squad_id": "", "collection_book": { "pages": [ - "CollectionBookPage:pageheroes_ninja", - "CollectionBookPage:pageheroes_outlander", "CollectionBookPage:pageheroes_commando", "CollectionBookPage:pageheroes_constructor", + "CollectionBookPage:pageheroes_ninja", + "CollectionBookPage:pageheroes_outlander", "CollectionBookPage:pagepeople_defenders", + "CollectionBookPage:pagepeople_survivors", "CollectionBookPage:pagepeople_leads", "CollectionBookPage:pagepeople_uniqueleads", - "CollectionBookPage:pagepeople_survivors", + "CollectionBookPage:pagespecial_winter2017_heroes", + "CollectionBookPage:pagespecial_halloween2017_heroes", + "CollectionBookPage:pagespecial_halloween2017_workers", + "CollectionBookPage:pagespecial_chinesenewyear2018_heroes", + "CollectionBookPage:pagespecial_springiton2018_people", + "CollectionBookPage:pagespecial_stormzonecyber_heroes", + "CollectionBookPage:pagespecial_blockbuster2018_heroes", + "CollectionBookPage:pagespecial_shadowops_heroes", + "CollectionBookPage:pagespecial_roadtrip2018_heroes", + "CollectionBookPage:pagespecial_wildwest_heroes", + "CollectionBookPage:pagespecial_stormzone_heroes", + "CollectionBookPage:pagespecial_scavenger_heroes", + "CollectionBookPage:pagemelee_axes_weapons", + "CollectionBookPage:pagemelee_axes_weapons_crystal", + "CollectionBookPage:pagemelee_clubs_weapons", + "CollectionBookPage:pagemelee_clubs_weapons_crystal", + "CollectionBookPage:pagemelee_scythes_weapons", + "CollectionBookPage:pagemelee_scythes_weapons_crystal", + "CollectionBookPage:pagemelee_spears_weapons", + "CollectionBookPage:pagemelee_spears_weapons_crystal", + "CollectionBookPage:pagemelee_swords_weapons", + "CollectionBookPage:pagemelee_swords_weapons_crystal", + "CollectionBookPage:pagemelee_tools_weapons", + "CollectionBookPage:pagemelee_tools_weapons_crystal", "CollectionBookPage:pageranged_assault_weapons", - "CollectionBookPage:pageranged_shotgun_weapons", - "CollectionBookPage:page_ranged_pistols_weapons", - "CollectionBookPage:pageranged_snipers_weapons", - "CollectionBookPage:pageranged_shotgun_weapons_crystal", "CollectionBookPage:pageranged_assault_weapons_crystal", + "CollectionBookPage:pageranged_shotgun_weapons", + "CollectionBookPage:pageranged_shotgun_weapons_crystal", + "CollectionBookPage:page_ranged_pistols_weapons", "CollectionBookPage:page_ranged_pistols_weapons_crystal", + "CollectionBookPage:pageranged_snipers_weapons", "CollectionBookPage:pageranged_snipers_weapons_crystal", + "CollectionBookPage:pageranged_explosive_weapons", "CollectionBookPage:pagetraps_wall", "CollectionBookPage:pagetraps_ceiling", "CollectionBookPage:pagetraps_floor", - "CollectionBookPage:pagemelee_swords_weapons", - "CollectionBookPage:pagemelee_swords_weapons_crystal", - "CollectionBookPage:pagemelee_axes_weapons", - "CollectionBookPage:pagemelee_axes_weapons_crystal", - "CollectionBookPage:pagemelee_scythes_weapons", - "CollectionBookPage:pagemelee_scythes_weapons_crystal", - "CollectionBookPage:pagemelee_clubs_weapons", - "CollectionBookPage:pagemelee_clubs_weapons_crystal", - "CollectionBookPage:pagemelee_spears_weapons", - "CollectionBookPage:pagemelee_spears_weapons_crystal", - "CollectionBookPage:pagemelee_tools_weapons", - "CollectionBookPage:pagemelee_tools_weapons_crystal", - "CollectionBookPage:pageranged_explosive_weapons" + "CollectionBookPage:pagespecial_weapons_ranged_medieval", + "CollectionBookPage:pagespecial_weapons_ranged_medieval_crystal", + "CollectionBookPage:pagespecial_weapons_melee_medieval", + "CollectionBookPage:pagespecial_weapons_melee_medieval_crystal", + "CollectionBookPage:pagespecial_winter2017_weapons", + "CollectionBookPage:pagespecial_winter2017_weapons_crystal", + "CollectionBookPage:pagespecial_ratrod_weapons", + "CollectionBookPage:pagespecial_ratrod_weapons_crystal", + "CollectionBookPage:pagespecial_weapons_ranged_winter2017", + "CollectionBookPage:pagespecial_weapons_ranged_winter2017_crystal", + "CollectionBookPage:pagespecial_weapons_melee_winter2017", + "CollectionBookPage:pagespecial_weapons_melee_winter2017_crystal", + "CollectionBookPage:pagespecial_weapons_chinesenewyear2018", + "CollectionBookPage:pagespecial_weapons_crystal_chinesenewyear2018", + "CollectionBookPage:pagespecial_stormzonecyber_ranged", + "CollectionBookPage:pagespecial_stormzonecyber_melee", + "CollectionBookPage:pagespecial_stormzonecyber_ranged_crystal", + "CollectionBookPage:pagespecial_stormzonecyber_melee_crystal", + "CollectionBookPage:pagespecial_blockbuster2018_ranged", + "CollectionBookPage:pagespecial_blockbuster2018_ranged_crystal", + "CollectionBookPage:pagespecial_roadtrip2018_weapons", + "CollectionBookPage:pagespecial_roadtrip2018_weapons_crystal", + "CollectionBookPage:pagespecial_weapons_ranged_stormzone2", + "CollectionBookPage:pagespecial_weapons_ranged_stormzone2_crystal", + "CollectionBookPage:pagespecial_weapons_melee_stormzone2", + "CollectionBookPage:pagespecial_weapons_melee_stormzone2_crystal", + "CollectionBookPage:pagespecial_hydraulic", + "CollectionBookPage:pagespecial_hydraulic_crystal", + "CollectionBookPage:pagespecial_scavenger", + "CollectionBookPage:pagespecial_scavenger_crystal" ], "maxBookXpLevelAchieved": 0 }, @@ -35912,7 +35954,7 @@ "monthly_purchases": {}, "xp": 0, "homebase": { - "townName": "LawinServer", + "townName": "", "bannerIconId": "OT11Banner", "bannerColorId": "DefaultColor15", "flagPattern": -1, diff --git a/responses/CloudDir/LawinServer.chunk b/responses/CloudDir/LawinServer.chunk index 0f3123a..9cdf877 100644 Binary files a/responses/CloudDir/LawinServer.chunk and b/responses/CloudDir/LawinServer.chunk differ diff --git a/structure/main.js b/structure/main.js index dbbb937..286db97 100644 --- a/structure/main.js +++ b/structure/main.js @@ -52,11 +52,11 @@ express.get("/fortnite/api/game/v2/friendcodes/*/epic", async (req, res) => { express.get("/launcher/api/public/distributionpoints/", async (req, res) => { res.json({ "distributions": [ + "https://epicgames-download1.akamaized.net/", "https://download.epicgames.com/", "https://download2.epicgames.com/", "https://download3.epicgames.com/", "https://download4.epicgames.com/", - "https://epicgames-download1.akamaized.net/", "https://lawinserver.ol.epicgames.com/" ] }); @@ -219,6 +219,89 @@ express.get("/fortnite/api/game/v2/leaderboards/cohort/*", async (req, res) => { res.json([]) }) +express.get("/fortnite/api/game/v2/homebase/allowed-name-chars", async (req, res) => { + res.json({ + "ranges": [ + 48, + 57, + 65, + 90, + 97, + 122, + 192, + 255, + 260, + 265, + 280, + 281, + 286, + 287, + 304, + 305, + 321, + 324, + 346, + 347, + 350, + 351, + 377, + 380, + 1024, + 1279, + 1536, + 1791, + 4352, + 4607, + 11904, + 12031, + 12288, + 12351, + 12352, + 12543, + 12592, + 12687, + 12800, + 13055, + 13056, + 13311, + 13312, + 19903, + 19968, + 40959, + 43360, + 43391, + 44032, + 55215, + 55216, + 55295, + 63744, + 64255, + 65072, + 65103, + 65281, + 65470, + 131072, + 173791, + 194560, + 195103 + ], + "singlePoints": [ + 32, + 39, + 45, + 46, + 95, + 126 + ], + "excludedPoints": [ + 208, + 215, + 222, + 247 + ] + }) +}) + express.post("/datarouter/api/v1/public/data", async (req, res) => { res.status(204); res.end(); diff --git a/structure/mcp.js b/structure/mcp.js index 4acdde1..8b5beec 100644 --- a/structure/mcp.js +++ b/structure/mcp.js @@ -181,6 +181,75 @@ express.post("/fortnite/api/game/v2/profile/*/client/SetHomebaseBanner", async ( res.end(); }); +// Set Homebase Name STW +express.post("/fortnite/api/game/v2/profile/*/client/SetHomebaseName", async (req, res) => { + const profile = require(`./../profiles/${req.query.profileId || "profile0"}.json`); + + // do not change any of these or you will end up breaking it + var ApplyProfileChanges = []; + var BaseRevision = profile.rvn || 0; + var QueryRevision = req.query.rvn || -1; + var StatChanged = false; + + if (req.body.homebaseName) { + switch (req.query.profileId) { + + case "profile0": + profile.stats.attributes.homebase.townName = req.body.homebaseName; + StatChanged = true; + break; + + case "common_public": + profile.stats.attributes.homebase_name = req.body.homebaseName; + StatChanged = true; + break; + + } + } + + if (StatChanged == true) { + profile.rvn += 1; + profile.commandRevision += 1; + + if (req.query.profileId == "profile0") { + ApplyProfileChanges.push({ + "changeType": "statModified", + "name": "homebase", + "value": profile.stats.attributes.homebase + }) + } + + if (req.query.profileId == "common_public") { + ApplyProfileChanges.push({ + "changeType": "statModified", + "name": "homebase_name", + "value": profile.stats.attributes.homebase_name + }) + } + + fs.writeFileSync(`./profiles/${req.query.profileId || "profile0"}.json`, JSON.stringify(profile, null, 2)); + } + + // this doesn't work properly on version v12.20 and above but whatever + if (QueryRevision != BaseRevision) { + ApplyProfileChanges = [{ + "changeType": "fullProfileUpdate", + "profile": profile + }]; + } + + res.json({ + "profileRevision": profile.rvn || 0, + "profileId": req.query.profileId || "profile0", + "profileChangesBaseRevision": BaseRevision, + "profileChanges": ApplyProfileChanges, + "profileCommandRevision": profile.commandRevision || 0, + "serverTime": new Date().toISOString(), + "responseVersion": 1 + }) + res.end(); +}); + // Buy skill tree perk STW express.post("/fortnite/api/game/v2/profile/*/client/PurchaseHomebaseNode", async (req, res) => { const profile = require(`./../profiles/${req.query.profileId || "profile0"}.json`); @@ -1123,6 +1192,94 @@ express.post("/fortnite/api/game/v2/profile/*/client/ClaimLoginReward", async (r res.end(); }); +// Update quest client objectives STW +express.post("/fortnite/api/game/v2/profile/*/client/UpdateQuestClientObjectives", async (req, res) => { + const profile = require(`./../profiles/${req.query.profileId || "campaign"}.json`); + + // do not change any of these or you will end up breaking it + var ApplyProfileChanges = []; + var BaseRevision = profile.rvn || 0; + var QueryRevision = req.query.rvn || -1; + var StatChanged = false; + + if (req.body.advance) { + for (var i in req.body.advance) { + var Quest = []; + var bIncomplete = false; + + for (var x in profile.items) { + if (profile.items[x].templateId.toLowerCase().startsWith("quest:")) { + for (var y in profile.items[x].attributes) { + if (y.toLowerCase() == `completion_${req.body.advance[i].statName}`) { + Quest = x; + } + } + } + } + + if (Quest) { + profile.items[Quest].attributes[`completion_${req.body.advance[i].statName}`] = req.body.advance[i].count; + + ApplyProfileChanges.push({ + "changeType": "itemAttrChanged", + "itemId": Quest, + "attributeName": `completion_${req.body.advance[i].statName}`, + "attributeValue": req.body.advance[i].count + }) + + if (profile.items[Quest].attributes.quest_state.toLowerCase() != "claimed") { + for (var x in profile.items[Quest].attributes) { + if (x.toLowerCase().startsWith("completion_")) { + if (profile.items[Quest].attributes[x] == 0) { + bIncomplete = true; + } + } + } + + if (bIncomplete == false) { + profile.items[Quest].attributes.quest_state = "Claimed"; + + ApplyProfileChanges.push({ + "changeType": "itemAttrChanged", + "itemId": Quest, + "attributeName": "quest_state", + "attributeValue": profile.items[Quest].attributes.quest_state + }) + } + } + + StatChanged = true; + } + } + } + + if (StatChanged == true) { + profile.rvn += 1; + profile.commandRevision += 1; + + fs.writeFileSync(`./profiles/${req.query.profileId || "campaign"}.json`, JSON.stringify(profile, null, 2)); + } + + // this doesn't work properly on version v12.20 and above but whatever + if (QueryRevision != BaseRevision) { + ApplyProfileChanges = [{ + "changeType": "fullProfileUpdate", + "profile": profile + }]; + } + + res.json({ + "profileRevision": profile.rvn || 0, + "profileId": req.query.profileId || "campaign", + "profileChangesBaseRevision": BaseRevision, + "profileChanges": ApplyProfileChanges, + "profileCommandRevision": profile.commandRevision || 0, + "serverTime": new Date().toISOString(), + "responseVersion": 1 + }) + res.end(); +}); + // Equip team perk STW express.post("/fortnite/api/game/v2/profile/*/client/AssignTeamPerkToLoadout", async (req, res) => { const profile = require("./../profiles/campaign.json");