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);