diff --git a/src/controllers/api/nemesisController.ts b/src/controllers/api/nemesisController.ts index 71329285..cc5602ba 100644 --- a/src/controllers/api/nemesisController.ts +++ b/src/controllers/api/nemesisController.ts @@ -149,7 +149,10 @@ export const nemesisController: RequestHandler = async (req, res) => { break; } } - inventory.Nemesis!.HenchmenKilled += antivirusGain; + const antivirusGainMultiplier = ( + await getInventory(account._id.toString(), "nemesisAntivirusGainMultiplier") + ).nemesisAntivirusGainMultiplier; + inventory.Nemesis!.HenchmenKilled += antivirusGain * (antivirusGainMultiplier ?? 1); if (inventory.Nemesis!.HenchmenKilled >= 100) { inventory.Nemesis!.HenchmenKilled = 100; diff --git a/src/controllers/custom/setAccountCheatController.ts b/src/controllers/custom/setAccountCheatController.ts index 07a1da4f..586cebb6 100644 --- a/src/controllers/custom/setAccountCheatController.ts +++ b/src/controllers/custom/setAccountCheatController.ts @@ -3,12 +3,19 @@ import { getAccountIdForRequest } from "../../services/loginService.ts"; import { sendWsBroadcastTo } from "../../services/wsService.ts"; import type { IAccountCheats } from "../../types/inventoryTypes/inventoryTypes.ts"; import type { RequestHandler } from "express"; +import { logger } from "../../utils/logger.ts"; export const setAccountCheatController: RequestHandler = async (req, res) => { const accountId = await getAccountIdForRequest(req); const payload = req.body as ISetAccountCheatRequest; const inventory = await getInventory(accountId, payload.key); - inventory[payload.key] = payload.value; + + if (payload.value == undefined) { + logger.warn(`Aborting setting ${payload.key} as undefined!`); + return; + } + + inventory[payload.key] = payload.value as never; await inventory.save(); res.end(); if (["infiniteCredits", "infinitePlatinum", "infiniteEndo", "infiniteRegalAya"].indexOf(payload.key) != -1) { @@ -18,5 +25,5 @@ export const setAccountCheatController: RequestHandler = async (req, res) => { interface ISetAccountCheatRequest { key: keyof IAccountCheats; - value: boolean; + value: IAccountCheats[keyof IAccountCheats]; } diff --git a/src/models/inventoryModels/inventoryModel.ts b/src/models/inventoryModels/inventoryModel.ts index ff017f5d..d727a100 100644 --- a/src/models/inventoryModels/inventoryModel.ts +++ b/src/models/inventoryModels/inventoryModel.ts @@ -1462,6 +1462,12 @@ const inventorySchema = new Schema( flawlessRelicsAlwaysGiveSilverReward: Boolean, radiantRelicsAlwaysGiveGoldReward: Boolean, disableDailyTribute: Boolean, + nemesisHenchmenKillsMultiplierGrineer: Number, + nemesisHenchmenKillsMultiplierCorpus: Number, + nemesisAntivirusGainMultiplier: Number, + nemesisHintProgressMultiplierGrineer: Number, + nemesisHintProgressMultiplierCorpus: Number, + nemesisExtraWeapon: Number, SubscribedToEmails: { type: Number, default: 0 }, SubscribedToEmailsPersonalized: { type: Number, default: 0 }, diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index 062c0f3e..22fe76c5 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -210,10 +210,29 @@ export const addMissionInventoryUpdates = async ( inventory.NemesisAbandonedRewards = inventoryUpdates.RewardInfo.NemesisAbandonedRewards; } if (inventoryUpdates.RewardInfo.NemesisHenchmenKills && inventory.Nemesis) { - inventory.Nemesis.HenchmenKilled += inventoryUpdates.RewardInfo.NemesisHenchmenKills; + let HenchmenKilledMultiplier = 1; + switch (inventory.Nemesis.Faction) { + case "FC_GRINEER": + HenchmenKilledMultiplier = inventory.nemesisHenchmenKillsMultiplierGrineer ?? 1; + break; + case "FC_CORPUS": + HenchmenKilledMultiplier = inventory.nemesisHenchmenKillsMultiplierCorpus ?? 1; + break; + } + inventory.Nemesis.HenchmenKilled += + inventoryUpdates.RewardInfo.NemesisHenchmenKills * HenchmenKilledMultiplier; } if (inventoryUpdates.RewardInfo.NemesisHintProgress && inventory.Nemesis) { - inventory.Nemesis.HintProgress += inventoryUpdates.RewardInfo.NemesisHintProgress; + let HintProgressMultiplier = 1; + switch (inventory.Nemesis.Faction) { + case "FC_GRINEER": + HintProgressMultiplier = inventory.nemesisHintProgressMultiplierGrineer ?? 1; + break; + case "FC_CORPUS": + HintProgressMultiplier = inventory.nemesisHintProgressMultiplierCorpus ?? 1; + break; + } + inventory.Nemesis.HintProgress += inventoryUpdates.RewardInfo.NemesisHintProgress * HintProgressMultiplier; if (inventory.Nemesis.Faction != "FC_INFESTATION" && inventory.Nemesis.Hints.length != 3) { const progressNeeded = [35, 60, 100][inventory.Nemesis.Hints.length]; if (inventory.Nemesis.HintProgress >= progressNeeded) { @@ -819,6 +838,8 @@ export const addMissionInventoryUpdates = async ( const att: string[] = []; let countedAtt: ITypeCount[] | undefined; + const extraWeaponCheat = inventory.nemesisExtraWeapon ?? 0; // 0 means no extra weapon and token + if (value.killed) { if ( value.weaponLoc && @@ -827,6 +848,20 @@ export const addMissionInventoryUpdates = async ( const weaponType = manifest.weapons[inventory.Nemesis.WeaponIdx]; giveNemesisWeaponRecipe(inventory, weaponType, value.nemesisName, value.weaponLoc, profile); att.push(weaponType); + if (extraWeaponCheat >= 1) { + for (let i = 0; i < extraWeaponCheat; i++) { + const randomIndex = Math.floor(Math.random() * manifest.weapons.length); + const randomWeapon = manifest.weapons[randomIndex]; + giveNemesisWeaponRecipe( + inventory, + randomWeapon, + value.nemesisName, + undefined, + profile + ); + att.push(randomWeapon); + } + } } //if (value.petLoc) { if (profile.petHead) { @@ -870,7 +905,7 @@ export const addMissionInventoryUpdates = async ( countedAtt = [ { ItemType: "/Lotus/Types/Items/MiscItems/CodaWeaponBucks", - ItemCount: getKillTokenRewardCount(inventory.Nemesis.fp) + ItemCount: getKillTokenRewardCount(inventory.Nemesis.fp) * (extraWeaponCheat + 1) } ]; addMiscItems(inventory, countedAtt); @@ -1400,7 +1435,9 @@ export const addMissionRewards = async ( if (inventory.Nemesis.Faction == "FC_INFESTATION") { inventory.Nemesis.MissionCount += 1; - inventory.Nemesis.HenchmenKilled = Math.min(inventory.Nemesis.HenchmenKilled + 5, 95); // 5 progress per mission until 95 + let antivirusGain = 5; + antivirusGain *= inventory.nemesisAntivirusGainMultiplier ?? 1; + inventory.Nemesis.HenchmenKilled = Math.min(inventory.Nemesis.HenchmenKilled + antivirusGain, 95); // 5 progress per mission until 95 inventoryChanges.Nemesis.MissionCount ??= 0; inventoryChanges.Nemesis.MissionCount += 1; diff --git a/src/types/inventoryTypes/inventoryTypes.ts b/src/types/inventoryTypes/inventoryTypes.ts index 83549b52..5dea2533 100644 --- a/src/types/inventoryTypes/inventoryTypes.ts +++ b/src/types/inventoryTypes/inventoryTypes.ts @@ -55,6 +55,12 @@ export interface IAccountCheats { flawlessRelicsAlwaysGiveSilverReward?: boolean; radiantRelicsAlwaysGiveGoldReward?: boolean; disableDailyTribute?: boolean; + nemesisHenchmenKillsMultiplierGrineer?: number; + nemesisHenchmenKillsMultiplierCorpus?: number; + nemesisAntivirusGainMultiplier?: number; + nemesisHintProgressMultiplierGrineer?: number; + nemesisHintProgressMultiplierCorpus?: number; + nemesisExtraWeapon?: number; } export interface IInventoryDatabase diff --git a/static/webui/index.html b/static/webui/index.html index 82990f15..8c1d398d 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -1015,6 +1015,48 @@ +
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
@@ -1033,7 +1075,7 @@
- +
diff --git a/static/webui/script.js b/static/webui/script.js index 593c7a52..f0c82ac3 100644 --- a/static/webui/script.js +++ b/static/webui/script.js @@ -1991,7 +1991,11 @@ function updateInventory() { } for (const elm of accountCheats) { - elm.checked = !!data[elm.id]; + if (elm.type === "checkbox") { + elm.checked = !!data[elm.id]; + } else if (elm.type === "number") { + elm.value = data[elm.id] !== undefined ? data[elm.id] : elm.getAttribute("data-default") || ""; + } } }); }); @@ -3208,6 +3212,41 @@ document.querySelectorAll("#account-cheats input[type=checkbox]").forEach(elm => }; }); +document.querySelectorAll("#account-cheats .input-group").forEach(grp => { + const input = grp.querySelector("input"); + const select = grp.querySelector("select"); + const btn = grp.querySelector("button"); + if (input) { + input.oninput = input.onchange = function () { + btn.classList.remove("btn-secondary"); + btn.classList.add("btn-primary"); + }; + } + if (select) { + select.oninput = select.onchange = function () { + btn.classList.remove("btn-secondary"); + btn.classList.add("btn-primary"); + }; + } + btn.onclick = function () { + btn.classList.remove("btn-primary"); + btn.classList.add("btn-secondary"); + const input = btn.closest(".input-group").querySelector('input[type="number"]'); + if (!input) return; + revalidateAuthz().then(() => { + const value = input.value; + $.post({ + url: "/custom/setAccountCheat?" + window.authz, + contentType: "application/json", + data: JSON.stringify({ + key: input.id, + value: parseInt(value) + }) + }); + }); + }; +}); + document.querySelectorAll("#guild-cheats input[type=checkbox]").forEach(elm => { elm.onchange = function () { revalidateAuthz().then(() => { diff --git a/static/webui/translations/de.js b/static/webui/translations/de.js index 337aa158..6608ac2e 100644 --- a/static/webui/translations/de.js +++ b/static/webui/translations/de.js @@ -257,6 +257,12 @@ dict = { cheats_changeButton: `Ändern`, cheats_markAllAsRead: `Posteingang als gelesen markieren`, cheats_finishInvasionsInOneMission: `[UNTRANSLATED] Finish Invasions in One Mission`, + cheats_nemesisHenchmenKillsMultiplierGrineer: `[UNTRANSLATED] Rage Progess Multiplier (Grineer)`, + cheats_nemesisHenchmenKillsMultiplierCorpus: `[UNTRANSLATED] Rage Progess Multiplier (Corpus)`, + cheats_nemesisAntivirusGainMultiplier: `[UNTRANSLATED] Antivirus Progress Multiplier`, + cheats_nemesisHintProgressMultiplierGrineer: `[UNTRANSLATED] Hint Progress Multiplier (Grineer)`, + cheats_nemesisHintProgressMultiplierCorpus: `[UNTRANSLATED] Hint Progress Multiplier (Corpus)`, + cheats_nemesisExtraWeapon: `[UNTRANSLATED] Extra Nemesis Weapon / Token On Vanquish (0 to disable)`, worldState: `Weltstatus`, worldState_creditBoost: `Event Booster: Credit`, diff --git a/static/webui/translations/en.js b/static/webui/translations/en.js index 4ca00cec..792ba3fe 100644 --- a/static/webui/translations/en.js +++ b/static/webui/translations/en.js @@ -256,6 +256,12 @@ dict = { cheats_changeButton: `Change`, cheats_markAllAsRead: `Mark Inbox As Read`, cheats_finishInvasionsInOneMission: `Finish Invasions in One Mission`, + cheats_nemesisHenchmenKillsMultiplierGrineer: `Rage Progess Multiplier (Grineer)`, + cheats_nemesisHenchmenKillsMultiplierCorpus: `Rage Progess Multiplier (Corpus)`, + cheats_nemesisAntivirusGainMultiplier: `Antivirus Progress Multiplier`, + cheats_nemesisHintProgressMultiplierGrineer: `Hint Progress Multiplier (Grineer)`, + cheats_nemesisHintProgressMultiplierCorpus: `Hint Progress Multiplier (Corpus)`, + cheats_nemesisExtraWeapon: `Extra Nemesis Weapon / Token On Vanquish (0 to disable)`, worldState: `World State`, worldState_creditBoost: `Credit Boost`, diff --git a/static/webui/translations/es.js b/static/webui/translations/es.js index fbc5237c..cb7cb419 100644 --- a/static/webui/translations/es.js +++ b/static/webui/translations/es.js @@ -257,6 +257,12 @@ dict = { cheats_changeButton: `Cambiar`, cheats_markAllAsRead: `Marcar bandeja de entrada como leída`, cheats_finishInvasionsInOneMission: `Finaliza Invasión en una mision`, + cheats_nemesisHenchmenKillsMultiplierGrineer: `[UNTRANSLATED] Rage Progess Multiplier (Grineer)`, + cheats_nemesisHenchmenKillsMultiplierCorpus: `[UNTRANSLATED] Rage Progess Multiplier (Corpus)`, + cheats_nemesisAntivirusGainMultiplier: `[UNTRANSLATED] Antivirus Progress Multiplier`, + cheats_nemesisHintProgressMultiplierGrineer: `[UNTRANSLATED] Hint Progress Multiplier (Grineer)`, + cheats_nemesisHintProgressMultiplierCorpus: `[UNTRANSLATED] Hint Progress Multiplier (Corpus)`, + cheats_nemesisExtraWeapon: `[UNTRANSLATED] Extra Nemesis Weapon / Token On Vanquish (0 to disable)`, worldState: `Estado del mundo`, worldState_creditBoost: `Potenciador de Créditos`, diff --git a/static/webui/translations/fr.js b/static/webui/translations/fr.js index 996ae13c..fbff6516 100644 --- a/static/webui/translations/fr.js +++ b/static/webui/translations/fr.js @@ -257,6 +257,12 @@ dict = { cheats_changeButton: `Changer`, cheats_markAllAsRead: `Marquer la boîte de réception comme lue`, cheats_finishInvasionsInOneMission: `Compléter les invasions en une mission.`, + cheats_nemesisHenchmenKillsMultiplierGrineer: `[UNTRANSLATED] Rage Progess Multiplier (Grineer)`, + cheats_nemesisHenchmenKillsMultiplierCorpus: `[UNTRANSLATED] Rage Progess Multiplier (Corpus)`, + cheats_nemesisAntivirusGainMultiplier: `[UNTRANSLATED] Antivirus Progress Multiplier`, + cheats_nemesisHintProgressMultiplierGrineer: `[UNTRANSLATED] Hint Progress Multiplier (Grineer)`, + cheats_nemesisHintProgressMultiplierCorpus: `[UNTRANSLATED] Hint Progress Multiplier (Corpus)`, + cheats_nemesisExtraWeapon: `[UNTRANSLATED] Extra Nemesis Weapon / Token On Vanquish (0 to disable)`, worldState: `Carte Solaire`, worldState_creditBoost: `Booster de Crédit`, diff --git a/static/webui/translations/ru.js b/static/webui/translations/ru.js index b0e30e60..3174df2e 100644 --- a/static/webui/translations/ru.js +++ b/static/webui/translations/ru.js @@ -257,6 +257,12 @@ dict = { cheats_changeButton: `Изменить`, cheats_markAllAsRead: `Пометить все входящие как прочитанные`, cheats_finishInvasionsInOneMission: `Завершать вторжение за одну миссию`, + cheats_nemesisHenchmenKillsMultiplierGrineer: `[UNTRANSLATED] Rage Progess Multiplier (Grineer)`, + cheats_nemesisHenchmenKillsMultiplierCorpus: `[UNTRANSLATED] Rage Progess Multiplier (Corpus)`, + cheats_nemesisAntivirusGainMultiplier: `[UNTRANSLATED] Antivirus Progress Multiplier`, + cheats_nemesisHintProgressMultiplierGrineer: `[UNTRANSLATED] Hint Progress Multiplier (Grineer)`, + cheats_nemesisHintProgressMultiplierCorpus: `[UNTRANSLATED] Hint Progress Multiplier (Corpus)`, + cheats_nemesisExtraWeapon: `[UNTRANSLATED] Extra Nemesis Weapon / Token On Vanquish (0 to disable)`, worldState: `Состояние мира`, worldState_creditBoost: `Глобальный бустер Кредитов`, diff --git a/static/webui/translations/uk.js b/static/webui/translations/uk.js index eaf9b06f..ff679a6a 100644 --- a/static/webui/translations/uk.js +++ b/static/webui/translations/uk.js @@ -257,6 +257,12 @@ dict = { cheats_changeButton: `Змінити`, cheats_markAllAsRead: `Помітити всі вхідні як прочитані`, cheats_finishInvasionsInOneMission: `Завершувати вторгнення за одну місію`, + cheats_nemesisHenchmenKillsMultiplierGrineer: `[UNTRANSLATED] Rage Progess Multiplier (Grineer)`, + cheats_nemesisHenchmenKillsMultiplierCorpus: `[UNTRANSLATED] Rage Progess Multiplier (Corpus)`, + cheats_nemesisAntivirusGainMultiplier: `[UNTRANSLATED] Antivirus Progress Multiplier`, + cheats_nemesisHintProgressMultiplierGrineer: `[UNTRANSLATED] Hint Progress Multiplier (Grineer)`, + cheats_nemesisHintProgressMultiplierCorpus: `[UNTRANSLATED] Hint Progress Multiplier (Corpus)`, + cheats_nemesisExtraWeapon: `[UNTRANSLATED] Extra Nemesis Weapon / Token On Vanquish (0 to disable)`, worldState: `Стан світу`, worldState_creditBoost: `Глобальне посилення Кредитів`, diff --git a/static/webui/translations/zh.js b/static/webui/translations/zh.js index 4f5c5808..e3d227ba 100644 --- a/static/webui/translations/zh.js +++ b/static/webui/translations/zh.js @@ -257,6 +257,12 @@ dict = { cheats_changeButton: `更改`, cheats_markAllAsRead: `收件箱全部标记为已读`, cheats_finishInvasionsInOneMission: `一场任务完成整场入侵`, + cheats_nemesisHenchmenKillsMultiplierGrineer: `玄骸怒气倍率 (Grineer)`, + cheats_nemesisHenchmenKillsMultiplierCorpus: `玄骸怒气倍率 (Corpus)`, + cheats_nemesisAntivirusGainMultiplier: `杀毒进度倍率 (科腐者)`, + cheats_nemesisHintProgressMultiplierGrineer: `解密进度倍率 (Grineer)`, + cheats_nemesisHintProgressMultiplierCorpus: `解密进度倍率 (Corpus)`, + cheats_nemesisExtraWeapon: `额外玄骸武器/代币 (0为禁用)`, worldState: `世界状态配置`, worldState_creditBoost: `现金加成`,