From 499ca23ffb9ea97f590e7ba52e24f666e33605f9 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Wed, 2 Jul 2025 14:14:13 -0700 Subject: [PATCH 1/6] chore(webui): update inventory when equipment was forma'd (#2383) Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2383 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com> --- src/controllers/api/upgradesController.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/controllers/api/upgradesController.ts b/src/controllers/api/upgradesController.ts index 2a376b4a..7b112ce3 100644 --- a/src/controllers/api/upgradesController.ts +++ b/src/controllers/api/upgradesController.ts @@ -13,6 +13,7 @@ import { getRecipeByResult } from "@/src/services/itemDataService"; import { IInventoryChanges } from "@/src/types/purchaseTypes"; import { addInfestedFoundryXP, applyCheatsToInfestedFoundry } from "@/src/services/infestedFoundryService"; import { config } from "@/src/services/configService"; +import { sendWsBroadcastTo } from "@/src/services/webService"; export const upgradesController: RequestHandler = async (req, res) => { const accountId = await getAccountIdForRequest(req); @@ -120,6 +121,7 @@ export const upgradesController: RequestHandler = async (req, res) => { setSlotPolarity(item, operation.PolarizeSlot, operation.PolarizeValue); item.Polarized ??= 0; item.Polarized += 1; + sendWsBroadcastTo(accountId, { update_inventory: true }); // webui may need to to re-add "max rank" button break; } case "/Lotus/Types/Items/MiscItems/ModSlotUnlocker": { From dd6ae8898fc4fc76d95e7b263a406a390882d850 Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Wed, 2 Jul 2025 14:14:19 -0700 Subject: [PATCH 2/6] chore(webui): move max rank button before detailed view link (#2384) Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2384 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com> --- static/webui/script.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/static/webui/script.js b/static/webui/script.js index 34b39060..9755f08e 100644 --- a/static/webui/script.js +++ b/static/webui/script.js @@ -651,6 +651,7 @@ function updateInventory() { { const td = document.createElement("td"); td.classList = "text-end text-nowrap"; + let maxXP = Math.pow(uniqueLevelCaps[item.ItemType] ?? 30, 2) * 1000; if ( category != "Suits" && @@ -663,7 +664,6 @@ function updateInventory() { ) { maxXP /= 2; } - let anyExaltedMissingXP = false; if (item.XP >= maxXP && item.ItemType in itemMap && "exalted" in itemMap[item.ItemType]) { for (const exaltedType of itemMap[item.ItemType].exalted) { @@ -677,13 +677,6 @@ function updateInventory() { } } } - - if (["Suits", "LongGuns", "Pistols", "Melee", "SpaceGuns", "SpaceMelee"].includes(category)) { - const a = document.createElement("a"); - a.href = "/webui/detailedView?productCategory=" + category + "&itemId=" + item.ItemId.$oid; - a.innerHTML = ``; - td.appendChild(a); - } if (item.XP < maxXP || anyExaltedMissingXP) { const a = document.createElement("a"); a.href = "#"; @@ -721,6 +714,14 @@ function updateInventory() { a.innerHTML = ``; td.appendChild(a); } + + if (["Suits", "LongGuns", "Pistols", "Melee", "SpaceGuns", "SpaceMelee"].includes(category)) { + const a = document.createElement("a"); + a.href = "/webui/detailedView?productCategory=" + category + "&itemId=" + item.ItemId.$oid; + a.innerHTML = ``; + td.appendChild(a); + } + if (!(item.Features & 8) && modularWeapons.includes(item.ItemType)) { const a = document.createElement("a"); a.href = "#"; From e26d2635fb0133367ec94a5c376b9f2902ddb7ed Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Wed, 2 Jul 2025 14:15:50 -0700 Subject: [PATCH 3/6] chore(webui): fix inconsistent % chance strings (#2385) Closes #2381 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2385 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com> --- scripts/update-translations.js | 2 +- static/webui/translations/de.js | 14 +++++++------- static/webui/translations/en.js | 14 +++++++------- static/webui/translations/fr.js | 2 +- static/webui/translations/ru.js | 14 +++++++------- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/scripts/update-translations.js b/scripts/update-translations.js index 0f1f56ec..d0526b71 100644 --- a/scripts/update-translations.js +++ b/scripts/update-translations.js @@ -31,7 +31,7 @@ fs.readdirSync("../static/webui/translations").forEach(file => { const strings = extractStrings(line); if (Object.keys(strings).length > 0) { Object.entries(strings).forEach(([key, value]) => { - if (targetStrings.hasOwnProperty(key)) { + if (targetStrings.hasOwnProperty(key) && !targetStrings[key].startsWith("[UNTRANSLATED] ")) { fs.writeSync(fileHandle, ` ${key}: \`${targetStrings[key]}\`,\n`); } else { fs.writeSync(fileHandle, ` ${key}: \`[UNTRANSLATED] ${value}\`,\n`); diff --git a/static/webui/translations/de.js b/static/webui/translations/de.js index 73d78a66..89bcc218 100644 --- a/static/webui/translations/de.js +++ b/static/webui/translations/de.js @@ -282,19 +282,19 @@ dict = { upgrade_AvatarLootRadar: `[UNTRANSLATED] +7m Loot Radar`, upgrade_WeaponAmmoMax: `[UNTRANSLATED] +15% Ammo Max`, upgrade_EnemyArmorReductionAura: `[UNTRANSLATED] -3% Enemy Armor`, - upgrade_OnExecutionAmmo: `[UNTRANSLATED] 100% Primary and Secondary Magazine Refill on Mercy`, - upgrade_OnExecutionHealthDrop: `[UNTRANSLATED] 100% chance to drop a Health Orb on Mercy`, - upgrade_OnExecutionEnergyDrop: `[UNTRANSLATED] 50% chance to drop an Energy Orb on Mercy`, - upgrade_OnFailHackReset: `[UNTRANSLATED] +50% to retry on Hacking failure`, - upgrade_DamageReductionOnHack: `[UNTRANSLATED] 75% Damage Reduction while Hacking`, + upgrade_OnExecutionAmmo: `[UNTRANSLATED] +100% Primary and Secondary Magazine Refill on Mercy`, + upgrade_OnExecutionHealthDrop: `[UNTRANSLATED] +100% Health Orb Chance on Mercy`, + upgrade_OnExecutionEnergyDrop: `[UNTRANSLATED] +50% Energy Orb Chance on Mercy`, + upgrade_OnFailHackReset: `[UNTRANSLATED] +50% Hacking Retry Chance`, + upgrade_DamageReductionOnHack: `[UNTRANSLATED] +75% Damage Reduction while Hacking`, upgrade_OnExecutionReviveCompanion: `[UNTRANSLATED] Mercy Kills reduce Companion Recovery by 15s`, upgrade_OnExecutionParkourSpeed: `[UNTRANSLATED] +60% Parkour Speed after a Mercy for 15s`, upgrade_AvatarTimeLimitIncrease: `[UNTRANSLATED] +8s to Hacking`, upgrade_ElectrifyOnHack: `[UNTRANSLATED] Shock enemies within 20m while Hacking`, - upgrade_OnExecutionTerrify: `[UNTRANSLATED] 50% chance for enemies within 15m to cower in fear for 8 seconds on Mercy`, + upgrade_OnExecutionTerrify: `[UNTRANSLATED] +50% chance for enemies within 15m to cower in fear for 8 seconds on Mercy`, upgrade_OnHackLockers: `[UNTRANSLATED] Unlock 5 lockers within 20m after Hacking`, upgrade_OnExecutionBlind: `[UNTRANSLATED] Blind enemies within 18m on Mercy`, - upgrade_OnExecutionDrainPower: `[UNTRANSLATED] 100% chance for next ability cast to gain +50% Ability Strength on Mercy`, + upgrade_OnExecutionDrainPower: `[UNTRANSLATED] +100% chance for next ability cast to gain +50% Ability Strength on Mercy`, upgrade_OnHackSprintSpeed: `[UNTRANSLATED] +75% Sprint Speed for 15s after Hacking`, upgrade_SwiftExecute: `[UNTRANSLATED] Speed of Mercy Kills increased by 50%`, upgrade_OnHackInvis: `[UNTRANSLATED] Invisible for 15 seconds after hacking`, diff --git a/static/webui/translations/en.js b/static/webui/translations/en.js index 65594d49..79c817e8 100644 --- a/static/webui/translations/en.js +++ b/static/webui/translations/en.js @@ -281,19 +281,19 @@ dict = { upgrade_AvatarLootRadar: `+7m Loot Radar`, upgrade_WeaponAmmoMax: `+15% Ammo Max`, upgrade_EnemyArmorReductionAura: `-3% Enemy Armor`, - upgrade_OnExecutionAmmo: `100% Primary and Secondary Magazine Refill on Mercy`, - upgrade_OnExecutionHealthDrop: `100% chance to drop a Health Orb on Mercy`, - upgrade_OnExecutionEnergyDrop: `50% chance to drop an Energy Orb on Mercy`, - upgrade_OnFailHackReset: `+50% to retry on Hacking failure`, - upgrade_DamageReductionOnHack: `75% Damage Reduction while Hacking`, + upgrade_OnExecutionAmmo: `+100% Primary and Secondary Magazine Refill on Mercy`, + upgrade_OnExecutionHealthDrop: `+100% Health Orb Chance on Mercy`, + upgrade_OnExecutionEnergyDrop: `+50% Energy Orb Chance on Mercy`, + upgrade_OnFailHackReset: `+50% Hacking Retry Chance`, + upgrade_DamageReductionOnHack: `+75% Damage Reduction while Hacking`, upgrade_OnExecutionReviveCompanion: `Mercy Kills reduce Companion Recovery by 15s`, upgrade_OnExecutionParkourSpeed: `+60% Parkour Speed after a Mercy for 15s`, upgrade_AvatarTimeLimitIncrease: `+8s to Hacking`, upgrade_ElectrifyOnHack: `Shock enemies within 20m while Hacking`, - upgrade_OnExecutionTerrify: `50% chance for enemies within 15m to cower in fear for 8 seconds on Mercy`, + upgrade_OnExecutionTerrify: `+50% chance for enemies within 15m to cower in fear for 8 seconds on Mercy`, upgrade_OnHackLockers: `Unlock 5 lockers within 20m after Hacking`, upgrade_OnExecutionBlind: `Blind enemies within 18m on Mercy`, - upgrade_OnExecutionDrainPower: `100% chance for next ability cast to gain +50% Ability Strength on Mercy`, + upgrade_OnExecutionDrainPower: `+100% chance for next ability cast to gain +50% Ability Strength on Mercy`, upgrade_OnHackSprintSpeed: `+75% Sprint Speed for 15s after Hacking`, upgrade_SwiftExecute: `Speed of Mercy Kills increased by 50%`, upgrade_OnHackInvis: `Invisible for 15 seconds after hacking`, diff --git a/static/webui/translations/fr.js b/static/webui/translations/fr.js index ef70cd6e..d46bdbc1 100644 --- a/static/webui/translations/fr.js +++ b/static/webui/translations/fr.js @@ -285,7 +285,7 @@ dict = { upgrade_OnExecutionAmmo: `100% de rechargement des armes primaires et secondaires sur une une miséricorde`, upgrade_OnExecutionHealthDrop: `100% de chance de drop une orbe de santé sur une miséricorde`, upgrade_OnExecutionEnergyDrop: `50% de chance de drop une orbe d'énergie sur une miséricorde`, - upgrade_OnFailHackReset: `[UNTRANSLATED] +50% to retry on Hacking failure`, + upgrade_OnFailHackReset: `[UNTRANSLATED] +50% Hacking Retry Chance`, upgrade_DamageReductionOnHack: `75% de réduction de dégâts pendant un piratage`, upgrade_OnExecutionReviveCompanion: `Les miséricordes réduisent le temps de récupération du compagnon de 15s`, upgrade_OnExecutionParkourSpeed: `+60% de vitesse de parkour pendant 15s après une miséricorde`, diff --git a/static/webui/translations/ru.js b/static/webui/translations/ru.js index 7f594867..570e5d22 100644 --- a/static/webui/translations/ru.js +++ b/static/webui/translations/ru.js @@ -282,19 +282,19 @@ dict = { upgrade_AvatarLootRadar: `[UNTRANSLATED] +7m Loot Radar`, upgrade_WeaponAmmoMax: `[UNTRANSLATED] +15% Ammo Max`, upgrade_EnemyArmorReductionAura: `[UNTRANSLATED] -3% Enemy Armor`, - upgrade_OnExecutionAmmo: `[UNTRANSLATED] 100% Primary and Secondary Magazine Refill on Mercy`, - upgrade_OnExecutionHealthDrop: `[UNTRANSLATED] 100% chance to drop a Health Orb on Mercy`, - upgrade_OnExecutionEnergyDrop: `[UNTRANSLATED] 50% chance to drop an Energy Orb on Mercy`, - upgrade_OnFailHackReset: `[UNTRANSLATED] +50% to retry on Hacking failure`, - upgrade_DamageReductionOnHack: `[UNTRANSLATED] 75% Damage Reduction while Hacking`, + upgrade_OnExecutionAmmo: `[UNTRANSLATED] +100% Primary and Secondary Magazine Refill on Mercy`, + upgrade_OnExecutionHealthDrop: `[UNTRANSLATED] +100% Health Orb Chance on Mercy`, + upgrade_OnExecutionEnergyDrop: `[UNTRANSLATED] +50% Energy Orb Chance on Mercy`, + upgrade_OnFailHackReset: `[UNTRANSLATED] +50% Hacking Retry Chance`, + upgrade_DamageReductionOnHack: `[UNTRANSLATED] +75% Damage Reduction while Hacking`, upgrade_OnExecutionReviveCompanion: `[UNTRANSLATED] Mercy Kills reduce Companion Recovery by 15s`, upgrade_OnExecutionParkourSpeed: `[UNTRANSLATED] +60% Parkour Speed after a Mercy for 15s`, upgrade_AvatarTimeLimitIncrease: `[UNTRANSLATED] +8s to Hacking`, upgrade_ElectrifyOnHack: `[UNTRANSLATED] Shock enemies within 20m while Hacking`, - upgrade_OnExecutionTerrify: `[UNTRANSLATED] 50% chance for enemies within 15m to cower in fear for 8 seconds on Mercy`, + upgrade_OnExecutionTerrify: `[UNTRANSLATED] +50% chance for enemies within 15m to cower in fear for 8 seconds on Mercy`, upgrade_OnHackLockers: `[UNTRANSLATED] Unlock 5 lockers within 20m after Hacking`, upgrade_OnExecutionBlind: `[UNTRANSLATED] Blind enemies within 18m on Mercy`, - upgrade_OnExecutionDrainPower: `[UNTRANSLATED] 100% chance for next ability cast to gain +50% Ability Strength on Mercy`, + upgrade_OnExecutionDrainPower: `[UNTRANSLATED] +100% chance for next ability cast to gain +50% Ability Strength on Mercy`, upgrade_OnHackSprintSpeed: `[UNTRANSLATED] +75% Sprint Speed for 15s after Hacking`, upgrade_SwiftExecute: `[UNTRANSLATED] Speed of Mercy Kills increased by 50%`, upgrade_OnHackInvis: `[UNTRANSLATED] Invisible for 15 seconds after hacking`, From aa6191f033f86d262e62cc6b80722e75de79adad Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Wed, 2 Jul 2025 14:17:14 -0700 Subject: [PATCH 4/6] feat: relic rng cheats (#2386) Closes #2370 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2386 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com> --- src/helpers/relicHelper.ts | 9 ++++++++- src/services/configService.ts | 3 +++ static/webui/index.html | 12 ++++++++++++ static/webui/translations/de.js | 3 +++ static/webui/translations/en.js | 3 +++ static/webui/translations/es.js | 3 +++ static/webui/translations/fr.js | 3 +++ static/webui/translations/ru.js | 3 +++ static/webui/translations/zh.js | 3 +++ 9 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/helpers/relicHelper.ts b/src/helpers/relicHelper.ts index 03b0e9c9..6889514e 100644 --- a/src/helpers/relicHelper.ts +++ b/src/helpers/relicHelper.ts @@ -14,7 +14,14 @@ export const crackRelic = async ( inventoryChanges: IInventoryChanges = {} ): Promise => { const relic = ExportRelics[participant.VoidProjection]; - const weights = refinementToWeights[relic.quality]; + let weights = refinementToWeights[relic.quality]; + if (relic.quality == "VPQ_SILVER" && config.exceptionalRelicsAlwaysGiveBronzeReward) { + weights = { COMMON: 1, UNCOMMON: 0, RARE: 0, LEGENDARY: 0 }; + } else if (relic.quality == "VPQ_GOLD" && config.flawlessRelicsAlwaysGiveSilverReward) { + weights = { COMMON: 0, UNCOMMON: 1, RARE: 0, LEGENDARY: 0 }; + } else if (relic.quality == "VPQ_PLATINUM" && config.radiantRelicsAlwaysGiveGoldReward) { + weights = { COMMON: 0, UNCOMMON: 0, RARE: 1, LEGENDARY: 0 }; + } logger.debug(`opening a relic of quality ${relic.quality}; rarity weights are`, weights); const reward = getRandomWeightedReward( ExportRewards[relic.rewardManifest][0] as { type: string; itemCount: number; rarity: TRarity }[], // rarity is nullable in PE+ typings, but always present for relics diff --git a/src/services/configService.ts b/src/services/configService.ts index aa649dd5..6b20c91d 100644 --- a/src/services/configService.ts +++ b/src/services/configService.ts @@ -64,6 +64,9 @@ export interface IConfig { noDojoResearchTime?: boolean; fastClanAscension?: boolean; missionsCanGiveAllRelics?: boolean; + exceptionalRelicsAlwaysGiveBronzeReward?: boolean; + flawlessRelicsAlwaysGiveSilverReward?: boolean; + radiantRelicsAlwaysGiveGoldReward?: boolean; unlockAllSimarisResearchEntries?: boolean; disableDailyTribute?: boolean; spoofMasteryRank?: number; diff --git a/static/webui/index.html b/static/webui/index.html index 80493572..66309c9d 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -778,6 +778,18 @@ +
+ + +
+
+ + +
+
+ + +
diff --git a/static/webui/translations/de.js b/static/webui/translations/de.js index 89bcc218..2de9e90b 100644 --- a/static/webui/translations/de.js +++ b/static/webui/translations/de.js @@ -182,6 +182,9 @@ dict = { cheats_noDojoResearchTime: `Keine Dojo-Forschungszeit`, cheats_fastClanAscension: `Schneller Clan-Aufstieg`, cheats_missionsCanGiveAllRelics: `[UNTRANSLATED] Missions Can Give All Relics`, + cheats_exceptionalRelicsAlwaysGiveBronzeReward: `[UNTRANSLATED] Exceptional Relics Always Give Bronze Reward`, + cheats_flawlessRelicsAlwaysGiveSilverReward: `[UNTRANSLATED] Flawless Relics Always Give Silver Reward`, + cheats_radiantRelicsAlwaysGiveGoldReward: `[UNTRANSLATED] Radiant Relics Always Give Gold Reward`, cheats_unlockAllSimarisResearchEntries: `[UNTRANSLATED] Unlock All Simaris Research Entries`, cheats_disableDailyTribute: `[UNTRANSLATED] Disable Daily Tribute`, cheats_spoofMasteryRank: `Gefälschter Meisterschaftsrang (-1 zum deaktivieren)`, diff --git a/static/webui/translations/en.js b/static/webui/translations/en.js index 79c817e8..54994a6c 100644 --- a/static/webui/translations/en.js +++ b/static/webui/translations/en.js @@ -181,6 +181,9 @@ dict = { cheats_noDojoResearchTime: `No Dojo Research Time`, cheats_fastClanAscension: `Fast Clan Ascension`, cheats_missionsCanGiveAllRelics: `Missions Can Give All Relics`, + cheats_exceptionalRelicsAlwaysGiveBronzeReward: `Exceptional Relics Always Give Bronze Reward`, + cheats_flawlessRelicsAlwaysGiveSilverReward: `Flawless Relics Always Give Silver Reward`, + cheats_radiantRelicsAlwaysGiveGoldReward: `Radiant Relics Always Give Gold Reward`, cheats_unlockAllSimarisResearchEntries: `Unlock All Simaris Research Entries`, cheats_disableDailyTribute: `Disable Daily Tribute`, cheats_spoofMasteryRank: `Spoofed Mastery Rank (-1 to disable)`, diff --git a/static/webui/translations/es.js b/static/webui/translations/es.js index 7b480e61..7f515af7 100644 --- a/static/webui/translations/es.js +++ b/static/webui/translations/es.js @@ -182,6 +182,9 @@ dict = { cheats_noDojoResearchTime: `Sin tiempo de investigación del dojo`, cheats_fastClanAscension: `Ascenso rápido del clan`, cheats_missionsCanGiveAllRelics: `Las misiones pueden otorgar todas las reliquias`, + cheats_exceptionalRelicsAlwaysGiveBronzeReward: `[UNTRANSLATED] Exceptional Relics Always Give Bronze Reward`, + cheats_flawlessRelicsAlwaysGiveSilverReward: `[UNTRANSLATED] Flawless Relics Always Give Silver Reward`, + cheats_radiantRelicsAlwaysGiveGoldReward: `[UNTRANSLATED] Radiant Relics Always Give Gold Reward`, cheats_unlockAllSimarisResearchEntries: `Desbloquear todas las entradas de investigación de Simaris`, cheats_disableDailyTribute: `Desactivar tributo diario`, cheats_spoofMasteryRank: `Rango de maestría simulado (-1 para desactivar)`, diff --git a/static/webui/translations/fr.js b/static/webui/translations/fr.js index d46bdbc1..2578e9c9 100644 --- a/static/webui/translations/fr.js +++ b/static/webui/translations/fr.js @@ -182,6 +182,9 @@ dict = { cheats_noDojoResearchTime: `Aucun temps de recherche (Dojo)`, cheats_fastClanAscension: `Ascension de clan rapide`, cheats_missionsCanGiveAllRelics: `Les missions donnent toutes les reliques`, + cheats_exceptionalRelicsAlwaysGiveBronzeReward: `[UNTRANSLATED] Exceptional Relics Always Give Bronze Reward`, + cheats_flawlessRelicsAlwaysGiveSilverReward: `[UNTRANSLATED] Flawless Relics Always Give Silver Reward`, + cheats_radiantRelicsAlwaysGiveGoldReward: `[UNTRANSLATED] Radiant Relics Always Give Gold Reward`, cheats_unlockAllSimarisResearchEntries: `Débloquer toute les recherches chez Simaris`, cheats_disableDailyTribute: `[UNTRANSLATED] Disable Daily Tribute`, cheats_spoofMasteryRank: `Rang de maîtrise personnalisé (-1 pour désactiver)`, diff --git a/static/webui/translations/ru.js b/static/webui/translations/ru.js index 570e5d22..e84437b5 100644 --- a/static/webui/translations/ru.js +++ b/static/webui/translations/ru.js @@ -182,6 +182,9 @@ dict = { cheats_noDojoResearchTime: `Мгновенные Исследование Додзё`, cheats_fastClanAscension: `Мгновенное Вознесение Клана`, cheats_missionsCanGiveAllRelics: `[UNTRANSLATED] Missions Can Give All Relics`, + cheats_exceptionalRelicsAlwaysGiveBronzeReward: `[UNTRANSLATED] Exceptional Relics Always Give Bronze Reward`, + cheats_flawlessRelicsAlwaysGiveSilverReward: `[UNTRANSLATED] Flawless Relics Always Give Silver Reward`, + cheats_radiantRelicsAlwaysGiveGoldReward: `[UNTRANSLATED] Radiant Relics Always Give Gold Reward`, cheats_unlockAllSimarisResearchEntries: `[UNTRANSLATED] Unlock All Simaris Research Entries`, cheats_disableDailyTribute: `[UNTRANSLATED] Disable Daily Tribute`, cheats_spoofMasteryRank: `Подделанный ранг мастерства (-1 для отключения)`, diff --git a/static/webui/translations/zh.js b/static/webui/translations/zh.js index f5c9e759..d1cb95bb 100644 --- a/static/webui/translations/zh.js +++ b/static/webui/translations/zh.js @@ -182,6 +182,9 @@ dict = { cheats_noDojoResearchTime: `无视道场研究时间`, cheats_fastClanAscension: `快速升级氏族`, cheats_missionsCanGiveAllRelics: `任务可获取所有遗物`, + cheats_exceptionalRelicsAlwaysGiveBronzeReward: `[UNTRANSLATED] Exceptional Relics Always Give Bronze Reward`, + cheats_flawlessRelicsAlwaysGiveSilverReward: `[UNTRANSLATED] Flawless Relics Always Give Silver Reward`, + cheats_radiantRelicsAlwaysGiveGoldReward: `[UNTRANSLATED] Radiant Relics Always Give Gold Reward`, cheats_unlockAllSimarisResearchEntries: `解锁所有Simaris研究条目`, cheats_disableDailyTribute: `禁用每日登录奖励`, cheats_spoofMasteryRank: `伪造精通段位(-1为禁用)`, From 8c85cdcd1d0f296bce3962ea401b589ecf7d08fa Mon Sep 17 00:00:00 2001 From: Sainan <63328889+Sainan@users.noreply.github.com> Date: Wed, 2 Jul 2025 14:18:24 -0700 Subject: [PATCH 5/6] feat(webui): "add maxed" for mods (#2387) Closes #2382 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2387 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com> --- src/controllers/custom/addItemsController.ts | 3 ++- src/services/inventoryService.ts | 10 ++++++++++ static/webui/index.html | 1 + static/webui/script.js | 12 ++++++++++-- static/webui/translations/de.js | 1 + static/webui/translations/en.js | 1 + static/webui/translations/es.js | 1 + static/webui/translations/fr.js | 1 + static/webui/translations/ru.js | 1 + static/webui/translations/zh.js | 1 + 10 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/controllers/custom/addItemsController.ts b/src/controllers/custom/addItemsController.ts index dc39ef64..30edd917 100644 --- a/src/controllers/custom/addItemsController.ts +++ b/src/controllers/custom/addItemsController.ts @@ -7,7 +7,7 @@ export const addItemsController: RequestHandler = async (req, res) => { const requests = req.body as IAddItemRequest[]; const inventory = await getInventory(accountId); for (const request of requests) { - await addItem(inventory, request.ItemType, request.ItemCount, true, undefined, undefined, true); + await addItem(inventory, request.ItemType, request.ItemCount, true, undefined, request.Fingerprint, true); } await inventory.save(); res.end(); @@ -16,4 +16,5 @@ export const addItemsController: RequestHandler = async (req, res) => { interface IAddItemRequest { ItemType: string; ItemCount: number; + Fingerprint?: string; } diff --git a/src/services/inventoryService.ts b/src/services/inventoryService.ts index 3bfb3244..69299ec8 100644 --- a/src/services/inventoryService.ts +++ b/src/services/inventoryService.ts @@ -483,6 +483,16 @@ export const addItem = async ( return addCustomization(inventory, typeName); } if (typeName in ExportUpgrades || typeName in ExportArcanes) { + if (targetFingerprint) { + if (quantity != 1) { + logger.warn(`adding 1 of ${typeName} ${targetFingerprint} even tho quantity ${quantity} was requested`); + } + inventory.Upgrades.push({ + ItemType: typeName, + UpgradeFingerprint: targetFingerprint + }); + return {}; // there's not exactly a common "InventoryChanges" format for these + } const changes = [ { ItemType: typeName, diff --git a/static/webui/index.html b/static/webui/index.html index 66309c9d..dd5479a1 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -527,6 +527,7 @@
+
diff --git a/static/webui/script.js b/static/webui/script.js index 9755f08e..4d726036 100644 --- a/static/webui/script.js +++ b/static/webui/script.js @@ -1873,6 +1873,8 @@ function setFingerprint(ItemType, ItemId, fingerprint) { } function doAcquireMod() { + const maxed = !!window.maxed; + window.maxed = false; const uniqueName = getKey(document.getElementById("mod-to-acquire")); if (!uniqueName) { $("#mod-to-acquire").addClass("is-invalid").focus(); @@ -1880,14 +1882,15 @@ function doAcquireMod() { } const count = parseInt($("#mod-count").val()); if (count != 0) { - revalidateAuthz().then(() => { + Promise.all([window.itemListPromise, revalidateAuthz()]).then(([itemList]) => { $.post({ url: "/custom/addItems?" + window.authz, contentType: "application/json", data: JSON.stringify([ { ItemType: uniqueName, - ItemCount: count + ItemCount: count, + Fingerprint: maxed ? JSON.stringify({ lvl: itemList[uniqueName].fusionLimit ?? 5 }) : undefined } ]) }).done(function () { @@ -1902,6 +1905,11 @@ function doAcquireMod() { } } +function doAcquireModMax() { + const uniqueName = getKey(document.getElementById("mod-to-acquire")); + alert("doAcquireModMax: " + uniqueName); +} + const uiConfigs = [...$(".config-form input[id], .config-form select[id]")].map(x => x.id); for (const id of uiConfigs) { diff --git a/static/webui/translations/de.js b/static/webui/translations/de.js index 2de9e90b..26d9fd19 100644 --- a/static/webui/translations/de.js +++ b/static/webui/translations/de.js @@ -127,6 +127,7 @@ dict = { mods_fingerprintHelp: `Benötigst du Hilfe mit dem Fingerabdruck?`, mods_rivens: `Rivens`, mods_mods: `Mods`, + mods_addMax: `[UNTRANSLATED] Add Maxed`, mods_addMissingUnrankedMods: `Fehlende Mods ohne Rang hinzufügen`, mods_removeUnranked: `Mods ohne Rang entfernen`, mods_addMissingMaxRankMods: `Fehlende Mods mit Max. Rang hinzufügen`, diff --git a/static/webui/translations/en.js b/static/webui/translations/en.js index 54994a6c..e94c94bc 100644 --- a/static/webui/translations/en.js +++ b/static/webui/translations/en.js @@ -126,6 +126,7 @@ dict = { mods_fingerprintHelp: `Need help with the fingerprint?`, mods_rivens: `Rivens`, mods_mods: `Mods`, + mods_addMax: `Add Maxed`, mods_addMissingUnrankedMods: `Add Missing Unranked Mods`, mods_removeUnranked: `Remove Unranked Mods`, mods_addMissingMaxRankMods: `Add Missing Max Rank Mods`, diff --git a/static/webui/translations/es.js b/static/webui/translations/es.js index 7f515af7..6776aba6 100644 --- a/static/webui/translations/es.js +++ b/static/webui/translations/es.js @@ -127,6 +127,7 @@ dict = { mods_fingerprintHelp: `¿Necesitas ayuda con la huella digital?`, mods_rivens: `Agrietados`, mods_mods: `Mods`, + mods_addMax: `[UNTRANSLATED] Add Maxed`, mods_addMissingUnrankedMods: `Agregar mods sin rango faltantes`, mods_removeUnranked: `Quitar mods sin rango`, mods_addMissingMaxRankMods: `Agregar mods de rango máximo faltantes`, diff --git a/static/webui/translations/fr.js b/static/webui/translations/fr.js index 2578e9c9..28112086 100644 --- a/static/webui/translations/fr.js +++ b/static/webui/translations/fr.js @@ -127,6 +127,7 @@ dict = { mods_fingerprintHelp: `Besoin d'aide pour l'empreinte ?`, mods_rivens: `Rivens`, mods_mods: `Mods`, + mods_addMax: `[UNTRANSLATED] Add Maxed`, mods_addMissingUnrankedMods: `Ajouter les mods sans rang manquants`, mods_removeUnranked: `Retirer les mods sans rang`, mods_addMissingMaxRankMods: `Ajouter les mods niveau max manquants`, diff --git a/static/webui/translations/ru.js b/static/webui/translations/ru.js index e84437b5..c3ca845b 100644 --- a/static/webui/translations/ru.js +++ b/static/webui/translations/ru.js @@ -127,6 +127,7 @@ dict = { mods_fingerprintHelp: `Нужна помощь с отпечатком?`, mods_rivens: `Моды Разлома`, mods_mods: `Моды`, + mods_addMax: `[UNTRANSLATED] Add Maxed`, mods_addMissingUnrankedMods: `Добавить недостающие моды без ранга`, mods_removeUnranked: `Удалить моды без ранга`, mods_addMissingMaxRankMods: `Добавить недостающие моды максимального ранга`, diff --git a/static/webui/translations/zh.js b/static/webui/translations/zh.js index d1cb95bb..097c143c 100644 --- a/static/webui/translations/zh.js +++ b/static/webui/translations/zh.js @@ -127,6 +127,7 @@ dict = { mods_fingerprintHelp: `需要印记相关的帮助?`, mods_rivens: `裂罅MOD`, mods_mods: `Mods`, + mods_addMax: `[UNTRANSLATED] Add Maxed`, mods_addMissingUnrankedMods: `添加所有缺失的Mods`, mods_removeUnranked: `删除所有未升级的Mods`, mods_addMissingMaxRankMods: `添加所有缺失的满级Mods`, From d2ab894c017daa4d3ca7e05cdd23d449af5bd3d5 Mon Sep 17 00:00:00 2001 From: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Date: Wed, 2 Jul 2025 14:29:41 -0700 Subject: [PATCH 6/6] fix(webui): assign labels for appropriate inputs (#2391) Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2391 Co-authored-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Co-committed-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> --- static/webui/index.html | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/static/webui/index.html b/static/webui/index.html index dd5479a1..20064f77 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -865,7 +865,7 @@
- +
- +
- +
- +
- +
- +