From 041be9f3142212c2865976d54dae753220785810 Mon Sep 17 00:00:00 2001 From: CWX Date: Sat, 1 Feb 2025 19:01:09 +0000 Subject: [PATCH] partial fix for scav cultist circle --- .../Core/Services/CircleOfCultistService.cs | 115 ++++++++++++------ 1 file changed, 76 insertions(+), 39 deletions(-) diff --git a/Libraries/Core/Services/CircleOfCultistService.cs b/Libraries/Core/Services/CircleOfCultistService.cs index 4ab4a3ad..8792b4de 100644 --- a/Libraries/Core/Services/CircleOfCultistService.cs +++ b/Libraries/Core/Services/CircleOfCultistService.cs @@ -534,15 +534,17 @@ public class CircleOfCultistService( protected int GetDirectRewardBaseTypeStackSize(string rewardTpl) { var itemDetails = _itemHelper.GetItem(rewardTpl); - if (!itemDetails.Key) { + if (!itemDetails.Key) + { _logger.Warning($"{rewardTpl} is not an item, setting stack size to 1"); return 1; } // Look for parent in dict - var settings = _hideoutConfig.CultistCircle.DirectRewardStackSize[itemDetails.Value.Parent]; - if (settings is null) { + var settings = _hideoutConfig.CultistCircle.DirectRewardStackSize.GetValueOrDefault(itemDetails.Value.Parent); + if (settings is null) + { return 1; } @@ -557,7 +559,8 @@ public class CircleOfCultistService( protected void FlagDirectRewardAsAcceptedInProfile(string sessionId, DirectRewardSettings directReward) { var fullProfile = _profileHelper.GetFullProfile(sessionId); - AcceptedCultistReward dataToStoreInProfile = new AcceptedCultistReward { + AcceptedCultistReward dataToStoreInProfile = new AcceptedCultistReward + { Timestamp = _timeUtil.GetTimeStamp(), SacrificeItems = directReward.RequiredItems, RewardItems = directReward.Reward, @@ -575,12 +578,14 @@ public class CircleOfCultistService( /// Size of stack protected int GetRewardStackSize(string itemTpl, int rewardPoolRemaining) { - if (_itemHelper.IsOfBaseclass(itemTpl, BaseClasses.AMMO)) { + if (_itemHelper.IsOfBaseclass(itemTpl, BaseClasses.AMMO)) + { var ammoTemplate = _itemHelper.GetItem(itemTpl).Value; return _itemHelper.GetRandomisedAmmoStackSize(ammoTemplate); } - if (_itemHelper.IsOfBaseclass(itemTpl, BaseClasses.MONEY)) { + if (_itemHelper.IsOfBaseclass(itemTpl, BaseClasses.MONEY)) + { // Get currency-specific values from config var settings = _hideoutConfig.CultistCircle.CurrencyRewards[itemTpl]; @@ -634,31 +639,39 @@ public class CircleOfCultistService( itemRewardBlacklist.UnionWith(itemsMatchingTypeBlacklist); // Hideout and task rewards are ONLY if the bonus is active - switch (craftingInfo.RewardType) { - case CircleRewardType.RANDOM: { + switch (craftingInfo.RewardType) + { + case CircleRewardType.RANDOM: + { // Does reward pass the high value threshold var isHighValueReward = craftingInfo.RewardAmountRoubles >= cultistCircleConfig.HighValueThresholdRub; GenerateRandomisedItemsAndAddToRewardPool(rewardPool, itemRewardBlacklist, isHighValueReward); break; } - case CircleRewardType.HIDEOUT_TASK: { + case CircleRewardType.HIDEOUT_TASK: + { // Hideout/Task loot AddHideoutUpgradeRequirementsToRewardPool(hideoutDbData, pmcData, itemRewardBlacklist, rewardPool); AddTaskItemRequirementsToRewardPool(pmcData, itemRewardBlacklist, rewardPool); // If we have no tasks or hideout stuff left or need more loot to fill it out, default to high value - if (rewardPool.Count < cultistCircleConfig.MaxRewardItemCount + 2) { + if (rewardPool.Count < cultistCircleConfig.MaxRewardItemCount + 2) + { GenerateRandomisedItemsAndAddToRewardPool(rewardPool, itemRewardBlacklist, true); } + break; } } // Add custom rewards from config - if (cultistCircleConfig.AdditionalRewardItemPool.Count > 0) { - foreach (var additionalReward in cultistCircleConfig.AdditionalRewardItemPool) { - if (itemRewardBlacklist.Contains(additionalReward)) { + if (cultistCircleConfig.AdditionalRewardItemPool.Count > 0) + { + foreach (var additionalReward in cultistCircleConfig.AdditionalRewardItemPool) + { + if (itemRewardBlacklist.Contains(additionalReward)) + { continue; } @@ -682,14 +695,18 @@ public class CircleOfCultistService( HashSet rewardPool) { var activeTasks = pmcData.Quests.Where((quest) => quest.Status == QuestStatusEnum.Started); - foreach (var task in activeTasks) { + foreach (var task in activeTasks) + { var questData = _questHelper.GetQuestFromDb(task.QId, pmcData); var handoverConditions = questData.Conditions.AvailableForFinish.Where( (condition) => condition.ConditionType == "HandoverItem" ); - foreach (var condition in handoverConditions) { - foreach (var neededItem in condition.Target.List) { - if (itemRewardBlacklist.Contains(neededItem) || !_itemHelper.IsValidItem(neededItem)) { + foreach (var condition in handoverConditions) + { + foreach (var neededItem in condition.Target.List) + { + if (itemRewardBlacklist.Contains(neededItem) || !_itemHelper.IsValidItem(neededItem)) + { continue; } @@ -697,6 +714,7 @@ public class CircleOfCultistService( { _logger.Debug($"Added Task Loot: {_itemHelper.GetItemName(neededItem)}"); } + rewardPool.Add(neededItem); } } @@ -717,21 +735,25 @@ public class CircleOfCultistService( HashSet rewardPool) { var dbAreas = hideoutDbData.Areas; - foreach (var profileArea in GetPlayerAccessibleHideoutAreas(pmcData.Hideout.Areas)) { + foreach (var profileArea in GetPlayerAccessibleHideoutAreas(pmcData.Hideout.Areas)) + { var currentStageLevel = profileArea.Level; var areaType = profileArea.Type; // Get next stage of area var dbArea = dbAreas.FirstOrDefault((area) => area.Type == areaType); var nextStageDbData = dbArea?.Stages[(currentStageLevel + 1).ToString()]; - if (nextStageDbData is not null) { + if (nextStageDbData is not null) + { // Next stage exists, gather up requirements and add to pool var itemRequirements = GetItemRequirements(nextStageDbData.Requirements); - foreach (var rewardToAdd in itemRequirements) { + foreach (var rewardToAdd in itemRequirements) + { if ( itemRewardBlacklist.Contains(rewardToAdd.TemplateId) || !_itemHelper.IsValidItem(rewardToAdd.TemplateId) - ) { + ) + { // Dont reward items sacrificed continue; } @@ -740,6 +762,7 @@ public class CircleOfCultistService( { _logger.Debug($"Added Hideout Loot: {_itemHelper.GetItemName(rewardToAdd.TemplateId)}"); } + rewardPool.Add(rewardToAdd.TemplateId); } } @@ -753,14 +776,19 @@ public class CircleOfCultistService( /// Active area array protected List GetPlayerAccessibleHideoutAreas(List areas) { - return areas.Where((area) => { - if (area.Type == HideoutAreas.CHRISTMAS_TREE && !_seasonalEventService.ChristmasEventEnabled()) { - // Christmas tree area and not Christmas, skip - return false; - } + return areas.Where( + (area) => + { + if (area.Type == HideoutAreas.CHRISTMAS_TREE && !_seasonalEventService.ChristmasEventEnabled()) + { + // Christmas tree area and not Christmas, skip + return false; + } - return true; - }).ToList(); + return true; + } + ) + .ToList(); } /// @@ -782,17 +810,21 @@ public class CircleOfCultistService( while ( currentItemCount < _hideoutConfig.CultistCircle.MaxRewardItemCount + 2 && attempts < allItems.Count - ) { + ) + { attempts++; var randomItem = _randomUtil.GetArrayValue(allItems); - if (itemRewardBlacklist.Contains(randomItem.Id) || !_itemHelper.IsValidItem(randomItem.Id)) { + if (itemRewardBlacklist.Contains(randomItem.Id) || !_itemHelper.IsValidItem(randomItem.Id)) + { continue; } // Valuable check - if (itemsShouldBeHighValue) { + if (itemsShouldBeHighValue) + { var itemValue = _itemHelper.GetItemMaxPrice(randomItem.Id); - if (itemValue < _hideoutConfig.CultistCircle.HighValueThresholdRub) { + if (itemValue < _hideoutConfig.CultistCircle.HighValueThresholdRub) + { continue; } } @@ -801,6 +833,7 @@ public class CircleOfCultistService( { _logger.Debug($"Added: {_itemHelper.GetItemName(randomItem.Id)}"); } + rewardPool.Add(randomItem.Id); currentItemCount++; } @@ -817,13 +850,13 @@ public class CircleOfCultistService( { return requirements.Where((requirement) => requirement.Type == "Item").ToList(); } - + /// /// Iterate over passed in hideout requirements and return the Item /// /// Requirements to iterate over /// Array of item requirements - protected List GetItemRequirements(List requirements) + protected List GetItemRequirements(List requirements) { return requirements.Where((requirement) => requirement.Type == "Item").ToList(); } @@ -836,10 +869,11 @@ public class CircleOfCultistService( protected Dictionary GenerateSacrificedItemsCache(List directRewards) { var result = new Dictionary(); - foreach (var rewardSettings in directRewards) { + foreach (var rewardSettings in directRewards) + { rewardSettings.RequiredItems.Sort(); var concat = string.Concat(rewardSettings.RequiredItems, ","); - + var key = _hashUtil.GenerateMd5ForData(concat); result[key] = rewardSettings; } @@ -866,19 +900,22 @@ public class CircleOfCultistService( ) { var canAddToContainer = false; - while (!canAddToContainer && rewards.Count > 0) { + while (!canAddToContainer && rewards.Count > 0) + { canAddToContainer = _inventoryHelper.CanPlaceItemsInContainer( _cloner.Clone(containerGrid), // MUST clone grid before passing in as function modifies grid rewards ); // Doesn't fit, remove one item - if (!canAddToContainer) { + if (!canAddToContainer) + { rewards.PopFirst(); } } - foreach (var itemToAdd in rewards) { + foreach (var itemToAdd in rewards) + { _inventoryHelper.PlaceItemInContainer( containerGrid, itemToAdd,