XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFESpaceNinjaServer

chore: replace unlockAllMissions config with an account cheats button (#2241)

This way, mission completion rewards are given. This is especially import for junction rewards like quest keys (Closes #2229). Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2241 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>

bf12f90c
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

9 个文件 +91 -76
Modified config.json.example +0 -1
@@ -13,7 +13,6 @@
13 13 "skipTutorial": false,
14 14 "skipAllDialogue": false,
15 15 "unlockAllScans": false,
16 "unlockAllMissions": false,
17 16 "infiniteCredits": false,
18 17 "infinitePlatinum": false,
19 18 "infiniteEndo": false,
Modified src/controllers/api/inventoryController.ts +2 -26
@@ -6,13 +6,7 @@ import allDialogue from "@/static/fixed_responses/allDialogue.json";
6 6 import { ILoadoutDatabase } from "@/src/types/saveLoadoutTypes";
7 7 import { IInventoryClient, IShipInventory, equipmentKeys } from "@/src/types/inventoryTypes/inventoryTypes";
8 8 import { IPolarity, ArtifactPolarity, EquipmentFeatures } from "@/src/types/inventoryTypes/commonInventoryTypes";
9 import {
10 ExportCustoms,
11 ExportFlavour,
12 ExportRegions,
13 ExportResources,
14 ExportVirtuals
15 } from "warframe-public-export-plus";
9 import { ExportCustoms, ExportFlavour, ExportResources, ExportVirtuals } from "warframe-public-export-plus";
16 10 import { applyCheatsToInfestedFoundry, handleSubsumeCompletion } from "@/src/services/infestedFoundryService";
17 11 import {
18 12 addMiscItems,
@@ -22,7 +16,7 @@ import {
22 16 generateRewardSeed
23 17 } from "@/src/services/inventoryService";
24 18 import { logger } from "@/src/utils/logger";
25 import { catBreadHash } from "@/src/helpers/stringHelpers";
19 import { addString, catBreadHash } from "@/src/helpers/stringHelpers";
26 20 import { Types } from "mongoose";
27 21 import { getNemesisManifest } from "@/src/helpers/nemesisHelpers";
28 22 import { getPersonalRooms } from "@/src/services/personalRoomsService";
@@ -167,18 +161,6 @@ export const getInventoryResponse = async (
167 161 }
168 162 }
169 163
170 if (config.unlockAllMissions) {
171 inventoryResponse.Missions = [];
172 for (const tag of Object.keys(ExportRegions)) {
173 inventoryResponse.Missions.push({
174 Completes: 1,
175 Tier: 1,
176 Tag: tag
177 });
178 }
179 addString(inventoryResponse.NodeIntrosCompleted, "TeshinHardModeUnlocked");
180 }
181
182 164 if (config.unlockAllShipDecorations) {
183 165 inventoryResponse.ShipDecorations = [];
184 166 for (const [uniqueName, item] of Object.entries(ExportResources)) {
@@ -362,12 +344,6 @@ const allEudicoHeistJobs = [
362 344 "/Lotus/Types/Gameplay/Venus/Jobs/Heists/HeistProfitTakerBountyFour"
363 345 ];
364 346
365 const addString = (arr: string[], str: string): void => {
366 if (arr.indexOf(str) == -1) {
367 arr.push(str);
368 }
369 };
370
371 347 const getExpRequiredForMr = (rank: number): number => {
372 348 if (rank <= 30) {
373 349 return 2500 * rank * rank;
Added src/controllers/custom/completeAllMissionsController.ts +34 -0
@@ -0,0 +1,34 @@
1 import { addString } from "@/src/helpers/stringHelpers";
2 import { getInventory } from "@/src/services/inventoryService";
3 import { getAccountIdForRequest } from "@/src/services/loginService";
4 import { addFixedLevelRewards } from "@/src/services/missionInventoryUpdateService";
5 import { handleStoreItemAcquisition } from "@/src/services/purchaseService";
6 import { IMissionReward } from "@/src/types/missionTypes";
7 import { RequestHandler } from "express";
8 import { ExportRegions } from "warframe-public-export-plus";
9
10 export const completeAllMissionsController: RequestHandler = async (req, res) => {
11 const accountId = await getAccountIdForRequest(req);
12 const inventory = await getInventory(accountId);
13 const MissionRewards: IMissionReward[] = [];
14 for (const [tag, node] of Object.entries(ExportRegions)) {
15 if (!inventory.Missions.find(x => x.Tag == tag)) {
16 inventory.Missions.push({
17 Completes: 1,
18 Tier: 1,
19 Tag: tag
20 });
21
22 if (node.missionReward) {
23 console.log(node.missionReward);
24 addFixedLevelRewards(node.missionReward, inventory, MissionRewards);
25 }
26 }
27 }
28 for (const reward of MissionRewards) {
29 await handleStoreItemAcquisition(reward.StoreItem, inventory, reward.ItemCount, undefined, true);
30 }
31 addString(inventory.NodeIntrosCompleted, "TeshinHardModeUnlocked");
32 await inventory.save();
33 res.end();
34 };
Modified src/helpers/stringHelpers.ts +6 -0
@@ -54,3 +54,9 @@ export const regexEscape = (str: string): string => {
54 54 str = str.split("}").join("\\}");
55 55 return str;
56 56 };
57
58 export const addString = (arr: string[], str: string): void => {
59 if (arr.indexOf(str) == -1) {
60 arr.push(str);
61 }
62 };
Modified src/routes/custom.ts +2 -0
@@ -12,6 +12,7 @@ import { ircDroppedController } from "@/src/controllers/custom/ircDroppedControl
12 12 import { unlockAllIntrinsicsController } from "@/src/controllers/custom/unlockAllIntrinsicsController";
13 13 import { addMissingMaxRankModsController } from "@/src/controllers/custom/addMissingMaxRankModsController";
14 14 import { webuiFileChangeDetectedController } from "@/src/controllers/custom/webuiFileChangeDetectedController";
15 import { completeAllMissionsController } from "@/src/controllers/custom/completeAllMissionsController";
15 16
16 17 import { createAccountController } from "@/src/controllers/custom/createAccountController";
17 18 import { createMessageController } from "@/src/controllers/custom/createMessageController";
@@ -40,6 +41,7 @@ customRouter.get("/ircDropped", ircDroppedController);
40 41 customRouter.get("/unlockAllIntrinsics", unlockAllIntrinsicsController);
41 42 customRouter.get("/addMissingMaxRankMods", addMissingMaxRankModsController);
42 43 customRouter.get("/webuiFileChangeDetected", webuiFileChangeDetectedController);
44 customRouter.get("/completeAllMissions", completeAllMissionsController);
43 45
44 46 customRouter.post("/createAccount", createAccountController);
45 47 customRouter.post("/createMessage", createMessageController);
Modified src/services/configService.ts +0 -1
@@ -19,7 +19,6 @@ export interface IConfig {
19 19 skipTutorial?: boolean;
20 20 skipAllDialogue?: boolean;
21 21 unlockAllScans?: boolean;
22 unlockAllMissions?: boolean;
23 22 infiniteCredits?: boolean;
24 23 infinitePlatinum?: boolean;
25 24 infiniteEndo?: boolean;
Modified src/services/missionInventoryUpdateService.ts +1 -1
@@ -1367,7 +1367,7 @@ export const addFixedLevelRewards = (
1367 1367 if (rewards.countedItems) {
1368 1368 for (const item of rewards.countedItems) {
1369 1369 MissionRewards.push({
1370 StoreItem: `/Lotus/StoreItems${item.ItemType.substring("Lotus/".length)}`,
1370 StoreItem: toStoreItem(item.ItemType),
1371 1371 ItemCount: item.ItemCount
1372 1372 });
1373 1373 }
Modified static/webui/index.html +2 -7
@@ -452,9 +452,6 @@
452 452 <button class="btn btn-success" onclick="maxRankAllEquipment(['SentinelWeapons']);" data-loc="inventory_bulkRankUpSentinelWeapons"></button>
453 453 <button class="btn btn-success" onclick="maxRankAllEvolutions();" data-loc="inventory_bulkRankUpEvolutionProgress"></button>
454 454 </div>
455 <div class="mb-2 d-flex flex-wrap gap-2">
456 <button class="btn btn-primary" onclick="debounce(doMaxPlexus);" data-loc="inventory_maxPlexus"></button>
457 </div>
458 455 </div>
459 456 </div>
460 457 </div>
@@ -587,10 +584,6 @@
587 584 <input class="form-check-input" type="checkbox" id="unlockAllScans" />
588 585 <label class="form-check-label" for="unlockAllScans" data-loc="cheats_unlockAllScans"></label>
589 586 </div>
590 <div class="form-check">
591 <input class="form-check-input" type="checkbox" id="unlockAllMissions" />
592 <label class="form-check-label" for="unlockAllMissions" data-loc="cheats_unlockAllMissions"></label>
593 </div>
594 587 <div class="form-check">
595 588 <input class="form-check-input" type="checkbox" id="infiniteCredits" />
596 589 <label class="form-check-label" for="infiniteCredits" data-loc="cheats_infiniteCredits"></label>
@@ -782,9 +775,11 @@
782 775 <h5 class="card-header" data-loc="cheats_account"></h5>
783 776 <div class="card-body">
784 777 <div class="mb-2 d-flex flex-wrap gap-2">
778 <button class="btn btn-primary" onclick="debounce(doUnlockAllMissions);" data-loc="cheats_unlockAllMissions"></button>
785 779 <button class="btn btn-primary" onclick="doUnlockAllFocusSchools();" data-loc="cheats_unlockAllFocusSchools"></button>
786 780 <button class="btn btn-primary" onclick="doHelminthUnlockAll();" data-loc="cheats_helminthUnlockAll"></button>
787 781 <button class="btn btn-primary" onclick="doIntrinsicsUnlockAll();" data-loc="cheats_intrinsicsUnlockAll"></button>
782 <button class="btn btn-primary" onclick="debounce(doMaxPlexus);" data-loc="inventory_maxPlexus"></button>
788 783 </div>
789 784 <form class="mt-2" onsubmit="doChangeSupportedSyndicate(); return false;">
790 785 <label class="form-label" for="changeSyndicate" data-loc="cheats_changeSupportedSyndicate"></label>
Modified static/webui/script.js +44 -40
@@ -114,11 +114,9 @@ function doLogin() {
114 114 window.registerSubmit = false;
115 115 }
116 116
117 function revalidateAuthz(succ_cb) {
118 getWebSocket().then(() => {
119 // We have a websocket connection, so authz should be good.
120 succ_cb();
121 });
117 async function revalidateAuthz() {
118 await getWebSocket();
119 // We have a websocket connection, so authz should be good.
122 120 }
123 121
124 122 function logout() {
@@ -138,7 +136,7 @@ function doLogout() {
138 136 function renameAccount() {
139 137 const newname = window.prompt(loc("code_changeNameConfirm"));
140 138 if (newname) {
141 revalidateAuthz(() => {
139 revalidateAuthz().then(() => {
142 140 fetch("/custom/renameAccount?" + window.authz + "&newname=" + newname).then(() => {
143 141 $(".displayname").text(newname);
144 142 updateLocElements();
@@ -149,7 +147,7 @@ function renameAccount() {
149 147
150 148 function deleteAccount() {
151 149 if (window.confirm(loc("code_deleteAccountConfirm"))) {
152 revalidateAuthz(() => {
150 revalidateAuthz().then(() => {
153 151 fetch("/custom/deleteAccount?" + window.authz).then(() => {
154 152 logout();
155 153 single.loadRoute("/webui/"); // Show login screen
@@ -649,7 +647,7 @@ function updateInventory() {
649 647 a.href = "#";
650 648 a.onclick = function (event) {
651 649 event.preventDefault();
652 revalidateAuthz(() => {
650 revalidateAuthz().then(() => {
653 651 const promises = [];
654 652 if (item.XP < maxXP) {
655 653 promises.push(addGearExp(category, item.ItemId.$oid, maxXP - item.XP));
@@ -1239,7 +1237,7 @@ function doAcquireEquipment(category) {
1239 1237 .focus();
1240 1238 return;
1241 1239 }
1242 revalidateAuthz(() => {
1240 revalidateAuthz().then(() => {
1243 1241 const req = $.post({
1244 1242 url: "/custom/addItems?" + window.authz,
1245 1243 contentType: "application/json",
@@ -1366,7 +1364,7 @@ function doAcquireModularEquipment(category, WeaponType) {
1366 1364 }
1367 1365 });
1368 1366 if (category == "KubrowPets") Parts.unshift(WeaponType);
1369 revalidateAuthz(() => {
1367 revalidateAuthz().then(() => {
1370 1368 const req = $.post({
1371 1369 url: "/api/modularWeaponCrafting.php?" + window.authz,
1372 1370 contentType: "application/octet-stream",
@@ -1419,7 +1417,7 @@ $("input[list]").on("input", function () {
1419 1417 });
1420 1418
1421 1419 function dispatchAddItemsRequestsBatch(requests) {
1422 revalidateAuthz(() => {
1420 revalidateAuthz().then(() => {
1423 1421 const req = $.post({
1424 1422 url: "/custom/addItems?" + window.authz,
1425 1423 contentType: "application/json",
@@ -1463,7 +1461,7 @@ function addMissingEvolutionProgress() {
1463 1461 }
1464 1462
1465 1463 function maxRankAllEvolutions() {
1466 revalidateAuthz(() => {
1464 revalidateAuthz().then(() => {
1467 1465 const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1");
1468 1466 req.done(data => {
1469 1467 const requests = [];
@@ -1487,7 +1485,7 @@ function maxRankAllEvolutions() {
1487 1485 }
1488 1486
1489 1487 function maxRankAllEquipment(categories) {
1490 revalidateAuthz(() => {
1488 revalidateAuthz().then(() => {
1491 1489 const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1");
1492 1490 req.done(data => {
1493 1491 window.itemListPromise.then(itemMap => {
@@ -1561,7 +1559,7 @@ function addGearExp(category, oid, xp) {
1561 1559 }
1562 1560
1563 1561 function sendBatchGearExp(data) {
1564 revalidateAuthz(() => {
1562 revalidateAuthz().then(() => {
1565 1563 $.post({
1566 1564 url: "/custom/addXp?" + window.authz,
1567 1565 contentType: "application/json",
@@ -1574,7 +1572,7 @@ function sendBatchGearExp(data) {
1574 1572 }
1575 1573
1576 1574 function renameGear(category, oid, name) {
1577 revalidateAuthz(() => {
1575 revalidateAuthz().then(() => {
1578 1576 if (category == "KubrowPets") {
1579 1577 $.post({
1580 1578 url: "/api/renamePet.php?" + window.authz + "&webui=1",
@@ -1602,7 +1600,7 @@ function renameGear(category, oid, name) {
1602 1600
1603 1601 function disposeOfGear(category, oid) {
1604 1602 if (category == "KubrowPets") {
1605 revalidateAuthz(() => {
1603 revalidateAuthz().then(() => {
1606 1604 $.post({
1607 1605 url: "/api/releasePet.php?" + window.authz,
1608 1606 contentType: "application/octet-stream",
@@ -1624,7 +1622,7 @@ function disposeOfGear(category, oid) {
1624 1622 Count: 0
1625 1623 }
1626 1624 ];
1627 revalidateAuthz(() => {
1625 revalidateAuthz().then(() => {
1628 1626 $.post({
1629 1627 url: "/api/sell.php?" + window.authz,
1630 1628 contentType: "text/plain",
@@ -1646,7 +1644,7 @@ function disposeOfItems(category, type, count) {
1646 1644 Count: count
1647 1645 }
1648 1646 ];
1649 revalidateAuthz(() => {
1647 revalidateAuthz().then(() => {
1650 1648 $.post({
1651 1649 url: "/api/sell.php?" + window.authz,
1652 1650 contentType: "text/plain",
@@ -1656,7 +1654,7 @@ function disposeOfItems(category, type, count) {
1656 1654 }
1657 1655
1658 1656 function gildEquipment(category, oid) {
1659 revalidateAuthz(() => {
1657 revalidateAuthz().then(() => {
1660 1658 $.post({
1661 1659 url: "/api/gildWeapon.php?" + window.authz + "&ItemId=" + oid + "&Category=" + category,
1662 1660 contentType: "application/octet-stream",
@@ -1670,7 +1668,7 @@ function gildEquipment(category, oid) {
1670 1668 }
1671 1669
1672 1670 function maturePet(oid, revert) {
1673 revalidateAuthz(() => {
1671 revalidateAuthz().then(() => {
1674 1672 $.post({
1675 1673 url: "/api/maturePet.php?" + window.authz,
1676 1674 contentType: "application/octet-stream",
@@ -1685,7 +1683,7 @@ function maturePet(oid, revert) {
1685 1683 }
1686 1684
1687 1685 function setEvolutionProgress(requests) {
1688 revalidateAuthz(() => {
1686 revalidateAuthz().then(() => {
1689 1687 const req = $.post({
1690 1688 url: "/custom/setEvolutionProgress?" + window.authz,
1691 1689 contentType: "application/json",
@@ -1705,7 +1703,7 @@ function doAcquireMiscItems() {
1705 1703 }
1706 1704 const count = parseInt($("#miscitem-count").val());
1707 1705 if (count != 0) {
1708 revalidateAuthz(() => {
1706 revalidateAuthz().then(() => {
1709 1707 $.post({
1710 1708 url: "/custom/addItems?" + window.authz,
1711 1709 contentType: "application/json",
@@ -1746,7 +1744,7 @@ function doAcquireRiven() {
1746 1744 return;
1747 1745 }
1748 1746 const uniqueName = "/Lotus/Upgrades/Mods/Randomized/" + $("#addriven-type").val();
1749 revalidateAuthz(() => {
1747 revalidateAuthz().then(() => {
1750 1748 // Add riven type to inventory
1751 1749 $.post({
1752 1750 url: "/custom/addItems?" + window.authz,
@@ -1793,7 +1791,7 @@ $("#addriven-fingerprint").on("input", () => {
1793 1791 });
1794 1792
1795 1793 function setFingerprint(ItemType, ItemId, fingerprint) {
1796 revalidateAuthz(() => {
1794 revalidateAuthz().then(() => {
1797 1795 $.post({
1798 1796 url: "/api/artifacts.php?" + window.authz,
1799 1797 contentType: "text/plain",
@@ -1821,7 +1819,7 @@ function doAcquireMod() {
1821 1819 }
1822 1820 const count = parseInt($("#mod-count").val());
1823 1821 if (count != 0) {
1824 revalidateAuthz(() => {
1822 revalidateAuthz().then(() => {
1825 1823 $.post({
1826 1824 url: "/custom/addItems?" + window.authz,
1827 1825 contentType: "application/json",
@@ -1898,7 +1896,7 @@ single.getRoute("/webui/cheats").on("beforeload", function () {
1898 1896 );
1899 1897 } else {
1900 1898 if ((await res.text()) == "Log-in expired") {
1901 revalidateAuthz(() => {
1899 revalidateAuthz().then(() => {
1902 1900 if (single.getCurrentPath() == "/webui/cheats") {
1903 1901 single.loadRoute("/webui/cheats");
1904 1902 }
@@ -1915,7 +1913,7 @@ single.getRoute("/webui/cheats").on("beforeload", function () {
1915 1913 });
1916 1914
1917 1915 function doUnlockAllFocusSchools() {
1918 revalidateAuthz(() => {
1916 revalidateAuthz().then(() => {
1919 1917 $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1").done(async data => {
1920 1918 const missingFocusUpgrades = {
1921 1919 "/Lotus/Upgrades/Focus/Attack/AttackFocusAbility": true,
@@ -1966,13 +1964,13 @@ function unlockFocusSchool(upgradeType) {
1966 1964 }
1967 1965
1968 1966 function doHelminthUnlockAll() {
1969 revalidateAuthz(() => {
1967 revalidateAuthz().then(() => {
1970 1968 $.post("/api/infestedFoundry.php?" + window.authz + "&mode=custom_unlockall");
1971 1969 });
1972 1970 }
1973 1971
1974 1972 function doIntrinsicsUnlockAll() {
1975 revalidateAuthz(() => {
1973 revalidateAuthz().then(() => {
1976 1974 $.get("/custom/unlockAllIntrinsics?" + window.authz);
1977 1975 });
1978 1976 }
@@ -1984,7 +1982,7 @@ function doAddAllMods() {
1984 1982 }
1985 1983 modsAll.delete("/Lotus/Upgrades/Mods/Fusers/LegendaryModFuser");
1986 1984
1987 revalidateAuthz(() => {
1985 revalidateAuthz().then(() => {
1988 1986 const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1");
1989 1987 req.done(data => {
1990 1988 for (const modOwned of data.RawUpgrades) {
@@ -2016,7 +2014,7 @@ function doAddAllMods() {
2016 2014 }
2017 2015
2018 2016 function doRemoveUnrankedMods() {
2019 revalidateAuthz(() => {
2017 revalidateAuthz().then(() => {
2020 2018 const req = $.get("/api/inventory.php?" + window.authz + "&xpBasedLevelCapDisabled=1");
2021 2019 req.done(inventory => {
2022 2020 window.itemListPromise.then(itemMap => {
@@ -2041,7 +2039,7 @@ function doRemoveUnrankedMods() {
2041 2039 }
2042 2040
2043 2041 function doAddMissingMaxRankMods() {
2044 revalidateAuthz(() => {
2042 revalidateAuthz().then(() => {
2045 2043 fetch("/custom/addMissingMaxRankMods?" + window.authz).then(() => {
2046 2044 updateInventory();
2047 2045 });
@@ -2063,7 +2061,7 @@ function doPushArchonCrystalUpgrade() {
2063 2061 $("[list='datalist-archonCrystalUpgrades']").addClass("is-invalid").focus();
2064 2062 return;
2065 2063 }
2066 revalidateAuthz(() => {
2064 revalidateAuthz().then(() => {
2067 2065 $.get(
2068 2066 "/custom/pushArchonCrystalUpgrade?" +
2069 2067 window.authz +
@@ -2081,7 +2079,7 @@ function doPushArchonCrystalUpgrade() {
2081 2079 }
2082 2080
2083 2081 function doPopArchonCrystalUpgrade(type) {
2084 revalidateAuthz(() => {
2082 revalidateAuthz().then(() => {
2085 2083 $.get(
2086 2084 "/custom/popArchonCrystalUpgrade?" +
2087 2085 window.authz +
@@ -2096,7 +2094,7 @@ function doPopArchonCrystalUpgrade(type) {
2096 2094 }
2097 2095
2098 2096 function doImport() {
2099 revalidateAuthz(() => {
2097 revalidateAuthz().then(() => {
2100 2098 $.post({
2101 2099 url: "/custom/import?" + window.authz,
2102 2100 contentType: "application/json",
@@ -2113,7 +2111,7 @@ function doImport() {
2113 2111 function doChangeSupportedSyndicate() {
2114 2112 const uniqueName = document.getElementById("changeSyndicate").value;
2115 2113
2116 revalidateAuthz(() => {
2114 revalidateAuthz().then(() => {
2117 2115 $.get("/api/setSupportedSyndicate.php?" + window.authz + "&syndicate=" + uniqueName).done(function () {
2118 2116 updateInventory();
2119 2117 });
@@ -2121,7 +2119,7 @@ function doChangeSupportedSyndicate() {
2121 2119 }
2122 2120
2123 2121 function doAddCurrency(currency) {
2124 revalidateAuthz(() => {
2122 revalidateAuthz().then(() => {
2125 2123 $.post({
2126 2124 url: "/custom/addCurrency?" + window.authz,
2127 2125 contentType: "application/json",
@@ -2136,7 +2134,7 @@ function doAddCurrency(currency) {
2136 2134 }
2137 2135
2138 2136 function doQuestUpdate(operation, itemType) {
2139 revalidateAuthz(() => {
2137 revalidateAuthz().then(() => {
2140 2138 $.post({
2141 2139 url: "/custom/manageQuests?" + window.authz + "&operation=" + operation + "&itemType=" + itemType,
2142 2140 contentType: "application/json"
@@ -2147,7 +2145,7 @@ function doQuestUpdate(operation, itemType) {
2147 2145 }
2148 2146
2149 2147 function doBulkQuestUpdate(operation) {
2150 revalidateAuthz(() => {
2148 revalidateAuthz().then(() => {
2151 2149 $.post({
2152 2150 url: "/custom/manageQuests?" + window.authz + "&operation=" + operation,
2153 2151 contentType: "application/json"
@@ -2245,7 +2243,7 @@ function handleModularSelection(category) {
2245 2243 }
2246 2244
2247 2245 function setBooster(ItemType, ExpiryDate, callback) {
2248 revalidateAuthz(() => {
2246 revalidateAuthz().then(() => {
2249 2247 $.post({
2250 2248 url: "/custom/setBooster?" + window.authz,
2251 2249 contentType: "application/json",
@@ -2335,3 +2333,9 @@ async function doMaxPlexus() {
2335 2333 toast(loc("code_noEquipmentToRankUp"));
2336 2334 }
2337 2335 }
2336
2337 async function doUnlockAllMissions() {
2338 await revalidateAuthz();
2339 await fetch("/custom/completeAllMissions?" + window.authz);
2340 updateInventory();
2341 }