Ragfair code formatting

This commit is contained in:
Chomp
2025-02-07 15:49:24 +00:00
parent 0fcb0f74e7
commit e644ed58ae
3 changed files with 258 additions and 91 deletions
+187 -63
View File
@@ -1,23 +1,20 @@
using SptCommon.Annotations; using Core.Generators;
using Core.Helpers;
using Core.Models.Common;
using Core.Models.Eft.Common; using Core.Models.Eft.Common;
using Core.Models.Eft.Common.Tables; using Core.Models.Eft.Common.Tables;
using Core.Models.Eft.ItemEvent; using Core.Models.Eft.ItemEvent;
using Core.Models.Eft.Profile;
using Core.Models.Eft.Ragfair; using Core.Models.Eft.Ragfair;
using Core.Models.Eft.Trade;
using Core.Models.Enums;
using Core.Models.Spt.Config;
using Core.Models.Utils; using Core.Models.Utils;
using Core.Routers;
using Core.Servers; using Core.Servers;
using Core.Services; using Core.Services;
using Core.Helpers;
using Core.Models.Eft.Profile;
using Core.Models.Enums;
using Core.Routers;
using Core.Utils; using Core.Utils;
using Core.Models.Spt.Config; using SptCommon.Annotations;
using Core.Models.Common;
using Core.Models.Eft.Trade;
using Core.Generators;
using System.Xml.Linq;
using System;
using Core.Models.Spt.Services;
using LogLevel = Core.Models.Spt.Logging.LogLevel; using LogLevel = Core.Models.Spt.Logging.LogLevel;
namespace Core.Controllers; namespace Core.Controllers;
@@ -117,9 +114,12 @@ public class RagfairController
// Check profile is capable of creating offers // Check profile is capable of creating offers
var pmcProfile = profile.CharacterData.PmcData; var pmcProfile = profile.CharacterData.PmcData;
if ( if (
pmcProfile.RagfairInfo is not null && pmcProfile.Info.Level >= _databaseService.GetGlobals().Configuration.RagFair.MinUserLevel pmcProfile.RagfairInfo is not null &&
pmcProfile.Info.Level >= _databaseService.GetGlobals().Configuration.RagFair.MinUserLevel
) )
{
_ragfairOfferHelper.ProcessOffersOnProfile(sessionId); _ragfairOfferHelper.ProcessOffersOnProfile(sessionId);
}
} }
} }
@@ -147,7 +147,9 @@ public class RagfairController
// Client requested a category refresh // Client requested a category refresh
if (searchRequest.UpdateOfferCount.GetValueOrDefault(false)) if (searchRequest.UpdateOfferCount.GetValueOrDefault(false))
{
result.Categories = GetSpecificCategories(profile.CharacterData.PmcData, searchRequest, result.Offers); result.Categories = GetSpecificCategories(profile.CharacterData.PmcData, searchRequest, result.Offers);
}
AddIndexValueToOffers(result.Offers); AddIndexValueToOffers(result.Offers);
@@ -163,7 +165,10 @@ public class RagfairController
{ {
// For the items, check the barter schemes. The method getDisplayableAssorts sets a flag sptQuestLocked // For the items, check the barter schemes. The method getDisplayableAssorts sets a flag sptQuestLocked
// to true if the quest is not completed yet // to true if the quest is not completed yet
if (_ragfairOfferHelper.TraderOfferItemQuestLocked(traderOffer, traderAssorts)) traderOffer.Locked = true; if (_ragfairOfferHelper.TraderOfferItemQuestLocked(traderOffer, traderAssorts))
{
traderOffer.Locked = true;
}
// Update offers BuyRestrictionCurrent/BuyRestrictionMax values // Update offers BuyRestrictionCurrent/BuyRestrictionMax values
SetTraderOfferPurchaseLimits(traderOffer, profile); SetTraderOfferPurchaseLimits(traderOffer, profile);
@@ -223,7 +228,10 @@ public class RagfairController
var assortId = offerRootItem.Id; var assortId = offerRootItem.Id;
// No trader found in profile, create a blank record for them // No trader found in profile, create a blank record for them
var existsInProfile = !fullProfile.TraderPurchases.TryAdd(offer.User.Id, new Dictionary<string, TraderPurchaseData>()); var existsInProfile = !fullProfile.TraderPurchases.TryAdd(
offer.User.Id,
new Dictionary<string, TraderPurchaseData>()
);
if (!existsInProfile) if (!existsInProfile)
{ {
// Not purchased by player before, use value from assort data // Not purchased by player before, use value from assort data
@@ -256,7 +264,10 @@ public class RagfairController
{ {
var counter = 0; var counter = 0;
foreach (var offer in offers) offer.InternalId = ++counter; foreach (var offer in offers)
{
offer.InternalId = ++counter;
}
} }
/** /**
@@ -265,7 +276,8 @@ public class RagfairController
* @param offers Ragfair offers to get categories for * @param offers Ragfair offers to get categories for
* @returns record with templates + counts * @returns record with templates + counts
*/ */
private Dictionary<string, int>? GetSpecificCategories(PmcData pmcProfile, SearchRequestData searchRequest, List<RagfairOffer> offers) private Dictionary<string, int>? GetSpecificCategories(PmcData pmcProfile, SearchRequestData searchRequest,
List<RagfairOffer> offers)
{ {
// Linked/required search categories // Linked/required search categories
var playerHasFleaUnlocked = var playerHasFleaUnlocked =
@@ -283,7 +295,11 @@ public class RagfairController
else else
{ {
_logger.Error(_localisationService.GetText("ragfair-unable_to_get_categories")); _logger.Error(_localisationService.GetText("ragfair-unable_to_get_categories"));
if (_logger.IsLogEnabled(LogLevel.Debug)) _logger.Debug(_jsonUtil.Serialize(searchRequest)); if (_logger.IsLogEnabled(LogLevel.Debug))
{
_logger.Debug(_jsonUtil.Serialize(searchRequest));
}
return new Dictionary<string, int>(); return new Dictionary<string, int>();
} }
@@ -318,13 +334,20 @@ public class RagfairController
* @param pmcProfile Player profile * @param pmcProfile Player profile
* @returns array of offers * @returns array of offers
*/ */
private List<RagfairOffer> GetOffersForSearchType(SearchRequestData searchRequest, List<string> itemsToAdd, Dictionary<string, TraderAssort> traderAssorts, private List<RagfairOffer> GetOffersForSearchType(SearchRequestData searchRequest, List<string> itemsToAdd,
Dictionary<string, TraderAssort> traderAssorts,
PmcData pmcProfile) PmcData pmcProfile)
{ {
// Searching for items in preset menu // Searching for items in preset menu
if (searchRequest.BuildCount > 0) return _ragfairOfferHelper.GetOffersForBuild(searchRequest, itemsToAdd, traderAssorts, pmcProfile); if (searchRequest.BuildCount > 0)
{
return _ragfairOfferHelper.GetOffersForBuild(searchRequest, itemsToAdd, traderAssorts, pmcProfile);
}
if (searchRequest.NeededSearchId?.Length > 0) return _ragfairOfferHelper.GetOffersThatRequireItem(searchRequest, pmcProfile); if (searchRequest.NeededSearchId?.Length > 0)
{
return _ragfairOfferHelper.GetOffersThatRequireItem(searchRequest, pmcProfile);
}
// Searching for general items // Searching for general items
return _ragfairOfferHelper.GetValidOffers(searchRequest, itemsToAdd, traderAssorts, pmcProfile); return _ragfairOfferHelper.GetValidOffers(searchRequest, itemsToAdd, traderAssorts, pmcProfile);
@@ -336,7 +359,8 @@ public class RagfairController
* @param ignoreTraderOffers Should trader offers be ignored in the calculation * @param ignoreTraderOffers Should trader offers be ignored in the calculation
* @returns min/avg/max values for an item based on flea offers available * @returns min/avg/max values for an item based on flea offers available
*/ */
public GetItemPriceResult GetItemMinAvgMaxFleaPriceValues(GetMarketPriceRequestData getPriceRequest, bool ignoreTraderOffers = true) public GetItemPriceResult GetItemMinAvgMaxFleaPriceValues(GetMarketPriceRequestData getPriceRequest,
bool ignoreTraderOffers = true)
{ {
// Get all items of tpl // Get all items of tpl
var offers = _ragfairOfferService.GetOffersOfType(getPriceRequest.TemplateId); var offers = _ragfairOfferService.GetOffersOfType(getPriceRequest.TemplateId);
@@ -356,7 +380,10 @@ public class RagfairController
// No offers listed, get price from live ragfair price list prices.json // No offers listed, get price from live ragfair price list prices.json
// No flea price, get handbook price // No flea price, get handbook price
var fleaPrices = _databaseService.GetPrices(); var fleaPrices = _databaseService.GetPrices();
if (!fleaPrices.TryGetValue(getPriceRequest.TemplateId, out var tplPrice)) tplPrice = _handbookHelper.GetTemplatePrice(getPriceRequest.TemplateId); if (!fleaPrices.TryGetValue(getPriceRequest.TemplateId, out var tplPrice))
{
tplPrice = _handbookHelper.GetTemplatePrice(getPriceRequest.TemplateId);
}
return new GetItemPriceResult { Avg = tplPrice, Min = tplPrice, Max = tplPrice }; return new GetItemPriceResult { Avg = tplPrice, Min = tplPrice, Max = tplPrice };
} }
@@ -369,9 +396,15 @@ public class RagfairController
foreach (var offer in offers) foreach (var offer in offers)
{ {
// Exclude barter items, they tend to have outrageous equivalent prices // Exclude barter items, they tend to have outrageous equivalent prices
if (offer.Requirements.Any(req => !_paymentHelper.IsMoneyTpl(req.Template))) continue; if (offer.Requirements.Any(req => !_paymentHelper.IsMoneyTpl(req.Template)))
{
continue;
}
if (ignoreTraderOffers && _ragfairOfferHelper.OfferIsFromTrader(offer)) continue; if (ignoreTraderOffers && _ragfairOfferHelper.OfferIsFromTrader(offer))
{
continue;
}
// Figure out how many items the requirementsCost is applying to, and what the per-item price is // Figure out how many items the requirementsCost is applying to, and what the per-item price is
var offerItemCount = offer.SellInOnePiece.GetValueOrDefault(false) var offerItemCount = offer.SellInOnePiece.GetValueOrDefault(false)
@@ -381,14 +414,22 @@ public class RagfairController
// Handle min/max calculations based on the per-item price // Handle min/max calculations based on the per-item price
if (perItemPrice < minMax.Min) if (perItemPrice < minMax.Min)
{
minMax.Min = perItemPrice; minMax.Min = perItemPrice;
else if (perItemPrice > minMax.Max) minMax.Max = perItemPrice; }
else if (perItemPrice > minMax.Max)
{
minMax.Max = perItemPrice;
}
sum += perItemPrice.Value; sum += perItemPrice.Value;
totalOfferCount++; totalOfferCount++;
} }
if (totalOfferCount == 0) return -1d; if (totalOfferCount == 0)
{
return -1d;
}
return sum / totalOfferCount; return sum / totalOfferCount;
} }
@@ -406,11 +447,19 @@ public class RagfairController
var fullProfile = _profileHelper.GetFullProfile(sessionID); var fullProfile = _profileHelper.GetFullProfile(sessionID);
var validationMessage = ""; var validationMessage = "";
if (!IsValidPlayerOfferRequest(offerRequest, validationMessage)) return _httpResponseUtil.AppendErrorToOutput(output, validationMessage); if (!IsValidPlayerOfferRequest(offerRequest, validationMessage))
{
return _httpResponseUtil.AppendErrorToOutput(output, validationMessage);
}
var typeOfOffer = GetOfferType(offerRequest); var typeOfOffer = GetOfferType(offerRequest);
if (typeOfOffer == FleaOfferType.UNKNOWN) if (typeOfOffer == FleaOfferType.UNKNOWN)
return _httpResponseUtil.AppendErrorToOutput(output, $"Unknown offer type: {typeOfOffer}, cannot list item on flea"); {
return _httpResponseUtil.AppendErrorToOutput(
output,
$"Unknown offer type: {typeOfOffer}, cannot list item on flea"
);
}
switch (typeOfOffer) switch (typeOfOffer)
{ {
@@ -422,7 +471,10 @@ public class RagfairController
return CreatePackOffer(sessionID, offerRequest, fullProfile, output); return CreatePackOffer(sessionID, offerRequest, fullProfile, output);
case FleaOfferType.UNKNOWN: case FleaOfferType.UNKNOWN:
default: default:
return _httpResponseUtil.AppendErrorToOutput(output, $"Unknown offer type: {typeOfOffer}, cannot list item on flea"); return _httpResponseUtil.AppendErrorToOutput(
output,
$"Unknown offer type: {typeOfOffer}, cannot list item on flea"
);
} }
} }
@@ -463,12 +515,21 @@ public class RagfairController
if (!sellInOncePiece) if (!sellInOncePiece)
{ {
if (offerRequest.Items.Count == 1) return FleaOfferType.SINGLE; if (offerRequest.Items.Count == 1)
{
return FleaOfferType.SINGLE;
}
if (offerRequest.Items.Count > 1) return FleaOfferType.MULTI; if (offerRequest.Items.Count > 1)
{
return FleaOfferType.MULTI;
}
} }
if (sellInOncePiece) return FleaOfferType.PACK; if (sellInOncePiece)
{
return FleaOfferType.PACK;
}
return FleaOfferType.UNKNOWN; return FleaOfferType.UNKNOWN;
} }
@@ -483,7 +544,8 @@ public class RagfairController
* @param output Response to send to client * @param output Response to send to client
* @returns IItemEventRouterResponse * @returns IItemEventRouterResponse
*/ */
private ItemEventRouterResponse CreateMultiOffer(string sessionID, AddOfferRequestData offerRequest, SptProfile fullProfile, ItemEventRouterResponse output) private ItemEventRouterResponse CreateMultiOffer(string sessionID, AddOfferRequestData offerRequest,
SptProfile fullProfile, ItemEventRouterResponse output)
{ {
var pmcData = fullProfile.CharacterData.PmcData; var pmcData = fullProfile.CharacterData.PmcData;
// var itemsToListCount = offerRequest.Items.Count; // Wasnt used to commented out for now // Does not count stack size, only items // var itemsToListCount = offerRequest.Items.Count; // Wasnt used to commented out for now // Does not count stack size, only items
@@ -497,7 +559,10 @@ public class RagfairController
// Find items to be listed on flea (+ children) from player inventory // Find items to be listed on flea (+ children) from player inventory
var result = GetItemsToListOnFleaFromInventory(pmcData, offerRequest.Items); var result = GetItemsToListOnFleaFromInventory(pmcData, offerRequest.Items);
if (result.Items is null || !string.IsNullOrEmpty(result.ErrorMessage)) _httpResponseUtil.AppendErrorToOutput(output, result.ErrorMessage); if (result.Items is null || !string.IsNullOrEmpty(result.ErrorMessage))
{
_httpResponseUtil.AppendErrorToOutput(output, result.ErrorMessage);
}
// Total count of items summed using their stack counts // Total count of items summed using their stack counts
var stackCountTotal = _ragfairOfferHelper.GetTotalStackCountSize(result.Items); var stackCountTotal = _ragfairOfferHelper.GetTotalStackCountSize(result.Items);
@@ -505,7 +570,7 @@ public class RagfairController
// When listing identical items on flea, condense separate items into one stack with a merged stack count // When listing identical items on flea, condense separate items into one stack with a merged stack count
// e.g. 2 ammo items, stackObjectCount = 3 for each, will result in 1 stack of 6 // e.g. 2 ammo items, stackObjectCount = 3 for each, will result in 1 stack of 6
firstListingAndChidren[0].Upd ??= new Upd { }; firstListingAndChidren[0].Upd ??= new Upd();
firstListingAndChidren[0].Upd.StackObjectsCount = stackCountTotal; firstListingAndChidren[0].Upd.StackObjectsCount = stackCountTotal;
@@ -516,11 +581,15 @@ public class RagfairController
var newRootOfferItem = offer.Items[0]; var newRootOfferItem = offer.Items[0];
// Average offer price for single item (or whole weapon) // Average offer price for single item (or whole weapon)
var averages = GetItemMinAvgMaxFleaPriceValues(new GetMarketPriceRequestData { TemplateId = offer.Items[0].Template }); var averages =
GetItemMinAvgMaxFleaPriceValues(new GetMarketPriceRequestData { TemplateId = offer.Items[0].Template });
var averageOfferPrice = averages.Avg; var averageOfferPrice = averages.Avg;
// Check for and apply item price modifer if it exists in config // Check for and apply item price modifer if it exists in config
if (_ragfairConfig.Dynamic.ItemPriceMultiplier.TryGetValue(newRootOfferItem.Template, out var itemPriceModifer)) averageOfferPrice *= itemPriceModifer; if (_ragfairConfig.Dynamic.ItemPriceMultiplier.TryGetValue(newRootOfferItem.Template, out var itemPriceModifer))
{
averageOfferPrice *= itemPriceModifer;
}
// Get average of item+children quality // Get average of item+children quality
var qualityMultiplier = _itemHelper.GetItemQualityModifierForItems(offer.Items, true); var qualityMultiplier = _itemHelper.GetItemQualityModifierForItems(offer.Items, true);
@@ -553,7 +622,10 @@ public class RagfairController
offerRequest, offerRequest,
output output
); );
if (taxFeeChargeFailed) return output; if (taxFeeChargeFailed)
{
return output;
}
} }
// Add offer to players profile + add to client response // Add offer to players profile + add to client response
@@ -561,7 +633,10 @@ public class RagfairController
output.ProfileChanges[sessionID].RagFairOffers.Add(offer); output.ProfileChanges[sessionID].RagFairOffers.Add(offer);
// Remove items from inventory after creating offer // Remove items from inventory after creating offer
foreach (var itemToRemove in offerRequest.Items) _inventoryHelper.RemoveItem(pmcData, itemToRemove, sessionID, output); foreach (var itemToRemove in offerRequest.Items)
{
_inventoryHelper.RemoveItem(pmcData, itemToRemove, sessionID, output);
}
return output; return output;
} }
@@ -576,7 +651,8 @@ public class RagfairController
* @param output Response to send to client * @param output Response to send to client
* @returns IItemEventRouterResponse * @returns IItemEventRouterResponse
*/ */
private ItemEventRouterResponse CreatePackOffer(string sessionID, AddOfferRequestData offerRequest, SptProfile fullProfile, ItemEventRouterResponse output) private ItemEventRouterResponse CreatePackOffer(string sessionID, AddOfferRequestData offerRequest,
SptProfile fullProfile, ItemEventRouterResponse output)
{ {
var pmcData = fullProfile.CharacterData.PmcData; var pmcData = fullProfile.CharacterData.PmcData;
// var itemsToListCount = offerRequest.Items.Count; // Wasn't used so commented out for now // Does not count stack size, only items // var itemsToListCount = offerRequest.Items.Count; // Wasn't used so commented out for now // Does not count stack size, only items
@@ -590,14 +666,17 @@ public class RagfairController
// Find items to be listed on flea (+ children) from player inventory // Find items to be listed on flea (+ children) from player inventory
var result = GetItemsToListOnFleaFromInventory(pmcData, offerRequest.Items); var result = GetItemsToListOnFleaFromInventory(pmcData, offerRequest.Items);
if (result.Items is null || !string.IsNullOrEmpty(result.ErrorMessage)) _httpResponseUtil.AppendErrorToOutput(output, result.ErrorMessage); if (result.Items is null || !string.IsNullOrEmpty(result.ErrorMessage))
{
_httpResponseUtil.AppendErrorToOutput(output, result.ErrorMessage);
}
// Total count of items summed using their stack counts // Total count of items summed using their stack counts
var stackCountTotal = _ragfairOfferHelper.GetTotalStackCountSize(result.Items); var stackCountTotal = _ragfairOfferHelper.GetTotalStackCountSize(result.Items);
// When listing identical items on flea, condense separate items into one stack with a merged stack count // When listing identical items on flea, condense separate items into one stack with a merged stack count
// e.g. 2 ammo items, stackObjectCount = 3 for each, will result in 1 stack of 6 // e.g. 2 ammo items, stackObjectCount = 3 for each, will result in 1 stack of 6
firstListingAndChidren[0].Upd ??= new Upd { }; firstListingAndChidren[0].Upd ??= new Upd();
firstListingAndChidren[0].Upd.StackObjectsCount = stackCountTotal; firstListingAndChidren[0].Upd.StackObjectsCount = stackCountTotal;
@@ -608,11 +687,16 @@ public class RagfairController
var newRootOfferItem = offer.Items[0]; var newRootOfferItem = offer.Items[0];
// Single price for an item // Single price for an item
var averages = GetItemMinAvgMaxFleaPriceValues(new GetMarketPriceRequestData { TemplateId = firstListingAndChidren[0].Template }); var averages = GetItemMinAvgMaxFleaPriceValues(
new GetMarketPriceRequestData { TemplateId = firstListingAndChidren[0].Template }
);
var singleItemPrice = averages.Avg; var singleItemPrice = averages.Avg;
// Check for and apply item price modifer if it exists in config // Check for and apply item price modifer if it exists in config
if (_ragfairConfig.Dynamic.ItemPriceMultiplier.TryGetValue(newRootOfferItem.Template, out var itemPriceModifer)) singleItemPrice *= itemPriceModifer; if (_ragfairConfig.Dynamic.ItemPriceMultiplier.TryGetValue(newRootOfferItem.Template, out var itemPriceModifer))
{
singleItemPrice *= itemPriceModifer;
}
// Get average of item+children quality // Get average of item+children quality
var qualityMultiplier = _itemHelper.GetItemQualityModifierForItems(offer.Items, true); var qualityMultiplier = _itemHelper.GetItemQualityModifierForItems(offer.Items, true);
@@ -645,7 +729,10 @@ public class RagfairController
offerRequest, offerRequest,
output output
); );
if (taxFeeChargeFailed) return output; if (taxFeeChargeFailed)
{
return output;
}
} }
// Add offer to players profile + add to client response // Add offer to players profile + add to client response
@@ -653,7 +740,10 @@ public class RagfairController
output.ProfileChanges[sessionID].RagFairOffers.Add(offer); output.ProfileChanges[sessionID].RagFairOffers.Add(offer);
// Remove items from inventory after creating offer // Remove items from inventory after creating offer
foreach (var itemToRemove in offerRequest.Items) _inventoryHelper.RemoveItem(pmcData, itemToRemove, sessionID, output); foreach (var itemToRemove in offerRequest.Items)
{
_inventoryHelper.RemoveItem(pmcData, itemToRemove, sessionID, output);
}
return output; return output;
} }
@@ -667,7 +757,8 @@ public class RagfairController
* @param output Response to send to client * @param output Response to send to client
* @returns IItemEventRouterResponse * @returns IItemEventRouterResponse
*/ */
private ItemEventRouterResponse CreateSingleOffer(string sessionID, AddOfferRequestData offerRequest, SptProfile fullProfile, private ItemEventRouterResponse CreateSingleOffer(string sessionID, AddOfferRequestData offerRequest,
SptProfile fullProfile,
ItemEventRouterResponse output) ItemEventRouterResponse output)
{ {
var pmcData = fullProfile.CharacterData.PmcData; var pmcData = fullProfile.CharacterData.PmcData;
@@ -675,7 +766,10 @@ public class RagfairController
// Find items to be listed on flea from player inventory // Find items to be listed on flea from player inventory
var result = GetItemsToListOnFleaFromInventory(pmcData, offerRequest.Items); var result = GetItemsToListOnFleaFromInventory(pmcData, offerRequest.Items);
if (result.Items is null || !string.IsNullOrEmpty(result.ErrorMessage)) _httpResponseUtil.AppendErrorToOutput(output, result.ErrorMessage); if (result.Items is null || !string.IsNullOrEmpty(result.ErrorMessage))
{
_httpResponseUtil.AppendErrorToOutput(output, result.ErrorMessage);
}
// Total count of items summed using their stack counts // Total count of items summed using their stack counts
var stackCountTotal = _ragfairOfferHelper.GetTotalStackCountSize(result.Items); var stackCountTotal = _ragfairOfferHelper.GetTotalStackCountSize(result.Items);
@@ -694,12 +788,15 @@ public class RagfairController
var qualityMultiplier = _itemHelper.GetItemQualityModifierForItems(offer.Items, true); var qualityMultiplier = _itemHelper.GetItemQualityModifierForItems(offer.Items, true);
// Average offer price for single item (or whole weapon) // Average offer price for single item (or whole weapon)
var averages = GetItemMinAvgMaxFleaPriceValues(new GetMarketPriceRequestData { TemplateId = rootItem.Template }); var averages =
GetItemMinAvgMaxFleaPriceValues(new GetMarketPriceRequestData { TemplateId = rootItem.Template });
var averageOfferPriceSingleItem = averages.Avg; var averageOfferPriceSingleItem = averages.Avg;
// Check for and apply item price modifer if it exists in config // Check for and apply item price modifer if it exists in config
if (_ragfairConfig.Dynamic.ItemPriceMultiplier.TryGetValue(rootItem.Template, out var itemPriceModifer)) if (_ragfairConfig.Dynamic.ItemPriceMultiplier.TryGetValue(rootItem.Template, out var itemPriceModifer))
{
averageOfferPriceSingleItem *= itemPriceModifer; averageOfferPriceSingleItem *= itemPriceModifer;
}
// Multiply single item price by quality // Multiply single item price by quality
averageOfferPriceSingleItem *= qualityMultiplier; averageOfferPriceSingleItem *= qualityMultiplier;
@@ -724,7 +821,10 @@ public class RagfairController
offerRequest, offerRequest,
output output
); );
if (taxFeeChargeFailed) return output; if (taxFeeChargeFailed)
{
return output;
}
} }
// Add offer to players profile + add to client response // Add offer to players profile + add to client response
@@ -732,7 +832,10 @@ public class RagfairController
output.ProfileChanges[sessionID].RagFairOffers.Add(offer); output.ProfileChanges[sessionID].RagFairOffers.Add(offer);
// Remove items from inventory after creating offer // Remove items from inventory after creating offer
foreach (var itemToRemove in offerRequest.Items) _inventoryHelper.RemoveItem(pmcData, itemToRemove, sessionID, output); foreach (var itemToRemove in offerRequest.Items)
{
_inventoryHelper.RemoveItem(pmcData, itemToRemove, sessionID, output);
}
return output; return output;
} }
@@ -769,7 +872,10 @@ public class RagfairController
offerRequest.SellInOnePiece.GetValueOrDefault(false) offerRequest.SellInOnePiece.GetValueOrDefault(false)
); );
if (_logger.IsLogEnabled(LogLevel.Debug)) _logger.Debug($"Offer tax to charge: {tax}, pulled from client: {storedClientTaxValue.Count is not null}"); if (_logger.IsLogEnabled(LogLevel.Debug))
{
_logger.Debug($"Offer tax to charge: {tax}, pulled from client: {storedClientTaxValue.Count is not null}");
}
// cleanup of cache now we've used the tax value from it // cleanup of cache now we've used the tax value from it
_ragfairTaxService.ClearStoredOfferTaxById(offerRequest.Items.First()); _ragfairTaxService.ClearStoredOfferTaxById(offerRequest.Items.First());
@@ -788,13 +894,14 @@ public class RagfairController
return false; return false;
} }
private RagfairOffer CreatePlayerOffer(string sessionId, List<Requirement> requirements, List<Item> items, bool sellInOnePiece) private RagfairOffer CreatePlayerOffer(string sessionId, List<Requirement> requirements, List<Item> items,
bool sellInOnePiece)
{ {
var loyalLevel = 1; var loyalLevel = 1;
var formattedItems = items.Select( var formattedItems = items.Select(
item => item =>
{ {
var isChild = items.Any((subItem) => subItem.Id == item.ParentId); var isChild = items.Any(subItem => subItem.Id == item.ParentId);
return new Item return new Item
{ {
@@ -839,15 +946,20 @@ public class RagfairController
var requestedItemTpl = item.Template; var requestedItemTpl = item.Template;
if (_paymentHelper.IsMoneyTpl(requestedItemTpl)) if (_paymentHelper.IsMoneyTpl(requestedItemTpl))
{
requirementsPriceInRub += _handbookHelper.InRUB(item.Count.Value, requestedItemTpl); requirementsPriceInRub += _handbookHelper.InRUB(item.Count.Value, requestedItemTpl);
}
else else
{
requirementsPriceInRub += _itemHelper.GetDynamicItemPrice(requestedItemTpl).Value * item.Count.Value; requirementsPriceInRub += _itemHelper.GetDynamicItemPrice(requestedItemTpl).Value * item.Count.Value;
}
} }
return requirementsPriceInRub; return requirementsPriceInRub;
} }
private GetItemsToListOnFleaFromInventoryResult GetItemsToListOnFleaFromInventory(PmcData pmcData, List<string> itemIdsFromFleaOfferRequest) private GetItemsToListOnFleaFromInventoryResult GetItemsToListOnFleaFromInventory(PmcData pmcData,
List<string> itemIdsFromFleaOfferRequest)
{ {
List<List<Item>> itemsToReturn = []; List<List<Item>> itemsToReturn = [];
var errorMessage = string.Empty; var errorMessage = string.Empty;
@@ -855,13 +967,17 @@ public class RagfairController
// Count how many items are being sold and multiply the requested amount accordingly // Count how many items are being sold and multiply the requested amount accordingly
foreach (var itemId in itemIdsFromFleaOfferRequest) foreach (var itemId in itemIdsFromFleaOfferRequest)
{ {
var item = pmcData.Inventory?.Items?.FirstOrDefault((i) => i.Id == itemId); var item = pmcData.Inventory?.Items?.FirstOrDefault(i => i.Id == itemId);
if (item is null) if (item is null)
{ {
errorMessage = _localisationService.GetText("ragfair-unable_to_find_item_in_inventory", new { id = itemId }); errorMessage = _localisationService.GetText(
"ragfair-unable_to_find_item_in_inventory",
new { id = itemId }
);
_logger.Error(errorMessage); _logger.Error(errorMessage);
return new GetItemsToListOnFleaFromInventoryResult { Items = itemsToReturn, ErrorMessage = errorMessage }; return new GetItemsToListOnFleaFromInventoryResult
{ Items = itemsToReturn, ErrorMessage = errorMessage };
} }
item = _itemHelper.FixItemStackCount(item); item = _itemHelper.FixItemStackCount(item);
@@ -942,7 +1058,7 @@ public class RagfairController
var pmcData = _profileHelper.GetPmcProfile(sessionId); var pmcData = _profileHelper.GetPmcProfile(sessionId);
var playerOffers = pmcData.RagfairInfo.Offers; var playerOffers = pmcData.RagfairInfo.Offers;
var playerOfferIndex = playerOffers.FindIndex((offer) => offer.Id == extendRequest.OfferId); var playerOfferIndex = playerOffers.FindIndex(offer => offer.Id == extendRequest.OfferId);
var secondsToAdd = extendRequest.RenewalTime * TimeUtil.OneHourAsSeconds; var secondsToAdd = extendRequest.RenewalTime * TimeUtil.OneHourAsSeconds;
if (playerOfferIndex == -1) if (playerOfferIndex == -1)
@@ -956,7 +1072,10 @@ public class RagfairController
} }
) )
); );
return _httpResponseUtil.AppendErrorToOutput(output, _localisationService.GetText("ragfair-offer_not_found_in_profile_short")); return _httpResponseUtil.AppendErrorToOutput(
output,
_localisationService.GetText("ragfair-offer_not_found_in_profile_short")
);
} }
var playerOffer = playerOffers[playerOfferIndex]; var playerOffer = playerOffers[playerOfferIndex];
@@ -966,7 +1085,10 @@ public class RagfairController
{ {
var count = 1; var count = 1;
var sellInOncePiece = playerOffer.SellInOnePiece.GetValueOrDefault(false); var sellInOncePiece = playerOffer.SellInOnePiece.GetValueOrDefault(false);
if (!sellInOncePiece) count = (int)playerOffer.Items.Sum(offerItem => offerItem.Upd?.StackObjectsCount ?? 0); if (!sellInOncePiece)
{
count = (int)playerOffer.Items.Sum(offerItem => offerItem.Upd?.StackObjectsCount ?? 0);
}
var tax = _ragfairTaxService.CalculateTax( var tax = _ragfairTaxService.CalculateTax(
playerOffer.Items.First(), playerOffer.Items.First(),
@@ -979,10 +1101,12 @@ public class RagfairController
var request = CreateBuyTradeRequestObject(CurrencyType.RUB, tax); var request = CreateBuyTradeRequestObject(CurrencyType.RUB, tax);
_paymentService.PayMoney(pmcData, request, sessionId, output); _paymentService.PayMoney(pmcData, request, sessionId, output);
if (output.Warnings.Count > 0) if (output.Warnings.Count > 0)
{
return _httpResponseUtil.AppendErrorToOutput( return _httpResponseUtil.AppendErrorToOutput(
output, output,
_localisationService.GetText("ragfair-unable_to_pay_commission_fee") _localisationService.GetText("ragfair-unable_to_pay_commission_fee")
); );
}
} }
// Add extra time to offer // Add extra time to offer
@@ -1024,7 +1148,7 @@ public class RagfairController
public RagfairOffer? GetOfferById(string sessionId, GetRagfairOfferByIdRequest request) public RagfairOffer? GetOfferById(string sessionId, GetRagfairOfferByIdRequest request)
{ {
var offers = _ragfairOfferService.GetOffers(); var offers = _ragfairOfferService.GetOffers();
var offerToReturn = offers.FirstOrDefault((offer) => offer.InternalId == request.Id); var offerToReturn = offers.FirstOrDefault(offer => offer.InternalId == request.Id);
return offerToReturn; return offerToReturn;
} }
+46 -13
View File
@@ -53,9 +53,13 @@ public class RagfairOfferService(
ragfairOfferHolder.AddOffer(offer); ragfairOfferHolder.AddOffer(offer);
} }
public void AddOfferToExpired(RagfairOffer staleOffer) /// <summary>
/// Add a stale offers id to collection for later use
/// </summary>
/// <param name="staleOfferId">Id of offer to add to stale collection</param>
public void AddOfferIdToExpired(string staleOfferId)
{ {
_expiredOfferIds.Add(staleOffer.Id); _expiredOfferIds.Add(staleOfferId);
} }
/** /**
@@ -79,7 +83,7 @@ public class RagfairOfferService(
foreach (var expiredOfferId in _expiredOfferIds) foreach (var expiredOfferId in _expiredOfferIds)
{ {
var offer = ragfairOfferHolder.GetOfferById(expiredOfferId); var offer = ragfairOfferHolder.GetOfferById(expiredOfferId);
if (offer?.Items is null) if (offer?.Items?.Count == 0)
{ {
logger.Error($"Unable to process expired offer: {expiredOfferId}, it has no items"); logger.Error($"Unable to process expired offer: {expiredOfferId}, it has no items");
@@ -95,7 +99,7 @@ public class RagfairOfferService(
/** /**
* Clear out internal expiredOffers dictionary of all items * Clear out internal expiredOffers dictionary of all items
*/ */
public void ResetExpiredOffers() public void ResetExpiredOfferIds()
{ {
_expiredOfferIds.Clear(); _expiredOfferIds.Clear();
} }
@@ -129,8 +133,13 @@ public class RagfairOfferService(
var offer = ragfairOfferHolder.GetOfferById(offerId); var offer = ragfairOfferHolder.GetOfferById(offerId);
if (offer != null) if (offer != null)
{ {
offer.Items[0].Upd.StackObjectsCount -= amount; var rootItem = offer.Items[0];
if (offer.Items[0].Upd.StackObjectsCount <= 0) ProcessStaleOffer(offer); rootItem.Upd.StackObjectsCount -= amount;
if (rootItem.Upd.StackObjectsCount <= 0)
{
// Reducing stack size has made it 0, offer is now 'stale'
ProcessStaleOffer(offer);
}
} }
} }
@@ -169,7 +178,9 @@ public class RagfairOfferService(
if (pmcData?.RagfairInfo == null || pmcData.RagfairInfo.Offers == null) if (pmcData?.RagfairInfo == null || pmcData.RagfairInfo.Offers == null)
// Profile is wiped // Profile is wiped
{
continue; continue;
}
ragfairOfferHolder.AddOffers(pmcData.RagfairInfo.Offers); ragfairOfferHolder.AddOffers(pmcData.RagfairInfo.Offers);
} }
@@ -181,7 +192,10 @@ public class RagfairOfferService(
public void ExpireStaleOffers() public void ExpireStaleOffers()
{ {
var time = timeUtil.GetTimeStamp(); var time = timeUtil.GetTimeStamp();
foreach (var staleOffer in ragfairOfferHolder.GetStaleOffers(time)) ProcessStaleOffer(staleOffer); foreach (var staleOffer in ragfairOfferHolder.GetStaleOffers(time))
{
ProcessStaleOffer(staleOffer);
}
} }
/** /**
@@ -190,17 +204,24 @@ public class RagfairOfferService(
*/ */
protected void ProcessStaleOffer(RagfairOffer staleOffer) protected void ProcessStaleOffer(RagfairOffer staleOffer)
{ {
var staleOfferId = staleOffer.Id;
var staleOfferUserId = staleOffer.User.Id; var staleOfferUserId = staleOffer.User.Id;
var isTrader = ragfairServerHelper.IsTrader(staleOfferUserId); var isTrader = ragfairServerHelper.IsTrader(staleOfferUserId);
var isPlayer = profileHelper.IsPlayer(staleOfferUserId.RegexReplace("^pmc", "")); var isPlayer = profileHelper.IsPlayer(staleOfferUserId.RegexReplace("^pmc", ""));
// Skip trader offers, managed by RagfairServer.update() // Skip trader offers, managed by RagfairServer.update()
if (isTrader) return; if (isTrader)
{
return;
}
// Handle dynamic offer // Handle dynamic offer
if (!(isTrader || isPlayer)) if (!(isTrader || isPlayer))
// Dynamic offer // Dynamic offer
AddOfferToExpired(staleOffer); {
AddOfferIdToExpired(staleOfferId);
}
// Handle player offer - items need returning/XP adjusting. Checking if offer has actually expired or not. // Handle player offer - items need returning/XP adjusting. Checking if offer has actually expired or not.
if (isPlayer && staleOffer.EndTime <= timeUtil.GetTimeStamp()) if (isPlayer && staleOffer.EndTime <= timeUtil.GetTimeStamp())
@@ -210,7 +231,7 @@ public class RagfairOfferService(
} }
// Remove expired existing offer from global offers // Remove expired existing offer from global offers
RemoveOfferById(staleOffer.Id); RemoveOfferById(staleOfferId);
} }
protected void ReturnPlayerOffer(RagfairOffer playerOffer) protected void ReturnPlayerOffer(RagfairOffer playerOffer)
@@ -223,7 +244,7 @@ public class RagfairOfferService(
return; return;
} }
var offerinProfileIndex = profile.RagfairInfo.Offers.FindIndex((o) => o.Id == playerOffer.Id); var offerinProfileIndex = profile.RagfairInfo.Offers.FindIndex(o => o.Id == playerOffer.Id);
if (offerinProfileIndex == -1) if (offerinProfileIndex == -1)
{ {
logger.Warning(localisationService.GetText("ragfair-unable_to_find_offer_to_remove", playerOffer.Id)); logger.Warning(localisationService.GetText("ragfair-unable_to_find_offer_to_remove", playerOffer.Id));
@@ -240,7 +261,9 @@ public class RagfairOfferService(
var firstOfferItem = playerOffer.Items[0]; var firstOfferItem = playerOffer.Items[0];
if (firstOfferItem.Upd.StackObjectsCount > firstOfferItem.Upd.OriginalStackObjectsCount) if (firstOfferItem.Upd.StackObjectsCount > firstOfferItem.Upd.OriginalStackObjectsCount)
{
playerOffer.Items[0].Upd.StackObjectsCount = firstOfferItem.Upd.OriginalStackObjectsCount; playerOffer.Items[0].Upd.StackObjectsCount = firstOfferItem.Upd.OriginalStackObjectsCount;
}
playerOffer.Items[0].Upd.OriginalStackObjectsCount = null; playerOffer.Items[0].Upd.OriginalStackObjectsCount = null;
// Remove player offer from flea // Remove player offer from flea
@@ -253,8 +276,12 @@ public class RagfairOfferService(
var newParentId = hashUtil.Generate(); var newParentId = hashUtil.Generate();
foreach (var item in unstackedItems) foreach (var item in unstackedItems)
// Refresh root items' parentIds // Refresh root items' parentIds
{
if (item.ParentId == "hideout") if (item.ParentId == "hideout")
{
item.ParentId = newParentId; item.ParentId = newParentId;
}
}
ragfairServerHelper.ReturnItems(profile.SessionId, unstackedItems); ragfairServerHelper.ReturnItems(profile.SessionId, unstackedItems);
profile.RagfairInfo.Offers.Splice(offerinProfileIndex, 1); profile.RagfairInfo.Offers.Splice(offerinProfileIndex, 1);
@@ -280,13 +307,19 @@ public class RagfairOfferService(
if (totalItemCount <= itemMaxStackSize) if (totalItemCount <= itemMaxStackSize)
{ {
// Edge case - Ensure items stack count isnt < 1 // Edge case - Ensure items stack count isnt < 1
if (items[0]?.Upd?.StackObjectsCount < 1) items[0].Upd.StackObjectsCount = 1; if (items[0]?.Upd?.StackObjectsCount < 1)
{
items[0].Upd.StackObjectsCount = 1;
}
return items; return items;
} }
// Single item with no children e.g. ammo, use existing de-stacking code // Single item with no children e.g. ammo, use existing de-stacking code
if (items.Count == 1) return itemHelper.SplitStack(rootItem); if (items.Count == 1)
{
return itemHelper.SplitStack(rootItem);
}
// Item with children, needs special handling // Item with children, needs special handling
// Force new item to have stack size of 1 // Force new item to have stack size of 1
+25 -15
View File
@@ -45,7 +45,8 @@ public class RagfairOfferHolder(
var result = _offersById var result = _offersById
.Where(x => offerIds.Contains(x.Key)) .Where(x => offerIds.Contains(x.Key))
.Select(x => x.Value).ToList(); .Select(x => x.Value)
.ToList();
return result; return result;
} }
@@ -70,7 +71,10 @@ public class RagfairOfferHolder(
{ {
lock (_offersByIdLock) lock (_offersByIdLock)
{ {
if (_offersById.Count > 0) return _offersById.Values.ToList(); if (_offersById.Count > 0)
{
return _offersById.Values.ToList();
}
} }
return []; return [];
@@ -78,7 +82,10 @@ public class RagfairOfferHolder(
public void AddOffers(List<RagfairOffer> offers) public void AddOffers(List<RagfairOffer> offers)
{ {
foreach (var offer in offers) AddOffer(offer); foreach (var offer in offers)
{
AddOffer(offer);
}
} }
public void AddOffer(RagfairOffer offer) public void AddOffer(RagfairOffer offer)
@@ -87,19 +94,16 @@ public class RagfairOfferHolder(
{ {
var sellerId = offer.User.Id; var sellerId = offer.User.Id;
// Keep generating IDs until we get a unique one // Keep generating IDs until we get a unique one
while (_offersById.ContainsKey(offer.Id)) while (_offersById.ContainsKey(offer.Id)) offer.Id = hashUtil.Generate();
{
offer.Id = hashUtil.Generate();
}
var offerId = offer.Id; var offerId = offer.Id;
var itemTpl = offer.Items?.FirstOrDefault()?.Template; var itemTpl = offer.Items?.FirstOrDefault()?.Template;
// If it is an NPC PMC offer AND we have already reached the maximum amount of possible offers // If it is an NPC PMC offer AND we have already reached the maximum amount of possible offers
// for this template, just don't add in more // for this template, just don't add in more
if (itemTpl != null if (itemTpl != null &&
&& !(ragfairServerHelper.IsTrader(sellerId) || profileHelper.IsPlayer(sellerId)) !(ragfairServerHelper.IsTrader(sellerId) || profileHelper.IsPlayer(sellerId)) &&
&& _offersByTemplate.TryGetValue(itemTpl, out var offers) _offersByTemplate.TryGetValue(itemTpl, out var offers) &&
&& offers?.Count >= _maxOffersPerTemplate offers?.Count >= _maxOffersPerTemplate
) )
{ {
return; return;
@@ -136,7 +140,10 @@ public class RagfairOfferHolder(
// the user ID from the cached offers after they dont have anything else // the user ID from the cached offers after they dont have anything else
// on the flea placed. We regenerate the ID for the NPC users, making it // on the flea placed. We regenerate the ID for the NPC users, making it
// continuously grow otherwise // continuously grow otherwise
if (_offersByTrader[offer.User.Id].Count == 0) _offersByTrader.Remove(offer.User.Id); if (_offersByTrader[offer.User.Id].Count == 0)
{
_offersByTrader.Remove(offer.User.Id);
}
} }
} }
@@ -173,9 +180,9 @@ public class RagfairOfferHolder(
* Get an array of stale offers that are still shown to player * Get an array of stale offers that are still shown to player
* @returns RagfairOffer array * @returns RagfairOffer array
*/ */
public List<RagfairOffer> GetStaleOffers(long time) public IEnumerable<RagfairOffer> GetStaleOffers(long time)
{ {
return GetOffers().Where(o => IsStale(o, time)).ToList(); return GetOffers().Where(o => IsStale(o, time));
} }
protected void AddOfferByTemplates(string template, RagfairOffer offer) protected void AddOfferByTemplates(string template, RagfairOffer offer)
@@ -210,7 +217,10 @@ public class RagfairOfferHolder(
protected bool IsStale(RagfairOffer? offer, long time) protected bool IsStale(RagfairOffer? offer, long time)
{ {
if (offer is null) return false; if (offer is null)
{
return false;
}
return offer.EndTime < time || (offer.Items.FirstOrDefault().Upd?.StackObjectsCount ?? 0) < 1; return offer.EndTime < time || (offer.Items.FirstOrDefault().Upd?.StackObjectsCount ?? 0) < 1;
} }