diff --git a/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs b/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs index 6576ae01..5164ec5f 100644 --- a/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs +++ b/Libraries/SPTarkov.Server.Core/Controllers/RagfairController.cs @@ -11,6 +11,7 @@ using SPTarkov.Server.Core.Models.Eft.Ragfair; using SPTarkov.Server.Core.Models.Eft.Trade; using SPTarkov.Server.Core.Models.Enums; using SPTarkov.Server.Core.Models.Spt.Config; +using SPTarkov.Server.Core.Models.Spt.Ragfair; using SPTarkov.Server.Core.Models.Utils; using SPTarkov.Server.Core.Routers; using SPTarkov.Server.Core.Servers; @@ -1013,16 +1014,19 @@ public class RagfairController( OnlyFunctional = item.OnlyFunctional, }); - return ragfairOfferGenerator.CreateAndAddFleaOffer( - sessionId, - timeUtil.GetTimeStamp(), - formattedItems.ToList(), - formattedRequirements.ToList(), - loyalLevel, - (int?)items.FirstOrDefault()?.Upd?.StackObjectsCount ?? 1, - OfferCreator.Player, - sellInOnePiece - ); + var createOfferDetails = new CreateFleaOfferDetails + { + UserId = sessionId, + Time = timeUtil.GetTimeStamp(), + Items = formattedItems.ToList(), + BarterScheme = formattedRequirements.ToList(), + LoyalLevel = loyalLevel, + Quantity = (int?)items.FirstOrDefault()?.Upd?.StackObjectsCount ?? 1, + Creator = OfferCreator.Player, + SellInOnePiece = sellInOnePiece, + }; + + return ragfairOfferGenerator.CreateAndAddFleaOffer(createOfferDetails); } /// @@ -1035,7 +1039,7 @@ public class RagfairController( return requirements.Sum(requirement => { if ( - string.IsNullOrEmpty(requirement.Template) + requirement.Template.IsEmpty() || !requirement.Count.HasValue || requirement.Count == 0 ) diff --git a/Libraries/SPTarkov.Server.Core/Generators/RagfairOfferGenerator.cs b/Libraries/SPTarkov.Server.Core/Generators/RagfairOfferGenerator.cs index 98517995..e0b02cc4 100644 --- a/Libraries/SPTarkov.Server.Core/Generators/RagfairOfferGenerator.cs +++ b/Libraries/SPTarkov.Server.Core/Generators/RagfairOfferGenerator.cs @@ -51,39 +51,17 @@ public class RagfairOfferGenerator( /// /// Create a flea offer and store it in the Ragfair server offers array /// - /// Owner of the offer - /// Time offer is listed at - /// Items in the offer - /// Cost of item (currency or barter) - /// Loyalty level needed to buy item - /// Amount of item being listed - /// Who created this offer - /// Flags sellInOnePiece to be true + /// Data needed to create a flea offer /// RagfairOffer - public RagfairOffer CreateAndAddFleaOffer( - MongoId userId, - long time, - List items, - List barterScheme, - int loyalLevel, - int quantity, - OfferCreator creator, - bool sellInOnePiece = false - ) + public RagfairOffer CreateAndAddFleaOffer(CreateFleaOfferDetails details) { - var offer = CreateOffer( - userId, - time, - items, - barterScheme, - loyalLevel, - quantity, - creator, - sellInOnePiece - ); + // Create offer object + var offer = CreateOffer(details); - offer.CreatedBy = creator; + // Flag offer with creator type + offer.CreatedBy = details.Creator; + // Add offer into server storage ragfairOfferService.AddOffer(offer); return offer; @@ -92,28 +70,12 @@ public class RagfairOfferGenerator( /// /// Create an offer object ready to send to ragfairOfferService.addOffer() /// - /// Owner of the offer - /// Timestamp offer is listed at - /// Items in the offer - /// Cost of item (currency or barter) - /// Loyalty level needed to buy item - /// Amount of item being listed - /// Is offer being created flagged as a pack - /// Offer is from a player + /// Data needed to create a flea offer /// RagfairOffer - protected RagfairOffer CreateOffer( - MongoId userId, - long time, - List items, - List barterScheme, - int loyalLevel, - int quantity, - OfferCreator creator, - bool isPackOffer = false - ) + protected RagfairOffer CreateOffer(CreateFleaOfferDetails details) { - var offerRequirements = barterScheme - .Select(barter => + var offerRequirements = details + .BarterScheme.Select(barter => { var offerRequirement = new OfferRequirement { @@ -134,7 +96,7 @@ public class RagfairOfferGenerator( .ToList(); // Clone to avoid modifying original array - var itemsClone = cloner.Clone(items); + var itemsClone = cloner.Clone(details.Items); var rootItem = itemsClone.FirstOrDefault(); // Hydrate ammo boxes with cartridges + ensure only 1 item is present (ammo box) @@ -151,8 +113,8 @@ public class RagfairOfferGenerator( } var roubleListingPrice = Math.Round(ConvertOfferRequirementsIntoRoubles(offerRequirements)); - var singleItemListingPrice = isPackOffer - ? roubleListingPrice / quantity + var singleItemListingPrice = details.SellInOnePiece + ? roubleListingPrice / details.Quantity : roubleListingPrice; var offer = new RagfairOffer @@ -160,21 +122,24 @@ public class RagfairOfferGenerator( Id = new MongoId(), InternalId = offerCounter, User = - creator == OfferCreator.Player - ? CreatePlayerUserDataForFleaOffer(userId) - : CreateUserDataForFleaOffer(userId, ragfairServerHelper.IsTrader(userId)), + details.Creator == OfferCreator.Player + ? CreatePlayerUserDataForFleaOffer(details.UserId) + : CreateUserDataForFleaOffer( + details.UserId, + details.Creator == OfferCreator.Trader + ), Root = rootItem.Id, Items = itemsClone, ItemsCost = Math.Round(handbookHelper.GetTemplatePrice(rootItem.Template)), // Handbook price Requirements = offerRequirements, RequirementsCost = Math.Round(singleItemListingPrice), SummaryCost = roubleListingPrice, - StartTime = time, - EndTime = GetOfferEndTime(creator, userId, time), - LoyaltyLevel = loyalLevel, - SellInOnePiece = isPackOffer, + StartTime = details.Time, + EndTime = GetOfferEndTime(details.Creator, details.UserId, details.Time), + LoyaltyLevel = details.LoyalLevel, + SellInOnePiece = details.SellInOnePiece, Locked = false, - Quantity = quantity, + Quantity = details.Quantity, }; offerCounter++; @@ -607,16 +572,18 @@ public class RagfairOfferGenerator( barterScheme = CreateCurrencyBarterScheme(itemWithChildren, isPackOffer); } - CreateAndAddFleaOffer( - sellerId, - timeUtil.GetTimeStamp(), - itemWithChildren, - barterScheme, - 1, - desiredStackSize, - OfferCreator.FakePlayer, - isPackOffer // sellAsOnePiece - pack offer - ); + var createOfferDetails = new CreateFleaOfferDetails + { + UserId = sellerId, + Time = timeUtil.GetTimeStamp(), + Items = itemWithChildren, + BarterScheme = barterScheme, + LoyalLevel = 1, + Quantity = desiredStackSize, + Creator = OfferCreator.FakePlayer, + SellInOnePiece = isPackOffer, // sellAsOnePiece - pack offer + }; + CreateAndAddFleaOffer(createOfferDetails); } /// @@ -732,15 +699,17 @@ public class RagfairOfferGenerator( var barterSchemeItems = barterScheme[0]; var loyalLevel = assortsClone.LoyalLevelItems[item.Id]; - CreateAndAddFleaOffer( - traderId, - time, - items, - barterSchemeItems, - loyalLevel, - (int?)item.Upd.StackObjectsCount ?? 1, - OfferCreator.Trader - ); + var createOfferDetails = new CreateFleaOfferDetails + { + UserId = traderId, + Time = time, + Items = items, + BarterScheme = barterSchemeItems, + LoyalLevel = loyalLevel, + Quantity = (int?)item.Upd.StackObjectsCount ?? 1, + Creator = OfferCreator.Trader, + }; + CreateAndAddFleaOffer(createOfferDetails); // Refresh complete, reset flag to false trader.Base.RefreshTraderRagfairOffers = false; diff --git a/Libraries/SPTarkov.Server.Core/Models/Spt/Ragfair/CreateFleaOfferDetails.cs b/Libraries/SPTarkov.Server.Core/Models/Spt/Ragfair/CreateFleaOfferDetails.cs new file mode 100644 index 00000000..7e9e9aca --- /dev/null +++ b/Libraries/SPTarkov.Server.Core/Models/Spt/Ragfair/CreateFleaOfferDetails.cs @@ -0,0 +1,49 @@ +using SPTarkov.Server.Core.Models.Common; +using SPTarkov.Server.Core.Models.Eft.Common.Tables; +using SPTarkov.Server.Core.Models.Enums; + +namespace SPTarkov.Server.Core.Models.Spt.Ragfair +{ + public record CreateFleaOfferDetails + { + /// + /// Owner of the offer + /// + public MongoId UserId { get; set; } + + /// + /// Time offer is listed at + /// + public long Time { get; set; } + + /// + /// Items in the offer + /// + public List Items { get; set; } + + /// + /// Cost of item (currency or barter) + /// + public List BarterScheme { get; set; } + + /// + /// Loyalty level needed to buy item + /// + public int LoyalLevel { get; set; } + + /// + /// Amount of item being listed + /// + public int Quantity { get; set; } + + /// + /// Who created the offer + /// + public OfferCreator Creator { get; set; } + + /// + /// Offer should be sold all in one offer + /// + public bool SellInOnePiece { get; set; } + } +}