Fixed flea offers not reducing quantity after purchase

This commit is contained in:
Chomp
2025-02-21 12:58:02 +00:00
parent c250fb8dd3
commit fc6c15792d
6 changed files with 41 additions and 23 deletions
+13 -11
View File
@@ -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(
/// <param name="sessionId">Session id</param>
/// <param name="pmcData">Player profile</param>
/// <param name="fleaOffer">Offer being purchased</param>
/// <param name="offerRequest">request data from client</param>
/// <param name="requestOffer">request data from client</param>
/// <param name="output">Output to send back to client</param>
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);
}
/// <summary>
@@ -182,7 +185,7 @@ public class TradeController(
/// <param name="sessionId">Session id</param>
/// <param name="pmcData">Player profile</param>
/// <param name="fleaOffer">Offer being purchased</param>
/// <param name="offerRequest">request data from client</param>
/// <param name="requestOffer">request data from client</param>
/// <param name="output">Output to send back to client</param>
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(
}
/// <summary>
/// Is the provided offerid and ownerid from a player made offer
/// Is the provided offerId and ownerId from a player made offer
/// </summary>
/// <param name="offerId">id of the offer</param>
/// <param name="offerOwnerId">Owner id</param>
@@ -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++;
@@ -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
+5 -7
View File
@@ -21,7 +21,6 @@ namespace Core.Helpers;
public class TradeHelper(
ISptLogger<TradeHelper> _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<InventoryConfig>();
protected TraderConfig _traderConfig = _configServer.GetConfig<TraderConfig>();
/// <summary>
/// Buy item from flea or trader
/// </summary>
@@ -47,7 +42,7 @@ public class TradeHelper(
/// <param name="sessionID">Session id</param>
/// <param name="foundInRaid">Should item be found in raid</param>
/// <param name="output">Item event router response</param>
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)
@@ -163,6 +163,16 @@ public record RagfairOffer
get;
set;
}
/// <summary>
/// Tightly bound to offer.items[0].upd.stackObjectsCount
/// </summary>
[JsonPropertyName("quantity")]
public int? Quantity
{
get;
set;
}
}
public record OfferRequirement
@@ -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);