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(webui): improve incarnon stuff (#3845)

Closes #3841 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/3845 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>

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

代码差异

4 个文件 +67 -38
Modified src/controllers/api/evolveWeaponController.ts +2 -0
@@ -5,6 +5,7 @@ import { getJSONfromString } from "../../helpers/stringHelpers.ts";
5 5 import type { WeaponTypeInternal } from "../../services/itemDataService.ts";
6 6 import { getRecipe } from "../../services/itemDataService.ts";
7 7 import { EquipmentFeatures } from "../../types/equipmentTypes.ts";
8 import { broadcastInventoryUpdate } from "../../services/wsService.ts";
8 9
9 10 export const evolveWeaponController: RequestHandler = async (req, res) => {
10 11 const accountId = await getAccountIdForRequest(req);
@@ -48,6 +49,7 @@ export const evolveWeaponController: RequestHandler = async (req, res) => {
48 49
49 50 await inventory.save();
50 51 res.end();
52 broadcastInventoryUpdate(req); // let webui know that the feature flag has changed (for detailed view)
51 53 };
52 54
53 55 interface IEvolveWeaponRequest {
Modified src/controllers/custom/equipmentFeaturesController.ts +11 -4
@@ -3,7 +3,7 @@ import { getAccountIdForRequest } from "../../services/loginService.ts";
3 3 import type { TEquipmentKey } from "../../types/inventoryTypes/inventoryTypes.ts";
4 4 import { getInventory } from "../../services/inventoryService.ts";
5 5 import { EquipmentFeatures } from "../../types/equipmentTypes.ts";
6 import { sendWsBroadcastTo } from "../../services/wsService.ts";
6 import { broadcastInventoryUpdate, sendWsBroadcastTo } from "../../services/wsService.ts";
7 7 import allIncarnons from "../../../static/fixed_responses/allIncarnonList.json" with { type: "json" };
8 8 import { ExportWeapons } from "warframe-public-export-plus";
9 9
@@ -15,17 +15,19 @@ export const equipmentFeaturesController: RequestHandler = async (req, res) => {
15 15 `${category} EvolutionProgress unlockDoubleCapacityPotatoesEverywhere unlockExilusEverywhere unlockArcanesEverywhere`
16 16 );
17 17 const bit = Number(req.query.bit) as EquipmentFeatures;
18 if (
18 /*if (
19 19 (inventory.unlockDoubleCapacityPotatoesEverywhere && bit === EquipmentFeatures.DOUBLE_CAPACITY) ||
20 20 (inventory.unlockExilusEverywhere && bit === EquipmentFeatures.UTILITY_SLOT) ||
21 21 (inventory.unlockArcanesEverywhere &&
22 22 (bit === EquipmentFeatures.ARCANE_SLOT || bit === EquipmentFeatures.SECOND_ARCANE_SLOT))
23 23 ) {
24 24 res.status(400).end();
25 }
25 return;
26 }*/
26 27 const item = inventory[category].id(req.query.ItemId as string);
27 28 if (item) {
28 29 item.Features ??= 0;
30 let requesterNeedsInventoryUpdateToo = false;
29 31 if (bit == EquipmentFeatures.INCARNON_GENESIS) {
30 32 const parentName = ExportWeapons[item.ItemType].parentName;
31 33 let searchType: string | undefined;
@@ -45,6 +47,7 @@ export const equipmentFeaturesController: RequestHandler = async (req, res) => {
45 47 Rank: 1,
46 48 ItemType: searchType
47 49 });
50 requesterNeedsInventoryUpdateToo = true;
48 51 }
49 52 } else {
50 53 res.status(400).end();
@@ -52,8 +55,12 @@ export const equipmentFeaturesController: RequestHandler = async (req, res) => {
52 55 }
53 56 item.Features ^= bit;
54 57 await inventory.save();
55 sendWsBroadcastTo(accountId, { sync_inventory: true });
56 58 res.status(200).end();
59 if (requesterNeedsInventoryUpdateToo) {
60 sendWsBroadcastTo(accountId, { sync_inventory: true, update_inventory: true });
61 } else {
62 broadcastInventoryUpdate(req);
63 }
57 64 } else {
58 65 res.status(400).end();
59 66 }
Modified src/controllers/custom/setEvolutionProgressController.ts +22 -19
@@ -5,31 +5,34 @@ import { broadcastInventoryUpdate } from "../../services/wsService.ts";
5 5
6 6 export const setEvolutionProgressController: RequestHandler = async (req, res) => {
7 7 const accountId = await getAccountIdForRequest(req);
8 const inventory = await getInventory(accountId);
9 const payload = req.body as ISetEvolutionProgressRequest;
8 const inventory = await getInventory(accountId, "EvolutionProgress");
9 const payload = req.body as ISetEvolutionProgressRequest[];
10 10
11 11 inventory.EvolutionProgress ??= [];
12 payload.forEach(element => {
13 const entry = inventory.EvolutionProgress!.find(entry => entry.ItemType === element.ItemType);
14
15 if (entry) {
16 entry.Progress = 0;
17 entry.Rank = element.Rank;
12 for (const element of payload) {
13 if ("Delete" in element) {
14 const index = inventory.EvolutionProgress.findIndex(entry => entry.ItemType == element.ItemType);
15 if (index != -1) {
16 inventory.EvolutionProgress.splice(index, 1);
17 }
18 18 } else {
19 inventory.EvolutionProgress!.push({
20 Progress: 0,
21 Rank: element.Rank,
22 ItemType: element.ItemType
23 });
19 const entry = inventory.EvolutionProgress.find(entry => entry.ItemType == element.ItemType);
20 if (entry) {
21 entry.Progress = 0;
22 entry.Rank = element.Rank;
23 } else {
24 inventory.EvolutionProgress.push({
25 Progress: 0,
26 Rank: element.Rank,
27 ItemType: element.ItemType
28 });
29 }
24 30 }
25 });
31 }
26 32
27 33 await inventory.save();
28 res.end();
34 res.json(inventory.EvolutionProgress);
29 35 broadcastInventoryUpdate(req);
30 36 };
31 37
32 type ISetEvolutionProgressRequest = {
33 ItemType: string;
34 Rank: number;
35 }[];
38 type ISetEvolutionProgressRequest = { ItemType: string } & ({ Rank: number } | { Delete: true });
Modified static/webui/script.js +32 -15
@@ -1261,7 +1261,7 @@ const U5Mods = [
1261 1261 "/Lotus/Upgrades/Modules/Crafted/IncendiaryRifleMod"
1262 1262 ];
1263 1263
1264 single.getRoute("/webui/inventory").on("beforeload", async function () {
1264 async function populateInventoryRoute() {
1265 1265 const [data, itemMap] = await Promise.all([awaitAuthz().then(getInventoryData), window.itemListPromise]);
1266 1266
1267 1267 document.getElementById("typeName-tab").classList.remove("active");
@@ -1479,31 +1479,44 @@ single.getRoute("/webui/inventory").on("beforeload", async function () {
1479 1479
1480 1480 document.getElementById("EvolutionProgress-list").innerHTML = "";
1481 1481 data.EvolutionProgress?.forEach(item => {
1482 const maxRank = permanentEvolutionWeapons.has(item.ItemType) ? 5 : 4;
1482 1483 const tr = document.createElement("tr");
1483 1484 tr.setAttribute("data-item-type", item.ItemType);
1484 1485 {
1485 1486 const td = document.createElement("td");
1486 1487 td.textContent = itemMap[item.ItemType]?.name ?? item.ItemType;
1487 1488 if (item.Rank != null) {
1488 td.textContent += " | " + loc("code_rank") + ": [" + item.Rank + "/5]";
1489 td.textContent += " | " + loc("code_rank") + ": [" + item.Rank + "/" + maxRank + "]";
1489 1490 }
1490 1491 tr.appendChild(td);
1491 1492 }
1492 1493 {
1493 1494 const td = document.createElement("td");
1494 1495 td.classList = "text-end text-nowrap";
1495 if (item.Rank < 5) {
1496 if (item.Rank < maxRank) {
1496 1497 const a = document.createElement("a");
1497 1498 a.href = "#";
1498 1499 a.onclick = function (event) {
1499 1500 event.preventDefault();
1500 setEvolutionProgress([{ ItemType: item.ItemType, Rank: 5 }]);
1501 setEvolutionProgress([{ ItemType: item.ItemType, Rank: maxRank }]);
1501 1502 };
1502 1503 a.title = loc("code_maxRank");
1503 1504 a.innerHTML = icons.arrowUp;
1504 1505
1505 1506 td.appendChild(a);
1506 1507 }
1508 if (item.Rank < maxRank) {
1509 const a = document.createElement("a");
1510 a.href = "#";
1511 a.onclick = function (event) {
1512 event.preventDefault();
1513 setEvolutionProgress([{ ItemType: item.ItemType, Rank: item.Rank + 1 }]);
1514 };
1515 a.title = loc("code_rankUp");
1516 a.innerHTML = icons.angleUp;
1517
1518 td.appendChild(a);
1519 }
1507 1520 if ((permanentEvolutionWeapons.has(item.ItemType) && item.Rank > 0) || item.Rank > 1) {
1508 1521 const a = document.createElement("a");
1509 1522 a.href = "#";
@@ -1516,15 +1529,15 @@ single.getRoute("/webui/inventory").on("beforeload", async function () {
1516 1529
1517 1530 td.appendChild(a);
1518 1531 }
1519 if (item.Rank < 5) {
1532 {
1520 1533 const a = document.createElement("a");
1521 1534 a.href = "#";
1522 1535 a.onclick = function (event) {
1523 1536 event.preventDefault();
1524 setEvolutionProgress([{ ItemType: item.ItemType, Rank: item.Rank + 1 }]);
1537 setEvolutionProgress([{ ItemType: item.ItemType, Delete: true }]);
1525 1538 };
1526 a.title = loc("code_rankUp");
1527 a.innerHTML = icons.angleUp;
1539 a.title = loc("code_remove");
1540 a.innerHTML = icons.trash;
1528 1541
1529 1542 td.appendChild(a);
1530 1543 }
@@ -1809,7 +1822,8 @@ single.getRoute("/webui/inventory").on("beforeload", async function () {
1809 1822 }
1810 1823 document.getElementById("QuestKeys-list").appendChild(tr);
1811 1824 });
1812 });
1825 }
1826 single.getRoute("/webui/inventory").on("beforeload", populateInventoryRoute);
1813 1827
1814 1828 single.getRoute("/webui/mods").on("beforeload", async function () {
1815 1829 const [data, itemMap] = await Promise.all([awaitAuthz().then(getInventoryData), window.itemListPromise]);
@@ -2070,7 +2084,7 @@ dictPromise.then(() => {
2070 2084 butDiv.appendChild(a);
2071 2085 }
2072 2086 }
2073 if (!["EvolutionProgress", "Boosters"].includes(cardType)) {
2087 if (cardType != "Boosters") {
2074 2088 const a = document.createElement("a");
2075 2089 a.href = "#";
2076 2090 a.onclick = function (event) {
@@ -2831,10 +2845,11 @@ function maxRankAllEvolutions() {
2831 2845 const requests = [];
2832 2846
2833 2847 data.EvolutionProgress.forEach(item => {
2834 if (item.Rank < 5) {
2848 const maxRank = permanentEvolutionWeapons.has(item.ItemType) ? 5 : 4;
2849 if (item.Rank < maxRank) {
2835 2850 requests.push({
2836 2851 ItemType: item.ItemType,
2837 Rank: 5
2852 Rank: maxRank
2838 2853 });
2839 2854 }
2840 2855 });
@@ -3027,7 +3042,8 @@ function equipmentFeatures(category, oid, bit) {
3027 3042 $.get(
3028 3043 "/custom/equipmentFeatures?" + window.authz + "&ItemId=" + oid + "&Category=" + category + "&bit=" + bit
3029 3044 ).done(function () {
3030 updateInventory();
3045 inventory_data[category].find(x => x.ItemId.$oid == oid).Features ^= bit;
3046 // toggle state was already updated when the user clicked on it
3031 3047 });
3032 3048 });
3033 3049 }
@@ -3071,8 +3087,9 @@ function setEvolutionProgress(requests) {
3071 3087 contentType: "application/json",
3072 3088 data: JSON.stringify(requests)
3073 3089 });
3074 req.done(() => {
3075 updateInventory();
3090 req.done(newEvolutionProgress => {
3091 inventory_data.EvolutionProgress = newEvolutionProgress;
3092 populateInventoryRoute();
3076 3093 resolve();
3077 3094 });
3078 3095 });