Created CreateFleaOfferDetails

This commit is contained in:
Chomp
2025-07-21 14:38:00 +01:00
parent f53c69e2e5
commit 02b0c23cba
3 changed files with 112 additions and 90 deletions
@@ -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);
}
/// <summary>
@@ -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
)
@@ -51,39 +51,17 @@ public class RagfairOfferGenerator(
/// <summary>
/// Create a flea offer and store it in the Ragfair server offers array
/// </summary>
/// <param name="userId">Owner of the offer</param>
/// <param name="time">Time offer is listed at</param>
/// <param name="items">Items in the offer</param>
/// <param name="barterScheme">Cost of item (currency or barter)</param>
/// <param name="loyalLevel">Loyalty level needed to buy item</param>
/// <param name="quantity">Amount of item being listed</param>
/// <param name="creator">Who created this offer</param>
/// <param name="sellInOnePiece">Flags sellInOnePiece to be true</param>
/// <param name="details">Data needed to create a flea offer</param>
/// <returns>RagfairOffer</returns>
public RagfairOffer CreateAndAddFleaOffer(
MongoId userId,
long time,
List<Item> items,
List<BarterScheme> 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(
/// <summary>
/// Create an offer object ready to send to ragfairOfferService.addOffer()
/// </summary>
/// <param name="userId">Owner of the offer</param>
/// <param name="time">Timestamp offer is listed at</param>
/// <param name="items">Items in the offer</param>
/// <param name="barterScheme">Cost of item (currency or barter)</param>
/// <param name="loyalLevel">Loyalty level needed to buy item</param>
/// <param name="quantity">Amount of item being listed</param>
/// <param name="isPackOffer">Is offer being created flagged as a pack</param>
/// <param name="isPlayerOffer">Offer is from a player</param>
/// <param name="details">Data needed to create a flea offer</param>
/// <returns>RagfairOffer</returns>
protected RagfairOffer CreateOffer(
MongoId userId,
long time,
List<Item> items,
List<BarterScheme> 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);
}
/// <summary>
@@ -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;
@@ -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
{
/// <summary>
/// Owner of the offer
/// </summary>
public MongoId UserId { get; set; }
/// <summary>
/// Time offer is listed at
/// </summary>
public long Time { get; set; }
/// <summary>
/// Items in the offer
/// </summary>
public List<Item> Items { get; set; }
/// <summary>
/// Cost of item (currency or barter)
/// </summary>
public List<BarterScheme> BarterScheme { get; set; }
/// <summary>
/// Loyalty level needed to buy item
/// </summary>
public int LoyalLevel { get; set; }
/// <summary>
/// Amount of item being listed
/// </summary>
public int Quantity { get; set; }
/// <summary>
/// Who created the offer
/// </summary>
public OfferCreator Creator { get; set; }
/// <summary>
/// Offer should be sold all in one offer
/// </summary>
public bool SellInOnePiece { get; set; }
}
}