Refactored GetDisplayableAssorts for clarity

Moved slow operations closer to their use inside `IsDisplayableOffer`
This commit is contained in:
Chomp
2025-08-07 23:24:23 +01:00
parent 15023f2e27
commit 5e05049669
2 changed files with 31 additions and 22 deletions
@@ -97,15 +97,13 @@ public class RagfairHelper(
return result;
}
public Dictionary<MongoId, TraderAssort> GetDisplayableAssorts(MongoId sessionId)
public Dictionary<MongoId, TraderAssort> GetDisplayableAssorts(MongoId sessionId, bool showLockedAssorts = true)
{
var result = new Dictionary<MongoId, TraderAssort>();
foreach (var traderId in databaseService.GetTraders().Keys.Where(traderId => _ragfairConfig.Traders.ContainsKey(traderId)))
{
result[traderId] = traderAssortHelper.GetAssort(sessionId, traderId, true);
}
var traders = databaseService.GetTraders();
return result;
return traders
.Keys.Where(traderId => _ragfairConfig.Traders.ContainsKey(traderId)) // Trader enabled in config
.ToDictionary(traderId => traderId, traderId => traderAssortHelper.GetAssort(sessionId, traderId, showLockedAssorts));
}
protected List<MongoId> GetCategoryList(MongoId handbookId)
@@ -67,12 +67,21 @@ public class RagfairOfferHelper(
.GetOffers()
.Where(offer =>
{
if (!PassesSearchFilterCriteria(searchRequest, offer, pmcData))
var offerRootItem = offer.Items.FirstOrDefault();
if (!PassesSearchFilterCriteria(searchRequest, offer, offerRootItem, pmcData))
{
return false;
}
var isDisplayable = IsDisplayableOffer(searchRequest, itemsToAdd, traderAssorts, offer, pmcData, playerIsFleaBanned);
var isDisplayable = IsDisplayableOffer(
searchRequest,
itemsToAdd,
traderAssorts,
offer,
offerRootItem,
pmcData,
playerIsFleaBanned
);
if (!isDisplayable)
{
@@ -168,17 +177,18 @@ public class RagfairOfferHelper(
var tieredFlea = _ragfairConfig.TieredFlea;
var tieredFleaLimitTypes = tieredFlea.UnlocksType;
var tieredFleaKeys = tieredFleaLimitTypes.Keys.ToHashSet();
var result = new List<RagfairOffer>();
foreach (
var offer in offerIDsForItem
.Select(ragfairOfferService.GetOfferByOfferId)
.Where(offer => PassesSearchFilterCriteria(searchRequest, offer, pmcData))
.Where(offer => PassesSearchFilterCriteria(searchRequest, offer, offer.Items.FirstOrDefault(), pmcData))
)
{
if (tieredFlea.Enabled && !offer.IsTraderOffer())
{
CheckAndLockOfferFromPlayerTieredFlea(tieredFlea, offer, tieredFleaLimitTypes.Keys.ToHashSet(), pmcData.Info.Level.Value);
CheckAndLockOfferFromPlayerTieredFlea(tieredFlea, offer, tieredFleaKeys, pmcData.Info.Level.Value);
}
result.Add(offer);
@@ -225,12 +235,13 @@ public class RagfairOfferHelper(
continue;
}
if (!PassesSearchFilterCriteria(searchRequest, offer, pmcData))
var rootOfferItem = offer.Items.FirstOrDefault();
if (!PassesSearchFilterCriteria(searchRequest, offer, rootOfferItem, pmcData))
{
continue;
}
if (!IsDisplayableOffer(searchRequest, itemsToAdd, traderAssorts, offer, pmcData, playerIsFleaBanned))
if (!IsDisplayableOffer(searchRequest, itemsToAdd, traderAssorts, offer, rootOfferItem, pmcData, playerIsFleaBanned))
{
continue;
}
@@ -324,6 +335,7 @@ public class RagfairOfferHelper(
/// <param name="itemsToAdd"></param>
/// <param name="traderAssorts">Trader assort items - used for filtering out locked trader items</param>
/// <param name="offer">Flea offer</param>
/// <param name="offerRootItem">Root offer item</param>
/// <param name="pmcProfile">Player profile</param>
/// <param name="playerIsFleaBanned">Player cannot view flea yet/ever</param>
/// <returns>True = should be shown to player</returns>
@@ -332,16 +344,12 @@ public class RagfairOfferHelper(
HashSet<MongoId> itemsToAdd,
Dictionary<MongoId, TraderAssort> traderAssorts,
RagfairOffer offer,
Item offerRootItem,
PmcData pmcProfile,
bool playerIsFleaBanned = false
)
{
var offerRootItem = offer.Items.FirstOrDefault();
// Currency offer is sold for
var moneyTypeTpl = offer.Requirements.FirstOrDefault().TemplateId;
var isTraderOffer = offer.IsTraderOffer();
if (!isTraderOffer && playerIsFleaBanned)
{
return false;
@@ -356,7 +364,8 @@ public class RagfairOfferHelper(
// Performing a required search and offer doesn't have requirement for item
if (
!string.IsNullOrEmpty(searchRequest.NeededSearchId)
!searchRequest.NeededSearchId.HasValue
&& !searchRequest.NeededSearchId.Value.IsEmpty()
&& !offer.Requirements.Any(requirement => requirement.TemplateId == searchRequest.NeededSearchId)
)
{
@@ -374,6 +383,8 @@ public class RagfairOfferHelper(
return false;
}
// Currency offer is sold for
var moneyTypeTpl = offer.Requirements.FirstOrDefault().TemplateId;
// commented out as required search "which is for checking offers that are barters"
// has info.removeBartering as true, this if statement removed barter items.
if (searchRequest.RemoveBartering.GetValueOrDefault(false) && !paymentHelper.IsMoneyTpl(moneyTypeTpl))
@@ -394,7 +405,7 @@ public class RagfairOfferHelper(
if (isTraderOffer)
{
if (!traderAssorts.TryGetValue(offer.User.Id, out var assort))
// trader not visible on flea market
// Trader not visible on flea market
{
return false;
}
@@ -832,9 +843,10 @@ public class RagfairOfferHelper(
/// </summary>
/// <param name="searchRequest">Client search request</param>
/// <param name="offer">Offer to check</param>
/// <param name="offerRootItem">root item of offer</param>
/// <param name="pmcData">Player profile</param>
/// <returns>True if offer passes criteria</returns>
protected bool PassesSearchFilterCriteria(SearchRequestData searchRequest, RagfairOffer offer, PmcData pmcData)
protected bool PassesSearchFilterCriteria(SearchRequestData searchRequest, RagfairOffer offer, Item offerRootItem, PmcData pmcData)
{
var isDefaultUserOffer = offer.User.MemberType == MemberCategory.Default;
if (pmcData.Info.Level < databaseService.GetGlobals().Configuration.RagFair.MinUserLevel && isDefaultUserOffer)
@@ -862,7 +874,6 @@ public class RagfairOfferHelper(
return false;
}
var offerRootItem = offer.Items.FirstOrDefault();
if (searchRequest.QuantityFrom > 0 && offerRootItem.Upd.StackObjectsCount < searchRequest.QuantityFrom)
// Too few items to offer
{