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] 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: `现金加成`,