From 57461a06dd863ad012a023d09c5bd594f163c733 Mon Sep 17 00:00:00 2001 From: mfkvfhpdx Date: Mon, 4 May 2026 17:01:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9F=90=E7=B3=BB=E5=91=A8?= =?UTF-8?q?=E6=9C=AC=E6=B2=A1=E6=9C=89=E7=BA=B3=E5=85=A5=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E8=8C=83=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/Cultivation/CultivationService.cs | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs index e8704e6..c8543f7 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs @@ -129,6 +129,7 @@ internal sealed partial class CultivationService : ICultivationService token.ThrowIfCancellationRequested(); Dictionary resultItems = []; Guid projectId = cultivateProject.InnerId; + Dictionary inventoryCounts = []; foreach (ref readonly CultivateEntry entry in cultivationRepository.GetCultivateEntryImmutableArrayByProjectId(projectId).AsSpan()) { @@ -153,6 +154,7 @@ internal sealed partial class CultivationService : ICultivationService foreach (ref readonly InventoryItem inventoryItem in inventoryRepository.GetInventoryItemImmutableArrayByProjectId(projectId).AsSpan()) { token.ThrowIfCancellationRequested(); + inventoryCounts[inventoryItem.ItemId] = inventoryItem.Count; ref StatisticsCultivateItem existedItem = ref CollectionsMarshal.GetValueRefOrNullRef(resultItems, inventoryItem.ItemId); if (!Unsafe.IsNullRef(in existedItem)) { @@ -160,6 +162,13 @@ internal sealed partial class CultivationService : ICultivationService } } + AddWeeklyBossGroupInventoryDonors( + resultItems, + inventoryCounts, + context, + cultivateProject.ServerTimeZoneOffset, + mergeOptions.WeeklyBossMaterialInterchange); + CultivationStatisticsSurplusMerge.Apply(resultItems, context, mergeOptions); CultivationStatisticsWeeklyBossInterchange.Apply( resultItems, @@ -171,6 +180,55 @@ internal sealed partial class CultivationService : ICultivationService } } + private static void AddWeeklyBossGroupInventoryDonors( + Dictionary items, + Dictionary inventoryCounts, + ICultivationMetadataContext context, + TimeSpan offset, + bool enabled) + { + if (!enabled || context.WeeklyBossMaterialInterchangeGroups.IsDefaultOrEmpty) + { + return; + } + + foreach (ImmutableArray group in context.WeeklyBossMaterialInterchangeGroups) + { + bool anyPlannedInGroup = false; + foreach (MaterialId mid in group) + { + if (items.ContainsKey(mid)) + { + anyPlannedInGroup = true; + break; + } + } + + if (!anyPlannedInGroup) + { + continue; + } + + foreach (MaterialId mid in group) + { + uint id = mid; + if (items.ContainsKey(id)) + { + continue; + } + + if (!inventoryCounts.TryGetValue(id, out uint inv) || inv is 0U) + { + continue; + } + + StatisticsCultivateItem donor = StatisticsCultivateItem.Create(context.GetMaterial(id), offset); + donor.Current = inv; + items[id] = donor; + } + } + } + public ValueTask GetResinStatisticsAsync(StatisticsCultivateItemCollection statisticsCultivateItems, CancellationToken token) { return cultivationResinStatisticsService.GetResinStatisticsAsync(statisticsCultivateItems, token);