diff --git a/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs b/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs index 25ad55dc..6900caec 100644 --- a/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs +++ b/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs @@ -555,13 +555,15 @@ public class RagfairController SptProfile fullProfile, ItemEventRouterResponse output) { var pmcData = fullProfile.CharacterData.PmcData; - // var itemsToListCount = offerRequest.Items.Count; // Wasnt used to commented out for now // Does not count stack size, only items + // var itemsToListCount = offerRequest.Items.Count; // Wasn't used to commented out for now // Does not count stack size, only items + + var firstOfferItemId = offerRequest.Items.First(); // What id chosen doesn't matter, it's a multi-offer so all items are the same // multi-offers are all the same item, // Get first item and its children and use as template - var firstListingAndChidren = _itemHelper.FindAndReturnChildrenAsItems( + var inventoryItems = _itemHelper.FindAndReturnChildrenAsItems( pmcData.Inventory.Items, - offerRequest.Items[0] + firstOfferItemId // Choose first item as they're all the same item ); // Find items to be listed on flea (+ children) from player inventory @@ -571,19 +573,19 @@ public class RagfairController _httpResponseUtil.AppendErrorToOutput(output, result.ErrorMessage); } - // Total count of items summed using their stack counts + // Total count of items summed using their individual stack counts var stackCountTotal = _ragfairOfferHelper.GetTotalStackCountSize(result.Items); // When listing identical items on flea, condense separate items into one stack with a merged stack count - // e.g. 2 ammo items, stackObjectCount = 3 for each, will result in 1 stack of 6 - firstListingAndChidren[0].Upd ??= new Upd(); - firstListingAndChidren[0].Upd.StackObjectsCount = stackCountTotal; + // e.g. 2 ammo items each with stackObjectCount = 3, will result in 1 stack of 6 + inventoryItems[0].Upd ??= new Upd(); + inventoryItems[0].Upd.StackObjectsCount = stackCountTotal; // Create flea object - var offer = CreatePlayerOffer(sessionID, offerRequest.Requirements, firstListingAndChidren, false); + var offer = CreatePlayerOffer(sessionID, offerRequest.Requirements, inventoryItems, false); // This is the item that will be listed on flea, has merged stackObjectCount - var newRootOfferItem = offer.Items[0]; + var rootOfferItem = offer.Items.First(x => x.Id == firstOfferItemId); // Average offer price for single item (or whole weapon) var averages = @@ -593,10 +595,10 @@ public class RagfairController TemplateId = offer.Items[0].Template } ); - var averageOfferPrice = averages.Avg; // Check for and apply item price modifer if it exists in config - if (_ragfairConfig.Dynamic.ItemPriceMultiplier.TryGetValue(newRootOfferItem.Template, out var itemPriceModifer)) + var averageOfferPrice = averages.Avg; + if (_ragfairConfig.Dynamic.ItemPriceMultiplier.TryGetValue(rootOfferItem.Template, out var itemPriceModifer)) { averageOfferPrice *= itemPriceModifer; } @@ -625,7 +627,7 @@ public class RagfairController { var taxFeeChargeFailed = ChargePlayerTaxFee( sessionID, - newRootOfferItem, + rootOfferItem, pmcData, playerListedPriceInRub, (int) stackCountTotal, @@ -665,7 +667,7 @@ public class RagfairController SptProfile fullProfile, ItemEventRouterResponse output) { var pmcData = fullProfile.CharacterData.PmcData; - // var itemsToListCount = offerRequest.Items.Count; // Wasn't used so commented out for now // Does not count stack size, only items + // var itemsToListCount = offerRequest.Items.Count; // TODO: Wasn't used so commented out for now // Does not count stack size, only items // multi-offers are all the same item, // Get first item and its children and use as template @@ -687,14 +689,13 @@ public class RagfairController // When listing identical items on flea, condense separate items into one stack with a merged stack count // e.g. 2 ammo items, stackObjectCount = 3 for each, will result in 1 stack of 6 firstListingAndChidren[0].Upd ??= new Upd(); - firstListingAndChidren[0].Upd.StackObjectsCount = stackCountTotal; // Create flea object var offer = CreatePlayerOffer(sessionID, offerRequest.Requirements, firstListingAndChidren, true); // This is the item that will be listed on flea, has merged stackObjectCount - var newRootOfferItem = offer.Items[0]; + var newRootOfferItem = offer.Items[0]; // TODO: add logic like single/multi offers to find root item // Single price for an item var averages = GetItemMinAvgMaxFleaPriceValues( @@ -778,24 +779,25 @@ public class RagfairController // var itemsToListCount = offerRequest.Items.Count; // Wasn't used so commented out for now // Does not count stack size, only items // Find items to be listed on flea from player inventory - var result = GetItemsToListOnFleaFromInventory(pmcData, offerRequest.Items); - if (result.Items is null || !string.IsNullOrEmpty(result.ErrorMessage)) + var inventoryItemsToSell = GetItemsToListOnFleaFromInventory(pmcData, offerRequest.Items); + if (inventoryItemsToSell.Items is null || !string.IsNullOrEmpty(inventoryItemsToSell.ErrorMessage)) { - _httpResponseUtil.AppendErrorToOutput(output, result.ErrorMessage); + _httpResponseUtil.AppendErrorToOutput(output, inventoryItemsToSell.ErrorMessage); } // Total count of items summed using their stack counts - var stackCountTotal = _ragfairOfferHelper.GetTotalStackCountSize(result.Items); + var stackCountTotal = _ragfairOfferHelper.GetTotalStackCountSize(inventoryItemsToSell.Items); - // Checks are done, create the offer + // Checks are done, create offer var playerListedPriceInRub = CalculateRequirementsPriceInRub(offerRequest.Requirements); var offer = CreatePlayerOffer( sessionID, offerRequest.Requirements, - result.Items.First(), + inventoryItemsToSell.Items.First(), // Single offer, value will be collection with one array of items false ); - var rootItem = offer.Items.First(); + + var offerRootItem = offer.Items.FirstOrDefault(x => x.Id == offerRequest.Items[0]); // Get average of items quality+children var qualityMultiplier = _itemHelper.GetItemQualityModifierForItems(offer.Items, true); @@ -805,13 +807,13 @@ public class RagfairController GetItemMinAvgMaxFleaPriceValues( new GetMarketPriceRequestData { - TemplateId = rootItem.Template + TemplateId = offerRootItem.Template } ); var averageOfferPriceSingleItem = averages.Avg; // Check for and apply item price modifer if it exists in config - if (_ragfairConfig.Dynamic.ItemPriceMultiplier.TryGetValue(rootItem.Template, out var itemPriceModifer)) + if (_ragfairConfig.Dynamic.ItemPriceMultiplier.TryGetValue(offerRootItem.Template, out var itemPriceModifer)) { averageOfferPriceSingleItem *= itemPriceModifer; } @@ -832,7 +834,7 @@ public class RagfairController { var taxFeeChargeFailed = ChargePlayerTaxFee( sessionID, - rootItem, + offerRootItem, pmcData, playerListedPriceInRub, (int) stackCountTotal, @@ -994,8 +996,8 @@ public class RagfairController // Count how many items are being sold and multiply the requested amount accordingly foreach (var itemId in itemIdsFromFleaOfferRequest) { - var item = pmcData.Inventory?.Items?.FirstOrDefault(i => i.Id == itemId); - if (item is null) + var rootItem = pmcData.Inventory?.Items?.FirstOrDefault(i => i.Id == itemId); + if (rootItem is null) { errorMessage = _localisationService.GetText( "ragfair-unable_to_find_item_in_inventory", @@ -1013,7 +1015,8 @@ public class RagfairController }; } - item = _itemHelper.FixItemStackCount(item); + _itemHelper.FixItemStackCount(rootItem); + itemsToReturn.Add(_itemHelper.FindAndReturnChildrenAsItems(pmcData.Inventory.Items, itemId)); } diff --git a/Libraries/SPTarkov.Server.Core/Helpers/ItemHelper.cs b/Libraries/SPTarkov.Server.Core/Helpers/ItemHelper.cs index 4f6515b5..87632a81 100644 --- a/Libraries/SPTarkov.Server.Core/Helpers/ItemHelper.cs +++ b/Libraries/SPTarkov.Server.Core/Helpers/ItemHelper.cs @@ -804,13 +804,14 @@ public class ItemHelper( public List FindAndReturnChildrenAsItems(IEnumerable items, string baseItemId, bool modsOnly = false) { // Use dictionary to make key lookup faster, convert to list before being returned - Dictionary result = []; + OrderedDictionary result = []; foreach (var childItem in items) { // Include itself if (string.Equals(childItem.Id, baseItemId, StringComparison.Ordinal)) { - result.Add(childItem.Id, childItem); + // Root item MUST be at 0 index for things like flea market offers + result.Insert(0, childItem.Id, childItem); continue; }