diff --git a/Libraries/Core/Controllers/TradeController.cs b/Libraries/Core/Controllers/TradeController.cs index e24fd7d3..31cd6b4e 100644 --- a/Libraries/Core/Controllers/TradeController.cs +++ b/Libraries/Core/Controllers/TradeController.cs @@ -59,7 +59,7 @@ public class TradeController( { var foundInRaid = _traderConfig.PurchasesAreFoundInRaid; var buyData = (ProcessBuyTradeRequestData) request; - _tradeHelper.buyItem(pmcData, buyData, sessionID, foundInRaid, output); + _tradeHelper.BuyItem(pmcData, buyData, sessionID, foundInRaid, output); return output; } @@ -139,7 +139,7 @@ public class TradeController( /// Session id /// Player profile /// Offer being purchased - /// request data from client + /// request data from client /// Output to send back to client private void BuyTraderItemFromRagfair( string sessionId, @@ -162,6 +162,10 @@ public class TradeController( return; } + // Reduce flea offer quantity + fleaOffer.Quantity -= requestOffer.Count; + + // Trigger purchase of item from trader var buyData = new ProcessBuyTradeRequestData { Action = "TradingConfirm", @@ -172,8 +176,7 @@ public class TradeController( SchemeId = 0, SchemeItems = requestOffer.Items }; - - _tradeHelper.buyItem(pmcData, buyData, sessionId, _traderConfig.PurchasesAreFoundInRaid, output); + _tradeHelper.BuyItem(pmcData, buyData, sessionId, _traderConfig.PurchasesAreFoundInRaid, output); } /// @@ -182,7 +185,7 @@ public class TradeController( /// Session id /// Player profile /// Offer being purchased - /// request data from client + /// request data from client /// Output to send back to client private void BuyPmcItemFromRagfair( string sessionId, @@ -203,20 +206,19 @@ public class TradeController( }; // buyItem() must occur prior to removing the offer stack, otherwise item inside offer doesn't exist for confirmTrading() to use - _tradeHelper.buyItem(pmcData, buyData, sessionId, _ragfairConfig.Dynamic.PurchasesAreFoundInRaid, output); + _tradeHelper.BuyItem(pmcData, buyData, sessionId, _ragfairConfig.Dynamic.PurchasesAreFoundInRaid, output); if (output.Warnings?.Count > 0) { return; } // resolve when a profile buy another profile's offer - var offerOwnerId = fleaOffer.User?.Id; + var offerOwnerId = fleaOffer.User.Id; var offerBuyCount = requestOffer.Count; - var isPlayerOffer = IsPlayerOffer(fleaOffer.Id, fleaOffer.User?.Id); - if (isPlayerOffer) + if (IsPlayerOffer(fleaOffer.Id, fleaOffer.User?.Id)) { - // Complete selling the offer now its been purchased + // Complete selling the offer now it has been purchased _ragfairOfferHelper.CompleteOffer(offerOwnerId, fleaOffer, offerBuyCount ?? 0); return; @@ -227,7 +229,7 @@ public class TradeController( } /// - /// Is the provided offerid and ownerid from a player made offer + /// Is the provided offerId and ownerId from a player made offer /// /// id of the offer /// Owner id diff --git a/Libraries/Core/Generators/RagfairOfferGenerator.cs b/Libraries/Core/Generators/RagfairOfferGenerator.cs index 2299b5ff..3bf8d06b 100644 --- a/Libraries/Core/Generators/RagfairOfferGenerator.cs +++ b/Libraries/Core/Generators/RagfairOfferGenerator.cs @@ -133,14 +133,15 @@ public class RagfairOfferGenerator( var roubleListingPrice = Math.Round((double) ConvertOfferRequirementsIntoRoubles(offerRequirements)); var singleItemListingPrice = isPackOffer ? roubleListingPrice / itemStackCount : roubleListingPrice; + var rootItem = items.FirstOrDefault(); var offer = new RagfairOffer { Id = hashUtil.Generate(), InternalId = offerCounter, User = CreateUserDataForFleaOffer(userID, isTrader), - Root = items[0].Id, + Root = rootItem.Id, Items = itemsClone, - ItemsCost = Math.Round(handbookHelper.GetTemplatePrice(items[0].Template)), // Handbook price + ItemsCost = Math.Round(handbookHelper.GetTemplatePrice(rootItem.Template)), // Handbook price Requirements = offerRequirements, RequirementsCost = Math.Round(singleItemListingPrice), SummaryCost = roubleListingPrice, @@ -148,7 +149,8 @@ public class RagfairOfferGenerator( EndTime = GetOfferEndTime(userID, time), LoyaltyLevel = loyalLevel, SellInOnePiece = isPackOffer, - Locked = false + Locked = false, + Quantity = (int)(rootItem.Upd?.StackObjectsCount ?? 1) }; offerCounter++; diff --git a/Libraries/Core/Helpers/RagfairOfferHelper.cs b/Libraries/Core/Helpers/RagfairOfferHelper.cs index 7795f9b9..70a3854e 100644 --- a/Libraries/Core/Helpers/RagfairOfferHelper.cs +++ b/Libraries/Core/Helpers/RagfairOfferHelper.cs @@ -740,10 +740,14 @@ public class RagfairOfferHelper( } else { + // Partial purchase var offerRootItem = offer.Items[0]; // Reduce offer root items stack count offerRootItem.Upd.StackObjectsCount -= boughtAmount; + + // Reduce quantity from offer + offer.Quantity -= boughtAmount; } // Assemble payment to send to seller now offer was purchased diff --git a/Libraries/Core/Helpers/TradeHelper.cs b/Libraries/Core/Helpers/TradeHelper.cs index 20c075d3..2ab0f5d6 100644 --- a/Libraries/Core/Helpers/TradeHelper.cs +++ b/Libraries/Core/Helpers/TradeHelper.cs @@ -21,7 +21,6 @@ namespace Core.Helpers; public class TradeHelper( ISptLogger _logger, DatabaseService _databaseService, - EventOutputHolder _eventOutputHolder, TraderHelper _traderHelper, ItemHelper _itemHelper, PaymentService _paymentService, @@ -32,13 +31,9 @@ public class TradeHelper( RagfairServer _ragfairServer, TraderAssortHelper _traderAssortHelper, TraderPurchasePersisterService _traderPurchasePersisterService, - ConfigServer _configServer, ICloner _cloner ) { - protected InventoryConfig _inventoryConfig = _configServer.GetConfig(); - protected TraderConfig _traderConfig = _configServer.GetConfig(); - /// /// Buy item from flea or trader /// @@ -47,7 +42,7 @@ public class TradeHelper( /// Session id /// Should item be found in raid /// Item event router response - public void buyItem( + public void BuyItem( PmcData pmcData, ProcessBuyTradeRequestData buyRequestData, string sessionID, @@ -64,10 +59,13 @@ public class TradeHelper( { var allOffers = _ragfairServer.GetOffers(); - // We store ragfair offerid in buyRequestData.item_id + // We store ragfair offerId in buyRequestData.item_id var offerWithItem = allOffers.FirstOrDefault(x => x.Id == buyRequestData.ItemId); var itemPurchased = offerWithItem.Items.FirstOrDefault(); + // Update offer quantity + offerWithItem.Quantity -= buyCount; + // Ensure purchase does not exceed trader item limit var assortHasBuyRestrictions = _itemHelper.HasBuyRestrictions(itemPurchased); if (assortHasBuyRestrictions) diff --git a/Libraries/Core/Models/Eft/Ragfair/RagfairOffer.cs b/Libraries/Core/Models/Eft/Ragfair/RagfairOffer.cs index 130df610..5c12e4bd 100644 --- a/Libraries/Core/Models/Eft/Ragfair/RagfairOffer.cs +++ b/Libraries/Core/Models/Eft/Ragfair/RagfairOffer.cs @@ -163,6 +163,16 @@ public record RagfairOffer get; set; } + + /// + /// Tightly bound to offer.items[0].upd.stackObjectsCount + /// + [JsonPropertyName("quantity")] + public int? Quantity + { + get; + set; + } } public record OfferRequirement diff --git a/Libraries/Core/Services/RagfairOfferService.cs b/Libraries/Core/Services/RagfairOfferService.cs index c83acd85..9bc1d343 100644 --- a/Libraries/Core/Services/RagfairOfferService.cs +++ b/Libraries/Core/Services/RagfairOfferService.cs @@ -133,9 +133,11 @@ public class RagfairOfferService( var offer = ragfairOfferHolder.GetOfferById(offerId); if (offer != null) { - var rootItem = offer.Items[0]; + offer.Quantity -= amount; + + var rootItem = offer.Items.FirstOrDefault(); rootItem.Upd.StackObjectsCount -= amount; - if (rootItem.Upd.StackObjectsCount <= 0) + if (rootItem.Upd.StackObjectsCount <= 0 || offer.Quantity <= 0) { // Reducing stack size has made it 0, offer is now 'stale' ProcessStaleOffer(offer);