From 07969177400564d34e5eff9ca23ec7a3c613c006 Mon Sep 17 00:00:00 2001 From: AlexisinGit <136088944+AlexisinGit@users.noreply.github.com> Date: Wed, 8 Oct 2025 15:45:42 +0800 Subject: [PATCH 1/2] cheat: extraRelicRewards --- .../api/getVoidProjectionRewardsController.ts | 6 ++- src/helpers/relicHelper.ts | 42 ++++++++++--------- src/models/inventoryModels/inventoryModel.ts | 1 + src/services/missionInventoryUpdateService.ts | 6 ++- src/types/inventoryTypes/inventoryTypes.ts | 1 + static/webui/index.html | 7 ++++ static/webui/translations/en.js | 1 + static/webui/translations/zh.js | 1 + 8 files changed, 42 insertions(+), 23 deletions(-) diff --git a/src/controllers/api/getVoidProjectionRewardsController.ts b/src/controllers/api/getVoidProjectionRewardsController.ts index 46210be5..4f82a1c2 100644 --- a/src/controllers/api/getVoidProjectionRewardsController.ts +++ b/src/controllers/api/getVoidProjectionRewardsController.ts @@ -11,11 +11,13 @@ export const getVoidProjectionRewardsController: RequestHandler = async (req, re if (data.ParticipantInfo.QualifiesForReward && !data.ParticipantInfo.HaveRewardResponse) { const inventory = await getInventory(accountId); - const reward = await crackRelic(inventory, data.ParticipantInfo); + const rewards = await crackRelic(inventory, data.ParticipantInfo); if (!inventory.MissionRelicRewards || inventory.MissionRelicRewards.length >= data.CurrentWave) { inventory.MissionRelicRewards = []; } - inventory.MissionRelicRewards.push({ ItemType: reward.type, ItemCount: reward.itemCount }); + rewards.forEach(reward => { + (inventory.MissionRelicRewards ??= []).push({ ItemType: reward.type, ItemCount: reward.itemCount }); + }); await inventory.save(); } diff --git a/src/helpers/relicHelper.ts b/src/helpers/relicHelper.ts index 04b315f7..be79099f 100644 --- a/src/helpers/relicHelper.ts +++ b/src/helpers/relicHelper.ts @@ -14,7 +14,7 @@ export const crackRelic = async ( inventory: TInventoryDatabaseDocument, participant: IVoidTearParticipantInfo, inventoryChanges: IInventoryChanges = {} -): Promise => { +): Promise => { const relic = ExportRelics[participant.VoidProjection]; let weights = refinementToWeights[relic.quality]; if (relic.quality == "VPQ_SILVER" && inventory.exceptionalRelicsAlwaysGiveBronzeReward) { @@ -25,18 +25,28 @@ export const crackRelic = async ( weights = { COMMON: 0, UNCOMMON: 0, RARE: 1, LEGENDARY: 0 }; } logger.debug(`opening a relic of quality ${relic.quality}; rarity weights are`, weights); - let reward = getRandomWeightedReward( - ExportRewards[relic.rewardManifest][0] as { type: string; itemCount: number; rarity: TRarity }[], // rarity is nullable in PE+ typings, but always present for relics - weights - )!; - if (config.relicRewardItemCountMultiplier !== undefined && (config.relicRewardItemCountMultiplier ?? 1) != 1) { - reward = { - ...reward, - itemCount: reward.itemCount * config.relicRewardItemCountMultiplier - }; + const allRewards = []; + const relicRewardCount = 1 + (inventory.extraRelicRewards ?? 0); + for (let i = 0; i < relicRewardCount; i++) { + let reward = getRandomWeightedReward( + ExportRewards[relic.rewardManifest][0] as { type: string; itemCount: number; rarity: TRarity }[], // rarity is nullable in PE+ typings, but always present for relics + weights + )!; + if (config.relicRewardItemCountMultiplier !== undefined && (config.relicRewardItemCountMultiplier ?? 1) != 1) { + reward = { + ...reward, + itemCount: reward.itemCount * config.relicRewardItemCountMultiplier + }; + } + logger.debug(`relic rolled`, reward); + participant.Reward = reward.type; + allRewards.push(reward); + // Give reward + combineInventoryChanges( + inventoryChanges, + (await handleStoreItemAcquisition(reward.type, inventory, reward.itemCount)).InventoryChanges + ); } - logger.debug(`relic rolled`, reward); - participant.Reward = reward.type; // Remove relic const miscItemChanges = [ @@ -48,16 +58,10 @@ export const crackRelic = async ( addMiscItems(inventory, miscItemChanges); combineInventoryChanges(inventoryChanges, { MiscItems: miscItemChanges }); - // Give reward - combineInventoryChanges( - inventoryChanges, - (await handleStoreItemAcquisition(reward.type, inventory, reward.itemCount)).InventoryChanges - ); - // Client has picked its own reward (for lack of choice) participant.ChosenRewardOwner = participant.AccountId; - return reward; + return allRewards; }; const refinementToWeights = { diff --git a/src/models/inventoryModels/inventoryModel.ts b/src/models/inventoryModels/inventoryModel.ts index 58c57b93..b9cc2806 100644 --- a/src/models/inventoryModels/inventoryModel.ts +++ b/src/models/inventoryModels/inventoryModel.ts @@ -1468,6 +1468,7 @@ const inventorySchema = new Schema( nemesisHintProgressMultiplierGrineer: Number, nemesisHintProgressMultiplierCorpus: Number, nemesisExtraWeapon: Number, + extraRelicRewards: Number, SubscribedToEmails: { type: Number, default: 0 }, SubscribedToEmailsPersonalized: { type: Number, default: 0 }, diff --git a/src/services/missionInventoryUpdateService.ts b/src/services/missionInventoryUpdateService.ts index eb586eee..3f464a47 100644 --- a/src/services/missionInventoryUpdateService.ts +++ b/src/services/missionInventoryUpdateService.ts @@ -1337,8 +1337,10 @@ export const addMissionRewards = async ( if (voidTearWave && voidTearWave.Participants[0].QualifiesForReward) { if (!voidTearWave.Participants[0].HaveRewardResponse) { // non-endless fissure; giving reward now - const reward = await crackRelic(inventory, voidTearWave.Participants[0], inventoryChanges); - MissionRewards.push({ StoreItem: reward.type, ItemCount: reward.itemCount }); + const rewards = await crackRelic(inventory, voidTearWave.Participants[0], inventoryChanges); + rewards.forEach(reward => { + MissionRewards.push({ StoreItem: reward.type, ItemCount: reward.itemCount }); + }); } else if (inventory.MissionRelicRewards) { // endless fissure; already gave reward(s) but should still show in EOM screen for (const reward of inventory.MissionRelicRewards) { diff --git a/src/types/inventoryTypes/inventoryTypes.ts b/src/types/inventoryTypes/inventoryTypes.ts index 83d00c1d..5f4ab2ad 100644 --- a/src/types/inventoryTypes/inventoryTypes.ts +++ b/src/types/inventoryTypes/inventoryTypes.ts @@ -61,6 +61,7 @@ export interface IAccountCheats { nemesisHintProgressMultiplierGrineer?: number; nemesisHintProgressMultiplierCorpus?: number; nemesisExtraWeapon?: number; + extraRelicRewards?: number; } export interface IInventoryDatabase diff --git a/static/webui/index.html b/static/webui/index.html index ba8e4b78..46a90e93 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -1057,6 +1057,13 @@ +
+ +
+ + +
+
diff --git a/static/webui/translations/en.js b/static/webui/translations/en.js index 57a32595..0a03a78b 100644 --- a/static/webui/translations/en.js +++ b/static/webui/translations/en.js @@ -262,6 +262,7 @@ dict = { cheats_nemesisHintProgressMultiplierGrineer: `Hint Progress Multiplier (Grineer)`, cheats_nemesisHintProgressMultiplierCorpus: `Hint Progress Multiplier (Corpus)`, cheats_nemesisExtraWeapon: `Extra Nemesis Weapon / Token On Vanquish (0 to disable)`, + cheats_extraRelicRewards: `Extra Relic Rewards`, worldState: `World State`, worldState_creditBoost: `Credit Boost`, diff --git a/static/webui/translations/zh.js b/static/webui/translations/zh.js index 97a24244..84d49823 100644 --- a/static/webui/translations/zh.js +++ b/static/webui/translations/zh.js @@ -263,6 +263,7 @@ dict = { cheats_nemesisHintProgressMultiplierGrineer: `解密进度倍率 (Grineer)`, cheats_nemesisHintProgressMultiplierCorpus: `解密进度倍率 (Corpus)`, cheats_nemesisExtraWeapon: `额外玄骸武器/代币 (0为禁用)`, + cheats_extraRelicRewards: `额外遗物奖励`, worldState: `世界状态配置`, worldState_creditBoost: `现金加成`, From 92c59bcc3a18303ddc781b0867b4082bb05e7db2 Mon Sep 17 00:00:00 2001 From: AlexisinGit <136088944+AlexisinGit@users.noreply.github.com> Date: Sun, 31 Aug 2025 18:16:39 +0800 Subject: [PATCH 2/2] cheat: crackRelicForPlatinum --- src/helpers/relicHelper.ts | 21 ++++++++++++++++ src/models/inventoryModels/inventoryModel.ts | 4 ++++ src/types/inventoryTypes/inventoryTypes.ts | 4 ++++ static/webui/index.html | 25 ++++++++++++++++++++ static/webui/translations/en.js | 4 ++++ static/webui/translations/zh.js | 4 ++++ 6 files changed, 62 insertions(+) diff --git a/src/helpers/relicHelper.ts b/src/helpers/relicHelper.ts index be79099f..4b5dee21 100644 --- a/src/helpers/relicHelper.ts +++ b/src/helpers/relicHelper.ts @@ -9,6 +9,7 @@ import { addMiscItems, combineInventoryChanges } from "../services/inventoryServ import { handleStoreItemAcquisition } from "../services/purchaseService.ts"; import type { IInventoryChanges } from "../types/purchaseTypes.ts"; import { config } from "../services/configService.ts"; +import { log } from "winston"; export const crackRelic = async ( inventory: TInventoryDatabaseDocument, @@ -46,6 +47,26 @@ export const crackRelic = async ( inventoryChanges, (await handleStoreItemAcquisition(reward.type, inventory, reward.itemCount)).InventoryChanges ); + + if (inventory.crackRelicForPlatinum) { + let platinumReward = 0; + switch (reward.rarity) { + case "COMMON": + platinumReward = inventory.relicPlatinumCommon ?? 2; + break; + case "UNCOMMON": + platinumReward = inventory.relicPlatinumUncommon ?? 5; + break; + case "RARE": + platinumReward = inventory.relicPlatinumRare ?? 12; + break; + case "LEGENDARY": + logger.warn(`got a legendary reward for a relic!`); + break; + } + logger.debug(`adding ${platinumReward} platinum to inventory for a ${reward.rarity} reward`); + inventory.PremiumCredits += platinumReward; + } } // Remove relic diff --git a/src/models/inventoryModels/inventoryModel.ts b/src/models/inventoryModels/inventoryModel.ts index b9cc2806..045c1234 100644 --- a/src/models/inventoryModels/inventoryModel.ts +++ b/src/models/inventoryModels/inventoryModel.ts @@ -1469,6 +1469,10 @@ const inventorySchema = new Schema( nemesisHintProgressMultiplierCorpus: Number, nemesisExtraWeapon: Number, extraRelicRewards: Number, + crackRelicForPlatinum: Boolean, + relicPlatinumCommon: Number, + relicPlatinumUncommon: Number, + relicPlatinumRare: Number, SubscribedToEmails: { type: Number, default: 0 }, SubscribedToEmailsPersonalized: { type: Number, default: 0 }, diff --git a/src/types/inventoryTypes/inventoryTypes.ts b/src/types/inventoryTypes/inventoryTypes.ts index 5f4ab2ad..3251f38b 100644 --- a/src/types/inventoryTypes/inventoryTypes.ts +++ b/src/types/inventoryTypes/inventoryTypes.ts @@ -62,6 +62,10 @@ export interface IAccountCheats { nemesisHintProgressMultiplierCorpus?: number; nemesisExtraWeapon?: number; extraRelicRewards?: number; + crackRelicForPlatinum?: boolean; + relicPlatinumCommon?: number; + relicPlatinumUncommon?: number; + relicPlatinumRare?: number; } export interface IInventoryDatabase diff --git a/static/webui/index.html b/static/webui/index.html index 46a90e93..5984d792 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -1064,6 +1064,31 @@
+
+ + +
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
diff --git a/static/webui/translations/en.js b/static/webui/translations/en.js index 0a03a78b..cee454d3 100644 --- a/static/webui/translations/en.js +++ b/static/webui/translations/en.js @@ -263,6 +263,10 @@ dict = { cheats_nemesisHintProgressMultiplierCorpus: `Hint Progress Multiplier (Corpus)`, cheats_nemesisExtraWeapon: `Extra Nemesis Weapon / Token On Vanquish (0 to disable)`, cheats_extraRelicRewards: `Extra Relic Rewards`, + cheats_crackRelicForPlatinum: `Crack Relic for Platinum`, + cheats_relicPlatinumCommon: `Platinum on Common Rewards`, + cheats_relicPlatinumUncommon: `Platinum on Uncommon Rewards`, + cheats_relicPlatinumRare: `Platinum on Rare Rewards`, worldState: `World State`, worldState_creditBoost: `Credit Boost`, diff --git a/static/webui/translations/zh.js b/static/webui/translations/zh.js index 84d49823..17a915d7 100644 --- a/static/webui/translations/zh.js +++ b/static/webui/translations/zh.js @@ -264,6 +264,10 @@ dict = { cheats_nemesisHintProgressMultiplierCorpus: `解密进度倍率 (Corpus)`, cheats_nemesisExtraWeapon: `额外玄骸武器/代币 (0为禁用)`, cheats_extraRelicRewards: `额外遗物奖励`, + cheats_crackRelicForPlatinum: `打开遗物时获得白金`, + cheats_relicPlatinumCommon: `普通奖励的白金`, + cheats_relicPlatinumUncommon: `罕见奖励的白金`, + cheats_relicPlatinumRare: `稀有奖励的白金`, worldState: `世界状态配置`, worldState_creditBoost: `现金加成`,